Line data Source code
1 : // 2 : // Copyright (c) 2019 Vinnie Falco (vinnie.falco@gmail.com) 3 : // Copyright (c) 2022 Alan de Freitas (alandefreitas@gmail.com) 4 : // 5 : // Distributed under the Boost Software License, Version 1.0. (See accompanying 6 : // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) 7 : // 8 : // Official repository: https://github.com/boostorg/url 9 : // 10 : 11 : 12 : #include <boost/url/detail/config.hpp> 13 : #include <boost/url/parse_path.hpp> 14 : #include <boost/url/error.hpp> 15 : #include "detail/path.hpp" 16 : #include <boost/url/grammar/parse.hpp> 17 : #include "boost/url/rfc/detail/path_rules.hpp" 18 : 19 : namespace boost { 20 : namespace urls { 21 : 22 : system::result<segments_encoded_view> 23 153 : parse_path(core::string_view s) noexcept 24 : { 25 153 : auto it = s.data(); 26 153 : auto const end = it + s.size(); 27 153 : std::size_t dn = 0; 28 153 : std::size_t nseg = 0; 29 153 : if( it != end && 30 150 : *it != '/') 31 120 : ++nseg; 32 892 : while(it != end) 33 : { 34 751 : if(*it == '/') 35 : { 36 330 : ++it; 37 330 : ++dn; 38 330 : ++nseg; 39 330 : continue; 40 : } 41 : auto rv = grammar::parse( 42 421 : it, end, detail::segment_rule); 43 421 : if(! rv) 44 10 : return rv.error(); 45 411 : if(rv->empty()) 46 : { 47 2 : BOOST_URL_RETURN_EC( 48 : grammar::error::mismatch); 49 : } 50 409 : dn += rv->decoded_size(); 51 : } 52 : // adjust nseg 53 141 : nseg = detail::path_segments(s, nseg); 54 141 : return segments_encoded_view( 55 282 : detail::path_ref(s, dn, nseg)); 56 : } 57 : 58 : } // urls 59 : } // boost 60 :