Skip to content

Commit 1c8e0e3

Browse files
committed
http,diagnostics_channel: export diagnostics channel for http
1 parent 42ad967 commit 1c8e0e3

5 files changed

Lines changed: 146 additions & 5 deletions

File tree

doc/api/http.md

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3605,6 +3605,64 @@ try {
36053605
}
36063606
```
36073607

3608+
## `http.diagnosticsChannel`
3609+
3610+
<!-- YAML
3611+
added: REPLACEME
3612+
-->
3613+
3614+
* `onClientRequestStart`
3615+
* `onClientResponseFinish`
3616+
* `onHTTPRequestStart`
3617+
* `onHTTPResponseFinish`
3618+
3619+
Examples:
3620+
3621+
```js
3622+
'use strict';
3623+
3624+
const http = require('http');
3625+
3626+
http.diagnosticsChannel.onClientRequestStart.subscribe(({ request }) => {
3627+
});
3628+
3629+
http.diagnosticsChannel.onClientResponseFinish.subscribe(({ request, response }) => {
3630+
3631+
});
3632+
3633+
http.diagnosticsChannel.onHTTPRequestStart.subscribe(({
3634+
request,
3635+
response,
3636+
socket,
3637+
server,
3638+
}) => {
3639+
3640+
});
3641+
3642+
http.diagnosticsChannel.onHTTPResponseFinish.subscribe(({
3643+
request,
3644+
response,
3645+
socket,
3646+
server,
3647+
}) => {
3648+
3649+
});
3650+
3651+
const server = http.createServer((req, res) => {
3652+
res.end('done');
3653+
});
3654+
3655+
server.listen(() => {
3656+
const { port } = server.address();
3657+
http.get(`http://localhost:${port}`, (res) => {
3658+
res.resume();
3659+
res.on('end', () => {
3660+
server.close();
3661+
});
3662+
});
3663+
});
3664+
```
3665+
36083666
[RFC 8187]: https://www.rfc-editor.org/rfc/rfc8187.txt
36093667
[`'checkContinue'`]: #event-checkcontinue
36103668
[`'finish'`]: #event-finish

lib/_http_client.js

Lines changed: 18 additions & 1 deletion
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

@@ -927,5 +942,7 @@ ClientRequest.prototype.clearTimeout = function clearTimeout(cb) {
927942
};
928943

929944
module.exports = {
930-
ClientRequest
945+
ClientRequest,
946+
onClientRequestStartChannel,
947+
onClientResponseFinishChannel,
931948
};

lib/_http_server.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1080,5 +1080,7 @@ module.exports = {
10801080
setupConnectionsTracking,
10811081
storeHTTPOptions,
10821082
_connectionListener: connectionListener,
1083-
kServerResponse
1083+
kServerResponse,
1084+
onRequestStartChannel,
1085+
onResponseFinishChannel,
10841086
};

lib/http.js

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,11 @@ const {
2828
} = primordials;
2929

3030
const httpAgent = require('_http_agent');
31-
const { ClientRequest } = require('_http_client');
31+
const {
32+
ClientRequest,
33+
onClientRequestStartChannel,
34+
onClientResponseFinishChannel,
35+
} = require('_http_client');
3236
const { methods } = require('_http_common');
3337
const { IncomingMessage } = require('_http_incoming');
3438
const {
@@ -40,7 +44,9 @@ const {
4044
_connectionListener,
4145
STATUS_CODES,
4246
Server,
43-
ServerResponse
47+
ServerResponse,
48+
onRequestStartChannel,
49+
onResponseFinishChannel,
4450
} = require('_http_server');
4551
let maxHeaderSize;
4652

@@ -123,7 +129,13 @@ module.exports = {
123129
validateHeaderName,
124130
validateHeaderValue,
125131
get,
126-
request
132+
request,
133+
diagnosticsChannel: {
134+
onClientRequestStart: onClientRequestStartChannel,
135+
onClientResponseFinish: onClientResponseFinishChannel,
136+
onHTTPRequestStart: onRequestStartChannel,
137+
onHTTPResponseFinish: onResponseFinishChannel,
138+
},
127139
};
128140

129141
ObjectDefineProperty(module.exports, 'maxHeaderSize', {
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
'use strict';
2+
3+
const common = require('../common');
4+
const assert = require('assert');
5+
const http = require('http');
6+
7+
http.diagnosticsChannel.onClientRequestStart.subscribe(common.mustCall(({ request }) => {
8+
assert.strictEqual(typeof request, 'object');
9+
}));
10+
11+
http.diagnosticsChannel.onClientResponseFinish.subscribe(common.mustCall(({ request, response }) => {
12+
assert.strictEqual(typeof request, 'object');
13+
assert.strictEqual(typeof response, 'object');
14+
}));
15+
16+
http.diagnosticsChannel.onHTTPRequestStart.subscribe(common.mustCall(({
17+
request,
18+
response,
19+
socket,
20+
server,
21+
}) => {
22+
assert.strictEqual(typeof request, 'object');
23+
assert.strictEqual(typeof response, 'object');
24+
assert.strictEqual(typeof socket, 'object');
25+
assert.strictEqual(typeof server, 'object');
26+
}));
27+
28+
http.diagnosticsChannel.onHTTPResponseFinish.subscribe(common.mustCall(({
29+
request,
30+
response,
31+
socket,
32+
server,
33+
}) => {
34+
assert.strictEqual(typeof request, 'object');
35+
assert.strictEqual(typeof response, 'object');
36+
assert.strictEqual(typeof socket, 'object');
37+
assert.strictEqual(typeof server, 'object');
38+
}));
39+
40+
const server = http.createServer(common.mustCall((req, res) => {
41+
res.end('done');
42+
}));
43+
44+
server.listen(() => {
45+
const { port } = server.address();
46+
http.get(`http://localhost:${port}`, (res) => {
47+
res.resume();
48+
res.on('end', () => {
49+
server.close();
50+
});
51+
});
52+
});

0 commit comments

Comments
 (0)