in source/sigv4.c [1707:1775]
static SigV4Status_t generateCanonicalAndSignedHeaders( const char * pHeaders,
size_t headersLen,
uint32_t flags,
CanonicalContext_t * canonicalRequest,
char ** pSignedHeaders,
size_t * pSignedHeadersLen )
{
size_t noOfHeaders = 0;
SigV4Status_t sigV4Status = SigV4Success;
assert( pHeaders != NULL );
assert( canonicalRequest != NULL );
assert( pSignedHeaders != NULL );
assert( pSignedHeadersLen != NULL );
/* Parsing header string to extract key and value. */
sigV4Status = parseHeaderKeyValueEntries( pHeaders,
headersLen,
flags,
&noOfHeaders,
canonicalRequest );
if( sigV4Status == SigV4Success )
{
if( FLAG_IS_SET( flags, SIGV4_HTTP_HEADERS_ARE_CANONICAL_FLAG ) )
{
/* Headers are already canonicalized, so just write it to the buffer as is. */
sigV4Status = writeLineToCanonicalRequest( pHeaders,
headersLen,
canonicalRequest );
}
else
{
/* Sorting headers based on keys. */
quickSort( canonicalRequest->pHeadersLoc, noOfHeaders, sizeof( SigV4KeyValuePair_t ), cmpHeaderField );
/* If the headers are canonicalized, we will copy them directly into the buffer as they do not
* need processing, else we need to call the following function. */
sigV4Status = appendCanonicalizedHeaders( noOfHeaders, flags, canonicalRequest );
}
}
/* The \n character must be written if provided headers are not already canonicalized. */
if( ( sigV4Status == SigV4Success ) && !FLAG_IS_SET( flags, SIGV4_HTTP_HEADERS_ARE_CANONICAL_FLAG ) )
{
if( canonicalRequest->bufRemaining < 1U )
{
sigV4Status = SigV4InsufficientMemory;
LOG_INSUFFICIENT_MEMORY_ERROR( "write the newline character after canonical headers", 1U );
}
else
{
( ( char * ) ( canonicalRequest->pBufProcessing ) )[ canonicalRequest->uxCursorIndex ] = LINEFEED_CHAR;
canonicalRequest->uxCursorIndex++;
canonicalRequest->bufRemaining--;
}
}
if( sigV4Status == SigV4Success )
{
sigV4Status = appendSignedHeaders( noOfHeaders,
flags,
canonicalRequest,
pSignedHeaders,
pSignedHeadersLen );
}
return sigV4Status;
}