use crate::client::orchestrator::{HttpRequest, HttpResponse};
use crate::client::result::ConnectorError;
use crate::client::runtime_components::sealed::ValidateConfig;
use crate::client::runtime_components::RuntimeComponents;
use crate::impl_shared_conversions;
use std::fmt;
use std::sync::Arc;
use std::time::Duration;
pub mod request {
use aws_smithy_types::body::SdkBody;
#[deprecated(note = "This type has moved to `aws_smithy_runtime_api::http::HttpError`.")]
pub type HttpError = crate::http::HttpError;
#[deprecated(note = "This type has moved to `aws_smithy_runtime_api::http::HeaderValue`.")]
pub type HeaderValue = crate::http::HeaderValue;
#[deprecated(note = "This type has moved to `aws_smithy_runtime_api::http::Headers`.")]
pub type Headers = crate::http::Headers;
#[deprecated(note = "This type has moved to `aws_smithy_runtime_api::http::HeadersIter`.")]
pub type HeadersIter<'a> = crate::http::HeadersIter<'a>;
#[deprecated(note = "This type has moved to `aws_smithy_runtime_api::http::Request`.")]
pub type Request<B = SdkBody> = crate::http::Request<B>;
}
new_type_future! {
#[doc = "Future for [`HttpConnector::call`]."]
pub struct HttpConnectorFuture<'static, HttpResponse, ConnectorError>;
}
pub trait HttpConnector: Send + Sync + fmt::Debug {
fn call(&self, request: HttpRequest) -> HttpConnectorFuture;
}
#[derive(Clone, Debug)]
pub struct SharedHttpConnector(Arc<dyn HttpConnector>);
impl SharedHttpConnector {
pub fn new(connection: impl HttpConnector + 'static) -> Self {
Self(Arc::new(connection))
}
}
impl HttpConnector for SharedHttpConnector {
fn call(&self, request: HttpRequest) -> HttpConnectorFuture {
(*self.0).call(request)
}
}
impl_shared_conversions!(convert SharedHttpConnector from HttpConnector using SharedHttpConnector::new);
pub fn http_client_fn<F>(connector: F) -> SharedHttpClient
where
F: Fn(&HttpConnectorSettings, &RuntimeComponents) -> SharedHttpConnector
+ Send
+ Sync
+ 'static,
{
struct ConnectorFn<T>(T);
impl<T> fmt::Debug for ConnectorFn<T> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.write_str("ConnectorFn")
}
}
impl<T> HttpClient for ConnectorFn<T>
where
T: (Fn(&HttpConnectorSettings, &RuntimeComponents) -> SharedHttpConnector) + Send + Sync,
{
fn http_connector(
&self,
settings: &HttpConnectorSettings,
components: &RuntimeComponents,
) -> SharedHttpConnector {
(self.0)(settings, components)
}
}
SharedHttpClient::new(ConnectorFn(connector))
}
pub trait HttpClient: Send + Sync + fmt::Debug {
fn http_connector(
&self,
settings: &HttpConnectorSettings,
components: &RuntimeComponents,
) -> SharedHttpConnector;
}
#[derive(Clone, Debug)]
pub struct SharedHttpClient {
selector: Arc<dyn HttpClient>,
}
impl SharedHttpClient {
pub fn new(selector: impl HttpClient + 'static) -> Self {
Self {
selector: Arc::new(selector),
}
}
}
impl HttpClient for SharedHttpClient {
fn http_connector(
&self,
settings: &HttpConnectorSettings,
components: &RuntimeComponents,
) -> SharedHttpConnector {
self.selector.http_connector(settings, components)
}
}
impl ValidateConfig for SharedHttpClient {}
impl_shared_conversions!(convert SharedHttpClient from HttpClient using SharedHttpClient::new);
#[non_exhaustive]
#[derive(Default, Debug)]
pub struct HttpConnectorSettingsBuilder {
connect_timeout: Option<Duration>,
read_timeout: Option<Duration>,
}
impl HttpConnectorSettingsBuilder {
pub fn new() -> Self {
Default::default()
}
pub fn connect_timeout(mut self, connect_timeout: Duration) -> Self {
self.connect_timeout = Some(connect_timeout);
self
}
pub fn set_connect_timeout(&mut self, connect_timeout: Option<Duration>) -> &mut Self {
self.connect_timeout = connect_timeout;
self
}
pub fn read_timeout(mut self, read_timeout: Duration) -> Self {
self.read_timeout = Some(read_timeout);
self
}
pub fn set_read_timeout(&mut self, read_timeout: Option<Duration>) -> &mut Self {
self.read_timeout = read_timeout;
self
}
pub fn build(self) -> HttpConnectorSettings {
HttpConnectorSettings {
connect_timeout: self.connect_timeout,
read_timeout: self.read_timeout,
}
}
}
#[non_exhaustive]
#[derive(Clone, Default, Debug)]
pub struct HttpConnectorSettings {
connect_timeout: Option<Duration>,
read_timeout: Option<Duration>,
}
impl HttpConnectorSettings {
pub fn builder() -> HttpConnectorSettingsBuilder {
Default::default()
}
pub fn connect_timeout(&self) -> Option<Duration> {
self.connect_timeout
}
pub fn read_timeout(&self) -> Option<Duration> {
self.read_timeout
}
}
#[cfg(test)]
mod test {
#[test]
#[allow(deprecated)]
fn re_export_has_default_generic() {
let req1 = super::request::Request::empty();
let req2 = super::request::Request::<()>::new(());
fn takes_req(_req: &super::request::Request) {}
fn takes_generic_req<B>(_req: &super::request::Request<B>) {}
takes_req(&req1);
takes_generic_req(&req1);
takes_generic_req(&req2);
}
}