raise TypeError('code must be an int')
if not isinstance(message, unicode):
raise TypeError('message must be a unicode')
- self._code, self._message, self._data = code, message, data
+ self.code, self.message, self.data = code, message, data
def __str__(self):
- return '%i %s' % (self._code, self._message) + (' %r' % (self._data, ) if self._data is not None else '')
+ return '%i %s' % (self.code, self.message) + (' %r' % (self.data, ) if self.data is not None else '')
def _to_obj(self):
return {
- 'code': self._code,
- 'message': self._message,
- 'data': self._data,
+ 'code': self.code,
+ 'message': self.message,
+ 'data': self.data,
}
class Proxy(object):
raise AttributeError('%r object has no attribute %r' % (self.__class__.__name__, attr))
class Server(deferred_resource.DeferredResource):
- extra_headers = None
-
@defer.inlineCallbacks
def render_POST(self, request):
# missing batching, 1.0 notifications
- request.setHeader('Content-Type', 'application/json')
- data = request.content.read()
- if self.extra_headers is not None:
- for name, value in self.extra_headers.iteritems():
- request.setHeader(name, value)
+ id_ = None
try:
+ data = request.content.read()
+
try:
req = json.loads(data)
except Exception:
- raise RemoteError(-32700, u'Parse error')
- except Error, e:
- # id unknown
- request.write(json.dumps({
- 'jsonrpc': '2.0',
- 'id': None,
- 'result': None,
- 'error': e._to_obj(),
- }))
-
- id_ = req.get('id', None)
-
- try:
+ raise Error(-32700, u'Parse error')
+
try:
+ id_ = req.get('id', None)
method = req['method']
- if not isinstance(method, unicode):
+ if not isinstance(method, basestring):
raise ValueError()
params = req.get('params', [])
if not isinstance(params, list):
except Exception:
raise Error(-32600, u'Invalid Request')
- method_name = 'rpc_' + method
- if not hasattr(self, method_name):
+ method_meth = getattr(self, 'rpc_' + method, None)
+ if method_meth is None:
raise Error(-32601, u'Method not found')
- method_meth = getattr(self, method_name)
-
- if hasattr(method_meth, "takes_request"):
- params = [request] + list(params)
- try:
- result = yield method_meth(*params)
- except Error:
- raise
- except Exception:
- log.err(None, 'Squelched JSON method error:')
- raise Error(-32099, u'Unknown error')
+ result = yield method_meth(request, *params)
if id_ is None:
return
- request.write(json.dumps({
- 'jsonrpc': '2.0',
- 'id': id_,
- 'result': result,
- 'error': None,
- }))
+ error = None
except Error, e:
- request.write(json.dumps({
- 'jsonrpc': '2.0',
- 'id': id_,
- 'result': None,
- 'error': e._to_obj(),
- }))
+ result = None
+ error = e._to_obj()
+ except Exception:
+ log.err(None, 'Squelched JSON error:')
+
+ result = None
+ error = Error(-32099, u'Unknown error')._to_obj()
+
+ data = json.dumps(dict(
+ jsonrpc='2.0',
+ id=id_,
+ result=result,
+ error=error,
+ ))
+ request.setHeader('Content-Type', 'application/json')
+ request.setHeader('Content-Length', len(data))
+ request.write(data)