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 before start sending the body.
11
12let sendDelayedRequestBody;
13const requestTimeout = common.platformTimeout(2000);
14const server = createServer({
15  headersTimeout: 0,
16  requestTimeout,
17  keepAliveTimeout: 0,
18  connectionsCheckingInterval: requestTimeout / 4,
19}, common.mustCall((req, res) => {
20  let body = '';
21  req.setEncoding('utf-8');
22
23  req.on('data', (chunk) => {
24    body += chunk;
25  });
26
27  req.on('end', () => {
28    res.writeHead(200, { 'Content-Type': 'text/plain' });
29    res.write(body);
30    res.end();
31  });
32
33  assert.strictEqual(typeof sendDelayedRequestBody, 'function');
34  sendDelayedRequestBody();
35}));
36
37assert.strictEqual(server.requestTimeout, requestTimeout);
38
39server.listen(0, common.mustCall(() => {
40  const client = connect(server.address().port);
41  let response = '';
42
43  client.setEncoding('utf8');
44  client.on('data', common.mustCall((chunk) => {
45    response += chunk;
46  }));
47
48  client.resume();
49  client.write('POST / HTTP/1.1\r\n');
50  client.write('Content-Length: 20\r\n');
51  client.write('Connection: close\r\n');
52  client.write('\r\n');
53
54  sendDelayedRequestBody = common.mustCall(() => {
55    setTimeout(() => {
56      client.write('12345678901234567890\r\n\r\n');
57    }, common.platformTimeout(requestTimeout * 2)).unref();
58  });
59
60  const errOrEnd = common.mustSucceed(function(err) {
61    assert.strictEqual(
62      response,
63      'HTTP/1.1 408 Request Timeout\r\nConnection: close\r\n\r\n'
64    );
65    server.close();
66  });
67
68  client.on('end', errOrEnd);
69  client.on('error', errOrEnd);
70}));
71