summaryrefslogtreecommitdiff
path: root/test/sequential/test-http-server-keep-alive-timeout-slow-client-headers.js
blob: 453831ecba88a234721a3873cbd4159d2860c1ab (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
'use strict';

const common = require('../common');
const assert = require('assert');
const http = require('http');
const net = require('net');

const server = http.createServer(common.mustCall((req, res) => {
  res.end();
}, 2));

server.keepAliveTimeout = common.platformTimeout(100);

server.listen(0, common.mustCall(() => {
  const port = server.address().port;
  const socket = net.connect({ port }, common.mustCall(() => {
    request(common.mustCall(() => {
      // Make a second request on the same socket, after the keep-alive timeout
      // has been set on the server side.
      request(common.mustCall());
    }));
  }));

  server.on('timeout', common.mustCall(() => {
    socket.end();
    server.close();
  }));

  function request(callback) {
    socket.setEncoding('utf8');
    socket.on('data', onData);
    let response = '';

    // Simulate a client that sends headers slowly (with a period of inactivity
    // that is longer than the keep-alive timeout).
    socket.write('GET / HTTP/1.1\r\n' +
                 `Host: localhost:${port}\r\n`);
    setTimeout(() => {
      socket.write('Connection: keep-alive\r\n' +
                   '\r\n');
    }, common.platformTimeout(300));

    function onData(chunk) {
      response += chunk;
      if (chunk.includes('\r\n')) {
        socket.removeListener('data', onData);
        onHeaders();
      }
    }

    function onHeaders() {
      assert.ok(response.includes('HTTP/1.1 200 OK\r\n'));
      assert.ok(response.includes('Connection: keep-alive\r\n'));
      callback();
    }
  }
}));