-
Notifications
You must be signed in to change notification settings - Fork 94
Expand file tree
/
Copy pathnet2.js
More file actions
94 lines (90 loc) · 2.47 KB
/
net2.js
File metadata and controls
94 lines (90 loc) · 2.47 KB
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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
let net = require('net');
let {
StringDecoder
} = require('string_decoder');
let {
Readable
} = require('stream');
class IncomingMessage extends Readable {
_read() {}
}
function parser(socket, callback) {
let buffers = [];
let sd = new StringDecoder();
let im = new IncomingMessage();
function fn() {
// 伪造响应头和响应体,类似http的request
let res = {
write: socket.write.bind(socket),
end: socket.end.bind(socket)
}
let content = socket.read();
if (content) {
buffers.push(content);
let str = sd.write(Buffer.concat(buffers));
if (str.match(/\r\n\r\n/)) {
let result = str.split('\r\n\r\n');
let head = parserHeader(result[0]);
// im = {...im,...head}
Object.assign(im, head);
socket.removeListener('readable', fn);
socket.unshift(Buffer.from(result[1]));
if (result[1]) {
socket.on('data', function (data) {
im.push(data);
im.push(null);
callback(im, res);
});
} else {
im.push(null);
callback(im, res);
}
}
}
}
socket.on('readable', fn)
}
// 伪造请求头和请求体,类似http的request
function parserHeader(head) {
let lines = head.split(/\r\n/);
let start = lines.shift();
let method = start.split(' ')[0];
let url = start.split(' ')[1];
let httpVersion = start.split(' ')[2].split('/')[1];
let headers = {};
lines.forEach(line => {
let row = line.split(': ');
headers[row[0]] = row[1];
});
return {
url,
method,
httpVersion,
headers
}
}
let server = net.createServer(function (socket) {
parser(socket, function (req, res) {
server.emit('request', req, res);
});
});
server.on('request', function (req, res) {
console.log(req.url);
console.log(req.headers);
console.log(req.httpVersion);
console.log(req.method);
req.on('data', function (data) {
console.log('ok', data.toString());
});
req.on('end', function () {
res.end(`
HTTP/1.1 200 OK
Content-Type: text/plain
Content-Length: 5
hello`)
});
})
server.on('connection', function () {
console.log('建立连接');
});
server.listen(3000);