From 081d1032d071d1912debfc3d6992d0c4028343ba Mon Sep 17 00:00:00 2001 From: Thomas Calmant Date: Thu, 27 Oct 2022 21:28:54 +0200 Subject: [PATCH] Explicitly reject empty response of requests Only notifications are expecting an empty response from the server. --- jsonrpclib/jsonrpc.py | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/jsonrpclib/jsonrpc.py b/jsonrpclib/jsonrpc.py index bd8de1a..d6faa91 100644 --- a/jsonrpclib/jsonrpc.py +++ b/jsonrpclib/jsonrpc.py @@ -628,7 +628,7 @@ def _request(self, methodname, params, rpcid=None): config=self._config, ) response = self._run_request(request) - check_for_errors(response) + check_for_errors(response, False) return response["result"] def _request_notify(self, methodname, params, rpcid=None): @@ -649,7 +649,7 @@ def _request_notify(self, methodname, params, rpcid=None): config=self._config, ) response = self._run_request(request, notify=True) - check_for_errors(response) + check_for_errors(response, True) def _run_request(self, request, notify=False): """ @@ -903,7 +903,7 @@ def __get_result(item): Checks for error and returns the "real" result stored in a MultiCall result. """ - check_for_errors(item) + check_for_errors(item, False) return item["result"] def __iter__(self): @@ -1349,20 +1349,24 @@ def loads(data, config=jsonrpclib.config.DEFAULT): # ------------------------------------------------------------------------------ -def check_for_errors(result): +def check_for_errors(result, expect_none): """ Checks if a result dictionary signals an error :param result: A result dictionary + :param expect_none: If True, only accept ``None``, else reject it :raise TypeError: Invalid parameter :raise NotImplementedError: Unknown JSON-RPC version :raise ValueError: Invalid dictionary content :raise ProtocolError: An error occurred on the server side :return: The result parameter """ + if expect_none and result is None: + # Notification / expected None + return + if not result: - # Notification - return result + raise TypeError("Empty response.") if not isinstance(result, utils.DictType): # Invalid argument