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