Skip to content

Commit 211012d

Browse files
committed
move intercept_state and extra_headers from CDP instance to BrowserContext
1 parent c1319d1 commit 211012d

File tree

4 files changed

+57
-22
lines changed

4 files changed

+57
-22
lines changed

src/cdp/cdp.zig

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -74,11 +74,6 @@ pub fn CDPT(comptime TypeProvider: type) type {
7474
// Used for processing notifications within a browser context.
7575
notification_arena: std.heap.ArenaAllocator,
7676

77-
// Extra headers to add to all requests. TBD under which conditions this should be reset.
78-
extra_headers: std.ArrayListUnmanaged([*c]const u8) = .empty,
79-
80-
intercept_state: InterceptState,
81-
8277
const Self = @This();
8378

8479
pub fn init(app: *App, client: TypeProvider.Client) !Self {
@@ -93,15 +88,13 @@ pub fn CDPT(comptime TypeProvider: type) type {
9388
.browser_context = null,
9489
.message_arena = std.heap.ArenaAllocator.init(allocator),
9590
.notification_arena = std.heap.ArenaAllocator.init(allocator),
96-
.intercept_state = try InterceptState.init(allocator), // TBD or browser session arena?
9791
};
9892
}
9993

10094
pub fn deinit(self: *Self) void {
10195
if (self.browser_context) |*bc| {
10296
bc.deinit();
10397
}
104-
self.intercept_state.deinit(); // TBD Should this live in BC?
10598
self.browser.deinit();
10699
self.message_arena.deinit();
107100
self.notification_arena.deinit();
@@ -346,6 +339,11 @@ pub fn BrowserContext(comptime CDP_T: type) type {
346339

347340
http_proxy_changed: bool = false,
348341

342+
// Extra headers to add to all requests.
343+
extra_headers: std.ArrayListUnmanaged([*c]const u8) = .empty,
344+
345+
intercept_state: InterceptState,
346+
349347
const Self = @This();
350348

351349
fn init(self: *Self, id: []const u8, cdp: *CDP_T) !void {
@@ -375,6 +373,7 @@ pub fn BrowserContext(comptime CDP_T: type) type {
375373
.isolated_world = null,
376374
.inspector = inspector,
377375
.notification_arena = cdp.notification_arena.allocator(),
376+
.intercept_state = try InterceptState.init(allocator),
378377
};
379378
self.node_search_list = Node.Search.List.init(allocator, &self.node_registry);
380379
errdefer self.deinit();
@@ -407,6 +406,11 @@ pub fn BrowserContext(comptime CDP_T: type) type {
407406
log.warn(.http, "restoreOriginalProxy", .{ .err = err });
408407
};
409408
}
409+
410+
for (self.intercept_state.pendingTransfers()) |transfer| {
411+
transfer.abort();
412+
}
413+
self.intercept_state.deinit();
410414
}
411415

412416
pub fn reset(self: *Self) void {

src/cdp/domains/fetch.zig

Lines changed: 39 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,10 @@ pub const InterceptState = struct {
7070
pub fn deinit(self: *InterceptState) void {
7171
self.waiting.deinit(self.allocator);
7272
}
73+
74+
pub fn pendingTransfers(self: *const InterceptState) []*Transfer {
75+
return self.waiting.values();
76+
}
7377
};
7478

7579
const RequestPattern = struct {
@@ -134,11 +138,13 @@ fn disable(cmd: anytype) !void {
134138

135139
fn enable(cmd: anytype) !void {
136140
const params = (try cmd.params(EnableParam)) orelse EnableParam{};
137-
if (params.patterns.len != 0) {
138-
log.warn(.cdp, "not implemented", .{ .feature = "Fetch.enable No patterns yet" });
141+
if (!arePatternsSupported(params.patterns)) {
142+
log.warn(.cdp, "not implemented", .{ .feature = "Fetch.enable advanced patterns are not" });
143+
return cmd.sendResult(null, .{});
139144
}
145+
140146
if (params.handleAuthRequests) {
141-
log.warn(.cdp, "not implemented", .{ .feature = "Fetch.enable No auth yet" });
147+
log.warn(.cdp, "not implemented", .{ .feature = "Fetch.enable handleAuthRequests is not supported yet" });
142148
}
143149

144150
const bc = cmd.browser_context orelse return error.BrowserContextNotLoaded;
@@ -147,9 +153,33 @@ fn enable(cmd: anytype) !void {
147153
return cmd.sendResult(null, .{});
148154
}
149155

150-
pub fn requestIntercept(arena: Allocator, bc: anytype, intercept: *const Notification.RequestIntercept) !void {
151-
var cdp = bc.cdp;
156+
fn arePatternsSupported(patterns: []RequestPattern) bool {
157+
if (patterns.len == 0) {
158+
return true;
159+
}
160+
if (patterns.len > 1) {
161+
return false;
162+
}
152163

164+
// While we don't support patterns, yet, both Playwright and Puppeteer send
165+
// a default pattern which happens to be what we support:
166+
// [{"urlPattern":"*","requestStage":"Request"}]
167+
// So, rather than erroring on this case because we don't support patterns,
168+
// we'll allow it, because this pattern is how it works as-is.
169+
const pattern = patterns[0];
170+
if (!std.mem.eql(u8, pattern.urlPattern, "*")) {
171+
return false;
172+
}
173+
if (pattern.resourceType != null) {
174+
return false;
175+
}
176+
if (pattern.requestStage != .Request) {
177+
return false;
178+
}
179+
return true;
180+
}
181+
182+
pub fn requestIntercept(arena: Allocator, bc: anytype, intercept: *const Notification.RequestIntercept) !void {
153183
// unreachable because we _have_ to have a page.
154184
const session_id = bc.session_id orelse unreachable;
155185
const target_id = bc.target_id orelse unreachable;
@@ -160,9 +190,9 @@ pub fn requestIntercept(arena: Allocator, bc: anytype, intercept: *const Notific
160190
// TODO: What to do when receiving replies for a previous page's requests?
161191

162192
const transfer = intercept.transfer;
163-
try cdp.intercept_state.put(transfer);
193+
try bc.intercept_state.put(transfer);
164194

165-
try cdp.sendEvent("Fetch.requestPaused", .{
195+
try bc.cdp.sendEvent("Fetch.requestPaused", .{
166196
.requestId = try std.fmt.allocPrint(arena, "INTERCEPT-{d}", .{transfer.id}),
167197
.request = network.TransferAsRequestWriter.init(transfer),
168198
.frameId = target_id,
@@ -202,7 +232,7 @@ fn continueRequest(cmd: anytype) !void {
202232

203233
const page = bc.session.currentPage() orelse return error.PageNotLoaded;
204234

205-
var intercept_state = &bc.cdp.intercept_state;
235+
var intercept_state = &bc.intercept_state;
206236
const request_id = try idFromRequestId(params.requestId);
207237
const transfer = intercept_state.remove(request_id) orelse return error.RequestNotFound;
208238

@@ -238,7 +268,7 @@ fn failRequest(cmd: anytype) !void {
238268

239269
const page = bc.session.currentPage() orelse return error.PageNotLoaded;
240270

241-
var intercept_state = &bc.cdp.intercept_state;
271+
var intercept_state = &bc.intercept_state;
242272
const request_id = try idFromRequestId(params.requestId);
243273

244274
const transfer = intercept_state.remove(request_id) orelse return error.RequestNotFound;

src/cdp/domains/network.zig

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ fn setExtraHTTPHeaders(cmd: anytype) !void {
8383

8484
// Copy the headers onto the browser context arena
8585
const arena = bc.arena;
86-
const extra_headers = &bc.cdp.extra_headers;
86+
const extra_headers = &bc.extra_headers;
8787

8888
extra_headers.clearRetainingCapacity();
8989
try extra_headers.ensureTotalCapacity(arena, params.headers.map.count());
@@ -235,7 +235,7 @@ pub fn httpRequestStart(arena: Allocator, bc: anytype, data: *const Notification
235235
const page = bc.session.currentPage() orelse unreachable;
236236

237237
// Modify request with extra CDP headers
238-
for (cdp.extra_headers.items) |extra| {
238+
for (bc.extra_headers.items) |extra| {
239239
try data.transfer.req.headers.add(extra);
240240
}
241241

@@ -429,10 +429,10 @@ test "cdp.network setExtraHTTPHeaders" {
429429
});
430430

431431
const bc = ctx.cdp().browser_context.?;
432-
try testing.expectEqual(bc.cdp.extra_headers.items.len, 1);
432+
try testing.expectEqual(bc.extra_headers.items.len, 1);
433433

434434
try ctx.processMessage(.{ .id = 5, .method = "Target.attachToTarget", .params = .{ .targetId = bc.target_id.? } });
435-
try testing.expectEqual(bc.cdp.extra_headers.items.len, 0);
435+
try testing.expectEqual(bc.extra_headers.items.len, 0);
436436
}
437437

438438
test "cdp.Network: cookies" {

src/cdp/domains/target.zig

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -409,8 +409,9 @@ fn doAttachtoTarget(cmd: anytype, target_id: []const u8) !void {
409409
std.debug.assert(bc.session_id == null);
410410
const session_id = cmd.cdp.session_id_gen.next();
411411

412-
// extra_headers should not be kept on a new page or tab, currently we have only 1 page, we clear it just in case
413-
bc.cdp.extra_headers.clearRetainingCapacity();
412+
// extra_headers should not be kept on a new page or tab,
413+
// currently we have only 1 page, we clear it just in case
414+
bc.extra_headers.clearRetainingCapacity();
414415

415416
try cmd.sendEvent("Target.attachedToTarget", AttachToTarget{
416417
.sessionId = session_id,

0 commit comments

Comments
 (0)