Expand description
§One TLS API to rule them all
Support both:
tokio
async-std
and four TLS implementations:
tls-api-openssl
, wrapsopenssl
cratetls-api-rustls
, wrapsrustls
cratetls-api-native-tls
, wrapsnative-tls
cratetls-api-security-framework
, wrapssecurity-framework
crate
The idea is that code can be written without the knowledge of the TLS implementation used, like this:
use tls_api_2::{TlsConnector, TlsConnectorBuilder};
// or async_std::net::TcpStream;
use tokio::net::TcpStream;
async fn download_rust_lang_org<C: TlsConnector>() -> anyhow::Result<Vec<u8>> {
let stream = TcpStream::connect(("rust-lang.org", 443)).await?;
let mut stream = C::builder()?.build()?.connect("rust-lang.org", stream).await?;
stream.write_all(b"GET / HTTP/1.1\r\nHost: rust-lang.org\r\n\r\n").await?;
let mut buf = Vec::new();
stream.read_to_end(&mut buf).await?;
Ok(buf)
}
or the same code with dynamic connector:
use tls_api_2::TlsConnectorType;
// or async_std::net::TcpStream;
use tokio::net::TcpStream;
async fn download_rust_lang_org(connector_type: &dyn TlsConnectorType) -> anyhow::Result<Vec<u8>> {
let stream = TcpStream::connect(("rust-lang.org", 443)).await?;
let mut stream = connector_type.builder()?.build()?.connect("rust-lang.org", stream).await?;
stream.write_all(b"GET / HTTP/1.1\r\nHost: rust-lang.org\r\n\r\n").await?;
let mut buf = Vec::new();
stream.read_to_end(&mut buf).await?;
Ok(buf)
}
Have a look at working example invoking all implementation on GitHub.
There are also two fake implementations:
tls-api-stub
crate which returns an error on any operations, useful to check code compilestls-api-no-tls
fake implementation which returns plain sockets without TLS
The API is provided to be compatible with both tokio and async-std. Crate features:
runtime-tokio
enables the implementation over tokioruntime-async-std
enables the implementation over async-std
Currently the features are mutually exclusive.
Modules§
- async_
as_ sync - Utility used in different implementations of TLS API.
- runtime
- Tokio or async-std type reexports.
- spi
- Interfaces needed by API implementor (like
tls-api-rustls
), and not needed by the users of API.
Macros§
- spi_
acceptor_ common - Common part of all connectors. Poor man replacement for HKT.
- spi_
async_ socket_ impl_ delegate - Delegate
AsyncSocket
implementation to the underlying socket. - spi_
connector_ common - Common part of all connectors. Poor man replacement for HKT.
- spi_
tls_ stream_ over_ sync_ io_ wrapper - Implement wrapper for
TlsStreamOverSyncIo
.
Structs§
- Async
Socket Box - Newtype for
Box<dyn AsyncSocket>
. - BoxFuture
- Newtype for
Pin<Box<Future>>
for simpler function signatures. - Impl
Info - Basic info about the implementation.
- TlsAcceptor
Box - Dynamic version of
TlsAcceptor
. - TlsAcceptor
Builder Box - Dynamic version of
TlsAcceptorBuilder
. - TlsConnector
Box - Configured connector. This is a dynamic version of
TlsConnector
. - TlsConnector
Builder Box TlsConnector
without type parameter.- TlsStream
- Similar to
TlsStreamWithSocket
, but without a socket type parameter. - TlsStream
With Socket - TLS stream object returned by
connect_with_socket
andaccept_with_socket
operations.
Traits§
- Async
Socket - Type alias for necessary socket async traits.
- TlsAcceptor
- A builder for server-side TLS connections.
- TlsAcceptor
Builder - A builder for
TlsAcceptor
s. - TlsAcceptor
Type - Similar to
TlsAcceptor
, but it is dynamic, does not require type parameter. - TlsConnector
- A builder for client-side TLS connections.
- TlsConnector
Builder - A builder for
TlsConnector
s. - TlsConnector
Type - Similar to
TlsConnector
, but it is dynamic, does not require type parameter. - TlsStream
Dyn - Trait implemented by all
TlsStream
objects. - TlsStream
With Socket Dyn - Get the underlying socket.