From c11e2c74e874af29b6ade13ee4ab51a72853d726 Mon Sep 17 00:00:00 2001 From: Yazan AbdAl-Rahman Date: Tue, 9 Jul 2024 14:44:12 +0300 Subject: [PATCH] fix(net): handle panic on Windows for Unix socket usage in Deno.serve() (#24423) This PR addresses the issue where Deno.serve() panics on Windows when trying to use a Unix socket. Fixes #21967 --- ext/net/lib.rs | 22 ++++++++++++++++++---- tests/unit/serve_test.ts | 25 +++++++++++++++++++++++++ 2 files changed, 43 insertions(+), 4 deletions(-) diff --git a/ext/net/lib.rs b/ext/net/lib.rs index 3b6c05282b..c0f94ce1c7 100644 --- a/ext/net/lib.rs +++ b/ext/net/lib.rs @@ -158,14 +158,28 @@ mod ops_unix { macro_rules! stub_op { ($name:ident) => { #[op2(fast)] - pub fn $name() { - panic!("Unsupported on non-unix platforms") + pub fn $name() -> Result<(), std::io::Error> { + let error_msg = format!( + "Operation `{:?}` not supported on non-unix platforms.", + stringify!($name) + ); + Err(std::io::Error::new( + std::io::ErrorKind::Unsupported, + error_msg, + )) } }; ($name:ident

) => { #[op2(fast)] - pub fn $name() { - panic!("Unsupported on non-unix platforms") + pub fn $name() -> Result<(), std::io::Error> { + let error_msg = format!( + "Operation `{:?}` not supported on non-unix platforms.", + stringify!($name) + ); + Err(std::io::Error::new( + std::io::ErrorKind::Unsupported, + error_msg, + )) } }; } diff --git a/tests/unit/serve_test.ts b/tests/unit/serve_test.ts index 3636670661..4239221be3 100644 --- a/tests/unit/serve_test.ts +++ b/tests/unit/serve_test.ts @@ -4034,3 +4034,28 @@ Deno.test( await server.finished; }, ); + +Deno.test({ + name: "HTTP Server test (error on non-unix platform)", + ignore: Deno.build.os !== "windows", +}, async () => { + await assertRejects( + async () => { + const ac = new AbortController(); + const server = Deno.serve({ + path: "path/to/socket", + handler: (_req) => new Response("Hello, world"), + signal: ac.signal, + onListen({ path: _path }) { + console.log(`Server started at ${_path}`); + }, + }); + server.finished.then(() => console.log("Server closed")); + console.log("Closing server..."); + ac.abort(); + await new Promise((resolve) => setTimeout(resolve, 100)); // Example of awaiting something + }, + Error, + 'Operation `"op_net_listen_unix"` not supported on non-unix platforms.', + ); +});