in source/core_http_client.c [803:889]
static int httpParserOnHeadersCompleteCallback( http_parser * pHttpParser )
{
int shouldContinueParse = HTTP_PARSER_CONTINUE_PARSING;
HTTPParsingContext_t * pParsingContext = NULL;
HTTPResponse_t * pResponse = NULL;
assert( pHttpParser != NULL );
assert( pHttpParser->data != NULL );
pParsingContext = ( HTTPParsingContext_t * ) ( pHttpParser->data );
pResponse = pParsingContext->pResponse;
assert( pResponse != NULL );
assert( pParsingContext->pBufferCur != NULL );
/* The current location to parse was updated in previous callbacks and MUST
* always be within the response buffer. */
assert( pParsingContext->pBufferCur >= ( const char * ) ( pResponse->pBuffer ) );
assert( pParsingContext->pBufferCur < ( const char * ) ( pResponse->pBuffer + pResponse->bufferLen ) );
/* `\r\n\r\n`, `\r\n\n`, `\n\r\n`, and `\n\n` are all valid indicators of
* the end of the response headers. To reduce complexity these characters
* are not included in the response headers length returned to the user. */
/* If headers existed, then pResponse->pHeaders was set during the first
* call to httpParserOnHeaderFieldCallback(). */
if( pResponse->pHeaders != NULL )
{
/* The start of the headers ALWAYS come before the the end of the headers. */
assert( ( const char * ) ( pResponse->pHeaders ) < pParsingContext->pBufferCur );
/* MISRA Rule 10.8 flags the following line for casting from a signed
* pointer difference to a size_t. This rule is suppressed because in
* in the previous statement it is asserted that the pointer difference
* will never be negative. */
/* coverity[misra_c_2012_rule_10_8_violation] */
pResponse->headersLen = ( size_t ) ( pParsingContext->pBufferCur - ( const char * ) ( pResponse->pHeaders ) );
}
else
{
pResponse->headersLen = 0U;
}
/* If the Content-Length header was found, then pHttpParser->content_length
* will not be equal to the maximum 64 bit integer. */
if( pHttpParser->content_length != UINT64_MAX )
{
pResponse->contentLength = ( size_t ) ( pHttpParser->content_length );
}
else
{
pResponse->contentLength = 0U;
}
/* If the Connection: close header was found this flag will be set. */
if( ( pHttpParser->flags & ( unsigned int ) ( F_CONNECTION_CLOSE ) ) != 0U )
{
pResponse->respFlags |= HTTP_RESPONSE_CONNECTION_CLOSE_FLAG;
}
/* If the Connection: keep-alive header was found this flag will be set. */
if( ( pHttpParser->flags & ( unsigned int ) ( F_CONNECTION_KEEP_ALIVE ) ) != 0U )
{
pResponse->respFlags |= HTTP_RESPONSE_CONNECTION_KEEP_ALIVE_FLAG;
}
/* http_parser_execute() requires that callback implementations must
* indicate that parsing stops on headers complete, if response is to a HEAD
* request. A HEAD response will contain Content-Length, but no body. If
* the parser is not stopped here, then it will try to keep parsing past the
* end of the headers up to the Content-Length found. */
if( pParsingContext->isHeadResponse == 1U )
{
shouldContinueParse = HTTP_PARSER_STOP_PARSING;
}
/* If headers are present in the response, then
* httpParserOnHeadersCompleteCallback() always follows
* the httpParserOnHeaderValueCallback(). When
* httpParserOnHeaderValueCallback() is not called in succession, then a
* complete header has been found. */
processCompleteHeader( pParsingContext );
LogDebug( ( "Response parsing: Found the end of the headers." ) );
return shouldContinueParse;
}