src: Faster percent encode/deocde
This commit is contained in:
parent
98253b1d0d
commit
6d8fe72174
20
src/util.cc
20
src/util.cc
|
@ -131,20 +131,24 @@ bool in_attr_char(char c) {
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string percent_encode_token(const std::string &target) {
|
std::string percent_encode_token(const std::string &target) {
|
||||||
auto len = target.size();
|
|
||||||
std::string dest;
|
std::string dest;
|
||||||
|
|
||||||
for (size_t i = 0; i < len; ++i) {
|
dest.resize(target.size() * 3);
|
||||||
unsigned char c = target[i];
|
auto p = std::begin(dest);
|
||||||
|
|
||||||
|
for (auto first = std::begin(target); first != std::end(target); ++first) {
|
||||||
|
uint8_t c = *first;
|
||||||
|
|
||||||
if (c != '%' && in_token(c)) {
|
if (c != '%' && in_token(c)) {
|
||||||
dest += c;
|
*p++ = c;
|
||||||
} else {
|
continue;
|
||||||
dest += '%';
|
|
||||||
dest += UPPER_XDIGITS[c >> 4];
|
|
||||||
dest += UPPER_XDIGITS[(c & 0x0f)];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
*p++ = '%';
|
||||||
|
*p++ = UPPER_XDIGITS[c >> 4];
|
||||||
|
*p++ = UPPER_XDIGITS[(c & 0x0f)];
|
||||||
}
|
}
|
||||||
|
dest.resize(p - std::begin(dest));
|
||||||
return dest;
|
return dest;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
23
src/util.h
23
src/util.h
|
@ -98,19 +98,24 @@ std::string percent_encode_path(const std::string &s);
|
||||||
template <typename InputIt>
|
template <typename InputIt>
|
||||||
std::string percent_decode(InputIt first, InputIt last) {
|
std::string percent_decode(InputIt first, InputIt last) {
|
||||||
std::string result;
|
std::string result;
|
||||||
|
result.resize(last - first);
|
||||||
|
auto p = std::begin(result);
|
||||||
for (; first != last; ++first) {
|
for (; first != last; ++first) {
|
||||||
if (*first == '%') {
|
if (*first != '%') {
|
||||||
if (first + 1 != last && first + 2 != last &&
|
*p++ = *first;
|
||||||
is_hex_digit(*(first + 1)) && is_hex_digit(*(first + 2))) {
|
|
||||||
result += (hex_to_uint(*(first + 1)) << 4) + hex_to_uint(*(first + 2));
|
|
||||||
first += 2;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
result += *first;
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
result += *first;
|
|
||||||
|
if (first + 1 != last && first + 2 != last && is_hex_digit(*(first + 1)) &&
|
||||||
|
is_hex_digit(*(first + 2))) {
|
||||||
|
*p++ = (hex_to_uint(*(first + 1)) << 4) + hex_to_uint(*(first + 2));
|
||||||
|
first += 2;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
*p++ = *first;
|
||||||
}
|
}
|
||||||
|
result.resize(p - std::begin(result));
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue