in iothub_client/src/iothubtransporthttp.c [1497:1716]
static void DoEvent(HTTPTRANSPORT_HANDLE_DATA* handleData, HTTPTRANSPORT_PERDEVICE_DATA* deviceData)
{
if (DList_IsListEmpty(deviceData->waitingToSend))
{
}
else
{
if (handleData->doBatchedTransfers)
{
if (HTTPHeaders_ReplaceHeaderNameValuePair(deviceData->eventHTTPrequestHeaders, CONTENT_TYPE, APPLICATION_VND_MICROSOFT_IOTHUB_JSON) != HTTP_HEADERS_OK)
{
LogError("unable to HTTPHeaders_ReplaceHeaderNameValuePair");
}
else
{
STRING_HANDLE payload;
switch (makePayload(deviceData, &payload))
{
case MAKE_PAYLOAD_OK:
{
BUFFER_HANDLE temp = BUFFER_new();
if (temp == NULL)
{
LogError("unable to BUFFER_new");
reversePutListBackIn(&(deviceData->eventConfirmations), deviceData->waitingToSend);
}
else
{
if (BUFFER_build(temp, (const unsigned char*)STRING_c_str(payload), STRING_length(payload)) != 0)
{
LogError("unable to BUFFER_build");
//items go back to waitingToSend
reversePutListBackIn(&(deviceData->eventConfirmations), deviceData->waitingToSend);
}
else
{
unsigned int statusCode;
if (HTTPAPIEX_SAS_ExecuteRequest(
deviceData->sasObject,
handleData->httpApiExHandle,
HTTPAPI_REQUEST_POST,
STRING_c_str(deviceData->eventHTTPrelativePath),
deviceData->eventHTTPrequestHeaders,
temp,
&statusCode,
NULL,
NULL
) != HTTPAPIEX_OK)
{
LogError("unable to HTTPAPIEX_ExecuteRequest");
//items go back to waitingToSend
reversePutListBackIn(&(deviceData->eventConfirmations), deviceData->waitingToSend);
}
else
{
if (statusCode < 300)
{
handleData->transport_callbacks.send_complete_cb(&(deviceData->eventConfirmations), IOTHUB_CLIENT_CONFIRMATION_OK, deviceData->device_transport_ctx);
}
else
{
//items go back to waitingToSend
LogError("unexpected HTTP status code (%u)", statusCode);
reversePutListBackIn(&(deviceData->eventConfirmations), deviceData->waitingToSend);
}
}
}
BUFFER_delete(temp);
}
STRING_delete(payload);
break;
}
case MAKE_PAYLOAD_FIRST_ITEM_DOES_NOT_FIT:
{
handleData->transport_callbacks.send_complete_cb(&(deviceData->eventConfirmations), IOTHUB_CLIENT_CONFIRMATION_ERROR, deviceData->device_transport_ctx); // takes care of emptying the list too
break;
}
case MAKE_PAYLOAD_ERROR:
{
LogError("unrecoverable errors while building a batch message");
break;
}
case MAKE_PAYLOAD_NO_ITEMS:
{
/*do nothing*/
break;
}
default:
{
LogError("internal error: switch's default branch reached when never intended");
break;
}
}
}
}
else
{
const unsigned char* messageContent = NULL;
size_t messageSize = 0;
size_t originalMessageSize = 0;
IOTHUB_MESSAGE_LIST* message = containingRecord(deviceData->waitingToSend->Flink, IOTHUB_MESSAGE_LIST, entry);
IOTHUBMESSAGE_CONTENT_TYPE contentType = IoTHubMessage_GetContentType(message->messageHandle);
if (!(
(((contentType == IOTHUBMESSAGE_BYTEARRAY) &&
(IoTHubMessage_GetByteArray(message->messageHandle, &messageContent, &originalMessageSize) == IOTHUB_MESSAGE_OK))
? ((void)(messageSize = originalMessageSize + MAXIMUM_PAYLOAD_OVERHEAD), 1)
: 0)
||
((contentType == IOTHUBMESSAGE_STRING) &&
((void)(messageContent = (const unsigned char*)IoTHubMessage_GetString(message->messageHandle)),
((void)(messageSize = MAXIMUM_PAYLOAD_OVERHEAD + (originalMessageSize = ((messageContent == NULL)
? 0
: strlen((const char*)messageContent))))),
messageContent != NULL)
)
))
{
LogError("unable to get the message content");
/*go on...*/
}
else
{
if (messageSize > MAXIMUM_MESSAGE_SIZE)
{
PDLIST_ENTRY head = DList_RemoveHeadList(deviceData->waitingToSend); /*actually this is the same as "actual", but now it is removed*/
DList_InsertTailList(&(deviceData->eventConfirmations), head);
handleData->transport_callbacks.send_complete_cb(&(deviceData->eventConfirmations), IOTHUB_CLIENT_CONFIRMATION_ERROR, deviceData->device_transport_ctx); // takes care of emptying the list too
}
else
{
HTTP_HEADERS_HANDLE clonedEventHTTPrequestHeaders = HTTPHeaders_Clone(deviceData->eventHTTPrequestHeaders);
if (clonedEventHTTPrequestHeaders == NULL)
{
LogError("HTTPHeaders_Clone failed");
}
else
{
if (HTTPHeaders_ReplaceHeaderNameValuePair(clonedEventHTTPrequestHeaders, CONTENT_TYPE, APPLICATION_OCTET_STREAM) != HTTP_HEADERS_OK)
{
LogError("HTTPHeaders_ReplaceHeaderNameValuePair failed");
}
else
{
// set_message_properties returning false does not necessarily mean the the function failed, it just means
// the the adding of messages should not continue and should try the next time. So you should not log if this
// returns false
if (set_message_properties(message, &messageSize, clonedEventHTTPrequestHeaders, handleData, deviceData))
{
if (set_system_properties(message, clonedEventHTTPrequestHeaders) != 0)
{
}
else
{
BUFFER_HANDLE toBeSend = BUFFER_create(messageContent, originalMessageSize);
if (toBeSend == NULL)
{
LogError("unable to BUFFER_new");
}
else
{
unsigned int statusCode = 0;
HTTPAPIEX_RESULT r;
if (deviceData->deviceSasToken != NULL)
{
if (HTTPHeaders_ReplaceHeaderNameValuePair(clonedEventHTTPrequestHeaders, IOTHUB_AUTH_HEADER_VALUE, STRING_c_str(deviceData->deviceSasToken)) != HTTP_HEADERS_OK)
{
r = HTTPAPIEX_ERROR;
LogError("Unable to replace the old SAS Token.");
}
else if ((r = HTTPAPIEX_ExecuteRequest(
handleData->httpApiExHandle, HTTPAPI_REQUEST_POST, STRING_c_str(deviceData->eventHTTPrelativePath),
clonedEventHTTPrequestHeaders, toBeSend, &statusCode, NULL, NULL)) != HTTPAPIEX_OK)
{
LogError("Unable to HTTPAPIEX_ExecuteRequest.");
}
}
else
{
if ((r = HTTPAPIEX_SAS_ExecuteRequest(deviceData->sasObject, handleData->httpApiExHandle, HTTPAPI_REQUEST_POST, STRING_c_str(deviceData->eventHTTPrelativePath),
clonedEventHTTPrequestHeaders, toBeSend, &statusCode, NULL, NULL )) != HTTPAPIEX_OK)
{
LogError("unable to HTTPAPIEX_SAS_ExecuteRequest");
}
}
if (r == HTTPAPIEX_OK)
{
if (statusCode < 300)
{
PDLIST_ENTRY justSent = DList_RemoveHeadList(deviceData->waitingToSend); /*actually this is the same as "actual", but now it is removed*/
DList_InsertTailList(&(deviceData->eventConfirmations), justSent);
handleData->transport_callbacks.send_complete_cb(&(deviceData->eventConfirmations), IOTHUB_CLIENT_CONFIRMATION_OK, deviceData->device_transport_ctx); // takes care of emptying the list too
}
else
{
LogError("unexpected HTTP status code (%u)", statusCode);
}
}
else if (r == HTTPAPIEX_RECOVERYFAILED)
{
PDLIST_ENTRY justSent = DList_RemoveHeadList(deviceData->waitingToSend); /*actually this is the same as "actual", but now it is removed*/
DList_InsertTailList(&(deviceData->eventConfirmations), justSent);
handleData->transport_callbacks.send_complete_cb(&(deviceData->eventConfirmations), IOTHUB_CLIENT_CONFIRMATION_ERROR, deviceData->device_transport_ctx); // takes care of emptying the list too
}
}
BUFFER_delete(toBeSend);
}
}
}
HTTPHeaders_Free(clonedEventHTTPrequestHeaders);
}
}
}
}
}
}