Skip to content
Snippets Groups Projects
Commit bc915fee authored by Rick Parrish's avatar Rick Parrish Committed by Rob Swindell
Browse files

Speed up file transfers.

parent f9dd5f4f
No related branches found
No related tags found
2 merge requests!463MRC mods by Codefenix (2024-10-20),!327Speed up file transfers.
...@@ -36,6 +36,7 @@ var FFrameOpCode = 0; ...@@ -36,6 +36,7 @@ var FFrameOpCode = 0;
var FFramePayloadLength = 0; var FFramePayloadLength = 0;
var FFramePayloadReceived = 0; var FFramePayloadReceived = 0;
var FServerSocket = null; var FServerSocket = null;
var FWebSocketDataQueue = '';
var FWebSocketHeader = {}; var FWebSocketHeader = {};
var FWebSocketState = WEBSOCKET_NEED_PACKET_START; var FWebSocketState = WEBSOCKET_NEED_PACKET_START;
var ipFile; var ipFile;
...@@ -173,13 +174,15 @@ function CalculateWebSocketKey(InLine) { ...@@ -173,13 +174,15 @@ function CalculateWebSocketKey(InLine) {
function GetFromServer() { function GetFromServer() {
var Result = []; var Result = [];
var InByte = 0; var InStr = '';
while (FServerSocket.data_waiting && (Result.length <= 4096)) { if (FServerSocket.data_waiting) {
InByte = FServerSocket.recvBin(1); InStr = FServerSocket.recv(4096);
Result.push(InByte); for (var i = 0; i < InStr.length; i++) {
Result.push(InStr.charCodeAt(i));
}
} }
return Result; return Result;
} }
...@@ -194,7 +197,7 @@ function GetFromWebSocketClient() { ...@@ -194,7 +197,7 @@ function GetFromWebSocketClient() {
} }
function GetFromWebSocketClientDraft0() { function GetFromWebSocketClientDraft0() {
var Result = []; var Result = '';
var InByte = 0; var InByte = 0;
var InByte2 = 0; var InByte2 = 0;
var InByte3 = 0; var InByte3 = 0;
...@@ -217,16 +220,16 @@ function GetFromWebSocketClientDraft0() { ...@@ -217,16 +220,16 @@ function GetFromWebSocketClientDraft0() {
} else { } else {
// Check if the byte needs to be UTF-8 decoded // Check if the byte needs to be UTF-8 decoded
if (InByte < 128) { if (InByte < 128) {
Result.push(InByte); Result += String.fromCharCode(InByte);
} else if ((InByte > 191) && (InByte < 224)) { } else if ((InByte > 191) && (InByte < 224)) {
// Handle UTF-8 decode // Handle UTF-8 decode
InByte2 = client.socket.recvBin(1); InByte2 = client.socket.recvBin(1);
Result.push(((InByte & 31) << 6) | (InByte2 & 63)); Result += String.fromCharCode(((InByte & 31) << 6) | (InByte2 & 63));
} else { } else {
// Handle UTF-8 decode (should never need this, but included anyway) // Handle UTF-8 decode (should never need this, but included anyway)
InByte2 = client.socket.recvBin(1); InByte2 = client.socket.recvBin(1);
InByte3 = client.socket.recvBin(1); InByte3 = client.socket.recvBin(1);
Result.push(((InByte & 15) << 12) | ((InByte2 & 63) << 6) | (InByte3 & 63)); Result += String.fromCharCode(((InByte & 15) << 12) | ((InByte2 & 63) << 6) | (InByte3 & 63));
} }
} }
break; break;
...@@ -237,12 +240,12 @@ function GetFromWebSocketClientDraft0() { ...@@ -237,12 +240,12 @@ function GetFromWebSocketClientDraft0() {
} }
function GetFromWebSocketClientVersion7() { function GetFromWebSocketClientVersion7() {
var Result = []; var Result = '';
var InByte = 0; var InByte = 0;
var InByte2 = 0; var InByte2 = 0;
var InByte3 = 0; var InByte3 = 0;
while (client.socket.data_waiting) { while (client.socket.data_waiting && (Result.length <= 4096)) {
// Check what the client packet state is // Check what the client packet state is
switch (FWebSocketState) { switch (FWebSocketState) {
case WEBSOCKET_NEED_PACKET_START: case WEBSOCKET_NEED_PACKET_START:
...@@ -313,23 +316,42 @@ function GetFromWebSocketClientVersion7() { ...@@ -313,23 +316,42 @@ function GetFromWebSocketClientVersion7() {
FWebSocketState = (FFramePayloadLength > 0 ? WEBSOCKET_DATA : WEBSOCKET_NEED_PACKET_START); // NB: Might not be any data to read, so check for payload length before setting state FWebSocketState = (FFramePayloadLength > 0 ? WEBSOCKET_DATA : WEBSOCKET_NEED_PACKET_START); // NB: Might not be any data to read, so check for payload length before setting state
break; break;
case WEBSOCKET_DATA: case WEBSOCKET_DATA:
InByte = client.socket.recvBin(1); var BytesToRead = FFramePayloadLength - FWebSocketDataQueue.length;
if (FFrameMasked) InByte ^= FFrameMask[FFramePayloadReceived++ % 4]; var InStr = client.socket.recv(BytesToRead);
if (InStr) {
// Check if the byte needs to be UTF-8 decoded if (InStr.length != BytesToRead) {
if ((InByte & 0x80) === 0) { // Didn't get the whole websocket data packet this read, so queue up the latest read, then return the data we have so far
Result.push(InByte); log(LOG_DEBUG, 'Asked for ' + BytesToRead + ' but got ' + InStr.length + ', queuing for a subsequent read');
} else if ((InByte & 0xE0) === 0xC0) { FWebSocketDataQueue += InStr;
// Handle UTF-8 decode return Result;
InByte2 = client.socket.recvBin(1); }
if (FFrameMasked) InByte2 ^= FFrameMask[FFramePayloadReceived++ % 4];
Result.push(((InByte & 31) << 6) | (InByte2 & 63)); // Prepend the queued text, if we have any
} else { if (FWebSocketDataQueue.length > 0) {
log(LOG_DEBUG, "GetFromWebSocketClientVersion7 Byte out of range: " + InByte); InStr = FWebSocketDataQueue + InStr;
} }
for (var i = 0; i < InStr.length; i++) {
InByte = InStr.charCodeAt(i);
if (FFrameMasked) InByte ^= FFrameMask[FFramePayloadReceived++ % 4];
// Check if the byte needs to be UTF-8 decoded
if ((InByte & 0x80) === 0) {
Result += String.fromCharCode(InByte);
} else if ((InByte & 0xE0) === 0xC0) {
// Handle UTF-8 decode
InByte2 = InStr.charCodeAt(++i);
if (FFrameMasked) InByte2 ^= FFrameMask[FFramePayloadReceived++ % 4];
Result += String.fromCharCode(((InByte & 31) << 6) | (InByte2 & 63));
} else {
log(LOG_DEBUG, "GetFromWebSocketClientVersion7 Byte out of range: " + InByte);
}
}
// Check if we've received the full payload // Finished the data packet, so reset variables
if (FFramePayloadReceived === FFramePayloadLength) FWebSocketState = WEBSOCKET_NEED_PACKET_START; FWebSocketDataQueue = '';
FWebSocketState = WEBSOCKET_NEED_PACKET_START;
}
break; break;
} }
} }
...@@ -360,9 +382,10 @@ function ParsePathHeader() { ...@@ -360,9 +382,10 @@ function ParsePathHeader() {
return Result; return Result;
} }
function SendToServer(AData) { function SendToServer(AStr) {
for (var i = 0; i < AData.length; i++) { var bytesSent = FServerSocket.send(AStr);
FServerSocket.sendBin(AData[i], 1); if (bytesSent != AStr.length) {
log(LOG_ERR, 'SendToServer only sent ' + bytesSent + ' of ' + AStr.length + ' bytes');
} }
} }
...@@ -402,16 +425,16 @@ function SendToWebSocketClientDraft0(AData) { ...@@ -402,16 +425,16 @@ function SendToWebSocketClientDraft0(AData) {
function SendToWebSocketClientVersion7(AData) { function SendToWebSocketClientVersion7(AData) {
if (AData.length > 0) { if (AData.length > 0) {
var ToSend = []; var ToSend = '';
for (var i = 0; i < AData.length; i++) { for (var i = 0; i < AData.length; i++) {
// Check if the byte needs to be UTF-8 encoded // Check if the byte needs to be UTF-8 encoded
if ((AData[i] & 0xFF) <= 127) { if ((AData[i] & 0xFF) <= 127) {
ToSend.push(AData[i]); ToSend += String.fromCharCode(AData[i]);
} else if (((AData[i] & 0xFF) >= 128) && ((AData[i] & 0xFF) <= 2047)) { } else if (((AData[i] & 0xFF) >= 128) && ((AData[i] & 0xFF) <= 2047)) {
// Handle UTF-8 encode // Handle UTF-8 encode
ToSend.push((AData[i] >> 6) | 192); ToSend += String.fromCharCode((AData[i] >> 6) | 192);
ToSend.push((AData[i] & 63) | 128); ToSend += String.fromCharCode((AData[i] & 63) | 128);
} else { } else {
log(LOG_DEBUG, "SendToWebSocketClientVersion7 Byte out of range: " + AData[i]); log(LOG_DEBUG, "SendToWebSocketClientVersion7 Byte out of range: " + AData[i]);
} }
...@@ -431,11 +454,12 @@ function SendToWebSocketClientVersion7(AData) { ...@@ -431,11 +454,12 @@ function SendToWebSocketClientVersion7(AData) {
client.socket.sendBin(0, 4); client.socket.sendBin(0, 4);
client.socket.sendBin(ToSend.length, 4); client.socket.sendBin(ToSend.length, 4);
} }
for (var i = 0; i < ToSend.length; i++) { var bytesSent = client.socket.send(ToSend);
client.socket.sendBin(ToSend[i] & 0xFF, 1); if (bytesSent != ToSend.length) {
} log(LOG_ERR, 'SendToWebSocketClientVersion7 only sent ' + bytesSent + ' of ' + ToSend.length + ' bytes');
} }
}
} }
function ShakeHands() { function ShakeHands() {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment