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 : #ifndef BOOST_URL_RFC_DETAIL_IMPL_USERINFO_RULE_IPP 11 : #define BOOST_URL_RFC_DETAIL_IMPL_USERINFO_RULE_IPP 12 : 13 : #include <boost/url/detail/config.hpp> 14 : #include "userinfo_rule.hpp" 15 : #include <boost/core/detail/string_view.hpp> 16 : #include <boost/url/rfc/pct_encoded_rule.hpp> 17 : #include <boost/url/rfc/sub_delim_chars.hpp> 18 : #include <boost/url/rfc/unreserved_chars.hpp> 19 : #include <boost/url/grammar/parse.hpp> 20 : 21 : namespace boost { 22 : namespace urls { 23 : namespace detail { 24 : 25 : auto 26 1794 : userinfo_rule_t:: 27 : parse( 28 : char const*& it, 29 : char const* const end 30 : ) const noexcept -> 31 : system::result<value_type> 32 : { 33 : static constexpr auto uchars = 34 : unreserved_chars + 35 : sub_delim_chars; 36 : static constexpr auto pwchars = 37 : uchars + ':'; 38 : 39 1794 : value_type t; 40 : 41 : // user 42 : auto rv = grammar::parse( 43 1794 : it, end, pct_encoded_rule( 44 1794 : grammar::ref(uchars))); 45 1794 : if(! rv) 46 8 : return rv.error(); 47 1786 : t.user = *rv; 48 : 49 : // ':' 50 1786 : if( it == end || 51 1529 : *it != ':') 52 : { 53 1381 : t.has_password = false; 54 1381 : t.password = {}; 55 1381 : return t; 56 : } 57 405 : ++it; 58 : 59 : // pass 60 : rv = grammar::parse( 61 405 : it, end, pct_encoded_rule( 62 405 : grammar::ref(pwchars))); 63 405 : if(! rv) 64 0 : return rv.error(); 65 : 66 405 : t.has_password = true; 67 405 : t.password = *rv; 68 405 : return t; 69 : } 70 : 71 : } // detail 72 : } // urls 73 : } // boost 74 : 75 : #endif