From 92e8a645cad2ab5d5cfe23989975dc5a60dda240 Mon Sep 17 00:00:00 2001 From: Jacob Rief Date: Mon, 18 May 2015 12:36:23 +0200 Subject: [PATCH 1/4] data may already be in JSON format --- klarnacheckout/connector.py | 7 ++++++- tests/unit/test_order.py | 9 +++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/klarnacheckout/connector.py b/klarnacheckout/connector.py index e7067e3..a1667fd 100644 --- a/klarnacheckout/connector.py +++ b/klarnacheckout/connector.py @@ -82,7 +82,12 @@ def apply(self, method, resource, options=None): if method == 'POST': req.add_header('Content-Type', content_type) data = options.get('data') or resource.marshal() - req.data = json.dumps(data).encode('utf-8') + try: + # check if data is already valid JSON + json.loads(data) + req.data = data + except ValueError: + req.data = json.dumps(data).encode('utf-8') return self.handle_response(resource, self.opener.open(req)) diff --git a/tests/unit/test_order.py b/tests/unit/test_order.py index 1a83104..7fb4690 100644 --- a/tests/unit/test_order.py +++ b/tests/unit/test_order.py @@ -97,6 +97,15 @@ def test_create(self): self._connector.apply.assert_called_once_with( "POST", self._order, {"url": location, "data": data}) + def test_create_json(self): + location = "http://stub" + self._order.base_uri = location + data = '{"foo": "boo"}' + self._order.create(data) + + self._connector.apply.assert_called_once_with( + "POST", self._order, {"url": location, "data": data}) + def test_fetch(self): location = "http://stub" self._order.location = location From 6162bcb79a5670b2ba45246ded642ff39bd438aa Mon Sep 17 00:00:00 2001 From: Jacob Rief Date: Mon, 18 May 2015 12:50:40 +0200 Subject: [PATCH 2/4] catch TypeError --- klarnacheckout/connector.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/klarnacheckout/connector.py b/klarnacheckout/connector.py index a1667fd..dbe6f0c 100644 --- a/klarnacheckout/connector.py +++ b/klarnacheckout/connector.py @@ -86,7 +86,7 @@ def apply(self, method, resource, options=None): # check if data is already valid JSON json.loads(data) req.data = data - except ValueError: + except (TypeError, ValueError): req.data = json.dumps(data).encode('utf-8') return self.handle_response(resource, self.opener.open(req)) From a17dcc0de1fb4cd6c805c3bbb8a3164a560fa100 Mon Sep 17 00:00:00 2001 From: Jacob Rief Date: Tue, 19 May 2015 16:17:17 +0200 Subject: [PATCH 3/4] only serialize, if data is iterable --- klarnacheckout/connector.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/klarnacheckout/connector.py b/klarnacheckout/connector.py index dbe6f0c..9504d7f 100644 --- a/klarnacheckout/connector.py +++ b/klarnacheckout/connector.py @@ -82,12 +82,11 @@ def apply(self, method, resource, options=None): if method == 'POST': req.add_header('Content-Type', content_type) data = options.get('data') or resource.marshal() - try: - # check if data is already valid JSON - json.loads(data) - req.data = data - except (TypeError, ValueError): + if hasattr(data, '__iter__'): + # data which is iterable must be serialized req.data = json.dumps(data).encode('utf-8') + else: + req.data = data.encode('utf-8') return self.handle_response(resource, self.opener.open(req)) From a3d245d20ceab8b5e7fd06587a4225fb7c4ae5bd Mon Sep 17 00:00:00 2001 From: Jacob Rief Date: Tue, 23 Jun 2015 09:26:35 +0200 Subject: [PATCH 4/4] attempt to allow serialized input --- klarnacheckout/connector.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/klarnacheckout/connector.py b/klarnacheckout/connector.py index 9504d7f..af615ae 100644 --- a/klarnacheckout/connector.py +++ b/klarnacheckout/connector.py @@ -82,7 +82,7 @@ def apply(self, method, resource, options=None): if method == 'POST': req.add_header('Content-Type', content_type) data = options.get('data') or resource.marshal() - if hasattr(data, '__iter__'): + if isinstance(data, (list, tuple, dict)): # data which is iterable must be serialized req.data = json.dumps(data).encode('utf-8') else: