1 from builtins import object
8 class SafeHTTPCache(object):
9 """Thread-safe replacement for httplib2.FileCache"""
11 def __init__(self, path=None, max_age=None):
13 if max_age is not None:
15 self._clean(threshold=time.time() - max_age)
19 def _clean(self, threshold=0):
20 for ent in os.listdir(self._dir):
21 fnm = os.path.join(self._dir, ent)
22 if os.path.isdir(fnm) or not fnm.endswith('.tmp'):
25 if stat.st_mtime < threshold:
28 except OSError as err:
29 if err.errno != errno.ENOENT:
35 def _filename(self, url):
36 return os.path.join(self._dir, hashlib.md5(url.encode('utf-8')).hexdigest()+'.tmp')
39 filename = self._filename(url)
41 with open(filename, 'rb') as f:
43 except (IOError, OSError):
46 def set(self, url, content):
48 fd, tempname = tempfile.mkstemp(dir=self._dir)
53 f = os.fdopen(fd, 'wb')
61 os.rename(tempname, self._filename(url))
67 def delete(self, url):
69 os.unlink(self._filename(url))
70 except OSError as err:
71 if err.errno != errno.ENOENT: