forked from cory/tildefriends
Move some things to C that probably should have never been in JS, especially sha1. Minor refactors, cleanup, and deletes along the way.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4154 ed5197a5-7fde-0310-b194-c3ffbd925b24
This commit is contained in:
@@ -1,4 +1,3 @@
|
||||
import * as sha1 from './sha1.js';
|
||||
import * as core from './core.js';
|
||||
|
||||
"use strict";
|
||||
@@ -196,7 +195,7 @@ function handleRequest(request, response) {
|
||||
|
||||
function handleWebSocketRequest(request, response, client) {
|
||||
let buffer = new Uint8Array(0);
|
||||
let frame = new Uint8Array(0);
|
||||
let frame;
|
||||
let frameOpCode = 0x0;
|
||||
|
||||
let handler = findSocketHandler(request);
|
||||
@@ -285,19 +284,24 @@ function handleWebSocketRequest(request, response, client) {
|
||||
}
|
||||
let havePayload = buffer.length >= payloadLength + 2 + 4;
|
||||
if (havePayload) {
|
||||
let mask = buffer.slice(maskStart, maskStart + 4);
|
||||
let mask =
|
||||
buffer[maskStart + 0] |
|
||||
buffer[maskStart + 1] << 8 |
|
||||
buffer[maskStart + 2] << 16 |
|
||||
buffer[maskStart + 3] << 24;
|
||||
let dataStart = maskStart + 4;
|
||||
let decoded = new Array(payloadLength);
|
||||
let payload = buffer.slice(dataStart, dataStart + payloadLength);
|
||||
let decoded = maskBytes(payload, mask);
|
||||
buffer = buffer.slice(dataStart + payloadLength);
|
||||
for (let i = 0; i < payloadLength; i++) {
|
||||
decoded[i] = payload[i] ^ mask[i % 4];
|
||||
}
|
||||
|
||||
let newBuffer = new Uint8Array(frame.length + decoded.length);
|
||||
newBuffer.set(frame, 0);
|
||||
newBuffer.set(decoded, frame.length);
|
||||
frame = newBuffer;
|
||||
if (frame) {
|
||||
let newBuffer = new Uint8Array(frame.length + decoded.length);
|
||||
newBuffer.set(frame, 0);
|
||||
newBuffer.set(decoded, frame.length);
|
||||
frame = newBuffer;
|
||||
} else {
|
||||
frame = decoded;
|
||||
}
|
||||
|
||||
if (opCode) {
|
||||
frameOpCode = opCode;
|
||||
@@ -310,7 +314,7 @@ function handleWebSocketRequest(request, response, client) {
|
||||
opCode: frameOpCode,
|
||||
});
|
||||
}
|
||||
frame = new Uint8Array(0);
|
||||
frame = undefined;
|
||||
}
|
||||
} else {
|
||||
break;
|
||||
@@ -340,23 +344,7 @@ function handleWebSocketRequest(request, response, client) {
|
||||
function webSocketAcceptResponse(key) {
|
||||
let kMagic = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11";
|
||||
let kAlphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
|
||||
let hex = sha1.hash(key + kMagic)
|
||||
let binary = "";
|
||||
for (let i = 0; i < hex.length; i += 6) {
|
||||
let characters = hex.substring(i, i + 6);
|
||||
if (characters.length < 6) {
|
||||
characters += "0".repeat(6 - characters.length);
|
||||
}
|
||||
let value = parseInt(characters, 16);
|
||||
for (let bit = 0; bit < 8 * 3; bit += 6) {
|
||||
if (i * 8 / 2 + bit >= 8 * hex.length / 2) {
|
||||
binary += kAlphabet.charAt(64);
|
||||
} else {
|
||||
binary += kAlphabet.charAt((value >> (18 - bit)) & 63);
|
||||
}
|
||||
}
|
||||
}
|
||||
return binary;
|
||||
return base64Encode(sha1Digest(key + kMagic));
|
||||
}
|
||||
|
||||
function badRequest(client, reason) {
|
||||
|
Reference in New Issue
Block a user