diff --git a/docs/docs/api/DiagnosticsChannel.md b/docs/docs/api/DiagnosticsChannel.md index cb0421d84d4..099c072f6c6 100644 --- a/docs/docs/api/DiagnosticsChannel.md +++ b/docs/docs/api/DiagnosticsChannel.md @@ -20,6 +20,8 @@ diagnosticsChannel.channel('undici:request:create').subscribe(({ request }) => { console.log('method', request.method) console.log('path', request.path) console.log('headers') // array of strings, e.g: ['foo', 'bar'] + request.addHeader('hello', 'world') + console.log('headers', request.headers) // e.g. ['foo', 'bar', 'hello', 'world'] }) ``` diff --git a/lib/core/request.js b/lib/core/request.js index 6d9ebc8bc8f..37839d3c949 100644 --- a/lib/core/request.js +++ b/lib/core/request.js @@ -91,8 +91,6 @@ class Request { this.abort = null - this.publicInterface = null - if (body == null) { this.body = null } else if (isStream(body)) { @@ -189,32 +187,10 @@ class Request { this[kHandler] = handler if (channels.create.hasSubscribers) { - channels.create.publish({ request: this.getPublicInterface() }) + channels.create.publish({ request: this }) } } - getPublicInterface () { - const self = this - this.publicInterface ??= { - get origin () { - return self.origin - }, - get method () { - return self.method - }, - get path () { - return self.path - }, - get headers () { - return self.headers - }, - get completed () { - return self.completed - } - } - return this.publicInterface - } - onBodySent (chunk) { if (this[kHandler].onBodySent) { try { @@ -227,7 +203,7 @@ class Request { onRequestSent () { if (channels.bodySent.hasSubscribers) { - channels.bodySent.publish({ request: this.getPublicInterface() }) + channels.bodySent.publish({ request: this }) } if (this[kHandler].onRequestSent) { @@ -260,7 +236,7 @@ class Request { assert(!this.completed) if (channels.headers.hasSubscribers) { - channels.headers.publish({ request: this.getPublicInterface(), response: { statusCode, headers, statusText } }) + channels.headers.publish({ request: this, response: { statusCode, headers, statusText } }) } try { @@ -296,7 +272,7 @@ class Request { this.completed = true if (channels.trailers.hasSubscribers) { - channels.trailers.publish({ request: this.getPublicInterface(), trailers }) + channels.trailers.publish({ request: this, trailers }) } try { @@ -311,7 +287,7 @@ class Request { this.onFinally() if (channels.error.hasSubscribers) { - channels.error.publish({ request: this.getPublicInterface(), error }) + channels.error.publish({ request: this, error }) } if (this.aborted) { @@ -333,6 +309,11 @@ class Request { this.endHandler = null } } + + addHeader (key, value) { + processHeader(this, key, value) + return this + } } function processHeader (request, key, val) { diff --git a/lib/dispatcher/client-h1.js b/lib/dispatcher/client-h1.js index da70f7d8313..62a3e29ef24 100644 --- a/lib/dispatcher/client-h1.js +++ b/lib/dispatcher/client-h1.js @@ -993,7 +993,7 @@ function writeH1 (client, request) { } if (channels.sendHeaders.hasSubscribers) { - channels.sendHeaders.publish({ request: request.getPublicInterface(), headers: header, socket }) + channels.sendHeaders.publish({ request, headers: header, socket }) } /* istanbul ignore else: assertion */ diff --git a/test/node-test/diagnostics-channel/get.js b/test/node-test/diagnostics-channel/get.js index 261c136f740..397dfa3bc5f 100644 --- a/test/node-test/diagnostics-channel/get.js +++ b/test/node-test/diagnostics-channel/get.js @@ -7,7 +7,7 @@ const { Client } = require('../../..') const { createServer } = require('node:http') test('Diagnostics channel - get', (t) => { - const assert = tspl(t, { plan: 31 }) + const assert = tspl(t, { plan: 32 }) const server = createServer((req, res) => { res.setHeader('Content-Type', 'text/plain') res.setHeader('trailer', 'foo') @@ -33,6 +33,8 @@ test('Diagnostics channel - get', (t) => { assert.equal(request.method, 'GET') assert.equal(request.path, '/') assert.deepStrictEqual(request.headers, ['bar', 'bar']) + request.addHeader('hello', 'world') + assert.deepStrictEqual(request.headers, ['bar', 'bar', 'hello', 'world']) }) let _connector @@ -75,7 +77,8 @@ test('Diagnostics channel - get', (t) => { 'GET / HTTP/1.1', `host: localhost:${server.address().port}`, 'connection: keep-alive', - 'bar: bar' + 'bar: bar', + 'hello: world' ] assert.deepStrictEqual(headers, expectedHeaders.join('\r\n') + '\r\n') diff --git a/test/node-test/diagnostics-channel/post-stream.js b/test/node-test/diagnostics-channel/post-stream.js index 9cc5540290b..881873a7c1c 100644 --- a/test/node-test/diagnostics-channel/post-stream.js +++ b/test/node-test/diagnostics-channel/post-stream.js @@ -8,7 +8,7 @@ const { Client } = require('../../..') const { createServer } = require('node:http') test('Diagnostics channel - post stream', (t) => { - const assert = tspl(t, { plan: 31 }) + const assert = tspl(t, { plan: 33 }) const server = createServer((req, res) => { req.resume() res.setHeader('Content-Type', 'text/plain') @@ -34,6 +34,9 @@ test('Diagnostics channel - post stream', (t) => { assert.equal(request.method, 'POST') assert.equal(request.path, '/') assert.deepStrictEqual(request.headers, ['bar', 'bar']) + request.addHeader('hello', 'world') + assert.deepStrictEqual(request.headers, ['bar', 'bar', 'hello', 'world']) + assert.deepStrictEqual(request.body, body) }) let _connector @@ -76,7 +79,8 @@ test('Diagnostics channel - post stream', (t) => { 'POST / HTTP/1.1', `host: localhost:${server.address().port}`, 'connection: keep-alive', - 'bar: bar' + 'bar: bar', + 'hello: world' ] assert.equal(headers, expectedHeaders.join('\r\n') + '\r\n') diff --git a/test/node-test/diagnostics-channel/post.js b/test/node-test/diagnostics-channel/post.js index 06c56b673ac..1408ffbf023 100644 --- a/test/node-test/diagnostics-channel/post.js +++ b/test/node-test/diagnostics-channel/post.js @@ -7,7 +7,7 @@ const { Client } = require('../../../') const { createServer } = require('node:http') test('Diagnostics channel - post', (t) => { - const assert = tspl(t, { plan: 31 }) + const assert = tspl(t, { plan: 33 }) const server = createServer((req, res) => { req.resume() res.setHeader('Content-Type', 'text/plain') @@ -32,6 +32,9 @@ test('Diagnostics channel - post', (t) => { assert.equal(request.method, 'POST') assert.equal(request.path, '/') assert.deepStrictEqual(request.headers, ['bar', 'bar']) + request.addHeader('hello', 'world') + assert.deepStrictEqual(request.headers, ['bar', 'bar', 'hello', 'world']) + assert.deepStrictEqual(request.body, Buffer.from('hello world')) }) let _connector @@ -74,7 +77,8 @@ test('Diagnostics channel - post', (t) => { 'POST / HTTP/1.1', `host: localhost:${server.address().port}`, 'connection: keep-alive', - 'bar: bar' + 'bar: bar', + 'hello: world' ] assert.deepStrictEqual(headers, expectedHeaders.join('\r\n') + '\r\n')