//
// Copyright (c) 2021 Vinnie Falco ([email protected])
//
// Distributed under the Boost Software License, Version 1.0. (See accompanying
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
//
// Official repository: https://github.com/cppalliance/http
//
#include
#include
#include
#include
namespace boost {
namespace http {
core::string_view
to_string(method v)
{
using namespace detail::string_literals;
switch(v)
{
case method::delete_: return "DELETE"_sv;
case method::get: return "GET"_sv;
case method::head: return "HEAD"_sv;
case method::post: return "POST"_sv;
case method::put: return "PUT"_sv;
case method::connect: return "CONNECT"_sv;
case method::options: return "OPTIONS"_sv;
case method::trace: return "TRACE"_sv;
case method::copy: return "COPY"_sv;
case method::lock: return "LOCK"_sv;
case method::mkcol: return "MKCOL"_sv;
case method::move: return "MOVE"_sv;
case method::propfind: return "PROPFIND"_sv;
case method::proppatch: return "PROPPATCH"_sv;
case method::search: return "SEARCH"_sv;
case method::unlock: return "UNLOCK"_sv;
case method::bind: return "BIND"_sv;
case method::rebind: return "REBIND"_sv;
case method::unbind: return "UNBIND"_sv;
case method::acl: return "ACL"_sv;
case method::report: return "REPORT"_sv;
case method::mkactivity: return "MKACTIVITY"_sv;
case method::checkout: return "CHECKOUT"_sv;
case method::merge: return "MERGE"_sv;
case method::msearch: return "M-SEARCH"_sv;
case method::notify: return "NOTIFY"_sv;
case method::subscribe: return "SUBSCRIBE"_sv;
case method::unsubscribe: return "UNSUBSCRIBE"_sv;
case method::patch: return "PATCH"_sv;
case method::purge: return "PURGE"_sv;
case method::mkcalendar: return "MKCALENDAR"_sv;
case method::link: return "LINK"_sv;
case method::unlink: return "UNLINK"_sv;
case method::unknown:
return ""_sv;
}
BOOST_THROW_EXCEPTION(
std::invalid_argument("unknown method"));
}
method
string_to_method(
core::string_view v)
{
/*
ACL
BIND
CHECKOUT
CONNECT
COPY
DELETE
GET
HEAD
LINK
LOCK
M-SEARCH
MERGE
MKACTIVITY
MKCALENDAR
MKCOL
MOVE
NOTIFY
OPTIONS
PATCH
POST
PROPFIND
PROPPATCH
PURGE
PUT
REBIND
REPORT
SEARCH
SUBSCRIBE
TRACE
UNBIND
UNLINK
UNLOCK
UNSUBSCRIBE
*/
using namespace detail::string_literals;
if(v.size() < 3)
return method::unknown;
auto c = v[0];
v.remove_prefix(1);
switch(c)
{
case 'A':
if(v == "CL"_sv)
return method::acl;
break;
case 'B':
if(v == "IND"_sv)
return method::bind;
break;
case 'C':
c = v[0];
v.remove_prefix(1);
switch(c)
{
case 'H':
if(v == "ECKOUT"_sv)
return method::checkout;
break;
case 'O':
if(v == "NNECT"_sv)
return method::connect;
if(v == "PY"_sv)
return method::copy;
BOOST_FALLTHROUGH;
default:
break;
}
break;
case 'D':
if(v == "ELETE"_sv)
return method::delete_;
break;
case 'G':
if(v == "ET"_sv)
return method::get;
break;
case 'H':
if(v == "EAD"_sv)
return method::head;
break;
case 'L':
if(v == "INK"_sv)
return method::link;
if(v == "OCK"_sv)
return method::lock;
break;
case 'M':
c = v[0];
v.remove_prefix(1);
switch(c)
{
case '-':
if(v == "SEARCH"_sv)
return method::msearch;
break;
case 'E':
if(v == "RGE"_sv)
return method::merge;
break;
case 'K':
if(v == "ACTIVITY"_sv)
return method::mkactivity;
if(v[0] == 'C')
{
v.remove_prefix(1);
if(v == "ALENDAR"_sv)
return method::mkcalendar;
if(v == "OL"_sv)
return method::mkcol;
break;
}
break;
case 'O':
if(v == "VE"_sv)
return method::move;
BOOST_FALLTHROUGH;
default:
break;
}
break;
case 'N':
if(v == "OTIFY"_sv)
return method::notify;
break;
case 'O':
if(v == "PTIONS"_sv)
return method::options;
break;
case 'P':
c = v[0];
v.remove_prefix(1);
switch(c)
{
case 'A':
if(v == "TCH"_sv)
return method::patch;
break;
case 'O':
if(v == "ST"_sv)
return method::post;
break;
case 'R':
if(v == "OPFIND"_sv)
return method::propfind;
if(v == "OPPATCH"_sv)
return method::proppatch;
break;
case 'U':
if(v == "RGE"_sv)
return method::purge;
if(v == "T"_sv)
return method::put;
BOOST_FALLTHROUGH;
default:
break;
}
break;
case 'R':
if(v[0] != 'E')
break;
v.remove_prefix(1);
if(v == "BIND"_sv)
return method::rebind;
if(v == "PORT"_sv)
return method::report;
break;
case 'S':
if(v == "EARCH"_sv)
return method::search;
if(v == "UBSCRIBE"_sv)
return method::subscribe;
break;
case 'T':
if(v == "RACE"_sv)
return method::trace;
break;
case 'U':
if(v[0] != 'N')
break;
v.remove_prefix(1);
if(v == "BIND"_sv)
return method::unbind;
if(v == "LINK"_sv)
return method::unlink;
if(v == "LOCK"_sv)
return method::unlock;
if(v == "SUBSCRIBE"_sv)
return method::unsubscribe;
break;
default:
break;
}
return method::unknown;
}
std::ostream&
operator<<(
std::ostream& os,
method v)
{
os << to_string(v);
return os;
}
} // http
} // boost