From 113871e82fead8731b9fc9d2f651cbbcbe32a490 Mon Sep 17 00:00:00 2001 From: boa604 Date: Mon, 3 Aug 2026 13:24:11 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A6=D0=98=D0=A2=D0=9A-1081.=20=D0=9D=D0=BE?= =?UTF-8?q?=D1=80=D0=BC=D0=B0=D0=BB=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D1=8F=20?= =?UTF-8?q?=D0=B8=20=D1=83=D0=B4=D0=B0=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20?= =?UTF-8?q?=D1=81=D0=B8=D1=81=D1=82=D0=B5=D0=BC=D0=BD=D1=8B=D1=85=20=D1=81?= =?UTF-8?q?=D0=B8=D0=BC=D0=B2=D0=BE=D0=BB=D0=BE=D0=B2=20=D0=BE=D1=82=D1=81?= =?UTF-8?q?=D0=BA=D0=B0=D0=BD=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=BD?= =?UTF-8?q?=D1=8B=D1=85=20=D1=88=D1=82=D1=80=D0=B8=D1=85=D0=BA=D0=BE=D0=B4?= =?UTF-8?q?=D0=BE=D0=B2.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- modules/pws.js | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/modules/pws.js b/modules/pws.js index 4230f9f..0598dcc 100644 --- a/modules/pws.js +++ b/modules/pws.js @@ -27,6 +27,15 @@ const SQUERY_RESP_CT = "SRESP_CT"; //Параметр URL-запроса для //Коды функций-обработчиков (согласно настройкам "Сервисов обмена") const SFNC_UPLOAD = "Upload"; //Функция загрузки +//Имена узлов/аргументов PWS-запроса +const SNODE_XREQUEST = "XREQUEST"; //Корневой узел запроса +const SNODE_XPAYLOAD = "XPAYLOAD"; //Полезная нагрузка запроса +const SNODE_XARGUMENTS = "XARGUMENTS"; //Коллекция аргументов +const SNODE_XARGUMENT = "XARGUMENT"; //Элемент аргумента +const SNODE_SNAME = "SNAME"; //Имя аргумента +const SNODE_VALUE = "VALUE"; //Значение аргумента +const SARG_SSEARCH = "SSEARCH"; //Аргумент строки поиска + //------------ // Тело модуля //------------ @@ -69,6 +78,38 @@ const converXMLArraysToJSON = (obj, arrayKey) => { } }; +//Кодирование строки в Base64 (UTF-8) +const encodeBase64Utf8 = sValue => Buffer.from(sValue, "utf8").toString("base64"); + +//Получение полезной нагрузки запроса +const getRequestPayload = request => { + if (!request || typeof request !== "object") return null; + const xRequest = request[SNODE_XREQUEST]; + if (!xRequest || typeof xRequest !== "object") return null; + const xPayload = xRequest[SNODE_XPAYLOAD]; + if (!xPayload || typeof xPayload !== "object") return null; + return xPayload; +}; + +//Подготовка JSON-запроса перед конвертацией в XML +const prepareRequestForXml = request => { + //Получим полезную нагрузку запроса + const xPayload = getRequestPayload(request); + if (!xPayload) return request; + //Получим коллекцию аргументов + const xArguments = xPayload[SNODE_XARGUMENTS]; + if (!Array.isArray(xArguments)) return request; + //Обработаем аргументы + for (let i = 0; i < xArguments.length; i++) { + const item = xArguments[i]; + const arg = item && (item[SNODE_XARGUMENT] || item); + if (!arg || typeof arg !== "object" || arg[SNODE_SNAME] !== SARG_SSEARCH) continue; + if (arg[SNODE_VALUE] === undefined || arg[SNODE_VALUE] === null) continue; + arg[SNODE_VALUE] = encodeBase64Utf8(arg[SNODE_VALUE]); + } + return request; +}; + //Обработчик "До" для полученного сообщения const before = async prms => { //Если пришел запрос в JSON @@ -77,6 +118,7 @@ const before = async prms => { let requestXML = ""; try { let request = JSON.parse(prms.queue.blMsg.toString()); + request = prepareRequestForXml(request); let builder = new xml2js.Builder(); requestXML = builder.buildObject(request); } catch (e) {