From 714461d1d0a76a55fd41f30f53559d3a9c46a820 Mon Sep 17 00:00:00 2001 From: Thomas Sileo Date: Fri, 22 Jun 2018 23:46:38 +0200 Subject: [PATCH] Add caching to urlutils.check_url --- little_boxes/activitypub.py | 3 +-- little_boxes/urlutils.py | 10 ++++++++++ 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/little_boxes/activitypub.py b/little_boxes/activitypub.py index 619c3d6..8f66b71 100644 --- a/little_boxes/activitypub.py +++ b/little_boxes/activitypub.py @@ -15,11 +15,10 @@ from .backend import Backend from .collection import parse_collection from .errors import BadActivityError from .errors import Error -from .errors import RemoteActivityGoneError from .errors import NotFromOutboxError +from .errors import RemoteActivityGoneError from .errors import UnexpectedActivityTypeError - logger = logging.getLogger(__name__) UninitializedBackendError = Error("a backend must be initialized") diff --git a/little_boxes/urlutils.py b/little_boxes/urlutils.py index 3729e01..e962ed7 100644 --- a/little_boxes/urlutils.py +++ b/little_boxes/urlutils.py @@ -2,6 +2,7 @@ import ipaddress import logging import os import socket +from typing import Dict from urllib.parse import urlparse from . import strtobool @@ -10,6 +11,9 @@ from .errors import Error logger = logging.getLogger(__name__) +_CACHE: Dict[str, bool] = {} + + class InvalidURLError(Error): pass @@ -27,6 +31,9 @@ def is_url_valid(url: str) -> bool: if parsed.hostname in ["localhost"]: return False + if _CACHE.get(parsed.hostname, False): + return True + try: ip_address = ipaddress.ip_address(parsed.hostname) except ValueError: @@ -35,14 +42,17 @@ def is_url_valid(url: str) -> bool: logger.debug(f"dns lookup: {parsed.hostname} -> {ip_address}") except socket.gaierror: logger.exception(f"failed to lookup url {url}") + _CACHE[parsed.hostname] = False return False logger.debug(f"{ip_address}") if ipaddress.ip_address(ip_address).is_private: logger.info(f"rejecting private URL {url}") + _CACHE[parsed.hostname] = False return False + _CACHE[parsed.hostname] = True return True