diff --git a/std/textproto/mod.ts b/std/textproto/mod.ts index 06ffb73640..218ec9d442 100644 --- a/std/textproto/mod.ts +++ b/std/textproto/mod.ts @@ -74,22 +74,16 @@ export class TextProtoReader { if (kv === Deno.EOF) throw new Deno.errors.UnexpectedEof(); if (kv.byteLength === 0) return m; - // Key ends at first colon; should not have trailing spaces - // but they appear in the wild, violating specs, so we remove - // them if present. + // Key ends at first colon let i = kv.indexOf(charCode(":")); if (i < 0) { throw new Deno.errors.InvalidData( `malformed MIME header line: ${str(kv)}` ); } - let endKey = i; - while (endKey > 0 && kv[endKey - 1] == charCode(" ")) { - endKey--; - } //let key = canonicalMIMEHeaderKey(kv.subarray(0, endKey)); - const key = str(kv.subarray(0, endKey)); + const key = str(kv.subarray(0, i)); // As per RFC 7230 field-name is a token, // tokens consist of one or more chars. diff --git a/std/textproto/test.ts b/std/textproto/test.ts index 5833935baa..b9947ab33a 100644 --- a/std/textproto/test.ts +++ b/std/textproto/test.ts @@ -94,7 +94,7 @@ test({ }, }); -// Test that we read slightly-bogus MIME headers seen in the wild, +// Test that we don't read MIME headers seen in the wild, // with spaces before colons, and spaces in keys. test({ name: "[textproto] Reader : MIME Header Non compliant", @@ -109,9 +109,10 @@ test({ const m = assertNotEOF(await r.readMIMEHeader()); assertEquals(m.get("Foo"), "bar"); assertEquals(m.get("Content-Language"), "en"); - assertEquals(m.get("SID"), "0"); - assertEquals(m.get("Privilege"), "127"); - // Not a legal http header + // Make sure we drop headers with trailing whitespace + assertEquals(m.get("SID"), null); + assertEquals(m.get("Privilege"), null); + // Not legal http header assertThrows((): void => { assertEquals(m.get("Audio Mode"), "None"); });