1  
//
1  
//
2  
// Copyright (c) 2021 Vinnie Falco (vinnie.falco@gmail.com)
2  
// Copyright (c) 2021 Vinnie Falco (vinnie.falco@gmail.com)
3  
//
3  
//
4  
// Distributed under the Boost Software License, Version 1.0. (See accompanying
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)
5  
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6  
//
6  
//
7  
// Official repository: https://github.com/cppalliance/http
7  
// Official repository: https://github.com/cppalliance/http
8  
//
8  
//
9  

9  

10  
#include <boost/http/rfc/upgrade_rule.hpp>
10  
#include <boost/http/rfc/upgrade_rule.hpp>
11  
#include <boost/http/rfc/token_rule.hpp>
11  
#include <boost/http/rfc/token_rule.hpp>
12  
#include <boost/url/grammar/error.hpp>
12  
#include <boost/url/grammar/error.hpp>
13  
#include <boost/url/grammar/parse.hpp>
13  
#include <boost/url/grammar/parse.hpp>
14  

14  

15  
namespace boost {
15  
namespace boost {
16  
namespace http {
16  
namespace http {
17  
namespace implementation_defined {
17  
namespace implementation_defined {
18  

18  

19  
auto
19  
auto
20  
upgrade_protocol_rule_t::
20  
upgrade_protocol_rule_t::
21  
parse(
21  
parse(
22  
    char const*& it,
22  
    char const*& it,
23  
    char const* end) const noexcept ->
23  
    char const* end) const noexcept ->
24  
        system::result<value_type>
24  
        system::result<value_type>
25  
{
25  
{
26  
    value_type t;
26  
    value_type t;
27  
    // token
27  
    // token
28  
    {
28  
    {
29  
        auto rv = grammar::parse(
29  
        auto rv = grammar::parse(
30  
            it, end, token_rule);
30  
            it, end, token_rule);
31  
        if(! rv)
31  
        if(! rv)
32  
            return rv.error();
32  
            return rv.error();
33  
        t.name = *rv;
33  
        t.name = *rv;
34  
    }
34  
    }
35  
    // [ "/" token ]
35  
    // [ "/" token ]
36  
    if( it == end ||
36  
    if( it == end ||
37  
        *it != '/')
37  
        *it != '/')
38  
        return t;
38  
        return t;
39  
    ++it;
39  
    ++it;
40  
    auto rv = grammar::parse(
40  
    auto rv = grammar::parse(
41  
        it, end, token_rule);
41  
        it, end, token_rule);
42  
    if(! rv)
42  
    if(! rv)
43  
        return rv.error();
43  
        return rv.error();
44  
    t.version = *rv;
44  
    t.version = *rv;
45  
    return t;
45  
    return t;
46  
}
46  
}
47  

47  

48  
} // implementation_defined
48  
} // implementation_defined
49  
} // http
49  
} // http
50  
} // boost
50  
} // boost