in iothub_client/src/iothubtransport_mqtt_common.c [3732:3908]
IOTHUB_CLIENT_RESULT IoTHubTransport_MQTT_Common_SetOption(TRANSPORT_LL_HANDLE handle, const char* option, const void* value)
{
IOTHUB_CLIENT_RESULT result;
if (
(handle == NULL) ||
(option == NULL) ||
(value == NULL)
)
{
result = IOTHUB_CLIENT_INVALID_ARG;
LogError("invalid parameter (NULL) passed to IoTHubTransport_MQTT_Common_SetOption.");
}
else
{
MQTTTRANSPORT_HANDLE_DATA* transport_data = (MQTTTRANSPORT_HANDLE_DATA*)handle;
IOTHUB_CREDENTIAL_TYPE cred_type = IoTHubClient_Auth_Get_Credential_Type(transport_data->authorization_module);
if (strcmp(OPTION_LOG_TRACE, option) == 0)
{
transport_data->log_trace = *((bool*)value);
mqtt_client_set_trace(transport_data->mqttClient, transport_data->log_trace, transport_data->raw_trace);
result = IOTHUB_CLIENT_OK;
}
else if (strcmp("rawlogtrace", option) == 0)
{
transport_data->raw_trace = *((bool*)value);
mqtt_client_set_trace(transport_data->mqttClient, transport_data->log_trace, transport_data->raw_trace);
result = IOTHUB_CLIENT_OK;
}
else if (strcmp(OPTION_AUTO_URL_ENCODE_DECODE, option) == 0)
{
transport_data->auto_url_encode_decode = *((bool*)value);
result = IOTHUB_CLIENT_OK;
}
else if (strcmp(OPTION_CONNECTION_TIMEOUT, option) == 0)
{
int* connection_time = (int*)value;
if (*connection_time != transport_data->connect_timeout_in_sec)
{
transport_data->connect_timeout_in_sec = (uint16_t)(*connection_time);
}
result = IOTHUB_CLIENT_OK;
}
else if (strcmp(OPTION_KEEP_ALIVE, option) == 0)
{
int* keepAliveOption = (int*)value;
if (*keepAliveOption != transport_data->keepAliveValue)
{
transport_data->keepAliveValue = (uint16_t)(*keepAliveOption);
if (transport_data->mqttClientStatus != MQTT_CLIENT_STATUS_NOT_CONNECTED)
{
DisconnectFromClient(transport_data);
}
}
result = IOTHUB_CLIENT_OK;
}
else if ((strcmp(OPTION_X509_CERT, option) == 0) && (cred_type != IOTHUB_CREDENTIAL_TYPE_X509 && cred_type != IOTHUB_CREDENTIAL_TYPE_UNKNOWN))
{
LogError("x509certificate specified, but authentication method is not x509");
result = IOTHUB_CLIENT_INVALID_ARG;
}
else if ((strcmp(OPTION_X509_PRIVATE_KEY, option) == 0) && (cred_type != IOTHUB_CREDENTIAL_TYPE_X509 && cred_type != IOTHUB_CREDENTIAL_TYPE_UNKNOWN))
{
LogError("x509privatekey specified, but authentication method is not x509");
result = IOTHUB_CLIENT_INVALID_ARG;
}
else if (strcmp(OPTION_RETRY_INTERVAL_SEC, option) == 0)
{
if (retry_control_set_option(transport_data->retry_control_handle, RETRY_CONTROL_OPTION_INITIAL_WAIT_TIME_IN_SECS, value) != 0)
{
LogError("Failure setting retry interval option");
result = IOTHUB_CLIENT_ERROR;
}
else
{
result = IOTHUB_CLIENT_OK;
}
}
else if (strcmp(OPTION_RETRY_MAX_DELAY_SECS, option) == 0)
{
if (retry_control_set_option(transport_data->retry_control_handle, RETRY_CONTROL_OPTION_MAX_DELAY_IN_SECS, value) != 0)
{
LogError("Failure setting retry max delay option");
result = IOTHUB_CLIENT_ERROR;
}
else
{
result = IOTHUB_CLIENT_OK;
}
}
else if (strcmp(OPTION_HTTP_PROXY, option) == 0)
{
HTTP_PROXY_OPTIONS* proxy_options = (HTTP_PROXY_OPTIONS*)value;
if (transport_data->xioTransport != NULL)
{
LogError("Cannot set proxy option once the underlying IO is created");
result = IOTHUB_CLIENT_ERROR;
}
else if (proxy_options->host_address == NULL)
{
LogError("NULL host_address in proxy options");
result = IOTHUB_CLIENT_INVALID_ARG;
}
else if (((proxy_options->username == NULL) || (proxy_options->password == NULL)) &&
(proxy_options->username != proxy_options->password))
{
LogError("Only one of username and password for proxy settings was NULL");
result = IOTHUB_CLIENT_INVALID_ARG;
}
else
{
char* copied_proxy_hostname = NULL;
char* copied_proxy_username = NULL;
char* copied_proxy_password = NULL;
transport_data->http_proxy_port = proxy_options->port;
if (mallocAndStrcpy_s(&copied_proxy_hostname, proxy_options->host_address) != 0)
{
LogError("Cannot copy HTTP proxy hostname");
result = IOTHUB_CLIENT_ERROR;
}
else if ((proxy_options->username != NULL) && (mallocAndStrcpy_s(&copied_proxy_username, proxy_options->username) != 0))
{
free(copied_proxy_hostname);
LogError("Cannot copy HTTP proxy username");
result = IOTHUB_CLIENT_ERROR;
}
else if ((proxy_options->password != NULL) && (mallocAndStrcpy_s(&copied_proxy_password, proxy_options->password) != 0))
{
if (copied_proxy_username != NULL)
{
free(copied_proxy_username);
}
free(copied_proxy_hostname);
LogError("Cannot copy HTTP proxy password");
result = IOTHUB_CLIENT_ERROR;
}
else
{
freeProxyData(transport_data);
transport_data->http_proxy_hostname = copied_proxy_hostname;
transport_data->http_proxy_username = copied_proxy_username;
transport_data->http_proxy_password = copied_proxy_password;
result = IOTHUB_CLIENT_OK;
}
}
}
else
{
if (((strcmp(OPTION_X509_CERT, option) == 0) || (strcmp(OPTION_X509_PRIVATE_KEY, option) == 0)) && (cred_type != IOTHUB_CREDENTIAL_TYPE_X509))
{
IoTHubClient_Auth_Set_x509_Type(transport_data->authorization_module, true);
}
if (CreateTransportProviderIfNecessary(transport_data) == 0)
{
if (xio_setoption(transport_data->xioTransport, option, value) == 0)
{
result = IOTHUB_CLIENT_OK;
}
else
{
result = IOTHUB_CLIENT_INVALID_ARG;
}
}
else
{
result = IOTHUB_CLIENT_ERROR;
}
}
}
return result;
}