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/authority_rule.hpp> 13 : #include <boost/url/grammar/delim_rule.hpp> 14 : #include <boost/url/grammar/optional_rule.hpp> 15 : #include <boost/url/grammar/parse.hpp> 16 : #include <boost/url/grammar/tuple_rule.hpp> 17 : #include "detail/host_rule.hpp" 18 : #include "detail/port_rule.hpp" 19 : #include "detail/userinfo_rule.hpp" 20 : 21 : namespace boost { 22 : namespace urls { 23 : 24 : auto 25 1893 : authority_rule_t:: 26 : parse( 27 : char const*& it, 28 : char const* const end 29 : ) const noexcept -> 30 : system::result<value_type> 31 : { 32 1893 : detail::url_impl u(detail::url_impl::from::authority); 33 1893 : u.cs_ = it; 34 : 35 : // [ userinfo "@" ] 36 : { 37 : auto rv = grammar::parse( 38 : it, end, 39 1893 : grammar::optional_rule( 40 1893 : grammar::tuple_rule( 41 : detail::userinfo_rule, 42 1893 : grammar::squelch( 43 1893 : grammar::delim_rule('@'))))); 44 1893 : if(! rv) 45 0 : return rv.error(); 46 1893 : if(rv->has_value()) 47 : { 48 129 : u.apply_userinfo( 49 380 : (*rv)->user, 50 380 : (*rv)->has_password 51 251 : ? &(*rv)->password 52 : : nullptr); 53 : } 54 : } 55 : 56 : // host 57 : { 58 : auto rv = grammar::parse( 59 1893 : it, end, detail::host_rule); 60 1893 : if(! rv) 61 31 : return rv.error(); 62 1862 : u.apply_host(rv->host_type, 63 1862 : rv->match, rv->addr); 64 : } 65 : 66 : // [ ":" port ] 67 : { 68 : auto rv = grammar::parse( 69 1862 : it, end, detail::port_part_rule); 70 1862 : if(! rv) 71 0 : return rv.error(); 72 1862 : if(rv->has_port) 73 259 : u.apply_port( 74 259 : rv->port, 75 259 : rv->port_number); 76 : } 77 : 78 1862 : return u.construct_authority(); 79 : } 80 : 81 : } // urls 82 : } // boost 83 :