| 'use strict'; |
| |
| const common = require('../common'); |
| const assert = require('assert'); |
| const http = require('http'); |
| const net = require('net'); |
| |
| const server = http.createServer(common.mustCall((req, res) => { |
| res.end(); |
| }, 2)); |
| |
| server.keepAliveTimeout = common.platformTimeout(100); |
| |
| server.listen(0, common.mustCall(() => { |
| const port = server.address().port; |
| const socket = net.connect({ port }, common.mustCall(() => { |
| request(common.mustCall(() => { |
| // Make a second request on the same socket, after the keep-alive timeout |
| // has been set on the server side. |
| request(common.mustCall()); |
| })); |
| })); |
| |
| server.on('timeout', common.mustCall(() => { |
| socket.end(); |
| server.close(); |
| })); |
| |
| function request(callback) { |
| socket.setEncoding('utf8'); |
| socket.on('data', onData); |
| let response = ''; |
| |
| // Simulate a client that sends headers slowly (with a period of inactivity |
| // that is longer than the keep-alive timeout). |
| socket.write('GET / HTTP/1.1\r\n' + |
| `Host: localhost:${port}\r\n`); |
| setTimeout(() => { |
| socket.write('Connection: keep-alive\r\n' + |
| '\r\n'); |
| }, common.platformTimeout(300)); |
| |
| function onData(chunk) { |
| response += chunk; |
| if (chunk.includes('\r\n')) { |
| socket.removeListener('data', onData); |
| onHeaders(); |
| } |
| } |
| |
| function onHeaders() { |
| assert.ok(response.includes('HTTP/1.1 200 OK\r\n')); |
| assert.ok(response.includes('Connection: keep-alive\r\n')); |
| callback(); |
| } |
| } |
| })); |