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
1=== modified file 'txjsonrpc/jsonrpc.py'
2--- txjsonrpc/jsonrpc.py 2009-11-09 06:10:20 +0000
3+++ txjsonrpc/jsonrpc.py 2013-07-30 14:07:37 +0000
4@@ -1,3 +1,5 @@
5+import uuid
6+
7 from twisted.internet import defer, protocol
8 from twisted.python import reflect
9
10@@ -67,19 +69,17 @@
11 deferred = None
12 protocol = None
13
14- # XXX add an "id" parameter
15- def __init__(self, method, version=jsonrpclib.VERSION_PRE1, *args):
16- # XXX pass the "id" parameter here
17- self.payload = self._buildVersionedPayload(version, method, args)
18+ def __init__(self, method, version=jsonrpclib.VERSION_PRE1, id="", *args):
19+ self.payload = self._buildVersionedPayload(version, id, method, args)
20 self.deferred = defer.Deferred()
21
22- def _buildVersionedPayload(self, version, *args):
23+ def _buildVersionedPayload(self, version, id, *args):
24 if version == jsonrpclib.VERSION_PRE1:
25 return jsonrpclib._preV1Request(*args)
26 elif version == jsonrpclib.VERSION_1:
27- return jsonrpclib._v1Request(*args)
28+ return jsonrpclib._v1Request(*args, id=id)
29 elif version == jsonrpclib.VERSION_2:
30- return jsonrpclib._v2Request(*args)
31+ return jsonrpclib._v2Request(*args, id=id)
32
33 def parseResponse(self, contents):
34 if not self.deferred:
35@@ -127,6 +127,12 @@
36 version = self.version
37 return version
38
39+ def _getId(self, keywords):
40+ id = keywords.get("id")
41+ if id == None:
42+ id = str(uuid.uuid4())
43+ return id
44+
45 def _getFactoryClass(self, keywords):
46 factoryClass = keywords.get("factoryClass")
47 if not factoryClass:
48
49=== modified file 'txjsonrpc/netstring/jsonrpc.py'
50--- txjsonrpc/netstring/jsonrpc.py 2012-01-28 01:35:54 +0000
51+++ txjsonrpc/netstring/jsonrpc.py 2013-07-30 14:07:37 +0000
52@@ -134,8 +134,9 @@
53
54 def callRemote(self, method, *args, **kwargs):
55 version = self._getVersion(kwargs)
56+ id = self._getId(kwargs)
57 factoryClass = self._getFactoryClass(kwargs)
58- factory = factoryClass(method, version, *args)
59+ factory = factoryClass(method, version, id, *args)
60 reactor.connectTCP(self.host, self.port, factory)
61 return factory.deferred
62
63
64=== modified file 'txjsonrpc/test/test_jsonrpc.py'
65--- txjsonrpc/test/test_jsonrpc.py 2009-11-09 06:31:56 +0000
66+++ txjsonrpc/test/test_jsonrpc.py 2013-07-30 14:07:37 +0000
67@@ -13,20 +13,20 @@
68
69 def test_buildVersionedPayloadPre1(self):
70 factory = BaseQueryFactory("someMethod")
71- payload = factory._buildVersionedPayload(VERSION_PRE1)
72+ payload = factory._buildVersionedPayload(VERSION_PRE1, "")
73 self.assertEquals(
74 payload, '{"params": [], "method": ""}')
75
76 def test_buildVersionedPayload1(self):
77 factory = BaseQueryFactory("someMethod")
78- payload = factory._buildVersionedPayload(VERSION_1)
79+ payload = factory._buildVersionedPayload(VERSION_1, "")
80 self.assertEquals(
81 payload,
82 '{"params": [], "method": "", "id": ""}')
83
84 def test_buildVersionedPayload2(self):
85 factory = BaseQueryFactory("someMethod")
86- payload = factory._buildVersionedPayload(VERSION_2)
87+ payload = factory._buildVersionedPayload(VERSION_2, "")
88 self.assertEquals(
89 payload,
90 '{"params": [], "jsonrpc": "2.0", "method": "", "id": ""}')
91
92=== modified file 'txjsonrpc/web/jsonrpc.py'
93--- txjsonrpc/web/jsonrpc.py 2012-01-28 01:11:15 +0000
94+++ txjsonrpc/web/jsonrpc.py 2013-07-30 14:07:37 +0000
95@@ -13,6 +13,7 @@
96 from __future__ import nested_scopes
97 import urlparse
98 import xmlrpclib
99+import uuid
100
101 from twisted.web import resource, server
102 from twisted.internet import defer, reactor
103@@ -122,10 +123,10 @@
104 result = (result,)
105 # Convert the result (python) to JSON-RPC
106 try:
107- s = jsonrpclib.dumps(result, version=version)
108+ s = jsonrpclib.dumps(result, id=id, version=version)
109 except:
110 f = jsonrpclib.Fault(self.FAILURE, "can't serialize output")
111- s = jsonrpclib.dumps(f, version=version)
112+ s = jsonrpclib.dumps(f, id=id, version=version)
113 request.setHeader("content-length", str(len(s)))
114 request.write(s)
115 request.finish()
116@@ -166,8 +167,8 @@
117 protocol = QueryProtocol
118
119 def __init__(self, path, host, method, user=None, password=None,
120- version=jsonrpclib.VERSION_PRE1, *args):
121- BaseQueryFactory.__init__(self, method, version, *args)
122+ version=jsonrpclib.VERSION_PRE1, id="", *args):
123+ BaseQueryFactory.__init__(self, method, version, id, *args)
124 self.path, self.host = path, host
125 self.user, self.password = user, password
126
127@@ -238,10 +239,10 @@
128
129 def callRemote(self, method, *args, **kwargs):
130 version = self._getVersion(kwargs)
131- # XXX generate unique id and pass it as a parameter
132+ id = self._getId(kwargs)
133 factoryClass = self._getFactoryClass(kwargs)
134 factory = factoryClass(self.path, self.host, method, self.user,
135- self.password, version, *args)
136+ self.password, version, id, *args)
137 if self.secure:
138 from twisted.internet import ssl
139 reactor.connectSSL(self.host, self.port or 443,
140
141=== modified file 'txjsonrpc/web/test/test_jsonrpc.py'
142--- txjsonrpc/web/test/test_jsonrpc.py 2012-01-28 01:11:15 +0000
143+++ txjsonrpc/web/test/test_jsonrpc.py 2013-07-30 14:07:37 +0000
144@@ -104,6 +104,13 @@
145 return self.request.getUser(), self.request.getPassword()
146
147
148+class RawResponseQueryFactory(jsonrpc.QueryFactory):
149+ def parseResponse(self, contents):
150+ if self.deferred:
151+ self.deferred.callback(contents)
152+ self.deferred = None
153+
154+
155 class JSONRPCTestCase(unittest.TestCase):
156
157 def setUp(self):
158@@ -117,6 +124,10 @@
159 def proxy(self):
160 return jsonrpc.Proxy("http://127.0.0.1:%d/" % self.port)
161
162+ def raw_proxy(self):
163+ return jsonrpc.Proxy("http://127.0.0.1:%d/" % self.port,
164+ factoryClass=RawResponseQueryFactory)
165+
166 def getExpectedOutput(self):
167 return [
168 5,
169@@ -143,6 +154,12 @@
170 dl.append(d)
171 return defer.DeferredList(dl, fireOnOneErrback=True)
172
173+ def testIdReturned(self):
174+ d = self.raw_proxy().callRemote("add", 2, 2, id="abc", version=1)
175+ d.addCallback(self.assertEquals,
176+ '{"id": "abc", "result": 4, "error": null}')
177+ return d
178+
179 def testErrors(self):
180 dl = []
181 for code, methodName in [(666, "fail"), (666, "deferFail"),

Subscribers

People subscribed via source and target branches

to all changes: