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 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  const errOrEnd = common.mustSucceed(function(err) {
49    assert.strictEqual(
50      response,
51      'HTTP/1.1 408 Request Timeout\r\nConnection: close\r\n\r\n'
52    );
53    server.close();
54  });
55
56  client.on('error', errOrEnd);
57  client.on('end', errOrEnd);
58
59  client.resume();
60  client.write('POST / HTTP/1.1\r\n');
61  client.write('Content-Length: 20\r\n');
62  client.write('Connection: close\r\n');
63  client.write('\r\n');
64  client.write('1234567890');
65
66  sendDelayedRequestBody = common.mustCall(() => {
67    setTimeout(() => {
68      client.write('1234567890\r\n\r\n');
69    }, common.platformTimeout(requestTimeout * 2)).unref();
70  });
71}));
72