From 0ce1db948b15a9ff274135ebf9c31a4a8cc7b98f Mon Sep 17 00:00:00 2001 From: Dan Goodliffe Date: Sat, 29 Jul 2023 20:23:52 +0100 Subject: Append chunks of plain data in urldecode --- icespider/core/xwwwFormUrlEncoded.cpp | 44 +++++++++++++++++++++-------------- 1 file 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::distance(i, e))); - while (i != e) { - switch (*i) { - case '+': - t += ' '; - break; - case '%': - if (const auto ch = hexin[static_cast(*(i + 1))][static_cast(*(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(*(i + 1))][static_cast(*(i + 2))]) { + t += ch; + } + else { + throw Http400_BadRequest(); + } + i += 3; + break; + } } - ++i; } return t; } -- cgit v1.2.3