From a824ff6d7bfbbb6a1501a5b90476682441547ec3 Mon Sep 17 00:00:00 2001 From: Mikhail Chechnev Date: Mon, 5 Sep 2022 19:55:09 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A6=D0=98=D0=A2=D0=9A-437=20-=20=D0=BF=D0=BE?= =?UTF-8?q?=D0=B4=D0=B4=D0=B5=D1=80=D0=B6=D0=BA=D0=B0=20HTTP-=D0=BC=D0=B5?= =?UTF-8?q?=D1=82=D0=BE=D0=B4=D0=BE=D0=B2=20PATCH,=20PUT,=20HEAD,=20DELETE?= =?UTF-8?q?,=20CONNECT,=20OPTIONS=20=D0=B8=20TRACE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/in_queue.js | 39 ++++++++++++------------- core/out_queue_processor.js | 16 +++++++++-- models/obj_service_function.js | 52 ++++++++++++++++++++++++++++++++-- 3 files changed, 83 insertions(+), 24 deletions(-) diff --git a/core/in_queue.js b/core/in_queue.js index 6454c60..ef55430 100644 --- a/core/in_queue.js +++ b/core/in_queue.js @@ -102,11 +102,15 @@ class InQueue extends EventEmitter { let optionsResp = {}; //Флаг прекращения обработки сообщения let bStopPropagation = false; - //Определимся с телом сообщения - для POST сообщений - это тело запроса - if (prms.function.nFnPrmsType == objServiceFnSchema.NFN_PRMS_TYPE_POST) { + //Определимся с телом сообщения - для POST, PATCH и PUT сообщений - это тело запроса + if ( + [objServiceFnSchema.NFN_PRMS_TYPE_POST, objServiceFnSchema.NFN_PRMS_TYPE_PATCH, objServiceFnSchema.NFN_PRMS_TYPE_PUT].includes( + prms.function.nFnPrmsType + ) + ) { blMsg = prms.req.body && !_.isEmpty(prms.req.body) ? prms.req.body : null; } else { - //Для GET - параметры запроса + //Для GET, HEAD, DELETE, CONNECT, OPTIONS и TRACE - параметры запроса if (!_.isEmpty(prms.req.query)) blMsg = Buffer.from(JSON.stringify(prms.req.query)); } //Определимся с параметрами сообщения полученными от внешней системы @@ -392,23 +396,20 @@ class InQueue extends EventEmitter { _.filter(srvs.functions, fn => !fn.sFnURL.startsWith("@")), fn => { //...собственный обработчик, в зависимости от указанного способа передачи параметров - this.webApp[fn.nFnPrmsType == objServiceFnSchema.NFN_PRMS_TYPE_POST ? "post" : "get"]( - buildURL({ sSrvRoot: srvs.sSrvRoot, sFnURL: fn.sFnURL }), - async (req, res) => { - try { - //Вызываем обработчик - await this.processMessage({ req, res, service: srvs, function: fn }); - } catch (e) { - //Протоколируем в журнал работы сервера - await this.logger.error(makeErrorText(e), { - nServiceId: srvs.nId, - nServiceFnId: fn.nId - }); - //Отправим ошибку клиенту - res.status(500).send(makeErrorText(e)); - } + this.webApp[fn.sFnPrmsType.toLowerCase()](buildURL({ sSrvRoot: srvs.sSrvRoot, sFnURL: fn.sFnURL }), async (req, res) => { + try { + //Вызываем обработчик + await this.processMessage({ req, res, service: srvs, function: fn }); + } catch (e) { + //Протоколируем в журнал работы сервера + await this.logger.error(makeErrorText(e), { + nServiceId: srvs.nId, + nServiceFnId: fn.nId + }); + //Отправим ошибку клиенту + res.status(500).send(makeErrorText(e)); } - ); + }); //...и собственный обработчик ошибок this.webApp.use(buildURL({ sSrvRoot: srvs.sSrvRoot, sFnURL: fn.sFnURL }), async (err, req, res, next) => { //Протоколируем в журнал работы сервера diff --git a/core/out_queue_processor.js b/core/out_queue_processor.js index b1fada3..5647649 100644 --- a/core/out_queue_processor.js +++ b/core/out_queue_processor.js @@ -129,8 +129,12 @@ const appProcess = async prms => { let optionsResp = {}; //Флаг прекращения обработки сообщения let bStopPropagation = false; - //Определимся с URL и телом сообщения в зависимости от способа передачи параметров - if (prms.function.nFnPrmsType == objServiceFnSchema.NFN_PRMS_TYPE_POST) { + //Определимся с URL и телом сообщения в зависимости от способа передачи параметров (для POST, PATCH и PUT - данные в теле, для остальных - в URI) + if ( + [objServiceFnSchema.NFN_PRMS_TYPE_POST, objServiceFnSchema.NFN_PRMS_TYPE_PATCH, objServiceFnSchema.NFN_PRMS_TYPE_PUT].includes( + prms.function.nFnPrmsType + ) + ) { options.url = buildURL({ sSrvRoot: prms.service.sSrvRoot, sFnURL: prms.function.sFnURL }); options.body = prms.queue.blMsg; options.headers = { "content-type": "application/octet-stream" }; @@ -185,7 +189,13 @@ const appProcess = async prms => { nQueueId: prms.queue.nId, blMsg: prms.queue.blMsg }); - if (prms.function.nFnPrmsType == objServiceFnSchema.NFN_PRMS_TYPE_POST) { + if ( + [ + objServiceFnSchema.NFN_PRMS_TYPE_POST, + objServiceFnSchema.NFN_PRMS_TYPE_PATCH, + objServiceFnSchema.NFN_PRMS_TYPE_PUT + ].includes(prms.function.nFnPrmsType) + ) { options.body = prms.queue.blMsg; } else { options.url = buildURL({ diff --git a/models/obj_service_function.js b/models/obj_service_function.js index bc74130..cf266cb 100644 --- a/models/obj_service_function.js +++ b/models/obj_service_function.js @@ -25,8 +25,22 @@ const SFN_TYPE_LOGOUT = "LOGOUT"; //Завершение сеанса (стро //Способы передачи параметров функциям сервиса const NFN_PRMS_TYPE_POST = 0; //POST-запрос const NFN_PRMS_TYPE_GET = 1; //GET-запрос +const NFN_PRMS_TYPE_HEAD = 2; //HEAD-запрос +const NFN_PRMS_TYPE_PUT = 3; //PUT-запрос +const NFN_PRMS_TYPE_DELETE = 4; //DELETE-запрос +const NFN_PRMS_TYPE_CONNECT = 5; //CONNECT-запрос +const NFN_PRMS_TYPE_OPTIONS = 6; //OPTIONS-запрос +const NFN_PRMS_TYPE_TRACE = 7; //TRACE-запрос +const NFN_PRMS_TYPE_PATCH = 8; //PATCH-запрос const SFN_PRMS_TYPE_POST = "POST"; //POST-запрос const SFN_PRMS_TYPE_GET = "GET"; //GET-запрос +const SFN_PRMS_TYPE_HEAD = "HEAD"; //HEAD-запрос +const SFN_PRMS_TYPE_PUT = "PUT"; //PUT-запрос +const SFN_PRMS_TYPE_DELETE = "DELETE"; //DELETE-запрос +const SFN_PRMS_TYPE_CONNECT = "CONNECT"; //CONNECT-запрос +const SFN_PRMS_TYPE_OPTIONS = "OPTIONS"; //OPTIONS-запрос +const SFN_PRMS_TYPE_TRACE = "TRACE"; //TRACE-запрос +const SFN_PRMS_TYPE_PATCH = "PATCH"; //PATCH-запрос //Расписание повторного исполнения функции const NRETRY_SCHEDULE_UNDEF = 0; //Не определено @@ -87,8 +101,22 @@ exports.SFN_TYPE_LOGIN = SFN_TYPE_LOGIN; exports.SFN_TYPE_LOGOUT = SFN_TYPE_LOGOUT; exports.NFN_PRMS_TYPE_POST = NFN_PRMS_TYPE_POST; exports.NFN_PRMS_TYPE_GET = NFN_PRMS_TYPE_GET; +exports.NFN_PRMS_TYPE_HEAD = NFN_PRMS_TYPE_HEAD; +exports.NFN_PRMS_TYPE_PUT = NFN_PRMS_TYPE_PUT; +exports.NFN_PRMS_TYPE_DELETE = NFN_PRMS_TYPE_DELETE; +exports.NFN_PRMS_TYPE_CONNECT = NFN_PRMS_TYPE_CONNECT; +exports.NFN_PRMS_TYPE_OPTIONS = NFN_PRMS_TYPE_OPTIONS; +exports.NFN_PRMS_TYPE_TRACE = NFN_PRMS_TYPE_TRACE; +exports.NFN_PRMS_TYPE_PATCH = NFN_PRMS_TYPE_PATCH; exports.SFN_PRMS_TYPE_POST = SFN_PRMS_TYPE_POST; exports.SFN_PRMS_TYPE_GET = SFN_PRMS_TYPE_GET; +exports.SFN_PRMS_TYPE_HEAD = SFN_PRMS_TYPE_HEAD; +exports.SFN_PRMS_TYPE_PUT = SFN_PRMS_TYPE_PUT; +exports.SFN_PRMS_TYPE_DELETE = SFN_PRMS_TYPE_DELETE; +exports.SFN_PRMS_TYPE_CONNECT = SFN_PRMS_TYPE_CONNECT; +exports.SFN_PRMS_TYPE_OPTIONS = SFN_PRMS_TYPE_OPTIONS; +exports.SFN_PRMS_TYPE_TRACE = SFN_PRMS_TYPE_TRACE; +exports.SFN_PRMS_TYPE_PATCH = SFN_PRMS_TYPE_PATCH; exports.NRETRY_SCHEDULE_UNDEF = NRETRY_SCHEDULE_UNDEF; exports.NRETRY_SCHEDULE_SEC = NRETRY_SCHEDULE_SEC; exports.NRETRY_SCHEDULE_MIN = NRETRY_SCHEDULE_MIN; @@ -177,7 +205,17 @@ exports.ServiceFunction = new Schema({ //Способ передачи параметров функции сервиса nFnPrmsType: { type: Number, - enum: [NFN_PRMS_TYPE_GET, NFN_PRMS_TYPE_POST], + enum: [ + NFN_PRMS_TYPE_GET, + NFN_PRMS_TYPE_POST, + NFN_PRMS_TYPE_HEAD, + NFN_PRMS_TYPE_PUT, + NFN_PRMS_TYPE_DELETE, + NFN_PRMS_TYPE_CONNECT, + NFN_PRMS_TYPE_OPTIONS, + NFN_PRMS_TYPE_TRACE, + NFN_PRMS_TYPE_PATCH + ], required: true, message: { type: path => @@ -189,7 +227,17 @@ exports.ServiceFunction = new Schema({ //Способ передачи параметров функции сервиса (строковый код) sFnPrmsType: { type: String, - enum: [SFN_PRMS_TYPE_GET, SFN_PRMS_TYPE_POST], + enum: [ + SFN_PRMS_TYPE_GET, + SFN_PRMS_TYPE_POST, + SFN_PRMS_TYPE_HEAD, + SFN_PRMS_TYPE_PUT, + SFN_PRMS_TYPE_DELETE, + SFN_PRMS_TYPE_CONNECT, + SFN_PRMS_TYPE_OPTIONS, + SFN_PRMS_TYPE_TRACE, + SFN_PRMS_TYPE_PATCH + ], required: true, message: { type: path =>