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