revert sendToClient() to the state at which eMac merged his changes
This commit is contained in:
@@ -497,8 +497,6 @@ function headerStringToObj(headers, response = false) {
|
|||||||
|
|
||||||
async function sendToClient(socket, headers_obj, data, compress_data = false) {
|
async function sendToClient(socket, headers_obj, data, compress_data = false) {
|
||||||
var headers = "";
|
var headers = "";
|
||||||
var wni_style_content_length = false;
|
|
||||||
var compress_data = false;
|
|
||||||
if (typeof (data) === 'undefined') data = '';
|
if (typeof (data) === 'undefined') data = '';
|
||||||
if (typeof (headers_obj) === 'string') {
|
if (typeof (headers_obj) === 'string') {
|
||||||
// string to header object
|
// string to header object
|
||||||
@@ -517,86 +515,55 @@ async function sendToClient(socket, headers_obj, data, compress_data = false) {
|
|||||||
headers_obj = moveObjectElement('Connection', 'http_response', headers_obj);
|
headers_obj = moveObjectElement('Connection', 'http_response', headers_obj);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (headers_obj['minisrv-already-compressed'] && wni_style_content_length) {
|
var clen = 0;
|
||||||
content_length = headers_obj["Content-length"];
|
if (typeof data.length !== 'undefined') {
|
||||||
} else {
|
clen = data.length;
|
||||||
var content_length = 0;
|
} else if (typeof data.byteLength !== 'undefined') {
|
||||||
if (typeof data.length !== 'undefined') {
|
clen = data.byteLength;
|
||||||
content_length = data.length;
|
|
||||||
} else if (typeof data.byteLength !== 'undefined') {
|
|
||||||
content_length = data.byteLength;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// If wtv-lzpf is in the header then force compression
|
||||||
// fix captialization of Content-Type header. May be unnecessary.
|
if (headers_obj["wtv-lzpf"]) {
|
||||||
if (headers_obj["Content-type"]) {
|
compress_data = true;
|
||||||
headers_obj["Content-Type"] = headers_obj["Content-type"];
|
|
||||||
delete headers_obj["Content-type"];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
// compress if needed
|
||||||
// check if client reports it supports compressed data
|
if (compress_data && clen > 0) {
|
||||||
if (ssid_sessions[socket.ssid].capabilities) {
|
headers_obj["wtv-lzpf"] = "0";
|
||||||
if (ssid_sessions[socket.ssid].capabilities['client-can-receive-compressed-data']) {
|
|
||||||
// if the client reports it supports compression, check the Content-Type
|
var lzpf = new WTVLzpf();
|
||||||
// of the file we are sending to see if its worth compressing
|
data = lzpf.Compress(data);
|
||||||
compress_data = shouldWeCompress(headers_obj["Content-Type"]);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
|
|
||||||
// compress if needed, and if not already compressed
|
|
||||||
if (compress_data && content_length > 0 && !headers_obj['minisrv-already-compressed']) {
|
|
||||||
if (zdebug) console.log(" # Uncompressed data length:", content_length);
|
|
||||||
headers_obj["wtv-lzpf"] = 0;
|
|
||||||
var wtvcomp = new WTVLzpf();
|
|
||||||
// we expect the compressed data to be smaller or at most equal to the source size
|
|
||||||
// so we set our initial buffer size to the source size
|
|
||||||
var compressed_data = new Buffer.alloc(content_length);
|
|
||||||
wtvcomp.on('data', (data, length, offset, complete) => {
|
|
||||||
// put data received into buffer
|
|
||||||
data.copy(compressed_data, offset, 0, length);
|
|
||||||
if (complete !== false) {
|
|
||||||
if (zdebug) console.log(" # Compressed data length:", complete);
|
|
||||||
// now that we have all of the compressed data, copy it to a new buffer
|
|
||||||
// of the correct length, and clean up the original buffer.
|
|
||||||
data = new Buffer.alloc(complete);
|
|
||||||
compressed_data.copy(data, 0, 0, compressed_data.byteLength);
|
|
||||||
compressed_data, wtvcomp = null;
|
|
||||||
// internal header to tell ourselves to not compress again
|
|
||||||
headers_obj['minisrv-already-compressed'] = true;
|
|
||||||
if (wni_style_content_length) headers_obj["Content-length"] = content_length;
|
|
||||||
sendToClient(socket, headers_obj, data);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
wtvcomp.Compress(data);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// clean up internal header for compression
|
|
||||||
if (headers_obj['minisrv-already-compressed']) delete headers_obj['minisrv-already-compressed'];
|
|
||||||
|
|
||||||
|
|
||||||
// encrypt if needed
|
// encrypt if needed
|
||||||
if (socket_sessions[socket.id].secure == true) {
|
if (socket_sessions[socket.id].secure == true) {
|
||||||
headers_obj["wtv-encrypted"] = 'true';
|
headers_obj["wtv-encrypted"] = 'true';
|
||||||
headers_obj = moveObjectElement('wtv-encrypted', 'Connection', headers_obj);
|
headers_obj = moveObjectElement('wtv-encrypted', 'Connection', headers_obj);
|
||||||
if (content_length > 0 && socket_sessions[socket.id].wtvsec) {
|
if (clen > 0 && socket_sessions[socket.id].wtvsec) {
|
||||||
if (!zquiet) console.log(" * Encrypting response to client ...")
|
if (!zquiet) console.log(" * Encrypting response to client ...")
|
||||||
var enc_data = socket_sessions[socket.id].wtvsec.Encrypt(1, data);
|
var enc_data = socket_sessions[socket.id].wtvsec.Encrypt(1, data);
|
||||||
data = enc_data;
|
data = enc_data;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// calculate content length
|
// fix captialization
|
||||||
// make sure we are using our Content-length and not one set in a script.
|
if (headers_obj["Content-length"]) {
|
||||||
if (headers_obj["Content-Length"]) delete headers_obj["Content-Length"];
|
delete headers_obj["Content-length"];
|
||||||
if (headers_obj["Content-length"]) delete headers_obj["Content-length"];
|
}
|
||||||
|
|
||||||
|
if (headers_obj["Content-type"]) {
|
||||||
|
headers_obj["Content-Type"] = headers_obj["Content-type"];
|
||||||
|
delete headers_obj["Content-type"];
|
||||||
|
}
|
||||||
|
|
||||||
|
// calculate content length
|
||||||
// On the WNI server this is the length before compression but we're using the length after compression.
|
// On the WNI server this is the length before compression but we're using the length after compression.
|
||||||
// It matches the HTTP spec anyway so leaving.
|
// It matches the HTTP spec anyway so leaving.
|
||||||
headers_obj["Content-length"] = content_length;
|
if (typeof data.length !== 'undefined') {
|
||||||
|
headers_obj["Content-length"] = data.length;
|
||||||
|
} else if (typeof data.byteLength !== 'undefined') {
|
||||||
|
headers_obj["Content-length"] = data.byteLength;
|
||||||
|
}
|
||||||
|
|
||||||
if (ssid_sessions[socket.ssid]) {
|
if (ssid_sessions[socket.ssid]) {
|
||||||
if (ssid_sessions[socket.ssid].data_store.wtvsec_login) {
|
if (ssid_sessions[socket.ssid].data_store.wtvsec_login) {
|
||||||
@@ -610,15 +577,13 @@ async function sendToClient(socket, headers_obj, data, compress_data = false) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// internal header to determine EOL type. bf0app upgrader does not like \r, while the rest of the WebTV world does.
|
|
||||||
// set header 'minisrv-use-carriage-return' to true to disable \r for this specific transfer.
|
|
||||||
var end_of_line = "\n";
|
var end_of_line = "\n";
|
||||||
if (!headers_obj['minisrv-use-carriage-return'] || headers_obj['minisrv-use-carriage-return'] != "false") end_of_line = "\r\n";
|
if (!headers_obj['minisrv-use-carriage-return'] || headers_obj['minisrv-use-carriage-return'] != "false") end_of_line = "\r\n";
|
||||||
if (headers_obj['minisrv-use-carriage-return']) delete headers_obj['minisrv-use-carriage-return'];
|
if (headers_obj['minisrv-use-carriage-return']) delete headers_obj['minisrv-use-carriage-return'];
|
||||||
|
|
||||||
if (end_of_line == "\n" && zdebug) console.log(" * Script requested to send headers without carriage return (bf0app hack)");
|
if (end_of_line == "\n" && zdebug) console.log(" * Script requested to send headers without carriage return (bf0app hack)");
|
||||||
|
|
||||||
// convert header object back to string
|
// header object to string
|
||||||
if (zshowheaders) console.log(" * Outgoing headers on socket ID", socket.id, (await filterSSID(headers_obj)));
|
if (zshowheaders) console.log(" * Outgoing headers on socket ID", socket.id, (await filterSSID(headers_obj)));
|
||||||
Object.keys(headers_obj).forEach(function (k) {
|
Object.keys(headers_obj).forEach(function (k) {
|
||||||
if (k == "http_response") {
|
if (k == "http_response") {
|
||||||
@@ -643,7 +608,7 @@ async function sendToClient(socket, headers_obj, data, compress_data = false) {
|
|||||||
if (zquiet) var verbosity_mod = (headers_obj["wtv-encrypted"] == 'true') ? " encrypted response" : "";
|
if (zquiet) var verbosity_mod = (headers_obj["wtv-encrypted"] == 'true') ? " encrypted response" : "";
|
||||||
if (socket_sessions[socket.id].secure_headers == true) {
|
if (socket_sessions[socket.id].secure_headers == true) {
|
||||||
// encrypt headers
|
// encrypt headers
|
||||||
if (zquiet)verbosity_mod += " with encrypted headers";
|
if (zquiet) verbosity_mod += " with encrypted headers";
|
||||||
var enc_headers = socket_sessions[socket.id].wtvsec.Encrypt(1, headers + end_of_line);
|
var enc_headers = socket_sessions[socket.id].wtvsec.Encrypt(1, headers + end_of_line);
|
||||||
socket.write(new Uint8Array(concatArrayBuffer(enc_headers, data)));
|
socket.write(new Uint8Array(concatArrayBuffer(enc_headers, data)));
|
||||||
} else {
|
} else {
|
||||||
@@ -660,10 +625,10 @@ async function sendToClient(socket, headers_obj, data, compress_data = false) {
|
|||||||
if (socket_sessions[socket.id].post_data) delete socket_sessions[socket.id].post_data;
|
if (socket_sessions[socket.id].post_data) delete socket_sessions[socket.id].post_data;
|
||||||
if (socket_sessions[socket.id].post_data_length) delete socket_sessions[socket.id].post_data_length;
|
if (socket_sessions[socket.id].post_data_length) delete socket_sessions[socket.id].post_data_length;
|
||||||
if (socket_sessions[socket.id].post_data_percents_shown) delete socket_sessions[socket.id].post_data_percents_shown;
|
if (socket_sessions[socket.id].post_data_percents_shown) delete socket_sessions[socket.id].post_data_percents_shown;
|
||||||
|
|
||||||
if (socket_sessions[socket.id].close_me) socket.end();
|
if (socket_sessions[socket.id].close_me) socket.end();
|
||||||
if (headers_obj["Connection"]) {
|
if (headers_obj["Connection"]) {
|
||||||
if (headers_obj["Connection"].toLowerCase() == "close" || wtv_connection_close == "true") {
|
if (headers_obj["Connection"].toLowerCase() == "close" && wtv_connection_close == "true") {
|
||||||
socket.destroy();
|
socket.destroy();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user