7 class SafeHTTPCache(object):
8 """Thread-safe replacement for httplib2.FileCache"""
10 def __init__(self, path=None, max_age=None):
12 if max_age is not None:
14 self._clean(threshold=time.time() - max_age)
18 def _clean(self, threshold=0):
19 for ent in os.listdir(self._dir):
20 fnm = os.path.join(self._dir, ent)
21 if os.path.isdir(fnm) or not fnm.endswith('.tmp'):
24 if stat.st_mtime < threshold:
27 except OSError as err:
28 if err.errno != errno.ENOENT:
34 def _filename(self, url):
35 return os.path.join(self._dir, md5.new(url).hexdigest()+'.tmp')
38 filename = self._filename(url)
40 with open(filename, 'rb') as f:
42 except IOError, OSError:
45 def set(self, url, content):
47 fd, tempname = tempfile.mkstemp(dir=self._dir)
52 f = os.fdopen(fd, 'w')
60 os.rename(tempname, self._filename(url))
66 def delete(self, url):
68 os.unlink(self._filename(url))
69 except OSError as err:
70 if err.errno != errno.ENOENT: