diff options
Diffstat (limited to 'src/bun.js/api/server.zig')
-rw-r--r-- | src/bun.js/api/server.zig | 47 |
1 files changed, 28 insertions, 19 deletions
diff --git a/src/bun.js/api/server.zig b/src/bun.js/api/server.zig index 801745aee..10afa4ac1 100644 --- a/src/bun.js/api/server.zig +++ b/src/bun.js/api/server.zig @@ -1069,7 +1069,7 @@ fn NewRequestContext(comptime ssl_enabled: bool, comptime debug_mode: bool, comp byte_stream: ?*JSC.WebCore.ByteStream = null, /// Used in errors - pathname: []const u8 = "", + pathname: bun.String = bun.String.empty, /// Used either for temporary blob data or fallback /// When the response body is a temporary value @@ -1550,10 +1550,9 @@ fn NewRequestContext(comptime ssl_enabled: bool, comptime debug_mode: bool, comp stream.unpipe(); } - if (this.pathname.len > 0) { - ctxLog("finalizeWithoutDeinit: this.pathname.len > 0 null", .{}); - this.allocator.free(bun.constStrToU8(this.pathname)); - this.pathname = ""; + if (!this.pathname.isEmpty()) { + this.pathname.deref(); + this.pathname = bun.String.empty; } // if we are waiting for the body yet and the request was not aborted we can safely clear the onData callback @@ -2235,7 +2234,7 @@ fn NewRequestContext(comptime ssl_enabled: bool, comptime debug_mode: bool, comp request_object.uws_request = req; request_object.ensureURL() catch { - request_object.url = ""; + request_object.url = bun.String.empty; }; // we have to clone the request headers here since they will soon belong to a different request @@ -2244,7 +2243,7 @@ fn NewRequestContext(comptime ssl_enabled: bool, comptime debug_mode: bool, comp } if (comptime debug_mode) { - ctx.pathname = bun.default_allocator.dupe(u8, request_object.url) catch unreachable; + ctx.pathname = request_object.url.clone(); } // This object dies after the stack frame is popped @@ -2596,15 +2595,28 @@ fn NewRequestContext(comptime ssl_enabled: bool, comptime debug_mode: bool, comp runErrorHandlerWithStatusCode(this, value, 500); } - fn ensurePathname(this: *RequestContext) []const u8 { - if (this.pathname.len > 0) - return this.pathname; + const PathnameFormatter = struct { + ctx: *RequestContext, + + pub fn format(formatter: @This(), comptime fmt: []const u8, opts: std.fmt.FormatOptions, writer: anytype) !void { + var this = formatter.ctx; + + if (!this.pathname.isEmpty()) { + try this.pathname.format(fmt, opts, writer); + return; + } - if (!this.flags.has_abort_handler) { - return this.req.url(); + if (!this.flags.has_abort_handler) { + try writer.writeAll(this.req.url()); + return; + } + + try writer.writeAll("/"); } + }; - return "/"; + fn ensurePathname(this: *RequestContext) PathnameFormatter { + return .{ .ctx = this }; } pub inline fn shouldCloseConnection(this: *const RequestContext) bool { @@ -2625,7 +2637,7 @@ fn NewRequestContext(comptime ssl_enabled: bool, comptime debug_mode: bool, comp vm.log, error.ExceptionOcurred, exception_list.toOwnedSlice() catch @panic("TODO"), - "<r><red>{s}<r> - <b>{s}<r> failed", + "<r><red>{s}<r> - <b>{}<r> failed", .{ @as(string, @tagName(this.method)), this.ensurePathname() }, ); } else { @@ -4900,8 +4912,7 @@ pub fn NewServer(comptime ssl_enabled_: bool, comptime debug_mode_: bool) type { } existing_request = Request{ - .url = url.href, - .url_was_allocated = true, + .url = bun.String.create(url.href), .headers = headers, .body = JSC.WebCore.InitRequestBodyValue(body) catch unreachable, .method = method, @@ -4943,7 +4954,7 @@ 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, existing_request.url) catch unreachable; + resp.url = existing_request.url.clone(); } return JSC.JSPromise.resolvedPromiseValue(ctx, response_value).asObjectRef(); } @@ -5295,7 +5306,6 @@ pub fn NewServer(comptime ssl_enabled_: bool, comptime debug_mode_: bool) type { } request_object.* = .{ - .url = "", .method = ctx.method, .uws_request = req, .https = ssl_enabled, @@ -5398,7 +5408,6 @@ pub fn NewServer(comptime ssl_enabled_: bool, comptime debug_mode_: bool) type { } request_object.* = .{ - .url = "", .method = ctx.method, .uws_request = req, .upgrader = ctx, |