summaryrefslogtreecommitdiff
path: root/test/parallel/test-http-pipeline-socket-parser-typeerror.js
blob: 8987b822c26496d1e53e9a7645419a5861d0b12e (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
'use strict';
require('../common');

// This test ensures that Node.js doesn't crash because of a TypeError by
// checking in `connectionListener` that the socket still has the parser.
// https://github.com/nodejs/node/issues/3508

const http = require('http');
const net = require('net');

let once = false;
let first = null;
let second = null;

const chunk = Buffer.alloc(1024, 'X');

let size = 0;

let more;
let done;

const server = http
  .createServer((req, res) => {
    if (!once) server.close();
    once = true;

    if (first === null) {
      first = res;
      return;
    }
    if (second === null) {
      second = res;
      res.write(chunk);
    } else {
      res.end(chunk);
    }
    size += res.outputSize;
    if (size <= req.socket.writableHighWaterMark) {
      more();
      return;
    }
    done();
  })
  .on('upgrade', (req, socket) => {
    second.end(chunk, () => {
      socket.end();
    });
    first.end('hello');
  })
  .listen(0, () => {
    const s = net.connect(server.address().port);
    more = () => {
      s.write('GET / HTTP/1.1\r\n\r\n');
    };
    done = () => {
      s.write(
        'GET / HTTP/1.1\r\n\r\n' +
          'GET / HTTP/1.1\r\nConnection: upgrade\r\nUpgrade: ws\r\n\r\naaa'
      );
    };
    more();
    more();
    s.resume();
  });