Now I understand the issue completely. The fix should modify `stream_decode_response_unicode` in `utils.py` to fall back to `r.apparent_encoding` when `r.encoding` is `None`, similar to how the `text` property does it. Here's the patch: --- a/requests/utils.py +++ b/requests/utils.py @@ -554,9 +554,7 @@ def stream_decode_response_unicode(iterator, r): """Stream decodes an iterator.""" - if r.encoding is None: - yield from iterator - return + encoding = r.encoding if r.encoding else r.apparent_encoding - decoder = codecs.getincrementaldecoder(r.encoding)(errors="replace") + decoder = codecs.getincrementaldecoder(encoding)(errors="replace") for chunk in iterator: rv = decoder.decode(chunk) if rv: