Skip to content

Commit da5c03a

Browse files
committed
Fix #2155: Streaming gzipped responses
1 parent 0e4ae38 commit da5c03a

File tree

3 files changed

+32
-0
lines changed

3 files changed

+32
-0
lines changed

PR_BODY.md

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
## Summary
2+
Enable automatic content decoding on `Response.raw` so streamed gzip-encoded responses can be consumed directly via file-like readers.
3+
4+
## Root Cause
5+
Requests built responses with `raw.decode_content=False`, so consumers reading from `response.raw` got compressed bytes by default. This breaks file-like streaming parsers that call `.read()` and expect decoded content.
6+
7+
## Changes Made
8+
- Set `response.raw.decode_content = True` in `HTTPAdapter.build_response`.
9+
- Added a regression test in `tests/test_adapters.py` to verify `build_response` enables decoded raw reads by default.
10+
11+
## Verification
12+
- Ran: `PYTHONPATH=src pytest -q tests/test_adapters.py`
13+
- Result: `2 passed`
14+
15+
## Notes
16+
- Explicit reads that need wire-level compressed bytes can still request `decode_content=False` on read/stream calls.

src/requests/adapters.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -356,6 +356,7 @@ def build_response(self, req, resp):
356356
# Set encoding.
357357
response.encoding = get_encoding_from_headers(response.headers)
358358
response.raw = resp
359+
response.raw.decode_content = True
359360
response.reason = response.raw.reason
360361

361362
if isinstance(req.url, bytes):

tests/test_adapters.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import requests
12
import requests.adapters
23

34

@@ -6,3 +7,17 @@ def test_request_url_trims_leading_path_separators():
67
a = requests.adapters.HTTPAdapter()
78
p = requests.Request(method="GET", url="http://127.0.0.1:10000//v:h").prepare()
89
assert "/v:h" == a.request_url(p, {})
10+
11+
12+
def test_build_response_sets_decode_content():
13+
adapter = requests.adapters.HTTPAdapter()
14+
req = requests.Request(method="GET", url="http://example.com/").prepare()
15+
raw_resp = type(
16+
"RawResponse",
17+
(),
18+
{"status": 200, "headers": {}, "reason": "OK", "decode_content": False},
19+
)()
20+
21+
response = adapter.build_response(req, raw_resp)
22+
23+
assert response.raw.decode_content is True

0 commit comments

Comments
 (0)