TLA Line data Source code
1 : //
2 : // Copyright (c) 2016-2019 Vinnie Falco (vinnie dot falco at gmail dot com)
3 : // Copyright (c) 2023 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/boostorg/url
9 : //
10 :
11 : #ifndef BOOST_URL_RFC_IMPL_AUTHORITY_RULE_HPP
12 : #define BOOST_URL_RFC_IMPL_AUTHORITY_RULE_HPP
13 :
14 : #include <boost/url/detail/config.hpp>
15 : #include <boost/url/grammar/delim_rule.hpp>
16 : #include <boost/url/grammar/optional_rule.hpp>
17 : #include <boost/url/grammar/parse.hpp>
18 : #include <boost/url/grammar/tuple_rule.hpp>
19 : #include <boost/url/rfc/detail/host_rule.hpp>
20 : #include <boost/url/rfc/detail/port_rule.hpp>
21 : #include <boost/url/rfc/detail/userinfo_rule.hpp>
22 :
23 : namespace boost {
24 : namespace urls {
25 :
26 : BOOST_URL_CXX20_CONSTEXPR_OR_INLINE
27 : auto
28 HIT 2054 : implementation_defined::authority_rule_t::
29 : parse(
30 : char const*& it,
31 : char const* const end
32 : ) const noexcept ->
33 : system::result<value_type>
34 : {
35 2054 : detail::url_impl u(detail::url_impl::from::authority);
36 2054 : u.cs_ = it;
37 :
38 : // [ userinfo "@" ]
39 : {
40 : auto rv = grammar::parse(
41 : it, end,
42 2054 : grammar::optional_rule(
43 2054 : grammar::tuple_rule(
44 : detail::userinfo_rule,
45 2054 : grammar::squelch(
46 4108 : grammar::delim_rule('@')))));
47 2054 : if(! rv)
48 MIS 0 : return rv.error();
49 HIT 2054 : if(rv->has_value())
50 : {
51 135 : u.apply_userinfo(
52 405 : (*rv)->user,
53 405 : (*rv)->has_password
54 270 : ? &(*rv)->password
55 : : nullptr);
56 : }
57 : }
58 :
59 : // host
60 : {
61 2054 : auto rv = grammar::parse(
62 : it, end, detail::host_rule);
63 2054 : if(! rv)
64 32 : return rv.error();
65 2022 : u.apply_host(rv->host_type,
66 2022 : rv->match, rv->addr);
67 : }
68 :
69 : // [ ":" port ]
70 : {
71 2022 : auto rv = grammar::parse(
72 : it, end, detail::port_part_rule);
73 2022 : if(! rv)
74 MIS 0 : return rv.error();
75 HIT 2022 : if(rv->has_port)
76 568 : u.apply_port(
77 284 : rv->port,
78 284 : rv->port_number);
79 : }
80 :
81 2022 : return authority_view(u);
82 : }
83 :
84 : } // urls
85 : } // boost
86 :
87 : #endif
|