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  
//
3  
//
4  
// Distributed under the Boost Software License, Version 1.0. (See accompanying
4  
// Distributed under the Boost Software License, Version 1.0. (See accompanying
5  
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
5  
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6  
//
6  
//
7  
// Official repository: https://github.com/boostorg/url
7  
// Official repository: https://github.com/boostorg/url
8  
//
8  
//
9  

9  

10  

10  

11  
#include <boost/url/detail/config.hpp>
11  
#include <boost/url/detail/config.hpp>
12  
#include <boost/url/rfc/absolute_uri_rule.hpp>
12  
#include <boost/url/rfc/absolute_uri_rule.hpp>
13  
#include <boost/url/grammar/delim_rule.hpp>
13  
#include <boost/url/grammar/delim_rule.hpp>
14  
#include <boost/url/grammar/tuple_rule.hpp>
14  
#include <boost/url/grammar/tuple_rule.hpp>
15  
#include <boost/url/grammar/optional_rule.hpp>
15  
#include <boost/url/grammar/optional_rule.hpp>
16  
#include <boost/url/grammar/parse.hpp>
16  
#include <boost/url/grammar/parse.hpp>
17  
#include "detail/hier_part_rule.hpp"
17  
#include "detail/hier_part_rule.hpp"
18  
#include "detail/query_part_rule.hpp"
18  
#include "detail/query_part_rule.hpp"
19  
#include "detail/scheme_rule.hpp"
19  
#include "detail/scheme_rule.hpp"
20  
#include <utility>
20  
#include <utility>
21  

21  

22  
namespace boost {
22  
namespace boost {
23  
namespace urls {
23  
namespace urls {
24  

24  

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

35  

36  
    // scheme
36  
    // scheme
37  
    {
37  
    {
38  
        auto rv = grammar::parse(
38  
        auto rv = grammar::parse(
39  
            it, end,
39  
            it, end,
40  
            grammar::tuple_rule(
40  
            grammar::tuple_rule(
41  
                detail::scheme_rule(),
41  
                detail::scheme_rule(),
42  
                grammar::squelch(
42  
                grammar::squelch(
43  
                    grammar::delim_rule(':'))));
43  
                    grammar::delim_rule(':'))));
44  
        if(! rv)
44  
        if(! rv)
45  
            return rv.error();
45  
            return rv.error();
46  
        u.apply_scheme(rv->scheme);
46  
        u.apply_scheme(rv->scheme);
47  
    }
47  
    }
48  

48  

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

61  

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

76  

77  
    return u.construct();
77  
    return u.construct();
78  
}
78  
}
79  

79  

80  
} // urls
80  
} // urls
81  
} // boost
81  
} // boost
82  

82