Repository navigation
Expand file tree
/
Copy pathsocket.js
More file actions
102 lines (77 loc) · 2.72 KB
/
Copy pathsocket.js
File metadata and controls
102 lines (77 loc) · 2.72 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
95
96
97
98
99
100
101
102
const net = require('net');
const crypto = require("crypto");
const fs = require('fs');
const MAGIC_STRING = '258EAFA5-E914-47DA-95CA-C5AB0DC85B11'
function encodeWebSocketFrame(data) {
const payload = Buffer.from(data);
const frame = [0x81]; // FIN + text frame (opcode 0x1)
if (payload.length < 126) {
frame.push(payload.length);
} else {
throw new Error('This example only supports payloads < 126 bytes.');
}
return Buffer.concat([Buffer.from(frame), payload]);
}
function convertoBinary(buffer){
const binary = [];
const len = buffer.length;
console.log(buffer);
for(let i = 0 ; i < len ; i++ ){
for(let j=7 ; j > -1 ; j--){
const b = (buffer[i] & (2**j)) >> j;
binary.push(b);
}
binary.push('');
}
return binary.join('');
}
const sockets = [];
const server = net.createServer((socket)=>{
socket.once('data' , (buffer)=>{
const req = buffer.toString();
fs.writeFileSync('./buffer.txt' , buffer.toString() );
const key = req.match(/Sec-WebSocket-Key: (.+)/i)[1];
const secAccpetKey = crypto.createHash("sha1").update(key + MAGIC_STRING ).digest('base64');
const headers = [
'HTTP/1.1 101 Switching Protocols',
'Upgrade: websocket',
'Connection: Upgrade',
`Sec-WebSocket-Accept: ${secAccpetKey}`,
'\r\n'
];
socket.write(headers.join("\r\n"));
sockets.push(socket);
console.log(sockets.length);
sockets.forEach(soc=>{
soc.write(encodeWebSocketFrame("new device connected"));
})
socket.on("data" , (buffer)=>{
const binary = convertoBinary(buffer);
const fin = binary[1];
const opcode = binary.slice(4 , 8);
const mask = binary[8];
const payloadLen = binary.slice(9 , 16);
const maskKey = binary.slice(16 , 48);
const payload = binary.slice(48 , -1);
const decodeArray = new Uint8Array(buffer[1] - 128 );
for(let i = 0 ; i < buffer[1] - 128 ; i++){
decodeArray[i] = buffer[6 + i] ^ buffer[2 + i % 4]
}
const text = new TextDecoder().decode(decodeArray);
console.log({fin});
console.log({opcode});
console.log({mask});
console.log({payloadLen});
console.log({maskKey});
console.log({payload});
console.log({decodeArray})
console.log({text})
sockets.forEach(soc=>{
soc.write(encodeWebSocketFrame(text));
})
})
})
})
server.listen( 8080 ,"0.0.0.0", () => {
console.log('opened server on', server.address());
});