Чтение из TlsStream <TcpStream>с использованием `tokio-rustls` в Rust - PullRequest
0 голосов
/ 23 апреля 2020

Я использую rustls и хочу прочитать TlsStream в буфер, аналогично, мы читаем TcpStream. Вот что я делаю:

let acceptor = TlsAcceptor::from(Arc::new(config));

let fut = async {

    let mut listener = TcpListener::bind(&addr).await?;

    loop {

        let (stream, peer_addr) = listener.accept().await?;
        let acceptor = acceptor.clone();

        let fut = async move {

            let mut stream = acceptor.accept(stream).await?;

            //// CURRENTLY THIS .read() is throwing error in compiler
            println!("Stream: {:?}", stream.read(&mut [0; 1024]));

            Ok(()) as io::Result<()>
        };

        handle.spawn(fut.unwrap_or_else(|err| eprintln!("{:?}", err)));
    }
};

Выдает ошибку

'error[E0599]: no method named `read` found for struct `tokio_rustls::server::TlsStream<tokio::net::tcp::stream::TcpStream>` in the current scope'

Я хочу прочитать из TlsStream, созданного с использованием tokio-rustls для буферизации.

1 Ответ

1 голос
/ 23 апреля 2020

Как описано в вашем сообщении об ошибке, есть черта AsyncReadExt, которая реализована для типа, но не импортирована в область видимости. Чтобы использовать метод этой черты read, необходимо импортировать черту; для этой черты это обычно делается путем импорта прелюдии tokio :

use tokio::prelude::*;

// or you can explicitly import just AsyncReadExt, but I'd recommend the above
use tokio::io::AsyncReadExt;

Кроме того, вам нужно специально await результат из read(), так как он возвращает будущее. Вам также необходимо использовать буфер в отдельной переменной, поскольку именно там хранятся считанные данные.

let mut buffer = [0; 1024];
let byte_count = stream.read(&mut buffer).await;
//                                       ^^^^^^
println!("Stream: {:?}", &buffer[0..byte_count]);
...