diff options
author | Shogun <paolo@cowtech.it> | 2022-04-28 13:05:55 +0300 |
---|---|---|
committer | Shogun <paolo@cowtech.it> | 2022-05-03 15:04:07 +0300 |
commit | f714a0fa6e5630aa959ee4bda10345ba81161fc5 (patch) | |
tree | c6acfe431b006553d9e55acae8e380c6cd5be271 /test | |
parent | 6ebe5a4ff0f2f196eb8502c067da4f2cca3d241a (diff) |
http: added connection closing methods
Fixes: https://github.com/nodejs/node/issues/41578
PR-URL: https://github.com/nodejs/node/pull/42812
Reviewed-By: Matteo Collina <matteo.collina@gmail.com>
Reviewed-By: Luigi Pinca <luigipinca@gmail.com>
Diffstat (limited to 'test')
-rw-r--r-- | test/parallel/test-http-server-close-all.js | 57 | ||||
-rw-r--r-- | test/parallel/test-http-server-close-idle.js | 69 | ||||
-rw-r--r-- | test/parallel/test-https-server-close-all.js | 68 | ||||
-rw-r--r-- | test/parallel/test-https-server-close-idle.js | 80 |
4 files changed, 274 insertions, 0 deletions
diff --git a/test/parallel/test-http-server-close-all.js b/test/parallel/test-http-server-close-all.js new file mode 100644 index 00000000000..79fc5c75b70 --- /dev/null +++ b/test/parallel/test-http-server-close-all.js @@ -0,0 +1,57 @@ +'use strict'; +const common = require('../common'); +const assert = require('assert'); + +const { createServer } = require('http'); +const { connect } = require('net'); + +let connections = 0; + +const server = createServer(common.mustCall(function(req, res) { + res.writeHead(200, { Connection: 'keep-alive' }); + res.end(); +}), { + headersTimeout: 0, + keepAliveTimeout: 0, + requestTimeout: common.platformTimeout(60000), +}); + +server.on('connection', function() { + connections++; +}); + +server.listen(0, function() { + const port = server.address().port; + + // Create a first request but never finish it + const client1 = connect(port); + + client1.on('close', common.mustCall()); + + client1.on('error', () => {}); + + client1.write('GET / HTTP/1.1'); + + // Create a second request, let it finish but leave the connection opened using HTTP keep-alive + const client2 = connect(port); + let response = ''; + + client2.on('data', common.mustCall((chunk) => { + response += chunk.toString('utf-8'); + + if (response.endsWith('0\r\n\r\n')) { + assert(response.startsWith('HTTP/1.1 200 OK\r\nConnection: keep-alive')); + assert.strictEqual(connections, 2); + + server.closeAllConnections(); + server.close(common.mustCall()); + + // This timer should never go off as the server.close should shut everything down + setTimeout(common.mustNotCall(), common.platformTimeout(1500)).unref(); + } + })); + + client2.on('close', common.mustCall()); + + client2.write('GET / HTTP/1.1\r\n\r\n'); +}); diff --git a/test/parallel/test-http-server-close-idle.js b/test/parallel/test-http-server-close-idle.js new file mode 100644 index 00000000000..b9389f1e599 --- /dev/null +++ b/test/parallel/test-http-server-close-idle.js @@ -0,0 +1,69 @@ +'use strict'; +const common = require('../common'); +const assert = require('assert'); + +const { createServer } = require('http'); +const { connect } = require('net'); + +let connections = 0; + +const server = createServer(common.mustCall(function(req, res) { + res.writeHead(200, { Connection: 'keep-alive' }); + res.end(); +}), { + headersTimeout: 0, + keepAliveTimeout: 0, + requestTimeout: common.platformTimeout(60000), +}); + +server.on('connection', function() { + connections++; +}); + +server.listen(0, function() { + const port = server.address().port; + let client1Closed = false; + let client2Closed = false; + + // Create a first request but never finish it + const client1 = connect(port); + + client1.on('close', common.mustCall(() => { + client1Closed = true; + })); + + client1.on('error', () => {}); + + client1.write('GET / HTTP/1.1'); + + // Create a second request, let it finish but leave the connection opened using HTTP keep-alive + const client2 = connect(port); + let response = ''; + + client2.on('data', common.mustCall((chunk) => { + response += chunk.toString('utf-8'); + + if (response.endsWith('0\r\n\r\n')) { + assert(response.startsWith('HTTP/1.1 200 OK\r\nConnection: keep-alive')); + assert.strictEqual(connections, 2); + + server.closeIdleConnections(); + server.close(common.mustCall()); + + // Check that only the idle connection got closed + setTimeout(common.mustCall(() => { + assert(!client1Closed); + assert(client2Closed); + + server.closeAllConnections(); + server.close(common.mustCall()); + }), common.platformTimeout(500)).unref(); + } + })); + + client2.on('close', common.mustCall(() => { + client2Closed = true; + })); + + client2.write('GET / HTTP/1.1\r\n\r\n'); +}); diff --git a/test/parallel/test-https-server-close-all.js b/test/parallel/test-https-server-close-all.js new file mode 100644 index 00000000000..408af625d1f --- /dev/null +++ b/test/parallel/test-https-server-close-all.js @@ -0,0 +1,68 @@ +'use strict'; +const common = require('../common'); +const assert = require('assert'); + +if (!common.hasCrypto) { + common.skip('missing crypto'); +} + +const { createServer } = require('https'); +const { connect } = require('tls'); + +const fixtures = require('../common/fixtures'); + +const options = { + key: fixtures.readKey('agent1-key.pem'), + cert: fixtures.readKey('agent1-cert.pem') +}; + +let connections = 0; + +const server = createServer(options, common.mustCall(function(req, res) { + res.writeHead(200, { Connection: 'keep-alive' }); + res.end(); +}), { + headersTimeout: 0, + keepAliveTimeout: 0, + requestTimeout: common.platformTimeout(60000), +}); + +server.on('connection', function() { + connections++; +}); + +server.listen(0, function() { + const port = server.address().port; + + // Create a first request but never finish it + const client1 = connect({ port, rejectUnauthorized: false }); + + client1.on('close', common.mustCall()); + + client1.on('error', () => {}); + + client1.write('GET / HTTP/1.1'); + + // Create a second request, let it finish but leave the connection opened using HTTP keep-alive + const client2 = connect({ port, rejectUnauthorized: false }); + let response = ''; + + client2.on('data', common.mustCall((chunk) => { + response += chunk.toString('utf-8'); + + if (response.endsWith('0\r\n\r\n')) { + assert(response.startsWith('HTTP/1.1 200 OK\r\nConnection: keep-alive')); + assert.strictEqual(connections, 2); + + server.closeAllConnections(); + server.close(common.mustCall()); + + // This timer should never go off as the server.close should shut everything down + setTimeout(common.mustNotCall(), common.platformTimeout(1500)).unref(); + } + })); + + client2.on('close', common.mustCall()); + + client2.write('GET / HTTP/1.1\r\n\r\n'); +}); diff --git a/test/parallel/test-https-server-close-idle.js b/test/parallel/test-https-server-close-idle.js new file mode 100644 index 00000000000..ea43c4367cb --- /dev/null +++ b/test/parallel/test-https-server-close-idle.js @@ -0,0 +1,80 @@ +'use strict'; +const common = require('../common'); +const assert = require('assert'); + +if (!common.hasCrypto) { + common.skip('missing crypto'); +} + +const { createServer } = require('https'); +const { connect } = require('tls'); + +const fixtures = require('../common/fixtures'); + +const options = { + key: fixtures.readKey('agent1-key.pem'), + cert: fixtures.readKey('agent1-cert.pem') +}; + +let connections = 0; + +const server = createServer(options, common.mustCall(function(req, res) { + res.writeHead(200, { Connection: 'keep-alive' }); + res.end(); +}), { + headersTimeout: 0, + keepAliveTimeout: 0, + requestTimeout: common.platformTimeout(60000), +}); + +server.on('connection', function() { + connections++; +}); + +server.listen(0, function() { + const port = server.address().port; + let client1Closed = false; + let client2Closed = false; + + // Create a first request but never finish it + const client1 = connect({ port, rejectUnauthorized: false }); + + client1.on('close', common.mustCall(() => { + client1Closed = true; + })); + + client1.on('error', () => {}); + + client1.write('GET / HTTP/1.1'); + + // Create a second request, let it finish but leave the connection opened using HTTP keep-alive + const client2 = connect({ port, rejectUnauthorized: false }); + let response = ''; + + client2.on('data', common.mustCall((chunk) => { + response += chunk.toString('utf-8'); + + if (response.endsWith('0\r\n\r\n')) { + assert(response.startsWith('HTTP/1.1 200 OK\r\nConnection: keep-alive')); + assert.strictEqual(connections, 2); + + server.closeIdleConnections(); + server.close(common.mustCall()); + + // Check that only the idle connection got closed + setTimeout(common.mustCall(() => { + assert(!client1Closed); + assert(client2Closed); + + server.closeAllConnections(); + server.close(common.mustCall()); + }), common.platformTimeout(500)).unref(); + } + })); + + client2.on('close', common.mustCall(() => { + client2Closed = true; + })); + + client2.write('GET / HTTP/1.1\r\n\r\n'); +}); |