]> Cypherpunks repositories - gostls13.git/commitdiff
mime/multipart: switch from map to MIMEHeader
authorBrad Fitzpatrick <bradfitz@golang.org>
Sun, 6 Mar 2011 23:12:03 +0000 (15:12 -0800)
committerBrad Fitzpatrick <bradfitz@golang.org>
Sun, 6 Mar 2011 23:12:03 +0000 (15:12 -0800)
R=rsc
CC=golang-dev
https://golang.org/cl/4253058

src/pkg/mime/multipart/multipart.go
src/pkg/mime/multipart/multipart_test.go

index 1d855c74c9d493c41b348349354ebc46a4c110d4..0a65a447db999ec90527b56b17de7990f960d02e 100644 (file)
@@ -17,6 +17,7 @@ import (
        "bytes"
        "io"
        "mime"
+       "net/textproto"
        "os"
        "regexp"
        "strings"
@@ -40,7 +41,7 @@ type Part struct {
        // The headers of the body, if any, with the keys canonicalized
        // in the same fashion that the Go http.Request headers are.
        // i.e. "foo-bar" changes case to "Foo-Bar"
-       Header map[string]string
+       Header textproto.MIMEHeader
 
        buffer *bytes.Buffer
        mr     *multiReader
@@ -51,8 +52,8 @@ type Part struct {
 func (p *Part) FormName() string {
        // See http://tools.ietf.org/html/rfc2183 section 2 for EBNF
        // of Content-Disposition value format.
-       v, ok := p.Header["Content-Disposition"]
-       if !ok {
+       v := p.Header.Get("Content-Disposition")
+       if v == "" {
                return ""
        }
        d, params := mime.ParseMediaType(v)
@@ -85,7 +86,7 @@ var devNull = devNullWriter(false)
 
 func newPart(mr *multiReader) (bp *Part, err os.Error) {
        bp = new(Part)
-       bp.Header = make(map[string]string)
+       bp.Header = make(map[string][]string)
        bp.mr = mr
        bp.buffer = new(bytes.Buffer)
        if err = bp.populateHeaders(); err != nil {
@@ -104,10 +105,7 @@ func (bp *Part) populateHeaders() os.Error {
                        return nil
                }
                if matches := headerRegexp.FindStringSubmatch(line); len(matches) == 3 {
-                       key := matches[1]
-                       value := matches[2]
-                       // TODO: canonicalize headers ala http.Request.Header?
-                       bp.Header[key] = value
+                       bp.Header.Add(matches[1], matches[2])
                        continue
                }
                return os.NewError("Unexpected header line found parsing multipart body")
index 7e1ed133ecfa3f7b5bc193c4309a78a4553765c8..1f3d32d7ed6e91bd20698e21fac4b8b3a7988ae4 100644 (file)
@@ -58,7 +58,7 @@ func expectEq(t *testing.T, expected, actual, what string) {
 
 func TestFormName(t *testing.T) {
        p := new(Part)
-       p.Header = make(map[string]string)
+       p.Header = make(map[string][]string)
        tests := [...][2]string{
                {`form-data; name="foo"`, "foo"},
                {` form-data ; name=foo`, "foo"},
@@ -69,7 +69,7 @@ func TestFormName(t *testing.T) {
                {` FORM-DATA ; filename="foo.txt"; name=foo; baz=quux`, "foo"},
        }
        for _, test := range tests {
-               p.Header["Content-Disposition"] = test[0]
+               p.Header.Set("Content-Disposition", test[0])
                expected := test[1]
                actual := p.FormName()
                if actual != expected {
@@ -114,12 +114,15 @@ never read data
                t.Error("Expected part1")
                return
        }
-       if part.Header["Header1"] != "value1" {
+       if part.Header.Get("Header1") != "value1" {
                t.Error("Expected Header1: value")
        }
-       if part.Header["foo-bar"] != "baz" {
+       if part.Header.Get("foo-bar") != "baz" {
                t.Error("Expected foo-bar: baz")
        }
+       if part.Header.Get("Foo-Bar") != "baz" {
+               t.Error("Expected Foo-Bar: baz")
+       }
        buf.Reset()
        io.Copy(buf, part)
        expectEq(t, "My value\r\nThe end.",
@@ -131,7 +134,7 @@ never read data
                t.Error("Expected part2")
                return
        }
-       if part.Header["foo-bar"] != "bazb" {
+       if part.Header.Get("foo-bar") != "bazb" {
                t.Error("Expected foo-bar: bazb")
        }
        buf.Reset()