diff --git a/src/cpp/proxy/engine.cpp b/src/cpp/proxy/engine.cpp index 72329125..87d5ed92 100644 --- a/src/cpp/proxy/engine.cpp +++ b/src/cpp/proxy/engine.cpp @@ -117,6 +117,9 @@ class Engine::Private : public QObject Connection socketReadyConnection; Connection iRequestReadyConnection; Connection inspectErrorConnection; + Connection inspectedConnection; + Connection finConnection; + Connection finishedByAcceptConnection; map addNotAllowedConnection; map finishedConnection; map reqSessionDestroyedConnection; @@ -592,10 +595,10 @@ class Engine::Private : public QObject rs->setAutoShare(autoShare); // TODO: use callbacks for performance - connect(rs, &RequestSession::inspected, this, &Private::rs_inspected); + inspectedConnection = rs->inspected.connect(boost::bind(&Private::rs_inspected, this, boost::placeholders::_1, rs)); inspectErrorConnection = rs->inspectError.connect(boost::bind(&Private::rs_inspectError, this, rs)); - connect(rs, &RequestSession::finished, this, &Private::rs_finished); - connect(rs, &RequestSession::finishedByAccept, this, &Private::rs_finishedByAccept); + finConnection = rs->finished.connect(boost::bind(&Private::rs_finished, this, rs)); + finishedByAcceptConnection = rs->finishedByAccept.connect(boost::bind(&Private::rs_finishedByAccept, this, rs)); requestSessions += rs; @@ -729,11 +732,8 @@ class Engine::Private : public QObject doProxy(rs); } -private slots: - void rs_inspected(const InspectData &idata) + void rs_inspected(const InspectData &idata, RequestSession *rs) { - RequestSession *rs = (RequestSession *)sender(); - // if we get here, then the request must be proxied. if it was to be directly // accepted, then finishedByAccept would have been emitted instead assert(idata.doProxy); @@ -741,10 +741,8 @@ private slots: doProxy(rs, &idata); } - void rs_finished() + void rs_finished(RequestSession *rs) { - RequestSession *rs = (RequestSession *)sender(); - if(!rs->isSockJs()) logFinished(rs); @@ -754,10 +752,8 @@ private slots: tryTakeNext(); } - void rs_finishedByAccept() + void rs_finishedByAccept(RequestSession *rs) { - RequestSession *rs = (RequestSession *)sender(); - logFinished(rs, true); requestSessions.remove(rs); @@ -766,6 +762,7 @@ private slots: tryTakeNext(); } +private slots: void ps_addNotAllowed(ProxySession *ps) { ProxyItem *i = proxyItemsBySession.value(ps); @@ -832,6 +829,7 @@ private slots: tryTakeNext(); } +private: void handler_retry_in_readyRead(const QList &message) { if(message.count() != 1) @@ -910,7 +908,6 @@ private slots: } } -private: void stats_connMax(const StatsPacket &packet) { if(accept->canWriteImmediately()) diff --git a/src/cpp/proxy/proxysession.cpp b/src/cpp/proxy/proxysession.cpp index d07f056b..a5c1fe32 100644 --- a/src/cpp/proxy/proxysession.cpp +++ b/src/cpp/proxy/proxysession.cpp @@ -155,6 +155,11 @@ class ProxySession::Private : public QObject Connection writeBytesChangedConnection; Connection errorConnection; Connection finishedConnection; + Connection bytesConnection; + Connection errConnection; + Connection pausedConneciton; + Connection headerConneciton; + Connection bodyConnection; Private(ProxySession *_q, ZRoutes *_zroutes, ZrpcManager *_acceptManager, const LogUtil::Config &_logConfig, StatsManager *_statsManager) : QObject(_q), @@ -238,12 +243,13 @@ class ProxySession::Private : public QObject sessionItems += si; sessionItemsBySession.insert(rs, si); - connect(rs, &RequestSession::bytesWritten, this, &Private::rs_bytesWritten); - connect(rs, &RequestSession::errorResponding, this, &Private::rs_errorResponding); - connect(rs, &RequestSession::finished, this, &Private::rs_finished); - connect(rs, &RequestSession::paused, this, &Private::rs_paused); - connect(rs, &RequestSession::headerBytesSent, this, &Private::rs_headerBytesSent); - connect(rs, &RequestSession::bodyBytesSent, this, &Private::rs_bodyBytesSent); + + bytesConnection = rs->bytesWritten.connect(boost::bind(&Private::rs_bytesWritten, this, boost::placeholders::_1, rs)); + errConnection = rs->errorResponding.connect(boost::bind(&Private::rs_errorResponding, this, rs)); + finishedConnection = rs->finished.connect(boost::bind(&Private::rs_finished, this, rs)); + pausedConneciton = rs->paused.connect(boost::bind(&Private::rs_paused, this, rs)); + headerConneciton = rs->headerBytesSent.connect(boost::bind(&Private::rs_headerBytesSent, this, boost::placeholders::_1, rs)); + bodyConnection = rs->bodyBytesSent.connect(boost::bind(&Private::rs_bodyBytesSent, this, boost::placeholders::_1, rs)); HttpRequestData rsRequestData = rs->requestData(); @@ -1167,11 +1173,9 @@ class ProxySession::Private : public QObject } } -public slots: - void rs_bytesWritten(int count) +public: + void rs_bytesWritten(int count, RequestSession *rs) { - RequestSession *rs = (RequestSession *)sender(); - log_debug("proxysession: %p response bytes written id=%s: %d", q, rs->rid().second.data(), count); SessionItem *si = sessionItemsBySession.value(rs); @@ -1187,10 +1191,8 @@ public slots: tryResponseRead(); } - void rs_finished() + void rs_finished(RequestSession *rs) { - RequestSession *rs = (RequestSession *)sender(); - log_debug("proxysession: %p response finished id=%s", q, rs->rid().second.data()); SessionItem *si = sessionItemsBySession.value(rs); @@ -1228,10 +1230,8 @@ public slots: } } - void rs_paused() + void rs_paused(RequestSession *rs) { - RequestSession *rs = (RequestSession *)sender(); - log_debug("proxysession: %p response paused id=%s", q, rs->rid().second.data()); SessionItem *si = sessionItemsBySession.value(rs); @@ -1333,10 +1333,8 @@ public slots: } } - void rs_errorResponding() + void rs_errorResponding(RequestSession *rs) { - RequestSession *rs = (RequestSession *)sender(); - log_debug("proxysession: %p response error id=%s", q, rs->rid().second.data()); SessionItem *si = sessionItemsBySession.value(rs); @@ -1351,10 +1349,8 @@ public slots: // don't destroy the RequestSession here. a finished signal will arrive next. } - void rs_headerBytesSent(int count) + void rs_headerBytesSent(int count, RequestSession *rs) { - RequestSession *rs = (RequestSession *)sender(); - SessionItem *si = sessionItemsBySession.value(rs); assert(si); @@ -1362,10 +1358,8 @@ public slots: incCounter(Stats::ClientHeaderBytesSent, count); } - void rs_bodyBytesSent(int count) + void rs_bodyBytesSent(int count, RequestSession *rs) { - RequestSession *rs = (RequestSession *)sender(); - SessionItem *si = sessionItemsBySession.value(rs); assert(si); @@ -1373,7 +1367,6 @@ public slots: incCounter(Stats::ClientContentBytesSent, count); } -public: void acceptRequest_finished() { if(acceptRequest->success()) diff --git a/src/cpp/proxy/requestsession.cpp b/src/cpp/proxy/requestsession.cpp index 4b5bf2f1..e645fdf3 100644 --- a/src/cpp/proxy/requestsession.cpp +++ b/src/cpp/proxy/requestsession.cpp @@ -488,7 +488,7 @@ class RequestSession::Private : public QObject state = WaitingForResponse; requestData.body = in.take(); - emit q->inspected(idata); + q->inspected(idata); } } else if(state == ReceivingForAccept) @@ -817,7 +817,7 @@ class RequestSession::Private : public QObject if(zhttpRequest->isFinished()) { cleanup(); - emit q->finished(); + q->finished(); } } @@ -867,7 +867,7 @@ class RequestSession::Private : public QObject { log_debug("requestsession: request error id=%s", rid.second.data()); cleanup(); - emit q->finished(); + q->finished(); } void inspectRequest_finished() @@ -912,7 +912,7 @@ class RequestSession::Private : public QObject { state = WaitingForResponse; requestData.body = in.take(); - emit q->inspected(idata); + q->inspected(idata); } } } @@ -935,7 +935,7 @@ class RequestSession::Private : public QObject zhttpRequest = 0; cleanup(); - emit q->finishedByAccept(); + q->finishedByAccept(); } else { @@ -1004,7 +1004,7 @@ public slots: zhttpRequest->writeBody(body); responseBodySize += body.size(); zhttpRequest->endBody(); - emit q->errorResponding(); + q->errorResponding(); return; } @@ -1051,7 +1051,7 @@ public slots: zhttpRequest->writeBody(body); responseBodySize += body.size(); zhttpRequest->endBody(); - emit q->errorResponding(); + q->errorResponding(); return; } @@ -1119,7 +1119,7 @@ public slots: // if we error while streaming, all we can do is give up zhttpRequest->endBody(); - emit q->errorResponding(); + q->errorResponding(); return; } @@ -1357,7 +1357,7 @@ void RequestSession::startResponse(int code, const QByteArray &reason, const Htt { assert(d->state == Private::ReceivingForAccept || d->state == Private::WaitingForResponse); - emit headerBytesSent(ZhttpManager::estimateResponseHeaderBytes(code, reason, headers)); + headerBytesSent(ZhttpManager::estimateResponseHeaderBytes(code, reason, headers)); d->state = Private::RespondingStart; d->responseData.code = code; @@ -1372,7 +1372,7 @@ void RequestSession::writeResponseBody(const QByteArray &body) assert(d->state == Private::RespondingStart || d->state == Private::Responding); assert(!d->responseBodyFinished); - emit bodyBytesSent(body.size()); + bodyBytesSent(body.size()); d->out += body; d->responseUpdate(); diff --git a/src/cpp/proxy/requestsession.h b/src/cpp/proxy/requestsession.h index e087fb8c..077db348 100644 --- a/src/cpp/proxy/requestsession.h +++ b/src/cpp/proxy/requestsession.h @@ -29,6 +29,7 @@ #include using Signal = boost::signals2::signal; +using SignalInt = boost::signals2::signal; using Connection = boost::signals2::scoped_connection; class QHostAddress; @@ -104,20 +105,18 @@ class RequestSession : public QObject Signal inspectError; -signals: - void inspected(const InspectData &idata); - void finished(); - void finishedByAccept(); - void bytesWritten(int count); - void paused(); - void headerBytesSent(int count); - void bodyBytesSent(int count); - + boost::signals2::signal inspected; + Signal finished; + Signal finishedByAccept; + SignalInt bytesWritten; + Signal paused; + SignalInt headerBytesSent; + SignalInt bodyBytesSent; // this signal means some error was encountered while responding and // that you should not attempt to call further response-related // methods. the object remains in an active state though, and so you // should still wait for finished() - void errorResponding(); + Signal errorResponding; private: class Private;