aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--packages/bun-types/bun.d.ts2
-rw-r--r--src/bun.js/api/server.zig22
-rw-r--r--test/js/bun/http/bun-server.test.ts33
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;