Short circuit GET on ETags match

When client does a conditional GET/HEAD with If-none-match:, if the condition
fails (ie, the client's ETag matches the file's) then we can short-circuit
the whole process and immediately return an empty body.
This commit is contained in:
Jeremy Fitzhardinge 2012-05-12 20:42:52 -07:00 committed by Brian Warner
parent 518ef25bdb
commit 4f1bc1b387

View File

@ -415,12 +415,12 @@ class FileDownloader(rend.Page):
contentsize = filesize
req.setHeader("accept-ranges", "bytes")
if not self.filenode.is_mutable():
# TODO: look more closely at Request.setETag and how it interacts
# with a conditional "if-etag-equals" request, I think this may
# need to occur after the setResponseCode below
# if the client already has the ETag then we can short-circuit
# the whole process.
si = self.filenode.get_storage_index()
if si:
req.setETag(base32.b2a(si))
if si and req.setETag(base32.b2a(si)):
return ""
# TODO: for mutable files, use the roothash. For LIT, hash the data.
# or maybe just use the URI for CHK and LIT.
rangeheader = req.getHeader('range')