1'use strict'; 2 3const common = require('../common'); 4const assert = require('assert'); 5const { createServer } = require('http'); 6const { connect } = require('net'); 7 8// This test validates that the server returns 408 9// after server.headersTimeout if the client 10// does not send headers before the timeout, and 11// that keep alive works properly. 12 13function performRequestWithDelay(client, firstDelay, secondDelay, closeAfter) { 14 client.resume(); 15 client.write('GET / HTTP/1.1\r\n'); 16 17 setTimeout(() => { 18 client.write('Connection: '); 19 }, firstDelay).unref(); 20 21 // Complete the request 22 setTimeout(() => { 23 client.write(`${closeAfter ? 'close' : 'keep-alive'}\r\n\r\n`); 24 }, firstDelay + secondDelay).unref(); 25} 26 27const headersTimeout = common.platformTimeout(5000); 28const server = createServer({ 29 headersTimeout, 30 requestTimeout: 0, 31 keepAliveTimeout: 0, 32 connectionsCheckingInterval: headersTimeout / 4, 33}, common.mustCallAtLeast((req, res) => { 34 res.writeHead(200, { 'Content-Type': 'text/plain' }); 35 res.end(); 36})); 37 38assert.strictEqual(server.headersTimeout, headersTimeout); 39 40// Check that timeout event is not triggered 41server.once('timeout', common.mustNotCall((socket) => { 42 socket.destroy(); 43})); 44 45server.listen(0, common.mustCall(() => { 46 const client = connect(server.address().port); 47 let second = false; 48 let response = ''; 49 50 client.setEncoding('utf8'); 51 client.on('data', common.mustCallAtLeast((chunk) => { 52 response += chunk; 53 54 // First response has ended 55 if (!second && response.endsWith('\r\n\r\n')) { 56 assert.strictEqual( 57 response.split('\r\n')[0], 58 'HTTP/1.1 200 OK' 59 ); 60 61 const defer = headersTimeout * 1.5; 62 63 // Wait some time to make sure headersTimeout 64 // does not interfere with keep alive 65 setTimeout(() => { 66 response = ''; 67 second = true; 68 69 // Perform a second request expected to finish after headersTimeout 70 performRequestWithDelay( 71 client, 72 headersTimeout / 5, 73 headersTimeout, 74 true 75 ); 76 }, defer).unref(); 77 } 78 }, 1)); 79 80 const errOrEnd = common.mustCall(function(err) { 81 assert.strictEqual(second, true); 82 assert.strictEqual( 83 response, 84 'HTTP/1.1 408 Request Timeout\r\nConnection: close\r\n\r\n' 85 ); 86 server.close(); 87 }); 88 89 client.on('error', errOrEnd); 90 client.on('end', errOrEnd); 91 92 // Perform a second request expected to finish before headersTimeout 93 performRequestWithDelay( 94 client, 95 headersTimeout / 5, 96 headersTimeout / 5, 97 false 98 ); 99})); 100