'use strict'; const common = require('../common'); const assert = require('assert'); const { createServer } = require('http'); const { connect } = require('net'); // This test validates that the server returns 408 // after server.requestTimeout if the client // does not complete a request, and that keep alive // works properly function performRequestWithDelay(client, firstDelay, secondDelay) { client.resume(); client.write('GET / HTTP/1.1\r\n'); firstDelay = common.platformTimeout(firstDelay); secondDelay = common.platformTimeout(secondDelay); console.log('performRequestWithDelay', firstDelay, secondDelay); setTimeout(() => { client.write('Connection: '); }, firstDelay).unref(); // Complete the request setTimeout(() => { client.write('keep-alive\r\n\r\n'); }, firstDelay + secondDelay).unref(); } const server = createServer(common.mustCallAtLeast((req, res) => { res.writeHead(200, { 'Content-Type': 'text/plain' }); res.end(); })); // 0 seconds is the default assert.strictEqual(server.requestTimeout, 0); const requestTimeout = common.platformTimeout(1000); server.requestTimeout = requestTimeout; assert.strictEqual(server.requestTimeout, requestTimeout); // Make sure keepAliveTimeout is big enough for the requestTimeout. server.keepAliveTimeout = 0; server.listen(0, common.mustCall(() => { const client = connect(server.address().port); let second = false; let response = ''; client.on('data', common.mustCallAtLeast((chunk) => { response += chunk.toString('utf-8'); // First response has ended if (!second && response.endsWith('\r\n\r\n')) { assert.strictEqual( response.split('\r\n')[0], 'HTTP/1.1 200 OK' ); const defer = common.platformTimeout(server.requestTimeout * 1.5); console.log('defer by', defer); // Wait some time to make sure requestTimeout // does not interfere with keep alive setTimeout(() => { response = ''; second = true; // Perform a second request expected to finish after requestTimeout performRequestWithDelay(client, 1000, 3000); }, defer).unref(); } }, 1)); const errOrEnd = common.mustCall(function(err) { console.log(err); assert.strictEqual(second, true); assert.strictEqual( response, // Empty because of https://github.com/nodejs/node/commit/e8d7fedf7cad6e612e4f2e0456e359af57608ac7 // 'HTTP/1.1 408 Request Timeout\r\nConnection: close\r\n\r\n' '' ); server.close(); }); client.on('error', errOrEnd); client.on('end', errOrEnd); // Perform a second request expected to finish before requestTimeout performRequestWithDelay(client, 50, 500); }));