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:
2023-01-28 21:59:36 +00:00
parent 48cd08e095
commit 7091b6e6a5
8 changed files with 109 additions and 289 deletions

View File

@@ -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) {