electrum

Electrum Bitcoin wallet
git clone https://git.parazyd.org/electrum
Log | Files | Refs | Submodules

commit 7b4bb19b349a6d0b164ef6c5c675bcaecb0eef71
parent 1f7b56b455142a545386e38fa4ef905a615031e3
Author: SomberNight <somber.night@protonmail.com>
Date:   Sun, 10 Mar 2019 07:41:49 +0100

exchange_rate: raise for http status so empty hist rate dicts don't get saved

and if they had already been saved, treat them as if nothing was saved

context: BitcoinAverage started restricting the historical API endpoints.
they now deny unauthenticated requests. :/

Diffstat:
Melectrum/exchange_rate.py | 38++++++++++++++++++++------------------
1 file changed, 20 insertions(+), 18 deletions(-)

diff --git a/electrum/exchange_rate.py b/electrum/exchange_rate.py @@ -9,7 +9,7 @@ import csv import decimal from decimal import Decimal import traceback -from typing import Sequence +from typing import Sequence, Optional from aiorpcx.curio import timeout_after, TaskTimeout, TaskGroup @@ -45,6 +45,7 @@ class ExchangeBase(PrintError): proxy = network.proxy if network else None async with make_aiohttp_session(proxy) as session: async with session.get(url) as response: + response.raise_for_status() return await response.text() async def get_json(self, site, get_string): @@ -54,6 +55,7 @@ class ExchangeBase(PrintError): proxy = network.proxy if network else None async with make_aiohttp_session(proxy) as session: async with session.get(url) as response: + response.raise_for_status() # set content_type to None to disable checking MIME type return await response.json(content_type=None) @@ -76,31 +78,31 @@ class ExchangeBase(PrintError): self.quotes = {} self.on_quotes() - def read_historical_rates(self, ccy, cache_dir): + def read_historical_rates(self, ccy, cache_dir) -> Optional[dict]: filename = os.path.join(cache_dir, self.name() + '_'+ ccy) - if os.path.exists(filename): - timestamp = os.stat(filename).st_mtime - try: - with open(filename, 'r', encoding='utf-8') as f: - h = json.loads(f.read()) - h['timestamp'] = timestamp - except: - h = None - else: - h = None - if h: - self.history[ccy] = h - self.on_history() + if not os.path.exists(filename): + return None + timestamp = os.stat(filename).st_mtime + try: + with open(filename, 'r', encoding='utf-8') as f: + h = json.loads(f.read()) + except: + return None + if not h: # e.g. empty dict + return None + h['timestamp'] = timestamp + self.history[ccy] = h + self.on_history() return h @log_exceptions async def get_historical_rates_safe(self, ccy, cache_dir): try: - self.print_error("requesting fx history for", ccy) + self.print_error(f"requesting fx history for {ccy}") h = await self.request_history(ccy) - self.print_error("received fx history for", ccy) + self.print_error(f"received fx history for {ccy}") except BaseException as e: - self.print_error("failed fx history:", repr(e)) + self.print_error(f"failed fx history: {repr(e)}") #traceback.print_exc() return filename = os.path.join(cache_dir, self.name() + '_' + ccy)