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