Source code for sr.tools.bom.cachedfetch

"""Routines for grabbing a page, with caching."""
import hashlib
import os
import time

from six.moves.urllib.error import HTTPError
from six.moves.urllib.request import urlopen

from sr.tools.environment import get_cache_dir

# Number of seconds for the cache to last for
CACHE_LIFE = 36000


[docs]def grab_url_cached(url): """ Download a possibly cached URL. :returns: The contents of the page. """ cache_dir = get_cache_dir('urls') h = hashlib.sha1() h.update(url.encode('UTF-8')) F = os.path.join(cache_dir, h.hexdigest()) if os.path.exists(F) and (time.time() - os.path.getmtime(F)) < CACHE_LIFE: with open(F) as file: page = file.read() else: # try the remote supplier page cache try: base_url = "https://www.studentrobotics.org/~rspanton/supcache/{}" cached_url = base_url.format(h.hexdigest()) sc = urlopen(cached_url) page = sc.read() except HTTPError: page = urlopen(url).read() with open(F, 'wb') as file: file.write(page) return page