forked from nodejs/node
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtest-http-pipeline-socket-parser-typeerror.js
64 lines (56 loc) · 1.29 KB
/
test-http-pipeline-socket-parser-typeerror.js
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\nHost: example.com\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();
});