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_ABSOLUTE_URI_RULE_HPP
11  
#ifndef BOOST_URL_RFC_IMPL_ABSOLUTE_URI_RULE_HPP
12  
#define BOOST_URL_RFC_IMPL_ABSOLUTE_URI_RULE_HPP
12  
#define BOOST_URL_RFC_IMPL_ABSOLUTE_URI_RULE_HPP
13  

13  

14  
#include <boost/url/detail/config.hpp>
14  
#include <boost/url/detail/config.hpp>
15  
#include <boost/url/url_view.hpp>
15  
#include <boost/url/url_view.hpp>
16  
#include <boost/url/grammar/delim_rule.hpp>
16  
#include <boost/url/grammar/delim_rule.hpp>
17  
#include <boost/url/grammar/tuple_rule.hpp>
17  
#include <boost/url/grammar/tuple_rule.hpp>
18  
#include <boost/url/grammar/optional_rule.hpp>
18  
#include <boost/url/grammar/optional_rule.hpp>
19  
#include <boost/url/grammar/parse.hpp>
19  
#include <boost/url/grammar/parse.hpp>
20  
#include <boost/url/rfc/detail/hier_part_rule.hpp>
20  
#include <boost/url/rfc/detail/hier_part_rule.hpp>
21  
#include <boost/url/rfc/detail/query_part_rule.hpp>
21  
#include <boost/url/rfc/detail/query_part_rule.hpp>
22  
#include <boost/url/rfc/detail/scheme_rule.hpp>
22  
#include <boost/url/rfc/detail/scheme_rule.hpp>
23  

23  

24  
namespace boost {
24  
namespace boost {
25  
namespace urls {
25  
namespace urls {
26  

26  

27  
BOOST_URL_CXX20_CONSTEXPR_OR_INLINE
27  
BOOST_URL_CXX20_CONSTEXPR_OR_INLINE
28  
auto
28  
auto
29  
implementation_defined::absolute_uri_rule_t::
29  
implementation_defined::absolute_uri_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  
    detail::url_impl u(detail::url_impl::from::string);
36  
    detail::url_impl u(detail::url_impl::from::string);
37  
    u.cs_ = it;
37  
    u.cs_ = it;
38  

38  

39  
    // scheme
39  
    // scheme
40  
    {
40  
    {
41  
        auto rv = grammar::parse(
41  
        auto rv = grammar::parse(
42  
            it, end,
42  
            it, end,
43  
            grammar::tuple_rule(
43  
            grammar::tuple_rule(
44  
                detail::scheme_rule(),
44  
                detail::scheme_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  
        u.apply_scheme(rv->scheme);
49  
        u.apply_scheme(rv->scheme);
50  
    }
50  
    }
51  

51  

52  
    // hier_part
52  
    // hier_part
53  
    {
53  
    {
54  
        auto rv = grammar::parse(
54  
        auto rv = grammar::parse(
55  
            it, end, detail::hier_part_rule);
55  
            it, end, detail::hier_part_rule);
56  
        if(! rv)
56  
        if(! rv)
57  
            return rv.error();
57  
            return rv.error();
58  
        if(rv->has_authority)
58  
        if(rv->has_authority)
59  
            u.apply_authority(rv->authority.u_);
59  
            u.apply_authority(rv->authority.u_);
60  
        u.apply_path(
60  
        u.apply_path(
61  
            rv->path,
61  
            rv->path,
62  
            rv->segment_count);
62  
            rv->segment_count);
63  
    }
63  
    }
64  

64  

65  
    // [ "?" query ]
65  
    // [ "?" query ]
66  
    {
66  
    {
67  
        auto rv = grammar::parse(
67  
        auto rv = grammar::parse(
68  
            it, end, detail::query_part_rule);
68  
            it, end, detail::query_part_rule);
69  
        if(! rv)
69  
        if(! rv)
70  
            return rv.error();
70  
            return rv.error();
71  
        if(rv->has_query)
71  
        if(rv->has_query)
72  
        {
72  
        {
73  
            // map "?" to { {} }
73  
            // map "?" to { {} }
74  
            u.apply_query(
74  
            u.apply_query(
75  
                rv->query,
75  
                rv->query,
76  
                rv->count);
76  
                rv->count);
77  
        }
77  
        }
78  
    }
78  
    }
79  

79  

80  
    return url_view(u);
80  
    return url_view(u);
81  
}
81  
}
82  

82  

83  
} // urls
83  
} // urls
84  
} // boost
84  
} // boost
85  

85  

86  

86  

87  
#endif
87  
#endif