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;  	}  | 
