1 #pragma once 2 3 #include <boost/beast/http/verb.hpp> 4 5 #include <optional> 6 #include <string_view> 7 8 enum class HttpVerb 9 { 10 Delete = 0, 11 Get, 12 Head, 13 Options, 14 Patch, 15 Post, 16 Put, 17 Max, 18 }; 19 20 static constexpr size_t maxVerbIndex = static_cast<size_t>(HttpVerb::Max) - 1U; 21 22 // MaxVerb + 1 is designated as the "not found" verb. It is done this way 23 // to keep the BaseRule as a single bitfield (thus keeping the struct small) 24 // while still having a way to declare a route a "not found" route. 25 static constexpr const size_t notFoundIndex = maxVerbIndex + 1; 26 static constexpr const size_t methodNotAllowedIndex = notFoundIndex + 1; 27 28 inline std::optional<HttpVerb> httpVerbFromBoost(boost::beast::http::verb bv) 29 { 30 switch (bv) 31 { 32 case boost::beast::http::verb::delete_: 33 return HttpVerb::Delete; 34 case boost::beast::http::verb::get: 35 return HttpVerb::Get; 36 case boost::beast::http::verb::head: 37 return HttpVerb::Head; 38 case boost::beast::http::verb::options: 39 return HttpVerb::Options; 40 case boost::beast::http::verb::patch: 41 return HttpVerb::Patch; 42 case boost::beast::http::verb::post: 43 return HttpVerb::Post; 44 case boost::beast::http::verb::put: 45 return HttpVerb::Put; 46 default: 47 return std::nullopt; 48 } 49 } 50 51 inline std::string_view httpVerbToString(HttpVerb verb) 52 { 53 switch (verb) 54 { 55 case HttpVerb::Delete: 56 return "DELETE"; 57 case HttpVerb::Get: 58 return "GET"; 59 case HttpVerb::Head: 60 return "HEAD"; 61 case HttpVerb::Patch: 62 return "PATCH"; 63 case HttpVerb::Post: 64 return "POST"; 65 case HttpVerb::Put: 66 return "PUT"; 67 case HttpVerb::Options: 68 return "OPTIONS"; 69 default: 70 return ""; 71 } 72 73 // Should never reach here 74 return ""; 75 } 76