diff --git a/requests/models.py b/requests/models.py index 9dad48cec0..7e1522837f 100644 --- a/requests/models.py +++ b/requests/models.py @@ -965,6 +965,8 @@ def json(self, **kwargs): # and the server didn't bother to tell us what codec *was* # used. pass + except JSONDecodeError as e: + raise RequestsJSONDecodeError(e.msg, e.doc, e.pos) try: return complexjson.loads(self.text, **kwargs) diff --git a/tests/test_lowlevel.py b/tests/test_lowlevel.py index bb5c994ee4..9c05f661de 100644 --- a/tests/test_lowlevel.py +++ b/tests/test_lowlevel.py @@ -4,7 +4,6 @@ from tests.testserver.server import Server, consume_socket_content import requests - from .utils import override_environ @@ -403,3 +402,26 @@ def response_handler(sock): assert r.url == f'http://{host}:{port}/final-url/#relevant-section' close_server.set() + +def test_json_decode_compatibility_for_alt_utf_encodings(): + + def response_handler(sock): + consume_socket_content(sock, timeout=0.5) + sock.send( + b'HTTP/1.1 200 OK\r\n' + b'Content-Length: 18\r\n\r\n' + b'\xff\xfe{\x00"\x00K0"\x00=\x00"\x00\xab0"\x00\r\n' + ) + + close_server = threading.Event() + server = Server(response_handler, wait_to_close_event=close_server) + + with server as (host, port): + url = 'http://{}:{}/'.format(host, port) + r = requests.get(url) + r.encoding = None + with pytest.raises(requests.exceptions.JSONDecodeError) as excinfo: + r.json() + assert isinstance(excinfo.value, requests.exceptions.RequestException) + assert isinstance(excinfo.value, JSONDecodeError) + assert r.text not in str(excinfo.value)