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 requestTimeoout
9// is disabled after the connection is upgraded.
10let sendDelayedRequestHeaders;
11const requestTimeout = common.platformTimeout(2000);
12const server = createServer({
13  headersTimeout: 0,
14  requestTimeout,
15  keepAliveTimeout: 0,
16  connectionsCheckingInterval: requestTimeout / 4
17}, common.mustNotCall());
18server.on('connection', common.mustCall(() => {
19  assert.strictEqual(typeof sendDelayedRequestHeaders, 'function');
20  sendDelayedRequestHeaders();
21}));
22
23assert.strictEqual(server.requestTimeout, requestTimeout);
24
25server.on('upgrade', common.mustCall((req, socket, head) => {
26  socket.write('HTTP/1.1 101 Web Socket Protocol Handshake\r\n');
27  socket.write('Upgrade: WebSocket\r\n');
28  socket.write('Connection: Upgrade\r\n\r\n');
29  socket.pipe(socket);
30}));
31
32server.listen(0, common.mustCall(() => {
33  const client = connect(server.address().port);
34  let response = '';
35
36  client.setEncoding('utf8');
37  client.on('data', common.mustCallAtLeast((chunk) => {
38    response += chunk;
39  }, 1));
40
41  client.on('end', common.mustCall(() => {
42    assert.strictEqual(
43      response,
44      'HTTP/1.1 101 Web Socket Protocol Handshake\r\n' +
45      'Upgrade: WebSocket\r\n' +
46      'Connection: Upgrade\r\n\r\n' +
47      '12345678901234567890'
48    );
49
50    server.close();
51  }));
52
53  client.resume();
54  client.write('GET / HTTP/1.1\r\n');
55  client.write('Upgrade: WebSocket\r\n');
56  client.write('Connection: Upgrade\r\n\r\n');
57
58  sendDelayedRequestHeaders = common.mustCall(() => {
59    setTimeout(() => {
60      client.write('12345678901234567890');
61      client.end();
62    }, requestTimeout * 2).unref();
63  });
64}));
65