From 19c908035b9f00cfd3b1dbc50962997e1e80f226 Mon Sep 17 00:00:00 2001 From: Karl Seguin Date: Tue, 12 Aug 2025 11:13:19 +0800 Subject: [PATCH] Treat pending requests as active This ensures that page.wait won't unblock too early. As-is, this isn't an issue since active can only be 0 if there are no active OR pending requests. However, with request interception (https://github.com/lightpanda-io/browser/pull/930) it's possible to have no active requests and no pending requests - from the http client's point of view - but still have pending-on-intercept requests. An alternative to this would be to undo these changes, and instead change Page.wait to be intercept-aware. That is, Page.wait would continue to block on http activity and scheduled tasks, as well as intercepted requests. However, since the Page doesn't know anything about CDP right now, and it does know about the http client, maybe doing this in the client is fine. --- src/http/Client.zig | 15 ++++++++++++--- vendor/netsurf/libdom | 2 +- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/http/Client.zig b/src/http/Client.zig index f2a26dfc..91efd30b 100644 --- a/src/http/Client.zig +++ b/src/http/Client.zig @@ -185,12 +185,14 @@ pub fn tick(self: *Client, timeout_ms: usize) !void { pub fn request(self: *Client, req: Request) !void { if (self.handles.getFreeHandle()) |handle| { + self.active += 1; return self.makeRequest(handle, req); } const node = try self.queue_node_pool.create(); node.data = req; self.queue.append(node); + self.active += 1; } // See ScriptManager.blockingGet @@ -234,13 +236,18 @@ fn makeRequest(self: *Client, handle: *Handle, req: Request) !void { // we need this for cookies const uri = std.Uri.parse(req.url) catch |err| { + self.active -= 1; self.handles.release(handle); log.warn(.http, "invalid url", .{ .err = err, .url = req.url }); return; }; const header_list = blk: { - errdefer self.handles.release(handle); + errdefer { + self.active -= 1; + self.handles.release(handle); + } + try conn.setMethod(req.method); try conn.setURL(req.url); @@ -275,7 +282,10 @@ fn makeRequest(self: *Client, handle: *Handle, req: Request) !void { }; { - errdefer self.handles.release(handle); + errdefer { + self.active -= 1; + self.handles.release(handle); + } const transfer = try self.transfer_pool.create(); transfer.* = .{ @@ -299,7 +309,6 @@ fn makeRequest(self: *Client, handle: *Handle, req: Request) !void { } } - self.active += 1; return self.perform(0); } diff --git a/vendor/netsurf/libdom b/vendor/netsurf/libdom index 0c590b26..c0df4581 160000 --- a/vendor/netsurf/libdom +++ b/vendor/netsurf/libdom @@ -1 +1 @@ -Subproject commit 0c590b265a65b937042d68ad34902c9b4a05839a +Subproject commit c0df458132162aba136d57ce1ba2179122a9e717