mirror of
https://github.com/denoland/deno.git
synced 2024-12-25 00:29:09 -05:00
fix(ext/flash): panic on AddrInUse (#15607)
This commit is contained in:
parent
376665d115
commit
da10c9c8d1
3 changed files with 42 additions and 6 deletions
|
@ -57,6 +57,35 @@ Deno.test(async function httpServerCanResolveHostnames() {
|
|||
await server;
|
||||
});
|
||||
|
||||
Deno.test(async function httpServerRejectsOnAddrInUse() {
|
||||
const ac = new AbortController();
|
||||
const listeningPromise = deferred();
|
||||
|
||||
const server = Deno.serve({
|
||||
handler: (_req) => new Response("ok"),
|
||||
hostname: "localhost",
|
||||
port: 4501,
|
||||
signal: ac.signal,
|
||||
onListen: onListen(listeningPromise),
|
||||
onError: createOnErrorCb(ac),
|
||||
});
|
||||
|
||||
assertRejects(
|
||||
() =>
|
||||
Deno.serve({
|
||||
handler: (_req) => new Response("ok"),
|
||||
hostname: "localhost",
|
||||
port: 4501,
|
||||
signal: ac.signal,
|
||||
onListen: onListen(listeningPromise),
|
||||
onError: createOnErrorCb(ac),
|
||||
}),
|
||||
Deno.errors.AddrInUse,
|
||||
);
|
||||
ac.abort();
|
||||
await server;
|
||||
});
|
||||
|
||||
Deno.test({ permissions: { net: true } }, async function httpServerBasic() {
|
||||
const ac = new AbortController();
|
||||
const promise = deferred();
|
||||
|
|
|
@ -28,7 +28,7 @@
|
|||
const {
|
||||
Function,
|
||||
ObjectPrototypeIsPrototypeOf,
|
||||
PromiseResolve,
|
||||
PromiseAll,
|
||||
TypedArrayPrototypeSubarray,
|
||||
TypeError,
|
||||
Uint8Array,
|
||||
|
@ -249,7 +249,8 @@
|
|||
|
||||
core.opAsync("op_flash_wait_for_listening", serverId).then((port) => {
|
||||
onListen({ hostname: listenOpts.hostname, port });
|
||||
});
|
||||
}).catch(() => {});
|
||||
const finishedPromise = serverPromise.catch(() => {});
|
||||
|
||||
const server = {
|
||||
id: serverId,
|
||||
|
@ -257,7 +258,7 @@
|
|||
hostname: listenOpts.hostname,
|
||||
port: listenOpts.port,
|
||||
closed: false,
|
||||
finished: PromiseResolve(serverPromise),
|
||||
finished: finishedPromise,
|
||||
async close() {
|
||||
if (server.closed) {
|
||||
return;
|
||||
|
@ -551,7 +552,10 @@
|
|||
}, 1000);
|
||||
}
|
||||
|
||||
return await server.serve().catch(console.error);
|
||||
await PromiseAll([
|
||||
server.serve().catch(console.error),
|
||||
serverPromise,
|
||||
]);
|
||||
}
|
||||
|
||||
function createRequestBodyStream(serverId, token) {
|
||||
|
|
|
@ -1313,8 +1313,11 @@ fn op_flash_wait_for_listening(
|
|||
server_ctx.listening_rx.take().unwrap()
|
||||
};
|
||||
Ok(async move {
|
||||
let port = listening_rx.recv().await.unwrap();
|
||||
if let Some(port) = listening_rx.recv().await {
|
||||
Ok(port)
|
||||
} else {
|
||||
Err(generic_error("This error will be discarded"))
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue