• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1'use strict';
2
3const common = require('../common');
4const assert = require('assert');
5const http = require('http');
6const net = require('net');
7
8const server = http.createServer(common.mustCall((req, res) => {
9  res.end();
10}, 2));
11
12server.keepAliveTimeout = common.platformTimeout(100);
13
14server.listen(0, common.mustCall(() => {
15  const port = server.address().port;
16  const socket = net.connect({ port }, common.mustCall(() => {
17    request(common.mustCall(() => {
18      // Make a second request on the same socket, after the keep-alive timeout
19      // has been set on the server side.
20      request(common.mustCall());
21    }));
22  }));
23
24  server.on('timeout', common.mustCall(() => {
25    socket.end();
26    server.close();
27  }));
28
29  function request(callback) {
30    socket.setEncoding('utf8');
31    socket.on('data', onData);
32    let response = '';
33
34    // Simulate a client that sends headers slowly (with a period of inactivity
35    // that is longer than the keep-alive timeout).
36    socket.write('GET / HTTP/1.1\r\n' +
37                 `Host: localhost:${port}\r\n`);
38    setTimeout(() => {
39      socket.write('Connection: keep-alive\r\n' +
40                   '\r\n');
41    }, common.platformTimeout(300));
42
43    function onData(chunk) {
44      response += chunk;
45      if (chunk.includes('\r\n')) {
46        socket.removeListener('data', onData);
47        onHeaders();
48      }
49    }
50
51    function onHeaders() {
52      assert.ok(response.includes('HTTP/1.1 200 OK\r\n'));
53      assert.ok(response.includes('Connection: keep-alive\r\n'));
54      callback();
55    }
56  }
57}));
58