Logging WebSocket frame header information

WebSocket frame header has various information. Logging them is useful
to debug when the WebSocket shows weird actions.

This CL adds the following information on NetLog:
WEBSOCKET_RECV_FRAME_HEADER
--> final = XX
--> masked = XX
--> opcode = XX
--> payload_length = XX
--> reserved1 = XX
--> reserved2 = XX
--> reserved3 = XX

Bug: 1293585

Change-Id: Ic5dbfff78b952f887443655644c0b94597819b7b
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3428383
Reviewed-by: Adam Rice <[email protected]>
Reviewed-by: Yutaka Hirano <[email protected]>
Commit-Queue: Nanami Mikiya <[email protected]>
Cr-Commit-Position: refs/heads/main@{#966584}
diff --git a/net/websockets/websocket_basic_stream.cc b/net/websockets/websocket_basic_stream.cc
index 263624b..542122f 100644
--- a/net/websockets/websocket_basic_stream.cc
+++ b/net/websockets/websocket_basic_stream.cc
@@ -111,6 +111,19 @@
   return dict;
 }
 
+base::Value NetLogFrameHeaderParam(const WebSocketFrameHeader* header) {
+  base::Value dict(base::Value::Type::DICTIONARY);
+  dict.SetBoolKey("final", header->final);
+  dict.SetBoolKey("reserved1", header->reserved1);
+  dict.SetBoolKey("reserved2", header->reserved2);
+  dict.SetBoolKey("reserved3", header->reserved3);
+  dict.SetIntKey("opcode", header->opcode);
+  dict.SetBoolKey("masked", header->masked);
+  dict.SetDoubleKey("payload_length",
+                    static_cast<double>(header->payload_length));
+  return dict;
+}
+
 }  // namespace
 
 WebSocketBasicStream::BufferSizeManager::BufferSizeManager() = default;
@@ -374,6 +387,10 @@
     auto& chunk = (*frame_chunks)[i];
     DCHECK(chunk == frame_chunks->back() || chunk->final_chunk)
         << "Only last chunk can have |final_chunk| set to be false.";
+    if (const auto& header = chunk->header) {
+      net_log_.AddEvent(net::NetLogEventType::WEBSOCKET_RECV_FRAME_HEADER,
+                        [&] { return NetLogFrameHeaderParam(header.get()); });
+    }
     std::unique_ptr<WebSocketFrame> frame;
     int result = ConvertChunkToFrame(std::move(chunk), &frame);
     if (result != OK)