bool KLUPD::HttpProtocol::HttpHeader::load(const char *headerBuffer, HttpAuthorizationDriver &httpAuthorizationDriver) { if(!headerBuffer) return false; clear(); // getting HTTP code std::string httpCodeBuffer; const size_t bytesReadHeader = getLine(headerBuffer, httpCodeBuffer); if(!bytesReadHeader) return false; headerBuffer += bytesReadHeader; if(!parseFirstLine(httpCodeBuffer)) return false; while(*headerBuffer) { std::string fieldBuffer; const size_t bytesReadField = getLine(headerBuffer, fieldBuffer); if(!bytesReadField) return false; headerBuffer += bytesReadField; parseHeaderField(asciiToWideChar(fieldBuffer), httpAuthorizationDriver); } return true; }
bool PartHandler::parseHeader( Stream* input ) { TRACE( "Parse header...%s", "" ); // if we're not given a buffer, create it now if ( m_pBuffer == 0 ) initBuffer(); m_pBuffer->fill( input ); uint32 pos; while( true ) { pos = m_pBuffer->find( "\r\n" ); // No more headers? -- get new data if( pos == String::npos ) { m_pBuffer->flush(); // was the flush operation useless -- can't we make new space? if( m_pBuffer->full() ) { m_sError = "Single header entity too large"; return false; } // hit eof in the previous loops? if( *m_pToBodyLeft == 0 || input->eof() ) { m_sError = "Unterminated header"; return false; } m_pBuffer->fill( input ); // read error? if( ! input->good() ) { m_sError = "I/O Error while reading header from input stream"; return false; } // Re-perform the search continue; } // are we done? if( pos == 0 ) { // discard read headers m_pBuffer->m_nBufPos += 2; break; } // parse this field String sLineBuf; m_pBuffer->grabMore( sLineBuf, pos ); if( ! parseHeaderField( sLineBuf ) ) { return false; } // update the buffer pos m_pBuffer->m_nBufPos += pos + 2; } // flush discarding parsed headers. m_pBuffer->flush(); // Maybe not necessary here return true; }