fix(http2): don't add client content-length if method doesn't require it
This commit is contained in:
committed by
Sean McArthur
parent
35825c4614
commit
fb90d30c02
@@ -1,6 +1,7 @@
|
|||||||
use bytes::BytesMut;
|
use bytes::BytesMut;
|
||||||
use http::header::{HeaderValue, OccupiedEntry, ValueIter};
|
use http::header::{HeaderValue, OccupiedEntry, ValueIter};
|
||||||
use http::header::{CONTENT_LENGTH, TRANSFER_ENCODING};
|
use http::header::{CONTENT_LENGTH, TRANSFER_ENCODING};
|
||||||
|
use http::method::Method;
|
||||||
use http::HeaderMap;
|
use http::HeaderMap;
|
||||||
|
|
||||||
pub fn connection_keep_alive(value: &HeaderValue) -> bool {
|
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) {
|
pub fn set_content_length_if_missing(headers: &mut HeaderMap, len: u64) {
|
||||||
headers
|
headers
|
||||||
.entry(CONTENT_LENGTH)
|
.entry(CONTENT_LENGTH)
|
||||||
|
|||||||
@@ -120,7 +120,9 @@ where
|
|||||||
let mut req = ::http::Request::from_parts(head, ());
|
let mut req = ::http::Request::from_parts(head, ());
|
||||||
super::strip_connection_headers(req.headers_mut(), true);
|
super::strip_connection_headers(req.headers_mut(), true);
|
||||||
if let Some(len) = body.size_hint().exact() {
|
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 eos = body.is_end_stream();
|
||||||
let (fut, body_tx) = match self.h2_tx.send_request(req, eos) {
|
let (fut, body_tx) = match self.h2_tx.send_request(req, eos) {
|
||||||
|
|||||||
Reference in New Issue
Block a user