diff --git a/server_http.hpp b/server_http.hpp index 6fcc678..43e32d2 100644 --- a/server_http.hpp +++ b/server_http.hpp @@ -5,6 +5,7 @@ #include #include +#include #include #include #include @@ -140,42 +141,29 @@ namespace SimpleWeb { ///Set before calling start(). Config config; - std::unordered_map::Response>, std::shared_ptr::Request>)> > > resource; - std::unordered_map::Response>, std::shared_ptr::Request>)> > default_resource; std::function::Request>, const boost::system::error_code&)> on_error; std::function socket, std::shared_ptr::Request>)> on_upgrade; - - private: - std::vector::Response>, std::shared_ptr::Request>)> > > > > opt_resource; public: virtual void start() { - //Copy the resources to opt_resource for more efficient request processing - opt_resource.clear(); - for(auto& res: resource) { - for(auto& res_method: res.second) { - auto it=opt_resource.end(); - for(auto opt_it=opt_resource.begin();opt_it!=opt_resource.end();opt_it++) { - if(res_method.first==opt_it->first) { - it=opt_it; - break; - } - } - if(it==opt_resource.end()) { - opt_resource.emplace_back(); - it=opt_resource.begin()+(opt_resource.size()-1); - it->first=res_method.first; - } - it->second.emplace_back(REGEX_NS::regex(res.first), res_method.second); - } - } - if(!io_service) io_service=std::make_shared(); @@ -360,28 +348,27 @@ namespace SimpleWeb { void find_resource(const std::shared_ptr &socket, const std::shared_ptr &request) { //Upgrade connection if(on_upgrade) { - auto it_param=request->header.find("Upgrade"); - if(it_param!=request->header.end()) { + auto it=request->header.find("Upgrade"); + if(it!=request->header.end()) { on_upgrade(socket, request); return; } } //Find path- and method-match, and call write_response - for(auto& res: opt_resource) { - if(request->method==res.first) { - for(auto& res_path: res.second) { - REGEX_NS::smatch sm_res; - if(REGEX_NS::regex_match(request->path, sm_res, res_path.first)) { - request->path_match=std::move(sm_res); - write_response(socket, request, res_path.second); - return; - } + for(auto ®ex_method: resource) { + auto it=regex_method.second.find(request->method); + if(it!=regex_method.second.end()) { + REGEX_NS::smatch sm_res; + if(REGEX_NS::regex_match(request->path, sm_res, regex_method.first)) { + request->path_match=std::move(sm_res); + write_response(socket, request, it->second); + return; } } } - auto it_method=default_resource.find(request->method); - if(it_method!=default_resource.end()) { - write_response(socket, request, it_method->second); + auto it=default_resource.find(request->method); + if(it!=default_resource.end()) { + write_response(socket, request, it->second); } }