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