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.requestTimeout if the client 10// does not complete a request, and that keep alive 11// 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 requestTimeout = common.platformTimeout(5000); 28const server = createServer({ 29 headersTimeout: 0, 30 requestTimeout, 31 keepAliveTimeout: 0, 32 connectionsCheckingInterval: requestTimeout / 4 33}, common.mustCallAtLeast((req, res) => { 34 res.writeHead(200, { 'Content-Type': 'text/plain' }); 35 res.end(); 36})); 37 38assert.strictEqual(server.requestTimeout, requestTimeout); 39 40// Make sure keepAliveTimeout is big enough for the requestTimeout. 41server.keepAliveTimeout = 0; 42 43server.listen(0, common.mustCall(() => { 44 const client = connect(server.address().port); 45 let second = false; 46 let response = ''; 47 48 client.setEncoding('utf8'); 49 client.on('data', common.mustCallAtLeast((chunk) => { 50 response += chunk; 51 52 // First response has ended 53 if (!second && response.endsWith('\r\n\r\n')) { 54 assert.strictEqual( 55 response.split('\r\n')[0], 56 'HTTP/1.1 200 OK' 57 ); 58 59 const defer = requestTimeout * 1.5; 60 61 // Wait some time to make sure requestTimeout 62 // does not interfere with keep alive 63 setTimeout(() => { 64 response = ''; 65 second = true; 66 67 // Perform a second request expected to finish after requestTimeout 68 performRequestWithDelay( 69 client, 70 requestTimeout / 5, 71 requestTimeout * 2, 72 true 73 ); 74 }, defer).unref(); 75 } 76 }, 1)); 77 78 const errOrEnd = common.mustCall(function(err) { 79 assert.strictEqual(second, true); 80 assert.strictEqual( 81 response, 82 'HTTP/1.1 408 Request Timeout\r\nConnection: close\r\n\r\n' 83 ); 84 server.close(); 85 }); 86 87 client.on('error', errOrEnd); 88 client.on('end', errOrEnd); 89 90 // Perform a first request which is completed immediately 91 performRequestWithDelay( 92 client, 93 requestTimeout / 5, 94 requestTimeout / 5, 95 false 96 ); 97})); 98