File indexing completed on 2025-12-16 09:44:01
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010 #ifndef BOOST_BEAST_HTTP_IMPL_VERB_IPP
0011 #define BOOST_BEAST_HTTP_IMPL_VERB_IPP
0012
0013 #include <boost/beast/http/verb.hpp>
0014 #include <boost/throw_exception.hpp>
0015 #include <stdexcept>
0016
0017 namespace boost {
0018 namespace beast {
0019 namespace http {
0020
0021 string_view
0022 to_string(verb v)
0023 {
0024 using namespace beast::detail::string_literals;
0025 switch(v)
0026 {
0027 case verb::delete_: return "DELETE"_sv;
0028 case verb::get: return "GET"_sv;
0029 case verb::head: return "HEAD"_sv;
0030 case verb::post: return "POST"_sv;
0031 case verb::put: return "PUT"_sv;
0032 case verb::connect: return "CONNECT"_sv;
0033 case verb::options: return "OPTIONS"_sv;
0034 case verb::trace: return "TRACE"_sv;
0035
0036 case verb::copy: return "COPY"_sv;
0037 case verb::lock: return "LOCK"_sv;
0038 case verb::mkcol: return "MKCOL"_sv;
0039 case verb::move: return "MOVE"_sv;
0040 case verb::propfind: return "PROPFIND"_sv;
0041 case verb::proppatch: return "PROPPATCH"_sv;
0042 case verb::search: return "SEARCH"_sv;
0043 case verb::unlock: return "UNLOCK"_sv;
0044 case verb::bind: return "BIND"_sv;
0045 case verb::rebind: return "REBIND"_sv;
0046 case verb::unbind: return "UNBIND"_sv;
0047 case verb::acl: return "ACL"_sv;
0048
0049 case verb::report: return "REPORT"_sv;
0050 case verb::mkactivity: return "MKACTIVITY"_sv;
0051 case verb::checkout: return "CHECKOUT"_sv;
0052 case verb::merge: return "MERGE"_sv;
0053
0054 case verb::msearch: return "M-SEARCH"_sv;
0055 case verb::notify: return "NOTIFY"_sv;
0056 case verb::subscribe: return "SUBSCRIBE"_sv;
0057 case verb::unsubscribe: return "UNSUBSCRIBE"_sv;
0058
0059 case verb::patch: return "PATCH"_sv;
0060 case verb::purge: return "PURGE"_sv;
0061
0062 case verb::mkcalendar: return "MKCALENDAR"_sv;
0063
0064 case verb::link: return "LINK"_sv;
0065 case verb::unlink: return "UNLINK"_sv;
0066
0067 case verb::unknown:
0068 return "<unknown>"_sv;
0069 }
0070
0071 BOOST_THROW_EXCEPTION(std::invalid_argument{"unknown verb"});
0072 }
0073
0074 verb
0075 string_to_verb(string_view v)
0076 {
0077
0078
0079
0080
0081
0082
0083
0084
0085
0086
0087
0088
0089
0090
0091
0092
0093
0094
0095
0096
0097
0098
0099
0100
0101
0102
0103
0104
0105
0106
0107
0108
0109
0110
0111
0112 using namespace beast::detail::string_literals;
0113 if(v.size() < 3)
0114 return verb::unknown;
0115 auto c = v[0];
0116 v.remove_prefix(1);
0117 switch(c)
0118 {
0119 case 'A':
0120 if(v == "CL"_sv)
0121 return verb::acl;
0122 break;
0123
0124 case 'B':
0125 if(v == "IND"_sv)
0126 return verb::bind;
0127 break;
0128
0129 case 'C':
0130 c = v[0];
0131 v.remove_prefix(1);
0132 switch(c)
0133 {
0134 case 'H':
0135 if(v == "ECKOUT"_sv)
0136 return verb::checkout;
0137 break;
0138
0139 case 'O':
0140 if(v == "NNECT"_sv)
0141 return verb::connect;
0142 if(v == "PY"_sv)
0143 return verb::copy;
0144 BOOST_FALLTHROUGH;
0145
0146 default:
0147 break;
0148 }
0149 break;
0150
0151 case 'D':
0152 if(v == "ELETE"_sv)
0153 return verb::delete_;
0154 break;
0155
0156 case 'G':
0157 if(v == "ET"_sv)
0158 return verb::get;
0159 break;
0160
0161 case 'H':
0162 if(v == "EAD"_sv)
0163 return verb::head;
0164 break;
0165
0166 case 'L':
0167 if(v == "INK"_sv)
0168 return verb::link;
0169 if(v == "OCK"_sv)
0170 return verb::lock;
0171 break;
0172
0173 case 'M':
0174 c = v[0];
0175 v.remove_prefix(1);
0176 switch(c)
0177 {
0178 case '-':
0179 if(v == "SEARCH"_sv)
0180 return verb::msearch;
0181 break;
0182
0183 case 'E':
0184 if(v == "RGE"_sv)
0185 return verb::merge;
0186 break;
0187
0188 case 'K':
0189 if(v == "ACTIVITY"_sv)
0190 return verb::mkactivity;
0191 if(v[0] == 'C')
0192 {
0193 v.remove_prefix(1);
0194 if(v == "ALENDAR"_sv)
0195 return verb::mkcalendar;
0196 if(v == "OL"_sv)
0197 return verb::mkcol;
0198 break;
0199 }
0200 break;
0201
0202 case 'O':
0203 if(v == "VE"_sv)
0204 return verb::move;
0205 BOOST_FALLTHROUGH;
0206
0207 default:
0208 break;
0209 }
0210 break;
0211
0212 case 'N':
0213 if(v == "OTIFY"_sv)
0214 return verb::notify;
0215 break;
0216
0217 case 'O':
0218 if(v == "PTIONS"_sv)
0219 return verb::options;
0220 break;
0221
0222 case 'P':
0223 c = v[0];
0224 v.remove_prefix(1);
0225 switch(c)
0226 {
0227 case 'A':
0228 if(v == "TCH"_sv)
0229 return verb::patch;
0230 break;
0231
0232 case 'O':
0233 if(v == "ST"_sv)
0234 return verb::post;
0235 break;
0236
0237 case 'R':
0238 if(v == "OPFIND"_sv)
0239 return verb::propfind;
0240 if(v == "OPPATCH"_sv)
0241 return verb::proppatch;
0242 break;
0243
0244 case 'U':
0245 if(v == "RGE"_sv)
0246 return verb::purge;
0247 if(v == "T"_sv)
0248 return verb::put;
0249 BOOST_FALLTHROUGH;
0250
0251 default:
0252 break;
0253 }
0254 break;
0255
0256 case 'R':
0257 if(v[0] != 'E')
0258 break;
0259 v.remove_prefix(1);
0260 if(v == "BIND"_sv)
0261 return verb::rebind;
0262 if(v == "PORT"_sv)
0263 return verb::report;
0264 break;
0265
0266 case 'S':
0267 if(v == "EARCH"_sv)
0268 return verb::search;
0269 if(v == "UBSCRIBE"_sv)
0270 return verb::subscribe;
0271 break;
0272
0273 case 'T':
0274 if(v == "RACE"_sv)
0275 return verb::trace;
0276 break;
0277
0278 case 'U':
0279 if(v[0] != 'N')
0280 break;
0281 v.remove_prefix(1);
0282 if(v == "BIND"_sv)
0283 return verb::unbind;
0284 if(v == "LINK"_sv)
0285 return verb::unlink;
0286 if(v == "LOCK"_sv)
0287 return verb::unlock;
0288 if(v == "SUBSCRIBE"_sv)
0289 return verb::unsubscribe;
0290 break;
0291
0292 default:
0293 break;
0294 }
0295
0296 return verb::unknown;
0297 }
0298
0299 }
0300 }
0301 }
0302
0303 #endif