@@ -267,7 +267,7 @@ pub fn httpResponseHeaderDone(arena: Allocator, bc: anytype, msg: *const Notific
267267 .requestId = try std .fmt .allocPrint (arena , "REQ-{d}" , .{msg .transfer .id }),
268268 .loaderId = bc .loader_id ,
269269 .frameId = target_id ,
270- .response = TransferAsResponseWriter .init (msg .transfer ),
270+ .response = TransferAsResponseWriter .init (arena , msg .transfer ),
271271 }, .{ .session_id = session_id });
272272}
273273
@@ -352,10 +352,12 @@ pub const TransferAsRequestWriter = struct {
352352};
353353
354354const TransferAsResponseWriter = struct {
355+ arena : Allocator ,
355356 transfer : * Transfer ,
356357
357- fn init (transfer : * Transfer ) TransferAsResponseWriter {
358+ fn init (arena : Allocator , transfer : * Transfer ) TransferAsResponseWriter {
358359 return .{
360+ .arena = arena ,
359361 .transfer = transfer ,
360362 };
361363 }
@@ -392,14 +394,24 @@ const TransferAsResponseWriter = struct {
392394 }
393395
394396 {
395- try writer .objectField ("headers" );
396- try writer .beginObject ();
397+ // chromedp doesn't like having duplicate header names. It's pretty
398+ // common to get these from a server (e.g. for Cache-Control), but
399+ // Chrome joins these. So we have to too.
400+ const arena = self .arena ;
397401 var it = transfer .responseHeaderIterator ();
402+ var map : std .StringArrayHashMapUnmanaged ([]const u8 ) = .empty ;
398403 while (it .next ()) | hdr | {
399- try writer .objectField (hdr .name );
400- try writer .write (hdr .value );
404+ const gop = try map .getOrPut (arena , hdr .name );
405+ if (gop .found_existing ) {
406+ // yes, chrome joins multi-value headers with a \n
407+ gop .value_ptr .* = try std .mem .join (arena , "\n " , &.{ gop .value_ptr .* , hdr .value });
408+ } else {
409+ gop .value_ptr .* = hdr .value ;
410+ }
401411 }
402- try writer .endObject ();
412+
413+ try writer .objectField ("headers" );
414+ try writer .write (std .json .ArrayHashMap ([]const u8 ){ .map = map });
403415 }
404416 try writer .endObject ();
405417 }
0 commit comments