Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Limit size of payload in JSONDecodeError #6036

Merged
merged 1 commit into from Jan 13, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
10 changes: 10 additions & 0 deletions requests/exceptions.py
Expand Up @@ -34,6 +34,16 @@ class InvalidJSONError(RequestException):
class JSONDecodeError(InvalidJSONError, CompatJSONDecodeError):
"""Couldn't decode the text into json"""

def __init__(self, *args, **kwargs):
chyzzqo2 marked this conversation as resolved.
Show resolved Hide resolved
"""
Construct the JSONDecodeError instance first with all
args. Then use it's args to construct the IOError so that
the json specific args aren't used as IOError specific args
and the error message from JSONDecodeError is preserved.
"""
CompatJSONDecodeError.__init__(self, *args)
InvalidJSONError.__init__(self, *self.args, **kwargs)
chyzzqo2 marked this conversation as resolved.
Show resolved Hide resolved


class HTTPError(RequestException):
"""An HTTP error occurred."""
Expand Down
16 changes: 13 additions & 3 deletions tests/test_requests.py
Expand Up @@ -23,14 +23,14 @@
cookiejar_from_dict, morsel_to_cookie)
from requests.exceptions import (
ConnectionError, ConnectTimeout, InvalidSchema, InvalidURL,
MissingSchema, ReadTimeout, Timeout, RetryError, TooManyRedirects,
MissingSchema, ReadTimeout, Timeout, RetryError, RequestException, TooManyRedirects,
ProxyError, InvalidHeader, UnrewindableBodyError, SSLError, InvalidProxyURL, InvalidJSONError)
from requests.models import PreparedRequest
from requests.structures import CaseInsensitiveDict
from requests.sessions import SessionRedirectMixin
from requests.models import urlencode
from requests.hooks import default_hooks
from requests.compat import MutableMapping
from requests.compat import JSONDecodeError, is_py3, MutableMapping

from .compat import StringIO, u
from .utils import override_environ
Expand Down Expand Up @@ -2585,5 +2585,15 @@ def test_post_json_nan(self, httpbin):

def test_json_decode_compatibility(self, httpbin):
r = requests.get(httpbin('bytes/20'))
with pytest.raises(requests.exceptions.JSONDecodeError):
with pytest.raises(requests.exceptions.JSONDecodeError) as excinfo:
r.json()
assert isinstance(excinfo.value, RequestException)
nateprewitt marked this conversation as resolved.
Show resolved Hide resolved
assert isinstance(excinfo.value, JSONDecodeError)
assert r.text not in str(excinfo.value)

@pytest.mark.skipif(not is_py3, reason="doc attribute is only present on py3")
def test_json_decode_persists_doc_attr(self, httpbin):
r = requests.get(httpbin('bytes/20'))
with pytest.raises(requests.exceptions.JSONDecodeError) as excinfo:
r.json()
assert excinfo.value.doc == r.text