diff options
author | Dan Goodliffe <dan@randomdan.homeip.net> | 2023-07-29 20:23:52 +0100 |
---|---|---|
committer | Dan Goodliffe <dan@randomdan.homeip.net> | 2023-07-29 20:23:52 +0100 |
commit | 0ce1db948b15a9ff274135ebf9c31a4a8cc7b98f (patch) | |
tree | 4c9a915145e9b4d8c3c3fad5d1ce2108262a2673 | |
parent | Simplified convert interface (diff) | |
download | icespider-0ce1db948b15a9ff274135ebf9c31a4a8cc7b98f.tar.bz2 icespider-0ce1db948b15a9ff274135ebf9c31a4a8cc7b98f.tar.xz icespider-0ce1db948b15a9ff274135ebf9c31a4a8cc7b98f.zip |
Append chunks of plain data in urldecode
-rw-r--r-- | icespider/core/xwwwFormUrlEncoded.cpp | 44 |
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; } |