Skip to content

Commit 0a7f301

Browse files
marco-ippolitoruyadorno
authored andcommitted
http: add diagnostic channel http.server.response.created
PR-URL: #55622 Reviewed-By: Matteo Collina <matteo.collina@gmail.com> Reviewed-By: Paolo Insogna <paolo@cowtech.it>
1 parent f1e0e0b commit 0a7f301

4 files changed

+68
-0
lines changed

doc/api/diagnostics_channel.md

+8
Original file line numberDiff line numberDiff line change
@@ -1158,6 +1158,14 @@ Emitted when client receives a response.
11581158

11591159
Emitted when server receives a request.
11601160

1161+
`http.server.response.created`
1162+
1163+
* `request` {http.IncomingMessage}
1164+
* `response` {http.ServerResponse}
1165+
1166+
Emitted when server creates a response.
1167+
The event is emitted before the response is sent.
1168+
11611169
`http.server.response.finish`
11621170

11631171
* `request` {http.IncomingMessage}

lib/_http_server.js

+7
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@ let debug = require('internal/util/debuglog').debuglog('http', (fn) => {
9797

9898
const dc = require('diagnostics_channel');
9999
const onRequestStartChannel = dc.channel('http.server.request.start');
100+
const onResponseCreatedChannel = dc.channel('http.server.response.created');
100101
const onResponseFinishChannel = dc.channel('http.server.response.finish');
101102

102103
const kServerResponse = Symbol('ServerResponse');
@@ -224,6 +225,12 @@ function ServerResponse(req, options) {
224225
this._traceEventId = getNextTraceEventId();
225226
traceBegin(HTTP_SERVER_TRACE_EVENT_NAME, this._traceEventId);
226227
}
228+
if (onResponseCreatedChannel.hasSubscribers) {
229+
onResponseCreatedChannel.publish({
230+
request: req,
231+
response: this,
232+
});
233+
}
227234
}
228235
ObjectSetPrototypeOf(ServerResponse.prototype, OutgoingMessage.prototype);
229236
ObjectSetPrototypeOf(ServerResponse, OutgoingMessage);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
'use strict';
2+
const common = require('../common');
3+
const assert = require('assert');
4+
const http = require('http');
5+
const dc = require('diagnostics_channel');
6+
7+
const isOutgoingMessage = (object) => object instanceof http.OutgoingMessage;
8+
const isIncomingMessage = (object) => object instanceof http.IncomingMessage;
9+
10+
dc.subscribe('http.server.response.created', common.mustCall(({
11+
request,
12+
response,
13+
}) => {
14+
assert.strictEqual(request.headers.foo, 'bar');
15+
assert.strictEqual(response.getHeader('baz'), undefined);
16+
assert.strictEqual(isIncomingMessage(request), true);
17+
assert.strictEqual(isOutgoingMessage(response), true);
18+
}));
19+
20+
dc.subscribe('http.server.response.finish', common.mustCall(({
21+
request,
22+
response,
23+
}) => {
24+
assert.strictEqual(request.headers.foo, 'bar');
25+
assert.strictEqual(response.getHeader('baz'), 'bar');
26+
assert.strictEqual(isIncomingMessage(request), true);
27+
assert.strictEqual(isOutgoingMessage(response), true);
28+
}));
29+
30+
const server = http.createServer(common.mustCall((_, res) => {
31+
res.setHeader('baz', 'bar');
32+
res.end('done');
33+
}));
34+
35+
server.listen(() => {
36+
const { port } = server.address();
37+
http.get({
38+
port,
39+
headers: {
40+
'foo': 'bar',
41+
}
42+
}, common.mustCall(() => {
43+
server.close();
44+
}));
45+
});

test/parallel/test-diagnostics-channel-http.js

+8
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,14 @@ dc.subscribe('http.server.response.finish', common.mustCall(({
5353
assert.strictEqual(isHTTPServer(server), true);
5454
}));
5555

56+
dc.subscribe('http.server.response.created', common.mustCall(({
57+
request,
58+
response,
59+
}) => {
60+
assert.strictEqual(isIncomingMessage(request), true);
61+
assert.strictEqual(isOutgoingMessage(response), true);
62+
}));
63+
5664
dc.subscribe('http.client.request.created', common.mustCall(({ request }) => {
5765
assert.strictEqual(isOutgoingMessage(request), true);
5866
assert.strictEqual(isHTTPServer(server), true);

0 commit comments

Comments
 (0)