in source/sigv4.c [2707:2803]
static SigV4Status_t generateCanonicalRequestUntilHeaders( const SigV4Parameters_t * pParams,
CanonicalContext_t * pCanonicalContext,
char ** pSignedHeaders,
size_t * pSignedHeadersLen )
{
SigV4Status_t returnStatus = SigV4Success;
const char * pPath = NULL;
size_t pathLen = 0U;
bool doubleEncodeEqualsInParmsValues = true;
/* In presigned URL we do not want to double-encode any equals ( = ) characters in parameter values */
if( FLAG_IS_SET( pParams->pHttpParameters->flags, SIGV4_HTTP_IS_PRESIGNED_URL ) )
{
doubleEncodeEqualsInParmsValues = false;
}
/* Set defaults for path and algorithm. */
if( ( pParams->pHttpParameters->pPath == NULL ) ||
( pParams->pHttpParameters->pathLen == 0U ) )
{
/* If the absolute path is empty, use a forward slash (/). */
pPath = HTTP_EMPTY_PATH;
pathLen = HTTP_EMPTY_PATH_LEN;
}
else
{
pPath = pParams->pHttpParameters->pPath;
pathLen = pParams->pHttpParameters->pathLen;
}
pCanonicalContext->uxCursorIndex = 0;
pCanonicalContext->bufRemaining = SIGV4_PROCESSING_BUFFER_LENGTH;
/* Write the HTTP Request Method to the canonical request. */
returnStatus = writeLineToCanonicalRequest( pParams->pHttpParameters->pHttpMethod,
pParams->pHttpParameters->httpMethodLen,
pCanonicalContext );
if( returnStatus == SigV4Success )
{
/* Write the URI to the canonical request. */
if( FLAG_IS_SET( pParams->pHttpParameters->flags, SIGV4_HTTP_PATH_IS_CANONICAL_FLAG ) )
{
/* URI is already canonicalized, so just write it to the buffer as is. */
returnStatus = writeLineToCanonicalRequest( pPath,
pathLen,
pCanonicalContext );
}
else if( ( pParams->serviceLen == S3_SERVICE_NAME_LEN ) &&
( strncmp( pParams->pService, S3_SERVICE_NAME, S3_SERVICE_NAME_LEN ) == 0 ) )
{
/* S3 is the only service in which the URI must only be encoded once. */
returnStatus = generateCanonicalURI( pPath, pathLen,
false /* Do not encode twice. */,
pCanonicalContext );
}
else
{
returnStatus = generateCanonicalURI( pPath, pathLen,
true /* Encode twice */,
pCanonicalContext );
}
}
if( returnStatus == SigV4Success )
{
/* Write the query to the canonical request. */
if( FLAG_IS_SET( pParams->pHttpParameters->flags, SIGV4_HTTP_QUERY_IS_CANONICAL_FLAG ) &&
( pParams->pHttpParameters->pQuery != NULL ) )
{
/* HTTP query is already canonicalized, so just write it to the buffer as is. */
returnStatus = writeLineToCanonicalRequest( pParams->pHttpParameters->pQuery,
pParams->pHttpParameters->queryLen,
pCanonicalContext );
}
else
{
returnStatus = generateCanonicalQuery( pParams->pHttpParameters->pQuery,
pParams->pHttpParameters->queryLen,
doubleEncodeEqualsInParmsValues,
pCanonicalContext );
}
}
if( returnStatus == SigV4Success )
{
/* Canonicalize original HTTP headers before writing to buffer. */
returnStatus = generateCanonicalAndSignedHeaders( pParams->pHttpParameters->pHeaders,
pParams->pHttpParameters->headersLen,
pParams->pHttpParameters->flags,
pCanonicalContext,
pSignedHeaders,
pSignedHeadersLen );
}
return returnStatus;
}