Skip to content

Commit

Permalink
Raise ValueError on Response.encoding being set after `Response.tex…
Browse files Browse the repository at this point in the history
…t` has been accessed (#2852)

* Raise ValueError on change encoding

* Always raise ValueError for simplicity

* update CHANGELOG.md
  • Loading branch information
xzmeng committed Sep 19, 2023
1 parent e4241c6 commit 59df819
Show file tree
Hide file tree
Showing 3 changed files with 33 additions and 0 deletions.
6 changes: 6 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
10 changes: 10 additions & 0 deletions httpx/_models.py
Original file line number Diff line number Diff line change
Expand Up @@ -603,6 +603,16 @@ def encoding(self) -> typing.Optional[str]:

@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
Expand Down
17 changes: 17 additions & 0 deletions tests/models/test_responses.py
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down

0 comments on commit 59df819

Please sign in to comment.