Skip to content

Commit 917e451

Browse files
authored
This fixes json decoding in python 3 (#148)
1 parent 138406f commit 917e451

3 files changed

Lines changed: 34 additions & 3 deletions

File tree

icontrol/session.py

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,8 @@
7171
import functools
7272
import logging
7373
import requests
74+
import urllib3
75+
7476

7577
try:
7678
import json
@@ -388,7 +390,14 @@ def __init__(self, username, password, **kwargs):
388390

389391
if kwargs:
390392
raise TypeError('Unexpected **kwargs: %r' % kwargs)
391-
requests.packages.urllib3.disable_warnings()
393+
394+
try:
395+
requests.packages.urllib3.disable_warnings()
396+
except AttributeError:
397+
try:
398+
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
399+
except Exception:
400+
pass
392401

393402
# Compose with a Session obj
394403
self.session = requests.Session()
@@ -611,7 +620,7 @@ def debug_prepared_request(request):
611620
result = result + " -H '{0}: {1}'".format(k, v)
612621
if any(v == 'application/json' for k, v in iteritems(request.headers)):
613622
if request.body:
614-
kwargs = json.loads(request.body)
623+
kwargs = json.loads(request.body.decode('utf-8'))
615624
result = result + " -d '" + json.dumps(kwargs, sort_keys=True) + "'"
616625
return result
617626

icontrol/test/unit/test_session.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,20 @@ def iCRS():
3636
return fake_iCRS
3737

3838

39+
@pytest.fixture()
40+
def iCRSBytes():
41+
fake_iCRS = session.iControlRESTSession('admin', 'admin')
42+
fake_iCRS.session = mock.MagicMock()
43+
req = requests.PreparedRequest()
44+
req.prepare(method='post', url='https://0.0.0.0/mgmt/tm/root/RESTiface/')
45+
req.body = b'{"foo": "bar"}'
46+
fake_iCRS.session.prepare_request.return_value = req
47+
mock_response = mock.MagicMock()
48+
mock_response.status_code = 200
49+
fake_iCRS.session.send.return_value = mock_response
50+
return fake_iCRS
51+
52+
3953
@pytest.fixture()
4054
def uparts():
4155
parts_dict = {'base_uri': 'https://0.0.0.0/mgmt/tm/root/RESTiface/',
@@ -472,6 +486,14 @@ def test_wrapped_post_success_with_json_and_data(iCRS, uparts):
472486
assert iCRS.session.prepare_request.call_args[0][0].json == '{"a": 1}'
473487

474488

489+
def test_wrapped_post_success_with_json_and_data_bytestring(iCRSBytes, uparts):
490+
iCRSBytes.post(uparts['base_uri'], partition='AFN', name='AIN', data={'a': 1}, json='{"a": 1}', uri_as_parts=True)
491+
assert isinstance(iCRSBytes.session.prepare_request.call_args[0][0], requests.Request)
492+
assert iCRSBytes.session.prepare_request.call_args[0][0].url == 'https://0.0.0.0/mgmt/tm/root/RESTiface/~AFN~AIN'
493+
assert iCRSBytes.session.prepare_request.call_args[0][0].data == {'a': 1}
494+
assert iCRSBytes.session.prepare_request.call_args[0][0].json == '{"a": 1}'
495+
496+
475497
def test_wrapped_put_success(iCRS, uparts):
476498
iCRS.put(uparts['base_uri'], partition='AFN', name='AIN', uri_as_parts=True)
477499
assert isinstance(iCRS.session.prepare_request.call_args[0][0], requests.Request)

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
author_email='f5-icontrol-rest-python@f5.com',
2929
url='https://github.com/F5Networks/f5-icontrol-rest-python',
3030
keywords=['F5', 'icontrol', 'rest', 'api', 'bigip'],
31-
install_requires=['requests >= 2.5.0, < 3'],
31+
install_requires=['requests >= 2.5.0, < 3', 'urllib3'],
3232
py_modules=[
3333
'icontrol.session',
3434
],

0 commit comments

Comments
 (0)