vector_core/tls/
outgoing.rs

1use std::{net::SocketAddr, pin::Pin};
2
3use snafu::ResultExt;
4use tokio::net::TcpStream;
5use tokio_openssl::SslStream;
6
7use super::{
8    tls_connector, ConnectSnafu, HandshakeSnafu, MaybeTlsSettings, MaybeTlsStream, SslBuildSnafu,
9};
10
11impl MaybeTlsSettings {
12    pub async fn connect(
13        &self,
14        host: &str,
15        addr: &SocketAddr,
16    ) -> crate::tls::Result<MaybeTlsStream<TcpStream>> {
17        let stream = TcpStream::connect(addr).await.context(ConnectSnafu)?;
18
19        match self {
20            MaybeTlsSettings::Raw(()) => Ok(MaybeTlsStream::Raw(stream)),
21            MaybeTlsSettings::Tls(_) => {
22                let config = tls_connector(self)?;
23                let ssl = config.into_ssl(host).context(SslBuildSnafu)?;
24
25                let mut stream = SslStream::new(ssl, stream).context(SslBuildSnafu)?;
26                Pin::new(&mut stream)
27                    .connect()
28                    .await
29                    .context(HandshakeSnafu)?;
30
31                debug!(message = "Negotiated TLS.");
32
33                Ok(MaybeTlsStream::Tls(stream))
34            }
35        }
36    }
37}