@@ -71,6 +71,19 @@ fn setExtraHTTPHeaders(cmd: anytype) !void {
71
71
return cmd .sendResult (null , .{});
72
72
}
73
73
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
+
74
87
pub fn httpRequestStart (arena : Allocator , bc : anytype , request : * const Notification.RequestStart ) ! void {
75
88
// Isn't possible to do a network request within a Browser (which our
76
89
// notification is tied to), without a page.
@@ -84,18 +97,10 @@ pub fn httpRequestStart(arena: Allocator, bc: anytype, request: *const Notificat
84
97
const page = bc .session .currentPage () orelse unreachable ;
85
98
86
99
// 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 });
99
104
}
100
105
101
106
const document_url = try urlToString (arena , & page .url .uri , .{
@@ -204,5 +209,9 @@ test "cdp.network setExtraHTTPHeaders" {
204
209
.params = .{ .headers = .{ .food = "bars" } },
205
210
});
206
211
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 );
208
217
}
0 commit comments