1  
//
1  
//
2  
// Copyright (c) 2016-2019 Vinnie Falco (vinnie dot falco at gmail dot com)
2  
// Copyright (c) 2016-2019 Vinnie Falco (vinnie dot falco at gmail dot com)
3  
// Copyright (c) 2023 Alan de Freitas (alandefreitas@gmail.com)
3  
// Copyright (c) 2023 Alan de Freitas (alandefreitas@gmail.com)
4  
//
4  
//
5  
// Distributed under the Boost Software License, Version 1.0. (See accompanying
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)
6  
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
7  
//
7  
//
8  
// Official repository: https://github.com/boostorg/url
8  
// Official repository: https://github.com/boostorg/url
9  
//
9  
//
10  

10  

11  
#ifndef BOOST_URL_RFC_IMPL_AUTHORITY_RULE_HPP
11  
#ifndef BOOST_URL_RFC_IMPL_AUTHORITY_RULE_HPP
12  
#define BOOST_URL_RFC_IMPL_AUTHORITY_RULE_HPP
12  
#define BOOST_URL_RFC_IMPL_AUTHORITY_RULE_HPP
13  

13  

14  
#include <boost/url/detail/config.hpp>
14  
#include <boost/url/detail/config.hpp>
15  
#include <boost/url/grammar/delim_rule.hpp>
15  
#include <boost/url/grammar/delim_rule.hpp>
16  
#include <boost/url/grammar/optional_rule.hpp>
16  
#include <boost/url/grammar/optional_rule.hpp>
17  
#include <boost/url/grammar/parse.hpp>
17  
#include <boost/url/grammar/parse.hpp>
18  
#include <boost/url/grammar/tuple_rule.hpp>
18  
#include <boost/url/grammar/tuple_rule.hpp>
19  
#include <boost/url/rfc/detail/host_rule.hpp>
19  
#include <boost/url/rfc/detail/host_rule.hpp>
20  
#include <boost/url/rfc/detail/port_rule.hpp>
20  
#include <boost/url/rfc/detail/port_rule.hpp>
21  
#include <boost/url/rfc/detail/userinfo_rule.hpp>
21  
#include <boost/url/rfc/detail/userinfo_rule.hpp>
22  

22  

23  
namespace boost {
23  
namespace boost {
24  
namespace urls {
24  
namespace urls {
25  

25  

26  
BOOST_URL_CXX20_CONSTEXPR_OR_INLINE
26  
BOOST_URL_CXX20_CONSTEXPR_OR_INLINE
27  
auto
27  
auto
28  
implementation_defined::authority_rule_t::
28  
implementation_defined::authority_rule_t::
29  
parse(
29  
parse(
30  
    char const*& it,
30  
    char const*& it,
31  
    char const* const end
31  
    char const* const end
32  
        ) const noexcept ->
32  
        ) const noexcept ->
33  
    system::result<value_type>
33  
    system::result<value_type>
34  
{
34  
{
35  
    detail::url_impl u(detail::url_impl::from::authority);
35  
    detail::url_impl u(detail::url_impl::from::authority);
36  
    u.cs_ = it;
36  
    u.cs_ = it;
37  

37  

38  
    // [ userinfo "@" ]
38  
    // [ userinfo "@" ]
39  
    {
39  
    {
40  
        auto rv = grammar::parse(
40  
        auto rv = grammar::parse(
41  
            it, end,
41  
            it, end,
42  
            grammar::optional_rule(
42  
            grammar::optional_rule(
43  
                grammar::tuple_rule(
43  
                grammar::tuple_rule(
44  
                    detail::userinfo_rule,
44  
                    detail::userinfo_rule,
45  
                    grammar::squelch(
45  
                    grammar::squelch(
46  
                        grammar::delim_rule('@')))));
46  
                        grammar::delim_rule('@')))));
47  
        if(! rv)
47  
        if(! rv)
48  
            return rv.error();
48  
            return rv.error();
49  
        if(rv->has_value())
49  
        if(rv->has_value())
50  
        {
50  
        {
51  
            u.apply_userinfo(
51  
            u.apply_userinfo(
52  
                (*rv)->user,
52  
                (*rv)->user,
53  
                (*rv)->has_password
53  
                (*rv)->has_password
54  
                ? &(*rv)->password
54  
                ? &(*rv)->password
55  
                : nullptr);
55  
                : nullptr);
56  
        }
56  
        }
57  
    }
57  
    }
58  

58  

59  
    // host
59  
    // host
60  
    {
60  
    {
61  
        auto rv = grammar::parse(
61  
        auto rv = grammar::parse(
62  
            it, end, detail::host_rule);
62  
            it, end, detail::host_rule);
63  
        if(! rv)
63  
        if(! rv)
64  
            return rv.error();
64  
            return rv.error();
65  
        u.apply_host(rv->host_type,
65  
        u.apply_host(rv->host_type,
66  
            rv->match, rv->addr);
66  
            rv->match, rv->addr);
67  
    }
67  
    }
68  

68  

69  
    // [ ":" port ]
69  
    // [ ":" port ]
70  
    {
70  
    {
71  
        auto rv = grammar::parse(
71  
        auto rv = grammar::parse(
72  
            it, end, detail::port_part_rule);
72  
            it, end, detail::port_part_rule);
73  
        if(! rv)
73  
        if(! rv)
74  
            return rv.error();
74  
            return rv.error();
75  
        if(rv->has_port)
75  
        if(rv->has_port)
76  
            u.apply_port(
76  
            u.apply_port(
77  
                rv->port,
77  
                rv->port,
78  
                rv->port_number);
78  
                rv->port_number);
79  
    }
79  
    }
80  

80  

81  
    return authority_view(u);
81  
    return authority_view(u);
82  
}
82  
}
83  

83  

84  
} // urls
84  
} // urls
85  
} // boost
85  
} // boost
86  

86  

87  
#endif
87  
#endif