Skip to content

Commit 0d4ec53

Browse files
authored
fix: catch errors when checking github for firmware updates (#215)
* fix: catch errors when checking github for firmware updates * catch aiohttp errors better * update tests * fix test
1 parent 726fedb commit 0d4ec53

File tree

2 files changed

+48
-21
lines changed

2 files changed

+48
-21
lines changed

openevsehttp/__main__.py

Lines changed: 31 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -492,28 +492,38 @@ async def firmware_check(self) -> dict | None:
492492
else:
493493
url = f"{base_url}ESP8266_WiFi_v2.x/releases/latest"
494494

495-
async with aiohttp.ClientSession() as session:
496-
http_method = getattr(session, method)
497-
_LOGGER.debug(
498-
"Connecting to %s using method %s",
499-
url,
500-
method,
501-
)
502-
async with http_method(url) as resp:
503-
if resp.status != 200:
504-
return None
505-
message = await resp.text()
506-
message = json.loads(message)
507-
response = {}
508-
response["latest_version"] = message["tag_name"]
509-
release_notes = message["body"]
510-
response["release_summary"] = (
511-
(release_notes[:253] + "..")
512-
if len(release_notes) > 255
513-
else release_notes
495+
try:
496+
async with aiohttp.ClientSession() as session:
497+
http_method = getattr(session, method)
498+
_LOGGER.debug(
499+
"Connecting to %s using method %s",
500+
url,
501+
method,
514502
)
515-
response["release_url"] = message["html_url"]
516-
return response
503+
async with http_method(url) as resp:
504+
if resp.status != 200:
505+
return None
506+
message = await resp.text()
507+
message = json.loads(message)
508+
response = {}
509+
response["latest_version"] = message["tag_name"]
510+
release_notes = message["body"]
511+
response["release_summary"] = (
512+
(release_notes[:253] + "..")
513+
if len(release_notes) > 255
514+
else release_notes
515+
)
516+
response["release_url"] = message["html_url"]
517+
return response
518+
519+
except (TimeoutError, ServerTimeoutError):
520+
_LOGGER.error("%s: %s", ERROR_TIMEOUT, url)
521+
except ContentTypeError as err:
522+
_LOGGER.error("%s", err)
523+
except aiohttp.ClientConnectorError as err:
524+
_LOGGER.error("%s : %s", err, url)
525+
526+
return None
517527

518528
def _version_check(self, min_version: str, max_version: str = "") -> bool:
519529
"""Return bool if minimum version is met."""

tests/test_main.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
"""Library tests."""
22

3+
import aiohttp
4+
from aiohttp.client_reqrep import ConnectionKey
35
import asyncio
46
import json
57
import logging
@@ -950,6 +952,21 @@ async def test_firmware_check(
950952
firmware = await test_charger.firmware_check()
951953
assert firmware == None
952954

955+
mock_aioclient.get(
956+
TEST_URL_GITHUB_v4,
957+
exception=aiohttp.ClientConnectorError(
958+
ConnectionKey("localhost", 80, False, None, None, None, None),
959+
OSError(ConnectionError),
960+
),
961+
)
962+
with caplog.at_level(logging.DEBUG):
963+
firmware = await test_charger.firmware_check()
964+
assert (
965+
f"Cannot connect to host localhost:80 ssl:default [None] : {TEST_URL_GITHUB_v4}"
966+
in caplog.text
967+
)
968+
assert firmware is None
969+
953970
await test_charger_dev.update()
954971
mock_aioclient.get(
955972
TEST_URL_GITHUB_v4,

0 commit comments

Comments
 (0)