КонтекстДинамическое отбрасывание обработчиков в restify
Я пытаюсь создать динамический сервер с restify
(2.6.2), где услуги должны быть установлены и удалены после запуска сервера. Я понял, что это можно рассматривать как нечто странное, но оно имеет смысл в контексте проекта, ориентированного на DSL
. Для достижения этой цели я реализованы следующие функции:
var install = function (path, method, handler) {
var id = server[method](path, function (request, response) { // [1]
handler (request, response);
});
return id;
}
var uninstall = function (id) {
delete server.routes[id]; // [2]
}
Инсталляционный функции, устанавливает обработчик в маршрут, указанный путь и имя метода [1]. Функция удаления, удалите обработчик, сбросив его с маршрутов [2]. Эти возможности представлены в виде сервисов следующего код:
var db = ...
var server = restify.createServer()
.use (restify.bodyParser ({ mapParams: false }))
.use (restify.queryParser())
.use (restify.fullResponse());
service.post ('/services', function (request, response) {
var path = request.body.path;
var method = request.body.method;
var handler = createHandler (request.body.dsl) // off-topic
var id = install (path, method, handler)
db.save (path, method, id); // [3]
});
service.del ('/services', function (request, response) {
var path = request.body.path;
var method = request.body.method;
var id = db.load (path, method); // [4]
uninstall (id);
});
В посте методе [3], обработчик получается из тела (это не по теме, как это осуществляется) и служба устанавливается хранение возвращаемого id в базе данных. Метод del [4], извлекает идентификатор из базы данных и вызывает функцию удаления.
Проблема
Этот код был блок испытанного и он работает нормально, но неисправность достигается при попытке выполнить установку/удаление последовательности как следующий. В этом примере, пожалуйста, предположим, что тело всех запросов содержит тот же path
, HTTP verb
и правильное содержание, чтобы построить правильный handler
:
/*
post: /services : Installed -> ok
del: /services : Resource not found -> ok
post: /services : Resource not found -> Error :(
*/
В первой установке, handler
выполняется, когда ресурс присоединился через path
и verb
. Запрос на удаление корректно выполняется, потому что сообщение Resource not found
получено, когда path
посещен на verb
. Тем не менее, когда одно и то же тело устанавливается во-вторых на сервере, возвращается Resource not found
, когда path
присоединяется к verb
.
Я полагаю, что ошибка находится в [2], потому что, возможно, я не использую правильную отмену регистрации для restify
.
Вопрос
Как можно эффективно упал обработчики из restify
после запуска сервера?
В стороне, разве это не невероятно рискованно с точки зрения безопасности? Вы разрешаете передавать произвольный код, который будет выполняться при ударе определенной конечной точки, которая также передается. – HeadCode