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_DETAIL_IMPL_IP_LITERAL_RULE_HPP
11  
#ifndef BOOST_URL_RFC_DETAIL_IMPL_IP_LITERAL_RULE_HPP
12  
#define BOOST_URL_RFC_DETAIL_IMPL_IP_LITERAL_RULE_HPP
12  
#define BOOST_URL_RFC_DETAIL_IMPL_IP_LITERAL_RULE_HPP
13  

13  

14  
#include <boost/url/detail/config.hpp>
14  
#include <boost/url/detail/config.hpp>
15  
#include <boost/url/rfc/ipv6_address_rule.hpp>
15  
#include <boost/url/rfc/ipv6_address_rule.hpp>
16  
#include <boost/url/rfc/detail/ipv6_addrz_rule.hpp>
16  
#include <boost/url/rfc/detail/ipv6_addrz_rule.hpp>
17  
#include <boost/url/rfc/detail/ipvfuture_rule.hpp>
17  
#include <boost/url/rfc/detail/ipvfuture_rule.hpp>
18  
#include <boost/url/grammar/delim_rule.hpp>
18  
#include <boost/url/grammar/delim_rule.hpp>
19  
#include <boost/url/grammar/error.hpp>
19  
#include <boost/url/grammar/error.hpp>
20  
#include <boost/url/grammar/parse.hpp>
20  
#include <boost/url/grammar/parse.hpp>
21  
#include <boost/url/grammar/tuple_rule.hpp>
21  
#include <boost/url/grammar/tuple_rule.hpp>
22  

22  

23  
namespace boost {
23  
namespace boost {
24  
namespace urls {
24  
namespace urls {
25  
namespace detail {
25  
namespace detail {
26  

26  

27  
BOOST_URL_CXX20_CONSTEXPR_OR_INLINE
27  
BOOST_URL_CXX20_CONSTEXPR_OR_INLINE
28  
auto
28  
auto
29  
ip_literal_rule_t::
29  
ip_literal_rule_t::
30  
parse(
30  
parse(
31  
    char const*& it,
31  
    char const*& it,
32  
    char const* const end
32  
    char const* const end
33  
        ) const noexcept ->
33  
        ) const noexcept ->
34  
    system::result<value_type>
34  
    system::result<value_type>
35  
{
35  
{
36  
    value_type t;
36  
    value_type t;
37  

37  

38  
    // '['
38  
    // '['
39  
    {
39  
    {
40  
        auto rv = grammar::parse(
40  
        auto rv = grammar::parse(
41  
            it, end, grammar::delim_rule('['));
41  
            it, end, grammar::delim_rule('['));
42  
        if(! rv)
42  
        if(! rv)
43  
            return rv.error();
43  
            return rv.error();
44  
    }
44  
    }
45  
    if(it == end)
45  
    if(it == end)
46  
    {
46  
    {
47  
        // end
47  
        // end
48  
        BOOST_URL_CONSTEXPR_RETURN_EC(
48  
        BOOST_URL_CONSTEXPR_RETURN_EC(
49  
            grammar::error::invalid);
49  
            grammar::error::invalid);
50  
    }
50  
    }
51  
    if(*it != 'v')
51  
    if(*it != 'v')
52  
    {
52  
    {
53  
        // IPv6address
53  
        // IPv6address
54  
        auto it0 = it;
54  
        auto it0 = it;
55  
        auto rv = grammar::parse(
55  
        auto rv = grammar::parse(
56  
            it, end,
56  
            it, end,
57  
            grammar::tuple_rule(
57  
            grammar::tuple_rule(
58  
                ipv6_address_rule,
58  
                ipv6_address_rule,
59  
                grammar::squelch(
59  
                grammar::squelch(
60  
                    grammar::delim_rule(']'))));
60  
                    grammar::delim_rule(']'))));
61  
        if(! rv)
61  
        if(! rv)
62  
        {
62  
        {
63  
            // IPv6addrz: https://datatracker.ietf.org/doc/html/rfc6874
63  
            // IPv6addrz: https://datatracker.ietf.org/doc/html/rfc6874
64  
            it = it0;
64  
            it = it0;
65  
            auto rv2 = grammar::parse(
65  
            auto rv2 = grammar::parse(
66  
                it, end,
66  
                it, end,
67  
                grammar::tuple_rule(
67  
                grammar::tuple_rule(
68  
                    ipv6_addrz_rule,
68  
                    ipv6_addrz_rule,
69  
                    grammar::squelch(
69  
                    grammar::squelch(
70  
                        grammar::delim_rule(']'))));
70  
                        grammar::delim_rule(']'))));
71  
            if(! rv2)
71  
            if(! rv2)
72  
                return rv2.error();
72  
                return rv2.error();
73  
            t.ipv6 = rv2->ipv6;
73  
            t.ipv6 = rv2->ipv6;
74  
            t.is_ipv6 = true;
74  
            t.is_ipv6 = true;
75  
            return t;
75  
            return t;
76  
        }
76  
        }
77  
        t.ipv6 = *rv;
77  
        t.ipv6 = *rv;
78  
        t.is_ipv6 = true;
78  
        t.is_ipv6 = true;
79  
        return t;
79  
        return t;
80  
    }
80  
    }
81  
    {
81  
    {
82  
        // IPvFuture
82  
        // IPvFuture
83  
        auto rv = grammar::parse(
83  
        auto rv = grammar::parse(
84  
            it, end,
84  
            it, end,
85  
            grammar::tuple_rule(
85  
            grammar::tuple_rule(
86  
                ipvfuture_rule,
86  
                ipvfuture_rule,
87  
                grammar::squelch(
87  
                grammar::squelch(
88  
                    grammar::delim_rule(']'))));
88  
                    grammar::delim_rule(']'))));
89  
        if(! rv)
89  
        if(! rv)
90  
            return rv.error();
90  
            return rv.error();
91  
        t.is_ipv6 = false;
91  
        t.is_ipv6 = false;
92  
        t.ipvfuture = rv->str;
92  
        t.ipvfuture = rv->str;
93  
        return t;
93  
        return t;
94  
    }
94  
    }
95  
}
95  
}
96  

96  

97  
} // detail
97  
} // detail
98  
} // urls
98  
} // urls
99  
} // boost
99  
} // boost
100  

100  

101  

101  

102  
#endif
102  
#endif