Come inviare iper risposta codificata per trasferimento in blocchi?
Sto cercando di inviare una risposta iper con un numero specifico di byte e blocchi. Mi sono perso su come generare una risposta generica in blocchi o impostare l'intestazione di codifica del trasferimento. Sembrava esserci un httpWriter / chunkedWriter per hyper che ora è svalutato.
Questo è il mio tentativo, ma l'intestazione di codifica del trasferimento non è stata impostata e non credo che questo sia il modo giusto per avere una risposta in blocchi.
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)
Risposte
La codifica del trasferimento in blocchi fa parte di HTTP / 1.1 e non di HTTP / 2 . Quando un gestore risponde con un flusso in blocchi, Hyper farà la "cosa giusta" a seconda della versione HTTP supportata dal client.
Ad esempio, quanto segue invierà una risposta in blocchi in HTTP / 1.1 ma utilizzerà frame di dati se i client supportano 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))
}
Le intestazioni su questa risposta (quando si forza HTTP / 1.1 sul client) sono:
HTTP/1.1 200 OK
transfer-encoding: chunked
Se desideri supportare solo HTTP / 1.1, puoi specificarlo nel Server
builder, con Builder::http1_only(true).