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 when using pipelining. 11 12const headersTimeout = common.platformTimeout(2000); 13const server = createServer({ 14 headersTimeout, 15 requestTimeout: 0, 16 keepAliveTimeout: 0, 17 connectionsCheckingInterval: headersTimeout / 4, 18}, common.mustCallAtLeast((req, res) => { 19 res.writeHead(200, { 'Content-Type': 'text/plain' }); 20 res.end(); 21})); 22 23// 0 seconds is the default 24assert.strictEqual(server.headersTimeout, headersTimeout); 25 26// Make sure requestTimeout and keepAliveTimeout 27// are big enough for the headersTimeout. 28server.requestTimeout = 0; 29server.keepAliveTimeout = 0; 30 31server.listen(0, common.mustCall(() => { 32 const client = connect(server.address().port); 33 let second = false; 34 let response = ''; 35 36 client.setEncoding('utf8'); 37 client.on('data', common.mustCallAtLeast((chunk) => { 38 response += chunk; 39 40 // First response has ended 41 if (!second && response.endsWith('\r\n\r\n')) { 42 assert.strictEqual( 43 response.split('\r\n')[0], 44 'HTTP/1.1 200 OK' 45 ); 46 47 response = ''; 48 second = true; 49 } 50 }, 1)); 51 52 const errOrEnd = common.mustCall(function(err) { 53 if (!second) { 54 return; 55 } 56 57 assert.strictEqual( 58 response, 59 'HTTP/1.1 408 Request Timeout\r\nConnection: close\r\n\r\n' 60 ); 61 server.close(); 62 }); 63 64 client.on('error', errOrEnd); 65 client.on('end', errOrEnd); 66 67 // Send two requests using pipelining. Delay before finishing the second one 68 client.resume(); 69 client.write('GET / HTTP/1.1\r\nConnection: keep-alive\r\n\r\nGET / HTTP/1.1\r\nConnection: '); 70 71 // Complete the request 72 setTimeout(() => { 73 client.write('close\r\n\r\n'); 74 }, headersTimeout * 1.5).unref(); 75})); 76