]> Cypherpunks repositories - gostls13.git/commitdiff
net/http: added ParseTime function.
authorPatrick Higgins <patrick.allen.higgins@gmail.com>
Fri, 31 Aug 2012 22:10:16 +0000 (18:10 -0400)
committerRuss Cox <rsc@golang.org>
Fri, 31 Aug 2012 22:10:16 +0000 (18:10 -0400)
Parses a time header value into a time.Time according to rfc2616 sec 3.3.

R=golang-dev, dave, rsc, r
CC=bradfitz, golang-dev
https://golang.org/cl/6344046

src/pkg/net/http/header.go
src/pkg/net/http/header_test.go

index 6858cb29d2f533b790507e6232c6214d9f632ff1..91417366ae8c55dd86f1b72e4e63586786d4a893 100644 (file)
@@ -9,6 +9,7 @@ import (
        "net/textproto"
        "sort"
        "strings"
+       "time"
 )
 
 // A Header represents the key-value pairs in an HTTP header.
@@ -53,6 +54,25 @@ func (h Header) Write(w io.Writer) error {
        return h.WriteSubset(w, nil)
 }
 
+var timeFormats = []string{
+       TimeFormat,
+       time.RFC850,
+       time.ANSIC,
+}
+
+// ParseTime parses a time header (such as the Date: header),
+// trying each of the three formats allowed by HTTP/1.1:
+// TimeFormat, time.RFC850, and time.ANSIC.
+func ParseTime(text string) (t time.Time, err error) {
+       for _, layout := range timeFormats {
+               t, err = time.Parse(layout, text)
+               if err == nil {
+                       return
+               }
+       }
+       return
+}
+
 var headerNewlineToSpace = strings.NewReplacer("\n", " ", "\r", " ")
 
 type writeStringer interface {
index eb2ac0d91cea674b236eaae442baa7bc4418a710..fd971a61d054d0416d9e3a520e5ab367f6a0b2eb 100644 (file)
@@ -8,6 +8,7 @@ import (
        "bytes"
        "runtime"
        "testing"
+       "time"
 )
 
 var headerWriteTests = []struct {
@@ -99,6 +100,38 @@ func TestHeaderWrite(t *testing.T) {
        }
 }
 
+var parseTimeTests = []struct {
+       h   Header
+       err bool
+}{
+       {Header{"Date": {""}}, true},
+       {Header{"Date": {"invalid"}}, true},
+       {Header{"Date": {"1994-11-06T08:49:37Z00:00"}}, true},
+       {Header{"Date": {"Sun, 06 Nov 1994 08:49:37 GMT"}}, false},
+       {Header{"Date": {"Sunday, 06-Nov-94 08:49:37 GMT"}}, false},
+       {Header{"Date": {"Sun Nov  6 08:49:37 1994"}}, false},
+}
+
+func TestParseTime(t *testing.T) {
+       expect := time.Date(1994, 11, 6, 8, 49, 37, 0, time.UTC)
+       for i, test := range parseTimeTests {
+               d, err := ParseTime(test.h.Get("Date"))
+               if err != nil {
+                       if !test.err {
+                               t.Errorf("#%d:\n got err: %v", i, err)
+                       }
+                       continue
+               }
+               if test.err {
+                       t.Errorf("#%d:\n  should err", i)
+                       continue
+               }
+               if !expect.Equal(d) {
+                       t.Errorf("#%d:\n got: %v\nwant: %v", i, d, expect)
+               }
+       }
+}
+
 type hasTokenTest struct {
        header string
        token  string