Raise ValueError on Response.encoding being set after Response.text has been accessed (#2852)

* Raise ValueError on change encoding

* Always raise ValueError for simplicity

* update CHANGELOG.md
This commit is contained in:
xzmeng 2023-09-19 15:54:32 +08:00 committed by GitHub
parent e4241c6155
commit 59df8190a4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 33 additions and 0 deletions

View File

@ -4,6 +4,12 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
## Unreleased
### Fixed
* Raise `ValueError` on `Response.encoding` being set after `Response.text` has been accessed. (#2852)
## 0.25.0 (11th Sep, 2023)
### Removed

View File

@ -603,6 +603,16 @@ class Response:
@encoding.setter
def encoding(self, value: str) -> None:
"""
Set the encoding to use for decoding the byte content into text.
If the `text` attribute has been accessed, attempting to set the
encoding will throw a ValueError.
"""
if hasattr(self, "_text"):
raise ValueError(
"Setting encoding after `text` has been accessed is not allowed."
)
self._encoding = value
@property

View File

@ -298,6 +298,23 @@ def test_response_force_encoding():
assert response.encoding == "iso-8859-1"
def test_response_force_encoding_after_text_accessed():
response = httpx.Response(
200,
content=b"Hello, world!",
)
assert response.status_code == 200
assert response.reason_phrase == "OK"
assert response.text == "Hello, world!"
assert response.encoding == "utf-8"
with pytest.raises(ValueError):
response.encoding = "UTF8"
with pytest.raises(ValueError):
response.encoding = "iso-8859-1"
def test_read():
response = httpx.Response(
200,