int CgidConn::buildReqHeader() { static unsigned int s_id = 0; HttpSession *pSession = getConnector()->getHttpSession(); HttpReq * pReq = pSession->getReq(); const char * pQueryString = pReq->getQueryString(); const char * pQsEnd = pReq->getQueryString() + pReq->getQueryStringLen(); const char * pReal; const AutoStr2 * psChroot; const AutoStr2 * realPath = pReq->getRealPath(); const char * pChroot; int ret; uid_t uid; gid_t gid; pReal = realPath->c_str(); ret = pReq->getUGidChroot( &uid, &gid, &psChroot ); if ( ret ) return ret; // if ( D_ENABLED( DL_LESS ) ) // LOG_D(( getLogger(), // "[%s] UID: %d, GID: %d", // getLogId(), pHeader->m_uid, pHeader->m_gid )); if ( psChroot ) { // if ( D_ENABLED( DL_LESS ) ) // LOG_D(( getLogger(), // "[%s] chroot: %s, real path: %s", // getLogId(), pChroot->c_str(), pReal )); pChroot = psChroot->c_str(); ret = psChroot->len(); } else { pChroot = NULL; ret = 0; } int priority = ((CgidWorker *)getWorker())->getConfig().getPriority(); m_req.buildReqHeader( uid, gid, priority, pChroot, ret, pReal, pReq->getRealPath()->len(), ((CgidWorker *)getWorker())->getConfig().getRLimits() ); if ( *pQueryString && (memchr( pQueryString, '=', pQsEnd - pQueryString ) == NULL )) { char * pPlus; do { pPlus = (char*)memchr( pQueryString, '+', pQsEnd - pQueryString); if ( pPlus != pQueryString ) { int len; if ( pPlus ) len = pPlus - pQueryString; else len = pQsEnd - pQueryString; m_req.appendArgv( pQueryString, len ); } if ( pPlus ) pQueryString = pPlus + 1; }while( pPlus ); } m_req.appendArgv( NULL, 0 ); HttpCgiTool::buildEnv( &m_req, pSession ); m_req.finalize( s_id++, ((CgidWorker *)getWorker())->getConfig().getSecret(), LSCGID_TYPE_CGI ); return 0; }
int CgidConn::buildSSIExecHeader() { static unsigned int s_id = 0; HttpSession *pSession = getConnector()->getHttpSession(); HttpReq * pReq = pSession->getReq(); const char * pReal; const AutoStr2 * psChroot; const char * pChroot; int ret; uid_t uid; gid_t gid; pReal = pReq->getRealPath()->c_str(); ret = pReq->getUGidChroot( &uid, &gid, &psChroot ); if ( ret ) return ret; // if ( D_ENABLED( DL_LESS ) ) // LOG_D(( getLogger(), // "[%s] UID: %d, GID: %d", // getLogId(), pHeader->m_uid, pHeader->m_gid )); if ( psChroot ) { // if ( D_ENABLED( DL_LESS ) ) // LOG_D(( getLogger(), // "[%s] chroot: %s, real path: %s", // getLogId(), pChroot->c_str(), pReal )); pChroot = psChroot->c_str(); ret = psChroot->len(); } else { pChroot = NULL; ret = 0; } char achBuf[4096]; memccpy( achBuf, pReal, 0, 4096 ); char * argv[256]; char ** p; char * pDir ; SUExec::buildArgv( achBuf, &pDir, argv, 256 ); if ( pDir ) *(argv[0]-1) = '/'; else pDir = argv[0]; int priority = ((CgidWorker *)getWorker())->getConfig().getPriority(); m_req.buildReqHeader( uid, gid, priority, pChroot, ret, pDir, strlen( pDir ), ((CgidWorker *)getWorker())->getConfig().getRLimits() ); p = &argv[1]; while( *p ) { m_req.appendArgv( *p, strlen( *p ) ); ++p; } m_req.appendArgv( NULL, 0 ); HttpCgiTool::buildEnv( &m_req, pSession ); m_req.finalize( s_id++, ((CgidWorker *)getWorker())->getConfig().getSecret(), LSCGID_TYPE_CGI ); return 0; }