diff --git a/lib/_http_outgoing.js b/lib/_http_outgoing.js index f444be8687db34..e683b61e94a927 100644 --- a/lib/_http_outgoing.js +++ b/lib/_http_outgoing.js @@ -104,6 +104,7 @@ function OutgoingMessage() { this._last = false; this.chunkedEncoding = false; this.shouldKeepAlive = true; + this._defaultKeepAlive = true; this.useChunkedEncodingByDefault = true; this.sendDate = false; this._removedConnection = false; @@ -427,8 +428,8 @@ function _storeHeader(firstLine, headers) { (state.contLen || this.useChunkedEncodingByDefault || this.agent); if (shouldSendKeepAlive) { header += 'Connection: keep-alive\r\n'; - if (this._keepAliveTimeout) { - const timeoutSeconds = MathFloor(this._keepAliveTimeout) / 1000; + if (this._keepAliveTimeout && this._defaultKeepAlive) { + const timeoutSeconds = MathFloor(this._keepAliveTimeout / 1000); header += `Keep-Alive: timeout=${timeoutSeconds}\r\n`; } } else { @@ -524,6 +525,9 @@ function matchHeader(self, state, field, value) { case 'trailer': state[field] = true; break; + case 'keep-alive': + self._defaultKeepAlive = false; + break; } } diff --git a/test/parallel/test-http-keep-alive-timeout-custom.js b/test/parallel/test-http-keep-alive-timeout-custom.js new file mode 100644 index 00000000000000..a74aa5a2127b85 --- /dev/null +++ b/test/parallel/test-http-keep-alive-timeout-custom.js @@ -0,0 +1,31 @@ +'use strict'; + +const common = require('../common'); +const http = require('http'); +const assert = require('assert'); + +const server = http.createServer(common.mustCall((req, res) => { + const body = 'hello world\n'; + + res.writeHead(200, { + 'Content-Length': body.length, + 'Keep-Alive': 'timeout=50' + }); + res.write(body); + res.end(); +})); +server.keepAliveTimeout = 12010; + +const agent = new http.Agent({ maxSockets: 1, keepAlive: true }); + +server.listen(0, common.mustCall(function() { + http.get({ + path: '/', port: this.address().port, agent: agent + }, common.mustCall((response) => { + response.resume(); + assert.strictEqual( + response.headers['keep-alive'], 'timeout=50'); + server.close(); + agent.destroy(); + })); +})); diff --git a/test/parallel/test-http-keep-alive-timeout.js b/test/parallel/test-http-keep-alive-timeout.js index fccb267b8e9ee2..94f8adc4d86076 100644 --- a/test/parallel/test-http-keep-alive-timeout.js +++ b/test/parallel/test-http-keep-alive-timeout.js @@ -11,7 +11,7 @@ const server = http.createServer(common.mustCall((req, res) => { res.write(body); res.end(); })); -server.keepAliveTimeout = 12000; +server.keepAliveTimeout = 12010; const agent = new http.Agent({ maxSockets: 1, keepAlive: true });