Skip to content
Snippets Groups Projects
Commit 540f76d9 authored by Rob Swindell's avatar Rob Swindell :speech_balloon:
Browse files

Merge branch 'Ree/websocketservice-speedup' into 'master'

Speed up file transfers.

See merge request !327
parents f9dd5f4f bc915fee
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,11 +174,13 @@ function CalculateWebSocketKey(InLine) { ...@@ -173,11 +174,13 @@ 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;
var InStr = client.socket.recv(BytesToRead);
if (InStr) {
if (InStr.length != BytesToRead) {
// Didn't get the whole websocket data packet this read, so queue up the latest read, then return the data we have so far
log(LOG_DEBUG, 'Asked for ' + BytesToRead + ' but got ' + InStr.length + ', queuing for a subsequent read');
FWebSocketDataQueue += InStr;
return Result;
}
// Prepend the queued text, if we have any
if (FWebSocketDataQueue.length > 0) {
InStr = FWebSocketDataQueue + InStr;
}
for (var i = 0; i < InStr.length; i++) {
InByte = InStr.charCodeAt(i);
if (FFrameMasked) InByte ^= FFrameMask[FFramePayloadReceived++ % 4]; if (FFrameMasked) InByte ^= FFrameMask[FFramePayloadReceived++ % 4];
// Check if the byte needs to be UTF-8 decoded // Check if the byte needs to be UTF-8 decoded
if ((InByte & 0x80) === 0) { if ((InByte & 0x80) === 0) {
Result.push(InByte); Result += String.fromCharCode(InByte);
} else if ((InByte & 0xE0) === 0xC0) { } else if ((InByte & 0xE0) === 0xC0) {
// Handle UTF-8 decode // Handle UTF-8 decode
InByte2 = client.socket.recvBin(1); InByte2 = InStr.charCodeAt(++i);
if (FFrameMasked) InByte2 ^= FFrameMask[FFramePayloadReceived++ % 4]; if (FFrameMasked) InByte2 ^= FFrameMask[FFramePayloadReceived++ % 4];
Result.push(((InByte & 31) << 6) | (InByte2 & 63)); Result += String.fromCharCode(((InByte & 31) << 6) | (InByte2 & 63));
} else { } else {
log(LOG_DEBUG, "GetFromWebSocketClientVersion7 Byte out of range: " + InByte); 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]);
} }
...@@ -432,8 +455,9 @@ function SendToWebSocketClientVersion7(AData) { ...@@ -432,8 +455,9 @@ function SendToWebSocketClientVersion7(AData) {
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');
} }
} }
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment