mirror of
https://github.com/boostorg/beast.git
synced 2025-07-31 13:27:33 +02:00
More split compilation in HTTP
close #1541 - Remove unused private functions: `skip_ows_rev`, `skip_obs_fold`. - Enable split compilation in `http/detail/rfc7230.hpp`. - More split compilation in `basic_parser`. - Remove some unnecessary includes. Signed-off-by: Damian Jarek <damian.jarek93@gmail.com>
This commit is contained in:
committed by
Vinnie Falco
parent
b95bd46b49
commit
5a0b4d7ebe
@@ -1,3 +1,9 @@
|
|||||||
|
Version 239:
|
||||||
|
|
||||||
|
* More split compilation in HTTP
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
Version 238:
|
Version 238:
|
||||||
|
|
||||||
* Refactor Jamfiles to work with release layout
|
* Refactor Jamfiles to work with release layout
|
||||||
|
@@ -12,14 +12,11 @@
|
|||||||
|
|
||||||
#include <boost/beast/core/static_string.hpp>
|
#include <boost/beast/core/static_string.hpp>
|
||||||
#include <boost/beast/core/string.hpp>
|
#include <boost/beast/core/string.hpp>
|
||||||
#include <boost/beast/core/detail/cpu_info.hpp>
|
|
||||||
#include <boost/beast/http/error.hpp>
|
#include <boost/beast/http/error.hpp>
|
||||||
#include <boost/beast/http/detail/rfc7230.hpp>
|
#include <boost/beast/http/detail/rfc7230.hpp>
|
||||||
#include <boost/config.hpp>
|
#include <boost/config.hpp>
|
||||||
#include <boost/version.hpp>
|
#include <boost/version.hpp>
|
||||||
#include <algorithm>
|
|
||||||
#include <cstddef>
|
#include <cstddef>
|
||||||
#include <limits>
|
|
||||||
#include <utility>
|
#include <utility>
|
||||||
|
|
||||||
namespace boost {
|
namespace boost {
|
||||||
@@ -35,12 +32,6 @@ struct basic_parser_base
|
|||||||
//
|
//
|
||||||
static std::size_t constexpr max_obs_fold = 4096;
|
static std::size_t constexpr max_obs_fold = 4096;
|
||||||
|
|
||||||
template<class T>
|
|
||||||
struct is_unsigned_integer:
|
|
||||||
std::integral_constant<bool,
|
|
||||||
std::numeric_limits<T>::is_integer &&
|
|
||||||
! std::numeric_limits<T>::is_signed> {};
|
|
||||||
|
|
||||||
enum class state
|
enum class state
|
||||||
{
|
{
|
||||||
nothing_yet = 0,
|
nothing_yet = 0,
|
||||||
@@ -70,35 +61,16 @@ struct basic_parser_base
|
|||||||
return static_cast<unsigned char>(c-32) < 95;
|
return static_cast<unsigned char>(c-32) < 95;
|
||||||
}
|
}
|
||||||
|
|
||||||
template<class FwdIt>
|
BOOST_BEAST_DECL
|
||||||
static
|
static
|
||||||
FwdIt
|
char const*
|
||||||
trim_front(FwdIt it, FwdIt const& end)
|
trim_front(char const* it, char const* end);
|
||||||
{
|
|
||||||
while(it != end)
|
|
||||||
{
|
|
||||||
if(*it != ' ' && *it != '\t')
|
|
||||||
break;
|
|
||||||
++it;
|
|
||||||
}
|
|
||||||
return it;
|
|
||||||
}
|
|
||||||
|
|
||||||
template<class RanIt>
|
BOOST_BEAST_DECL
|
||||||
static
|
static
|
||||||
RanIt
|
char const*
|
||||||
trim_back(
|
trim_back(
|
||||||
RanIt it, RanIt const& first)
|
char const* it, char const* first);
|
||||||
{
|
|
||||||
while(it != first)
|
|
||||||
{
|
|
||||||
auto const c = it[-1];
|
|
||||||
if(c != ' ' && c != '\t')
|
|
||||||
break;
|
|
||||||
--it;
|
|
||||||
}
|
|
||||||
return it;
|
|
||||||
}
|
|
||||||
|
|
||||||
static
|
static
|
||||||
string_view
|
string_view
|
||||||
@@ -152,52 +124,15 @@ struct basic_parser_base
|
|||||||
char const*& token_last,
|
char const*& token_last,
|
||||||
error_code& ec);
|
error_code& ec);
|
||||||
|
|
||||||
template<class Iter, class T>
|
BOOST_BEAST_DECL
|
||||||
static
|
static
|
||||||
typename std::enable_if<is_unsigned_integer<T>::value, bool>::type
|
bool
|
||||||
parse_dec(Iter it, Iter last, T& v)
|
parse_dec(char const* it, char const* last, std::uint64_t& v);
|
||||||
{
|
|
||||||
if(it == last)
|
|
||||||
return false;
|
|
||||||
T tmp = 0;
|
|
||||||
do
|
|
||||||
{
|
|
||||||
if((! is_digit(*it)) ||
|
|
||||||
tmp > (std::numeric_limits<T>::max)() / 10)
|
|
||||||
return false;
|
|
||||||
tmp *= 10;
|
|
||||||
T const d = *it - '0';
|
|
||||||
if((std::numeric_limits<T>::max)() - tmp < d)
|
|
||||||
return false;
|
|
||||||
tmp += d;
|
|
||||||
}
|
|
||||||
while(++it != last);
|
|
||||||
v = tmp;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
template<class Iter, class T>
|
BOOST_BEAST_DECL
|
||||||
static
|
static
|
||||||
typename std::enable_if<is_unsigned_integer<T>::value, bool>::type
|
bool
|
||||||
parse_hex(Iter& it, T& v)
|
parse_hex(char const*& it, std::uint64_t& v);
|
||||||
{
|
|
||||||
unsigned char d;
|
|
||||||
if(! unhex(d, *it))
|
|
||||||
return false;
|
|
||||||
T tmp = 0;
|
|
||||||
do
|
|
||||||
{
|
|
||||||
if(tmp > (std::numeric_limits<T>::max)() / 16)
|
|
||||||
return false;
|
|
||||||
tmp *= 16;
|
|
||||||
if((std::numeric_limits<T>::max)() - tmp < d)
|
|
||||||
return false;
|
|
||||||
tmp += d;
|
|
||||||
}
|
|
||||||
while(unhex(d, *++it));
|
|
||||||
v = tmp;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
BOOST_BEAST_DECL
|
BOOST_BEAST_DECL
|
||||||
static
|
static
|
||||||
|
@@ -11,12 +11,41 @@
|
|||||||
#define BOOST_BEAST_HTTP_DETAIL_BASIC_PARSER_IPP
|
#define BOOST_BEAST_HTTP_DETAIL_BASIC_PARSER_IPP
|
||||||
|
|
||||||
#include <boost/beast/http/detail/basic_parser.hpp>
|
#include <boost/beast/http/detail/basic_parser.hpp>
|
||||||
|
#include <limits>
|
||||||
|
|
||||||
namespace boost {
|
namespace boost {
|
||||||
namespace beast {
|
namespace beast {
|
||||||
namespace http {
|
namespace http {
|
||||||
namespace detail {
|
namespace detail {
|
||||||
|
|
||||||
|
char const*
|
||||||
|
basic_parser_base::
|
||||||
|
trim_front(char const* it, char const* end)
|
||||||
|
{
|
||||||
|
while(it != end)
|
||||||
|
{
|
||||||
|
if(*it != ' ' && *it != '\t')
|
||||||
|
break;
|
||||||
|
++it;
|
||||||
|
}
|
||||||
|
return it;
|
||||||
|
}
|
||||||
|
|
||||||
|
char const*
|
||||||
|
basic_parser_base::
|
||||||
|
trim_back(
|
||||||
|
char const* it, char const* first)
|
||||||
|
{
|
||||||
|
while(it != first)
|
||||||
|
{
|
||||||
|
auto const c = it[-1];
|
||||||
|
if(c != ' ' && c != '\t')
|
||||||
|
break;
|
||||||
|
--it;
|
||||||
|
}
|
||||||
|
return it;
|
||||||
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
basic_parser_base::
|
basic_parser_base::
|
||||||
is_pathchar(char c)
|
is_pathchar(char c)
|
||||||
@@ -123,6 +152,51 @@ find_eol(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
basic_parser_base::
|
||||||
|
parse_dec(char const* it, char const* last, std::uint64_t& v)
|
||||||
|
{
|
||||||
|
if(it == last)
|
||||||
|
return false;
|
||||||
|
std::uint64_t tmp = 0;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if((! is_digit(*it)) ||
|
||||||
|
tmp > (std::numeric_limits<std::uint64_t>::max)() / 10)
|
||||||
|
return false;
|
||||||
|
tmp *= 10;
|
||||||
|
std::uint64_t const d = *it - '0';
|
||||||
|
if((std::numeric_limits<std::uint64_t>::max)() - tmp < d)
|
||||||
|
return false;
|
||||||
|
tmp += d;
|
||||||
|
}
|
||||||
|
while(++it != last);
|
||||||
|
v = tmp;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
basic_parser_base::
|
||||||
|
parse_hex(char const*& it, std::uint64_t& v)
|
||||||
|
{
|
||||||
|
unsigned char d;
|
||||||
|
if(! unhex(d, *it))
|
||||||
|
return false;
|
||||||
|
std::uint64_t tmp = 0;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if(tmp > (std::numeric_limits<std::uint64_t>::max)() / 16)
|
||||||
|
return false;
|
||||||
|
tmp *= 16;
|
||||||
|
if((std::numeric_limits<std::uint64_t>::max)() - tmp < d)
|
||||||
|
return false;
|
||||||
|
tmp += d;
|
||||||
|
}
|
||||||
|
while(unhex(d, *++it));
|
||||||
|
v = tmp;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
char const*
|
char const*
|
||||||
basic_parser_base::
|
basic_parser_base::
|
||||||
find_eom(char const* p, char const* last)
|
find_eom(char const* p, char const* last)
|
||||||
|
@@ -33,7 +33,7 @@ struct chunk_extensions_impl : chunk_extensions
|
|||||||
{
|
{
|
||||||
ChunkExtensions ext_;
|
ChunkExtensions ext_;
|
||||||
|
|
||||||
chunk_extensions_impl(ChunkExtensions&& ext)
|
chunk_extensions_impl(ChunkExtensions&& ext) noexcept
|
||||||
: ext_(std::move(ext))
|
: ext_(std::move(ext))
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
@@ -19,300 +19,54 @@ namespace beast {
|
|||||||
namespace http {
|
namespace http {
|
||||||
namespace detail {
|
namespace detail {
|
||||||
|
|
||||||
inline
|
BOOST_BEAST_DECL
|
||||||
bool
|
bool
|
||||||
is_digit(char c)
|
is_digit(char c);
|
||||||
{
|
|
||||||
return c >= '0' && c <= '9';
|
|
||||||
}
|
|
||||||
|
|
||||||
inline
|
BOOST_BEAST_DECL
|
||||||
char
|
char
|
||||||
is_alpha(char c)
|
is_alpha(char c);
|
||||||
{
|
|
||||||
static char constexpr tab[] = {
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 16
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 32
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 48
|
|
||||||
0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 64
|
|
||||||
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, // 80
|
|
||||||
0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 96
|
|
||||||
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, // 112
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 128
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 144
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 160
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 176
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 192
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 208
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 224
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 // 240
|
|
||||||
};
|
|
||||||
BOOST_STATIC_ASSERT(sizeof(tab) == 256);
|
|
||||||
return tab[static_cast<unsigned char>(c)];
|
|
||||||
}
|
|
||||||
|
|
||||||
inline
|
BOOST_BEAST_DECL
|
||||||
char
|
char
|
||||||
is_text(char c)
|
is_text(char c);
|
||||||
{
|
|
||||||
// TEXT = <any OCTET except CTLs, but including LWS>
|
|
||||||
static char constexpr tab[] = {
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, // 0
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 16
|
|
||||||
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 32
|
|
||||||
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 48
|
|
||||||
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 64
|
|
||||||
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 80
|
|
||||||
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 96
|
|
||||||
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, // 112
|
|
||||||
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 128
|
|
||||||
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 144
|
|
||||||
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 160
|
|
||||||
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 176
|
|
||||||
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 192
|
|
||||||
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 208
|
|
||||||
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 224
|
|
||||||
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 // 240
|
|
||||||
};
|
|
||||||
BOOST_STATIC_ASSERT(sizeof(tab) == 256);
|
|
||||||
return tab[static_cast<unsigned char>(c)];
|
|
||||||
}
|
|
||||||
|
|
||||||
inline
|
BOOST_BEAST_DECL
|
||||||
char
|
char
|
||||||
is_token_char(char c)
|
is_token_char(char c);
|
||||||
{
|
|
||||||
/*
|
|
||||||
tchar = "!" | "#" | "$" | "%" | "&" |
|
|
||||||
"'" | "*" | "+" | "-" | "." |
|
|
||||||
"^" | "_" | "`" | "|" | "~" |
|
|
||||||
DIGIT | ALPHA
|
|
||||||
*/
|
|
||||||
static char constexpr tab[] = {
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 16
|
|
||||||
0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, // 32
|
|
||||||
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, // 48
|
|
||||||
0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 64
|
|
||||||
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, // 80
|
|
||||||
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 96
|
|
||||||
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, // 112
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 128
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 144
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 160
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 176
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 192
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 208
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 224
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 // 240
|
|
||||||
};
|
|
||||||
BOOST_STATIC_ASSERT(sizeof(tab) == 256);
|
|
||||||
return tab[static_cast<unsigned char>(c)];
|
|
||||||
}
|
|
||||||
|
|
||||||
inline
|
BOOST_BEAST_DECL
|
||||||
char
|
char
|
||||||
is_qdchar(char c)
|
is_qdchar(char c);
|
||||||
{
|
|
||||||
/*
|
|
||||||
qdtext = HTAB / SP / "!" / %x23-5B ; '#'-'[' / %x5D-7E ; ']'-'~' / obs-text
|
|
||||||
*/
|
|
||||||
static char constexpr tab[] = {
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, // 0
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 16
|
|
||||||
1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 32
|
|
||||||
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 48
|
|
||||||
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 64
|
|
||||||
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, // 80
|
|
||||||
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 96
|
|
||||||
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, // 112
|
|
||||||
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 128
|
|
||||||
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 144
|
|
||||||
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 160
|
|
||||||
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 176
|
|
||||||
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 192
|
|
||||||
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 208
|
|
||||||
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 224
|
|
||||||
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 // 240
|
|
||||||
};
|
|
||||||
BOOST_STATIC_ASSERT(sizeof(tab) == 256);
|
|
||||||
return tab[static_cast<unsigned char>(c)];
|
|
||||||
}
|
|
||||||
|
|
||||||
inline
|
BOOST_BEAST_DECL
|
||||||
char
|
char
|
||||||
is_qpchar(char c)
|
is_qpchar(char c);
|
||||||
{
|
|
||||||
/*
|
|
||||||
quoted-pair = "\" ( HTAB / SP / VCHAR / obs-text )
|
|
||||||
obs-text = %x80-FF
|
|
||||||
*/
|
|
||||||
static char constexpr tab[] = {
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, // 0
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 16
|
|
||||||
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 32
|
|
||||||
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 48
|
|
||||||
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 64
|
|
||||||
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 80
|
|
||||||
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 96
|
|
||||||
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, // 112
|
|
||||||
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 128
|
|
||||||
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 144
|
|
||||||
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 160
|
|
||||||
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 176
|
|
||||||
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 192
|
|
||||||
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 208
|
|
||||||
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 224
|
|
||||||
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 // 240
|
|
||||||
};
|
|
||||||
BOOST_STATIC_ASSERT(sizeof(tab) == 256);
|
|
||||||
return tab[static_cast<unsigned char>(c)];
|
|
||||||
}
|
|
||||||
|
|
||||||
// converts to lower case,
|
// converts to lower case,
|
||||||
// returns 0 if not a valid text char
|
// returns 0 if not a valid text char
|
||||||
//
|
//
|
||||||
inline
|
BOOST_BEAST_DECL
|
||||||
char
|
char
|
||||||
to_value_char(char c)
|
to_value_char(char c);
|
||||||
{
|
|
||||||
// TEXT = <any OCTET except CTLs, but including LWS>
|
|
||||||
static unsigned char constexpr tab[] = {
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, // 0
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 16
|
|
||||||
32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, // 32
|
|
||||||
48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, // 48
|
|
||||||
64, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, // 64
|
|
||||||
112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 91, 92, 93, 94, 95, // 80
|
|
||||||
96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, // 96
|
|
||||||
112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 0, // 112
|
|
||||||
128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, // 128
|
|
||||||
144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, // 144
|
|
||||||
160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, // 160
|
|
||||||
176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, // 176
|
|
||||||
192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, // 192
|
|
||||||
208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, // 208
|
|
||||||
224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, // 224
|
|
||||||
240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255 // 240
|
|
||||||
};
|
|
||||||
BOOST_STATIC_ASSERT(sizeof(tab) == 256);
|
|
||||||
return static_cast<char>(tab[static_cast<unsigned char>(c)]);
|
|
||||||
}
|
|
||||||
|
|
||||||
// VFALCO TODO Make this return unsigned?
|
// VFALCO TODO Make this return unsigned?
|
||||||
inline
|
BOOST_BEAST_DECL
|
||||||
std::int8_t
|
std::int8_t
|
||||||
unhex(char c)
|
unhex(char c);
|
||||||
{
|
|
||||||
static signed char constexpr tab[] = {
|
|
||||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 0
|
|
||||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 16
|
|
||||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 32
|
|
||||||
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1, -1, -1, -1, -1, -1, // 48
|
|
||||||
-1, 10, 11, 12, 13, 14, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 64
|
|
||||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 80
|
|
||||||
-1, 10, 11, 12, 13, 14, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 96
|
|
||||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 112
|
|
||||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 128
|
|
||||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 144
|
|
||||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 160
|
|
||||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 176
|
|
||||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 192
|
|
||||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 208
|
|
||||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 224
|
|
||||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 // 240
|
|
||||||
};
|
|
||||||
BOOST_STATIC_ASSERT(sizeof(tab) == 256);
|
|
||||||
return tab[static_cast<unsigned char>(c)];
|
|
||||||
}
|
|
||||||
|
|
||||||
template<class FwdIt>
|
BOOST_BEAST_DECL
|
||||||
inline
|
|
||||||
void
|
void
|
||||||
skip_ows(FwdIt& it, FwdIt const& end)
|
skip_ows(char const*& it, char const* end);
|
||||||
{
|
|
||||||
while(it != end)
|
|
||||||
{
|
|
||||||
if(*it != ' ' && *it != '\t')
|
|
||||||
break;
|
|
||||||
++it;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
template<class RanIt>
|
BOOST_BEAST_DECL
|
||||||
inline
|
|
||||||
void
|
void
|
||||||
skip_ows_rev(
|
skip_token(char const*& it, char const* last);
|
||||||
RanIt& it, RanIt const& first)
|
|
||||||
{
|
|
||||||
while(it != first)
|
|
||||||
{
|
|
||||||
auto const c = it[-1];
|
|
||||||
if(c != ' ' && c != '\t')
|
|
||||||
break;
|
|
||||||
--it;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// obs-fold = CRLF 1*( SP / HTAB )
|
BOOST_BEAST_DECL
|
||||||
// return `false` on parse error
|
|
||||||
//
|
|
||||||
template<class FwdIt>
|
|
||||||
inline
|
|
||||||
bool
|
|
||||||
skip_obs_fold(
|
|
||||||
FwdIt& it, FwdIt const& last)
|
|
||||||
{
|
|
||||||
for(;;)
|
|
||||||
{
|
|
||||||
if(*it != '\r')
|
|
||||||
return true;
|
|
||||||
if(++it == last)
|
|
||||||
return false;
|
|
||||||
if(*it != '\n')
|
|
||||||
return false;
|
|
||||||
if(++it == last)
|
|
||||||
return false;
|
|
||||||
if(*it != ' ' && *it != '\t')
|
|
||||||
return false;
|
|
||||||
for(;;)
|
|
||||||
{
|
|
||||||
if(++it == last)
|
|
||||||
return true;
|
|
||||||
if(*it != ' ' && *it != '\t')
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
template<class FwdIt>
|
|
||||||
void
|
|
||||||
skip_token(FwdIt& it, FwdIt const& last)
|
|
||||||
{
|
|
||||||
while(it != last && is_token_char(*it))
|
|
||||||
++it;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline
|
|
||||||
string_view
|
string_view
|
||||||
trim(string_view s)
|
trim(string_view s);
|
||||||
{
|
|
||||||
auto first = s.begin();
|
|
||||||
auto last = s.end();
|
|
||||||
skip_ows(first, last);
|
|
||||||
while(first != last)
|
|
||||||
{
|
|
||||||
auto const c = *std::prev(last);
|
|
||||||
if(c != ' ' && c != '\t')
|
|
||||||
break;
|
|
||||||
--last;
|
|
||||||
}
|
|
||||||
if(first == last)
|
|
||||||
return {};
|
|
||||||
return {&*first,
|
|
||||||
static_cast<std::size_t>(last - first)};
|
|
||||||
}
|
|
||||||
|
|
||||||
struct param_iter
|
struct param_iter
|
||||||
{
|
{
|
||||||
@@ -329,94 +83,11 @@ struct param_iter
|
|||||||
return first == it;
|
return first == it;
|
||||||
}
|
}
|
||||||
|
|
||||||
template<class = void>
|
BOOST_BEAST_DECL
|
||||||
void
|
void
|
||||||
increment();
|
increment();
|
||||||
};
|
};
|
||||||
|
|
||||||
template<class>
|
|
||||||
void
|
|
||||||
param_iter::
|
|
||||||
increment()
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
param-list = *( OWS ";" OWS param )
|
|
||||||
param = token OWS [ "=" OWS ( token / quoted-string ) ]
|
|
||||||
quoted-string = DQUOTE *( qdtext / quoted-pair ) DQUOTE
|
|
||||||
qdtext = HTAB / SP / "!" / %x23-5B ; '#'-'[' / %x5D-7E ; ']'-'~' / obs-text
|
|
||||||
quoted-pair = "\" ( HTAB / SP / VCHAR / obs-text )
|
|
||||||
obs-text = %x80-FF
|
|
||||||
*/
|
|
||||||
auto const err =
|
|
||||||
[&]
|
|
||||||
{
|
|
||||||
it = first;
|
|
||||||
};
|
|
||||||
v.first = {};
|
|
||||||
v.second = {};
|
|
||||||
detail::skip_ows(it, last);
|
|
||||||
first = it;
|
|
||||||
if(it == last)
|
|
||||||
return err();
|
|
||||||
if(*it != ';')
|
|
||||||
return err();
|
|
||||||
++it;
|
|
||||||
detail::skip_ows(it, last);
|
|
||||||
if(it == last)
|
|
||||||
return err();
|
|
||||||
// param
|
|
||||||
if(! detail::is_token_char(*it))
|
|
||||||
return err();
|
|
||||||
auto const p0 = it;
|
|
||||||
skip_token(++it, last);
|
|
||||||
auto const p1 = it;
|
|
||||||
v.first = { &*p0, static_cast<std::size_t>(p1 - p0) };
|
|
||||||
detail::skip_ows(it, last);
|
|
||||||
if(it == last)
|
|
||||||
return;
|
|
||||||
if(*it == ';')
|
|
||||||
return;
|
|
||||||
if(*it != '=')
|
|
||||||
return err();
|
|
||||||
++it;
|
|
||||||
detail::skip_ows(it, last);
|
|
||||||
if(it == last)
|
|
||||||
return;
|
|
||||||
if(*it == '"')
|
|
||||||
{
|
|
||||||
// quoted-string
|
|
||||||
auto const p2 = it;
|
|
||||||
++it;
|
|
||||||
for(;;)
|
|
||||||
{
|
|
||||||
if(it == last)
|
|
||||||
return err();
|
|
||||||
auto c = *it++;
|
|
||||||
if(c == '"')
|
|
||||||
break;
|
|
||||||
if(detail::is_qdchar(c))
|
|
||||||
continue;
|
|
||||||
if(c != '\\')
|
|
||||||
return err();
|
|
||||||
if(it == last)
|
|
||||||
return err();
|
|
||||||
c = *it++;
|
|
||||||
if(! detail::is_qpchar(c))
|
|
||||||
return err();
|
|
||||||
}
|
|
||||||
v.second = { &*p2, static_cast<std::size_t>(it - p2) };
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// token
|
|
||||||
if(! detail::is_token_char(*it))
|
|
||||||
return err();
|
|
||||||
auto const p2 = it;
|
|
||||||
skip_token(++it, last);
|
|
||||||
v.second = { &*p2, static_cast<std::size_t>(it - p2) };
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
#token = [ ( "," / token ) *( OWS "," [ OWS token ] ) ]
|
#token = [ ( "," / token ) *( OWS "," [ OWS token ] ) ]
|
||||||
*/
|
*/
|
||||||
@@ -424,44 +95,10 @@ struct opt_token_list_policy
|
|||||||
{
|
{
|
||||||
using value_type = string_view;
|
using value_type = string_view;
|
||||||
|
|
||||||
|
BOOST_BEAST_DECL
|
||||||
bool
|
bool
|
||||||
operator()(value_type& v,
|
operator()(value_type& v,
|
||||||
char const*& it, string_view s) const
|
char const*& it, string_view s) const;
|
||||||
{
|
|
||||||
v = {};
|
|
||||||
auto need_comma = it != s.data();
|
|
||||||
for(;;)
|
|
||||||
{
|
|
||||||
detail::skip_ows(it, (s.data() + s.size()));
|
|
||||||
if(it == (s.data() + s.size()))
|
|
||||||
{
|
|
||||||
it = nullptr;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
auto const c = *it;
|
|
||||||
if(detail::is_token_char(c))
|
|
||||||
{
|
|
||||||
if(need_comma)
|
|
||||||
return false;
|
|
||||||
auto const p0 = it;
|
|
||||||
for(;;)
|
|
||||||
{
|
|
||||||
++it;
|
|
||||||
if(it == (s.data() + s.size()))
|
|
||||||
break;
|
|
||||||
if(! detail::is_token_char(*it))
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
v = string_view{p0,
|
|
||||||
static_cast<std::size_t>(it - p0)};
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if(c != ',')
|
|
||||||
return false;
|
|
||||||
need_comma = false;
|
|
||||||
++it;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
} // detail
|
} // detail
|
||||||
@@ -469,5 +106,9 @@ struct opt_token_list_policy
|
|||||||
} // beast
|
} // beast
|
||||||
} // boost
|
} // boost
|
||||||
|
|
||||||
|
#ifdef BOOST_BEAST_HEADER_ONLY
|
||||||
|
#include <boost/beast/http/detail/rfc7230.ipp>
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
388
include/boost/beast/http/detail/rfc7230.ipp
Normal file
388
include/boost/beast/http/detail/rfc7230.ipp
Normal file
@@ -0,0 +1,388 @@
|
|||||||
|
//
|
||||||
|
// Copyright (c) 2016-2019 Vinnie Falco (vinnie dot falco at gmail dot com)
|
||||||
|
//
|
||||||
|
// 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/boostorg/beast
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef BOOST_BEAST_HTTP_DETAIL_RFC7230_IPP
|
||||||
|
#define BOOST_BEAST_HTTP_DETAIL_RFC7230_IPP
|
||||||
|
|
||||||
|
#include <boost/beast/core/string.hpp>
|
||||||
|
#include <iterator>
|
||||||
|
#include <utility>
|
||||||
|
|
||||||
|
namespace boost {
|
||||||
|
namespace beast {
|
||||||
|
namespace http {
|
||||||
|
namespace detail {
|
||||||
|
|
||||||
|
bool
|
||||||
|
is_digit(char c)
|
||||||
|
{
|
||||||
|
return c >= '0' && c <= '9';
|
||||||
|
}
|
||||||
|
|
||||||
|
char
|
||||||
|
is_alpha(char c)
|
||||||
|
{
|
||||||
|
static char constexpr tab[] = {
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 16
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 32
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 48
|
||||||
|
0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 64
|
||||||
|
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, // 80
|
||||||
|
0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 96
|
||||||
|
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, // 112
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 128
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 144
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 160
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 176
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 192
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 208
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 224
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 // 240
|
||||||
|
};
|
||||||
|
BOOST_STATIC_ASSERT(sizeof(tab) == 256);
|
||||||
|
return tab[static_cast<unsigned char>(c)];
|
||||||
|
}
|
||||||
|
|
||||||
|
char
|
||||||
|
is_text(char c)
|
||||||
|
{
|
||||||
|
// TEXT = <any OCTET except CTLs, but including LWS>
|
||||||
|
static char constexpr tab[] = {
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, // 0
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 16
|
||||||
|
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 32
|
||||||
|
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 48
|
||||||
|
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 64
|
||||||
|
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 80
|
||||||
|
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 96
|
||||||
|
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, // 112
|
||||||
|
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 128
|
||||||
|
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 144
|
||||||
|
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 160
|
||||||
|
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 176
|
||||||
|
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 192
|
||||||
|
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 208
|
||||||
|
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 224
|
||||||
|
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 // 240
|
||||||
|
};
|
||||||
|
BOOST_STATIC_ASSERT(sizeof(tab) == 256);
|
||||||
|
return tab[static_cast<unsigned char>(c)];
|
||||||
|
}
|
||||||
|
|
||||||
|
char
|
||||||
|
is_token_char(char c)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
tchar = "!" | "#" | "$" | "%" | "&" |
|
||||||
|
"'" | "*" | "+" | "-" | "." |
|
||||||
|
"^" | "_" | "`" | "|" | "~" |
|
||||||
|
DIGIT | ALPHA
|
||||||
|
*/
|
||||||
|
static char constexpr tab[] = {
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 16
|
||||||
|
0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, // 32
|
||||||
|
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, // 48
|
||||||
|
0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 64
|
||||||
|
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, // 80
|
||||||
|
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 96
|
||||||
|
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, // 112
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 128
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 144
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 160
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 176
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 192
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 208
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 224
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 // 240
|
||||||
|
};
|
||||||
|
BOOST_STATIC_ASSERT(sizeof(tab) == 256);
|
||||||
|
return tab[static_cast<unsigned char>(c)];
|
||||||
|
}
|
||||||
|
|
||||||
|
char
|
||||||
|
is_qdchar(char c)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
qdtext = HTAB / SP / "!" / %x23-5B ; '#'-'[' / %x5D-7E ; ']'-'~' / obs-text
|
||||||
|
*/
|
||||||
|
static char constexpr tab[] = {
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, // 0
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 16
|
||||||
|
1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 32
|
||||||
|
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 48
|
||||||
|
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 64
|
||||||
|
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, // 80
|
||||||
|
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 96
|
||||||
|
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, // 112
|
||||||
|
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 128
|
||||||
|
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 144
|
||||||
|
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 160
|
||||||
|
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 176
|
||||||
|
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 192
|
||||||
|
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 208
|
||||||
|
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 224
|
||||||
|
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 // 240
|
||||||
|
};
|
||||||
|
BOOST_STATIC_ASSERT(sizeof(tab) == 256);
|
||||||
|
return tab[static_cast<unsigned char>(c)];
|
||||||
|
}
|
||||||
|
|
||||||
|
char
|
||||||
|
is_qpchar(char c)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
quoted-pair = "\" ( HTAB / SP / VCHAR / obs-text )
|
||||||
|
obs-text = %x80-FF
|
||||||
|
*/
|
||||||
|
static char constexpr tab[] = {
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, // 0
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 16
|
||||||
|
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 32
|
||||||
|
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 48
|
||||||
|
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 64
|
||||||
|
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 80
|
||||||
|
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 96
|
||||||
|
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, // 112
|
||||||
|
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 128
|
||||||
|
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 144
|
||||||
|
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 160
|
||||||
|
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 176
|
||||||
|
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 192
|
||||||
|
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 208
|
||||||
|
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 224
|
||||||
|
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 // 240
|
||||||
|
};
|
||||||
|
BOOST_STATIC_ASSERT(sizeof(tab) == 256);
|
||||||
|
return tab[static_cast<unsigned char>(c)];
|
||||||
|
}
|
||||||
|
|
||||||
|
// converts to lower case,
|
||||||
|
// returns 0 if not a valid text char
|
||||||
|
//
|
||||||
|
char
|
||||||
|
to_value_char(char c)
|
||||||
|
{
|
||||||
|
// TEXT = <any OCTET except CTLs, but including LWS>
|
||||||
|
static unsigned char constexpr tab[] = {
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, // 0
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 16
|
||||||
|
32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, // 32
|
||||||
|
48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, // 48
|
||||||
|
64, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, // 64
|
||||||
|
112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 91, 92, 93, 94, 95, // 80
|
||||||
|
96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, // 96
|
||||||
|
112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 0, // 112
|
||||||
|
128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, // 128
|
||||||
|
144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, // 144
|
||||||
|
160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, // 160
|
||||||
|
176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, // 176
|
||||||
|
192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, // 192
|
||||||
|
208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, // 208
|
||||||
|
224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, // 224
|
||||||
|
240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255 // 240
|
||||||
|
};
|
||||||
|
BOOST_STATIC_ASSERT(sizeof(tab) == 256);
|
||||||
|
return static_cast<char>(tab[static_cast<unsigned char>(c)]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// VFALCO TODO Make this return unsigned?
|
||||||
|
std::int8_t
|
||||||
|
unhex(char c)
|
||||||
|
{
|
||||||
|
static signed char constexpr tab[] = {
|
||||||
|
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 0
|
||||||
|
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 16
|
||||||
|
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 32
|
||||||
|
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1, -1, -1, -1, -1, -1, // 48
|
||||||
|
-1, 10, 11, 12, 13, 14, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 64
|
||||||
|
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 80
|
||||||
|
-1, 10, 11, 12, 13, 14, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 96
|
||||||
|
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 112
|
||||||
|
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 128
|
||||||
|
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 144
|
||||||
|
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 160
|
||||||
|
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 176
|
||||||
|
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 192
|
||||||
|
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 208
|
||||||
|
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 224
|
||||||
|
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 // 240
|
||||||
|
};
|
||||||
|
BOOST_STATIC_ASSERT(sizeof(tab) == 256);
|
||||||
|
return tab[static_cast<unsigned char>(c)];
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
skip_ows(char const*& it, char const* end)
|
||||||
|
{
|
||||||
|
while(it != end)
|
||||||
|
{
|
||||||
|
if(*it != ' ' && *it != '\t')
|
||||||
|
break;
|
||||||
|
++it;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
skip_token(char const*& it, char const* last)
|
||||||
|
{
|
||||||
|
while(it != last && is_token_char(*it))
|
||||||
|
++it;
|
||||||
|
}
|
||||||
|
|
||||||
|
string_view
|
||||||
|
trim(string_view s)
|
||||||
|
{
|
||||||
|
auto first = s.begin();
|
||||||
|
auto last = s.end();
|
||||||
|
skip_ows(first, last);
|
||||||
|
while(first != last)
|
||||||
|
{
|
||||||
|
auto const c = *std::prev(last);
|
||||||
|
if(c != ' ' && c != '\t')
|
||||||
|
break;
|
||||||
|
--last;
|
||||||
|
}
|
||||||
|
if(first == last)
|
||||||
|
return {};
|
||||||
|
return {&*first,
|
||||||
|
static_cast<std::size_t>(last - first)};
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
BOOST_BEAST_DECL
|
||||||
|
void
|
||||||
|
param_iter::
|
||||||
|
increment()
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
param-list = *( OWS ";" OWS param )
|
||||||
|
param = token OWS [ "=" OWS ( token / quoted-string ) ]
|
||||||
|
quoted-string = DQUOTE *( qdtext / quoted-pair ) DQUOTE
|
||||||
|
qdtext = HTAB / SP / "!" / %x23-5B ; '#'-'[' / %x5D-7E ; ']'-'~' / obs-text
|
||||||
|
quoted-pair = "\" ( HTAB / SP / VCHAR / obs-text )
|
||||||
|
obs-text = %x80-FF
|
||||||
|
*/
|
||||||
|
auto const err =
|
||||||
|
[&]
|
||||||
|
{
|
||||||
|
it = first;
|
||||||
|
};
|
||||||
|
v.first = {};
|
||||||
|
v.second = {};
|
||||||
|
detail::skip_ows(it, last);
|
||||||
|
first = it;
|
||||||
|
if(it == last)
|
||||||
|
return err();
|
||||||
|
if(*it != ';')
|
||||||
|
return err();
|
||||||
|
++it;
|
||||||
|
detail::skip_ows(it, last);
|
||||||
|
if(it == last)
|
||||||
|
return err();
|
||||||
|
// param
|
||||||
|
if(! detail::is_token_char(*it))
|
||||||
|
return err();
|
||||||
|
auto const p0 = it;
|
||||||
|
skip_token(++it, last);
|
||||||
|
auto const p1 = it;
|
||||||
|
v.first = { &*p0, static_cast<std::size_t>(p1 - p0) };
|
||||||
|
detail::skip_ows(it, last);
|
||||||
|
if(it == last)
|
||||||
|
return;
|
||||||
|
if(*it == ';')
|
||||||
|
return;
|
||||||
|
if(*it != '=')
|
||||||
|
return err();
|
||||||
|
++it;
|
||||||
|
detail::skip_ows(it, last);
|
||||||
|
if(it == last)
|
||||||
|
return;
|
||||||
|
if(*it == '"')
|
||||||
|
{
|
||||||
|
// quoted-string
|
||||||
|
auto const p2 = it;
|
||||||
|
++it;
|
||||||
|
for(;;)
|
||||||
|
{
|
||||||
|
if(it == last)
|
||||||
|
return err();
|
||||||
|
auto c = *it++;
|
||||||
|
if(c == '"')
|
||||||
|
break;
|
||||||
|
if(detail::is_qdchar(c))
|
||||||
|
continue;
|
||||||
|
if(c != '\\')
|
||||||
|
return err();
|
||||||
|
if(it == last)
|
||||||
|
return err();
|
||||||
|
c = *it++;
|
||||||
|
if(! detail::is_qpchar(c))
|
||||||
|
return err();
|
||||||
|
}
|
||||||
|
v.second = { &*p2, static_cast<std::size_t>(it - p2) };
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// token
|
||||||
|
if(! detail::is_token_char(*it))
|
||||||
|
return err();
|
||||||
|
auto const p2 = it;
|
||||||
|
skip_token(++it, last);
|
||||||
|
v.second = { &*p2, static_cast<std::size_t>(it - p2) };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
opt_token_list_policy::operator()(value_type& v,
|
||||||
|
char const*& it, string_view s) const
|
||||||
|
{
|
||||||
|
v = {};
|
||||||
|
auto need_comma = it != s.data();
|
||||||
|
for(;;)
|
||||||
|
{
|
||||||
|
detail::skip_ows(it, (s.data() + s.size()));
|
||||||
|
if(it == (s.data() + s.size()))
|
||||||
|
{
|
||||||
|
it = nullptr;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
auto const c = *it;
|
||||||
|
if(detail::is_token_char(c))
|
||||||
|
{
|
||||||
|
if(need_comma)
|
||||||
|
return false;
|
||||||
|
auto const p0 = it;
|
||||||
|
for(;;)
|
||||||
|
{
|
||||||
|
++it;
|
||||||
|
if(it == (s.data() + s.size()))
|
||||||
|
break;
|
||||||
|
if(! detail::is_token_char(*it))
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
v = string_view{p0,
|
||||||
|
static_cast<std::size_t>(it - p0)};
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if(c != ',')
|
||||||
|
return false;
|
||||||
|
need_comma = false;
|
||||||
|
++it;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} // detail
|
||||||
|
} // http
|
||||||
|
} // beast
|
||||||
|
} // boost
|
||||||
|
|
||||||
|
#endif // BOOST_BEAST_HTTP_DETAIL_RFC7230_IPP
|
||||||
|
|
@@ -18,7 +18,6 @@
|
|||||||
#include <boost/beast/core/detail/clamp.hpp>
|
#include <boost/beast/core/detail/clamp.hpp>
|
||||||
#include <boost/beast/core/detail/config.hpp>
|
#include <boost/beast/core/detail/config.hpp>
|
||||||
#include <boost/asio/buffer.hpp>
|
#include <boost/asio/buffer.hpp>
|
||||||
#include <boost/make_unique.hpp>
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <utility>
|
#include <utility>
|
||||||
|
|
||||||
|
@@ -40,6 +40,7 @@ the program, with the macro BOOST_BEAST_SEPARATE_COMPILATION defined.
|
|||||||
#include <boost/beast/core/impl/static_buffer.ipp>
|
#include <boost/beast/core/impl/static_buffer.ipp>
|
||||||
|
|
||||||
#include <boost/beast/http/detail/basic_parser.ipp>
|
#include <boost/beast/http/detail/basic_parser.ipp>
|
||||||
|
#include <boost/beast/http/detail/rfc7230.ipp>
|
||||||
#include <boost/beast/http/impl/basic_parser.ipp>
|
#include <boost/beast/http/impl/basic_parser.ipp>
|
||||||
#include <boost/beast/http/impl/error.ipp>
|
#include <boost/beast/http/impl/error.ipp>
|
||||||
#include <boost/beast/http/impl/field.ipp>
|
#include <boost/beast/http/impl/field.ipp>
|
||||||
|
@@ -31,7 +31,6 @@
|
|||||||
#include <boost/assert.hpp>
|
#include <boost/assert.hpp>
|
||||||
#include <boost/endian/buffers.hpp>
|
#include <boost/endian/buffers.hpp>
|
||||||
#include <boost/make_shared.hpp>
|
#include <boost/make_shared.hpp>
|
||||||
#include <boost/make_unique.hpp>
|
|
||||||
#include <boost/throw_exception.hpp>
|
#include <boost/throw_exception.hpp>
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <chrono>
|
#include <chrono>
|
||||||
|
@@ -43,7 +43,6 @@
|
|||||||
#include <boost/beast/core/detail/type_traits.hpp>
|
#include <boost/beast/core/detail/type_traits.hpp>
|
||||||
#include <boost/assert.hpp>
|
#include <boost/assert.hpp>
|
||||||
#include <boost/config.hpp>
|
#include <boost/config.hpp>
|
||||||
#include <boost/make_unique.hpp>
|
|
||||||
#include <boost/optional.hpp>
|
#include <boost/optional.hpp>
|
||||||
#include <boost/throw_exception.hpp>
|
#include <boost/throw_exception.hpp>
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
|
@@ -1221,7 +1221,7 @@ public:
|
|||||||
auto const good =
|
auto const good =
|
||||||
[&](string_view s, std::uint32_t v0)
|
[&](string_view s, std::uint32_t v0)
|
||||||
{
|
{
|
||||||
std::uint32_t v;
|
std::uint64_t v;
|
||||||
auto const result =
|
auto const result =
|
||||||
base::parse_dec(s.begin(), s.end(), v);
|
base::parse_dec(s.begin(), s.end(), v);
|
||||||
if(BEAST_EXPECTS(result, s))
|
if(BEAST_EXPECTS(result, s))
|
||||||
@@ -1230,7 +1230,7 @@ public:
|
|||||||
auto const bad =
|
auto const bad =
|
||||||
[&](string_view s)
|
[&](string_view s)
|
||||||
{
|
{
|
||||||
std::uint32_t v;
|
std::uint64_t v;
|
||||||
auto const result =
|
auto const result =
|
||||||
base::parse_dec(s.begin(), s.end(), v);
|
base::parse_dec(s.begin(), s.end(), v);
|
||||||
BEAST_EXPECTS(! result, s);
|
BEAST_EXPECTS(! result, s);
|
||||||
@@ -1247,7 +1247,7 @@ public:
|
|||||||
bad (" 0");
|
bad (" 0");
|
||||||
bad ("0 ");
|
bad ("0 ");
|
||||||
bad ("-1");
|
bad ("-1");
|
||||||
bad ("4294967296");
|
bad ("18446744073709551616"); // max(uint64) + 1
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
Reference in New Issue
Block a user