Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2025-12-16 09:44:01

0001 //
0002 // Copyright (c) 2016-2019 Vinnie Falco (vinnie dot falco at gmail dot com)
0003 //
0004 // Distributed under the Boost Software License, Version 1.0. (See accompanying
0005 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
0006 //
0007 // Official repository: https://github.com/boostorg/beast
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     ACL
0079     BIND
0080     CHECKOUT
0081     CONNECT
0082     COPY
0083     DELETE
0084     GET
0085     HEAD
0086     LINK
0087     LOCK
0088     M-SEARCH
0089     MERGE
0090     MKACTIVITY
0091     MKCALENDAR
0092     MKCOL
0093     MOVE
0094     NOTIFY
0095     OPTIONS
0096     PATCH
0097     POST
0098     PROPFIND
0099     PROPPATCH
0100     PURGE
0101     PUT
0102     REBIND
0103     REPORT
0104     SEARCH
0105     SUBSCRIBE
0106     TRACE
0107     UNBIND
0108     UNLINK
0109     UNLOCK
0110     UNSUBSCRIBE
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 } // http
0300 } // beast
0301 } // boost
0302 
0303 #endif