diff options
Diffstat (limited to 'include')
-rw-r--r-- | include/routing.h | 20 | ||||
-rw-r--r-- | include/utility.h | 4 |
2 files changed, 20 insertions, 4 deletions
diff --git a/include/routing.h b/include/routing.h index ca88192..87d492b 100644 --- a/include/routing.h +++ b/include/routing.h @@ -26,8 +26,13 @@ namespace crow virtual void handle(const request&, response&, const routing_params&) = 0; - protected: + uint32_t methods() + { + return methods_; + } + protected: + uint32_t methods_{1<<(int)HTTPMethod::GET}; }; template <typename ... Args> @@ -147,6 +152,7 @@ namespace crow self_t& methods(HTTPMethod method) { methods_ = 1<<(int)method; + return *this; } template <typename ... MethodArgs> @@ -154,6 +160,7 @@ namespace crow { methods(args_method...); methods_ |= 1<<(int)method; + return *this; } void validate() @@ -257,7 +264,6 @@ namespace crow std::string rule_; std::string name_; - uint32_t methods_{1<<(int)HTTPMethod::GET}; template <typename T, int Pos> struct call_pair @@ -638,7 +644,15 @@ public: if (rule_index >= rules_.size()) throw std::runtime_error("Trie internal structure corrupted!"); - CROW_LOG_DEBUG << "Matched rule '" << ((TaggedRule<>*)rules_[rule_index].get())->rule_ << "'"; + if ((rules_[rule_index]->methods() & (1<<(uint32_t)req.method)) == 0) + { + CROW_LOG_DEBUG << "Rule found but method mismatch: " << req.url << " with " << method_name(req.method) << "(" << (uint32_t)req.method << ") / " << rules_[rule_index]->methods(); + res = response(404); + res.end(); + return; + } + + CROW_LOG_DEBUG << "Matched rule '" << ((TaggedRule<>*)rules_[rule_index].get())->rule_ << "' " << (uint32_t)req.method << " / " << rules_[rule_index]->methods(); rules_[rule_index]->handle(req, res, found.second); } diff --git a/include/utility.h b/include/utility.h index b2e61f1..c910eb2 100644 --- a/include/utility.h +++ b/include/utility.h @@ -67,7 +67,9 @@ namespace crow constexpr bool is_equ_p(const char* a, const char* b, unsigned n) { return - *a == 0 || *b == 0 + *a == 0 && *b == 0 && n == 0 + ? true : + (*a == 0 || *b == 0) ? false : n == 0 ? true : |