in source/core_http_client.c [893:966]
static int httpParserOnBodyCallback( http_parser * pHttpParser,
const char * pLoc,
size_t length )
{
int shouldContinueParse = HTTP_PARSER_CONTINUE_PARSING;
HTTPParsingContext_t * pParsingContext = NULL;
HTTPResponse_t * pResponse = NULL;
char * pNextWriteLoc = NULL;
assert( pHttpParser != NULL );
assert( pHttpParser->data != NULL );
assert( pLoc != NULL );
pParsingContext = ( HTTPParsingContext_t * ) ( pHttpParser->data );
pResponse = pParsingContext->pResponse;
assert( pResponse != NULL );
assert( pResponse->pBuffer != NULL );
assert( pLoc >= ( const char * ) ( pResponse->pBuffer ) );
assert( pLoc < ( const char * ) ( pResponse->pBuffer + pResponse->bufferLen ) );
/* If this is the first time httpParserOnBodyCallback() has been invoked,
* then the start of the response body is NULL. */
if( pResponse->pBody == NULL )
{
/* Ideally the start of the body should follow right after the header
* end indicating characters, but to reduce complexity and ensure users
* are given the correct start of the body, we set the start of the body
* to what the parser tells us is the start. This could come after the
* initial transfer encoding chunked header. */
pResponse->pBody = ( const uint8_t * ) ( pLoc );
pResponse->bodyLen = 0U;
}
/* The next location to write. */
/* MISRA Rule 11.8 flags casting away the const qualifier in the pointer
* type. This rule is suppressed because when the body is of transfer
* encoding chunked, the body must be copied over the chunk headers that
* precede it. This is done to have a contiguous response body. This does
* affect future parsing as the changed segment will always be before the
* next place to parse. */
/* coverity[misra_c_2012_rule_11_8_violation] */
pNextWriteLoc = ( char * ) ( pResponse->pBody + pResponse->bodyLen );
/* If the response is of type Transfer-Encoding: chunked, then actual body
* will follow the the chunked header. This body data is in a later location
* and must be moved up in the buffer. When pLoc is greater than the current
* end of the body, that signals the parser found a chunk header. */
/* MISRA Rule 18.3 flags pLoc and pNextWriteLoc as pointing to two different
* objects. This rule is suppressed because both pNextWriteLoc and pLoc
* point to a location in the response buffer. */
/* coverity[pointer_parameter] */
/* coverity[misra_c_2012_rule_18_3_violation] */
if( pLoc > pNextWriteLoc )
{
/* memmove is used instead of memcpy because memcpy has undefined behavior
* when source and destination locations in memory overlap. */
( void ) memmove( pNextWriteLoc, pLoc, length );
}
/* Increase the length of the body found. */
pResponse->bodyLen += length;
/* Set the next location of parsing. */
pParsingContext->pBufferCur = pLoc + length;
LogDebug( ( "Response parsing: Found the response body: "
"BodyLength=%lu",
( unsigned long ) length ) );
return shouldContinueParse;
}