1
0
Fork 0
mirror of https://github.com/denoland/deno.git synced 2024-11-21 15:04:11 -05:00

fix(ext/fetch): do not truncate field value in EventSource (#22368)

Depends on #22493. Closes #22367.
This commit is contained in:
ud2 2024-03-25 22:31:13 +08:00 committed by GitHub
parent bf9c57aeac
commit 5c1fa0cf9c
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 32 additions and 3 deletions

View file

@ -15,7 +15,6 @@ const {
StringPrototypeIncludes,
StringPrototypeIndexOf,
StringPrototypeSlice,
StringPrototypeSplit,
StringPrototypeStartsWith,
StringPrototypeToLowerCase,
SymbolFor,
@ -268,8 +267,10 @@ class EventSource extends EventTarget {
} else {
let field = chunk;
let value = "";
if (StringPrototypeIncludes(chunk, ":")) {
({ 0: field, 1: value } = StringPrototypeSplit(chunk, ":"));
const colonIndex = StringPrototypeIndexOf(chunk, ":");
if (colonIndex !== -1) {
field = StringPrototypeSlice(chunk, 0, colonIndex);
value = StringPrototypeSlice(chunk, colonIndex + 1);
if (StringPrototypeStartsWith(value, " ")) {
value = StringPrototypeSlice(value, 1);
}

View file

@ -30,6 +30,7 @@ util::unit_test_factory!(
error_stack_test,
error_test,
esnext_test,
event_source_test,
event_target_test,
event_test,
fetch_test,

View file

@ -0,0 +1,27 @@
// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
import { assertStrictEquals } from "./test_util.ts";
Deno.test(
{ permissions: { net: ["127.0.0.1"] } },
async function eventSourceColonInMessage() {
const portDeferred = Promise.withResolvers<number>();
await using _server = Deno.serve({
handler: () =>
new Response('data: {"key":"value"}\n\n', {
headers: { "content-type": "text/event-stream" },
}),
onListen: ({ port }) => portDeferred.resolve(port),
hostname: "127.0.0.1",
port: 0,
});
const port = await portDeferred.promise;
const eventSource = new EventSource(`http://127.0.0.1:${port}/`);
const event = await new Promise<MessageEvent>((resolve) =>
eventSource.onmessage = resolve
);
eventSource.close();
assertStrictEquals(event.data, '{"key":"value"}');
},
);