use weak comparison function when comparing entity-tags

This commit is contained in:
daftshady 2015-03-02 17:34:42 +09:00
parent 8024eee265
commit 8db1f6660b
1 changed files with 16 additions and 4 deletions

View File

@ -1310,15 +1310,27 @@ class RequestHandler(object):
before completing the request. The ``Etag`` header should be set
(perhaps with `set_etag_header`) before calling this method.
"""
etag = self._headers.get("Etag")
computed_etag = self._headers.get("Etag")
# Find all weak and strong etag values from If-None-Match header
# because RFC 7232 allows multiple etag values in a single header.
etags = re.findall(
r'(?:W/)?"[^"]*"',
r'\*|(?:W/)?"[^"]*"',
utf8(self.request.headers.get("If-None-Match", ""))
)
match = etags and ((etags[0] == '"*"') or (etag in etags))
return bool(etag and match)
if not computed_etag or not etags:
return False
match = False
if etags[0] == '*':
match = True
else:
# Use a weak comparison when comparing entity-tags.
val = lambda x: x[2:] if x.startswith('W/') else x
for etag in etags:
if val(etag) == val(computed_etag):
match = True
break
return match
def _stack_context_handle_exception(self, type, value, traceback):
try: