Browse code
Added cookie support to proxy, changed from urllib to urllib2
Ed L authored on 06/06/2011 22:03:04
Showing 3 changed files
Showing 3 changed files
... | ... |
@@ -33,7 +33,8 @@ |
33 | 33 |
# |
34 | 34 |
# |
35 | 35 |
import copy |
36 |
-import urllib |
|
36 |
+import cookielib |
|
37 |
+import urllib2 |
|
37 | 38 |
import urlparse |
38 | 39 |
import itertools |
39 | 40 |
import traceback |
... | ... |
@@ -139,12 +140,19 @@ class JSONRPCProxy(object): |
139 | 140 |
self.serviceURL, self._path = self._transformURL(host, path) |
140 | 141 |
self.customize(self._eventhandler) |
141 | 142 |
|
143 |
+ cj = cookielib.CookieJar() |
|
144 |
+ self._opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj)) |
|
142 | 145 |
|
143 | 146 |
|
147 |
+ |
|
148 |
+ def _set_opener(self, opener): |
|
149 |
+ self._opener = opener |
|
150 |
+ return self |
|
151 |
+ |
|
144 | 152 |
def __getattr__(self, name): |
145 | 153 |
if self._serviceName != None: |
146 | 154 |
name = "%s.%s" % (self._serviceName, name) |
147 |
- return self.__class__(self.serviceURL, path=self._path, serviceName=name).customize(type(self._eventhandler)) |
|
155 |
+ return self.__class__(self.serviceURL, path=self._path, serviceName=name).customize(type(self._eventhandler))._set_opener(self._opener) |
|
148 | 156 |
|
149 | 157 |
|
150 | 158 |
def _get_postdata(self, args=None, kwargs=None): |
... | ... |
@@ -160,11 +168,15 @@ class JSONRPCProxy(object): |
160 | 168 |
result.append('') |
161 | 169 |
return '/'.join(result) |
162 | 170 |
|
171 |
+ def _post(self, url, data): |
|
172 |
+ return self._opener.open(url, data) |
|
173 |
+ |
|
163 | 174 |
def __call__(self, *args, **kwargs): |
164 | 175 |
|
165 | 176 |
url = self._get_url() |
166 | 177 |
postdata = self._get_postdata(args, kwargs) |
167 |
- respdata = urllib.urlopen(url, postdata).read() |
|
178 |
+ #respdata = urllib2.urlopen(url, postdata).read() |
|
179 |
+ respdata = self._post(url, postdata).read() |
|
168 | 180 |
resp = Response.from_dict(jsonrpc.jsonutil.decode(respdata)) |
169 | 181 |
resp = self._eventhandler.proc_response(resp) |
170 | 182 |
|
... | ... |
@@ -191,7 +203,7 @@ class JSONRPCProxy(object): |
191 | 203 |
if hasattr(methods, 'items'): methods = methods.items() |
192 | 204 |
data = [ getattr(self, k)._get_postdata(*v) for k, v in methods ] |
193 | 205 |
postdata = '[%s]' % ','.join(data) |
194 |
- respdata = urllib.urlopen(self._get_url(), postdata).read() |
|
206 |
+ respdata = urllib2.urlopen(self._get_url(), postdata).read() |
|
195 | 207 |
resp = Response.from_json(respdata) |
196 | 208 |
try: |
197 | 209 |
result = resp.get_result() |
... | ... |
@@ -12,34 +12,6 @@ class TestJSONRPCProxy(unittest.TestCase): |
12 | 12 |
def setUp(self): |
13 | 13 |
self.proxy = jsonrpc.proxy.JSONRPCProxy('http://localhost:8007', path='aaa') |
14 | 14 |
|
15 |
- def test_eventhandler(self): |
|
16 |
- eventhandler = mock.MagicMock(spec=jsonrpc.proxy.ProxyEvents) |
|
17 |
- args = (1,2) |
|
18 |
- kwargs = {'a':1, 'b':2} |
|
19 |
- |
|
20 |
- def get_params(self, args, kwargs): |
|
21 |
- print args, kwargs |
|
22 |
- return args, kwargs |
|
23 |
- eventhandler.get_params.side_effect = get_params |
|
24 |
- |
|
25 |
- eventhandler.proc_response.side_effect = lambda _, data: data |
|
26 |
- |
|
27 |
- self.proxy = jsonrpc.proxy.JSONRPCProxy.from_url('http://localhost:8007') |
|
28 |
- self.proxy.customize(lambda *a: eventhandler) |
|
29 |
- self.assertEqual(self.proxy._get_url(), 'http://localhost:8007/') |
|
30 |
- |
|
31 |
- self.proxy.add(*args) |
|
32 |
- self.assertTrue(eventhandler.get_params.called) |
|
33 |
- eventhandler.get_params.assert_called_once_with( args, {} ) |
|
34 |
- self.assertTrue(eventhandler.procresponse.called) |
|
35 |
- |
|
36 |
- eventhandler.reset_mock() |
|
37 |
- |
|
38 |
- self.proxy.add(**kwargs) |
|
39 |
- self.assertTrue(eventhandler.get_params.called) |
|
40 |
- eventhandler.get_params.assert_called_once_with( (), kwargs ) |
|
41 |
- self.assertTrue(eventhandler.procresponse.called) |
|
42 |
- |
|
43 | 15 |
|
44 | 16 |
def test_url(self): |
45 | 17 |
self.proxy = jsonrpc.proxy.JSONRPCProxy.from_url('http://localhost:8007') |