HTTP_CLIENT_HANDLE uhttp_client_create()

in src/uhttp.c [1073:1120]


HTTP_CLIENT_HANDLE uhttp_client_create(const IO_INTERFACE_DESCRIPTION* io_interface_desc, const void* xio_param, ON_HTTP_ERROR_CALLBACK on_http_error, void* callback_ctx)
{
    HTTP_CLIENT_HANDLE_DATA* result;
    /* Codes_SRS_UHTTP_07_002: [If io_interface_desc is NULL, uhttp_client_create shall return NULL.] */
    if (io_interface_desc == NULL)
    {
        LogError("Invalid Parameter io_interface_desc is NULL");
        result = NULL;
    }
    else
    {
        result = malloc(sizeof(HTTP_CLIENT_HANDLE_DATA));
        if (result == NULL)
        {
            /* Codes_SRS_UHTTP_07_003: [If uhttp_client_create encounters any error then it shall return NULL] */
            LogError("Failure allocating http_client_handle");
        }
        else
        {
            memset(result, 0, sizeof(HTTP_CLIENT_HANDLE_DATA) );
            if ((result->data_list = singlylinkedlist_create() ) == NULL)
            {
                /* Codes_SRS_UHTTP_07_003: [If uhttp_client_create encounters any error then it shall return NULL] */
                LogError("Failure allocating data list");
                free(result);
                result = NULL;
            }
            else if ((result->xio_handle = xio_create(io_interface_desc, xio_param) ) == NULL)
            {
                /* Codes_SRS_UHTTP_07_044: [ if a failure is encountered on xio_open uhttp_client_open shall return HTTP_CLIENT_OPEN_REQUEST_FAILED. ] */
                LogError("xio create failed");
                singlylinkedlist_destroy(result->data_list);
                free(result);
                result = NULL;
            }
            else
            {
                /* Codes_SRS_UHTTP_07_001: [uhttp_client_create shall return an initialize the http client handle.] */
                result->on_error = on_http_error;
                result->error_user_ctx = callback_ctx;
                result->recv_msg.recv_state = state_initial;
                result->chunk_request = false;
                result->trace_on = false;
            }
        }
    }
    return (HTTP_CLIENT_HANDLE)result;
}