コード例 #1
0
ファイル: app.cpp プロジェクト: sunwill/pushpin
    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);
    }
コード例 #2
0
ファイル: engine.cpp プロジェクト: nicklv/pushpin
	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);
	}
コード例 #3
0
ファイル: proxysession.cpp プロジェクト: kbokarius/pushpin
	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());
			}
		}
	}