forked from Silverfish/proton-bridge
GODT-1044: fix header lines parsing
This commit is contained in:
@ -35,11 +35,15 @@ func HeaderLines(header []byte) [][]byte {
|
|||||||
)
|
)
|
||||||
|
|
||||||
forEachLine(bufio.NewReader(bytes.NewReader(header)), func(line []byte) {
|
forEachLine(bufio.NewReader(bytes.NewReader(header)), func(line []byte) {
|
||||||
|
l := bytes.SplitN(line, []byte(`: `), 2)
|
||||||
|
isLineContinuation := quote%2 != 0 || // no quotes opened
|
||||||
|
len(l) != 2 || // it doesn't have colon
|
||||||
|
(len(l) == 2 && !bytes.Equal(bytes.TrimSpace(l[0]), l[0])) // has white space in front of header field
|
||||||
switch {
|
switch {
|
||||||
case len(bytes.TrimSpace(line)) == 0:
|
case len(bytes.TrimSpace(line)) == 0:
|
||||||
lines = append(lines, line)
|
lines = append(lines, line)
|
||||||
|
|
||||||
case quote%2 != 0, len(bytes.SplitN(line, []byte(`: `), 2)) != 2:
|
case isLineContinuation:
|
||||||
if len(lines) > 0 {
|
if len(lines) > 0 {
|
||||||
lines[len(lines)-1] = append(lines[len(lines)-1], line...)
|
lines[len(lines)-1] = append(lines[len(lines)-1], line...)
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@ -24,14 +24,19 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func TestHeaderLines(t *testing.T) {
|
func TestHeaderLines(t *testing.T) {
|
||||||
const header = "To: somebody\r\nFrom: somebody else\r\nSubject: this is\r\n\ta multiline field\r\n\r\n"
|
want := [][]byte{
|
||||||
|
|
||||||
assert.Equal(t, [][]byte{
|
|
||||||
[]byte("To: somebody\r\n"),
|
[]byte("To: somebody\r\n"),
|
||||||
[]byte("From: somebody else\r\n"),
|
[]byte("From: somebody else\r\n"),
|
||||||
[]byte("Subject: this is\r\n\ta multiline field\r\n"),
|
[]byte("Subject: RE: this is\r\n\ta multiline field: with colon\r\n\tor: many: more: colons\r\n"),
|
||||||
|
[]byte("X-Special: \r\n\tNothing on the first line\r\n\tbut has something on the other lines\r\n"),
|
||||||
[]byte("\r\n"),
|
[]byte("\r\n"),
|
||||||
}, HeaderLines([]byte(header)))
|
}
|
||||||
|
var header []byte
|
||||||
|
for _, line := range want {
|
||||||
|
header = append(header, line...)
|
||||||
|
}
|
||||||
|
|
||||||
|
assert.Equal(t, want, HeaderLines(header))
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestHeaderLinesMultilineFilename(t *testing.T) {
|
func TestHeaderLinesMultilineFilename(t *testing.T) {
|
||||||
|
|||||||
Reference in New Issue
Block a user