From 4f1bc1b3873d0349039d98b4c679af247936fc97 Mon Sep 17 00:00:00 2001 From: Jeremy Fitzhardinge <jeremy@goop.org> Date: Sat, 12 May 2012 20:42:52 -0700 Subject: [PATCH] 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. --- src/allmydata/web/filenode.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/allmydata/web/filenode.py b/src/allmydata/web/filenode.py index fd7e7eb8..634df9c2 100644 --- a/src/allmydata/web/filenode.py +++ b/src/allmydata/web/filenode.py @@ -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') -- 2.45.2