in src/http_proxy_io.c [51:203]
static CONCRETE_IO_HANDLE http_proxy_io_create(void* io_create_parameters)
{
HTTP_PROXY_IO_INSTANCE* result;
if (io_create_parameters == NULL)
{
/* Codes_SRS_HTTP_PROXY_IO_01_002: [ If io_create_parameters is NULL, http_proxy_io_create shall fail and return NULL. ]*/
result = NULL;
LogError("NULL io_create_parameters.");
}
else
{
/* Codes_SRS_HTTP_PROXY_IO_01_003: [ io_create_parameters shall be used as an HTTP_PROXY_IO_CONFIG*. ]*/
HTTP_PROXY_IO_CONFIG* http_proxy_io_config = (HTTP_PROXY_IO_CONFIG*)io_create_parameters;
if ((http_proxy_io_config->hostname == NULL) ||
(http_proxy_io_config->proxy_hostname == NULL))
{
/* Codes_SRS_HTTP_PROXY_IO_01_004: [ If the hostname or proxy_hostname member is NULL, then http_proxy_io_create shall fail and return NULL. ]*/
result = NULL;
LogError("Bad arguments: hostname = %p, proxy_hostname = %p",
http_proxy_io_config->hostname, http_proxy_io_config->proxy_hostname);
}
/* Codes_SRS_HTTP_PROXY_IO_01_095: [ If one of the fields username and password is non-NULL, then the other has to be also non-NULL, otherwise http_proxy_io_create shall fail and return NULL. ]*/
else if (((http_proxy_io_config->username == NULL) && (http_proxy_io_config->password != NULL)) ||
((http_proxy_io_config->username != NULL) && (http_proxy_io_config->password == NULL)))
{
result = NULL;
LogError("Bad arguments: username = %p, password = %p",
http_proxy_io_config->username, http_proxy_io_config->password);
}
else
{
/* Codes_SRS_HTTP_PROXY_IO_01_001: [ http_proxy_io_create shall create a new instance of the HTTP proxy IO. ]*/
result = (HTTP_PROXY_IO_INSTANCE*)calloc(1, sizeof(HTTP_PROXY_IO_INSTANCE));
if (result == NULL)
{
/* Codes_SRS_HTTP_PROXY_IO_01_051: [ If allocating memory for the new instance fails, http_proxy_io_create shall fail and return NULL. ]*/
LogError("Failed allocating HTTP proxy IO instance.");
}
else
{
/* Codes_SRS_HTTP_PROXY_IO_01_005: [ http_proxy_io_create shall copy the hostname, port, username and password values for later use when the actual CONNECT is performed. ]*/
/* Codes_SRS_HTTP_PROXY_IO_01_006: [ hostname and proxy_hostname, username and password shall be copied by calling mallocAndStrcpy_s. ]*/
if (mallocAndStrcpy_s(&result->hostname, http_proxy_io_config->hostname) != 0)
{
/* Codes_SRS_HTTP_PROXY_IO_01_007: [ If mallocAndStrcpy_s fails then http_proxy_io_create shall fail and return NULL. ]*/
LogError("Failed to copy the hostname.");
/* Codes_SRS_HTTP_PROXY_IO_01_008: [ When http_proxy_io_create fails, all allocated resources up to that point shall be freed. ]*/
free(result);
result = NULL;
}
else
{
/* Codes_SRS_HTTP_PROXY_IO_01_006: [ hostname and proxy_hostname, username and password shall be copied by calling mallocAndStrcpy_s. ]*/
if (mallocAndStrcpy_s(&result->proxy_hostname, http_proxy_io_config->proxy_hostname) != 0)
{
/* Codes_SRS_HTTP_PROXY_IO_01_007: [ If mallocAndStrcpy_s fails then http_proxy_io_create shall fail and return NULL. ]*/
LogError("Failed to copy the proxy_hostname.");
/* Codes_SRS_HTTP_PROXY_IO_01_008: [ When http_proxy_io_create fails, all allocated resources up to that point shall be freed. ]*/
free(result->hostname);
free(result);
result = NULL;
}
else
{
result->username = NULL;
result->password = NULL;
/* Codes_SRS_HTTP_PROXY_IO_01_006: [ hostname and proxy_hostname, username and password shall be copied by calling mallocAndStrcpy_s. ]*/
/* Codes_SRS_HTTP_PROXY_IO_01_094: [ username and password shall be optional. ]*/
if ((http_proxy_io_config->username != NULL) && (mallocAndStrcpy_s(&result->username, http_proxy_io_config->username) != 0))
{
/* Codes_SRS_HTTP_PROXY_IO_01_007: [ If mallocAndStrcpy_s fails then http_proxy_io_create shall fail and return NULL. ]*/
LogError("Failed to copy the username.");
/* Codes_SRS_HTTP_PROXY_IO_01_008: [ When http_proxy_io_create fails, all allocated resources up to that point shall be freed. ]*/
free(result->proxy_hostname);
free(result->hostname);
free(result);
result = NULL;
}
else
{
/* Codes_SRS_HTTP_PROXY_IO_01_006: [ hostname and proxy_hostname, username and password shall be copied by calling mallocAndStrcpy_s. ]*/
/* Codes_SRS_HTTP_PROXY_IO_01_094: [ username and password shall be optional. ]*/
if ((http_proxy_io_config->password != NULL) && (mallocAndStrcpy_s(&result->password, http_proxy_io_config->password) != 0))
{
/* Codes_SRS_HTTP_PROXY_IO_01_007: [ If mallocAndStrcpy_s fails then http_proxy_io_create shall fail and return NULL. ]*/
LogError("Failed to copy the passowrd.");
/* Codes_SRS_HTTP_PROXY_IO_01_008: [ When http_proxy_io_create fails, all allocated resources up to that point shall be freed. ]*/
free(result->username);
free(result->proxy_hostname);
free(result->hostname);
free(result);
result = NULL;
}
else
{
/* Codes_SRS_HTTP_PROXY_IO_01_010: [ - io_interface_description shall be set to the result of socketio_get_interface_description. ]*/
const IO_INTERFACE_DESCRIPTION* underlying_io_interface = socketio_get_interface_description();
if (underlying_io_interface == NULL)
{
/* Codes_SRS_HTTP_PROXY_IO_01_050: [ If socketio_get_interface_description fails, http_proxy_io_create shall fail and return NULL. ]*/
LogError("Unable to get the socket IO interface description.");
/* Codes_SRS_HTTP_PROXY_IO_01_008: [ When http_proxy_io_create fails, all allocated resources up to that point shall be freed. ]*/
free(result->password);
free(result->username);
free(result->proxy_hostname);
free(result->hostname);
free(result);
result = NULL;
}
else
{
SOCKETIO_CONFIG socket_io_config;
/* Codes_SRS_HTTP_PROXY_IO_01_011: [ - xio_create_parameters shall be set to a SOCKETIO_CONFIG* where hostname is set to the proxy_hostname member of io_create_parameters and port is set to the proxy_port member of io_create_parameters. ]*/
socket_io_config.hostname = http_proxy_io_config->proxy_hostname;
socket_io_config.port = http_proxy_io_config->proxy_port;
socket_io_config.accepted_socket = NULL;
/* Codes_SRS_HTTP_PROXY_IO_01_009: [ http_proxy_io_create shall create a new socket IO by calling xio_create with the arguments: ]*/
result->underlying_io = xio_create(underlying_io_interface, &socket_io_config);
if (result->underlying_io == NULL)
{
/* Codes_SRS_HTTP_PROXY_IO_01_012: [ If xio_create fails, http_proxy_io_create shall fail and return NULL. ]*/
LogError("Unable to create the underlying IO.");
/* Codes_SRS_HTTP_PROXY_IO_01_008: [ When http_proxy_io_create fails, all allocated resources up to that point shall be freed. ]*/
free(result->password);
free(result->username);
free(result->proxy_hostname);
free(result->hostname);
free(result);
result = NULL;
}
else
{
result->port = http_proxy_io_config->port;
result->proxy_port = http_proxy_io_config->proxy_port;
result->receive_buffer = NULL;
result->receive_buffer_size = 0;
result->http_proxy_io_state = HTTP_PROXY_IO_STATE_CLOSED;
}
}
}
}
}
}
}
}
}
return result;
}