size_t http::curl::detail::ResponseReader::ProcessCurlWriteHeaderCallback(void* ptr, size_t size, size_t nmemb) { const size_t length = size * nmemb; if (statusLineProcessed) { ProcessHeader(ptr, length); } else { ProcessStatusLine(ptr, length); statusLineProcessed = true; } return length; }
int Response::pump( const unsigned char* data, int datasize ) { assert( datasize != 0 ); int count = datasize; while( count > 0 && m_State != COMPLETE ) { if( m_State == STATUSLINE || m_State == HEADERS || m_State == TRAILERS || m_State == CHUNKLEN || m_State == CHUNKEND ) { // we want to accumulate a line while( count > 0 ) { char c = (char)*data++; --count; if( c == '\n' ) { // now got a whole line! switch( m_State ) { case STATUSLINE: ProcessStatusLine( m_LineBuf ); break; case HEADERS: ProcessHeaderLine( m_LineBuf ); break; case TRAILERS: ProcessTrailerLine( m_LineBuf ); break; case CHUNKLEN: ProcessChunkLenLine( m_LineBuf ); break; case CHUNKEND: // just soak up the crlf after body and go to next state assert( m_Chunked == true ); m_State = CHUNKLEN; break; default: break; } m_LineBuf.clear(); break; // break out of line accumulation! } else { if( c != '\r' ) // just ignore CR m_LineBuf += c; } } } else if( m_State == BODY ) { int bytesused = 0; if( m_Chunked ) bytesused = ProcessDataChunked( data, count ); else bytesused = ProcessDataNonChunked( data, count ); data += bytesused; count -= bytesused; } } // return number of bytes used return datasize - count; }