ЦИТК-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 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) => {
//Протоколируем в журнал работы сервера

View File

@ -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({

View File

@ -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 =>