1 from __future__ import absolute_import |
|
2 import sys |
|
3 import gluon.contrib.simplejson as simplejson |
|
4 |
|
5 |
|
6 class JSONRPCServiceBase(object): |
|
7 |
|
8 def __init__(self): |
|
9 self.methods = {} |
|
10 |
|
11 def response(self, id, result): |
|
12 return simplejson.dumps({'version': '1.1', 'id': id, |
|
13 'result': result, 'error': None}) |
|
14 |
|
15 def error(self, id, code, message): |
|
16 return simplejson.dumps({ |
|
17 'id': id, |
|
18 'version': '1.1', |
|
19 'error': {'name': 'JSONRPCError', |
|
20 'code': code, |
|
21 'message': message} |
|
22 }) |
|
23 |
|
24 def add_method(self, name, method): |
|
25 self.methods[name] = method |
|
26 |
|
27 def process(self, data): |
|
28 data = simplejson.loads(data) |
|
29 id, method, params = data["id"], data["method"], data["params"] |
|
30 if method in self.methods: |
|
31 try: |
|
32 result = self.methods[method](*params) |
|
33 return self.response(id, result) |
|
34 except Exception: |
|
35 etype, eval, _etb = sys.exc_info() |
|
36 return self.error(id, 100, 'Exception %s: %s' % (etype, eval)) |
|
37 except BaseException: |
|
38 etype, eval, _etb = sys.exc_info() |
|
39 return self.error(id, 100, '%s: %s' % (etype.__name__, eval)) |
|
40 else: |
|
41 return self.error(id, 100, 'method "%s" does not exist' % method) |
|
42 |
|
43 def listmethods(self): |
|
44 return self.methods.keys() |
|