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