From 51565b56a60d468af3d5d873e164d26b66d4e17a Mon Sep 17 00:00:00 2001 From: zefie Date: Mon, 11 Aug 2025 18:24:10 -0400 Subject: [PATCH] update header handling --- zefie_wtvp_minisrv/app.js | 7 +++++- zefie_wtvp_minisrv/client_sim.js | 2 +- .../ServiceVault/wtv-mail/addresslist.js | 4 +++- .../includes/classes/WTVShared.js | 24 ++++++++++--------- 4 files changed, 23 insertions(+), 14 deletions(-) diff --git a/zefie_wtvp_minisrv/app.js b/zefie_wtvp_minisrv/app.js index 46b31c40..bcfa2f83 100644 --- a/zefie_wtvp_minisrv/app.js +++ b/zefie_wtvp_minisrv/app.js @@ -1619,7 +1619,7 @@ async function sendToClient(socket, headers_obj, data = null) { headers_obj = wtvshared.moveObjectKey("Connection", 1, headers_obj); // move Connection to second headers_obj = wtvshared.moveObjectKey("Content-type", -1, headers_obj); // move Content-type to last headers_obj = wtvshared.moveObjectKey("Content-length", "Content-type", headers_obj); // move Content-length to before Content-type - + // remove x-powered-by header if client is WebTV let xpower = wtvshared.getCaseInsensitiveKey("x-powered-by", headers_obj); if (!xpower && socket.service_name) { @@ -1657,6 +1657,11 @@ async function sendToClient(socket, headers_obj, data = null) { if (k == "Status") { headers += headers_obj[k] + eol; } else { + if (typeof headers_obj[k] === 'object') { + headers_obj[k].forEach(function (v) { + headers += k + ": " + v + eol; + }); + } if (k.indexOf('_') >= 0) { let j = k.split('_')[0]; headers += j + ": " + headers_obj[k] + eol; diff --git a/zefie_wtvp_minisrv/client_sim.js b/zefie_wtvp_minisrv/client_sim.js index 1627e266..cff08b6a 100644 --- a/zefie_wtvp_minisrv/client_sim.js +++ b/zefie_wtvp_minisrv/client_sim.js @@ -601,7 +601,7 @@ class WebTVClientSimulator { request += `wtv-system-cpuspeed: 166187148\r\n`; request += `wtv-system-sysconfig: 4163328\r\n`; request += `wtv-disk-size: 8006\r\n`; - request += `wtv-viewer: zefie-minisrv-client_emu\r\n`; // Note: no space after colon + request += `wtv-viewer: zefie-minisrv-client-sim\r\n`; // Note: no space after colon // Add content if POST if (data) { diff --git a/zefie_wtvp_minisrv/includes/ServiceVault/wtv-mail/addresslist.js b/zefie_wtvp_minisrv/includes/ServiceVault/wtv-mail/addresslist.js index 50f51945..94fa2fe5 100644 --- a/zefie_wtvp_minisrv/includes/ServiceVault/wtv-mail/addresslist.js +++ b/zefie_wtvp_minisrv/includes/ServiceVault/wtv-mail/addresslist.js @@ -12,7 +12,9 @@ if (session_data.getSessionData("address_book") != null) { data = `` for (let i = 0; i < address_book.length; i++) { data += address_book[i].name + '\0' + address_book[i].address + '\0' - }; + }; } else { session_data.setSessionData("address_book", []) } + +// TODO: Why does the address book have a blank/corrupt entry when empty? diff --git a/zefie_wtvp_minisrv/includes/classes/WTVShared.js b/zefie_wtvp_minisrv/includes/classes/WTVShared.js index e3b9ae24..ee481a22 100644 --- a/zefie_wtvp_minisrv/includes/classes/WTVShared.js +++ b/zefie_wtvp_minisrv/includes/classes/WTVShared.js @@ -475,15 +475,18 @@ class WTVShared { } else if (d.indexOf(":") > 0) { const d_split = d.split(':'); let header_name = d_split[0]; - if (headers_obj[header_name] != null) { - header_name = header_name + "_" + inc_headers; - inc_headers++; - } - d_split.shift(); - d = d_split.join(':'); - headers_obj[header_name] = (d).trim("\r"); - if (headers_obj[header_name].startsWith(" ")) { - headers_obj[header_name] = headers_obj[header_name].slice(1); + if (typeof headers_obj[header_name] === 'string') { + headers_obj[header_name] = [headers_obj[header_name]]; + headers_obj[header_name].push((d_split.slice(1).join(':')).trim("\r")); + } else if (typeof headers_obj[header_name] === 'object') { + headers_obj[header_name].push((d_split.slice(1).join(':')).trim("\r")); + } else { + d_split.shift(); + d = d_split.join(':'); + headers_obj[header_name] = (d).trim("\r"); + if (headers_obj[header_name].startsWith(" ")) { + headers_obj[header_name] = headers_obj[header_name].slice(1); + } } } }); @@ -1443,8 +1446,7 @@ class WTVShared { findObjectKeyIndex(key, obj, case_insensitive = false) { const keys = Object.keys(obj); if (case_insensitive) { - key = key.toLowerCase(); - return keys.findIndex(k => k.toLowerCase() === key); + return keys.findIndex(k => k.toLowerCase() === key.toLowerCase()); } return keys.indexOf(key); }