Skip to content

Commit b2b78ff

Browse files
committed
http,inspector: add WebSocket upgrade observability
1 parent 5f92b6d commit b2b78ff

14 files changed

Lines changed: 1754 additions & 14 deletions

doc/api/diagnostics_channel.md

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1590,6 +1590,18 @@ Emitted when an error occurs during a client request.
15901590

15911591
Emitted when client receives a response.
15921592

1593+
##### Event: `'http.client.request.upgrade'`
1594+
1595+
* `request` {http.ClientRequest}
1596+
* `response` {http.IncomingMessage}
1597+
* `socket` {net.Socket}
1598+
* `head` {Buffer}
1599+
* `protocol` {string}
1600+
1601+
Emitted when an HTTP/1.1 client request upgrades to WebSocket.
1602+
The `head` value matches the `upgradeHead` argument emitted with the request's
1603+
`'upgrade'` event.
1604+
15931605
##### Event: `'http.server.request.start'`
15941606

15951607
* `request` {http.IncomingMessage}
@@ -1616,6 +1628,78 @@ The event is emitted before the response is sent.
16161628

16171629
Emitted when server sends a response.
16181630

1631+
##### Event: `'http.server.request.upgrade'`
1632+
1633+
* `request` {http.IncomingMessage}
1634+
* `socketOrStream` {net.Socket|stream.Duplex}
1635+
* `head` {Buffer}
1636+
* `protocol` {string}
1637+
1638+
Emitted when an HTTP/1.1 server request upgrades to WebSocket.
1639+
The `socketOrStream` value matches the upgraded object exposed to the server's
1640+
`'upgrade'` event.
1641+
1642+
#### WebSocket
1643+
1644+
> Stability: 1 - Experimental
1645+
1646+
The following WebSocket diagnostics channels currently observe HTTP/1.1
1647+
WebSocket upgrades handled by the built-in `http` and `https` modules.
1648+
1649+
##### Event: `'websocket.client.frameSent'`
1650+
1651+
* `request` {http.ClientRequest}
1652+
* `response` {http.IncomingMessage}
1653+
* `socket` {net.Socket}
1654+
* `opcode` {number}
1655+
* `fin` {boolean}
1656+
* `masked` {boolean}
1657+
* `compressed` {boolean}
1658+
* `payloadLength` {number}
1659+
* `payload` {Buffer}
1660+
1661+
Emitted when a complete WebSocket frame sent by the client has been observed.
1662+
1663+
##### Event: `'websocket.client.frameReceived'`
1664+
1665+
* `request` {http.ClientRequest}
1666+
* `response` {http.IncomingMessage}
1667+
* `socket` {net.Socket}
1668+
* `opcode` {number}
1669+
* `fin` {boolean}
1670+
* `masked` {boolean}
1671+
* `compressed` {boolean}
1672+
* `payloadLength` {number}
1673+
* `payload` {Buffer}
1674+
1675+
Emitted when a complete WebSocket frame received by the client has been observed.
1676+
1677+
##### Event: `'websocket.server.frameSent'`
1678+
1679+
* `request` {http.IncomingMessage}
1680+
* `socket` {net.Socket}
1681+
* `opcode` {number}
1682+
* `fin` {boolean}
1683+
* `masked` {boolean}
1684+
* `compressed` {boolean}
1685+
* `payloadLength` {number}
1686+
* `payload` {Buffer}
1687+
1688+
Emitted when a complete WebSocket frame sent by the server has been observed.
1689+
1690+
##### Event: `'websocket.server.frameReceived'`
1691+
1692+
* `request` {http.IncomingMessage}
1693+
* `socket` {net.Socket}
1694+
* `opcode` {number}
1695+
* `fin` {boolean}
1696+
* `masked` {boolean}
1697+
* `compressed` {boolean}
1698+
* `payloadLength` {number}
1699+
* `payload` {Buffer}
1700+
1701+
Emitted when a complete WebSocket frame received by the server has been observed.
1702+
16191703
#### HTTP/2
16201704

16211705
> Stability: 1 - Experimental

lib/_http_client.js

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,13 @@ const onClientRequestStartChannel = dc.channel('http.client.request.start');
9999
const onClientRequestErrorChannel = dc.channel('http.client.request.error');
100100
const onClientResponseFinishChannel = dc.channel('http.client.response.finish');
101101

102+
let observeClientWebSocketUpgrade;
103+
function lazyObserveClientWebSocketUpgrade() {
104+
observeClientWebSocketUpgrade ??=
105+
require('internal/http_websocket_observer').observeClientWebSocketUpgrade;
106+
return observeClientWebSocketUpgrade;
107+
}
108+
102109
function emitErrorEvent(request, error) {
103110
if (onClientRequestErrorChannel.hasSubscribers) {
104111
onClientRequestErrorChannel.publish({
@@ -670,6 +677,10 @@ function socketOnData(d) {
670677
socket._httpMessage = null;
671678
socket.readableFlowing = null;
672679

680+
if (eventName === 'upgrade') {
681+
lazyObserveClientWebSocketUpgrade()(req, res, socket, bodyHead);
682+
}
683+
673684
req.emit(eventName, res, socket, bodyHead);
674685
req.destroyed = true;
675686
req._closed = true;

lib/_http_server.js

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,13 @@ const onRequestStartChannel = dc.channel('http.server.request.start');
107107
const onResponseCreatedChannel = dc.channel('http.server.response.created');
108108
const onResponseFinishChannel = dc.channel('http.server.response.finish');
109109

110+
let observeServerWebSocketUpgrade;
111+
function lazyObserveServerWebSocketUpgrade() {
112+
observeServerWebSocketUpgrade ??=
113+
require('internal/http_websocket_observer').observeServerWebSocketUpgrade;
114+
return observeServerWebSocketUpgrade;
115+
}
116+
110117
const kServerResponse = Symbol('ServerResponse');
111118
const kServerResponseStatistics = Symbol('ServerResponseStatistics');
112119
const kUpgradeStream = Symbol('UpgradeStream');
@@ -1090,6 +1097,15 @@ function onParserExecuteCommon(server, socket, parser, state, ret, d) {
10901097
socket[kUpgradeStream].requestBodyCompleted(bodyHead);
10911098
} else {
10921099
socket.readableFlowing = null;
1100+
if (eventName === 'upgrade') {
1101+
lazyObserveServerWebSocketUpgrade()(
1102+
req,
1103+
upgradeStream,
1104+
socket,
1105+
bodyHead,
1106+
req.complete,
1107+
);
1108+
}
10931109
server.emit(eventName, req, upgradeStream, bodyHead);
10941110
}
10951111
} else {

lib/inspector.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -220,7 +220,11 @@ const Network = {
220220
dataSent: (params) => broadcastToFrontend('Network.dataSent', params),
221221
dataReceived: (params) => broadcastToFrontend('Network.dataReceived', params),
222222
webSocketCreated: (params) => broadcastToFrontend('Network.webSocketCreated', params),
223+
webSocketWillSendHandshakeRequest:
224+
(params) => broadcastToFrontend('Network.webSocketWillSendHandshakeRequest', params),
223225
webSocketClosed: (params) => broadcastToFrontend('Network.webSocketClosed', params),
226+
webSocketFrameReceived: (params) => broadcastToFrontend('Network.webSocketFrameReceived', params),
227+
webSocketFrameSent: (params) => broadcastToFrontend('Network.webSocketFrameSent', params),
224228
webSocketHandshakeResponseReceived:
225229
(params) => broadcastToFrontend('Network.webSocketHandshakeResponseReceived', params),
226230
};

0 commit comments

Comments
 (0)