Skip to content

Commit bacef41

Browse files
committed
extra header feedback
1 parent f1672dd commit bacef41

File tree

2 files changed

+25
-13
lines changed

2 files changed

+25
-13
lines changed

src/cdp/domains/network.zig

Lines changed: 22 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,19 @@ fn setExtraHTTPHeaders(cmd: anytype) !void {
7171
return cmd.sendResult(null, .{});
7272
}
7373

74+
// Upsert a header into the headers array.
75+
// returns true if the header was added, false if it was updated
76+
fn putAssumeCapacity(headers: *std.ArrayListUnmanaged(std.http.Header), extra: std.http.Header) bool {
77+
for (headers.items) |*header| {
78+
if (std.mem.eql(u8, header.name, extra.name)) {
79+
header.value = extra.value;
80+
return false;
81+
}
82+
}
83+
headers.appendAssumeCapacity(extra);
84+
return true;
85+
}
86+
7487
pub fn httpRequestStart(arena: Allocator, bc: anytype, request: *const Notification.RequestStart) !void {
7588
// Isn't possible to do a network request within a Browser (which our
7689
// notification is tied to), without a page.
@@ -84,18 +97,10 @@ pub fn httpRequestStart(arena: Allocator, bc: anytype, request: *const Notificat
8497
const page = bc.session.currentPage() orelse unreachable;
8598

8699
// Modify request with extra CDP headers
87-
const original_len = request.headers.items.len;
88-
try request.headers.ensureTotalCapacity(arena, original_len + cdp.extra_headers.items.len);
89-
outer: for (cdp.extra_headers.items) |extra| {
90-
for (request.headers.items[0..original_len]) |*existing_header| {
91-
if (std.mem.eql(u8, existing_header.name, extra.name)) {
92-
// If the header already exists, we overwrite it
93-
log.debug(.cdp, "request header overwritten", .{ .name = extra.name });
94-
existing_header.value = extra.value;
95-
continue :outer;
96-
}
97-
}
98-
request.headers.appendAssumeCapacity(extra);
100+
try request.headers.ensureTotalCapacity(request.arena, request.headers.items.len + cdp.extra_headers.items.len);
101+
for (cdp.extra_headers.items) |extra| {
102+
const new = putAssumeCapacity(request.headers, extra);
103+
if (!new) log.debug(.cdp, "request header overwritten", .{ .name = extra.name });
99104
}
100105

101106
const document_url = try urlToString(arena, &page.url.uri, .{
@@ -204,5 +209,9 @@ test "cdp.network setExtraHTTPHeaders" {
204209
.params = .{ .headers = .{ .food = "bars" } },
205210
});
206211

207-
try testing.expectEqual(ctx.cdp_.?.browser_context.?.cdp.extra_headers.items.len, 1);
212+
const bc = ctx.cdp().browser_context.?;
213+
try testing.expectEqual(bc.cdp.extra_headers.items.len, 1);
214+
215+
try ctx.processMessage(.{ .id = 5, .method = "Target.attachToTarget", .params = .{ .targetId = bc.target_id.? } });
216+
try testing.expectEqual(bc.cdp.extra_headers.items.len, 0);
208217
}

src/cdp/domains/target.zig

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -389,6 +389,9 @@ fn doAttachtoTarget(cmd: anytype, target_id: []const u8) !void {
389389
std.debug.assert(bc.session_id == null);
390390
const session_id = cmd.cdp.session_id_gen.next();
391391

392+
// extra_headers should not be kept on a new page or tab, currently we have only 1 page, we clear it just in case
393+
bc.cdp.extra_headers.clearRetainingCapacity();
394+
392395
try cmd.sendEvent("Target.attachedToTarget", AttachToTarget{
393396
.sessionId = session_id,
394397
.targetInfo = TargetInfo{

0 commit comments

Comments
 (0)