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