Line data Source code
1 : //
2 : // Copyright (c) 2016-2019 Vinnie Falco (vinnie dot falco at gmail dot 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/boostorg/url
8 : //
9 :
10 : #include <boost/url/detail/config.hpp>
11 : #include <boost/url/rfc/query_rule.hpp>
12 : #include "detail/charsets.hpp"
13 : #include <boost/url/error.hpp>
14 : #include <boost/url/grammar/hexdig_chars.hpp>
15 :
16 : namespace boost {
17 : namespace urls {
18 :
19 : auto
20 611 : implementation_defined::query_rule_t::
21 : parse(
22 : char const*& it,
23 : char const* end
24 : ) const noexcept ->
25 : system::result<value_type>
26 : {
27 611 : if(it == end)
28 : {
29 : // empty string = 1 param
30 34 : core::string_view str(it, 0);
31 34 : return params_encoded_view(
32 68 : detail::query_ref(str, 0, 1));
33 : }
34 577 : auto const it0 = it;
35 577 : std::size_t dn = 0;
36 577 : std::size_t nparam = 1;
37 8121 : while(it != end)
38 : {
39 7739 : if(*it == '&')
40 : {
41 503 : ++nparam;
42 503 : ++it;
43 503 : continue;
44 : }
45 7236 : if(detail::query_chars(*it))
46 : {
47 6869 : ++it;
48 6869 : continue;
49 : }
50 367 : if(*it == '%')
51 : {
52 359 : if(end - it < 3 ||
53 175 : (!grammar::hexdig_chars(it[1]) ||
54 174 : !grammar::hexdig_chars(it[2])))
55 : {
56 : // missing valid HEXDIG
57 12 : break;
58 : }
59 172 : it += 3;
60 172 : dn += 2;
61 172 : continue;
62 : }
63 : // got reserved character
64 183 : break;
65 : }
66 577 : std::size_t const n(it - it0);
67 577 : core::string_view str(it0, n);
68 577 : return params_encoded_view(
69 1154 : detail::query_ref(
70 577 : str, n - dn, nparam));
71 : }
72 :
73 : } // urls
74 : } // boost
75 :
|