Skip to content

Commit f34e76a

Browse files
littledivybartlomieju
authored andcommitted
fix(ext/fetch): don't throw when bodyUsed inspect after upgrade (#27088)
Fixes #27083
1 parent f49f7a6 commit f34e76a

File tree

2 files changed

+59
-2
lines changed

2 files changed

+59
-2
lines changed

ext/fetch/22_body.js

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -286,8 +286,13 @@ function mixinBody(prototype, bodySymbol, mimeTypeSymbol) {
286286
*/
287287
get() {
288288
webidl.assertBranded(this, prototype);
289-
if (this[bodySymbol] !== null) {
290-
return this[bodySymbol].consumed();
289+
try {
290+
if (this[bodySymbol] !== null) {
291+
return this[bodySymbol].consumed();
292+
}
293+
} catch (_) {
294+
// Request is closed.
295+
return true;
291296
}
292297
return false;
293298
},

tests/unit/serve_test.ts

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4327,3 +4327,55 @@ Deno.test({
43274327

43284328
await server.shutdown();
43294329
});
4330+
4331+
// https://github.com/denoland/deno/issues/27083
4332+
Deno.test(
4333+
{ permissions: { net: true } },
4334+
async function httpServerWebSocketInspectRequest() {
4335+
const ac = new AbortController();
4336+
const listeningDeferred = Promise.withResolvers<void>();
4337+
const doneDeferred = Promise.withResolvers<void>();
4338+
const server = Deno.serve({
4339+
handler: (request) => {
4340+
const {
4341+
response,
4342+
socket,
4343+
} = Deno.upgradeWebSocket(request);
4344+
4345+
socket.onopen = () => {
4346+
Deno.inspect(request); // should not throw
4347+
};
4348+
socket.onerror = (e) => {
4349+
console.error(e);
4350+
fail();
4351+
};
4352+
socket.onmessage = (m) => {
4353+
socket.send(m.data);
4354+
socket.close(1001);
4355+
};
4356+
socket.onclose = () => doneDeferred.resolve();
4357+
return response;
4358+
},
4359+
port: servePort,
4360+
signal: ac.signal,
4361+
onListen: onListen(listeningDeferred.resolve),
4362+
onError: createOnErrorCb(ac),
4363+
});
4364+
4365+
await listeningDeferred.promise;
4366+
const def = Promise.withResolvers<void>();
4367+
const ws = new WebSocket(`ws://localhost:${servePort}`);
4368+
ws.onmessage = (m) => assertEquals(m.data, "foo");
4369+
ws.onerror = (e) => {
4370+
console.error(e);
4371+
fail();
4372+
};
4373+
ws.onclose = () => def.resolve();
4374+
ws.onopen = () => ws.send("foo");
4375+
4376+
await def.promise;
4377+
await doneDeferred.promise;
4378+
ac.abort();
4379+
await server.finished;
4380+
},
4381+
);

0 commit comments

Comments
 (0)