Skip to content

Commit

Permalink
Merge pull request #6629 from Tarty/fix-6628-jsondecode-error-not-des…
Browse files Browse the repository at this point in the history
…erializable

Fix #6628 - JSONDecodeError are not deserializable
  • Loading branch information
nateprewitt authored Feb 22, 2024
2 parents 7a13c04 + 3ff3ff2 commit 382fc2c
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 0 deletions.
10 changes: 10 additions & 0 deletions src/requests/exceptions.py
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,16 @@ def __init__(self, *args, **kwargs):
CompatJSONDecodeError.__init__(self, *args)
InvalidJSONError.__init__(self, *self.args, **kwargs)

def __reduce__(self):
"""
The __reduce__ method called when pickling the object must
be the one from the JSONDecodeError (be it json/simplejson)
as it expects all the arguments for instantiation, not just
one like the IOError, and the MRO would by default call the
__reduce__ method from the IOError due to the inheritance order.
"""
return CompatJSONDecodeError.__reduce__(self)


class HTTPError(RequestException):
"""An HTTP error occurred."""
Expand Down
10 changes: 10 additions & 0 deletions tests/test_requests.py
Original file line number Diff line number Diff line change
Expand Up @@ -2810,3 +2810,13 @@ def test_status_code_425(self):
assert r4 == 425
assert r5 == 425
assert r6 == 425


def test_json_decode_errors_are_serializable_deserializable():
json_decode_error = requests.exceptions.JSONDecodeError(
"Extra data",
'{"responseCode":["706"],"data":null}{"responseCode":["706"],"data":null}',
36,
)
deserialized_error = pickle.loads(pickle.dumps(json_decode_error))
assert repr(json_decode_error) == repr(deserialized_error)

0 comments on commit 382fc2c

Please sign in to comment.