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
21namespace boost {
22namespace urls {
23namespace detail {
24
25auto
26userinfo_rule_t::
27parse(
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 value_type t;
40
41 // user
42 auto rv = grammar::parse(
43 it, end, r: pct_encoded_rule(
44 cs: grammar::ref(cs: uchars)));
45 if(! rv)
46 return rv.error();
47 t.user = *rv;
48
49 // ':'
50 if( it == end ||
51 *it != ':')
52 {
53 t.has_password = false;
54 t.password = {};
55 return t;
56 }
57 ++it;
58
59 // pass
60 rv = grammar::parse(
61 it, end, r: pct_encoded_rule(
62 cs: grammar::ref(cs: pwchars)));
63 if(! rv)
64 return rv.error();
65
66 t.has_password = true;
67 t.password = *rv;
68 return t;
69}
70
71} // detail
72} // urls
73} // boost
74
75#endif
76

source code of boost/libs/url/src/rfc/detail/userinfo_rule.cpp