如何发送分块 transfer-encoded 超响应?

How to send chunked transfer-encoded hyper response?

我正在尝试发送具有特定字节数和块数的超级响应。我一直不知道如何生成通用分块响应或设置 transfer-encoding header。 hyper 似乎有一个 httpWriter/chunkedWriter 现在已经贬值了。

这是我的尝试,但未设置 transfer-encoding header,我不认为这是进行分块响应的正确方法。

let chunked_body = "5\r\nhello\r\n5\r\n worl\r\n1\r\nd\r\n0\r\n\r\n";
let mut resp: hyper::Response<Body> = Response::new(Body::from(chunked_body));
resp.headers_mut().insert(TRANSFER_ENCODING, HeaderValue::from_static("Chunked"));
Ok(resp)

分块传输编码是 HTTP/1.1 和 not part of HTTP/2 的一部分。当处理程序以分块流响应时,Hyper 将根据客户端支持的 HTTP 版本做“正确的事情”。

例如,以下将在 HTTP/1.1 中发送分块响应,但如果客户端支持 HTTP/2,则使用数据帧:

async fn handle(_req: Request<Body>) -> Result<Response<Body>, Infallible> {
    let chunked_body = vec!["Hello", ", ", "worl", "d", "!"];
    let stream = stream::iter(chunked_body.into_iter().map(Result::<_, Infallible>::Ok));
    let body = Body::wrap_stream(stream);
    Ok(Response::new(body))
}

此响应中的 headers(在客户端上强制使用 HTTP/1.1 时)是:

HTTP/1.1 200 OK
transfer-encoding: chunked

如果您希望只支持 HTTP/1.1,您可以在 Server 构建器上指定 Builder::http1_only(true).