如何发送分块传输编码的超文本响应?

4

我正在尝试发送具有特定字节数和块数的超文本响应。我一直不知道如何生成通用的分块响应或设置传输编码头。貌似hyper有httpWriter/chunkedWriter,但现在已经弃用。

这是我的尝试,但传输编码头未被设置,并且我不认为这是拥有分块响应的正确方式。

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)
1个回答

5

分块传输编码是HTTP/1.1的一部分,但不属于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))
}

这个响应的头部(在强制客户端使用HTTP/1.1时)为:
HTTP/1.1 200 OK
transfer-encoding: chunked

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

1
非常感谢,这非常有帮助!我还想知道是否有一种方法在处理函数中动态设置ALPN协议? - omgpopstar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接