Bagaimana cara mengirim respons hiper berkode transfer yang terpotong?
Saya mencoba mengirim respons hiper dengan jumlah byte dan potongan tertentu. Saya telah tersesat tentang cara menghasilkan respons chunked generik atau mengatur header transfer-encoding. Sepertinya ada httpWriter / chunkedWriter untuk hyper yang sekarang disusutkan.
Ini adalah upaya saya, tetapi tajuk transfer-encoding tidak disetel dan saya tidak yakin ini adalah cara yang tepat untuk mendapatkan respons yang terpotong-potong.
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)
Jawaban
Pengkodean transfer terpotong adalah bagian dari HTTP / 1.1, dan bukan bagian dari HTTP / 2 . Ketika seorang penangan merespon dengan aliran yang terpotong, Hyper akan melakukan "hal yang benar" tergantung pada versi HTTP mana yang didukung oleh klien.
Misalnya, berikut ini akan mengirimkan respons terpotong di HTTP / 1.1 tetapi menggunakan bingkai data jika klien mendukung 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))
}
Header pada respons ini (saat memaksa HTTP / 1.1 pada klien) adalah:
HTTP/1.1 200 OK
transfer-encoding: chunked
Jika Anda hanya ingin mendukung HTTP / 1.1, Anda dapat menentukannya di Server
pembuat, dengan Builder::http1_only(true).