Skip to content

Commit a012e7a

Browse files
Merge pull request #1269 from allmightyspiff/ticketEncode
Ticket encode
2 parents 627c78a + 99879fc commit a012e7a

File tree

2 files changed

+51
-1
lines changed

2 files changed

+51
-1
lines changed

SoftLayer/transports.py

Lines changed: 16 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,17 @@ def _format_object_mask(objectmask):
566567
not objectmask.startswith('[')):
567568
objectmask = "mask[%s]" % objectmask
568569
return objectmask
570+
571+
572+
class ComplexEncoder(json.JSONEncoder):
573+
"""ComplexEncoder helps jsonencoder deal with byte strings"""
574+
575+
def default(self, o):
576+
"""Encodes o as JSON"""
577+
578+
# Base64 encode bytes type objects.
579+
if isinstance(o, bytes):
580+
base64_bytes = base64.b64encode(o)
581+
return base64_bytes.decode("utf-8")
582+
# Let the base class default method raise the TypeError
583+
return json.JSONEncoder.default(self, o)

tests/transport_tests.py

Lines changed: 35 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,30 @@ def test_with_args(self, request):
527528
proxies=None,
528529
timeout=None)
529530

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

702+
def test_complex_encoder_bytes(self):
703+
to_encode = {
704+
'test': ['array', 0, 1, False],
705+
'bytes': b'ASDASDASD'
706+
}
707+
result = json.dumps(to_encode, cls=transports.ComplexEncoder)
708+
# result = '{"test": ["array", 0, 1, false], "bytes": "QVNEQVNEQVNE"}'
709+
# encode doesn't always encode in the same order, so testing exact match SOMETIMES breaks.
710+
self.assertIn("QVNEQVNEQVNE", result)
711+
677712

678713
class TestFixtureTransport(testing.TestCase):
679714

0 commit comments

Comments
 (0)