mirror of
https://github.com/nodejs/node.git
synced 2026-10-14 10:26:26 -04:00
http2: close idle connections when allowHTTP1 is true
Fixes: https://github.com/nodejs/node/issues/51493 PR-URL: https://github.com/nodejs/node/pull/51569 Reviewed-By: Matteo Collina <matteo.collina@gmail.com> Reviewed-By: Stephen Belanger <admin@stephenbelanger.com> Reviewed-By: Marco Ippolito <marcoippolito54@gmail.com>
This commit is contained in:
1 parent
a3e0834ee4
commit
d1114c485d
2 files changed
+74
-1
No files matched your search
@@ -59,7 +59,7 @@ const {
|
||||
kIncomingMessage,
|
||||
_checkIsHttpToken: checkIsHttpToken,
|
||||
} = require('_http_common');
|
||||
const { kServerResponse } = require('_http_server');
|
||||
const { kServerResponse, Server: HttpServer, httpServerPreClose, setupConnectionsTracking } = require('_http_server');
|
||||
const JSStreamSocket = require('internal/js_stream_socket');
|
||||
|
||||
const {
|
||||
@@ -3180,6 +3180,11 @@ class Http2SecureServer extends TLSServer {
|
||||
this[kOptions] = options;
|
||||
this.timeout = 0;
|
||||
this.on('newListener', setupCompat);
|
||||
if (options.allowHTTP1 === true) {
|
||||
this.headersTimeout = 60_000; // Minimum between 60 seconds or requestTimeout
|
||||
this.requestTimeout = 300_000; // 5 minutes
|
||||
this.on('listening', setupConnectionsTracking);
|
||||
}
|
||||
if (typeof requestListener === 'function')
|
||||
this.on('request', requestListener);
|
||||
this.on('tlsClientError', onErrorSecureServerSession);
|
||||
@@ -3199,6 +3204,19 @@ class Http2SecureServer extends TLSServer {
|
||||
validateSettings(settings);
|
||||
this[kOptions].settings = { ...this[kOptions].settings, ...settings };
|
||||
}
|
||||
|
||||
close() {
|
||||
if (this[kOptions].allowHTTP1 === true) {
|
||||
httpServerPreClose(this);
|
||||
}
|
||||
ReflectApply(TLSServer.prototype.close, this, arguments);
|
||||
}
|
||||
|
||||
closeIdleConnections() {
|
||||
if (this[kOptions].allowHTTP1 === true) {
|
||||
ReflectApply(HttpServer.prototype.closeIdleConnections, this, arguments);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class Http2Server extends NETServer {
|
||||
|
||||
@@ -0,0 +1,55 @@
|
||||
'use strict';
|
||||
|
||||
const common = require('../common');
|
||||
const fixtures = require('../common/fixtures');
|
||||
if (!common.hasCrypto) common.skip('missing crypto');
|
||||
|
||||
const assert = require('assert');
|
||||
const https = require('https');
|
||||
const http2 = require('http2');
|
||||
|
||||
(async function main() {
|
||||
const server = http2.createSecureServer({
|
||||
key: fixtures.readKey('agent1-key.pem'),
|
||||
cert: fixtures.readKey('agent1-cert.pem'),
|
||||
allowHTTP1: true,
|
||||
});
|
||||
|
||||
server.on(
|
||||
'request',
|
||||
common.mustCall((req, res) => {
|
||||
res.writeHead(200);
|
||||
res.end();
|
||||
})
|
||||
);
|
||||
|
||||
server.on(
|
||||
'close',
|
||||
common.mustCall()
|
||||
);
|
||||
|
||||
await new Promise((resolve) => server.listen(0, resolve));
|
||||
|
||||
await new Promise((resolve) =>
|
||||
https.get(
|
||||
`https://localhost:${server.address().port}`,
|
||||
{
|
||||
rejectUnauthorized: false,
|
||||
headers: { connection: 'keep-alive' },
|
||||
},
|
||||
resolve
|
||||
)
|
||||
);
|
||||
|
||||
let serverClosed = false;
|
||||
setImmediate(
|
||||
common.mustCall(() => {
|
||||
assert.ok(serverClosed, 'server should been closed immediately');
|
||||
})
|
||||
);
|
||||
server.close(
|
||||
common.mustSucceed(() => {
|
||||
serverClosed = true;
|
||||
})
|
||||
);
|
||||
})().then(common.mustCall());
|
||||
Reference in new issue
Block a user