From d477e2e14781b445e31f435ed5adad4c28f08ef6 Mon Sep 17 00:00:00 2001 From: "atian25@qq.com" Date: Tue, 13 Oct 2020 09:49:31 +0800 Subject: [PATCH] http: only set keep-alive when not exists Backport-PR-URL: https://github.com/nodejs/node/pull/35623 PR-URL: https://github.com/nodejs/node/pull/35138 Fixes: https://github.com/nodejs/node/pull/34561 Reviewed-By: Ricky Zhou <0x19951125@gmail.com> Reviewed-By: Robert Nagy Reviewed-By: Luigi Pinca Reviewed-By: Trivikram Kamat Reviewed-By: Zeyu Yang --- lib/_http_outgoing.js | 8 +++-- .../test-http-keep-alive-timeout-custom.js | 31 +++++++++++++++++++ test/parallel/test-http-keep-alive-timeout.js | 2 +- 3 files changed, 38 insertions(+), 3 deletions(-) create mode 100644 test/parallel/test-http-keep-alive-timeout-custom.js diff --git a/lib/_http_outgoing.js b/lib/_http_outgoing.js index 8de389e1f09dd4..1e1e65736d98a8 100644 --- a/lib/_http_outgoing.js +++ b/lib/_http_outgoing.js @@ -98,6 +98,7 @@ function OutgoingMessage() { this._last = false; this.chunkedEncoding = false; this.shouldKeepAlive = true; + this._defaultKeepAlive = true; this.useChunkedEncodingByDefault = true; this.sendDate = false; this._removedConnection = false; @@ -405,8 +406,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 { @@ -502,6 +503,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 });