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/relative_ref_rule.hpp>
12  
#include <boost/url/rfc/relative_ref_rule.hpp>
13  
#include <boost/url/rfc/query_rule.hpp>
13  
#include <boost/url/rfc/query_rule.hpp>
14  
#include "detail/fragment_part_rule.hpp"
14  
#include "detail/fragment_part_rule.hpp"
15  
#include "detail/query_part_rule.hpp"
15  
#include "detail/query_part_rule.hpp"
16  
#include "detail/relative_part_rule.hpp"
16  
#include "detail/relative_part_rule.hpp"
17  
#include <boost/url/grammar/delim_rule.hpp>
17  
#include <boost/url/grammar/delim_rule.hpp>
18  
#include <boost/url/grammar/tuple_rule.hpp>
18  
#include <boost/url/grammar/tuple_rule.hpp>
19  
#include <boost/url/grammar/optional_rule.hpp>
19  
#include <boost/url/grammar/optional_rule.hpp>
20  
#include <boost/url/grammar/parse.hpp>
20  
#include <boost/url/grammar/parse.hpp>
21  

21  

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

24  

25  
auto
25  
auto
26  
implementation_defined::relative_ref_rule_t::
26  
implementation_defined::relative_ref_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  
    // relative-part
36  
    // relative-part
37  
    {
37  
    {
38  
        auto rv = grammar::parse(
38  
        auto rv = grammar::parse(
39  
            it, end,
39  
            it, end,
40  
            detail::relative_part_rule);
40  
            detail::relative_part_rule);
41  
        if(! rv)
41  
        if(! rv)
42  
            return rv.error();
42  
            return rv.error();
43  
        if(rv->has_authority)
43  
        if(rv->has_authority)
44  
            u.apply_authority(rv->authority);
44  
            u.apply_authority(rv->authority);
45  
        u.apply_path(
45  
        u.apply_path(
46  
            rv->path, rv->segment_count);
46  
            rv->path, rv->segment_count);
47  
    }
47  
    }
48  

48  

49  
    // [ "?" query ]
49  
    // [ "?" query ]
50  
    {
50  
    {
51  
        auto rv = grammar::parse(
51  
        auto rv = grammar::parse(
52  
            it, end, detail::query_part_rule);
52  
            it, end, detail::query_part_rule);
53  
        if(! rv)
53  
        if(! rv)
54  
            return rv.error();
54  
            return rv.error();
55  
        auto& v = *rv;
55  
        auto& v = *rv;
56  
        if(v.has_query)
56  
        if(v.has_query)
57  
        {
57  
        {
58  
            // map "?" to { {} }
58  
            // map "?" to { {} }
59  
            u.apply_query(
59  
            u.apply_query(
60  
                v.query,
60  
                v.query,
61  
                v.count);
61  
                v.count);
62  
        }
62  
        }
63  
    }
63  
    }
64  

64  

65  
    // [ "#" fragment ]
65  
    // [ "#" fragment ]
66  
    {
66  
    {
67  
        auto rv = grammar::parse(
67  
        auto rv = grammar::parse(
68  
            it, end, detail::fragment_part_rule);
68  
            it, end, detail::fragment_part_rule);
69  
        if(! rv)
69  
        if(! rv)
70  
            return rv.error();
70  
            return rv.error();
71  
        if(rv->has_fragment)
71  
        if(rv->has_fragment)
72  
            u.apply_frag(rv->fragment);
72  
            u.apply_frag(rv->fragment);
73  
    }
73  
    }
74  

74  

75  
    return u.construct();
75  
    return u.construct();
76  
}
76  
}
77  

77  

78  
} // urls
78  
} // urls
79  
} // boost
79  
} // boost
80  

80