Как отправить данные из Tokio TcpStream с помощью actix-web HttpResponse - PullRequest
3 голосов
/ 31 января 2020

У меня есть TcpStream , из которого мне нужно прочитать N байтов и отправить их как HttpResponse (мне все равно понадобится использовать поток позже). На данный момент я использую следующий код:

use futures::channel::mpsc;
use actix_web::HttpResponse;
use tokio::net::TcpStream;

let stream: TcpStream = ...;
let mut stream = stream.take(N);
let (mut sender, receiver) = mpsc::unbounded();

loop {
    let mut buffer = vec![0; BUFF_SIZE];
    let n = stream.read(&mut buffer).await?;
    if n > 0 {
        buffer.truncate(n);
        let data = Ok(web::Bytes::from(buffer));
        sender.send(data).await?;
    } else {
        break;
    }
}

// do more stuff with the TCP stream
let mut stream = stream.into_inner();
...


Ok(HttpResponse::Ok().streaming(receiver))

Это работает, но я хотел бы знать, можно ли его улучшить, так как я не смог найти лучшего решения, которое бы не требовало использование mpsc::channel, а также необходимость выделения новых buffer и web::Bytes для каждого чтения (помимо того, что мне нужно указать произвольное BUFF_SIZE).

...