mirror of
https://github.com/lightpanda-io/browser.git
synced 2026-03-22 04:34:44 +00:00
Allow frame-specific HTTP abort
Needed for frame navigation. Implemented using some ugly comptime to avoid duplication and avoid an runtime frame check when doing a full abort.
This commit is contained in:
@@ -174,27 +174,59 @@ pub fn newHeaders(self: *const Client) !Net.Headers {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn abort(self: *Client) void {
|
pub fn abort(self: *Client) void {
|
||||||
while (self.handles.in_use.first) |node| {
|
self._abort(true, 0);
|
||||||
const conn: *Net.Connection = @fieldParentPtr("node", node);
|
}
|
||||||
var transfer = Transfer.fromConnection(conn) catch |err| {
|
|
||||||
log.err(.http, "get private info", .{ .err = err, .source = "abort" });
|
pub fn abortFrame(self: *Client, frame_id: u32) void {
|
||||||
continue;
|
self._abort(false, frame_id);
|
||||||
};
|
}
|
||||||
transfer.kill();
|
|
||||||
|
// Written this way so that both abort and abortFrame can share the same code
|
||||||
|
// but abort can avoid the frame_id check at comptime.
|
||||||
|
fn _abort(self: *Client, comptime abort_all: bool, frame_id: u32) void {
|
||||||
|
{
|
||||||
|
var q = &self.handles.in_use;
|
||||||
|
var n = q.first;
|
||||||
|
while (n) |node| {
|
||||||
|
n = node.next;
|
||||||
|
const conn: *Net.Connection = @fieldParentPtr("node", node);
|
||||||
|
var transfer = Transfer.fromConnection(conn) catch |err| {
|
||||||
|
log.err(.http, "get private info", .{ .err = err, .source = "abort" });
|
||||||
|
continue;
|
||||||
|
};
|
||||||
|
if (comptime abort_all) {
|
||||||
|
transfer.kill();
|
||||||
|
} else if (transfer.req.frame_id == frame_id) {
|
||||||
|
q.remove(node);
|
||||||
|
transfer.kill();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (comptime IS_DEBUG) {
|
|
||||||
|
if (comptime IS_DEBUG and abort_all) {
|
||||||
std.debug.assert(self.active == 0);
|
std.debug.assert(self.active == 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
var n = self.queue.first;
|
{
|
||||||
while (n) |node| {
|
var q = &self.queue;
|
||||||
n = node.next;
|
var n = q.first;
|
||||||
const transfer: *Transfer = @fieldParentPtr("_node", node);
|
while (n) |node| {
|
||||||
transfer.kill();
|
n = node.next;
|
||||||
|
const transfer: *Transfer = @fieldParentPtr("_node", node);
|
||||||
|
if (comptime abort_all) {
|
||||||
|
transfer.kill();
|
||||||
|
} else if (transfer.req.frame_id == frame_id) {
|
||||||
|
q.remove(node);
|
||||||
|
transfer.kill();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
self.queue = .{};
|
|
||||||
|
|
||||||
if (comptime IS_DEBUG) {
|
if (comptime abort_all) {
|
||||||
|
self.queue = .{};
|
||||||
|
}
|
||||||
|
|
||||||
|
if (comptime IS_DEBUG and abort_all) {
|
||||||
std.debug.assert(self.handles.in_use.first == null);
|
std.debug.assert(self.handles.in_use.first == null);
|
||||||
std.debug.assert(self.handles.available.len() == self.handles.connections.len);
|
std.debug.assert(self.handles.available.len() == self.handles.connections.len);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user