in source/http/HttpConnection.cpp [91:175]
bool HttpClientConnection::CreateConnection(
const HttpClientConnectionOptions &connectionOptions,
Allocator *allocator) noexcept
{
AWS_FATAL_ASSERT(connectionOptions.OnConnectionSetupCallback);
AWS_FATAL_ASSERT(connectionOptions.OnConnectionShutdownCallback);
if (connectionOptions.TlsOptions && !(*connectionOptions.TlsOptions))
{
AWS_LOGF_ERROR(
AWS_LS_HTTP_GENERAL,
"Cannot create HttpClientConnection: connectionOptions contains invalid TlsOptions.");
aws_raise_error(AWS_ERROR_INVALID_ARGUMENT);
return false;
}
if (connectionOptions.ProxyOptions)
{
const auto &proxyOpts = connectionOptions.ProxyOptions.value();
if (proxyOpts.TlsOptions && !(*proxyOpts.TlsOptions))
{
AWS_LOGF_ERROR(
AWS_LS_HTTP_GENERAL,
"Cannot create HttpClientConnection: connectionOptions has ProxyOptions that contain "
"invalid TlsOptions.");
aws_raise_error(AWS_ERROR_INVALID_ARGUMENT);
return false;
}
}
auto *callbackData = New<ConnectionCallbackData>(allocator, allocator);
if (!callbackData)
{
return false;
}
callbackData->onConnectionShutdown = connectionOptions.OnConnectionShutdownCallback;
callbackData->onConnectionSetup = connectionOptions.OnConnectionSetupCallback;
aws_http_client_connection_options options;
AWS_ZERO_STRUCT(options);
options.self_size = sizeof(aws_http_client_connection_options);
options.bootstrap = connectionOptions.Bootstrap->GetUnderlyingHandle();
if (connectionOptions.TlsOptions)
{
/* This is verified earlier in this function. */
AWS_FATAL_ASSERT(*connectionOptions.TlsOptions);
options.tls_options =
const_cast<aws_tls_connection_options *>(connectionOptions.TlsOptions->GetUnderlyingHandle());
}
options.allocator = allocator;
options.user_data = callbackData;
options.host_name = aws_byte_cursor_from_c_str(connectionOptions.HostName.c_str());
options.port = connectionOptions.Port;
options.initial_window_size = connectionOptions.InitialWindowSize;
options.socket_options = &connectionOptions.SocketOptions.GetImpl();
options.on_setup = HttpClientConnection::s_onClientConnectionSetup;
options.on_shutdown = HttpClientConnection::s_onClientConnectionShutdown;
options.manual_window_management = connectionOptions.ManualWindowManagement;
aws_http_proxy_options proxyOptions;
AWS_ZERO_STRUCT(proxyOptions);
if (connectionOptions.ProxyOptions)
{
const auto &proxyOpts = connectionOptions.ProxyOptions.value();
/* This is verified earlier in this function. */
AWS_FATAL_ASSERT(!proxyOpts.TlsOptions || *proxyOpts.TlsOptions);
proxyOpts.InitializeRawProxyOptions(proxyOptions);
options.proxy_options = &proxyOptions;
}
if (aws_http_client_connect(&options))
{
Delete(callbackData, allocator);
return false;
}
return true;
}