Skip to content

Commit 3132bfa

Browse files
committed
cache: add a simple RedisCache implementation (alongside local and uwsgi)
proxy_ip_resolver: add option to use RedisCache if redis_cache_key set in config proxy_ip_resolver: add 'delete' option to delete ip from cache, closes #145
1 parent 16cf997 commit 3132bfa

File tree

3 files changed

+49
-6
lines changed

3 files changed

+49
-6
lines changed

pywb/framework/cache.py

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@
55
uwsgi_cache = False
66

77

8+
from redis import StrictRedis
9+
10+
811
#=================================================================
912
class UwsgiCache(object): # pragma: no cover
1013
def __setitem__(self, item, value):
@@ -27,7 +30,31 @@ def __getitem__(self, item):
2730

2831

2932
#=================================================================
30-
def create_cache():
33+
class RedisCache(object):
34+
def __init__(self, redis_url):
35+
# must be of the form redis://host:port/db/key
36+
redis_url, key = redis_url.rsplit('/', 1)
37+
self.redis = StrictRedis.from_url(redis_url)
38+
self.key = key
39+
40+
def __setitem__(self, item, value):
41+
self.redis.hset(self.key, item, value)
42+
43+
def __getitem__(self, item):
44+
return self.redis.hget(self.key, item)
45+
46+
def __contains__(self, item):
47+
return self.redis.hexists(self.key, item)
48+
49+
def __delitem__(self, item):
50+
self.redis.hdel(self.key, item)
51+
52+
53+
#=================================================================
54+
def create_cache(redis_url_key=None):
55+
if redis_url_key:
56+
return RedisCache(redis_url_key)
57+
3158
if uwsgi_cache: # pragma: no cover
3259
return UwsgiCache()
3360
else:

pywb/framework/proxy_resolvers.py

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ def read_basic_auth_coll(value):
114114
class IPCacheResolver(BaseCollResolver):
115115
def __init__(self, routes, config):
116116
super(IPCacheResolver, self).__init__(routes, config)
117-
self.cache = create_cache()
117+
self.cache = create_cache(config.get('redis_cache_key'))
118118
self.magic_name = config['magic_name']
119119

120120
def _get_ip(self, env):
@@ -131,17 +131,22 @@ def _get_ip(self, env):
131131
def get_proxy_coll_ts(self, env):
132132
ip = env['REMOTE_ADDR']
133133
qs = env.get('pywb.proxy_query')
134+
134135
if qs:
135136
res = urlparse.parse_qs(qs)
136137

137138
if 'ip' in res:
138139
ip = res['ip'][0]
139140

140-
if 'coll' in res:
141-
self.cache[ip + ':c'] = res['coll'][0]
141+
if 'delete' in res:
142+
del self.cache[ip + ':c']
143+
del self.cache[ip + ':t']
144+
else:
145+
if 'coll' in res:
146+
self.cache[ip + ':c'] = res['coll'][0]
142147

143-
if 'ts' in res:
144-
self.cache[ip + ':t'] = res['ts'][0]
148+
if 'ts' in res:
149+
self.cache[ip + ':t'] = res['ts'][0]
145150

146151
coll = self.cache[ip + ':c']
147152
ts = self.cache[ip + ':t']

tests/test_proxy_http_ip.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,3 +81,14 @@ def test_proxy_ip_change_ts_for_ip(self):
8181
resp = self.get_url('http://www.iana.org/', '127.0.0.3')
8282
self._assert_basic_html(resp)
8383
assert '"20140127171238"' in resp.body
84+
85+
def test_proxy_ip_delete_ip(self):
86+
resp = self.get_url('http://info.pywb.proxy/')
87+
assert resp.json == {'ip': '127.0.0.1', 'coll': 'all', 'ts': '1996'}
88+
89+
resp = self.get_url('http://info.pywb.proxy/set?delete=true')
90+
assert resp.json == {'ip': '127.0.0.1', 'coll': None, 'ts': None}
91+
92+
resp = self.get_url('http://info.pywb.proxy/')
93+
assert resp.json == {'ip': '127.0.0.1', 'coll': None, 'ts': None}
94+

0 commit comments

Comments
 (0)