mirror of
https://github.com/kevin1024/vcrpy.git
synced 2025-12-08 16:53:23 +00:00
Fix for Serialization errors with JSON adapter
This patch aims to fix the issue#222, where json data in request can not be serialized because of TypeError in py3
This commit is contained in:
committed by
Kevin McCarthy
parent
528c9e7b1a
commit
9daf301deb
@@ -17,7 +17,7 @@ def convert_body_to_bytes(resp):
|
||||
|
||||
By default yaml serializes to utf-8 encoded bytestrings.
|
||||
When this cassette is loaded by python3, it's automatically decoded
|
||||
into unicode strings. This makes sure that it stays a bytestring, since
|
||||
into unicode strings. This makes sure that it stays a bytestring, since
|
||||
that's what all the internal httplib machinery is expecting.
|
||||
|
||||
For more info on py3 yaml:
|
||||
@@ -37,19 +37,43 @@ def convert_body_to_bytes(resp):
|
||||
return resp
|
||||
|
||||
|
||||
def _convert_string_to_unicode(string):
|
||||
"""
|
||||
If the string is bytes, decode it to a string (for python3 support)
|
||||
"""
|
||||
result = string
|
||||
|
||||
try:
|
||||
if string is not None and not isinstance(string, six.text_type):
|
||||
result = string.decode('utf-8')
|
||||
except (TypeError, UnicodeDecodeError, AttributeError):
|
||||
# Sometimes the string actually is binary or StringIO object,
|
||||
# so if you can't decode it, just give up.
|
||||
pass
|
||||
|
||||
return result
|
||||
|
||||
|
||||
def convert_body_to_unicode(resp):
|
||||
"""
|
||||
If the request body is bytes, decode it to a string (for python3 support)
|
||||
If the request or responses body is bytes, decode it to a string
|
||||
(for python3 support)
|
||||
"""
|
||||
try:
|
||||
if not isinstance(resp['body']['string'], six.text_type):
|
||||
resp['body']['string'] = resp['body']['string'].decode('utf-8')
|
||||
except (KeyError, TypeError, UnicodeDecodeError):
|
||||
# The thing we were converting either wasn't a dictionary or didn't
|
||||
# have the keys we were expecting. Some of the tests just serialize
|
||||
# and deserialize a string.
|
||||
if type(resp) is not dict:
|
||||
# Some of the tests just serialize and deserialize a string.
|
||||
return _convert_string_to_unicode(resp)
|
||||
else:
|
||||
body = resp.get('body')
|
||||
|
||||
if body is not None:
|
||||
try:
|
||||
body['string'] = _convert_string_to_unicode(
|
||||
body['string']
|
||||
)
|
||||
except (KeyError, TypeError, AttributeError):
|
||||
# The thing we were converting either wasn't a dictionary or
|
||||
# didn't have the keys we were expecting.
|
||||
# For example request object has no 'string' key.
|
||||
resp['body'] = _convert_string_to_unicode(body)
|
||||
|
||||
# Also, sometimes the thing actually is binary, so if you can't decode
|
||||
# it, just give up.
|
||||
pass
|
||||
return resp
|
||||
|
||||
Reference in New Issue
Block a user