samotop_with_native_tls/
lib.rs1use async_native_tls::TlsAcceptor;
2use async_native_tls::TlsConnector;
3use samotop_core::io::tls::TlsProvider;
4use samotop_core::io::tls::TlsUpgrade;
5use samotop_core::{common::*, io::tls::Io};
6use std::fmt;
7
8pub struct NativeTlsProvider<T> {
9 inner: Arc<T>,
10}
11
12impl<T> Clone for NativeTlsProvider<T> {
13 fn clone(&self) -> Self {
14 NativeTlsProvider {
15 inner: self.inner.clone(),
16 }
17 }
18}
19
20impl From<TlsAcceptor> for NativeTlsProvider<TlsAcceptor> {
21 fn from(acceptor: TlsAcceptor) -> Self {
22 NativeTlsProvider {
23 inner: Arc::new(acceptor),
24 }
25 }
26}
27impl From<TlsConnector> for NativeTlsProvider<TlsConnector> {
28 fn from(connector: TlsConnector) -> Self {
29 NativeTlsProvider {
30 inner: Arc::new(connector),
31 }
32 }
33}
34
35impl TlsUpgrade for NativeTlsProvider<TlsAcceptor> {
36 fn upgrade_to_tls(
37 &self,
38 io: Box<dyn Io>,
39 _name: String,
40 ) -> S3Fut<std::io::Result<Box<dyn Io>>> {
41 let acceptor = self.inner.clone();
42 let fut = async move {
43 match acceptor.accept(io).await {
44 Ok(encrypted) => {
45 let encrypted: Box<dyn Io> = Box::new(encrypted);
57 Ok(encrypted)
58 }
59 Err(e) => Err(std::io::Error::new(
60 std::io::ErrorKind::BrokenPipe,
61 format!("Failed to get TLS - {}", e),
62 )),
63 }
64 };
65 Box::pin(fut)
66 }
67}
68
69impl TlsProvider for NativeTlsProvider<TlsAcceptor> {
70 fn get_tls_upgrade(&self) -> Option<Box<dyn TlsUpgrade>> {
71 Some(Box::new(self.clone()))
72 }
73}
74
75impl fmt::Debug for NativeTlsProvider<TlsAcceptor> {
76 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
77 f.debug_struct("NativeTlsProvider<TlsAcceptor>").finish()
78 }
79}
80
81impl TlsProvider for NativeTlsProvider<TlsConnector> {
82 fn get_tls_upgrade(&self) -> Option<Box<dyn TlsUpgrade>> {
83 Some(Box::new(NativeTlsProvider::clone(self)))
84 }
85}
86
87impl TlsUpgrade for NativeTlsProvider<TlsConnector> {
88 fn upgrade_to_tls(
89 &self,
90 stream: Box<dyn Io>,
91 name: String,
92 ) -> S3Fut<std::io::Result<Box<dyn Io>>> {
93 let connector = self.inner.clone();
94 Box::pin(async move {
95 match connector.connect(name, stream).await {
96 Ok(s) => {
97 let s: Box<dyn Io> = Box::new(s);
98 Ok(s)
99 }
100 Err(e) => Err(std::io::Error::new(std::io::ErrorKind::BrokenPipe, e)),
101 }
102 })
103 }
104}
105
106impl fmt::Debug for NativeTlsProvider<TlsConnector> {
107 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
108 f.debug_struct("NativeTlsProvider<TlsAcceptor>").finish()
109 }
110}