Beispiel #1
0
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;
}
Beispiel #2
0
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;
}