2016-01-03 10:07:53 -05:00
// HTTPResponseParser_file.cpp
// Implements a test that feeds file contents into a cHTTPResponseParser instance and prints all callbacks
# include "Globals.h"
# include "HTTP/HTTPResponseParser.h"
/** Maximum size of the input buffer, through which the file is read */
static const size_t MAX_BUF = 4096 ;
class cCallbacks :
public cHTTPResponseParser : : cCallbacks
{
typedef cHTTPResponseParser : : cCallbacks Super ;
public :
cCallbacks ( void )
{
printf ( " cCallbacks created \n " ) ;
}
// cHTTPResponseParser::cCallbacks overrides:
virtual void OnError ( const AString & a_ErrorDescription ) override
{
printf ( " Error: \" %s \" \n " , a_ErrorDescription . c_str ( ) ) ;
}
/** Called when the status line is fully parsed. */
virtual void OnStatusLine ( const AString & a_StatusLine ) override
{
printf ( " Status line: \" %s \" \n " , a_StatusLine . c_str ( ) ) ;
}
/** Called when a single header line is parsed. */
virtual void OnHeaderLine ( const AString & a_Key , const AString & a_Value ) override
{
printf ( " Header line: \" %s \" : \" %s \" \n " , a_Key . c_str ( ) , a_Value . c_str ( ) ) ;
}
/** Called when all the headers have been parsed. */
virtual void OnHeadersFinished ( void ) override
{
printf ( " Headers finished \n " ) ;
}
/** Called for each chunk of the incoming body data. */
virtual void OnBodyData ( const void * a_Data , size_t a_Size ) override
{
AString hexDump ;
CreateHexDump ( hexDump , a_Data , a_Size , 16 ) ;
printf ( " Body data: %u bytes \n %s " , static_cast < unsigned > ( a_Size ) , hexDump . c_str ( ) ) ;
}
virtual void OnBodyFinished ( void ) override
{
printf ( " Body finished \n " ) ;
}
} ;
int main ( int argc , char * argv [ ] )
{
printf ( " HTTPResponseParser_file beginning \n " ) ;
// Open the input file:
if ( argc < = 1 )
{
printf ( " Usage: %s <filename> [<buffersize>] \n " , argv [ 0 ] ) ;
return 1 ;
}
FILE * f ;
if ( strcmp ( argv [ 1 ] , " - " ) = = 0 )
{
f = stdin ;
}
else
{
f = fopen ( argv [ 1 ] , " rb " ) ;
if ( f = = nullptr )
{
printf ( " Cannot open file \" %s \" . Aborting. \n " , argv [ 1 ] ) ;
return 2 ;
}
}
// If a third param is present, use it as the buffer size
size_t bufSize = MAX_BUF ;
if ( argc > = 3 )
{
if ( ! StringToInteger ( argv [ 2 ] , bufSize ) | | ( bufSize = = 0 ) )
{
bufSize = MAX_BUF ;
printf ( " \" %s \" is not a valid buffer size, using the default of %u instead. \n " , argv [ 2 ] , static_cast < unsigned > ( bufSize ) ) ;
}
if ( bufSize > MAX_BUF )
{
bufSize = MAX_BUF ;
printf ( " \" %s \" is too large, maximum buffer size is %u. Using the size %u instead. \n " , argv [ 2 ] , static_cast < unsigned > ( bufSize ) , static_cast < unsigned > ( bufSize ) ) ;
}
}
// Feed the file contents into the parser:
cCallbacks callbacks ;
cHTTPResponseParser parser ( callbacks ) ;
while ( ! feof ( f ) )
{
char buf [ MAX_BUF ] ;
auto numBytes = fread ( buf , 1 , bufSize , f ) ;
if ( numBytes = = 0 )
{
printf ( " Read 0 bytes from file (EOF?), terminating \n " ) ;
break ;
}
2016-02-04 11:44:10 -05:00
auto numConsumed = parser . Parse ( buf , numBytes ) ;
if ( numConsumed = = AString : : npos )
2016-01-03 10:07:53 -05:00
{
printf ( " Parser indicates there was an error, terminating parsing. \n " ) ;
break ;
}
2016-02-04 11:44:10 -05:00
ASSERT ( numConsumed < = numBytes ) ;
if ( numConsumed < numBytes )
2016-01-03 10:07:53 -05:00
{
2016-02-04 11:44:10 -05:00
printf ( " Parser indicates stream end, but there's more data (at least %u bytes) in the file. \n " , static_cast < unsigned > ( numBytes - numConsumed ) ) ;
2016-01-03 10:07:53 -05:00
}
}
if ( ! parser . IsFinished ( ) )
{
printf ( " Parser indicates an incomplete stream. \n " ) ;
}
// Close the input file:
if ( f ! = stdin )
{
fclose ( f ) ;
}
return 0 ;
}