use std::sync::{Arc, LazyLock};
pub(crate) fn install_crypto_provider() {
let _ = rustls::crypto::ring::default_provider().install_default();
}
fn tls_config() -> rustls::ClientConfig {
let roots = rustls::RootCertStore::from_iter(webpki_roots::TLS_SERVER_ROOTS.iter().cloned());
let mut config = rustls::ClientConfig::builder_with_provider(Arc::new(
rustls::crypto::ring::default_provider(),
))
.with_safe_default_protocol_versions()
.expect("ring supports the default TLS versions")
.with_root_certificates(roots)
.with_no_client_auth();
config.alpn_protocols = vec![b"http/1.1".to_vec()];
config
}
pub(crate) fn builder() -> reqwest::ClientBuilder {
reqwest::Client::builder().tls_backend_preconfigured(tls_config())
}
pub(crate) fn client() -> &'static reqwest::Client {
static CLIENT: LazyLock<reqwest::Client> =
LazyLock::new(|| builder().build().expect("failed to build HTTP client"));
&CLIENT
}
pub(crate) fn blocking_client() -> reqwest::Result<reqwest::blocking::Client> {
reqwest::blocking::Client::builder()
.tls_backend_preconfigured(tls_config())
.build()
}