]> Cypherpunks repositories - gostls13.git/commitdiff
net/http: ignore the Unix epoch time in ServeContent
authorBrad Fitzpatrick <bradfitz@golang.org>
Thu, 12 Feb 2015 16:42:11 +0000 (08:42 -0800)
committerBrad Fitzpatrick <bradfitz@golang.org>
Mon, 23 Mar 2015 02:16:56 +0000 (02:16 +0000)
ServeContent ignored zero time.Time{} values when generating
Last-Modified response headers and checking If-Modified-Since request
headers. Do the same for a time.Time representing the Unix epoch zero
value, as this is a common bogus value. Callers who really want to
send that value (incredibly unlikely) can add a nanosecond to it and
it will be truncated to second granularity anyway.

Fixes #9842

Change-Id: I69f697bfc4017404a92a34e3fe57e2711c1e299d
Reviewed-on: https://go-review.googlesource.com/7915
Reviewed-by: David Symonds <dsymonds@golang.org>
src/net/http/fs.go
src/net/http/fs_test.go

index 9a80123f6d8e4805652f65ca8789034790b4bb6c..4e69da8f7fba8030699a8c25c15b2bc53365d62f 100644 (file)
@@ -102,10 +102,10 @@ func dirList(w ResponseWriter, f File) {
 // The name is otherwise unused; in particular it can be empty and is
 // never sent in the response.
 //
-// If modtime is not the zero time, ServeContent includes it in a
-// Last-Modified header in the response.  If the request includes an
-// If-Modified-Since header, ServeContent uses modtime to decide
-// whether the content needs to be sent at all.
+// If modtime is not the zero time or Unix epoch, ServeContent
+// includes it in a Last-Modified header in the response.  If the
+// request includes an If-Modified-Since header, ServeContent uses
+// modtime to decide whether the content needs to be sent at all.
 //
 // The content's Seek method must work: ServeContent uses
 // a seek to the end of the content to determine its size.
@@ -258,10 +258,15 @@ func serveContent(w ResponseWriter, r *Request, name string, modtime time.Time,
        }
 }
 
+var unixEpochTime = time.Unix(0, 0)
+
 // modtime is the modification time of the resource to be served, or IsZero().
 // return value is whether this request is now complete.
 func checkLastModified(w ResponseWriter, r *Request, modtime time.Time) bool {
-       if modtime.IsZero() {
+       if modtime.IsZero() || modtime.Equal(unixEpochTime) {
+               // If the file doesn't have a modtime (IsZero), or the modtime
+               // is obviously garbage (Unix time == 0), then ignore modtimes
+               // and don't process the If-Modified-Since header.
                return false
        }
 
index 72f8c2cf1d67d4c202cf7804a5556ceabb427d65..a8cfe5f4c9dc8f82884cbc526a23dccbd270b9f6 100644 (file)
@@ -751,6 +751,12 @@ func TestServeContent(t *testing.T) {
                        wantContentType: "text/css; charset=utf-8",
                        wantLastMod:     "Wed, 25 Jun 2014 17:12:18 GMT",
                },
+               "unix_zero_modtime": {
+                       content:         strings.NewReader("<html>foo"),
+                       modtime:         time.Unix(0, 0),
+                       wantStatus:      StatusOK,
+                       wantContentType: "text/html; charset=utf-8",
+               },
        }
        for testName, tt := range tests {
                var content io.ReadSeeker