Skip to content

Instantly share code, notes, and snippets.

@ricejasonf
Created November 22, 2016 23:57
Show Gist options
  • Save ricejasonf/b669450e9a2bd2db101ca5771b72cbb6 to your computer and use it in GitHub Desktop.
Save ricejasonf/b669450e9a2bd2db101ca5771b72cbb6 to your computer and use it in GitHub Desktop.
<html>
<head>
</head>
<body>
<script>
// connect
var socket = new WebSocket("ws://127.0.0.1:8080");
socket.onopen = function(event) {
document.write('<div>CONNECTION OPENED</div>');
}
// receive messages
socket.onmessage = function(event) {
document.write(event.data);
}
</script>
</body>
</html>
const process = require('process');
const net = require('net');
const server = net.createServer((socket) => {
// socket is a Stream
socket.pipe(process.stdout);
});
server.listen(8080, '127.0.0.1');
const process = require('process');
const net = require('net');
const crypto = require('crypto');
const INDETERMINATE = 'INDETERMINATE';
const FINISHED = 'FINISHED';
const ERROR = 'ERROR';
const CR = '\r';
const LF = '\n';
const ENDLINE = CR + LF;
const server = net.createServer((socket) => {
// socket is a Stream
let request = { state: INDETERMINATE };
let p = parser(request); p.next();
socket.on('data', function(chunk) {
if (request.state != INDETERMINATE) {
return;
}
for (let i = 0; i < chunk.length; i++) {
p.next(chunk[i]);
}
if (request.state == FINISHED) {
sendResponse(socket, request);
sendTestFrame();
}
else if (request.state == ERROR) {
console.log('BAD REQUEST: ', request);
socket.destroy();
}
});
});
function* parser(request) {
request.raw = '';
const request_line = "GET / HTTP/1.1\r\n";
for (let i = 0; i < request_line.length; i++) {
const c = String.fromCharCode(yield);
request.raw += c;
if (c != request_line[i]) {
request.state = ERROR;
return;
}
}
request.headers = [];
let header;
while (true) {
header = yield* parseHeader();
if (!header) break;
request.headers.push(header);
}
request.state = FINISHED;
}
function* parseHeader()
{
let header_line = '';
while (!isHeaderLineComplete(header_line)) {
header_line += String.fromCharCode(yield);
}
if (header_line.length == 2) {
// it's just CRLF... done
return null;
}
const header_parts = header_line.split(/:(.+)?/, 2);
const header = {
[header_parts[0].trim()]: header_parts[1].trim()
};
return header;
function isHeaderLineComplete(line) {
if (line.length < 2)
return false;
return (line.substr(-2) == ENDLINE);
}
}
function sendResponse(socket, request) {
console.log('PARSED REQUEST:', request);
//accept_token = makeAcceptToken(request.headers['Sec-WebSocket-Key'])
accept_token = makeAcceptToken(request.headers[8]['Sec-WebSocket-Key'])
const response =
"HTTP/1.1 101 Switching Protocols\r\n"
+ "Upgrade: websocket\r\n"
+ "Connection: Update\r\n"
+ "Sec-WebSocket-Accept: " + accept_token
+ "\r\n\r\n"
;
console.log('RESPONSE:', response);
socket.write(response);
}
function makeAcceptToken(key) {
const guid = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11";
let shasum = crypto.createHash('sha1');
shasum.update(key);
shasum.update(guid);
return shasum.digest().toString('base64');
}
function sendMessageFrame() {
}
server.listen(8080, '127.0.0.1');
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment