aboutsummaryrefslogtreecommitdiffstats
path: root/include
diff options
context:
space:
mode:
authorAntony Woods <acron1@gmail.com>2014-10-23 18:33:03 +0100
committerAntony Woods <acron1@gmail.com>2014-10-23 18:33:03 +0100
commit27bf11d35c8ce44fd9fef656e2975712846b9bb2 (patch)
tree7005bb1a5227983464e9a89fb7a381000ce7bb74 /include
parenta5fab23f70e6e33c633ba4b646a41d0851169ad1 (diff)
downloadcrow-27bf11d35c8ce44fd9fef656e2975712846b9bb2.tar.gz
crow-27bf11d35c8ce44fd9fef656e2975712846b9bb2.zip
Re-implemented 'get_middleware()' as suggested, without changing the Server constructor and now no longer encountering hangs
Diffstat (limited to 'include')
-rw-r--r--include/crow.h10
-rw-r--r--include/http_connection.h10
-rw-r--r--include/http_server.h8
-rw-r--r--include/utility.h42
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 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...>& middlewares
+ std::tuple<Middlewares...>* middlewares
)
: socket_(io_service),
handler_(handler),
@@ -209,7 +209,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_)
{
@@ -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...>& middlewares_;
+ std::tuple<Middlewares...>* middlewares_;
detail::context<Middlewares...> 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...>* 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...> 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
}