-
Notifications
You must be signed in to change notification settings - Fork 0
/
Memcache_Wrapper.py
130 lines (105 loc) · 4.3 KB
/
Memcache_Wrapper.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
"""
__author__ = 'Keyur Patel'
__Purpose__ = This Memcache wrapper is designed to work close with google memcache with more developer's custom way.
It has two classes BaseClass (MemCache_Wrapper) and DerivedClass (Etags_Wrapper).
MemCache_Wrapper - Contains custom memchace methods.
Etags_Wrapper - This derived class generates the md5 hash etags and does logic of returning 304 status or cache data.
"""
import datetime
import hashlib
import logging
from google.appengine.api import memcache
#Date Formats
HTTP_DATE_FMT = "%a, %d %b %Y %H:%M:%S %Z"
REMOVE_MILLI_SEC = "%Y-%m-%d %H:%M:%S"
"""
BaseClass:
1) Extended the GAE memcache functionality to use all the memcache methods in customized fashion.
"""
class Memcache_Wrapper(memcache.Client):
"""
add(key, value, time=0, min_compress_len=0, namespace=None)
"""
def add(self, key, value, time=0, min_compress_len=0, namespace=None):
#object of Etags_Wrapper
ew = Etags_Wrapper()
#Actual Json dump
memcache.add(key,value,time)
#generate Last modified datetime for etags
last_mod_date_key = key + "_lastmoddate"
memcache.add(last_mod_date_key,str(datetime.datetime.utcnow().strftime(REMOVE_MILLI_SEC)),time)
#generate etag # value and add it to memcache
hash_etagsvalue = ew.generate_etags(value)
hash_etagskey = key + "_etags"
memcache.add(hash_etagskey,hash_etagsvalue,time)
return
"""
set(key, value, time=0, min_compress_len=0, namespace=None)
"""
def set(self, key, value, time=0, min_compress_len=0, namespace=None):
#object of Etags_Wrapper
ew = Etags_Wrapper()
#Actual Json dump
memcache.set(key,value,time)
#generate Last modified datetime for etags
last_mod_date_key = key + "_lastmoddate"
memcache.set(last_mod_date_key,str(datetime.datetime.utcnow().strftime(REMOVE_MILLI_SEC)),time)
#generate etag # value and add it to memcache
hash_etagsvalue = ew.generate_etags(value)
hash_etagskey = key + "_etags"
memcache.set(hash_etagskey,hash_etagsvalue,time)
return
"""
get(key, namespace=None, for_cas=False)
"""
def get(self,key, namespace=None, for_cas=False):
return memcache.get(key)
"""
delete(key, seconds=0, namespace=None)
"""
def delete(self,key, seconds=0, namespace=None):
memcache.delete(key,seconds,namespace)
last_mod_date_key = key + "_lastmoddate"
memcache.delete(last_mod_date_key,seconds,namespace)
hash_etagskey = key + "_etags"
memcache.delete(hash_etagskey,seconds,namespace)
return
"""
Derived Class:
1) Generates the etags hash value
2) returns the 304
3) adds the etag and last-modified date in response header
"""
class Etags_Wrapper(Memcache_Wrapper):
def generate_etags(self,etagkey):
hash_value = hashlib.md5(str(etagkey)).hexdigest()
return hash_value
def set_etags_header(self, etagkey, response):
last_mod_date_key = etagkey + "_lastmoddate"
hash_etagkey = etagkey+"_etags"
response.headers['Last-Modified'] = memcache.get(last_mod_date_key) or ""
response.headers['ETag'] = memcache.get(hash_etagkey) or ""
return response
def get_etags(self,etagkey,headers):
"""
#loop to check the header contents.
for e in headers:
#self.response.write(e + "<br />")
logging.info("Header info - " + e + " value - "+ headers[e] +"<br />")
"""
m = Memcache_Wrapper()
etags_value = ['0']
client_lastmodedate = ""
hash_etagkey = etagkey+"_etags"
hash_etagsvalue = m.get(hash_etagkey) # value from the cache
last_mod_date_key = etagkey + "_lastmoddate"
lastmoddate_value = m.get(last_mod_date_key) # value from the cache for lastmoddate
# value from the header
if 'If-None-Match' in headers:
etags_value = [x.strip('" ') for x in headers['If-None-Match'].split(',')]
if 'If-Modified-Since' in headers:
client_lastmodedate = str(datetime.datetime.strptime(headers['If-Modified-Since'],HTTP_DATE_FMT))
if etags_value[0] == hash_etagsvalue and client_lastmodedate == lastmoddate_value:
return True
else:
return False