try safer http cleanup on page deinit

This commit is contained in:
Karl Seguin
2025-12-02 16:05:57 +08:00
parent a61e87c5dd
commit b5eceb52fb
3 changed files with 24 additions and 1 deletions

View File

@@ -77,6 +77,13 @@ pub fn init(input: Input, options: ?RequestInit, page: *Page) !js.Promise {
return fetch._resolver.promise(); return fetch._resolver.promise();
} }
pub fn deinit(self: *Fetch) void {
if (self.transfer) |transfer| {
transfer.abort();
self.transfer = null;
}
}
fn httpHeaderDoneCallback(transfer: *Http.Transfer) !void { fn httpHeaderDoneCallback(transfer: *Http.Transfer) !void {
const self: *Fetch = @ptrCast(@alignCast(transfer.ctx)); const self: *Fetch = @ptrCast(@alignCast(transfer.ctx));

View File

@@ -74,6 +74,13 @@ pub fn init(page: *Page) !*XMLHttpRequest {
}); });
} }
pub fn deinit(self: *XMLHttpRequest) void {
if (self.transfer) |transfer| {
transfer.abort();
self.transfer = null;
}
}
fn asEventTarget(self: *XMLHttpRequest) *EventTarget { fn asEventTarget(self: *XMLHttpRequest) *EventTarget {
return self._proto._proto; return self._proto._proto;
} }

View File

@@ -153,7 +153,7 @@ pub fn abort(self: *Client) void {
log.err(.http, "get private info", .{ .err = err, .source = "abort" }); log.err(.http, "get private info", .{ .err = err, .source = "abort" });
continue; continue;
}; };
transfer.abort(); transfer.kill();
} }
std.debug.assert(self.active == 0); std.debug.assert(self.active == 0);
@@ -812,6 +812,15 @@ pub const Transfer = struct {
self.deinit(); self.deinit();
} }
// internal, when the page is shutting down. Doesn't have the same ceremony
// as abort (doesn't send a notification, doesn't invoke an error callback)
fn kill(self: *Transfer) void {
if (self._handle != null) {
self.client.endTransfer(self);
}
self.deinit();
}
// abortAuthChallenge is called when an auth chanllenge interception is // abortAuthChallenge is called when an auth chanllenge interception is
// abort. We don't call self.client.endTransfer here b/c it has been done // abort. We don't call self.client.endTransfer here b/c it has been done
// before interception process. // before interception process.