void doProxySocket(WebSocket *sock, const DomainMap::Entry &route) { QByteArray cid = connectionManager.addConnection(sock); WsProxySession *ps = new WsProxySession(zroutes, &connectionManager, stats, wsControl, this); connect(ps, SIGNAL(finishedByPassthrough()), SLOT(wsps_finishedByPassthrough())); ps->setDefaultSigKey(config.sigIss, config.sigKey); ps->setDefaultUpstreamKey(config.upstreamKey); ps->setUseXForwardedProtocol(config.useXForwardedProtocol); ps->setXffRules(config.xffUntrustedRule, config.xffTrustedRule); ps->setOrigHeadersNeedMark(config.origHeadersNeedMark); WsProxyItem *i = new WsProxyItem; i->ps = ps; wsProxyItemsBySession.insert(i->ps, i); ps->start(sock, cid, route); if(stats) { stats->addConnection(cid, ps->routeId(), StatsManager::WebSocket, sock->peerAddress(), sock->requestUri().scheme() == "wss", false); stats->addActivity(ps->routeId()); } }
void doProxy(RequestSession *rs, const InspectData *idata = 0) { ProxySession *ps = 0; if(idata && !idata->sharingKey.isEmpty()) { log_info("need to proxy with sharing key: %s", idata->sharingKey.data()); ProxyItem *i = proxyItemsByKey.value(idata->sharingKey); if(i) ps = i->ps; } if(!ps) { log_info("creating proxysession"); ps = new ProxySession(zurl, domainMap, this); connect(ps, SIGNAL(addNotAllowed()), SLOT(ps_addNotAllowed())); connect(ps, SIGNAL(finishedByPassthrough()), SLOT(ps_finishedByPassthrough())); connect(ps, SIGNAL(finishedForAccept(const AcceptData &)), SLOT(ps_finishedForAccept(const AcceptData &))); connect(ps, SIGNAL(requestSessionDestroyed(RequestSession *)), SLOT(ps_requestSessionDestroyed(RequestSession *))); if(idata) ps->setInspectData(*idata); ProxyItem *i = new ProxyItem; i->ps = ps; proxyItemsBySession.insert(i->ps, i); if(idata && !idata->sharingKey.isEmpty()) { i->shared = true; i->key = idata->sharingKey; proxyItemsByKey.insert(i->key, i); } } else log_info("reusing proxysession"); // proxysession will take it from here rs->disconnect(this); ps->add(rs); }