Skip to content

Commit 998572c

Browse files
#1266 added JSON encoder for bytes objects
1 parent 627c78a commit 998572c

File tree

2 files changed

+45
-1
lines changed

2 files changed

+45
-1
lines changed

SoftLayer/transports.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
66
:license: MIT, see LICENSE for more details.
77
"""
8+
import base64
89
import importlib
910
import json
1011
import logging
@@ -359,7 +360,7 @@ def __call__(self, request):
359360
body['parameters'] = request.args
360361

361362
if body:
362-
request.payload = json.dumps(body)
363+
request.payload = json.dumps(body, cls=ComplexEncoder)
363364

364365
url_parts = [self.endpoint_url, request.service]
365366
if request.identifier is not None:
@@ -566,3 +567,12 @@ def _format_object_mask(objectmask):
566567
not objectmask.startswith('[')):
567568
objectmask = "mask[%s]" % objectmask
568569
return objectmask
570+
571+
class ComplexEncoder(json.JSONEncoder):
572+
def default(self, obj):
573+
# Base64 encode bytes type objects.
574+
if isinstance(obj, bytes):
575+
base64_bytes = base64.b64encode(obj)
576+
return base64_bytes.decode("utf-8")
577+
# Let the base class default method raise the TypeError
578+
return json.JSONEncoder.default(self, obj)

tests/transport_tests.py

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import io
88
import warnings
99

10+
import json
1011
import mock
1112
import pytest
1213
import requests
@@ -527,6 +528,31 @@ def test_with_args(self, request):
527528
proxies=None,
528529
timeout=None)
529530

531+
532+
@mock.patch('SoftLayer.transports.requests.Session.request')
533+
def test_with_args_bytes(self, request):
534+
request().text = '{}'
535+
536+
req = transports.Request()
537+
req.service = 'SoftLayer_Service'
538+
req.method = 'getObject'
539+
req.args = ('test', b'asdf')
540+
541+
resp = self.transport(req)
542+
543+
self.assertEqual(resp, {})
544+
request.assert_called_with(
545+
'POST',
546+
'http://something.com/SoftLayer_Service/getObject.json',
547+
headers=mock.ANY,
548+
auth=None,
549+
data='{"parameters": ["test", "YXNkZg=="]}',
550+
params={},
551+
verify=True,
552+
cert=None,
553+
proxies=None,
554+
timeout=None)
555+
530556
@mock.patch('SoftLayer.transports.requests.Session.request')
531557
def test_with_filter(self, request):
532558
request().text = '{}'
@@ -674,6 +700,14 @@ def test_print_reproduceable(self):
674700
output_text = self.transport.print_reproduceable(req)
675701
self.assertIn("https://test.com", output_text)
676702

703+
def test_complex_encoder_bytes(self):
704+
to_encode = {
705+
'test' : ['array', 0, 1, False],
706+
'bytes': b'ASDASDASD'
707+
}
708+
result = json.dumps(to_encode, cls=transports.ComplexEncoder)
709+
self.assertEqual(result, '{"test": ["array", 0, 1, false], "bytes": "QVNEQVNEQVNE"}')
710+
677711

678712
class TestFixtureTransport(testing.TestCase):
679713

0 commit comments

Comments
 (0)