Merge lp:~jerith/txjsonrpc/add-id-to-response into lp:txjsonrpc

Proposed by Jeremy Thurgood
Status: Needs review
Proposed branch: lp:~jerith/txjsonrpc/add-id-to-response
Merge into: lp:txjsonrpc
Diff against target: 181 lines (+42/-17)
5 files modified
txjsonrpc/jsonrpc.py (+13/-7)
txjsonrpc/netstring/jsonrpc.py (+2/-1)
txjsonrpc/test/test_jsonrpc.py (+3/-3)
txjsonrpc/web/jsonrpc.py (+7/-6)
txjsonrpc/web/test/test_jsonrpc.py (+17/-0)
To merge this branch: bzr merge lp:~jerith/txjsonrpc/add-id-to-response
Reviewer Review Type Date Requested Status
Duncan McGreggor Pending
Review via email: mp+177604@code.launchpad.net

Description of the change

This adds support for request ids, necessary for both #456441 and #456351.

To post a comment you must log in.

Unmerged revisions

95. By Jeremy Thurgood

Add support for request id.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'txjsonrpc/jsonrpc.py'
--- txjsonrpc/jsonrpc.py 2009-11-09 06:10:20 +0000
+++ txjsonrpc/jsonrpc.py 2013-07-30 14:07:37 +0000
@@ -1,3 +1,5 @@
1import uuid
2
1from twisted.internet import defer, protocol3from twisted.internet import defer, protocol
2from twisted.python import reflect4from twisted.python import reflect
35
@@ -67,19 +69,17 @@
67 deferred = None69 deferred = None
68 protocol = None70 protocol = None
6971
70 # XXX add an "id" parameter72 def __init__(self, method, version=jsonrpclib.VERSION_PRE1, id="", *args):
71 def __init__(self, method, version=jsonrpclib.VERSION_PRE1, *args):73 self.payload = self._buildVersionedPayload(version, id, method, args)
72 # XXX pass the "id" parameter here
73 self.payload = self._buildVersionedPayload(version, method, args)
74 self.deferred = defer.Deferred()74 self.deferred = defer.Deferred()
7575
76 def _buildVersionedPayload(self, version, *args):76 def _buildVersionedPayload(self, version, id, *args):
77 if version == jsonrpclib.VERSION_PRE1:77 if version == jsonrpclib.VERSION_PRE1:
78 return jsonrpclib._preV1Request(*args)78 return jsonrpclib._preV1Request(*args)
79 elif version == jsonrpclib.VERSION_1:79 elif version == jsonrpclib.VERSION_1:
80 return jsonrpclib._v1Request(*args)80 return jsonrpclib._v1Request(*args, id=id)
81 elif version == jsonrpclib.VERSION_2:81 elif version == jsonrpclib.VERSION_2:
82 return jsonrpclib._v2Request(*args)82 return jsonrpclib._v2Request(*args, id=id)
8383
84 def parseResponse(self, contents):84 def parseResponse(self, contents):
85 if not self.deferred:85 if not self.deferred:
@@ -127,6 +127,12 @@
127 version = self.version127 version = self.version
128 return version128 return version
129129
130 def _getId(self, keywords):
131 id = keywords.get("id")
132 if id == None:
133 id = str(uuid.uuid4())
134 return id
135
130 def _getFactoryClass(self, keywords):136 def _getFactoryClass(self, keywords):
131 factoryClass = keywords.get("factoryClass")137 factoryClass = keywords.get("factoryClass")
132 if not factoryClass:138 if not factoryClass:
133139
=== modified file 'txjsonrpc/netstring/jsonrpc.py'
--- txjsonrpc/netstring/jsonrpc.py 2012-01-28 01:35:54 +0000
+++ txjsonrpc/netstring/jsonrpc.py 2013-07-30 14:07:37 +0000
@@ -134,8 +134,9 @@
134134
135 def callRemote(self, method, *args, **kwargs):135 def callRemote(self, method, *args, **kwargs):
136 version = self._getVersion(kwargs)136 version = self._getVersion(kwargs)
137 id = self._getId(kwargs)
137 factoryClass = self._getFactoryClass(kwargs)138 factoryClass = self._getFactoryClass(kwargs)
138 factory = factoryClass(method, version, *args)139 factory = factoryClass(method, version, id, *args)
139 reactor.connectTCP(self.host, self.port, factory)140 reactor.connectTCP(self.host, self.port, factory)
140 return factory.deferred141 return factory.deferred
141142
142143
=== modified file 'txjsonrpc/test/test_jsonrpc.py'
--- txjsonrpc/test/test_jsonrpc.py 2009-11-09 06:31:56 +0000
+++ txjsonrpc/test/test_jsonrpc.py 2013-07-30 14:07:37 +0000
@@ -13,20 +13,20 @@
1313
14 def test_buildVersionedPayloadPre1(self):14 def test_buildVersionedPayloadPre1(self):
15 factory = BaseQueryFactory("someMethod")15 factory = BaseQueryFactory("someMethod")
16 payload = factory._buildVersionedPayload(VERSION_PRE1)16 payload = factory._buildVersionedPayload(VERSION_PRE1, "")
17 self.assertEquals(17 self.assertEquals(
18 payload, '{"params": [], "method": ""}')18 payload, '{"params": [], "method": ""}')
1919
20 def test_buildVersionedPayload1(self):20 def test_buildVersionedPayload1(self):
21 factory = BaseQueryFactory("someMethod")21 factory = BaseQueryFactory("someMethod")
22 payload = factory._buildVersionedPayload(VERSION_1)22 payload = factory._buildVersionedPayload(VERSION_1, "")
23 self.assertEquals(23 self.assertEquals(
24 payload,24 payload,
25 '{"params": [], "method": "", "id": ""}')25 '{"params": [], "method": "", "id": ""}')
2626
27 def test_buildVersionedPayload2(self):27 def test_buildVersionedPayload2(self):
28 factory = BaseQueryFactory("someMethod")28 factory = BaseQueryFactory("someMethod")
29 payload = factory._buildVersionedPayload(VERSION_2)29 payload = factory._buildVersionedPayload(VERSION_2, "")
30 self.assertEquals(30 self.assertEquals(
31 payload,31 payload,
32 '{"params": [], "jsonrpc": "2.0", "method": "", "id": ""}')32 '{"params": [], "jsonrpc": "2.0", "method": "", "id": ""}')
3333
=== modified file 'txjsonrpc/web/jsonrpc.py'
--- txjsonrpc/web/jsonrpc.py 2012-01-28 01:11:15 +0000
+++ txjsonrpc/web/jsonrpc.py 2013-07-30 14:07:37 +0000
@@ -13,6 +13,7 @@
13from __future__ import nested_scopes13from __future__ import nested_scopes
14import urlparse14import urlparse
15import xmlrpclib15import xmlrpclib
16import uuid
1617
17from twisted.web import resource, server18from twisted.web import resource, server
18from twisted.internet import defer, reactor19from twisted.internet import defer, reactor
@@ -122,10 +123,10 @@
122 result = (result,)123 result = (result,)
123 # Convert the result (python) to JSON-RPC124 # Convert the result (python) to JSON-RPC
124 try:125 try:
125 s = jsonrpclib.dumps(result, version=version)126 s = jsonrpclib.dumps(result, id=id, version=version)
126 except:127 except:
127 f = jsonrpclib.Fault(self.FAILURE, "can't serialize output")128 f = jsonrpclib.Fault(self.FAILURE, "can't serialize output")
128 s = jsonrpclib.dumps(f, version=version)129 s = jsonrpclib.dumps(f, id=id, version=version)
129 request.setHeader("content-length", str(len(s)))130 request.setHeader("content-length", str(len(s)))
130 request.write(s)131 request.write(s)
131 request.finish()132 request.finish()
@@ -166,8 +167,8 @@
166 protocol = QueryProtocol167 protocol = QueryProtocol
167168
168 def __init__(self, path, host, method, user=None, password=None,169 def __init__(self, path, host, method, user=None, password=None,
169 version=jsonrpclib.VERSION_PRE1, *args):170 version=jsonrpclib.VERSION_PRE1, id="", *args):
170 BaseQueryFactory.__init__(self, method, version, *args)171 BaseQueryFactory.__init__(self, method, version, id, *args)
171 self.path, self.host = path, host172 self.path, self.host = path, host
172 self.user, self.password = user, password173 self.user, self.password = user, password
173174
@@ -238,10 +239,10 @@
238239
239 def callRemote(self, method, *args, **kwargs):240 def callRemote(self, method, *args, **kwargs):
240 version = self._getVersion(kwargs)241 version = self._getVersion(kwargs)
241 # XXX generate unique id and pass it as a parameter242 id = self._getId(kwargs)
242 factoryClass = self._getFactoryClass(kwargs)243 factoryClass = self._getFactoryClass(kwargs)
243 factory = factoryClass(self.path, self.host, method, self.user,244 factory = factoryClass(self.path, self.host, method, self.user,
244 self.password, version, *args)245 self.password, version, id, *args)
245 if self.secure:246 if self.secure:
246 from twisted.internet import ssl247 from twisted.internet import ssl
247 reactor.connectSSL(self.host, self.port or 443,248 reactor.connectSSL(self.host, self.port or 443,
248249
=== modified file 'txjsonrpc/web/test/test_jsonrpc.py'
--- txjsonrpc/web/test/test_jsonrpc.py 2012-01-28 01:11:15 +0000
+++ txjsonrpc/web/test/test_jsonrpc.py 2013-07-30 14:07:37 +0000
@@ -104,6 +104,13 @@
104 return self.request.getUser(), self.request.getPassword()104 return self.request.getUser(), self.request.getPassword()
105105
106106
107class RawResponseQueryFactory(jsonrpc.QueryFactory):
108 def parseResponse(self, contents):
109 if self.deferred:
110 self.deferred.callback(contents)
111 self.deferred = None
112
113
107class JSONRPCTestCase(unittest.TestCase):114class JSONRPCTestCase(unittest.TestCase):
108115
109 def setUp(self):116 def setUp(self):
@@ -117,6 +124,10 @@
117 def proxy(self):124 def proxy(self):
118 return jsonrpc.Proxy("http://127.0.0.1:%d/" % self.port)125 return jsonrpc.Proxy("http://127.0.0.1:%d/" % self.port)
119126
127 def raw_proxy(self):
128 return jsonrpc.Proxy("http://127.0.0.1:%d/" % self.port,
129 factoryClass=RawResponseQueryFactory)
130
120 def getExpectedOutput(self):131 def getExpectedOutput(self):
121 return [132 return [
122 5,133 5,
@@ -143,6 +154,12 @@
143 dl.append(d)154 dl.append(d)
144 return defer.DeferredList(dl, fireOnOneErrback=True)155 return defer.DeferredList(dl, fireOnOneErrback=True)
145156
157 def testIdReturned(self):
158 d = self.raw_proxy().callRemote("add", 2, 2, id="abc", version=1)
159 d.addCallback(self.assertEquals,
160 '{"id": "abc", "result": 4, "error": null}')
161 return d
162
146 def testErrors(self):163 def testErrors(self):
147 dl = []164 dl = []
148 for code, methodName in [(666, "fail"), (666, "deferFail"),165 for code, methodName in [(666, "fail"), (666, "deferFail"),

Subscribers

People subscribed via source and target branches

to all changes: