diff --git a/src/browser/tests/net/xhr.html b/src/browser/tests/net/xhr.html index 7dc89a23..64fac5c3 100644 --- a/src/browser/tests/net/xhr.html +++ b/src/browser/tests/net/xhr.html @@ -252,3 +252,34 @@ testing.expectEqual(XMLHttpRequest.UNSENT, req.readyState); }); + + + diff --git a/src/http/Client.zig b/src/http/Client.zig index 1670883c..db3ec161 100644 --- a/src/http/Client.zig +++ b/src/http/Client.zig @@ -789,25 +789,30 @@ fn processMessages(self: *Client) !bool { if (msg.err) |err| { requestFailed(transfer, err, true); } else blk: { - // In case of request w/o data, we need to call the header done - // callback now. - if (!transfer._header_done_called) { - const proceed = transfer.headerDoneCallback(&msg.conn) catch |err| { - log.err(.http, "header_done_callback", .{ .err = err }); + { + self.handles.performing = true; + defer self.handles.performing = false; + + // In case of request w/o data, we need to call the header done + // callback now. + if (!transfer._header_done_called) { + const proceed = transfer.headerDoneCallback(&msg.conn) catch |err| { + log.err(.http, "header_done_callback", .{ .err = err }); + requestFailed(transfer, err, true); + continue; + }; + if (!proceed) { + requestFailed(transfer, error.Abort, true); + break :blk; + } + } + transfer.req.done_callback(transfer.ctx) catch |err| { + // transfer isn't valid at this point, don't use it. + log.err(.http, "done_callback", .{ .err = err }); requestFailed(transfer, err, true); continue; }; - if (!proceed) { - requestFailed(transfer, error.Abort, true); - break :blk; - } } - transfer.req.done_callback(transfer.ctx) catch |err| { - // transfer isn't valid at this point, don't use it. - log.err(.http, "done_callback", .{ .err = err }); - requestFailed(transfer, err, true); - continue; - }; transfer.req.notification.dispatch(.http_request_done, &.{ .transfer = transfer, @@ -1041,10 +1046,6 @@ pub const Transfer = struct { pub fn abort(self: *Transfer, err: anyerror) void { requestFailed(self, err, true); - if (self._conn == null) { - self.deinit(); - return; - } const client = self.client; if (client.handles.performing) { diff --git a/src/testing.zig b/src/testing.zig index 62ec8870..16b06a35 100644 --- a/src/testing.zig +++ b/src/testing.zig @@ -561,6 +561,14 @@ fn testHTTPHandler(req: *std.http.Server.Request) !void { }); } + if (std.mem.eql(u8, path, "/xhr_empty")) { + return req.respond("", .{ + .extra_headers = &.{ + .{ .name = "Content-Type", .value = "text/html; charset=utf-8" }, + }, + }); + } + if (std.mem.eql(u8, path, "/xhr/json")) { return req.respond("{\"over\":\"9000!!!\",\"updated_at\":1765867200000}", .{ .extra_headers = &.{