From: Joe Date: Tue, 11 Aug 2020 15:43:57 +0000 (+0800) Subject: Ignore transfer-encoding if content-length presents (#1170) X-Git-Tag: 0.14.2~22 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=5b6d33e29c0bd0839171bbbb635f38736056b2a8;p=thirdparty%2Fhttpx.git Ignore transfer-encoding if content-length presents (#1170) * Ignore transfer-encoding if content-length presents Co-authored-by: Tom Christie --- diff --git a/httpx/_models.py b/httpx/_models.py index a5913c43..8d294e7f 100644 --- a/httpx/_models.py +++ b/httpx/_models.py @@ -613,6 +613,9 @@ class Request: def prepare(self) -> None: for key, value in self.stream.get_headers().items(): + # Ignore Transfer-Encoding if the Content-Length has been set explicitly. + if key.lower() == "transfer-encoding" and "content-length" in self.headers: + continue self.headers.setdefault(key, value) auto_headers: typing.List[typing.Tuple[bytes, bytes]] = [] diff --git a/tests/models/test_requests.py b/tests/models/test_requests.py index e360ea05..f2ee98ed 100644 --- a/tests/models/test_requests.py +++ b/tests/models/test_requests.py @@ -73,6 +73,23 @@ def test_transfer_encoding_header(): assert request.headers["Transfer-Encoding"] == "chunked" +def test_ignore_transfer_encoding_header_if_content_length_exists(): + """ + `Transfer-Encoding` should be ignored if `Content-Length` has been set explicitly. + See https://github.com/encode/httpx/issues/1168 + """ + + def streaming_body(data): + yield data # pragma: nocover + + data = streaming_body(b"abcd") + + headers = {"Content-Length": "4"} + request = httpx.Request("POST", "http://example.org", data=data, headers=headers) + assert "Transfer-Encoding" not in request.headers + assert request.headers["Content-Length"] == "4" + + def test_override_host_header(): headers = {"host": "1.2.3.4:80"}