in source/sigv4.c [1303:1370]
static SigV4Status_t generateCanonicalURI( const char * pUri,
size_t uriLen,
bool encodeTwice,
CanonicalContext_t * pCanonicalRequest )
{
SigV4Status_t returnStatus = SigV4Success;
size_t uxBufIndex;
size_t encodedLen = 0U;
assert( pUri != NULL );
assert( pCanonicalRequest != NULL );
uxBufIndex = pCanonicalRequest->uxCursorIndex;
encodedLen = pCanonicalRequest->bufRemaining;
/* If the canonical URI needs to be encoded twice, then we encode once here,
* and again at the end of the buffer. Afterwards, the second encode is copied
* to overwrite the first one. */
returnStatus = SigV4_EncodeURI( pUri, uriLen, ( char * ) &( pCanonicalRequest->pBufProcessing[ uxBufIndex ] ), &encodedLen, false, false );
if( returnStatus == SigV4Success )
{
if( encodeTwice )
{
size_t doubleEncodedLen = pCanonicalRequest->bufRemaining - encodedLen;
/* Note that the result of encoding the URI a second time must be
* written to a different position in the buffer. It should not be done
* at an overlapping position of the single-encoded URI. Once written,
* the double-encoded URI is moved to the starting location of the single-encoded URI. */
returnStatus = SigV4_EncodeURI( ( char * ) &( pCanonicalRequest->pBufProcessing[ uxBufIndex ] ),
encodedLen,
( char * ) &( pCanonicalRequest->pBufProcessing[ uxBufIndex + encodedLen ] ),
&doubleEncodedLen,
false,
false );
if( returnStatus == SigV4Success )
{
( void ) memmove( &( pCanonicalRequest->pBufProcessing[ uxBufIndex ] ), &( pCanonicalRequest->pBufProcessing[ uxBufIndex + encodedLen ] ), doubleEncodedLen );
uxBufIndex = uxBufIndex + doubleEncodedLen;
pCanonicalRequest->bufRemaining -= doubleEncodedLen;
}
}
else
{
uxBufIndex = uxBufIndex + encodedLen;
pCanonicalRequest->bufRemaining -= encodedLen;
}
}
if( returnStatus == SigV4Success )
{
if( pCanonicalRequest->bufRemaining < 1U )
{
returnStatus = SigV4InsufficientMemory;
LOG_INSUFFICIENT_MEMORY_ERROR( "write newline character after canonical URI", 1U );
}
else
{
( ( char * ) ( pCanonicalRequest->pBufProcessing ) )[ uxBufIndex ] = LINEFEED_CHAR;
pCanonicalRequest->uxCursorIndex = uxBufIndex + 1U;
pCanonicalRequest->bufRemaining -= 1U;
}
}
return returnStatus;
}