Comment envoyer une hyper réponse codée par transfert fragmentée?
J'essaye d'envoyer une réponse hyper avec un nombre spécifique d'octets et de morceaux. J'ai été perdu sur la façon de générer une réponse générique fragmentée ou de définir l'en-tête de transfert d'encodage. Il semblait y avoir un httpWriter / chunkedWriter pour hyper qui est maintenant déprécié.
C'est ma tentative, mais l'en-tête transfer-encoding n'est pas défini et je ne pense pas que ce soit la bonne façon d'avoir une réponse fragmentée.
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)
Réponses
Le codage de transfert fragmenté fait partie de HTTP / 1.1 et ne fait pas partie de HTTP / 2 . Lorsqu'un gestionnaire répond avec un flux fragmenté, Hyper fera la «bonne chose» en fonction de la version HTTP prise en charge par le client.
Par exemple, ce qui suit enverra une réponse fragmentée dans HTTP / 1.1 mais utilisera des trames de données si les clients prennent en charge 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))
}
Les en-têtes de cette réponse (lors du forçage de HTTP / 1.1 sur le client) sont:
HTTP/1.1 200 OK
transfer-encoding: chunked
Si vous souhaitez uniquement prendre en charge HTTP / 1.1, vous pouvez le spécifier sur le Server
générateur, avec Builder::http1_only(true).