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