Skip to main content

aws_smithy_runtime/client/
http.rs

1/*
2 * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3 * SPDX-License-Identifier: Apache-2.0
4 */
5use aws_smithy_runtime_api::client::behavior_version::BehaviorVersion;
6#[cfg(feature = "default-https-client")]
7use aws_smithy_runtime_api::client::http::SharedHttpClient;
8
9/// Interceptor for connection poisoning.
10pub mod connection_poisoning;
11
12#[deprecated = "Direct HTTP test utility support from `aws-smithy-runtime` crate is deprecated. Please use the `test-util` feature from `aws-smithy-http-client` instead"]
13#[cfg(any(feature = "test-util", feature = "legacy-test-util"))]
14pub mod test_util {
15    #![allow(missing_docs)]
16
17    pub use aws_smithy_http_client::test_util::{CaptureRequestHandler, CaptureRequestReceiver};
18
19    // `capture_request` and `infallible_client_fn` re-export the pre-1.x variants, so they require
20    // `legacy-test-util`. Enabling `test-util` alone no longer pulls the http 0.2.x ecosystem in;
21    // use `aws_smithy_http_client::test_util::{capture_request, infallible_client_fn}` for the
22    // http 1.x equivalents.
23    #[cfg(feature = "legacy-test-util")]
24    pub use aws_smithy_http_client::test_util::legacy_capture_request as capture_request;
25
26    #[cfg(feature = "legacy-test-util")]
27    pub use aws_smithy_http_client::test_util::legacy_infallible::infallible_client_fn;
28
29    #[cfg(feature = "connector-hyper-0-14-x")]
30    pub mod dvr {
31        pub use aws_smithy_http_client::test_util::dvr::*;
32    }
33
34    pub use aws_smithy_http_client::test_util::{ReplayEvent, StaticReplayClient};
35
36    pub use aws_smithy_http_client::test_util::NeverClient;
37
38    #[cfg(feature = "connector-hyper-0-14-x")]
39    pub use aws_smithy_http_client::test_util::NeverTcpConnector;
40
41    #[cfg(all(feature = "connector-hyper-0-14-x", feature = "wire-mock"))]
42    #[macro_use]
43    pub mod wire {
44        pub use aws_smithy_http_client::test_util::wire::ev;
45        pub use aws_smithy_http_client::test_util::wire::match_events;
46        pub use aws_smithy_http_client::test_util::wire::matcher;
47        pub use aws_smithy_http_client::test_util::wire::*;
48    }
49}
50
51/// Default HTTP and TLS connectors that use hyper 0.14.x and rustls.
52///
53/// This module is named after the hyper version number since we anticipate
54/// needing to provide equivalent functionality for hyper 1.x in the future.
55#[cfg(feature = "connector-hyper-0-14-x")]
56#[deprecated = "hyper 0.14.x connector is deprecated, please use the `aws-smithy-http-client` crate directly instead."]
57pub mod hyper_014 {
58    #[allow(deprecated)]
59    pub use aws_smithy_http_client::hyper_014::*;
60}
61
62/// HTTP body and body-wrapper types
63pub mod body;
64
65// NOTE: We created default client options to evolve defaults over time (e.g. allow passing a different DNS resolver)
66/// Configuration options for the default HTTPS client
67#[derive(Debug, Clone)]
68pub(crate) struct DefaultClientOptions {
69    behavior_version: BehaviorVersion,
70}
71
72impl Default for DefaultClientOptions {
73    fn default() -> Self {
74        DefaultClientOptions {
75            behavior_version: BehaviorVersion::latest(),
76        }
77    }
78}
79
80impl DefaultClientOptions {
81    /// Set the behavior version to use
82    #[allow(unused)]
83    pub(crate) fn with_behavior_version(mut self, behavior_version: BehaviorVersion) -> Self {
84        self.behavior_version = behavior_version;
85        self
86    }
87}
88
89/// Creates an HTTPS client using the default TLS provider
90#[cfg(feature = "default-https-client")]
91pub(crate) fn default_https_client(options: DefaultClientOptions) -> Option<SharedHttpClient> {
92    use aws_smithy_http_client::proxy::ProxyConfig;
93    use aws_smithy_http_client::{tls, Builder, ConnectorBuilder};
94    tracing::trace!("creating a new default hyper 1.x client using rustls<aws-lc>");
95
96    let client = Builder::new().build_with_connector_fn(move |settings, runtime_components| {
97        let mut conn_builder = ConnectorBuilder::default().tls_provider(tls::Provider::Rustls(
98            tls::rustls_provider::CryptoMode::AwsLc,
99        ));
100
101        conn_builder.set_connector_settings(settings.cloned());
102        if let Some(components) = runtime_components {
103            conn_builder.set_sleep_impl(components.sleep_impl());
104        }
105
106        #[expect(deprecated)]
107        if options
108            .behavior_version
109            .is_at_least(BehaviorVersion::v2025_08_07())
110        {
111            conn_builder.set_proxy_config(Some(ProxyConfig::from_env()));
112        } else {
113            conn_builder.set_proxy_config(Some(ProxyConfig::disabled()));
114        }
115
116        conn_builder.build()
117    });
118
119    Some(client)
120}