diff --git a/Cargo.toml b/Cargo.toml index 7949f68..30dcc52 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -41,6 +41,7 @@ resumable-upload = ["dep:md5", "dep:sha2", "serde/derive"] # selected at runtime with `ClientBuilder::tls_backend`. async-tls-rustls-aws-lc-rs = ["_async", "dep:hyper-rustls", "dep:rustls", "dep:rustls-native-certs", "dep:webpki-roots", "hyper-rustls/aws-lc-rs", "rustls/aws_lc_rs"] async-tls-rustls-ring = ["_async", "dep:hyper-rustls", "dep:rustls", "dep:rustls-native-certs", "dep:webpki-roots", "hyper-rustls/ring", "rustls/ring"] +async-tls-rustls-no-provider = ["_async", "dep:hyper-rustls", "dep:rustls", "dep:rustls-native-certs", "dep:webpki-roots"] async-tls-native = ["_async", "dep:hyper-tls", "hyper-tls/alpn"] blocking-tls-rustls-ring = ["_blocking", "dep:rustls", "dep:rustls-native-certs", "dep:webpki-root-certs", "ureq/rustls", "ureq/platform-verifier"] blocking-tls-rustls-aws-lc-rs = ["_blocking", "dep:rustls", "dep:rustls-native-certs", "dep:webpki-root-certs", "ureq/rustls-no-provider", "ureq/rustls-webpki-roots", "ureq/platform-verifier", "rustls/aws_lc_rs"] diff --git a/src/async_client/builder.rs b/src/async_client/builder.rs index 0bcf635..ddf87c0 100644 --- a/src/async_client/builder.rs +++ b/src/async_client/builder.rs @@ -54,6 +54,7 @@ const DEFAULT_MAX_RESPONSE_BODY_BYTES: usize = 8 * 1024 * 1024; doc(cfg(any( feature = "async-tls-rustls-ring", feature = "async-tls-rustls-aws-lc-rs", + feature = "async-tls-rustls-no-provider", feature = "async-tls-native" ))) )] diff --git a/src/async_client/mod.rs b/src/async_client/mod.rs index 6c2566f..8c545a1 100644 --- a/src/async_client/mod.rs +++ b/src/async_client/mod.rs @@ -36,6 +36,7 @@ use transport::TransportClient; doc(cfg(any( feature = "async-tls-rustls-ring", feature = "async-tls-rustls-aws-lc-rs", + feature = "async-tls-rustls-no-provider", feature = "async-tls-native" ))) )] diff --git a/src/async_client/request.rs b/src/async_client/request.rs index e60d21f..61b5f9b 100644 --- a/src/async_client/request.rs +++ b/src/async_client/request.rs @@ -63,6 +63,7 @@ enum ContentLengthSource { doc(cfg(any( feature = "async-tls-rustls-ring", feature = "async-tls-rustls-aws-lc-rs", + feature = "async-tls-rustls-no-provider", feature = "async-tls-native" ))) )] diff --git a/src/async_client/transport.rs b/src/async_client/transport.rs index b338d19..9ccdb7e 100644 --- a/src/async_client/transport.rs +++ b/src/async_client/transport.rs @@ -1,6 +1,7 @@ #[cfg(any( feature = "async-tls-rustls-ring", - feature = "async-tls-rustls-aws-lc-rs" + feature = "async-tls-rustls-aws-lc-rs", + feature = "async-tls-rustls-no-provider" ))] use std::sync::Arc; use std::time::Duration; @@ -9,24 +10,28 @@ use http::{Request, Response as HttpResponse}; use hyper::body::Incoming; #[cfg(any( feature = "async-tls-rustls-ring", - feature = "async-tls-rustls-aws-lc-rs" + feature = "async-tls-rustls-aws-lc-rs", + feature = "async-tls-rustls-no-provider" ))] use hyper_rustls::HttpsConnectorBuilder; #[cfg(any( feature = "async-tls-native", feature = "async-tls-rustls-ring", - feature = "async-tls-rustls-aws-lc-rs" + feature = "async-tls-rustls-aws-lc-rs", + feature = "async-tls-rustls-no-provider" ))] use hyper_util::client::legacy::Client as HyperClient; #[cfg(any( feature = "async-tls-native", feature = "async-tls-rustls-ring", - feature = "async-tls-rustls-aws-lc-rs" + feature = "async-tls-rustls-aws-lc-rs", + feature = "async-tls-rustls-no-provider" ))] use hyper_util::rt::TokioExecutor; #[cfg(any( feature = "async-tls-rustls-ring", - feature = "async-tls-rustls-aws-lc-rs" + feature = "async-tls-rustls-aws-lc-rs", + feature = "async-tls-rustls-no-provider" ))] use tracing::warn; @@ -34,7 +39,8 @@ use super::proxy::ProxyConnector; #[cfg(any( feature = "async-tls-rustls-ring", feature = "async-tls-rustls-aws-lc-rs", - feature = "async-tls-native" + feature = "async-tls-native", + feature = "async-tls-rustls-no-provider" ))] use super::transport_error::classify_transport_error; use crate::async_client::body::ReqBody; @@ -42,7 +48,8 @@ use crate::core::error::Error; #[cfg(any( feature = "async-tls-native", feature = "async-tls-rustls-ring", - feature = "async-tls-rustls-aws-lc-rs" + feature = "async-tls-rustls-aws-lc-rs", + feature = "async-tls-rustls-no-provider" ))] use crate::core::error::transport_error; use crate::core::execution::RequestExecutionState; @@ -50,20 +57,23 @@ use crate::core::util::duration_millis_ceil; #[cfg(any( feature = "async-tls-rustls-ring", feature = "async-tls-rustls-aws-lc-rs", - feature = "async-tls-native" + feature = "async-tls-native", + feature = "async-tls-rustls-no-provider" ))] use crate::tls::tls_config_error; use crate::tls::{TlsBackend, TlsOptions}; #[cfg(any( feature = "async-tls-native", feature = "async-tls-rustls-ring", - feature = "async-tls-rustls-aws-lc-rs" + feature = "async-tls-rustls-aws-lc-rs", + feature = "async-tls-rustls-no-provider" ))] use crate::tls::{TlsClientIdentity, TlsRootCertificate, TlsRootStore, TlsVersion}; #[cfg(any( feature = "async-tls-rustls-ring", feature = "async-tls-rustls-aws-lc-rs", - feature = "async-tls-native" + feature = "async-tls-native", + feature = "async-tls-rustls-no-provider" ))] use crate::tls::{parse_pem_certificate_blocks, tls_version_bounds}; @@ -80,10 +90,18 @@ const DEFAULT_TLS_BACKEND: TlsBackend = TlsBackend::RustlsAwsLcRs; feature = "async-tls-native" ))] const DEFAULT_TLS_BACKEND: TlsBackend = TlsBackend::NativeTls; +#[cfg(all( + not(feature = "async-tls-rustls-ring"), + not(feature = "async-tls-rustls-aws-lc-rs"), + not(feature = "async-tls-native"), + feature = "async-tls-rustls-no-provider" +))] +const DEFAULT_TLS_BACKEND: TlsBackend = TlsBackend::RustlsNoProvider; #[cfg(not(any( feature = "async-tls-rustls-ring", feature = "async-tls-rustls-aws-lc-rs", - feature = "async-tls-native" + feature = "async-tls-native", + feature = "async-tls-rustls-no-provider" )))] const DEFAULT_TLS_BACKEND: TlsBackend = TlsBackend::RustlsRing; @@ -93,7 +111,8 @@ pub(super) fn default_tls_backend() -> TlsBackend { #[cfg(any( feature = "async-tls-rustls-ring", - feature = "async-tls-rustls-aws-lc-rs" + feature = "async-tls-rustls-aws-lc-rs", + feature = "async-tls-rustls-no-provider" ))] fn add_custom_rustls_root_certificates( tls_backend: TlsBackend, @@ -145,7 +164,8 @@ fn add_custom_rustls_root_certificates( #[cfg(any( feature = "async-tls-rustls-ring", - feature = "async-tls-rustls-aws-lc-rs" + feature = "async-tls-rustls-aws-lc-rs", + feature = "async-tls-rustls-no-provider" ))] fn build_rustls_root_store( tls_backend: TlsBackend, @@ -214,7 +234,8 @@ fn build_rustls_root_store( #[cfg(any( feature = "async-tls-rustls-ring", - feature = "async-tls-rustls-aws-lc-rs" + feature = "async-tls-rustls-aws-lc-rs", + feature = "async-tls-rustls-no-provider" ))] pub(crate) fn configured_rustls_protocol_versions( tls_backend: TlsBackend, @@ -237,7 +258,8 @@ pub(crate) fn configured_rustls_protocol_versions( #[cfg(any( feature = "async-tls-rustls-ring", - feature = "async-tls-rustls-aws-lc-rs" + feature = "async-tls-rustls-aws-lc-rs", + feature = "async-tls-rustls-no-provider" ))] fn build_rustls_tls_config( tls_backend: TlsBackend, @@ -310,12 +332,14 @@ fn build_rustls_tls_config( #[cfg(any( feature = "async-tls-rustls-ring", - feature = "async-tls-rustls-aws-lc-rs" + feature = "async-tls-rustls-aws-lc-rs", + feature = "async-tls-rustls-no-provider" ))] type RustlsHttpsConnector = hyper_rustls::HttpsConnector; #[cfg(any( feature = "async-tls-rustls-ring", - feature = "async-tls-rustls-aws-lc-rs" + feature = "async-tls-rustls-aws-lc-rs", + feature = "async-tls-rustls-no-provider" ))] type RustlsHyperClient = HyperClient; @@ -328,7 +352,8 @@ type NativeHyperClient = HyperClient; pub(super) enum TransportClient { #[cfg(any( feature = "async-tls-rustls-ring", - feature = "async-tls-rustls-aws-lc-rs" + feature = "async-tls-rustls-aws-lc-rs", + feature = "async-tls-rustls-no-provider" ))] Rustls(RustlsHyperClient), #[cfg(feature = "async-tls-native")] @@ -343,13 +368,15 @@ impl TransportClient { #[cfg(any( feature = "async-tls-native", feature = "async-tls-rustls-ring", - feature = "async-tls-rustls-aws-lc-rs" + feature = "async-tls-rustls-aws-lc-rs", + feature = "async-tls-rustls-no-provider" ))] { match self { #[cfg(any( feature = "async-tls-rustls-ring", - feature = "async-tls-rustls-aws-lc-rs" + feature = "async-tls-rustls-aws-lc-rs", + feature = "async-tls-rustls-no-provider" ))] Self::Rustls(client) => client .request(request) @@ -365,7 +392,8 @@ impl TransportClient { #[cfg(not(any( feature = "async-tls-native", feature = "async-tls-rustls-ring", - feature = "async-tls-rustls-aws-lc-rs" + feature = "async-tls-rustls-aws-lc-rs", + feature = "async-tls-rustls-no-provider" )))] { let _ = self; @@ -381,14 +409,16 @@ pub(super) enum TransportRequestError { #[cfg(any( feature = "async-tls-rustls-ring", feature = "async-tls-rustls-aws-lc-rs", - feature = "async-tls-native" + feature = "async-tls-native", + feature = "async-tls-rustls-no-provider" ))] Transport(hyper_util::client::legacy::Error), Timeout, #[cfg(not(any( feature = "async-tls-rustls-ring", feature = "async-tls-rustls-aws-lc-rs", - feature = "async-tls-native" + feature = "async-tls-native", + feature = "async-tls-rustls-no-provider" )))] TlsBackendUnavailable { backend: &'static str, @@ -405,7 +435,8 @@ impl TransportRequestError { #[cfg(any( feature = "async-tls-rustls-ring", feature = "async-tls-rustls-aws-lc-rs", - feature = "async-tls-native" + feature = "async-tls-native", + feature = "async-tls-rustls-no-provider" ))] Self::Transport(source) => transport_error( classify_transport_error(&source), @@ -419,7 +450,8 @@ impl TransportRequestError { #[cfg(not(any( feature = "async-tls-rustls-ring", feature = "async-tls-rustls-aws-lc-rs", - feature = "async-tls-native" + feature = "async-tls-native", + feature = "async-tls-rustls-no-provider" )))] Self::TlsBackendUnavailable { backend } => Error::TlsBackendUnavailable { backend }, } @@ -428,7 +460,8 @@ impl TransportRequestError { #[cfg(any( feature = "async-tls-rustls-ring", - feature = "async-tls-rustls-aws-lc-rs" + feature = "async-tls-rustls-aws-lc-rs", + feature = "async-tls-rustls-no-provider" ))] fn build_rustls_transport( tls_config: rustls::ClientConfig, @@ -527,6 +560,48 @@ fn build_rustls_aws_lc_rs_transport( }) } +#[cfg(feature = "async-tls-rustls-no-provider")] +fn build_rustls_no_provider_transport( + connector: ProxyConnector, + tls_options: &TlsOptions, + pool_idle_timeout: Duration, + pool_max_idle_per_host: usize, + http2_only: bool, +) -> crate::Result { + let provider = rustls::crypto::CryptoProvider::get_default() + .cloned() + .ok_or_else(|| Error::TlsBackendInit { + backend: TlsBackend::RustlsNoProvider.as_str(), + message: "no rustls CryptoProvider is installed as the process-wide default; \ + install one (e.g. rustls-graviola) via \ + rustls::crypto::CryptoProvider::install_default(...) before building a client \ + with the async-tls-rustls-no-provider backend" + .to_string(), + })?; + let tls_config = build_rustls_tls_config(TlsBackend::RustlsNoProvider, provider, tls_options)?; + + Ok(build_rustls_transport( + tls_config, + connector, + pool_idle_timeout, + pool_max_idle_per_host, + http2_only, + )) +} + +#[cfg(not(feature = "async-tls-rustls-no-provider"))] +fn build_rustls_no_provider_transport( + _connector: ProxyConnector, + _tls_options: &TlsOptions, + _pool_idle_timeout: Duration, + _pool_max_idle_per_host: usize, + _http2_only: bool, +) -> crate::Result { + Err(Error::TlsBackendUnavailable { + backend: TlsBackend::RustlsNoProvider.as_str(), + }) +} + #[cfg(feature = "async-tls-native")] fn native_tls_protocol(version: TlsVersion) -> hyper_tls::native_tls::Protocol { match version { @@ -723,6 +798,13 @@ pub(super) fn build_transport_client( pool_max_idle_per_host, http2_only, ), + TlsBackend::RustlsNoProvider => build_rustls_no_provider_transport( + connector, + tls_options, + pool_idle_timeout, + pool_max_idle_per_host, + http2_only, + ), TlsBackend::NativeTls => build_native_tls_transport( connector, tls_options, diff --git a/src/blocking_client/transport.rs b/src/blocking_client/transport.rs index 8822fd8..1dc09c7 100644 --- a/src/blocking_client/transport.rs +++ b/src/blocking_client/transport.rs @@ -47,6 +47,8 @@ pub(super) fn backend_is_available(backend: TlsBackend) -> bool { TlsBackend::RustlsRing => cfg!(feature = "blocking-tls-rustls-ring"), TlsBackend::RustlsAwsLcRs => cfg!(feature = "blocking-tls-rustls-aws-lc-rs"), TlsBackend::NativeTls => cfg!(feature = "blocking-tls-native"), + // `async-tls-rustls-no-provider` has no blocking `ureq` counterpart. + TlsBackend::RustlsNoProvider => false, } } @@ -179,6 +181,13 @@ fn build_sync_tls_config( let provider = match backend { TlsBackend::RustlsRing | TlsBackend::RustlsAwsLcRs => ureq::tls::TlsProvider::Rustls, TlsBackend::NativeTls => ureq::tls::TlsProvider::NativeTls, + // Unreachable in practice: `backend_is_available` above already + // rejects `RustlsNoProvider`, which has no blocking `ureq` counterpart. + TlsBackend::RustlsNoProvider => { + return Err(crate::error::Error::TlsBackendUnavailable { + backend: backend.as_str(), + }); + } }; let mut tls_config_builder = ureq::tls::TlsConfig::builder().provider(provider); diff --git a/src/core/util/transport_error.rs b/src/core/util/transport_error.rs index fa9a096..f17b697 100644 --- a/src/core/util/transport_error.rs +++ b/src/core/util/transport_error.rs @@ -40,6 +40,7 @@ pub(crate) fn is_tls_error(error: &(dyn std::error::Error + 'static)) -> bool { #[cfg(any( feature = "async-tls-rustls-ring", feature = "async-tls-rustls-aws-lc-rs", + feature = "async-tls-rustls-no-provider", feature = "blocking-tls-rustls-ring", feature = "blocking-tls-rustls-aws-lc-rs" ))] diff --git a/src/http/response.rs b/src/http/response.rs index 87988db..6a9b41e 100644 --- a/src/http/response.rs +++ b/src/http/response.rs @@ -215,6 +215,7 @@ mod blocking_stream; doc(cfg(any( feature = "async-tls-rustls-ring", feature = "async-tls-rustls-aws-lc-rs", + feature = "async-tls-rustls-no-provider", feature = "async-tls-native" ))) )] diff --git a/src/http/response/async_stream.rs b/src/http/response/async_stream.rs index 35ae64f..d40099f 100644 --- a/src/http/response/async_stream.rs +++ b/src/http/response/async_stream.rs @@ -448,6 +448,7 @@ impl std::fmt::Debug for StreamBody { doc(cfg(any( feature = "async-tls-rustls-ring", feature = "async-tls-rustls-aws-lc-rs", + feature = "async-tls-rustls-no-provider", feature = "async-tls-native" ))) )] diff --git a/src/lib.rs b/src/lib.rs index 541e9be..d26e7c8 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -80,6 +80,8 @@ //! //! - Async + `rustls` + `ring`: `async-tls-rustls-ring` //! - Async + `rustls` + `aws-lc-rs`: `async-tls-rustls-aws-lc-rs` +//! - Async + `rustls` + a caller-installed crypto provider (e.g. the +//! pure-Rust `rustls-graviola`): `async-tls-rustls-no-provider` //! - Async + `native-tls`: `async-tls-native` //! - Blocking + `ureq` + `rustls` + `ring`: `blocking-tls-rustls-ring` //! - Blocking + `ureq` + `rustls` + `aws-lc-rs`: `blocking-tls-rustls-aws-lc-rs` @@ -132,12 +134,18 @@ //! blocks; pass private keys through the dedicated identity key parameter. //! - Blocking `native-tls` cannot merge custom root CAs into the system trust //! store; use [`TlsRootStore::Specific`] when adding explicit roots there. +//! - `async-tls-rustls-no-provider` does not select a crypto provider itself; +//! the application must install one as the process-wide rustls default +//! (e.g. `rustls::crypto::CryptoProvider::install_default(...)`) before +//! building a client. If none is installed, building a client returns +//! [`Error::TlsBackendInit`] instead of panicking. #[cfg(all( feature = "_async", not(any( feature = "async-tls-rustls-ring", feature = "async-tls-rustls-aws-lc-rs", + feature = "async-tls-rustls-no-provider", feature = "async-tls-native" )) ))] @@ -173,6 +181,7 @@ mod upload; doc(cfg(any( feature = "async-tls-rustls-ring", feature = "async-tls-rustls-aws-lc-rs", + feature = "async-tls-rustls-no-provider", feature = "async-tls-native" ))) )] @@ -185,6 +194,7 @@ pub use crate::http::response::Response; doc(cfg(any( feature = "async-tls-rustls-ring", feature = "async-tls-rustls-aws-lc-rs", + feature = "async-tls-rustls-no-provider", feature = "async-tls-native" ))) )] @@ -221,6 +231,7 @@ pub mod prelude { doc(cfg(any( feature = "async-tls-rustls-ring", feature = "async-tls-rustls-aws-lc-rs", + feature = "async-tls-rustls-no-provider", feature = "async-tls-native" ))) )] @@ -245,6 +256,7 @@ pub mod prelude { doc(cfg(any( feature = "async-tls-rustls-ring", feature = "async-tls-rustls-aws-lc-rs", + feature = "async-tls-rustls-no-provider", feature = "async-tls-native" ))) )] @@ -269,6 +281,7 @@ pub mod advanced { any( feature = "async-tls-rustls-ring", feature = "async-tls-rustls-aws-lc-rs", + feature = "async-tls-rustls-no-provider", feature = "async-tls-native" ) ))) diff --git a/src/tls.rs b/src/tls.rs index 2786223..71f2598 100644 --- a/src/tls.rs +++ b/src/tls.rs @@ -5,6 +5,7 @@ use std::fmt; feature = "async-tls-native", feature = "async-tls-rustls-ring", feature = "async-tls-rustls-aws-lc-rs", + feature = "async-tls-rustls-no-provider", feature = "blocking-tls-native", feature = "blocking-tls-rustls-ring", feature = "blocking-tls-rustls-aws-lc-rs" @@ -19,6 +20,11 @@ pub enum TlsBackend { RustlsRing, /// `rustls` backed by the `aws-lc-rs` crypto provider. RustlsAwsLcRs, + /// `rustls` backed by a crypto provider installed by the caller as the + /// process-wide default (via `rustls::crypto::CryptoProvider::install_default`), + /// e.g. the pure-Rust `rustls-graviola` provider, instead of a provider + /// hard-selected by this crate. + RustlsNoProvider, /// The platform-native TLS stack exposed by `native-tls`. NativeTls, } @@ -29,6 +35,7 @@ impl TlsBackend { match self { Self::RustlsRing => "rustls-ring", Self::RustlsAwsLcRs => "rustls-aws-lc-rs", + Self::RustlsNoProvider => "rustls-no-provider", Self::NativeTls => "native-tls", } } @@ -159,6 +166,7 @@ impl fmt::Debug for TlsOptions { feature = "async-tls-native", feature = "async-tls-rustls-ring", feature = "async-tls-rustls-aws-lc-rs", + feature = "async-tls-rustls-no-provider", feature = "blocking-tls-native", feature = "blocking-tls-rustls-ring", feature = "blocking-tls-rustls-aws-lc-rs" @@ -170,7 +178,8 @@ pub(crate) struct TlsVersionBounds { #[cfg(any( feature = "async-tls-rustls-ring", - feature = "async-tls-rustls-aws-lc-rs" + feature = "async-tls-rustls-aws-lc-rs", + feature = "async-tls-rustls-no-provider" ))] impl TlsVersionBounds { pub(crate) fn contains(self, version: TlsVersion) -> bool { @@ -183,6 +192,7 @@ impl TlsVersionBounds { feature = "async-tls-native", feature = "async-tls-rustls-ring", feature = "async-tls-rustls-aws-lc-rs", + feature = "async-tls-rustls-no-provider", feature = "blocking-tls-native", feature = "blocking-tls-rustls-ring", feature = "blocking-tls-rustls-aws-lc-rs" @@ -215,6 +225,7 @@ pub(crate) fn tls_version_bounds( feature = "async-tls-native", feature = "async-tls-rustls-ring", feature = "async-tls-rustls-aws-lc-rs", + feature = "async-tls-rustls-no-provider", feature = "blocking-tls-native", feature = "blocking-tls-rustls-ring", feature = "blocking-tls-rustls-aws-lc-rs" @@ -231,6 +242,7 @@ pub(crate) fn tls_config_error(backend: TlsBackend, message: impl Into) feature = "async-tls-native", feature = "async-tls-rustls-ring", feature = "async-tls-rustls-aws-lc-rs", + feature = "async-tls-rustls-no-provider", feature = "blocking-tls-native", feature = "blocking-tls-rustls-ring", feature = "blocking-tls-rustls-aws-lc-rs" @@ -249,6 +261,7 @@ fn find_subslice(haystack: &[u8], needle: &[u8]) -> Option { feature = "async-tls-native", feature = "async-tls-rustls-ring", feature = "async-tls-rustls-aws-lc-rs", + feature = "async-tls-rustls-no-provider", feature = "blocking-tls-native", feature = "blocking-tls-rustls-ring", feature = "blocking-tls-rustls-aws-lc-rs" @@ -262,6 +275,7 @@ fn contains_pem_marker(haystack: &[u8], marker: &[u8]) -> bool { feature = "async-tls-native", feature = "async-tls-rustls-ring", feature = "async-tls-rustls-aws-lc-rs", + feature = "async-tls-rustls-no-provider", feature = "blocking-tls-native", feature = "blocking-tls-rustls-ring", feature = "blocking-tls-rustls-aws-lc-rs" @@ -275,6 +289,7 @@ fn is_pem_outer_padding(value: &[u8]) -> bool { feature = "async-tls-native", feature = "async-tls-rustls-ring", feature = "async-tls-rustls-aws-lc-rs", + feature = "async-tls-rustls-no-provider", feature = "blocking-tls-native", feature = "blocking-tls-rustls-ring", feature = "blocking-tls-rustls-aws-lc-rs" diff --git a/src/upload/asynchronous.rs b/src/upload/asynchronous.rs index 8aaa291..6878ffa 100644 --- a/src/upload/asynchronous.rs +++ b/src/upload/asynchronous.rs @@ -13,6 +13,7 @@ use super::{ doc(cfg(any( feature = "async-tls-rustls-ring", feature = "async-tls-rustls-aws-lc-rs", + feature = "async-tls-rustls-no-provider", feature = "async-tls-native" ))) )] diff --git a/src/upload/mod.rs b/src/upload/mod.rs index f9c0857..6865e75 100644 --- a/src/upload/mod.rs +++ b/src/upload/mod.rs @@ -651,6 +651,7 @@ pub trait BlockingResumableUploadBackend { doc(cfg(any( feature = "async-tls-rustls-ring", feature = "async-tls-rustls-aws-lc-rs", + feature = "async-tls-rustls-no-provider", feature = "async-tls-native" ))) )]