From 2748e35430b9a4aaf64dfbd626d819f0fc5eedd2 Mon Sep 17 00:00:00 2001 From: ipknHama Date: Sun, 7 Sep 2014 04:30:53 +0900 Subject: basic middleware test: before_handler --- include/http_connection.h | 64 ++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 58 insertions(+), 6 deletions(-) (limited to 'include/http_connection.h') diff --git a/include/http_connection.h b/include/http_connection.h index 907485f..a8631d9 100644 --- a/include/http_connection.h +++ b/include/http_connection.h @@ -2,9 +2,9 @@ #include #include #include +#include #include #include -#include #include "http_parser_merged.h" @@ -14,23 +14,57 @@ #include "logging.h" #include "settings.h" #include "dumb_timer_queue.h" +#include "middleware_context.h" namespace crow { + namespace detail + { + template + bool middleware_call_helper(Container& middlewares, request& req, response& res, Context& ctx) + { + // TODO cut ctx to partial_context<0..N-1> + std::get(middlewares).before_handle(req, res, ctx.template get(), ctx); + if (res.is_completed()) + { + std::get(middlewares).after_handle(req, res, ctx.template get(), ctx); + return true; + } + if (middleware_call_helper(middlewares, req, res, ctx)) + { + std::get(middlewares).after_handle(req, res, ctx.template get(), ctx); + return true; + } + return false; + } + + template + bool middleware_call_helper(Container& middlewares, request& req, response& res, Context& ctx) + { + return false; + } + } + using namespace boost; using tcp = asio::ip::tcp; #ifdef CROW_ENABLE_DEBUG static int connectionCount; #endif - template + template class Connection { public: - Connection(boost::asio::io_service& io_service, Handler* handler, const std::string& server_name) + Connection( + boost::asio::io_service& io_service, + Handler* handler, + const std::string& server_name, + std::tuple& middlewares + ) : socket_(io_service), handler_(handler), parser_(this), - server_name_(server_name) + server_name_(server_name), + middlewares_(middlewares) { #ifdef CROW_ENABLE_DEBUG connectionCount ++; @@ -101,11 +135,20 @@ namespace crow << method_name(req.method) << " " << req.url; + need_to_call_after_handlers_ = false; if (!is_invalid_request) { res.complete_request_handler_ = [this]{ this->complete_request(); }; res.is_alive_helper_ = [this]()->bool{ return socket_.is_open(); }; - handler_->handle(req, res); + + req.middleware_context = (void*)&ctx_; + detail::middleware_call_helper<0, decltype(ctx_), decltype(middlewares_), Middlewares...>(middlewares_, req, res, ctx_); + + if (!res.completed_) + { + need_to_call_after_handlers_ = true; + handler_->handle(req, res); + } } else { @@ -117,6 +160,11 @@ namespace crow { CROW_LOG_INFO << "Response: " << this << ' ' << res.code << ' ' << close_connection_; + if (need_to_call_after_handlers_) + { + // TODO call all of after_handlers + } + //auto self = this->shared_from_this(); res.complete_request_handler_ = nullptr; @@ -330,7 +378,7 @@ namespace crow tcp::socket socket_; Handler* handler_; - std::array buffer_; + boost::array buffer_; HTTPParser parser_; response res; @@ -348,6 +396,10 @@ namespace crow bool is_reading{}; bool is_writing{}; + bool need_to_call_after_handlers_; + + std::tuple& middlewares_; + detail::context ctx_; }; } -- cgit v1.2.3-54-g00ecf