Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/nodejs/node.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'test/parallel/test-http-keep-alive-max-requests.js')
-rw-r--r--test/parallel/test-http-keep-alive-max-requests.js116
1 files changed, 116 insertions, 0 deletions
diff --git a/test/parallel/test-http-keep-alive-max-requests.js b/test/parallel/test-http-keep-alive-max-requests.js
new file mode 100644
index 00000000000..657b59ae6d9
--- /dev/null
+++ b/test/parallel/test-http-keep-alive-max-requests.js
@@ -0,0 +1,116 @@
+'use strict';
+
+const common = require('../common');
+const net = require('net');
+const http = require('http');
+const assert = require('assert');
+
+const bodySent = 'This is my request';
+
+function assertResponse(headers, body, expectClosed) {
+ if (expectClosed) {
+ assert.match(headers, /Connection: close\r\n/m);
+ assert.strictEqual(headers.search(/Keep-Alive: timeout=5\r\n/m), -1);
+ assert.match(body, /Hello World!/m);
+ } else {
+ assert.match(headers, /Connection: keep-alive\r\n/m);
+ assert.match(headers, /Keep-Alive: timeout=5\r\n/m);
+ assert.match(body, /Hello World!/m);
+ }
+}
+
+function writeRequest(socket, withBody) {
+ if (withBody) {
+ socket.write('POST / HTTP/1.1\r\n');
+ socket.write('Connection: keep-alive\r\n');
+ socket.write('Content-Type: text/plain\r\n');
+ socket.write(`Content-Length: ${bodySent.length}\r\n\r\n`);
+ socket.write(`${bodySent}\r\n`);
+ socket.write('\r\n\r\n');
+ } else {
+ socket.write('GET / HTTP/1.1\r\n');
+ socket.write('Connection: keep-alive\r\n');
+ socket.write('\r\n\r\n');
+ }
+}
+
+const server = http.createServer((req, res) => {
+ let body = '';
+ req.on('data', (data) => {
+ body += data;
+ });
+
+ req.on('end', () => {
+ if (req.method === 'POST') {
+ assert.strictEqual(bodySent, body);
+ }
+ res.writeHead(200, { 'Content-Type': 'text/plain' });
+ res.write('Hello World!');
+ res.end();
+ });
+});
+
+function initialRequests(socket, numberOfRequests, cb) {
+ let buffer = '';
+
+ writeRequest(socket);
+
+ socket.on('data', (data) => {
+ buffer += data;
+
+ if (buffer.endsWith('\r\n\r\n')) {
+ if (--numberOfRequests === 0) {
+ socket.removeAllListeners('data');
+ cb();
+ } else {
+ const [headers, body] = buffer.trim().split('\r\n\r\n');
+ assertResponse(headers, body);
+ buffer = '';
+ writeRequest(socket, true);
+ }
+ }
+ });
+}
+
+
+server.maxRequestsPerSocket = 3;
+server.listen(0, common.mustCall((res) => {
+ const socket = new net.Socket();
+ const anotherSocket = new net.Socket();
+
+ socket.on('end', common.mustCall(() => {
+ server.close();
+ }));
+
+ socket.on('ready', common.mustCall(() => {
+ // Do 2 of 3 allowed requests and ensure they still alive
+ initialRequests(socket, 2, common.mustCall(() => {
+ anotherSocket.connect({ port: server.address().port });
+ }));
+ }));
+
+ anotherSocket.on('ready', common.mustCall(() => {
+ // Do another 2 requests with another socket
+ // enusre that this will not affect the first socket
+ initialRequests(anotherSocket, 2, common.mustCall(() => {
+ let buffer = '';
+
+ // Send the rest of the calls to the first socket
+ // and see connection is closed
+ socket.on('data', common.mustCall((data) => {
+ buffer += data;
+
+ if (buffer.endsWith('\r\n\r\n')) {
+ const [headers, body] = buffer.trim().split('\r\n\r\n');
+ assertResponse(headers, body, true);
+ anotherSocket.end();
+ socket.end();
+ }
+ }));
+
+ writeRequest(socket, true);
+ }));
+ }));
+
+ socket.connect({ port: server.address().port });
+}));