forked from Silverfish/proton-bridge
fix(BRIDGE-256): fix reversed order of headers with multiple values.
This commit is contained in:
@ -531,11 +531,12 @@ func toMessageHeader(hdr proton.Headers) message.Header {
|
|||||||
// go-message's message.Header are in reversed order (you should only add fields at the top, so storing in reverse order offer faster performances).
|
// go-message's message.Header are in reversed order (you should only add fields at the top, so storing in reverse order offer faster performances).
|
||||||
for i := len(hdr.Order) - 1; i >= 0; i-- {
|
for i := len(hdr.Order) - 1; i >= 0; i-- {
|
||||||
key := hdr.Order[i]
|
key := hdr.Order[i]
|
||||||
for _, val := range hdr.Values[key] {
|
values := hdr.Values[key]
|
||||||
|
for j := len(values) - 1; j >= 0; j-- {
|
||||||
// Using AddRaw instead of Add to save key-value pair as byte buffer within Header.
|
// Using AddRaw instead of Add to save key-value pair as byte buffer within Header.
|
||||||
// This buffer is used latter on in message writer to construct message and avoid crash
|
// This buffer is used latter on in message writer to construct message and avoid crash
|
||||||
// when key length is more than 76 characters long.
|
// when key length is more than 76 characters long.
|
||||||
res.AddRaw([]byte(key + ": " + val + "\r\n"))
|
res.AddRaw([]byte(key + ": " + values[j] + "\r\n"))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -101,6 +101,11 @@ func newTestMessageFromRFC822(t *testing.T, literal []byte) proton.Message {
|
|||||||
var parsedHeaders proton.Headers
|
var parsedHeaders proton.Headers
|
||||||
parsedHeaders.Values = make(map[string][]string)
|
parsedHeaders.Values = make(map[string][]string)
|
||||||
h.Entries(func(key, val string) {
|
h.Entries(func(key, val string) {
|
||||||
|
currentVal, ok := parsedHeaders.Values[key]
|
||||||
|
if ok {
|
||||||
|
parsedHeaders.Values[key] = append(currentVal, val)
|
||||||
|
return
|
||||||
|
}
|
||||||
parsedHeaders.Values[key] = []string{val}
|
parsedHeaders.Values[key] = []string{val}
|
||||||
parsedHeaders.Order = append(parsedHeaders.Order, key)
|
parsedHeaders.Order = append(parsedHeaders.Order, key)
|
||||||
})
|
})
|
||||||
|
|||||||
@ -145,6 +145,9 @@ From: Dummy Recipient <dummy@proton.me>
|
|||||||
Date: Tue, 15 Oct 2024 07:54:39 +0000
|
Date: Tue, 15 Oct 2024 07:54:39 +0000
|
||||||
Mime-Version: 1.0
|
Mime-Version: 1.0
|
||||||
Content-Type: multipart/mixed;boundary=---------------------a136fc3851075ca3f022f5c3ec6bf8f5
|
Content-Type: multipart/mixed;boundary=---------------------a136fc3851075ca3f022f5c3ec6bf8f5
|
||||||
|
X-Attached: image1.jpg
|
||||||
|
X-Attached: image2.jpg
|
||||||
|
X-Attached: image3.jpg
|
||||||
Message-Id: <1rYR51zNVZdyCXVvAZ8C9N8OaBg4wO_wg6VlSoLK_Mv-2AaiF5UL-vE_tIZ6FdYP8ylsuV3fpaKUpVwuUcnQ6ql_83aEgZvfC5QcZbind1k=@proton.me>
|
Message-Id: <1rYR51zNVZdyCXVvAZ8C9N8OaBg4wO_wg6VlSoLK_Mv-2AaiF5UL-vE_tIZ6FdYP8ylsuV3fpaKUpVwuUcnQ6ql_83aEgZvfC5QcZbind1k=@proton.me>
|
||||||
X-Pm-Spamscore: 0
|
X-Pm-Spamscore: 0
|
||||||
Received: from mail.protonmail.ch by mail.protonmail.ch; Tue, 15 Oct 2024 07:54:43 +0000
|
Received: from mail.protonmail.ch by mail.protonmail.ch; Tue, 15 Oct 2024 07:54:43 +0000
|
||||||
@ -178,7 +181,7 @@ lorem`)
|
|||||||
lines := strings.Split(str, "\r\n")
|
lines := strings.Split(str, "\r\n")
|
||||||
|
|
||||||
// Check we have the expected order
|
// Check we have the expected order
|
||||||
require.Equal(t, len(lines), 17)
|
require.Equal(t, len(lines), 20)
|
||||||
|
|
||||||
// The fields added or modified are at the top
|
// The fields added or modified are at the top
|
||||||
require.True(t, strings.HasPrefix(lines[0], "Content-Type: multipart/mixed;boundary=")) // we changed the boundary
|
require.True(t, strings.HasPrefix(lines[0], "Content-Type: multipart/mixed;boundary=")) // we changed the boundary
|
||||||
@ -194,10 +197,13 @@ lorem`)
|
|||||||
require.Equal(t, `Subject: header test`, lines[8])
|
require.Equal(t, `Subject: header test`, lines[8])
|
||||||
require.Equal(t, `Date: Tue, 15 Oct 2024 07:54:39 +0000`, lines[9])
|
require.Equal(t, `Date: Tue, 15 Oct 2024 07:54:39 +0000`, lines[9])
|
||||||
require.Equal(t, `Mime-Version: 1.0`, lines[10])
|
require.Equal(t, `Mime-Version: 1.0`, lines[10])
|
||||||
require.Equal(t, `Message-Id: <1rYR51zNVZdyCXVvAZ8C9N8OaBg4wO_wg6VlSoLK_Mv-2AaiF5UL-vE_tIZ6FdYP8ylsuV3fpaKUpVwuUcnQ6ql_83aEgZvfC5QcZbind1k=@proton.me>`, lines[11])
|
require.Equal(t, `X-Attached: image1.jpg`, lines[11])
|
||||||
require.Equal(t, `X-Pm-Spamscore: 0`, lines[12])
|
require.Equal(t, `X-Attached: image2.jpg`, lines[12])
|
||||||
require.Equal(t, `Received: from mail.protonmail.ch by mail.protonmail.ch; Tue, 15 Oct 2024 07:54:43 +0000`, lines[13])
|
require.Equal(t, `X-Attached: image3.jpg`, lines[13])
|
||||||
require.Equal(t, `X-Original-To: test@proton.me`, lines[14])
|
require.Equal(t, `Message-Id: <1rYR51zNVZdyCXVvAZ8C9N8OaBg4wO_wg6VlSoLK_Mv-2AaiF5UL-vE_tIZ6FdYP8ylsuV3fpaKUpVwuUcnQ6ql_83aEgZvfC5QcZbind1k=@proton.me>`, lines[14])
|
||||||
require.Equal(t, `Return-Path: <dummy@proton.me>`, lines[15])
|
require.Equal(t, `X-Pm-Spamscore: 0`, lines[15])
|
||||||
require.Equal(t, `Delivered-To: test@proton.me`, lines[16])
|
require.Equal(t, `Received: from mail.protonmail.ch by mail.protonmail.ch; Tue, 15 Oct 2024 07:54:43 +0000`, lines[16])
|
||||||
|
require.Equal(t, `X-Original-To: test@proton.me`, lines[17])
|
||||||
|
require.Equal(t, `Return-Path: <dummy@proton.me>`, lines[18])
|
||||||
|
require.Equal(t, `Delivered-To: test@proton.me`, lines[19])
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user