Line data Source code
1 : //
2 : // Copyright (c) 2019 Vinnie Falco (vinnie.falco@gmail.com)
3 : // Copyright (c) 2022 Alan de Freitas (alandefreitas@gmail.com)
4 : //
5 : // Distributed under the Boost Software License, Version 1.0. (See accompanying
6 : // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
7 : //
8 : // Official repository: https://github.com/CPPAlliance/url
9 : //
10 :
11 :
12 : #include <boost/url/detail/config.hpp>
13 : #include <boost/url/parse_query.hpp>
14 : #include <boost/url/rfc/query_rule.hpp>
15 : #include <boost/url/grammar/parse.hpp>
16 :
17 : #include <boost/url/error.hpp>
18 :
19 : namespace boost {
20 : namespace urls {
21 :
22 : system::result<params_encoded_view>
23 138 : parse_query(core::string_view s) noexcept
24 : {
25 : // Handle empty strings differently.
26 : // We produce {}, versus empty but
27 : // present query in URL (e.g. "http:?")
28 : // which produces {{"", none}}.
29 138 : if(s.empty())
30 : {
31 : // default-constructed string_view can return a null data pointer;
32 : // query_ref expects a valid pointer even when the buffer is empty.
33 9 : auto const* data = s.data();
34 9 : core::string_view empty(data ? data : "", 0);
35 9 : return params_encoded_view(
36 18 : detail::query_ref(
37 9 : empty, 0, 0));
38 : }
39 129 : auto rv = grammar::parse(s, query_rule);
40 129 : if(! rv)
41 12 : return rv.error();
42 117 : return params_encoded_view(
43 234 : detail::query_ref(
44 234 : s, s.size(), rv->size()));
45 : }
46 :
47 : } // urls
48 : } // boost
|