/root/bitcoin/src/common/url.cpp
Line | Count | Source |
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 | } |