diff --git a/packages/node/src/transports/http.ts b/packages/node/src/transports/http.ts index 52df8244461e..687325b776f4 100644 --- a/packages/node/src/transports/http.ts +++ b/packages/node/src/transports/http.ts @@ -23,6 +23,8 @@ export interface NodeTransportOptions extends BaseTransportOptions { caCerts?: string | Buffer | Array; /** Custom HTTP module. Defaults to the native 'http' and 'https' modules. */ httpModule?: HTTPModule; + /** Allow overriding connection keepAlive, defaults to false */ + keepAlive?: boolean; } // Estimated maximum size for reasonable standalone event @@ -56,12 +58,13 @@ export function makeNodeTransport(options: NodeTransportOptions): Transport { ); const nativeHttpModule = isHttps ? https : http; + const keepAlive = options.keepAlive === undefined ? false : options.keepAlive; // TODO(v7): Evaluate if we can set keepAlive to true. This would involve testing for memory leaks in older node // versions(>= 8) as they had memory leaks when using it: #2555 const agent = proxy ? (new (require('https-proxy-agent'))(proxy) as http.Agent) - : new nativeHttpModule.Agent({ keepAlive: false, maxSockets: 30, timeout: 2000 }); + : new nativeHttpModule.Agent({ keepAlive, maxSockets: 30, timeout: 2000 }); const requestExecutor = createRequestExecutor(options, options.httpModule ?? nativeHttpModule, agent); return createTransport(options, requestExecutor); diff --git a/packages/node/test/transports/http.test.ts b/packages/node/test/transports/http.test.ts index e2e4af2352b9..9594940c2014 100644 --- a/packages/node/test/transports/http.test.ts +++ b/packages/node/test/transports/http.test.ts @@ -108,6 +108,20 @@ describe('makeNewHttpTransport()', () => { await transport.send(EVENT_ENVELOPE); }); + it('allows overriding keepAlive', async () => { + await setupTestServer({ statusCode: SUCCESS }, req => { + expect(req.headers).toEqual( + expect.objectContaining({ + // node http module lower-cases incoming headers + connection: 'keep-alive', + }), + ); + }); + + const transport = makeNodeTransport({ keepAlive: true, ...defaultOptions }); + await transport.send(EVENT_ENVELOPE); + }); + it('should correctly send user-provided headers to server', async () => { await setupTestServer({ statusCode: SUCCESS }, req => { expect(req.headers).toEqual(