in source/core_http_client.c [1779:1855]
static HTTPStatus_t sendHttpData( const TransportInterface_t * pTransport,
HTTPClient_GetCurrentTimeFunc_t getTimestampMs,
const uint8_t * pData,
size_t dataLen )
{
HTTPStatus_t returnStatus = HTTPSuccess;
const uint8_t * pIndex = pData;
int32_t bytesSent = 0;
size_t bytesRemaining = dataLen;
uint32_t lastSendTimeMs = 0U, timeSinceLastSendMs = 0U;
uint32_t retryTimeoutMs = HTTP_SEND_RETRY_TIMEOUT_MS;
assert( pTransport != NULL );
assert( pTransport->send != NULL );
assert( pData != NULL );
/* If the timestamp function was undefined by the application, then do not
* retry the transport send. */
if( getTimestampMs == getZeroTimestampMs )
{
retryTimeoutMs = 0U;
}
/* Initialize the last send time to allow retries, if 0 bytes are sent on
* the first try. */
lastSendTimeMs = getTimestampMs();
/* Loop until all data is sent. */
while( ( bytesRemaining > 0UL ) && ( returnStatus != HTTPNetworkError ) )
{
bytesSent = pTransport->send( pTransport->pNetworkContext,
pIndex,
bytesRemaining );
/* BytesSent less than zero is an error. */
if( bytesSent < 0 )
{
LogError( ( "Failed to send data: Transport send error: "
"TransportStatus=%ld", ( long int ) bytesSent ) );
returnStatus = HTTPNetworkError;
}
else if( bytesSent > 0 )
{
/* It is a bug in the application's transport send implementation if
* more bytes than expected are sent. To avoid a possible overflow
* in converting bytesRemaining from unsigned to signed, this assert
* must exist after the check for bytesSent being negative. */
assert( ( size_t ) bytesSent <= bytesRemaining );
/* Record the most recent time of successful transmission. */
lastSendTimeMs = getTimestampMs();
bytesRemaining -= ( size_t ) bytesSent;
pIndex += bytesSent;
LogDebug( ( "Sent data over the transport: "
"BytesSent=%ld, BytesRemaining=%lu, TotalBytesSent=%lu",
( long int ) bytesSent,
( unsigned long ) bytesRemaining,
( unsigned long ) ( dataLen - bytesRemaining ) ) );
}
else
{
/* No bytes were sent over the network. */
timeSinceLastSendMs = getTimestampMs() - lastSendTimeMs;
/* Check for timeout if we have been waiting to send any data over
* the network. */
if( timeSinceLastSendMs >= retryTimeoutMs )
{
LogError( ( "Unable to send packet: Timed out in transport send." ) );
returnStatus = HTTPNetworkError;
}
}
}
return returnStatus;
}