Как отправить фрагментированный гиперответ с кодировкой передачи?

Aug 18 2020

Я пытаюсь отправить гиперответ с определенным количеством байтов и блоков. Я не понимал, как сгенерировать общий ответ по частям или установить заголовок кодирования передачи. Похоже, существует httpWriter / chunkedWriter для гипер, который теперь обесценился.

Это моя попытка, но заголовок кодирования передачи не устанавливается, и я не верю, что это правильный способ получить ответ по частям.

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)

Ответы

2 PeterHall Aug 18 2020 at 16:13

Кодирование передачи по частям является частью HTTP / 1.1, а не HTTP / 2 . Когда обработчик отвечает фрагментированным потоком, Hyper будет делать «правильные вещи» в зависимости от того, какую версию HTTP поддерживает клиент.

Например, следующий код отправит фрагментированный ответ в HTTP / 1.1, но будет использовать фреймы данных, если клиенты поддерживают 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))
}

Заголовки этого ответа (при принудительном использовании HTTP / 1.1 на клиенте):

HTTP/1.1 200 OK
transfer-encoding: chunked

Если вы хотите поддерживать только HTTP / 1.1, вы можете указать это в Serverпостроителе с помощью Builder::http1_only(true).