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