summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Goodliffe <dan@randomdan.homeip.net>2023-07-29 20:23:52 +0100
committerDan Goodliffe <dan@randomdan.homeip.net>2023-07-29 20:23:52 +0100
commit0ce1db948b15a9ff274135ebf9c31a4a8cc7b98f (patch)
tree4c9a915145e9b4d8c3c3fad5d1ce2108262a2673
parentSimplified convert interface (diff)
downloadicespider-0ce1db948b15a9ff274135ebf9c31a4a8cc7b98f.tar.bz2
icespider-0ce1db948b15a9ff274135ebf9c31a4a8cc7b98f.tar.xz
icespider-0ce1db948b15a9ff274135ebf9c31a4a8cc7b98f.zip
Append chunks of plain data in urldecode
-rw-r--r--icespider/core/xwwwFormUrlEncoded.cpp44
1 files changed, 26 insertions, 18 deletions
diff --git a/icespider/core/xwwwFormUrlEncoded.cpp b/icespider/core/xwwwFormUrlEncoded.cpp
index d5b8388..fb8f7ad 100644
--- a/icespider/core/xwwwFormUrlEncoded.cpp
+++ b/icespider/core/xwwwFormUrlEncoded.cpp
@@ -238,29 +238,37 @@ namespace IceSpider {
MaybeString
XWwwFormUrlEncoded::urldecode(std::string_view::const_iterator i, std::string_view::const_iterator e)
{
- if (std::find_first_of(i, e, URL_ESCAPES.begin(), URL_ESCAPES.end()) == e) {
+ const auto getNext = [e, &i] {
+ return std::find_first_of(i, e, URL_ESCAPES.begin(), URL_ESCAPES.end());
+ };
+ auto next = getNext();
+ if (next == e) {
return std::string_view {i, e};
}
std::string t;
t.reserve(static_cast<std::string::size_type>(std::distance(i, e)));
- while (i != e) {
- switch (*i) {
- case '+':
- t += ' ';
- break;
- case '%':
- if (const auto ch = hexin[static_cast<uint8_t>(*(i + 1))][static_cast<uint8_t>(*(i + 2))]) {
- t += ch;
- }
- else {
- throw Http400_BadRequest();
- }
- i += 2;
- break;
- default:
- t += *i;
+ for (; i != e; next = getNext()) {
+ if (next != i) {
+ t.append(i, next);
+ i = next;
+ }
+ else {
+ switch (*i) {
+ case '+':
+ t += ' ';
+ ++i;
+ break;
+ case '%':
+ if (const auto ch = hexin[static_cast<uint8_t>(*(i + 1))][static_cast<uint8_t>(*(i + 2))]) {
+ t += ch;
+ }
+ else {
+ throw Http400_BadRequest();
+ }
+ i += 3;
+ break;
+ }
}
- ++i;
}
return t;
}