int SSIEngine::startExecute( HttpSession *pSession, SSIScript * pScript ) { if ( !pScript ) return SC_500; SSIRuntime * pRuntime = pSession->getReq()->getSSIRuntime(); if ( !pRuntime ) { char ct[]= "text/html"; HttpReq * pReq = pSession->getReq(); pRuntime = new SSIRuntime(); if (!pRuntime ) return SC_500; pRuntime->init(); pRuntime->initConfig( pReq->getSSIConfig() ); pReq->setSSIRuntime( pRuntime ); pSession->getResp()->reset(); //pSession->getResp()->prepareHeaders( pReq ); //pSession->setupChunkOS( 0 ); HttpCgiTool::processContentType( pReq, pSession->getResp(), ct , 9 ); // pSession->setupRespCache(); if ( pReq->isXbitHackFull() ) { pSession->getResp()->appendLastMod( pReq->getLastMod() ); } int status = pReq->getStatusCode(); if (( status >= SC_300 )&&( status < SC_400 )) { if ( pReq->getLocation() != NULL ) { pSession->addLocationHeader(); } } pSession->setupGzipFilter(); pReq->andGzip( ~GZIP_ENABLED ); //disable GZIP } if ( pRuntime->push( pScript ) == -1 ) return SC_500; pSession->getReq()->backupPathInfo(); pScript->resetRuntime(); return resumeExecute( pSession ); }
int JConn::readRespHeader( unsigned char *&p, unsigned char *pEnd ) { while( m_iNumHeader > 0 ) { if ( pEnd - p < 4 ) return 0; unsigned char id1 = *p; unsigned char id2; int headerNameLen; const char * pHeaderName; unsigned char * p1; if ( id1 == 0xA0 ) { id2 = *(p+1); if (( id2 > 0 )&&( id2 <= AJP_RESP_HEADERS_NUM )) { pHeaderName = JkAjp13::getRespHeaderById( id2 ); headerNameLen = JkAjp13::getRespHeaderLenById( id2 ); p1 = p + 2; } else { //invalid header id return -1; } } else { headerNameLen = id1 << 8 | *(p+1); if ( pEnd - p < headerNameLen + 5 ) return 0; pHeaderName = (const char *)p + 2; p1 = p + headerNameLen + 3; } int headerValLen = peekInt( p1 ); if ( pEnd - p1 < headerValLen + 3 ) return 0; char * pHeaderVal = (char *)p1 + 2; p = p1 + headerValLen + 3; --m_iNumHeader; HttpResp * pResp = getConnector()->getHttpConn()->getResp(); int ret = pResp->appendHeader( pHeaderName, headerNameLen, pHeaderVal, headerValLen ); if ( ret ) return ret; HttpReq * pReq = getConnector()->getHttpConn()->getReq(); if ( pReq->gzipAcceptable() ) { if ( *pHeaderName == 'C' || *pHeaderName == 'c' ) { if ( strcasecmp( pHeaderName, "content-type" ) == 0 ) { char * p = (char *)memchr( pHeaderVal, ';', headerValLen ); if ( !p ) p = pHeaderVal + headerValLen; register char ch; ch = *p; *p = 0; if ( !HttpGlobals::getMime()->compressable( pHeaderVal ) ) pReq->andGzip( ~GZIP_ENABLED ); *p = ch; } else if ( strcasecmp( pHeaderName, "content-encoding" ) == 0 ) { pReq->andGzip( ~GZIP_ENABLED ); } } } } getConnector()->getRespState() |= HttpReq::HEADER_OK; return getConnector()->respHeaderDone( m_pCurPos - p ); }
int HttpCgiTool::processHeaderLine(HttpExtConnector *pExtConn, const char *pLineBegin, const char *pLineEnd, int &status) { HttpRespHeaders::HEADERINDEX index; int tmpIndex; const char *pKeyEnd = NULL; const char *pValue = pLineBegin; char *p; HttpResp *pResp = pExtConn->getHttpSession()->getResp(); HttpReq *pReq = pExtConn->getHttpSession()->getReq(); index = HttpRespHeaders::getRespHeaderIndex(pValue); if (index < HttpRespHeaders::H_HEADER_END) { pValue += HttpRespHeaders::getHeaderStringLen(index); while (isspace(*pValue)) ++pValue; pKeyEnd = pValue; if (*pValue != ':') index = HttpRespHeaders::H_HEADER_END; else { do { ++pValue; } while (isspace(*pValue)); } } if (index == HttpRespHeaders::H_HEADER_END) { pKeyEnd = (char *)memchr(pValue, ':', pLineEnd - pValue); if (pKeyEnd != NULL) { pValue = pKeyEnd + 1; while (isspace(*pValue)) ++pValue; } else { if (!isspace(*pLineBegin)) return 0; } } switch (index) { case HttpRespHeaders::H_CONTENT_TYPE: if (pReq->getStatusCode() == SC_304) return 0; p = (char *)memchr(pValue, ';', pLineEnd - pValue); if (pReq->gzipAcceptable() == GZIP_REQUIRED) { char ch = 0; char *p1; if (p) p1 = (char *)p; else p1 = (char *)pLineEnd; ch = *p1; *p1 = 0; if (!HttpMime::getMime()->compressible(pValue)) pReq->andGzip(~GZIP_ENABLED); *p1 = ch; } if (pReq->isKeepAlive()) pReq->smartKeepAlive(pValue); { if (!HttpMime::needCharset(pValue)) break; const AutoStr2 *pCharset = pReq->getDefaultCharset(); if (!pCharset) break; if (p) { while (isspace(*(++p))) ; if (strncmp(p, "charset=", 8) == 0) break; } HttpRespHeaders &buf = pResp->getRespHeaders(); AutoStr2 str = ""; str.append(pLineBegin, pLineEnd - pLineBegin); str.append(pCharset->c_str(), pCharset->len()); str.append("\r\n", 2); buf.parseAdd(str.c_str(), str.len(), LSI_HEADEROP_ADD); } return 0; case HttpRespHeaders::H_CONTENT_ENCODING: if (pReq->getStatusCode() == SC_304) return 0; if (strncasecmp(pValue, "gzip", 4) == 0) pReq->orGzip(UPSTREAM_GZIP); else if (strncasecmp(pValue, "deflate", 7) == 0) pReq->orGzip(UPSTREAM_DEFLATE); // if ( !(pReq->gzipAcceptable() & REQ_GZIP_ACCEPT) ) // return 0; // } // else //if ( strncasecmp( pValue, "deflate", 7 ) == 0 ) // { // pReq->andGzip( ~GZIP_ENABLED ); // } break; case HttpRespHeaders::H_LOCATION: if ((status & HEC_RESP_PROXY) || (pReq->getStatusCode() != SC_200)) break; case HttpRespHeaders::H_LITESPEED_LOCATION: if (*pValue != '/') { //set status code to 307 pReq->setStatusCode(SC_302); } else { if ((pReq->getStatusCode() == SC_404) || (index == HttpRespHeaders::H_LITESPEED_LOCATION)) pReq->setStatusCode(SC_200); if (index == HttpRespHeaders::H_LITESPEED_LOCATION) { char ch = *pLineEnd; *((char *)pLineEnd) = 0; pReq->locationToUrl(pValue, pLineEnd - pValue); *((char *)pLineEnd) = ch; } else pReq->setLocation(pValue, pLineEnd - pValue); pExtConn->getHttpSession()->changeHandler(); //status |= HEC_RESP_LOC_SET; return 0; } break; case HttpRespHeaders::H_CGI_STATUS: tmpIndex = HttpStatusCode::getInstance().codeToIndex(pValue); if (tmpIndex != -1) { pReq->updateNoRespBodyByStatus(tmpIndex); if ((tmpIndex >= SC_300) && (tmpIndex < SC_400)) { if (pReq->getLocation() != NULL) { pResp->appendHeader("location: ", 10, pReq->getLocation(), pReq->getLocationLen()); pReq->clearLocation(); } } if ((status & HEC_RESP_AUTHORIZER) && (tmpIndex == SC_200)) status |= HEC_RESP_AUTHORIZED; } return 0; case HttpRespHeaders::H_TRANSFER_ENCODING: pResp->setContentLen(LSI_RSP_BODY_SIZE_CHUNKED); return 0; case HttpRespHeaders::H_SET_COOKIE: //pReq->getRespCacheCtrl().setHasCookie(); pReq->processSetCookieHeader(pValue, pLineEnd - pValue); break; case HttpRespHeaders::H_PROXY_CONNECTION: case HttpRespHeaders::H_CONNECTION: if (strncasecmp(pValue, "close", 5) == 0) status |= HEC_RESP_CONN_CLOSE; return 0; case HttpRespHeaders::H_CONTENT_LENGTH: if (pResp->getContentLen() == LSI_RSP_BODY_SIZE_UNKNOWN) { off_t lContentLen = strtoll(pValue, NULL, 10); if ((lContentLen >= 0) && (lContentLen != LLONG_MAX)) { pResp->setContentLen(lContentLen); status |= HEC_RESP_CONT_LEN; pReq->orContextState(RESP_CONT_LEN_SET); } } //fall through case HttpRespHeaders::H_KEEP_ALIVE: case HttpRespHeaders::H_SERVER: case HttpRespHeaders::H_DATE: return 0; default: //"script-control: no-abort" is not supported break; } if (status & HEC_RESP_AUTHORIZED) { if (strncasecmp(pLineBegin, "Variable-", 9) == 0) { if (pKeyEnd > pLineBegin + 9) RequestVars::setEnv(pExtConn->getHttpSession(), pLineBegin + 9, pKeyEnd - pLineBegin - 9, pValue, pLineEnd - pValue); } return 0; } assert(pKeyEnd); return pResp->appendHeader(pLineBegin, pKeyEnd - pLineBegin, pValue, pLineEnd - pValue); }