From fb90d30c02d8f7cdc9a643597d5c4ca7a123f3dd Mon Sep 17 00:00:00 2001 From: guoyunlong16 Date: Fri, 27 Dec 2019 02:41:52 +0800 Subject: [PATCH] fix(http2): don't add client content-length if method doesn't require it --- src/headers.rs | 8 ++++++++ src/proto/h2/client.rs | 4 +++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/headers.rs b/src/headers.rs index ba1b881b..33084114 100644 --- a/src/headers.rs +++ b/src/headers.rs @@ -1,6 +1,7 @@ use bytes::BytesMut; use http::header::{HeaderValue, OccupiedEntry, ValueIter}; use http::header::{CONTENT_LENGTH, TRANSFER_ENCODING}; +use http::method::Method; use http::HeaderMap; pub fn connection_keep_alive(value: &HeaderValue) -> bool { @@ -57,6 +58,13 @@ pub fn content_length_parse_all_values(values: ValueIter<'_, HeaderValue>) -> Op } } +pub fn method_has_defined_payload_semantics(method: &Method) -> bool { + match *method { + Method::GET | Method::HEAD | Method::DELETE | Method::CONNECT => false, + _ => true, + } +} + pub fn set_content_length_if_missing(headers: &mut HeaderMap, len: u64) { headers .entry(CONTENT_LENGTH) diff --git a/src/proto/h2/client.rs b/src/proto/h2/client.rs index ea58fa25..bf4d5706 100644 --- a/src/proto/h2/client.rs +++ b/src/proto/h2/client.rs @@ -120,7 +120,9 @@ where let mut req = ::http::Request::from_parts(head, ()); super::strip_connection_headers(req.headers_mut(), true); if let Some(len) = body.size_hint().exact() { - headers::set_content_length_if_missing(req.headers_mut(), len); + if len != 0 || headers::method_has_defined_payload_semantics(req.method()) { + headers::set_content_length_if_missing(req.headers_mut(), len); + } } let eos = body.is_end_stream(); let (fut, body_tx) = match self.h2_tx.send_request(req, eos) {