]> Cypherpunks repositories - gostls13.git/commitdiff
net/textproto: properly trim continued lines in MIME headers
authorDidier Spezia <didier.06@gmail.com>
Sat, 10 Oct 2015 16:53:09 +0000 (16:53 +0000)
committerBrad Fitzpatrick <bradfitz@golang.org>
Sun, 11 Oct 2015 16:46:15 +0000 (16:46 +0000)
A MIME header can include values defined on several lines.
Only the first line of each value was trimmed.

Make sure all the lines are trimmed before being aggregated.

Fixes #11204

Change-Id: Id92f384044bc6c4ca836e5dba2081fe82c82dc85
Reviewed-on: https://go-review.googlesource.com/15683
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>

src/net/textproto/reader.go
src/net/textproto/reader_test.go

index 91303fec612dfcfc8e21edf9e653ec638ea180ff..17edfadad2d5f54e771f801594895fcdd918450e 100644 (file)
@@ -150,7 +150,7 @@ func (r *Reader) readContinuedLineSlice() ([]byte, error) {
                        break
                }
                r.buf = append(r.buf, ' ')
-               r.buf = append(r.buf, line...)
+               r.buf = append(r.buf, trim(line)...)
        }
        return r.buf, nil
 }
index 8fce7ddeb1e91f0998ad2b804062fb8279ab804b..db7d8ab41cb3bd1d8736e3ab45f0280b33517f8f 100644 (file)
@@ -205,6 +205,32 @@ func TestReadMIMEHeaderNonCompliant(t *testing.T) {
        }
 }
 
+// Test that continued lines are properly trimmed. Issue 11204.
+func TestReadMIMEHeaderTrimContinued(t *testing.T) {
+       // In this header, \n and \r\n terminated lines are mixed on purpose.
+       // We expect each line to be trimmed (prefix and suffix) before being concatenated.
+       // Keep the spaces as they are.
+       r := reader("" + // for code formatting purpose.
+               "a:\n" +
+               " 0 \r\n" +
+               "b:1 \t\r\n" +
+               "c: 2\r\n" +
+               " 3\t\n" +
+               "  \t 4  \r\n\n")
+       m, err := r.ReadMIMEHeader()
+       if err != nil {
+               t.Fatal(err)
+       }
+       want := MIMEHeader{
+               "A": {"0"},
+               "B": {"1"},
+               "C": {"2 3 4"},
+       }
+       if !reflect.DeepEqual(m, want) {
+               t.Fatalf("ReadMIMEHeader mismatch.\n got: %q\nwant: %q", m, want)
+       }
+}
+
 type readResponseTest struct {
        in       string
        inCode   int