From: Jeremy Fitzhardinge <jeremy@goop.org>
Date: Sun, 13 May 2012 03:42:52 +0000 (-0700)
Subject: Short circuit GET on ETags match
X-Git-Url: https://git.rkrishnan.org/%5B/frontends/%22news.html/$rel_link?a=commitdiff_plain;h=4f1bc1b3873d0349039d98b4c679af247936fc97;p=tahoe-lafs%2Ftahoe-lafs.git

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.
---

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')