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 = &.{