Short circuit GET on ETags match
authorJeremy Fitzhardinge <jeremy@goop.org>
Sun, 13 May 2012 03:42:52 +0000 (20:42 -0700)
committerBrian Warner <warner@lothar.com>
Sun, 13 May 2012 07:45:11 +0000 (00:45 -0700)
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

index fd7e7eb865dbc8183c6be9bbd7550a5459d58e92..634df9c24d5c2d6647ff054c43411870d2abbc7b 100644 (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')