diff --git a/test/js/node/http/node-http.test.ts b/test/js/node/http/node-http.test.ts index 736fc46af6..2ed842f175 100644 --- a/test/js/node/http/node-http.test.ts +++ b/test/js/node/http/node-http.test.ts @@ -983,24 +983,6 @@ describe("node:http", () => { }); }); - test("test server internal error, issue#4298", done => { - const server = createServer((req, res) => { - throw Error("throw an error here."); - }); - server.listen({ port: 0 }, async (_err, host, port) => { - try { - await fetch(`http://${host}:${port}`).then(res => { - expect(res.status).toBe(500); - done(); - }); - } catch (err) { - done(err); - } finally { - server.close(); - } - }); - }); - test("test unix socket server", done => { const socketPath = `${tmpdir()}/bun-server-${Math.random().toString(32)}.sock`; const server = createServer((req, res) => { diff --git a/test/regression/issue/04298/04298.fixture.js b/test/regression/issue/04298/04298.fixture.js new file mode 100644 index 0000000000..77161560d6 --- /dev/null +++ b/test/regression/issue/04298/04298.fixture.js @@ -0,0 +1,15 @@ +import { createServer } from "node:http"; +import { isIPv6 } from "node:net"; + +const server = createServer((req, res) => { + throw new Error("Oops!"); +}); + +server.listen({ port: 0 }, async (err, host, port) => { + if (err) { + console.error(err); + process.exit(1); + } + const hostname = isIPv6(host) ? `[${host}]` : host; + process.send(`http://${hostname}:${port}/`); +}); diff --git a/test/regression/issue/04298/04298.test.ts b/test/regression/issue/04298/04298.test.ts new file mode 100644 index 0000000000..cbf1598575 --- /dev/null +++ b/test/regression/issue/04298/04298.test.ts @@ -0,0 +1,24 @@ +import { test, expect } from "bun:test"; +import { spawn } from "bun"; +import { bunExe, bunEnv } from "harness"; + +test("node:http should not crash when server throws", async () => { + const { promise, resolve, reject } = Promise.withResolvers(); + await using server = spawn({ + cwd: import.meta.dirname, + cmd: [bunExe(), "04298.fixture.js"], + env: bunEnv, + stderr: "pipe", + ipc(url) { + resolve(url); + }, + onExit(exitCode, signalCode) { + if (signalCode || exitCode !== 0) { + reject(new Error(`process exited with code ${signalCode || exitCode}`)); + } + }, + }); + const url = await promise; + const response = await fetch(url); + expect(response.status).toBe(500); +});