कैसे भेजना है ट्रांसफर-इनकोडेड हाइपर रिस्पॉन्स?

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 का हिस्सा नहीं है । जब कोई हैंडलर किसी ठूंसी हुई धारा के साथ प्रतिक्रिया करता है, तो हाइपर "सही काम" करेगा, जिसके आधार पर क्लाइंट का 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)।