1'use strict'; 2 3const common = require('../common'); 4const assert = require('assert'); 5const http = require('http'); 6const net = require('net'); 7 8const server = http.createServer(common.mustCall((req, res) => { 9 res.end(); 10}, 2)); 11 12server.keepAliveTimeout = common.platformTimeout(100); 13 14server.listen(0, common.mustCall(() => { 15 const port = server.address().port; 16 const socket = net.connect({ port }, common.mustCall(() => { 17 request(common.mustCall(() => { 18 // Make a second request on the same socket, after the keep-alive timeout 19 // has been set on the server side. 20 request(common.mustCall()); 21 })); 22 })); 23 24 server.on('timeout', common.mustCall(() => { 25 socket.end(); 26 server.close(); 27 })); 28 29 function request(callback) { 30 socket.setEncoding('utf8'); 31 socket.on('data', onData); 32 let response = ''; 33 34 // Simulate a client that sends headers slowly (with a period of inactivity 35 // that is longer than the keep-alive timeout). 36 socket.write('GET / HTTP/1.1\r\n' + 37 `Host: localhost:${port}\r\n`); 38 setTimeout(() => { 39 socket.write('Connection: keep-alive\r\n' + 40 '\r\n'); 41 }, common.platformTimeout(300)); 42 43 function onData(chunk) { 44 response += chunk; 45 if (chunk.includes('\r\n')) { 46 socket.removeListener('data', onData); 47 onHeaders(); 48 } 49 } 50 51 function onHeaders() { 52 assert.ok(response.includes('HTTP/1.1 200 OK\r\n')); 53 assert.ok(response.includes('Connection: keep-alive\r\n')); 54 callback(); 55 } 56 } 57})); 58