Index: net/base/url_util.cc |
diff --git a/net/base/url_util.cc b/net/base/url_util.cc |
index c18fd17987275bfb151c10b61e2c7c9e51181901..a7c89e9047d7cd27f5ee25bbf597efc962b94ea1 100644 |
--- a/net/base/url_util.cc |
+++ b/net/base/url_util.cc |
@@ -4,6 +4,9 @@ |
#include "net/base/url_util.h" |
+#include <utility> |
+ |
+#include "base/logging.h" |
#include "base/strings/string_piece.h" |
#include "net/base/escape.h" |
#include "url/gurl.h" |
@@ -68,30 +71,66 @@ GURL AppendOrReplaceQueryParameter(const GURL& url, |
return url.ReplaceComponents(replacements); |
} |
+QueryIterator::QueryIterator(const GURL& url) |
+ : url_(url), |
+ at_end_(!url.is_valid()) { |
+ if (!at_end_) { |
+ query_ = url.parsed_for_possibly_invalid_spec().query; |
+ Advance(); |
+ } |
+} |
+ |
+QueryIterator::~QueryIterator() { |
+} |
+ |
+std::string QueryIterator::GetKey() const { |
+ DCHECK(!at_end_); |
+ if (key_.is_nonempty()) |
+ return url_.spec().substr(key_.begin, key_.len); |
+ return std::string(); |
+} |
+ |
+std::string QueryIterator::GetValue() const { |
+ DCHECK(!at_end_); |
+ if (value_.is_nonempty()) |
+ return url_.spec().substr(value_.begin, value_.len); |
+ return std::string(); |
+} |
+ |
+const std::string& QueryIterator::GetUnescapedValue() { |
+ DCHECK(!at_end_); |
+ if (value_.is_nonempty() && unescaped_value_.empty()) { |
+ unescaped_value_ = UnescapeURLComponent( |
+ GetValue(), |
+ UnescapeRule::SPACES | |
+ UnescapeRule::URL_SPECIAL_CHARS | |
+ UnescapeRule::REPLACE_PLUS_WITH_SPACE); |
+ } |
+ return unescaped_value_; |
+} |
+ |
+bool QueryIterator::IsAtEnd() const { |
+ return at_end_; |
+} |
+ |
+void QueryIterator::Advance() { |
+ DCHECK (!at_end_); |
+ key_.reset(); |
+ value_.reset(); |
+ unescaped_value_.clear(); |
+ at_end_ = !url_parse::ExtractQueryKeyValue(url_.spec().c_str(), |
+ &query_, |
+ &key_, |
+ &value_); |
+} |
+ |
bool GetValueForKeyInQuery(const GURL& url, |
const std::string& search_key, |
std::string* out_value) { |
- if (!url.is_valid()) |
- return false; |
- |
- url_parse::Component query = url.parsed_for_possibly_invalid_spec().query; |
- url_parse::Component key, value; |
- while (url_parse::ExtractQueryKeyValue( |
- url.spec().c_str(), &query, &key, &value)) { |
- if (key.is_nonempty()) { |
- std::string key_string = url.spec().substr(key.begin, key.len); |
- if (key_string == search_key) { |
- if (value.is_nonempty()) { |
- *out_value = UnescapeURLComponent( |
- url.spec().substr(value.begin, value.len), |
- UnescapeRule::SPACES | |
- UnescapeRule::URL_SPECIAL_CHARS | |
- UnescapeRule::REPLACE_PLUS_WITH_SPACE); |
- } else { |
- *out_value = ""; |
- } |
- return true; |
- } |
+ for (QueryIterator it(url); !it.IsAtEnd(); it.Advance()) { |
+ if (it.GetKey() == search_key) { |
+ *out_value = it.GetUnescapedValue(); |
+ return true; |
} |
} |
return false; |