Unverified Commit 27a9c39b authored by Dennis Jenkins's avatar Dennis Jenkins Committed by GitHub

Merge pull request #90 from jeffvandyke/notFoundHandler

Added Routes::NotFound, a custom handler for unmatched routes, to Router
parents ae904949 623b69e6
......@@ -156,6 +156,10 @@ public:
void addCustomHandler(Route::Handler handler);
void addNotFoundHandler(Route::Handler handler);
inline bool hasNotFoundHandler() { return notFoundHandler != nullptr; }
void invokeNotFoundHandler(const Http::Request &req, Http::ResponseWriter resp) const;
Status route(const Http::Request& request, Http::ResponseWriter response);
private:
......@@ -163,6 +167,8 @@ private:
std::unordered_map<Http::Method, std::vector<Route>> routes;
std::vector<Route::Handler> customHandlers;
Route::Handler notFoundHandler;
};
namespace Private {
......@@ -214,6 +220,8 @@ namespace Routes {
void Delete(Router& router, std::string resource, Route::Handler handler);
void Options(Router& router, std::string resource, Route::Handler handler);
void NotFound(Router& router, Route::Handler handler);
namespace details {
template <class... Args>
struct TypeList
......
......@@ -222,7 +222,15 @@ RouterHandler::onRequest(
/* @Feature: add support for a custom NotFound handler */
if (result == Router::Status::NotFound)
response.send(Http::Code::Not_Found, "Could not find a matching route");
{
if (router.hasNotFoundHandler())
{
auto resp2 = response.clone();
router.invokeNotFoundHandler(req, std::move(resp2));
}
else
response.send(Http::Code::Not_Found, "Could not find a matching route");
}
}
} // namespace Private
......@@ -291,6 +299,17 @@ Router::addCustomHandler(Route::Handler handler) {
customHandlers.push_back(std::move(handler));
}
void
Router::addNotFoundHandler(Route::Handler handler) {
notFoundHandler = std::move(handler);
}
void
Router::invokeNotFoundHandler(const Http::Request &req, Http::ResponseWriter resp) const
{
notFoundHandler(Rest::Request(std::move(req), std::vector<TypedParam>(), std::vector<TypedParam>()), std::move(resp));
}
Router::Status
Router::route(const Http::Request& req, Http::ResponseWriter response) {
auto& r = routes[req.method()];
......@@ -348,6 +367,10 @@ void Options(Router& router, std::string resource, Route::Handler handler) {
router.options(std::move(resource), std::move(handler));
}
void NotFound(Router& router, Route::Handler handler) {
router.addNotFoundHandler(std::move(handler));
}
} // namespace Routes
} // namespace Rest
} // namespace Pistache
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment