ext-boost/boost/url/rfc/impl/query_rule.ipp
2023-05-22 18:45:02 +10:00

86 lines
1.9 KiB
C++

//
// 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/url
//
#ifndef BOOST_URL_RFC_IMPL_QUERY_RULE_IPP
#define BOOST_URL_RFC_IMPL_QUERY_RULE_IPP
#include <boost/url/rfc/query_rule.hpp>
#include <boost/url/rfc/detail/charsets.hpp>
#include <boost/url/error.hpp>
#include <boost/url/grammar/hexdig_chars.hpp>
namespace boost {
namespace urls {
auto
query_rule_t::
parse(
char const*& it,
char const* end
) const noexcept ->
result<value_type>
{
if(it == end)
{
// empty string = 0 params
return params_encoded_view(
detail::query_ref(
string_view(it, 0), 0, 0));
}
auto const it0 = it;
std::size_t dn = 0;
std::size_t nparam = 1;
while(it != end)
{
if(*it == '&')
{
++nparam;
++it;
continue;
}
if(detail::query_chars(*it))
{
++it;
continue;
}
if(*it == '%')
{
if(end - it < 3)
{
// missing HEXDIG
BOOST_URL_RETURN_EC(
error::missing_pct_hexdig);
}
if (!grammar::hexdig_chars(it[1]) ||
!grammar::hexdig_chars(it[2]))
{
// expected HEXDIG
BOOST_URL_RETURN_EC(
error::bad_pct_hexdig);
}
it += 3;
dn += 2;
continue;
}
// got reserved character
break;
}
std::size_t const n(it - it0);
return params_encoded_view(
detail::query_ref(
string_view(it0, n),
n - dn,
nparam));
}
} // urls
} // boost
#endif