Index: trunk/src/chrome/browser/extensions/api/web_request/web_request_api_helpers.cc |
=================================================================== |
--- trunk/src/chrome/browser/extensions/api/web_request/web_request_api_helpers.cc (revision 282600) |
+++ trunk/src/chrome/browser/extensions/api/web_request/web_request_api_helpers.cc (working copy) |
@@ -34,13 +34,14 @@ |
using base::Time; |
using content::ResourceType; |
using extensions::ExtensionWarning; |
-using net::cookie_util::ParsedRequestCookie; |
-using net::cookie_util::ParsedRequestCookies; |
namespace extension_web_request_api_helpers { |
namespace { |
+// A ParsedRequestCookie consists of the key and value of the cookie. |
+typedef std::pair<base::StringPiece, base::StringPiece> ParsedRequestCookie; |
+typedef std::vector<ParsedRequestCookie> ParsedRequestCookies; |
typedef std::vector<linked_ptr<net::ParsedCookie> > ParsedResponseCookies; |
static const char* kResourceTypeStrings[] = { |
@@ -482,6 +483,67 @@ |
MergeRedirectUrlOfResponses(deltas, new_url, conflicting_extensions, net_log); |
} |
+// Assumes that |header_value| is the cookie header value of a HTTP Request |
+// following the cookie-string schema of RFC 6265, section 4.2.1, and returns |
+// cookie name/value pairs. If cookie values are presented in double quotes, |
+// these will appear in |parsed| as well. We can assume that the cookie header |
+// is written by Chromium and therefore, well-formed. |
+static void ParseRequestCookieLine( |
+ const std::string& header_value, |
+ ParsedRequestCookies* parsed_cookies) { |
+ std::string::const_iterator i = header_value.begin(); |
+ while (i != header_value.end()) { |
+ // Here we are at the beginning of a cookie. |
+ |
+ // Eat whitespace. |
+ while (i != header_value.end() && *i == ' ') ++i; |
+ if (i == header_value.end()) return; |
+ |
+ // Find cookie name. |
+ std::string::const_iterator cookie_name_beginning = i; |
+ while (i != header_value.end() && *i != '=') ++i; |
+ base::StringPiece cookie_name(cookie_name_beginning, i); |
+ |
+ // Find cookie value. |
+ base::StringPiece cookie_value; |
+ if (i != header_value.end()) { // Cookies may have no value. |
+ ++i; // Skip '='. |
+ std::string::const_iterator cookie_value_beginning = i; |
+ if (*i == '"') { |
+ ++i; // Skip '"'. |
+ while (i != header_value.end() && *i != '"') ++i; |
+ if (i == header_value.end()) return; |
+ ++i; // Skip '"'. |
+ cookie_value = base::StringPiece(cookie_value_beginning, i); |
+ // i points to character after '"', potentially a ';' |
+ } else { |
+ while (i != header_value.end() && *i != ';') ++i; |
+ cookie_value = base::StringPiece(cookie_value_beginning, i); |
+ // i points to ';' or end of string. |
+ } |
+ } |
+ parsed_cookies->push_back(make_pair(cookie_name, cookie_value)); |
+ // Eat ';' |
+ if (i != header_value.end()) ++i; |
+ } |
+} |
+ |
+// Writes all cookies of |parsed_cookies| into a HTTP Request header value |
+// that belongs to the "Cookie" header. |
+static std::string SerializeRequestCookieLine( |
+ const ParsedRequestCookies& parsed_cookies) { |
+ std::string buffer; |
+ for (ParsedRequestCookies::const_iterator i = parsed_cookies.begin(); |
+ i != parsed_cookies.end(); ++i) { |
+ if (!buffer.empty()) |
+ buffer += "; "; |
+ buffer += i->first.as_string(); |
+ if (!i->second.empty()) |
+ buffer += "=" + i->second.as_string(); |
+ } |
+ return buffer; |
+} |
+ |
static bool DoesRequestCookieMatchFilter( |
const ParsedRequestCookie& cookie, |
RequestCookie* filter) { |
@@ -619,7 +681,7 @@ |
std::string cookie_header; |
request_headers->GetHeader(net::HttpRequestHeaders::kCookie, &cookie_header); |
ParsedRequestCookies cookies; |
- net::cookie_util::ParseRequestCookieLine(cookie_header, &cookies); |
+ ParseRequestCookieLine(cookie_header, &cookies); |
// Modify cookies. |
bool modified = false; |
@@ -629,8 +691,7 @@ |
// Reassemble and store new cookie line. |
if (modified) { |
- std::string new_cookie_header = |
- net::cookie_util::SerializeRequestCookieLine(cookies); |
+ std::string new_cookie_header = SerializeRequestCookieLine(cookies); |
request_headers->SetHeader(net::HttpRequestHeaders::kCookie, |
new_cookie_header); |
} |