청크 전송 인코딩 하이퍼 응답을 보내는 방법은 무엇입니까?

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 / 2의 일부가 아니라 HTTP / 1.1의 일부입니다 . 핸들러가 청크 스트림으로 응답하면 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).