Line data Source code
1 : // 2 : // Copyright (c) 2016-2019 Vinnie Falco (vinnie dot falco at gmail dot com) 3 : // 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) 6 : // 7 : // Official repository: https://github.com/boostorg/url 8 : // 9 : 10 : 11 : #include <boost/url/detail/config.hpp> 12 : #include <boost/url/rfc/relative_ref_rule.hpp> 13 : #include <boost/url/rfc/query_rule.hpp> 14 : #include "detail/fragment_part_rule.hpp" 15 : #include "detail/query_part_rule.hpp" 16 : #include "detail/relative_part_rule.hpp" 17 : #include <boost/url/grammar/delim_rule.hpp> 18 : #include <boost/url/grammar/tuple_rule.hpp> 19 : #include <boost/url/grammar/optional_rule.hpp> 20 : #include <boost/url/grammar/parse.hpp> 21 : 22 : namespace boost { 23 : namespace urls { 24 : 25 : auto 26 1339 : relative_ref_rule_t:: 27 : parse( 28 : char const*& it, 29 : char const* const end 30 : ) const noexcept -> 31 : system::result<value_type> 32 : { 33 1339 : detail::url_impl u(detail::url_impl::from::string); 34 1339 : u.cs_ = it; 35 : 36 : // relative-part 37 : { 38 : auto rv = grammar::parse( 39 : it, end, 40 1339 : detail::relative_part_rule); 41 1339 : if(! rv) 42 42 : return rv.error(); 43 1297 : if(rv->has_authority) 44 243 : u.apply_authority(rv->authority); 45 1297 : u.apply_path( 46 1297 : rv->path, rv->segment_count); 47 : } 48 : 49 : // [ "?" query ] 50 : { 51 : auto rv = grammar::parse( 52 1297 : it, end, detail::query_part_rule); 53 1297 : if(! rv) 54 0 : return rv.error(); 55 1297 : if(rv->has_query) 56 : { 57 : // map "?" to { {} } 58 219 : u.apply_query( 59 219 : rv->query, 60 219 : rv->count + 61 219 : rv->query.empty()); 62 : } 63 : } 64 : 65 : // [ "#" fragment ] 66 : { 67 : auto rv = grammar::parse( 68 1297 : it, end, detail::fragment_part_rule); 69 1297 : if(! rv) 70 1 : return rv.error(); 71 1296 : if(rv->has_fragment) 72 59 : u.apply_frag(rv->fragment); 73 : } 74 : 75 1296 : return u.construct(); 76 : } 77 : 78 : } // urls 79 : } // boost 80 :