/// <summary> /// Parses the given Content-Type header value to get out actual content type and charset. /// If the charset isn't specified the default charset for the content type will be set. /// </summary> static void parse_content_type_and_charset(const utility::string_t& content_type, utility::string_t& content, utility::string_t& charset) { const size_t semi_colon_index = content_type.find_first_of(_XPLATSTR(";")); // No charset specified. if (semi_colon_index == utility::string_t::npos) { content = content_type; trim_whitespace(content); charset = get_default_charset(content); return; } // Split into content type and second part which could be charset. content = content_type.substr(0, semi_colon_index); trim_whitespace(content); utility::string_t possible_charset = content_type.substr(semi_colon_index + 1); trim_whitespace(possible_charset); const size_t equals_index = possible_charset.find_first_of(_XPLATSTR("=")); // No charset specified. if (equals_index == utility::string_t::npos) { charset = get_default_charset(content); return; } // Split and make sure 'charset' utility::string_t charset_key = possible_charset.substr(0, equals_index); trim_whitespace(charset_key); if (!utility::details::str_iequal(charset_key, _XPLATSTR("charset"))) { charset = get_default_charset(content); return; } charset = possible_charset.substr(equals_index + 1); // Remove the redundant ';' at the end of charset. while (charset.back() == ';') { charset.pop_back(); } trim_whitespace(charset); if (charset.front() == _XPLATSTR('"') && charset.back() == _XPLATSTR('"')) { charset = charset.substr(1, charset.size() - 2); trim_whitespace(charset); } }
std::map<utility::string_t, utility::string_t> uri::split_query(const utility::string_t &query) { std::map<utility::string_t, utility::string_t> results; // Split into key value pairs separated by '&'. size_t prev_amp_index = 0; while(prev_amp_index != utility::string_t::npos) { size_t amp_index = query.find_first_of(_XPLATSTR('&'), prev_amp_index); if (amp_index == utility::string_t::npos) amp_index = query.find_first_of(_XPLATSTR(';'), prev_amp_index); utility::string_t key_value_pair = query.substr( prev_amp_index, amp_index == utility::string_t::npos ? query.size() - prev_amp_index : amp_index - prev_amp_index); prev_amp_index = amp_index == utility::string_t::npos ? utility::string_t::npos : amp_index + 1; size_t equals_index = key_value_pair.find_first_of(_XPLATSTR('=')); if(equals_index == utility::string_t::npos) { continue; } else if (equals_index == 0) { utility::string_t value(key_value_pair.begin() + equals_index + 1, key_value_pair.end()); results[_XPLATSTR("")] = value; } else { utility::string_t key(key_value_pair.begin(), key_value_pair.begin() + equals_index); utility::string_t value(key_value_pair.begin() + equals_index + 1, key_value_pair.end()); results[key] = value; } } return results; }