Path: blob/main/crates/wasi-tls/src/rustls.rs
1691 views
//! The `rustls` provider.12use rustls::pki_types::ServerName;3use std::io;4use std::sync::{Arc, LazyLock};56use crate::{BoxFuture, TlsProvider, TlsStream, TlsTransport};78impl crate::TlsStream for tokio_rustls::client::TlsStream<Box<dyn TlsTransport>> {}910/// The `rustls` provider.11pub struct RustlsProvider {12client_config: Arc<rustls::ClientConfig>,13}1415impl TlsProvider for RustlsProvider {16fn connect(17&self,18server_name: String,19transport: Box<dyn TlsTransport>,20) -> BoxFuture<io::Result<Box<dyn TlsStream>>> {21let client_config = Arc::clone(&self.client_config);22Box::pin(async move {23let domain = ServerName::try_from(server_name)24.map_err(|_| io::Error::other("invalid server name"))?;2526let stream = tokio_rustls::TlsConnector::from(client_config)27.connect(domain, transport)28.await?;29Ok(Box::new(stream) as Box<dyn TlsStream>)30})31}32}3334impl Default for RustlsProvider {35fn default() -> Self {36static CONFIG: LazyLock<Arc<rustls::ClientConfig>> = LazyLock::new(|| {37let roots = rustls::RootCertStore {38roots: webpki_roots::TLS_SERVER_ROOTS.into(),39};40let config = rustls::ClientConfig::builder()41.with_root_certificates(roots)42.with_no_client_auth();43Arc::new(config)44});4546Self {47client_config: Arc::clone(&CONFIG),48}49}50}515253