src/parse_query.cpp

100.0% Lines (13/13) 100.0% List of functions (1/1)
parse_query.cpp
f(x) Functions (1)
Line TLA Hits 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 3171x 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 3171x 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 14x auto const* data = s.data();
34 14x core::string_view empty(data ? data : "", 0);
35 14x return params_encoded_view(
36 28x detail::query_ref(
37 14x empty, 0, 0));
38 }
39 3157x auto rv = grammar::parse(s, query_rule);
40 3157x if(! rv)
41 2995x return rv.error();
42 162x return params_encoded_view(
43 324x detail::query_ref(
44 324x s, s.size(), rv->size()));
45 }
46
47 } // urls
48 } // boost
49