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: ...@@ -156,6 +156,10 @@ public:
void addCustomHandler(Route::Handler handler); 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); Status route(const Http::Request& request, Http::ResponseWriter response);
private: private:
...@@ -163,6 +167,8 @@ private: ...@@ -163,6 +167,8 @@ private:
std::unordered_map<Http::Method, std::vector<Route>> routes; std::unordered_map<Http::Method, std::vector<Route>> routes;
std::vector<Route::Handler> customHandlers; std::vector<Route::Handler> customHandlers;
Route::Handler notFoundHandler;
}; };
namespace Private { namespace Private {
...@@ -214,6 +220,8 @@ namespace Routes { ...@@ -214,6 +220,8 @@ namespace Routes {
void Delete(Router& router, std::string resource, Route::Handler handler); void Delete(Router& router, std::string resource, Route::Handler handler);
void Options(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 { namespace details {
template <class... Args> template <class... Args>
struct TypeList struct TypeList
......
...@@ -222,7 +222,15 @@ RouterHandler::onRequest( ...@@ -222,7 +222,15 @@ RouterHandler::onRequest(
/* @Feature: add support for a custom NotFound handler */ /* @Feature: add support for a custom NotFound handler */
if (result == Router::Status::NotFound) if (result == Router::Status::NotFound)
{
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"); response.send(Http::Code::Not_Found, "Could not find a matching route");
}
} }
} // namespace Private } // namespace Private
...@@ -291,6 +299,17 @@ Router::addCustomHandler(Route::Handler handler) { ...@@ -291,6 +299,17 @@ Router::addCustomHandler(Route::Handler handler) {
customHandlers.push_back(std::move(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::Status
Router::route(const Http::Request& req, Http::ResponseWriter response) { Router::route(const Http::Request& req, Http::ResponseWriter response) {
auto& r = routes[req.method()]; auto& r = routes[req.method()];
...@@ -348,6 +367,10 @@ void Options(Router& router, std::string resource, Route::Handler handler) { ...@@ -348,6 +367,10 @@ void Options(Router& router, std::string resource, Route::Handler handler) {
router.options(std::move(resource), std::move(handler)); router.options(std::move(resource), std::move(handler));
} }
void NotFound(Router& router, Route::Handler handler) {
router.addNotFoundHandler(std::move(handler));
}
} // namespace Routes } // namespace Routes
} // namespace Rest } // namespace Rest
} // namespace Pistache } // 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