1
0
mirror of https://github.com/golang/go synced 2024-11-18 08:54:45 -07:00

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>
This commit is contained in:
Didier Spezia 2015-10-10 16:53:09 +00:00 committed by Brad Fitzpatrick
parent c478c48597
commit 6f772787f9
2 changed files with 27 additions and 1 deletions

View 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
}

View 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