¿Cómo enviar una hiperrespuesta codificada por transferencia fragmentada?
Estoy tratando de enviar una hiperrespuesta con una cantidad específica de bytes y fragmentos. No sé cómo generar una respuesta fragmentada genérica o establecer el encabezado de codificación de transferencia. Parecía haber un httpWriter / chunkedWriter para Hyper que ahora está depreciado.
Este es mi intento, pero el encabezado de codificación de transferencia no se está configurando y no creo que esta sea la forma correcta de tener una respuesta 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)
Respuestas
La codificación de transferencia fragmentada es parte de HTTP / 1.1 y no de HTTP / 2 . Cuando un controlador responde con un flujo fragmentado, Hyper hará lo "correcto" según la versión HTTP que admita el cliente.
Por ejemplo, lo siguiente enviará una respuesta fragmentada en HTTP / 1.1 pero usará marcos de datos si los clientes admiten 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))
}
Los encabezados de esta respuesta (al forzar HTTP / 1.1 en el cliente) son:
HTTP/1.1 200 OK
transfer-encoding: chunked
Si solo desea admitir HTTP / 1.1, puede especificarlo en el Server
constructor, con Builder::http1_only(true).