Mercurial > hg > AuthRPC
comparison wibble/client/ServerProxy.py @ 8:685479d1f0a7
Tests available for both py2 and py3
author | Ben Croston <ben@croston.org> |
---|---|
date | Sun, 04 Sep 2011 23:37:41 +0100 |
parents | 3a6f3193cc7d |
children |
comparison
equal
deleted
inserted
replaced
7:3a6f3193cc7d | 8:685479d1f0a7 |
---|---|
25 import json | 25 import json |
26 import httplib | 26 import httplib |
27 import copy | 27 import copy |
28 import socket | 28 import socket |
29 import hashlib | 29 import hashlib |
30 import platform | |
31 | |
32 if platform.python_version().startswith('3'): | |
33 IS_PY3 = True | |
34 else: | |
35 IS_PY3 = False | |
30 | 36 |
31 class _Method(object): | 37 class _Method(object): |
32 def __init__(self, call, name, username=None, password=None): | 38 def __init__(self, call, name, username=None, password=None): |
33 self.call = call | 39 self.call = call |
34 self.name = name | 40 self.name = name |
53 request['params'] = params | 59 request['params'] = params |
54 | 60 |
55 if self._username is not None: | 61 if self._username is not None: |
56 request['username'] = self._username | 62 request['username'] = self._username |
57 if self._password is not None: | 63 if self._password is not None: |
58 request['password'] = hashlib.md5(self._password).hexdigest() | 64 if IS_PY3: |
65 request['password'] = hashlib.md5(self._password.encode()).hexdigest() | |
66 else: | |
67 request['password'] = hashlib.md5(self._password).hexdigest() | |
59 | 68 |
60 resp = self.call(json.dumps(request)) | 69 resp = self.call(json.dumps(request)) |
61 if resp is not None and resp['error'] is None and resp['id'] == request['id']: | 70 if resp is not None and resp['error'] is None and resp['id'] == request['id']: |
62 return resp['result'] | 71 return resp['result'] |
63 else: | 72 else: |
142 try: | 151 try: |
143 response = self.__transport.request(request) | 152 response = self.__transport.request(request) |
144 except socket.error: | 153 except socket.error: |
145 raise NetworkSocketException | 154 raise NetworkSocketException |
146 if response.status == 200: | 155 if response.status == 200: |
147 return json.loads(response.read()) | 156 if IS_PY3: |
157 return json.loads(response.read().decode()) | |
158 else: | |
159 return json.loads(response.read()) | |
148 elif response.status == 400: | 160 elif response.status == 400: |
149 raise BadRequestException | 161 raise BadRequestException |
150 elif response.status == 401: | 162 elif response.status == 401: |
151 raise UnauthorisedException | 163 raise UnauthorisedException |
152 elif response.status == 403: | 164 elif response.status == 403: |
153 raise ForbiddenException | 165 raise ForbiddenException |
154 elif response.status == 404: | 166 elif response.status == 404: |
155 raise NotFoundException | 167 raise NotFoundException |
156 elif response.status == 500: | 168 elif response.status == 500: |
157 msg = json.loads(response.read()) | 169 if IS_PY3: |
170 msg = json.loads(response.read().decode()) | |
171 else: | |
172 msg = json.loads(response.read()) | |
158 raise Exception('JSONRPCError\n%s'%msg['error']['error']) | 173 raise Exception('JSONRPCError\n%s'%msg['error']['error']) |
159 elif response.status == 502: | 174 elif response.status == 502: |
160 raise BadGatewayException | 175 raise BadGatewayException |
161 else: | 176 else: |
162 raise Exception('HTTP Status %s'%response.status) | 177 raise Exception('HTTP Status %s'%response.status) |
171 | 186 |
172 def __getattr__(self, name): | 187 def __getattr__(self, name): |
173 # magic method dispatcher | 188 # magic method dispatcher |
174 return _Method(self.__request, name, self._username, self._password) | 189 return _Method(self.__request, name, self._username, self._password) |
175 | 190 |
176 if __name__ == '__main__': | |
177 ##### btc fixme | |
178 jsonrpc_client = ServerProxy('http://localhost:1337/', username='testuser', password='', user_agent='Py2NotInternetExploiter') | |
179 #jsonrpc_client = ServerProxy('https://www.croston.org/test/index.py', | |
180 # username='testuser', | |
181 # password='', | |
182 # user_agent='Py2NotInternetExploiter') | |
183 assert jsonrpc_client.api.mymethod() == jsonrpc_client.mymethod() | |
184 try: | |
185 print jsonrpc_client.wibble('this should fail') | |
186 except BadRequestException: | |
187 pass # test passed | |
188 else: | |
189 raise Exception('Test failed (calling unknown method)') | |
190 | |
191 print 'All tests passed' | |
192 |