int FcgiRequest::processStdErr( char * pBuf, int size ) { HttpExtConnector * pConnector = getConnector(); assert( pConnector ); if ( D_ENABLED( DL_MEDIUM ) ) LOG_D(( pConnector->getLogger(), "[%s] process STDERR %d bytes", pConnector->getLogId(), size )); return pConnector->processErrData( pBuf, size ); }
int FcgiRequest::onStdOut() { HttpExtConnector * pConnector = getConnector(); assert( pConnector ); if ( D_ENABLED( DL_MEDIUM ) ) LOG_D(( pConnector->getLogger(), "[%s] onStdOut()", pConnector->getLogId() )); return pConnector->extInputReady(); }
int FcgiRequest::endOfRequest( int endCode, int status ) { m_iProtocolStatus = status; HttpExtConnector * pConnector = getConnector(); assert( pConnector ); if ( endCode ) { LOG_ERR(( pConnector->getLogger(), "[%s] FcgiRequest::endOfRequest( %d, %d)!\n", pConnector->getLogId(), endCode, status )); pConnector->endResponse( SC_500, status ); } else pConnector->endResponse( endCode, status ); return 0; }
int ProxyConn::readRespBody() { HttpExtConnector *pHEC = getConnector(); int ret = 0; size_t bufLen; if (!pHEC) return LS_FAIL; if (m_pChunkIS) { while (getState() != ABORT && !m_pChunkIS->eos()) { char *pBuf = pHEC->getRespBuf(bufLen); if (!pBuf) return LS_FAIL; ret = m_pChunkIS->read(pBuf, bufLen); if (ret >= 0) { if (ret > 0) { m_lLastRespRecvTime = time(NULL); m_iRespBodyRecv += ret; int ret1 = pHEC->processRespBodyData(pBuf, ret); if (ret1 == -1) ret = LS_FAIL; if (ret > 1024 || (ret < (int)bufLen)) pHEC->flushResp(); } if (m_pChunkIS->eos()) { ret = 0; break; } pHEC->flushResp(); return ret; } else { if ((errno == ECONNRESET) && (getConnector())) break; return LS_FAIL; } } } else { while ((getState() != ABORT) && (m_iRespBodySize - m_iRespBodyRecv > 0)) { char *pBuf = pHEC->getRespBuf(bufLen); if (!pBuf) return LS_FAIL; int64_t toRead = m_iRespBodySize - m_iRespBodyRecv; if (toRead > (int64_t)bufLen) toRead = bufLen ; ret = read(pBuf, toRead); if (ret > 0) { m_iRespBodyRecv += ret; pHEC->processRespBodyData(pBuf, ret); if (ret > 1024) pHEC->flushResp(); //if ( ret1 ) // return ret1; if (m_iRespBodySize - m_iRespBodyRecv <= 0) break; if (ret < (int)toRead) { pHEC->flushResp(); return 0; } } else { if (ret) { if ((errno == ECONNRESET) && (getConnector())) break; } return ret; } } } incReqProcessed(); if (pHEC->getRespState() & HEC_RESP_CONN_CLOSE) setState(CLOSING); setInProcess(0); pHEC->endResponse(0, 0); return ret; }
int ProxyConn::processResp() { HttpExtConnector *pHEC = getConnector(); if (!pHEC) { errno = ECONNRESET; return LS_FAIL; } int len = 0; int ret = 0; int &respState = pHEC->getRespState(); if (!(respState & 0xff)) { char *p = HttpResourceManager::getGlobalBuf(); const char *pBuf = p; if (m_iSsl) len = m_ssl.read(p, 1460); else len = ExtConn::read(p, 1460); if (len > 0) { int copy = len; if (m_iRespHeaderRecv + copy > 4095) copy = 4095 - m_iRespHeaderRecv; //memmove( &m_achRespBuf[ m_iRespHeaderRecv ], pBuf, copy ); m_iRespHeaderRecv += copy; m_iRespRecv += len; LS_DBG_L(this, "Read Response %d bytes", len); //debug code //::write( 1, pBuf, len ); ret = pHEC->parseHeader(pBuf, len, 1); switch (ret) { case -2: LS_WARN(this, "Invalid Http response header, retry!"); //debug code //::write( 1, pBuf, len ); errno = ECONNRESET; case -1: return LS_FAIL; } } else return len; if (respState & 0xff) { //debug code //::write(1, HttpResourceManager::getGlobalBuf(), // pBuf - HttpResourceManager::getGlobalBuf() ); HttpReq *pReq = pHEC->getHttpSession()->getReq(); if (pReq->noRespBody()) { incReqProcessed(); if (len > 0) abort(); else if (respState & HEC_RESP_CONN_CLOSE) setState(CLOSING); else if (getState() == ABORT) setState(PROCESSING); setInProcess(0); pHEC->endResponse(0, 0); return 0; } m_iRespBodySize = pHEC->getHttpSession()->getResp()->getContentLen(); LS_DBG_L(this, "Response body size of proxy reply is %d", m_iRespBodySize); if (m_iRespBodySize == LSI_RSP_BODY_SIZE_CHUNKED) setupChunkIS(); else if (!(respState & HEC_RESP_CONT_LEN)) m_iRespBodySize = INT_MAX; m_pBufBegin = pBuf; m_pBufEnd = pBuf + len; LS_DBG_M(this, "Process Response body %d bytes", len); return readRespBody(); } } else return readRespBody(); return 0; }