¿Cómo enviar una hiperrespuesta codificada por transferencia fragmentada?

Aug 18 2020

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

2 PeterHall Aug 18 2020 at 16:13

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 Serverconstructor, con Builder::http1_only(true).