static void DoEvent()

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);
                    }
                }
            }
        }
    }
}