Como enviar hiper-resposta codificada por transferência em partes?
Estou tentando enviar uma hiper resposta com um número específico de bytes e pedaços. Não sei como gerar uma resposta em partes genéricas ou definir o cabeçalho de codificação de transferência. Parecia haver um httpWriter / chunkedWriter para hyper que agora está depreciado.
Esta é minha tentativa, mas o cabeçalho de codificação de transferência não está sendo definido e não acredito que esta seja a maneira certa de obter uma resposta fragmentada.
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)
Respostas
A codificação de transferência em partes faz parte do HTTP / 1.1 e não do HTTP / 2 . Quando um manipulador responde com um fluxo fragmentado, o Hyper fará a "coisa certa" dependendo de qual versão HTTP o cliente suporta.
Por exemplo, o seguinte enviará uma resposta fragmentada em HTTP / 1.1, mas usará frames de dados se os clientes suportarem 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))
}
Os cabeçalhos nesta resposta (ao forçar HTTP / 1.1 no cliente) são:
HTTP/1.1 200 OK
transfer-encoding: chunked
Se você deseja suportar apenas HTTP / 1.1, você pode especificar que o Server
construtor, com Builder::http1_only(true).