diff options
-rw-r--r-- | packages/bun-types/bun.d.ts | 2 | ||||
-rw-r--r-- | src/bun.js/api/server.zig | 22 | ||||
-rw-r--r-- | test/js/bun/http/bun-server.test.ts | 33 |
3 files changed, 43 insertions, 14 deletions
diff --git a/packages/bun-types/bun.d.ts b/packages/bun-types/bun.d.ts index acd80124f..7336d731d 100644 --- a/packages/bun-types/bun.d.ts +++ b/packages/bun-types/bun.d.ts @@ -1824,7 +1824,7 @@ declare module "bun" { * consistently in all cases and it doesn't yet call the `error` handler * consistently. This needs to be fixed */ - fetch(request: Request): Response | Promise<Response>; + fetch(request: Request | string): Response | Promise<Response>; /** * Upgrade a {@link Request} to a {@link ServerWebSocket} diff --git a/src/bun.js/api/server.zig b/src/bun.js/api/server.zig index 463e26c0a..bb48f5786 100644 --- a/src/bun.js/api/server.zig +++ b/src/bun.js/api/server.zig @@ -4653,10 +4653,9 @@ pub fn NewServer(comptime ssl_enabled_: bool, comptime debug_mode_: bool) type { var args = JSC.Node.ArgumentsSlice.from(ctx.bunVM(), arguments); defer args.deinit(); - var url: URL = undefined; var first_arg = args.nextEat().?; var body: JSC.WebCore.Body.Value = .{ .Null = {} }; - var existing_request: ?WebCore.Request = null; + var existing_request: WebCore.Request = undefined; // TODO: set Host header // TODO: set User-Agent header if (first_arg.isString()) { @@ -4669,7 +4668,7 @@ pub fn NewServer(comptime ssl_enabled_: bool, comptime debug_mode_: bool) type { return JSPromise.rejectedPromiseValue(globalThis, ZigString.init(fetch_error).toErrorInstance(globalThis)).asRef(); } - url = URL.parse(temp_url_str); + var url = URL.parse(temp_url_str); if (url.hostname.len == 0) { url = URL.parse( @@ -4704,24 +4703,22 @@ pub fn NewServer(comptime ssl_enabled_: bool, comptime debug_mode_: bool) type { } } } - } else if (first_arg.as(Request)) |request_| { - existing_request = request_.*; - } else { - const fetch_error = WebCore.Fetch.fetch_type_error_strings.get(js.JSValueGetType(ctx, arguments[0])); - return JSPromise.rejectedPromiseValue(globalThis, ZigString.init(fetch_error).toErrorInstance(globalThis)).asRef(); - } - if (existing_request == null) { existing_request = Request{ .url = url.href, .headers = headers, .body = JSC.WebCore.InitRequestBodyValue(body) catch unreachable, .method = method, }; + } else if (first_arg.as(Request)) |request_| { + existing_request = request_.*; + } else { + const fetch_error = WebCore.Fetch.fetch_type_error_strings.get(js.JSValueGetType(ctx, arguments[0])); + return JSPromise.rejectedPromiseValue(globalThis, ZigString.init(fetch_error).toErrorInstance(globalThis)).asRef(); } var request = ctx.bunVM().allocator.create(Request) catch unreachable; - request.* = existing_request.?; + request.* = existing_request; var args_ = [_]JSC.C.JSValueRef{request.toJS(this.globalThis).asObjectRef()}; const response_value = JSC.C.JSObjectCallAsFunctionReturnValue( @@ -4745,9 +4742,8 @@ pub fn NewServer(comptime ssl_enabled_: bool, comptime debug_mode_: bool) type { } if (response_value.as(JSC.WebCore.Response)) |resp| { - resp.url = this.allocator.dupe(u8, url.href) catch unreachable; + resp.url = this.allocator.dupe(u8, existing_request.url) catch unreachable; } - return JSC.JSPromise.resolvedPromiseValue(ctx, response_value).asObjectRef(); } diff --git a/test/js/bun/http/bun-server.test.ts b/test/js/bun/http/bun-server.test.ts index 3472dc498..7d0915b89 100644 --- a/test/js/bun/http/bun-server.test.ts +++ b/test/js/bun/http/bun-server.test.ts @@ -150,6 +150,39 @@ describe("Server", () => { } }); + test("server.fetch should work with a string", async () => { + const server = Bun.serve({ + fetch(req) { + return new Response("Hello World!"); + }, + }); + try { + const url = `http://${server.hostname}:${server.port}`; + const response = await server.fetch(url); + expect(await response.text()).toBe("Hello World!"); + expect(response.status).toBe(200); + expect(response.url).toBe(url); + } finally { + server.stop(true); + } + }); + + test("server.fetch should work with a Request object", async () => { + const server = Bun.serve({ + fetch(req) { + return new Response("Hello World!"); + }, + }); + try { + const url = `http://${server.hostname}:${server.port}`; + const response = await server.fetch(new Request(url)); + expect(await response.text()).toBe("Hello World!"); + expect(response.status).toBe(200); + expect(response.url).toBe(url); + } finally { + server.stop(true); + } + }); test("abort signal on server with stream", async () => { { let signalOnServer = false; |