Line data Source code
1 : // 2 : // Copyright (c) 2022 Vinnie Falco (vinnie.falco@gmail.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_IMPL_PCT_STRING_VIEW_IPP 11 : #define BOOST_URL_IMPL_PCT_STRING_VIEW_IPP 12 : 13 : #include <boost/url/detail/config.hpp> 14 : #include <boost/url/error.hpp> 15 : #include <boost/url/pct_string_view.hpp> 16 : #include "detail/decode.hpp" 17 : #include <boost/url/grammar/hexdig_chars.hpp> 18 : #include <boost/url/detail/except.hpp> 19 : 20 : namespace boost { 21 : namespace urls { 22 : 23 : void 24 3297 : pct_string_view:: 25 : decode_impl( 26 : string_token::arg& dest, 27 : encoding_opts opt) const 28 : { 29 3297 : auto p = dest.prepare(dn_); 30 3297 : if(dn_ > 0) 31 2521 : detail::decode_unsafe( 32 2521 : p, p + dn_, s_, opt); 33 3297 : } 34 : 35 : //------------------------------------------------ 36 : 37 5656 : pct_string_view:: 38 : pct_string_view( 39 5656 : core::string_view s) 40 : : pct_string_view( 41 5656 : make_pct_string_view(s 42 5656 : ).value(BOOST_URL_POS)) 43 : { 44 5578 : } 45 : 46 : //------------------------------------------------ 47 : 48 : system::result<pct_string_view> 49 5671 : make_pct_string_view( 50 : core::string_view s) noexcept 51 : { 52 5671 : auto p = s.begin(); 53 5671 : auto const end = s.end(); 54 5671 : std::size_t dn = 0; 55 5671 : if(s.size() >= 3) 56 : { 57 2882 : auto const safe_end = end - 2; 58 21742 : while(p < safe_end) 59 : { 60 18876 : if(*p != '%') 61 : { 62 18132 : ++p; 63 : } 64 744 : else if( 65 1483 : grammar::hexdig_value(p[1]) >= 0 && 66 739 : grammar::hexdig_value(p[2]) >= 0) 67 : { 68 : // percent-escape 69 728 : p += 3; 70 : } 71 : else 72 : { 73 : // invalid encoding 74 16 : BOOST_URL_RETURN_EC( 75 : error::bad_pct_hexdig); 76 : } 77 18860 : ++dn; 78 : } 79 : } 80 5655 : auto const n = end - p; 81 5655 : if( (n >= 1 && p[0] == '%') || 82 3250 : (n >= 2 && p[1] == '%')) 83 : { 84 : // invalid encoding 85 62 : BOOST_URL_RETURN_EC( 86 : error::incomplete_encoding); 87 : } 88 5593 : dn += n; 89 5593 : return make_pct_string_view_unsafe( 90 5593 : s.data(), s.size(), dn); 91 : } 92 : 93 : } // urls 94 : } // boost 95 : 96 : #endif 97 :