ЦИТК-437 - поддержка HTTP-методов PATCH, PUT, HEAD, DELETE, CONNECT, OPTIONS и TRACE

This commit is contained in:
Mikhail Chechnev 2022-09-05 19:55:09 +03:00
parent 195b58e110
commit a824ff6d7b
3 changed files with 83 additions and 24 deletions

View File

@ -102,11 +102,15 @@ class InQueue extends EventEmitter {
let optionsResp = {}; let optionsResp = {};
//Флаг прекращения обработки сообщения //Флаг прекращения обработки сообщения
let bStopPropagation = false; let bStopPropagation = false;
//Определимся с телом сообщения - для POST сообщений - это тело запроса //Определимся с телом сообщения - для POST, PATCH и PUT сообщений - это тело запроса
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
)
) {
blMsg = prms.req.body && !_.isEmpty(prms.req.body) ? prms.req.body : null; blMsg = prms.req.body && !_.isEmpty(prms.req.body) ? prms.req.body : null;
} else { } else {
//Для GET - параметры запроса //Для GET, HEAD, DELETE, CONNECT, OPTIONS и TRACE - параметры запроса
if (!_.isEmpty(prms.req.query)) blMsg = Buffer.from(JSON.stringify(prms.req.query)); if (!_.isEmpty(prms.req.query)) blMsg = Buffer.from(JSON.stringify(prms.req.query));
} }
//Определимся с параметрами сообщения полученными от внешней системы //Определимся с параметрами сообщения полученными от внешней системы
@ -392,9 +396,7 @@ class InQueue extends EventEmitter {
_.filter(srvs.functions, fn => !fn.sFnURL.startsWith("@")), _.filter(srvs.functions, fn => !fn.sFnURL.startsWith("@")),
fn => { fn => {
//...собственный обработчик, в зависимости от указанного способа передачи параметров //...собственный обработчик, в зависимости от указанного способа передачи параметров
this.webApp[fn.nFnPrmsType == objServiceFnSchema.NFN_PRMS_TYPE_POST ? "post" : "get"]( this.webApp[fn.sFnPrmsType.toLowerCase()](buildURL({ sSrvRoot: srvs.sSrvRoot, sFnURL: fn.sFnURL }), async (req, res) => {
buildURL({ sSrvRoot: srvs.sSrvRoot, sFnURL: fn.sFnURL }),
async (req, res) => {
try { try {
//Вызываем обработчик //Вызываем обработчик
await this.processMessage({ req, res, service: srvs, function: fn }); await this.processMessage({ req, res, service: srvs, function: fn });
@ -407,8 +409,7 @@ class InQueue extends EventEmitter {
//Отправим ошибку клиенту //Отправим ошибку клиенту
res.status(500).send(makeErrorText(e)); res.status(500).send(makeErrorText(e));
} }
} });
);
//...и собственный обработчик ошибок //...и собственный обработчик ошибок
this.webApp.use(buildURL({ sSrvRoot: srvs.sSrvRoot, sFnURL: fn.sFnURL }), async (err, req, res, next) => { this.webApp.use(buildURL({ sSrvRoot: srvs.sSrvRoot, sFnURL: fn.sFnURL }), async (err, req, res, next) => {
//Протоколируем в журнал работы сервера //Протоколируем в журнал работы сервера

View File

@ -129,8 +129,12 @@ const appProcess = async prms => {
let optionsResp = {}; let optionsResp = {};
//Флаг прекращения обработки сообщения //Флаг прекращения обработки сообщения
let bStopPropagation = false; let bStopPropagation = false;
//Определимся с URL и телом сообщения в зависимости от способа передачи параметров //Определимся с URL и телом сообщения в зависимости от способа передачи параметров (для POST, PATCH и PUT - данные в теле, для остальных - в URI)
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.url = buildURL({ sSrvRoot: prms.service.sSrvRoot, sFnURL: prms.function.sFnURL }); options.url = buildURL({ sSrvRoot: prms.service.sSrvRoot, sFnURL: prms.function.sFnURL });
options.body = prms.queue.blMsg; options.body = prms.queue.blMsg;
options.headers = { "content-type": "application/octet-stream" }; options.headers = { "content-type": "application/octet-stream" };
@ -185,7 +189,13 @@ const appProcess = async prms => {
nQueueId: prms.queue.nId, nQueueId: prms.queue.nId,
blMsg: prms.queue.blMsg 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; options.body = prms.queue.blMsg;
} else { } else {
options.url = buildURL({ options.url = buildURL({

View File

@ -25,8 +25,22 @@ const SFN_TYPE_LOGOUT = "LOGOUT"; //Завершение сеанса (стро
//Способы передачи параметров функциям сервиса //Способы передачи параметров функциям сервиса
const NFN_PRMS_TYPE_POST = 0; //POST-запрос const NFN_PRMS_TYPE_POST = 0; //POST-запрос
const NFN_PRMS_TYPE_GET = 1; //GET-запрос 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_POST = "POST"; //POST-запрос
const SFN_PRMS_TYPE_GET = "GET"; //GET-запрос 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; //Не определено const NRETRY_SCHEDULE_UNDEF = 0; //Не определено
@ -87,8 +101,22 @@ exports.SFN_TYPE_LOGIN = SFN_TYPE_LOGIN;
exports.SFN_TYPE_LOGOUT = SFN_TYPE_LOGOUT; exports.SFN_TYPE_LOGOUT = SFN_TYPE_LOGOUT;
exports.NFN_PRMS_TYPE_POST = NFN_PRMS_TYPE_POST; exports.NFN_PRMS_TYPE_POST = NFN_PRMS_TYPE_POST;
exports.NFN_PRMS_TYPE_GET = NFN_PRMS_TYPE_GET; 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_POST = SFN_PRMS_TYPE_POST;
exports.SFN_PRMS_TYPE_GET = SFN_PRMS_TYPE_GET; 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_UNDEF = NRETRY_SCHEDULE_UNDEF;
exports.NRETRY_SCHEDULE_SEC = NRETRY_SCHEDULE_SEC; exports.NRETRY_SCHEDULE_SEC = NRETRY_SCHEDULE_SEC;
exports.NRETRY_SCHEDULE_MIN = NRETRY_SCHEDULE_MIN; exports.NRETRY_SCHEDULE_MIN = NRETRY_SCHEDULE_MIN;
@ -177,7 +205,17 @@ exports.ServiceFunction = new Schema({
//Способ передачи параметров функции сервиса //Способ передачи параметров функции сервиса
nFnPrmsType: { nFnPrmsType: {
type: Number, 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, required: true,
message: { message: {
type: path => type: path =>
@ -189,7 +227,17 @@ exports.ServiceFunction = new Schema({
//Способ передачи параметров функции сервиса (строковый код) //Способ передачи параметров функции сервиса (строковый код)
sFnPrmsType: { sFnPrmsType: {
type: String, 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, required: true,
message: { message: {
type: path => type: path =>