void tryTakeRequest() { if(maxWorkers != -1 && requestSessions.count() >= maxWorkers) return; M2Request *req = m2->takeNext(); if(!req) return; RequestSession *rs = new RequestSession(inspect, inspectChecker, this); connect(rs, SIGNAL(inspected(const InspectData &)), SLOT(rs_inspected(const InspectData &))); connect(rs, SIGNAL(inspectError()), SLOT(rs_inspectError())); connect(rs, SIGNAL(finished()), SLOT(rs_finished())); connect(rs, SIGNAL(finishedForAccept(const AcceptData &)), SLOT(rs_finishedForAccept(const AcceptData &))); requestSessions += rs; rs->start(req); }
void tryTakeRequest() { if(!canTake()) return; ZhttpRequest *req = zhttpIn->takeNextRequest(); if(!req) return; RequestSession *rs = new RequestSession(domainMap, sockJsManager, inspect, inspectChecker, accept, this); connect(rs, SIGNAL(inspected(const InspectData &)), SLOT(rs_inspected(const InspectData &))); connect(rs, SIGNAL(inspectError()), SLOT(rs_inspectError())); connect(rs, SIGNAL(finished()), SLOT(rs_finished())); connect(rs, SIGNAL(finishedByAccept()), SLOT(rs_finishedByAccept())); rs->setAutoCrossOrigin(config.autoCrossOrigin); requestSessions += rs; rs->start(req); }
void add(RequestSession *rs) { assert(addAllowed); assert(!route.isNull()); SessionItem *si = new SessionItem; si->rs = rs; si->rs->setParent(this); sessionItems += si; sessionItemsBySession.insert(rs, si); connect(rs, SIGNAL(bytesWritten(int)), SLOT(rs_bytesWritten(int))); connect(rs, SIGNAL(errorResponding()), SLOT(rs_errorResponding())); connect(rs, SIGNAL(finished()), SLOT(rs_finished())); connect(rs, SIGNAL(paused()), SLOT(rs_paused())); if(state == Stopped) { isHttps = rs->isHttps(); requestData = rs->requestData(); requestBody += requestData.body; requestData.body.clear(); if(!route.asHost.isEmpty()) requestData.uri.setHost(route.asHost); if(route.pathRemove > 0) { QByteArray path = requestData.uri.encodedPath(); path = path.mid(route.pathRemove); requestData.uri.setEncodedPath(path); } QByteArray sigIss; QByteArray sigKey; if(!route.sigIss.isEmpty() && !route.sigKey.isEmpty()) { sigIss = route.sigIss; sigKey = route.sigKey; } else { sigIss = defaultSigIss; sigKey = defaultSigKey; } targets = route.targets; bool trustedClient = ProxyUtil::manipulateRequestHeaders("wsproxysession", q, &requestData, defaultUpstreamKey, route, sigIss, sigKey, useXForwardedProtocol, xffTrustedRule, xffRule, origHeadersNeedMark, rs->peerAddress(), idata); if(trustedClient) passToUpstream = true; state = Requesting; buffering = true; if(!rs->isRetry()) { inRequest = rs->request(); connect(inRequest, SIGNAL(readyRead()), SLOT(inRequest_readyRead())); connect(inRequest, SIGNAL(error()), SLOT(inRequest_error())); requestBody += inRequest->readBody(); } initialRequestBody = requestBody.toByteArray(); if(requestBody.size() > MAX_ACCEPT_REQUEST_BODY) { requestBody.clear(); buffering = false; } tryNextTarget(); } else if(state == Requesting) { // nothing to do, just wait around until a response comes } else if(state == Responding) { // get the session caught up with where we're at si->state = SessionItem::Responding; rs->startResponse(responseData.code, responseData.reason, responseData.headers); if(!responseBody.isEmpty()) { si->bytesToWrite += responseBody.size(); rs->writeResponseBody(responseBody.toByteArray()); } } }