@@ -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+
7487pub 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}
0 commit comments