Skip to content

Commit 8c97f63

Browse files
theanarkhtargos
authored andcommitted
http: add diagnostics channel for http client
PR-URL: #43580 Reviewed-By: Matteo Collina <matteo.collina@gmail.com> Reviewed-By: Stephen Belanger <admin@stephenbelanger.com> Reviewed-By: Antoine du Hamel <duhamelantoine1995@gmail.com>
1 parent 8a06b7b commit 8c97f63

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
@@ -307,6 +307,41 @@ channel.subscribe(onMessage);
307307
channel.unsubscribe(onMessage);
308308
```
309309

310+
### Built-in Channels
311+
312+
#### HTTP
313+
314+
`http.client.request.start`
315+
316+
* `request` {http.ClientRequest}
317+
318+
Emitted when client starts a request.
319+
320+
`http.client.response.finish`
321+
322+
* `request` {http.ClientRequest}
323+
* `response` {http.IncomingMessage}
324+
325+
Emitted when client receives a response.
326+
327+
`http.server.request.start`
328+
329+
* `request` {http.IncomingMessage}
330+
* `response` {http.ServerResponse}
331+
* `socket` {net.Socket}
332+
* `server` {http.Server}
333+
334+
Emitted when server receives a request.
335+
336+
`http.server.response.finish`
337+
338+
* `request` {http.IncomingMessage}
339+
* `response` {http.ServerResponse}
340+
* `socket` {net.Socket}
341+
* `server` {http.Server}
342+
343+
Emitted when server sends a response.
344+
310345
[`'uncaughtException'`]: process.md#event-uncaughtexception
311346
[`channel.subscribe(onMessage)`]: #channelsubscribeonmessage
312347
[`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)