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); }
/* entry of timer update client map*/ int update_remote_connect(void *param) { ProxySession *psession ; NDInstanceSrv *pinst = static_cast<NDInstanceSrv *> (param) ; NDCmIterator cm_it(pinst) ; NDOStreamMsg sendmsg(MAXID_SYS, SYM_TEST) ; if(!cm_it.CheckValid()) { nd_sleep(100) ; return 0 ; } for (psession=(ProxySession *) cm_it.First(); psession; psession=(ProxySession *)cm_it.Next()) { psession->UpdateRemote() ; } nd_sleep(10) ; return 0 ; }
void doProxy(RequestSession *rs, const InspectData *idata = 0, bool isRetry = false) { DomainMap::Entry route = rs->route(); // we'll always have a route assert(!route.isNull()); bool sharable = (idata && !idata->sharingKey.isEmpty() && rs->haveCompleteRequestBody()); ProxySession *ps = 0; if(sharable) { log_debug("need to proxy with sharing key: %s", idata->sharingKey.data()); ProxyItem *i = proxyItemsByKey.value(idata->sharingKey); if(i) ps = i->ps; } if(!ps) { log_debug("creating proxysession for id=%s", rs->rid().second.data()); ps = new ProxySession(zroutes, accept, this); connect(ps, SIGNAL(addNotAllowed()), SLOT(ps_addNotAllowed())); connect(ps, SIGNAL(finished()), SLOT(ps_finished())); connect(ps, SIGNAL(requestSessionDestroyed(RequestSession *, bool)), SLOT(ps_requestSessionDestroyed(RequestSession *, bool))); ps->setRoute(route); ps->setDefaultSigKey(config.sigIss, config.sigKey); ps->setDefaultUpstreamKey(config.upstreamKey); ps->setUseXForwardedProtocol(config.useXForwardedProtocol); ps->setXffRules(config.xffUntrustedRule, config.xffTrustedRule); ps->setOrigHeadersNeedMark(config.origHeadersNeedMark); if(idata) ps->setInspectData(*idata); ProxyItem *i = new ProxyItem; i->ps = ps; proxyItemsBySession.insert(i->ps, i); if(sharable) { i->shared = true; i->key = idata->sharingKey; proxyItemsByKey.insert(i->key, i); } } else log_debug("reusing proxysession"); // proxysession will take it from here rs->disconnect(this); ps->add(rs); if(stats) { stats->addConnection(ridToString(rs->rid()), route.id, StatsManager::Http, rs->peerAddress(), rs->isHttps(), isRetry); stats->addActivity(route.id); } }
//直接处理来自socket的原始数据 int _listen_data_handle(nd_handle session, void *data, size_t size, nd_handle listener) { ProxySession *psession =(ProxySession*) NDGetSession( session) ; nd_assert(psession) ; switch(psession->GetStat()) { case 2: psession->SendRemote(data, size) ; break ; case 0 : { char *cmd =(char*) data ; char buf[128] ; if (size < 3){ goto PROXY_ERROR ; } if(cmd[0] != 5 ) goto PROXY_ERROR ; buf[0] = 5; buf[1] = 0 ; psession->SendRawData(buf, 2) ; psession->SetStat(1) ; return 0 ; } break ; case 1 : { short port; int is_udp = 0 ; int port_offset=8 ; char *cmd =(char*) data ; char host[256]; if (cmd[0]!=5) { goto PROXY_ERROR ; } //get host and port if(cmd[3]==1){ memset(host,0,sizeof(host)); snprintf(host,128,"%d.%d.%d.%d",0xff&cmd[4],0xff&cmd[5],0xff&cmd[6],0xff&cmd[7]); } else{ int host_len= cmd[4] ; if(host_len<=0) goto PROXY_ERROR ; memcpy(host,cmd+5,host_len); host[host_len]=0; port_offset=host_len+5; } port=(0xff&cmd[port_offset+1]) + ((0xff&cmd[port_offset]) << 8); if(cmd[1]==1) { //connect } else if(cmd[1]==2) { //bind not surport goto PROXY_ERROR ; } else if(cmd[1]==3) { //udp not surport is_udp = 1; } //get if(0==psession->ConnectRemote(host, port,is_udp) ) { SOCKADDR_IN *addr = psession->GetRemoteAddr() ; host[0] = 5 ; host[1]=0 ; host[2] = 0; host[3] = 1 ; *(unsigned int*)(&host[4]) = addr->sin_addr.s_addr ;//nd_sock_getip(fd) ; *(unsigned short*)(&host[8]) = addr->sin_port; psession->SendRawData(host, 10) ; } else goto PROXY_ERROR ; psession->SetStat(2); return 0 ; } break ; } return 0; PROXY_ERROR: { char res[2] ; res[0]= 5; res[1] = 1 ; psession->SendRawData(res, 2) ; return -1; } }