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// pauses sending in the middle of a header.
11
12let sendDelayedRequestHeaders;
13const requestTimeout = common.platformTimeout(2000);
14const server = createServer({
15  headersTimeout: 0,
16  requestTimeout,
17  keepAliveTimeout: 0,
18  connectionsCheckingInterval: requestTimeout / 4,
19}, common.mustNotCall());
20server.on('connection', common.mustCall(() => {
21  assert.strictEqual(typeof sendDelayedRequestHeaders, 'function');
22  sendDelayedRequestHeaders();
23}));
24
25assert.strictEqual(server.requestTimeout, requestTimeout);
26
27server.listen(0, common.mustCall(() => {
28  const client = connect(server.address().port);
29  let response = '';
30
31  client.setEncoding('utf8');
32  client.on('data', common.mustCall((chunk) => {
33    response += chunk;
34  }));
35
36  const errOrEnd = common.mustSucceed(function(err) {
37    assert.strictEqual(
38      response,
39      'HTTP/1.1 408 Request Timeout\r\nConnection: close\r\n\r\n'
40    );
41    server.close();
42  });
43
44  client.on('end', errOrEnd);
45  client.on('error', errOrEnd);
46
47  client.resume();
48  client.write('GET / HTTP/1.1\r\n');
49  client.write('Connection: close\r\n');
50  client.write('X-CRASH: ');
51
52  sendDelayedRequestHeaders = common.mustCall(() => {
53    setTimeout(() => {
54      client.write('1234567890\r\n\r\n');
55    }, common.platformTimeout(requestTimeout * 2)).unref();
56  });
57}));
58