LCOV - code coverage report
Current view: top level - libs/http_proto/src/method.cpp (source / functions) Coverage Total Hit
Test: coverage_filtered.info Lines: 98.3 % 181 178
Test Date: 2024-07-08 21:32:34 Functions: 100.0 % 2 2

            Line data    Source code
       1              : //
       2              : // Copyright (c) 2021 Vinnie Falco (vinnie.falco@gmail.com)
       3              : //
       4              : // Distributed under the Boost Software License, Version 1.0. (See accompanying
       5              : // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
       6              : //
       7              : // Official repository: https://github.com/cppalliance/http_proto
       8              : //
       9              : 
      10              : #include <boost/http_proto/method.hpp>
      11              : #include <boost/http_proto/detail/sv.hpp>
      12              : #include <boost/throw_exception.hpp>
      13              : #include <ostream>
      14              : #include <stdexcept>
      15              : 
      16              : namespace boost {
      17              : namespace http_proto {
      18              : 
      19              : core::string_view
      20           92 : to_string(method v)
      21              : {
      22              :     using namespace detail::string_literals;
      23           92 :     switch(v)
      24              :     {
      25            3 :     case method::delete_:       return "DELETE"_sv;
      26           55 :     case method::get:           return "GET"_sv;
      27            1 :     case method::head:          return "HEAD"_sv;
      28            1 :     case method::post:          return "POST"_sv;
      29            1 :     case method::put:           return "PUT"_sv;
      30            2 :     case method::connect:       return "CONNECT"_sv;
      31            1 :     case method::options:       return "OPTIONS"_sv;
      32            1 :     case method::trace:         return "TRACE"_sv;
      33              : 
      34            1 :     case method::copy:          return "COPY"_sv;
      35            1 :     case method::lock:          return "LOCK"_sv;
      36            1 :     case method::mkcol:         return "MKCOL"_sv;
      37            1 :     case method::move:          return "MOVE"_sv;
      38            1 :     case method::propfind:      return "PROPFIND"_sv;
      39            1 :     case method::proppatch:     return "PROPPATCH"_sv;
      40            1 :     case method::search:        return "SEARCH"_sv;
      41            1 :     case method::unlock:        return "UNLOCK"_sv;
      42            1 :     case method::bind:          return "BIND"_sv;
      43            1 :     case method::rebind:        return "REBIND"_sv;
      44            1 :     case method::unbind:        return "UNBIND"_sv;
      45            1 :     case method::acl:           return "ACL"_sv;
      46              : 
      47            1 :     case method::report:        return "REPORT"_sv;
      48            1 :     case method::mkactivity:    return "MKACTIVITY"_sv;
      49            1 :     case method::checkout:      return "CHECKOUT"_sv;
      50            1 :     case method::merge:         return "MERGE"_sv;
      51              : 
      52            1 :     case method::msearch:       return "M-SEARCH"_sv;
      53            1 :     case method::notify:        return "NOTIFY"_sv;
      54            1 :     case method::subscribe:     return "SUBSCRIBE"_sv;
      55            1 :     case method::unsubscribe:   return "UNSUBSCRIBE"_sv;
      56              : 
      57            1 :     case method::patch:         return "PATCH"_sv;
      58            1 :     case method::purge:         return "PURGE"_sv;
      59              : 
      60            1 :     case method::mkcalendar:    return "MKCALENDAR"_sv;
      61              : 
      62            1 :     case method::link:          return "LINK"_sv;
      63            1 :     case method::unlink:        return "UNLINK"_sv;
      64              : 
      65            1 :     case method::unknown:
      66            1 :         return "<unknown>"_sv;
      67              :     }
      68              : 
      69            2 :     BOOST_THROW_EXCEPTION(
      70              :         std::invalid_argument("unknown method"));
      71              : }
      72              : 
      73              : method
      74         1620 : string_to_method(
      75              :     core::string_view v)
      76              : {
      77              : /*
      78              :     ACL
      79              :     BIND
      80              :     CHECKOUT
      81              :     CONNECT
      82              :     COPY
      83              :     DELETE
      84              :     GET
      85              :     HEAD
      86              :     LINK
      87              :     LOCK
      88              :     M-SEARCH
      89              :     MERGE
      90              :     MKACTIVITY
      91              :     MKCALENDAR
      92              :     MKCOL
      93              :     MOVE
      94              :     NOTIFY
      95              :     OPTIONS
      96              :     PATCH
      97              :     POST
      98              :     PROPFIND
      99              :     PROPPATCH
     100              :     PURGE
     101              :     PUT
     102              :     REBIND
     103              :     REPORT
     104              :     SEARCH
     105              :     SUBSCRIBE
     106              :     TRACE
     107              :     UNBIND
     108              :     UNLINK
     109              :     UNLOCK
     110              :     UNSUBSCRIBE
     111              : */
     112              :     using namespace detail::string_literals;
     113         1620 :     if(v.size() < 3)
     114            0 :         return method::unknown;
     115         1620 :     auto c = v[0];
     116         1620 :     v.remove_prefix(1);
     117         1620 :     switch(c)
     118              :     {
     119            2 :     case 'A':
     120            2 :         if(v == "CL"_sv)
     121            1 :             return method::acl;
     122            1 :         break;
     123              : 
     124            2 :     case 'B':
     125            2 :         if(v == "IND"_sv)
     126            1 :             return method::bind;
     127            1 :         break;
     128              : 
     129            7 :     case 'C':
     130            7 :         c = v[0];
     131            7 :         v.remove_prefix(1);
     132            7 :         switch(c)
     133              :         {
     134            2 :         case 'H':
     135            2 :             if(v == "ECKOUT"_sv)
     136            1 :                 return method::checkout;
     137            1 :             break;
     138              : 
     139            5 :         case 'O':
     140            5 :             if(v == "NNECT"_sv)
     141            2 :                 return method::connect;
     142            3 :             if(v == "PY"_sv)
     143            1 :                 return method::copy;
     144              :             BOOST_FALLTHROUGH;
     145              : 
     146              :         default:
     147            2 :             break;
     148              :         }
     149            3 :         break;
     150              : 
     151            5 :     case 'D':
     152            5 :         if(v == "ELETE"_sv)
     153            4 :             return method::delete_;
     154            1 :         break;
     155              : 
     156         1498 :     case 'G':
     157         1498 :         if(v == "ET"_sv)
     158         1497 :             return method::get;
     159            1 :         break;
     160              : 
     161            2 :     case 'H':
     162            2 :         if(v == "EAD"_sv)
     163            1 :             return method::head;
     164            1 :         break;
     165              : 
     166            4 :     case 'L':
     167            4 :         if(v == "INK"_sv)
     168            1 :             return method::link;
     169            3 :         if(v == "OCK"_sv)
     170            1 :             return method::lock;
     171            2 :         break;
     172              : 
     173           12 :     case 'M':
     174           12 :         c = v[0];
     175           12 :         v.remove_prefix(1);
     176           12 :         switch(c)
     177              :         {
     178            2 :         case '-':
     179            2 :             if(v == "SEARCH"_sv)
     180            1 :                 return method::msearch;
     181            1 :             break;
     182              : 
     183            2 :         case 'E':
     184            2 :             if(v == "RGE"_sv)
     185            1 :                 return method::merge;
     186            1 :             break;
     187              : 
     188            6 :         case 'K':
     189            6 :             if(v == "ACTIVITY"_sv)
     190            1 :                 return method::mkactivity;
     191            5 :             if(v[0] == 'C')
     192              :             {
     193            4 :                 v.remove_prefix(1);
     194            4 :                 if(v == "ALENDAR"_sv)
     195            1 :                     return method::mkcalendar;
     196            3 :                 if(v == "OL"_sv)
     197            1 :                     return method::mkcol;
     198            2 :                 break;
     199              :             }
     200            1 :             break;
     201              : 
     202            2 :         case 'O':
     203            2 :             if(v == "VE"_sv)
     204            1 :                 return method::move;
     205              :             BOOST_FALLTHROUGH;
     206              : 
     207              :         default:
     208            1 :             break;
     209              :         }
     210            6 :         break;
     211              : 
     212            2 :     case 'N':
     213            2 :         if(v == "OTIFY"_sv)
     214            1 :             return method::notify;
     215            1 :         break;
     216              : 
     217            2 :     case 'O':
     218            2 :         if(v == "PTIONS"_sv)
     219            1 :             return method::options;
     220            1 :         break;
     221              : 
     222           59 :     case 'P':
     223           59 :         c = v[0];
     224           59 :         v.remove_prefix(1);
     225           59 :         switch(c)
     226              :         {
     227            2 :         case 'A':
     228            2 :             if(v == "TCH"_sv)
     229            1 :                 return method::patch;
     230            1 :             break;
     231              : 
     232           47 :         case 'O':
     233           47 :             if(v == "ST"_sv)
     234           46 :                 return method::post;
     235            1 :             break;
     236              : 
     237            4 :         case 'R':
     238            4 :             if(v == "OPFIND"_sv)
     239            1 :                 return method::propfind;
     240            3 :             if(v == "OPPATCH"_sv)
     241            1 :                 return method::proppatch;
     242            2 :             break;
     243              : 
     244            6 :         case 'U':
     245            6 :             if(v == "RGE"_sv)
     246            1 :                 return method::purge;
     247            5 :             if(v == "T"_sv)
     248            3 :                 return method::put;
     249              :             BOOST_FALLTHROUGH;
     250              : 
     251              :         default:
     252            2 :             break;
     253              :         }
     254            6 :         break;
     255              : 
     256            4 :     case 'R':
     257            4 :         if(v[0] != 'E')
     258            0 :             break;
     259            4 :         v.remove_prefix(1);
     260            4 :         if(v == "BIND"_sv)
     261            1 :             return method::rebind;
     262            3 :         if(v == "PORT"_sv)
     263            1 :             return method::report;
     264            2 :         break;
     265              : 
     266           10 :     case 'S':
     267           10 :         if(v == "EARCH"_sv)
     268            1 :             return method::search;
     269            9 :         if(v == "UBSCRIBE"_sv)
     270            1 :             return method::subscribe;
     271            8 :         break;
     272              : 
     273            2 :     case 'T':
     274            2 :         if(v == "RACE"_sv)
     275            1 :             return method::trace;
     276            1 :         break;
     277              : 
     278            8 :     case 'U':
     279            8 :         if(v[0] != 'N')
     280            0 :             break;
     281            8 :         v.remove_prefix(1);
     282            8 :         if(v == "BIND"_sv)
     283            1 :             return method::unbind;
     284            7 :         if(v == "LINK"_sv)
     285            1 :             return method::unlink;
     286            6 :         if(v == "LOCK"_sv)
     287            1 :             return method::unlock;
     288            5 :         if(v == "SUBSCRIBE"_sv)
     289            1 :             return method::unsubscribe;
     290            4 :         break;
     291              : 
     292            1 :     default:
     293            1 :         break;
     294              :     }
     295              : 
     296           40 :     return method::unknown;
     297              : }
     298              : 
     299              : } // http_proto
     300              : } // boost
        

Generated by: LCOV version 2.1