aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Schadt <kingdread@gmx.de>2026-10-06 09:14:17 +0200
committerDaniel Schadt <kingdread@gmx.de>2026-10-06 09:14:17 +0200
commit5a2d67059e9e0ad4ec5355cb3eb47f43d6d34231 (patch)
tree2fe109af2f90ac4fbf0045d0fbe78cb0bab9fd48
parent3711446782a69058336ebefc923ec2a587c61546 (diff)
downloadfietsboek-5a2d67059e9e0ad4ec5355cb3eb47f43d6d34231.tar.gz
fietsboek-5a2d67059e9e0ad4ec5355cb3eb47f43d6d34231.tar.bz2
fietsboek-5a2d67059e9e0ad4ec5355cb3eb47f43d6d34231.zip
better error handling when requesting tile fails
-rw-r--r--fietsboek/trackmap.py12
-rw-r--r--fietsboek/views/tileproxy.py9
2 files changed, 17 insertions, 4 deletions
diff --git a/fietsboek/trackmap.py b/fietsboek/trackmap.py
index 7584ece..c2400bb 100644
--- a/fietsboek/trackmap.py
+++ b/fietsboek/trackmap.py
@@ -1,7 +1,9 @@
"""Module to render tracks to static images on OSM tiles."""
import io
+import logging
import math
+import requests
from PIL import Image, ImageDraw
@@ -9,6 +11,8 @@ from . import geo
from .config import TileLayerConfig
from .views.tileproxy import TileRequester
+LOGGER = logging.getLogger(__name__)
+
TILE_SIZE = 256
# This is arbitrarily set to provide some image in case a render is requested
@@ -107,8 +111,12 @@ class TrackMapRenderer:
for i in range(int(math.ceil(self.size[0] / TILE_SIZE)) + 1):
for j in range(int(math.ceil(self.size[1] / TILE_SIZE)) + 1):
- tile = self._load_tile(zoom, start_x // TILE_SIZE + i, start_y // TILE_SIZE + j)
- image.paste(tile, (i * TILE_SIZE + offset_x, j * TILE_SIZE + offset_y))
+ try:
+ tile = self._load_tile(zoom, start_x // TILE_SIZE + i, start_y // TILE_SIZE + j)
+ except requests.RequestException as exc:
+ LOGGER.error("Error downloading tiles: %s", exc)
+ else:
+ image.paste(tile, (i * TILE_SIZE + offset_x, j * TILE_SIZE + offset_y))
return start_x, start_y
diff --git a/fietsboek/views/tileproxy.py b/fietsboek/views/tileproxy.py
index f472d6d..8717d6c 100644
--- a/fietsboek/views/tileproxy.py
+++ b/fietsboek/views/tileproxy.py
@@ -20,7 +20,7 @@ from pyramid.httpexceptions import HTTPBadRequest, HTTPGatewayTimeout
from pyramid.request import Request
from pyramid.response import Response
from pyramid.view import view_config
-from requests.exceptions import ReadTimeout
+from requests.exceptions import ConnectTimeout, ReadTimeout, RequestException
from zope.interface import Interface, implementer
from .. import __VERSION__
@@ -411,8 +411,9 @@ def tile_proxy(request):
try:
# We already tried the cache, so bypass it here
resp = loader.load_tile(tile_sources[provider], z, x, y, headers=headers, use_cache=False)
- except ReadTimeout:
+ except (ReadTimeout, ConnectTimeout) as exc:
LOGGER.debug("Proxy timeout when accessing z:%s/x:%s/y:%s from %s", z, x, y, provider)
+ LOGGER.error("Error accessing %s: %s", provider, exc)
request.redis.incr(timeout_tracker)
request.redis.expire(timeout_tracker, PUNISHMENT_TTL)
raise HTTPGatewayTimeout(f"No response in time from {provider}") from None
@@ -422,6 +423,10 @@ def tile_proxy(request):
if exc.response:
status_code = exc.response.status_code
return Response(f"Failed to get tile from {provider}", status_code=status_code)
+ except RequestException as exc:
+ LOGGER.error("Request error for %s: %s", provider, exc)
+ status_code = 500
+ return Response(f"Failed to get tile from {provider}", status_code=status_code)
else:
request.redis.set(cache_key, resp, ex=TTL)
return Response(resp, content_type=content_type)