Parçalı aktarım kodlu hiper yanıt nasıl gönderilir?
Belirli sayıda bayt ve parça içeren bir hiper yanıt göndermeye çalışıyorum. Genel bir yığın yanıtın nasıl oluşturulacağı veya aktarım kodlama başlığının nasıl ayarlanacağı konusunda kayboldum. Hyper için artık amortismana tabi bir httpWriter / chunkedWriter var gibi görünüyordu.
Bu benim girişimim, ancak aktarım kodlama başlığı ayarlanmıyor ve bunun yığınlanmış bir yanıt almanın doğru yolu olduğuna inanmıyorum.
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)
Yanıtlar
Parçalı aktarım kodlaması HTTP / 1.1'in bir parçasıdır ve HTTP / 2'nin bir parçası değildir . Bir işleyici parçalanmış bir akışla yanıt verdiğinde, Hyper, istemcinin hangi HTTP sürümünü desteklediğine bağlı olarak "doğru şeyi" yapacaktır.
Örneğin, aşağıdakiler HTTP / 1.1'de parçalı bir yanıt gönderir ancak istemciler HTTP / 2'yi destekliyorsa veri çerçevelerini kullanır:
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))
}
Bu yanıttaki başlıklar (istemcide HTTP / 1.1 zorlanırken):
HTTP/1.1 200 OK
transfer-encoding: chunked
Yalnızca HTTP / 1.1'i desteklemek istiyorsanız, bunu Server
oluşturucuda ile belirtebilirsiniz Builder::http1_only(true).