From 4665ba6315bfd484432cf7ebbdd4fcbbdf9e608c Mon Sep 17 00:00:00 2001 From: Neil Booth Date: Thu, 13 Jul 2017 10:50:04 +0900 Subject: [PATCH] Improve daemon JSON RPC compatibility - give an ID to each request - allow client session to be customized by derived classes Based on changes suggested by erasmospunk --- server/daemon.py | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/server/daemon.py b/server/daemon.py index 5d56ce5..5e9b311 100644 --- a/server/daemon.py +++ b/server/daemon.py @@ -45,6 +45,7 @@ class Daemon(util.LoggedClass): self.workqueue_semaphore = asyncio.Semaphore(value=10) self.down = False self.last_error_time = 0 + self.req_id = 0 # assignment of asyncio.TimeoutError are essentially ignored if aiohttp.__version__.startswith('1.'): self.ClientHttpProcessingError = aiohttp.ClientHttpProcessingError @@ -53,6 +54,11 @@ class Daemon(util.LoggedClass): self.ClientHttpProcessingError = asyncio.TimeoutError self.ClientPayloadError = aiohttp.ClientPayloadError + def next_req_id(self): + '''Retrns the next request ID.''' + self.req_id += 1 + return self.req_id + def set_urls(self, urls): '''Set the URLS to the given list, and switch to the first one.''' if not urls: @@ -79,9 +85,13 @@ class Daemon(util.LoggedClass): return True return False + def client_session(self): + '''An aiohttp client session.''' + return aiohttp.ClientSession() + async def _send_data(self, data): async with self.workqueue_semaphore: - async with aiohttp.ClientSession() as session: + async with self.client_session() as session: async with session.post(self.url(), data=data) as resp: # If bitcoind can't find a tx, for some reason # it returns 500 but fills out the JSON. @@ -158,7 +168,7 @@ class Daemon(util.LoggedClass): raise self.DaemonWarmingUpError raise DaemonError(err) - payload = {'method': method} + payload = {'method': method, 'id': self.next_req_id()} if params: payload['params'] = params return await self._send(payload, processor) @@ -177,7 +187,8 @@ class Daemon(util.LoggedClass): return [item['result'] for item in result] raise DaemonError(errs) - payload = [{'method': method, 'params': p} for p in params_iterable] + payload = [{'method': method, 'params': p, 'id': self.next_req_id()} + for p in params_iterable] if payload: return await self._send(payload, processor) return []