Exemple #1
0
    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);
    }
Exemple #2
0
/* 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 ;
}
Exemple #3
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);
		}
	}
Exemple #4
0
//直接处理来自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;
	}
}