Skip to content

Commit 5a74939

Browse files
theanarkhtargos
authored andcommitted
http: add diagnostics channel for http client
PR-URL: #43580 Reviewed-By: Matteo Collina <[email protected]> Reviewed-By: Stephen Belanger <[email protected]> Reviewed-By: Antoine du Hamel <[email protected]>
1 parent 4a2422a commit 5a74939

File tree

3 files changed

+113
-0
lines changed

3 files changed

+113
-0
lines changed

doc/api/diagnostics_channel.md

+35
Original file line numberDiff line numberDiff line change
@@ -304,6 +304,41 @@ channel.subscribe(onMessage);
304304
channel.unsubscribe(onMessage);
305305
```
306306

307+
### Built-in Channels
308+
309+
#### HTTP
310+
311+
`http.client.request.start`
312+
313+
* `request` {http.ClientRequest}
314+
315+
Emitted when client starts a request.
316+
317+
`http.client.response.finish`
318+
319+
* `request` {http.ClientRequest}
320+
* `response` {http.IncomingMessage}
321+
322+
Emitted when client receives a response.
323+
324+
`http.server.request.start`
325+
326+
* `request` {http.IncomingMessage}
327+
* `response` {http.ServerResponse}
328+
* `socket` {net.Socket}
329+
* `server` {http.Server}
330+
331+
Emitted when server receives a request.
332+
333+
`http.server.response.finish`
334+
335+
* `request` {http.IncomingMessage}
336+
* `response` {http.ServerResponse}
337+
* `socket` {net.Socket}
338+
* `server` {http.Server}
339+
340+
Emitted when server sends a response.
341+
307342
[`'uncaughtException'`]: process.md#event-uncaughtexception
308343
[`channel.subscribe(onMessage)`]: #channelsubscribeonmessage
309344
[`diagnostics_channel.channel(name)`]: #diagnostics_channelchannelname

lib/_http_client.js

+15
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,10 @@ const {
9090

9191
const kClientRequestStatistics = Symbol('ClientRequestStatistics');
9292

93+
const dc = require('diagnostics_channel');
94+
const onClientRequestStartChannel = dc.channel('http.client.request.start');
95+
const onClientResponseFinishChannel = dc.channel('http.client.response.finish');
96+
9397
const { addAbortSignal, finished } = require('stream');
9498

9599
let debug = require('internal/util/debuglog').debuglog('http', (fn) => {
@@ -367,6 +371,11 @@ ClientRequest.prototype._finish = function _finish() {
367371
},
368372
});
369373
}
374+
if (onClientRequestStartChannel.hasSubscribers) {
375+
onClientRequestStartChannel.publish({
376+
request: this,
377+
});
378+
}
370379
};
371380

372381
ClientRequest.prototype._implicitHeader = function _implicitHeader() {
@@ -645,6 +654,12 @@ function parserOnIncomingClient(res, shouldKeepAlive) {
645654
},
646655
});
647656
}
657+
if (onClientResponseFinishChannel.hasSubscribers) {
658+
onClientResponseFinishChannel.publish({
659+
request: req,
660+
response: res,
661+
});
662+
}
648663
req.res = res;
649664
res.req = req;
650665

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
'use strict';
2+
const common = require('../common');
3+
const assert = require('assert');
4+
const http = require('http');
5+
const net = require('net');
6+
const dc = require('diagnostics_channel');
7+
8+
const onClientRequestStart = dc.channel('http.client.request.start');
9+
const onClientResponseFinish = dc.channel('http.client.response.finish');
10+
const onServerRequestStart = dc.channel('http.server.request.start');
11+
const onServerResponseFinish = dc.channel('http.server.response.finish');
12+
13+
const isHTTPServer = (server) => server instanceof http.Server;
14+
const isIncomingMessage = (object) => object instanceof http.IncomingMessage;
15+
const isOutgoingMessage = (object) => object instanceof http.OutgoingMessage;
16+
const isNetSocket = (socket) => socket instanceof net.Socket;
17+
18+
onClientRequestStart.subscribe(common.mustCall(({ request }) => {
19+
assert.strictEqual(isOutgoingMessage(request), true);
20+
}));
21+
22+
onClientResponseFinish.subscribe(common.mustCall(({ request, response }) => {
23+
assert.strictEqual(isOutgoingMessage(request), true);
24+
assert.strictEqual(isIncomingMessage(response), true);
25+
}));
26+
27+
onServerRequestStart.subscribe(common.mustCall(({
28+
request,
29+
response,
30+
socket,
31+
server,
32+
}) => {
33+
assert.strictEqual(isIncomingMessage(request), true);
34+
assert.strictEqual(isOutgoingMessage(response), true);
35+
assert.strictEqual(isNetSocket(socket), true);
36+
assert.strictEqual(isHTTPServer(server), true);
37+
}));
38+
39+
onServerResponseFinish.subscribe(common.mustCall(({
40+
request,
41+
response,
42+
socket,
43+
server,
44+
}) => {
45+
assert.strictEqual(isIncomingMessage(request), true);
46+
assert.strictEqual(isOutgoingMessage(response), true);
47+
assert.strictEqual(isNetSocket(socket), true);
48+
assert.strictEqual(isHTTPServer(server), true);
49+
}));
50+
51+
const server = http.createServer(common.mustCall((req, res) => {
52+
res.end('done');
53+
}));
54+
55+
server.listen(() => {
56+
const { port } = server.address();
57+
http.get(`http://localhost:${port}`, (res) => {
58+
res.resume();
59+
res.on('end', () => {
60+
server.close();
61+
});
62+
});
63+
});

0 commit comments

Comments
 (0)