@@ -53,6 +53,33 @@ describe("MIME parser", () => {
|
||||
});
|
||||
});
|
||||
|
||||
it("preserves arbitrary source octets and exact multipart byte ranges", () => {
|
||||
const prefix = new TextEncoder().encode(
|
||||
"From: a@example.test\r\nContent-Type: multipart/mixed; boundary=x\r\n\r\n--x\r\nContent-Type: application/octet-stream\r\n\r\n",
|
||||
);
|
||||
const suffix = new TextEncoder().encode("\r\n--x--\r\n");
|
||||
const bytes = new Uint8Array(prefix.length + 4 + suffix.length);
|
||||
bytes.set(prefix);
|
||||
bytes.set([0x80, 0x81, 0xfe, 0xff], prefix.length);
|
||||
bytes.set(suffix, prefix.length + 4);
|
||||
const parsed = parseMessage(bytes);
|
||||
expect([...parsed.root.children[0]!.bytes]).toEqual([
|
||||
0x80, 0x81, 0xfe, 0xff,
|
||||
]);
|
||||
expect([...parsed.rawBytes]).toEqual([...bytes]);
|
||||
const range = parsed.root.children[0]!.sourceRange!;
|
||||
expect([...parsed.rawBytes.slice(range.bodyStart, range.end)]).toEqual([
|
||||
0x80, 0x81, 0xfe, 0xff,
|
||||
]);
|
||||
});
|
||||
|
||||
it("assembles RFC 2231 parameter continuations", () => {
|
||||
const parsed = parseMessage(
|
||||
"From: a@example.test\r\nContent-Type: application/octet-stream\r\nContent-Disposition: attachment; filename*0*=UTF-8''long%20; filename*1*=name%E2%9C%93.bin\r\n\r\ndata",
|
||||
);
|
||||
expect(attachments(parsed.root)[0]?.filename).toBe("long name✓.bin");
|
||||
});
|
||||
|
||||
it("parses nested message/rfc822 entities", () => {
|
||||
const parsed = parseMessage(
|
||||
"From: a@example.test\nContent-Type: message/rfc822\n\nFrom: b@example.test\nContent-Type: text/plain\n\nnested",
|
||||
|
||||
Reference in New Issue
Block a user