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

问题描述

我正在尝试发送具有特定数量的字节和块的超级响应。我对如何生成通用的分块响应或设置传输编码标头一无所知。似乎有一个针对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)

解决方法

分组传输编码是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))
}

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

HTTP/1.1 200 OK
transfer-encoding: chunked

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

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...