Commit 6f772787 authored by Didier Spezia's avatar Didier Spezia Committed by Brad Fitzpatrick

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/15683Reviewed-by: 's avatarBrad Fitzpatrick <bradfitz@golang.org>
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
parent c478c485
......@@ -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
}
......
......@@ -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
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment