bool HttpClientConnection::CreateConnection()

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