summaryrefslogtreecommitdiff
path: root/test/parallel/test-http-server-request-timeouts-mixed.js
blob: ec3cce9161151b40ee6ee6e61d8dcacfcfe25501 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
'use strict';

const common = require('../common');
const assert = require('assert');
const { createServer } = require('http');
const { connect } = require('net');

// This test validates that request are correct checked for both requests and headers timeout in various situations.

const requestBodyPart1 = 'POST / HTTP/1.1\r\nHost: localhost\r\nContent-Length: 20\r\n';
const requestBodyPart2 = 'Connection: close\r\n\r\n1234567890';
const requestBodyPart3 = '1234567890';

const responseOk = 'HTTP/1.1 200 OK\r\n';
const responseTimeout = 'HTTP/1.1 408 Request Timeout\r\n';

const headersTimeout = common.platformTimeout(2000);
const connectionsCheckingInterval = headersTimeout / 8;

const server = createServer({
  headersTimeout,
  requestTimeout: headersTimeout * 2,
  keepAliveTimeout: 0,
  connectionsCheckingInterval
}, common.mustCall((req, res) => {
  req.resume();

  req.on('end', () => {
    res.writeHead(200, { 'Content-Type': 'text/plain' });
    res.end();
  });
}, 4));

assert.strictEqual(server.headersTimeout, headersTimeout);
assert.strictEqual(server.requestTimeout, headersTimeout * 2);

let i = 0;
function createClient(server) {
  const request = {
    index: i++,
    client: connect(server.address().port),
    response: '',
    completed: false
  };

  request.client.setEncoding('utf8');
  request.client.on('data', common.mustCallAtLeast((chunk) => {
    request.response += chunk;
  }));

  request.client.on('end', common.mustCall(() => {
    request.completed = true;
  }));

  request.client.on('error', common.mustNotCall());

  request.client.resume();

  return request;
}

server.listen(0, common.mustCall(() => {
  const request1 = createClient(server);
  let request2;
  let request3;
  let request4;
  let request5;

  // Send the first request and stop before the body
  request1.client.write(requestBodyPart1);

  // After a little while send two new requests
  setTimeout(() => {
    request2 = createClient(server);
    request3 = createClient(server);

    // Send the second request, stop in the middle of the headers
    request2.client.write(requestBodyPart1);

    // Send the third request and stop in the middle of the headers
    request3.client.write(requestBodyPart1);
  }, headersTimeout * 0.2);

  // After another little while send the last two new requests
  setTimeout(() => {
    request4 = createClient(server);
    request5 = createClient(server);

    // Send the fourth request, stop in the middle of the headers
    request4.client.write(requestBodyPart1);
    // Send the fifth request, stop in the middle of the headers
    request5.client.write(requestBodyPart1);
  }, headersTimeout * 0.6);

  setTimeout(() => {
    // Finish the first request
    request1.client.write(requestBodyPart2 + requestBodyPart3);

    // Complete headers for all requests but second
    request3.client.write(requestBodyPart2);
    request4.client.write(requestBodyPart2);
    request5.client.write(requestBodyPart2);
  }, headersTimeout * 0.8);

  setTimeout(() => {
    // After the first timeout, the first request should have been completed and second timedout
    assert(request1.completed);
    assert(request2.completed);
    assert(!request3.completed);
    assert(!request4.completed);
    assert(!request5.completed);

    assert(request1.response.startsWith(responseOk));
    assert(request2.response.startsWith(responseTimeout)); // It is expired due to headersTimeout
  }, headersTimeout * 1.4);

  setTimeout(() => {
    // Complete the body for the fourth request
    request4.client.write(requestBodyPart3);
  }, headersTimeout * 1.5);

  setTimeout(() => {
    // All request should be completed now, either with 200 or 408
    assert(request3.completed);
    assert(request4.completed);
    assert(request5.completed);

    assert(request3.response.startsWith(responseTimeout)); // It is expired due to requestTimeout
    assert(request4.response.startsWith(responseOk));
    assert(request5.response.startsWith(responseTimeout)); // It is expired due to requestTimeout
    server.close();
  }, headersTimeout * 3 + connectionsCheckingInterval);
}));