#async-io #tokio #tokio-rustls #read-write #server-client #duplex #require

rustls-tokio-stream

在 Tokio 上为 rustls 提供的 AsyncRead/AsyncWrite 接口

27 个版本

0.3.0 2024 年 7 月 12 日
0.2.24 2024 年 5 月 10 日
0.2.20 2024 年 1 月 16 日
0.2.16 2023 年 11 月 15 日
0.1.0 2023 年 5 月 11 日

#156网络编程

Download history 3772/week @ 2024-04-23 3452/week @ 2024-04-30 4972/week @ 2024-05-07 4665/week @ 2024-05-14 4720/week @ 2024-05-21 2785/week @ 2024-05-28 2481/week @ 2024-06-04 2766/week @ 2024-06-11 3958/week @ 2024-06-18 2450/week @ 2024-06-25 2911/week @ 2024-07-02 3121/week @ 2024-07-09 2332/week @ 2024-07-16 2427/week @ 2024-07-23 2566/week @ 2024-07-30 1824/week @ 2024-08-06

9,691 每月下载量
用于 28 个 Crates(直接使用 3 个)

MIT 许可证

125KB
3.5K SLoC

rustls-tokio-stream

rustls-tokio-stream 是一个 Rust crate,为 rustls 提供了 AsyncRead/AsyncWrite 接口。

特性

  • 通过 tokio::io::split 等其他方法支持双向 I/O
  • 不需要读写轮询来执行握手

示例

创建运行在本地的服务器和客户端

  fn server_config() -> ServerConfig {
    ServerConfig::builder()
      .with_safe_defaults()
      .with_no_client_auth()
      .with_single_cert(vec![certificate()], private_key())
      .expect("Failed to build server config")
  }

  fn client_config() -> ClientConfig {
    ClientConfig::builder()
      .with_safe_defaults()
      .with_no_client_auth()
  }

  async fn tcp_pair() -> (TcpStream, TcpStream) {
    let listener = TcpListener::bind(SocketAddr::V4(SocketAddrV4::new(Ipv4Addr::LOCALHOST, 0)))
      .await
      .unwrap();
    let port = listener.local_addr().unwrap().port();
    let server = spawn(async move { listener.accept().await.unwrap().0 });
    let client = spawn(async move {
      TcpSocket::new_v4()
        .unwrap()
        .connect(SocketAddr::V4(SocketAddrV4::new(Ipv4Addr::LOCALHOST, port)))
        .await
        .unwrap()
    });

    let (server, client) = (server.await.unwrap(), client.await.unwrap());
    (server, client)
  }

  async fn tls_pair() -> (TlsStream, TlsStream) {
    let (server, client) = tcp_pair().await;
    let server = TlsStream::new_server_side(server, server_config().into());
    let client = TlsStream::new_client_side(
      client,
      client_config().into(),
      "example.com".try_into().unwrap(),
    );

    (server, client)
  }

依赖项

~10–19MB
~343K SLoC