diff options
Diffstat (limited to 'include')
-rw-r--r-- | include/crow.h | 10 | ||||
-rw-r--r-- | include/http_connection.h | 10 | ||||
-rw-r--r-- | include/http_server.h | 8 | ||||
-rw-r--r-- | include/utility.h | 42 |
4 files changed, 59 insertions, 11 deletions
diff --git a/include/crow.h b/include/crow.h index fdc5206..c9fdff9 100644 --- a/include/crow.h +++ b/include/crow.h @@ -69,7 +69,7 @@ namespace crow void run() { validate(); - server_t server(this, port_, concurrency_); + server_t server(this, port_, &middlewares_, concurrency_); server.run(); } @@ -89,11 +89,19 @@ namespace crow return ctx.template get<T>(); } + template <typename T> + T* get_middleware() + { + return utility::get_element_by_type_ptr<T, Middlewares...>(middlewares_); + } + private: uint16_t port_ = 80; uint16_t concurrency_ = 1; Router router_; + + std::tuple<Middlewares...> middlewares_; }; template <typename ... Middlewares> using App = Crow<Middlewares...>; diff --git a/include/http_connection.h b/include/http_connection.h index d88bc25..db069c3 100644 --- a/include/http_connection.h +++ b/include/http_connection.h @@ -113,7 +113,7 @@ namespace crow boost::asio::io_service& io_service, Handler* handler, const std::string& server_name, - std::tuple<Middlewares...>& middlewares + std::tuple<Middlewares...>* middlewares ) : socket_(io_service), handler_(handler), @@ -210,7 +210,7 @@ namespace crow ctx_ = detail::context<Middlewares...>(); req.middleware_context = (void*)&ctx_; - detail::middleware_call_helper<0, decltype(ctx_), decltype(middlewares_), Middlewares...>(middlewares_, req, res, ctx_); + detail::middleware_call_helper<0, decltype(ctx_), decltype(*middlewares_), Middlewares...>(*middlewares_, req, res, ctx_); if (!res.completed_) { @@ -243,8 +243,8 @@ namespace crow detail::after_handlers_call_helper< ((int)sizeof...(Middlewares)-1), decltype(ctx_), - decltype(middlewares_)> - (middlewares_, ctx_, req_, res); + decltype(*middlewares_)> + (*middlewares_, ctx_, req_, res); } //auto self = this->shared_from_this(); @@ -491,7 +491,7 @@ namespace crow bool need_to_start_read_after_complete_{}; bool add_keep_alive_{}; - std::tuple<Middlewares...>& middlewares_; + std::tuple<Middlewares...>* middlewares_; detail::context<Middlewares...> ctx_; }; diff --git a/include/http_server.h b/include/http_server.h index 2241dec..bd35ba1 100644 --- a/include/http_server.h +++ b/include/http_server.h @@ -23,12 +23,13 @@ namespace crow class Server { public: - Server(Handler* handler, uint16_t port, uint16_t concurrency = 1) + Server(Handler* handler, uint16_t port, std::tuple<Middlewares...>* middlewares = nullptr, uint16_t concurrency = 1) : acceptor_(io_service_, tcp::endpoint(asio::ip::address(), port)), signals_(io_service_, SIGINT, SIGTERM), handler_(handler), concurrency_(concurrency), - port_(port) + port_(port), + middlewares_(middlewares) { } @@ -121,7 +122,6 @@ namespace crow uint16_t port_; unsigned int roundrobin_index_{}; - std::tuple<Middlewares...> middlewares_; - + std::tuple<Middlewares...>* middlewares_; }; } diff --git a/include/utility.h b/include/utility.h index c910eb2..835fdbd 100644 --- a/include/utility.h +++ b/include/utility.h @@ -293,5 +293,45 @@ template <typename F, typename Set> struct empty_context { }; - } + + } // namespace black_magic + + namespace detail + { + + template <class T, std::size_t N, class... Args> + struct get_index_of_element_from_tuple_by_type_impl + { + static constexpr auto value = N; + }; + + template <class T, std::size_t N, class... Args> + struct get_index_of_element_from_tuple_by_type_impl<T, N, T, Args...> + { + static constexpr auto value = N; + }; + + template <class T, std::size_t N, class U, class... Args> + struct get_index_of_element_from_tuple_by_type_impl<T, N, U, Args...> + { + static constexpr auto value = get_index_of_element_from_tuple_by_type_impl<T, N + 1, Args...>::value; + }; + + } // namespace detail + + namespace utility + { + template <class T, class... Args> + T get_element_by_type(std::tuple<Args...>& t) + { + return std::get<detail::get_index_of_element_from_tuple_by_type_impl<T, 0, Args...>::value>(t); + } + + template <class T, class... Args> + T* get_element_by_type_ptr(std::tuple<Args...>& t) + { + return &std::get<detail::get_index_of_element_from_tuple_by_type_impl<T, 0, Args...>::value>(t); + } + + } // namespace utility } |