From 0327b55e0ab48b0aacbc6817082cf589f7b8f5a9 Mon Sep 17 00:00:00 2001 From: Aleksey Zhukov Date: Tue, 13 Mar 2012 16:37:13 +0400 Subject: [PATCH 1/2] Improved 1.0 protocol compliance (error handling and required params) --- jsonrpclib/jsonrpc.py | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/jsonrpclib/jsonrpc.py b/jsonrpclib/jsonrpc.py index e11939a..b74697a 100644 --- a/jsonrpclib/jsonrpc.py +++ b/jsonrpclib/jsonrpc.py @@ -421,7 +421,7 @@ def request(self, method, params=[]): if not self.id: self.id = random_id() request = { 'id':self.id, 'method':method } - if params: + if params or self.version < 1.1: request['params'] = params if self.version >= 2: request['jsonrpc'] = str(self.version) @@ -524,9 +524,14 @@ def check_for_errors(result): if 'result' not in result.keys() and 'error' not in result.keys(): raise ValueError('Response does not have a result or error key.') if 'error' in result.keys() and result['error'] != None: - code = result['error']['code'] - message = result['error']['message'] - raise ProtocolError((code, message)) + if 'code' in result['error'] and 'message' in result['error']: + code = result['error']['code'] + message = result['error']['message'] + raise ProtocolError((code, message)) + elif 'reason' in result['error']: + raise ProtocolError(result['error']['reason']) + else: + raise ProtocolError(('Malformed result object', result['error'])) return result def isbatch(result): From 34d83a1de9331669c73406711c61e8f3fadaca7f Mon Sep 17 00:00:00 2001 From: Aleksey Zhukov Date: Tue, 13 Mar 2012 16:46:16 +0400 Subject: [PATCH 2/2] Less strict error response handling. This should support any types of error responses, including: - `{..., "error": {"code": -42, "message": "spam"}}`, - `{..., "error": {"reason": "spam"}}`, - `{..., "error": {"what_happened": "spam"}}`, - or even `{..., "error": "spam"}}` --- jsonrpclib/jsonrpc.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/jsonrpclib/jsonrpc.py b/jsonrpclib/jsonrpc.py index b74697a..0208e20 100644 --- a/jsonrpclib/jsonrpc.py +++ b/jsonrpclib/jsonrpc.py @@ -528,10 +528,11 @@ def check_for_errors(result): code = result['error']['code'] message = result['error']['message'] raise ProtocolError((code, message)) - elif 'reason' in result['error']: - raise ProtocolError(result['error']['reason']) + elif type(result['error']) is dict and len(result['error']) == 1: + error_key = result['error'].keys()[0] + raise ProtocolError(result['error'][error_key]) else: - raise ProtocolError(('Malformed result object', result['error'])) + raise ProtocolError(result['error']) return result def isbatch(result):