Repository: nodejs/node
Pull request: inspector: support handshake response for websocket inspection

<!--
Before submitting a pull request, please read:

- the CONTRIBUTING guide at https://github.com/nodejs/node/blob/HEAD/CONTRIBUTING.md
- the commit message formatting guidelines at
  https://github.com/nodejs/node/blob/HEAD/doc/contributing/pull-requests.md#commit-message-guidelines

For code changes:
1. Include tests for any bug fixes or new features.
2. Update documentation if relevant.
3. Ensure that `make -j4 test` (UNIX), or `vcbuild test` (Windows) passes.

If you believe this PR should be highlighted in the Node.js CHANGELOG
please add the `notable-change` label.

Developer's Certificate of Origin 1.1

By making a contribution to this project, I certify that:

(a) The contribution was created in whole or in part by me and I
    have the right to submit it under the open source license
    indicated in the file; or

(b) The contribution is based upon previous work that, to the best
    of my knowledge, is covered under an appropriate open source
    license and I have the right under that license to submit that
    work with modifications, whether created in whole or in part
    by me, under the same open source license (unless I am
    permitted to submit under a different license), as indicated
    in the file; or

(c) The contribution was provided directly to me by some other
    person who certified (a), (b) or (c) and I have not modified
    it.

(d) I understand and agree that this project and the contribution
    are public and that a record of the contribution (including all
    personal information I submit with it, including my sign-off) is
    maintained indefinitely and may be redistributed consistent with
    this project or the open source license(s) involved.
-->


Changed files:
filename: lib/internal/inspector/network_undici.js
patch: @@ -209,23 +209,17 @@ function onClientResponseFinish({ request }) {
 // TODO: Move Network.webSocketCreated to the actual creation time of the WebSocket.
 // undici:websocket:open fires when the connection is established, but this results
 // in an inaccurate stack trace.
-function onWebSocketOpen({ websocket }) {
+function onWebSocketOpen({ websocket, handshakeResponse }) {
   websocket[kInspectorRequestId] = getNextRequestId();
   const url = websocket.url.toString();
   Network.webSocketCreated({
     requestId: websocket[kInspectorRequestId],
     url,
   });
-  // TODO: Use handshake response data from undici diagnostics when available.
-  // https://github.com/nodejs/undici/pull/4396
   Network.webSocketHandshakeResponseReceived({
     requestId: websocket[kInspectorRequestId],
     timestamp: getMonotonicTime(),
-    response: {
-      status: 101,
-      statusText: 'Switching Protocols',
-      headers: {},
-    },
+    response: handshakeResponse,
   });
 }
 

filename: test/common/websocket-server.js
patch: @@ -9,10 +9,12 @@ class WebSocketServer {
   constructor({
     port = 0,
     server,
+    customHandleUpgradeHeaders = [],
   }) {
     this.port = port;
     this.server = server || http.createServer();
     this.clients = new Set();
+    this.customHandleUpgradeHeaders = customHandleUpgradeHeaders;
 
     this.server.on('upgrade', this.handleUpgrade.bind(this));
   }
@@ -36,6 +38,7 @@ class WebSocketServer {
       'Upgrade: websocket',
       'Connection: Upgrade',
       `Sec-WebSocket-Accept: ${acceptKey}`,
+      ...this.customHandleUpgradeHeaders,
     ];
 
     socket.write(responseHeaders.join('\r\n') + '\r\n\r\n');

filename: test/parallel/test-inspector-network-websocket.js
patch: @@ -29,8 +29,15 @@ function findFrameInInitiator(regex, initiator) {
 
 async function test() {
   await session.post('Network.enable');
+
+  const CUSTOM_HEADER_NAME = 'X-Custom-Header';
+  const CUSTOM_HEADER_VALUE = 'CustomHeaderValue';
+
   const server = new WebSocketServer({
     responseError: true,
+    customHandleUpgradeHeaders: [
+      `${CUSTOM_HEADER_NAME}: ${CUSTOM_HEADER_VALUE}`,
+    ]
   });
   await server.start();
   const url = `ws://127.0.0.1:${server.port}/`;
@@ -49,6 +56,11 @@ async function test() {
     assert.strictEqual(message.params.requestId, requestId);
     assert.strictEqual(message.params.response.status, 101);
     assert.strictEqual(message.params.response.statusText, 'Switching Protocols');
+    assert.strictEqual(message.params.response.headers.upgrade, 'websocket');
+    assert.strictEqual(message.params.response.headers.connection, 'Upgrade');
+    assert.ok(message.params.response.headers['sec-websocket-accept']);
+    assert.ok(message.params.response.headers['sec-websocket-accept'].length > 0);
+    assert.strictEqual(message.params.response.headers[CUSTOM_HEADER_NAME.toLowerCase()], CUSTOM_HEADER_VALUE);
     assert.strictEqual(typeof message.params.timestamp, 'number');
     socket.close();
   }));