/Users/eugenesiegel/btc/bitcoin/src/common/url.cpp
| Line | Count | Source (jump to first uncovered line) | 
| 1 |  | // Copyright (c) 2015-2022 The Bitcoin Core developers | 
| 2 |  | // Distributed under the MIT software license, see the accompanying | 
| 3 |  | // file COPYING or http://www.opensource.org/licenses/mit-license.php. | 
| 4 |  |  | 
| 5 |  | #include <common/url.h> | 
| 6 |  |  | 
| 7 |  | #include <charconv> | 
| 8 |  | #include <string> | 
| 9 |  | #include <string_view> | 
| 10 |  | #include <system_error> | 
| 11 |  |  | 
| 12 |  | std::string UrlDecode(std::string_view url_encoded) | 
| 13 | 0 | { | 
| 14 | 0 |     std::string res; | 
| 15 | 0 |     res.reserve(url_encoded.size()); | 
| 16 |  | 
 | 
| 17 | 0 |     for (size_t i = 0; i < url_encoded.size(); ++i) { | 
| 18 | 0 |         char c = url_encoded[i]; | 
| 19 |  |         // Special handling for percent which should be followed by two hex digits | 
| 20 |  |         // representing an octet values, see RFC 3986, Section 2.1 Percent-Encoding | 
| 21 | 0 |         if (c == '%' && i + 2 < url_encoded.size()) { | 
| 22 | 0 |             unsigned int decoded_value{0}; | 
| 23 | 0 |             auto [p, ec] = std::from_chars(url_encoded.data() + i + 1, url_encoded.data() + i + 3, decoded_value, 16); | 
| 24 |  |  | 
| 25 |  |             // Only if there is no error and the pointer is set to the end of | 
| 26 |  |             // the string, we can be sure both characters were valid hex | 
| 27 | 0 |             if (ec == std::errc{} && p == url_encoded.data() + i + 3) { | 
| 28 | 0 |                 res += static_cast<char>(decoded_value); | 
| 29 |  |                 // Next two characters are part of the percent encoding | 
| 30 | 0 |                 i += 2; | 
| 31 | 0 |                 continue; | 
| 32 | 0 |             } | 
| 33 |  |             // In case of invalid percent encoding, add the '%' and continue | 
| 34 | 0 |         } | 
| 35 | 0 |         res += c; | 
| 36 | 0 |     } | 
| 37 |  | 
 | 
| 38 | 0 |     return res; | 
| 39 | 0 | } |