From 27bf11d35c8ce44fd9fef656e2975712846b9bb2 Mon Sep 17 00:00:00 2001 From: Antony Woods Date: Thu, 23 Oct 2014 18:33:03 +0100 Subject: Re-implemented 'get_middleware()' as suggested, without changing the Server constructor and now no longer encountering hangs --- include/crow.h | 10 +++++++++- include/http_connection.h | 10 +++++----- include/http_server.h | 8 ++++---- include/utility.h | 42 +++++++++++++++++++++++++++++++++++++++++- 4 files changed, 59 insertions(+), 11 deletions(-) (limited to 'include') 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(); } + template + T* get_middleware() + { + return utility::get_element_by_type_ptr(middlewares_); + } + private: uint16_t port_ = 80; uint16_t concurrency_ = 1; Router router_; + + std::tuple middlewares_; }; template using App = Crow; diff --git a/include/http_connection.h b/include/http_connection.h index 016c270..46eae18 100644 --- a/include/http_connection.h +++ b/include/http_connection.h @@ -112,7 +112,7 @@ namespace crow boost::asio::io_service& io_service, Handler* handler, const std::string& server_name, - std::tuple& middlewares + std::tuple* middlewares ) : socket_(io_service), handler_(handler), @@ -209,7 +209,7 @@ namespace crow ctx_ = detail::context(); 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_) { @@ -242,8 +242,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(); @@ -490,7 +490,7 @@ namespace crow bool need_to_start_read_after_complete_{}; bool add_keep_alive_{}; - std::tuple& middlewares_; + std::tuple* middlewares_; detail::context ctx_; }; diff --git a/include/http_server.h b/include/http_server.h index 484aa83..32e0e42 100644 --- a/include/http_server.h +++ b/include/http_server.h @@ -22,12 +22,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 = 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) { } @@ -120,7 +121,6 @@ namespace crow uint16_t port_; unsigned int roundrobin_index_{}; - std::tuple middlewares_; - + std::tuple* 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 struct empty_context { }; - } + + } // namespace black_magic + + namespace detail + { + + template + struct get_index_of_element_from_tuple_by_type_impl + { + static constexpr auto value = N; + }; + + template + struct get_index_of_element_from_tuple_by_type_impl + { + static constexpr auto value = N; + }; + + template + struct get_index_of_element_from_tuple_by_type_impl + { + static constexpr auto value = get_index_of_element_from_tuple_by_type_impl::value; + }; + + } // namespace detail + + namespace utility + { + template + T get_element_by_type(std::tuple& t) + { + return std::get::value>(t); + } + + template + T* get_element_by_type_ptr(std::tuple& t) + { + return &std::get::value>(t); + } + + } // namespace utility } -- cgit v1.2.3-54-g00ecf