use crate::errors::Error;
use crate::pending::PendingTlsStream;
use crate::{Certificate, Identity, Protocol};
use futures::io::{AsyncRead, AsyncReadExt, AsyncWrite};
pub struct TlsConnectorBuilder {
inner: native_tls::TlsConnectorBuilder,
}
impl TlsConnectorBuilder {
pub fn identity(&mut self, identity: Identity) -> &mut TlsConnectorBuilder {
self.inner.identity(identity);
self
}
pub fn min_protocol_version(&mut self, protocol: Option<Protocol>) -> &mut TlsConnectorBuilder {
self.inner.min_protocol_version(protocol);
self
}
pub fn max_protocol_version(&mut self, protocol: Option<Protocol>) -> &mut TlsConnectorBuilder {
self.inner.max_protocol_version(protocol);
self
}
pub fn add_root_certificate(&mut self, cert: Certificate) -> &mut TlsConnectorBuilder {
self.inner.add_root_certificate(cert);
self
}
pub fn danger_accept_invalid_certs(
&mut self,
accept_invalid_certs: bool,
) -> &mut TlsConnectorBuilder {
self.inner.danger_accept_invalid_certs(accept_invalid_certs);
self
}
pub fn use_sni(&mut self, use_sni: bool) -> &mut TlsConnectorBuilder {
self.inner.use_sni(use_sni);
self
}
pub fn danger_accept_invalid_hostnames(
&mut self,
accept_invalid_hostnames: bool,
) -> &mut TlsConnectorBuilder {
self.inner.danger_accept_invalid_hostnames(accept_invalid_hostnames);
self
}
pub fn build(&self) -> Result<TlsConnector, Error> {
let connector = self.inner.build().map_err(Error::Connector)?;
Ok(TlsConnector {
inner: connector
})
}
}
#[derive(Clone)]
pub struct TlsConnector {
inner: native_tls::TlsConnector,
}
impl TlsConnector {
pub fn new() -> Result<TlsConnector, Error> {
let native_connector = native_tls::TlsConnector::new().map_err(Error::Connector)?;
Ok( TlsConnector {
inner: native_connector,
})
}
pub fn builder() -> TlsConnectorBuilder {
TlsConnectorBuilder {
inner: native_tls::TlsConnector::builder(),
}
}
pub fn connect<'a, S>(&'a self, domain: &'a str, stream: S) -> PendingTlsStream<S>
where S: AsyncRead + AsyncWrite + Unpin,
{
PendingTlsStream::new(self.inner.connect(domain, stream.compat()))
}
}