100.00% Lines (33/33) 100.00% Functions (3/3)
TLA Baseline Branch
Line Hits Code Line Hits Code
1   // 1   //
2   // Copyright (c) 2022 Vinnie Falco (vinnie.falco@gmail.com) 2   // Copyright (c) 2022 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/boostorg/url 7   // Official repository: https://github.com/boostorg/url
8   // 8   //
9   9  
10   10  
11   #include <boost/url/detail/config.hpp> 11   #include <boost/url/detail/config.hpp>
12   #include <boost/url/error.hpp> 12   #include <boost/url/error.hpp>
13   #include <boost/url/pct_string_view.hpp> 13   #include <boost/url/pct_string_view.hpp>
14   #include <boost/url/detail/decode.hpp> 14   #include <boost/url/detail/decode.hpp>
15   #include <boost/url/grammar/hexdig_chars.hpp> 15   #include <boost/url/grammar/hexdig_chars.hpp>
16   #include <boost/url/detail/except.hpp> 16   #include <boost/url/detail/except.hpp>
17   17  
18   namespace boost { 18   namespace boost {
19   namespace urls { 19   namespace urls {
20   20  
21   void 21   void
HITCBC 22   21125 pct_string_view:: 22   21185 pct_string_view::
23   decode_impl( 23   decode_impl(
24   string_token::arg& dest, 24   string_token::arg& dest,
25   encoding_opts opt) const 25   encoding_opts opt) const
26   { 26   {
HITCBC 27   21125 auto p = dest.prepare(dn_); 27   21185 auto p = dest.prepare(dn_);
HITCBC 28   21125 if(dn_ > 0) 28   21185 if(dn_ > 0)
HITCBC 29   19300 detail::decode_unsafe( 29   19360 detail::decode_unsafe(
HITCBC 30   19300 p, p + dn_, s_, opt); 30   19360 p, p + dn_, s_, opt);
HITCBC 31   21125 } 31   21185 }
32   32  
33   //------------------------------------------------ 33   //------------------------------------------------
34   34  
HITCBC 35   8921 pct_string_view:: 35   8927 pct_string_view::
36   pct_string_view( 36   pct_string_view(
HITCBC 37   8921 core::string_view s) 37   8927 core::string_view s)
38   : pct_string_view( 38   : pct_string_view(
HITCBC 39   8921 make_pct_string_view(s 39   8927 make_pct_string_view(s
HITCBC 40   8921 ).value(BOOST_URL_POS)) 40   8927 ).value(BOOST_URL_POS))
41   { 41   {
HITCBC 42   8684 } 42   8690 }
43   43  
44   //------------------------------------------------ 44   //------------------------------------------------
45   45  
46   system::result<pct_string_view> 46   system::result<pct_string_view>
HITCBC 47   8969 make_pct_string_view( 47   8975 make_pct_string_view(
48   core::string_view s) noexcept 48   core::string_view s) noexcept
49   { 49   {
HITCBC 50   8969 auto p = s.begin(); 50   8975 auto p = s.begin();
HITCBC 51   8969 auto const end = s.end(); 51   8975 auto const end = s.end();
HITCBC 52   8969 std::size_t dn = 0; 52   8975 std::size_t dn = 0;
HITCBC 53   8969 if(s.size() >= 3) 53   8975 if(s.size() >= 3)
54   { 54   {
HITCBC 55   6264 auto const safe_end = end - 2; 55   6265 auto const safe_end = end - 2;
HITCBC 56   1192026 while(p < safe_end) 56   1192028 while(p < safe_end)
57   { 57   {
HITCBC 58   1185859 if(*p != '%') 58   1185860 if(*p != '%')
59   { 59   {
HITCBC 60   962939 ++p; 60   962940 ++p;
61   } 61   }
HITCBC 62   222920 else if( 62   222920 else if(
HITCBC 63   445754 grammar::hexdig_value(p[1]) >= 0 && 63   445754 grammar::hexdig_value(p[1]) >= 0 &&
HITCBC 64   222834 grammar::hexdig_value(p[2]) >= 0) 64   222834 grammar::hexdig_value(p[2]) >= 0)
65   { 65   {
66   // percent-escape 66   // percent-escape
HITCBC 67   222823 p += 3; 67   222823 p += 3;
68   } 68   }
69   else 69   else
70   { 70   {
71   // invalid encoding 71   // invalid encoding
HITCBC 72   97 BOOST_URL_RETURN_EC( 72   97 BOOST_URL_RETURN_EC(
73   error::bad_pct_hexdig); 73   error::bad_pct_hexdig);
74   } 74   }
HITCBC 75   1185762 ++dn; 75   1185763 ++dn;
76   } 76   }
77   } 77   }
HITCBC 78   8872 auto const n = end - p; 78   8878 auto const n = end - p;
HITCBC 79   8872 if( (n >= 1 && p[0] == '%') || 79   8878 if( (n >= 1 && p[0] == '%') ||
HITCBC 80   5207 (n >= 2 && p[1] == '%')) 80   5208 (n >= 2 && p[1] == '%'))
81   { 81   {
82   // invalid encoding 82   // invalid encoding
HITCBC 83   143 BOOST_URL_RETURN_EC( 83   143 BOOST_URL_RETURN_EC(
84   error::incomplete_encoding); 84   error::incomplete_encoding);
85   } 85   }
HITCBC 86   8729 dn += n; 86   8735 dn += n;
HITCBC 87   17458 return make_pct_string_view_unsafe( 87   17470 return make_pct_string_view_unsafe(
HITCBC 88   8729 s.data(), s.size(), dn); 88   8735 s.data(), s.size(), dn);
89   } 89   }
90   90  
91   } // urls 91   } // urls
92   } // boost 92   } // boost
93   93