mirror of
https://github.com/kennethreitz/requests.git
synced 2026-06-05 14:50:16 +00:00
Initialize JsonDecodeError before initializing IOError (#6036)
That way we get the formated error message Co-authored-by: Peter <cHYzZQo@netflix.com>
This commit is contained in:
@@ -34,6 +34,16 @@ class InvalidJSONError(RequestException):
|
||||
class JSONDecodeError(InvalidJSONError, CompatJSONDecodeError):
|
||||
"""Couldn't decode the text into json"""
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
"""
|
||||
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)
|
||||
|
||||
|
||||
class HTTPError(RequestException):
|
||||
"""An HTTP error occurred."""
|
||||
|
||||
+13
-3
@@ -23,14 +23,14 @@ from requests.cookies import (
|
||||
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
|
||||
@@ -2585,5 +2585,15 @@ class TestPreparingURLs(object):
|
||||
|
||||
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)
|
||||
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
|
||||
|
||||
Reference in New Issue
Block a user