diff options
| author | Didier Spezia <didier.06@gmail.com> | 2015-10-10 16:53:09 +0000 |
|---|---|---|
| committer | Brad Fitzpatrick <bradfitz@golang.org> | 2015-10-11 16:46:15 +0000 |
| commit | 6f772787f97720aeeb98d37b2c63b1a3155588d1 (patch) | |
| tree | 75f551c864da32c65182c35047c6cf82c0f77815 /src | |
| parent | c478c48597e2fb7c52ea39d1dde51448949860ce (diff) | |
| download | go-6f772787f97720aeeb98d37b2c63b1a3155588d1.tar.xz | |
net/textproto: properly trim continued lines in MIME headers
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>
Diffstat (limited to 'src')
| -rw-r--r-- | src/net/textproto/reader.go | 2 | ||||
| -rw-r--r-- | src/net/textproto/reader_test.go | 26 |
2 files changed, 27 insertions, 1 deletions
diff --git a/src/net/textproto/reader.go b/src/net/textproto/reader.go index 91303fec61..17edfadad2 100644 --- a/src/net/textproto/reader.go +++ b/src/net/textproto/reader.go @@ -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 } diff --git a/src/net/textproto/reader_test.go b/src/net/textproto/reader_test.go index 8fce7ddeb1..db7d8ab41c 100644 --- a/src/net/textproto/reader_test.go +++ b/src/net/textproto/reader_test.go @@ -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 |
