aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDidier Spezia <didier.06@gmail.com>2015-10-10 16:53:09 +0000
committerBrad Fitzpatrick <bradfitz@golang.org>2015-10-11 16:46:15 +0000
commit6f772787f97720aeeb98d37b2c63b1a3155588d1 (patch)
tree75f551c864da32c65182c35047c6cf82c0f77815 /src
parentc478c48597e2fb7c52ea39d1dde51448949860ce (diff)
downloadgo-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.go2
-rw-r--r--src/net/textproto/reader_test.go26
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