Index: chrome/browser/extensions/api/web_request/web_request_api.cc |
diff --git a/chrome/browser/extensions/api/web_request/web_request_api.cc b/chrome/browser/extensions/api/web_request/web_request_api.cc |
index fb5aa999aa26623cad067f5d00bcad0ea03f2eff..4bcebc13f4af8c1a8af96d959b2412589cee00eb 100644 |
--- a/chrome/browser/extensions/api/web_request/web_request_api.cc |
+++ b/chrome/browser/extensions/api/web_request/web_request_api.cc |
@@ -18,6 +18,7 @@ |
#include "chrome/browser/chrome_content_browser_client.h" |
#include "chrome/browser/extensions/api/declarative_webrequest/webrequest_rule.h" |
#include "chrome/browser/extensions/api/declarative_webrequest/webrequest_rules_registry.h" |
+#include "chrome/browser/extensions/api/web_request/post_data_parser.h" |
#include "chrome/browser/extensions/api/web_request/web_request_api_constants.h" |
#include "chrome/browser/extensions/api/web_request/web_request_api_helpers.h" |
#include "chrome/browser/extensions/api/web_request/web_request_time_tracker.h" |
@@ -44,6 +45,7 @@ |
#include "grit/generated_resources.h" |
#include "net/base/auth.h" |
#include "net/base/net_errors.h" |
+#include "net/base/upload_data.h" |
#include "net/http/http_response_headers.h" |
#include "net/url_request/url_request.h" |
#include "ui/base/l10n/l10n_util.h" |
@@ -169,6 +171,45 @@ void ExtractRequestInfo(net::URLRequest* request, DictionaryValue* out) { |
out->SetDouble(keys::kTimeStampKey, base::Time::Now().ToDoubleT() * 1000); |
} |
+// Takes |dictionary| of <string, list of strings> pairs, and gets the list |
+// for |key|, creating it if necessary. |
+ListValue* GetOrCreateList(DictionaryValue* dictionary, |
+ const std::string& key) { |
+ ListValue* list = NULL; |
+ if (!dictionary->GetList(key, &list)) { |
+ list = new ListValue(); |
+ dictionary->Set(key, list); |
+ } |
+ return list; |
+} |
+ |
+// Extracts the POST data from |request| and writes the data into |out|. |
+// This can be expensive, so it's separated from ExtractRequestInfo(). |
+// Contract: request->method() == "POST" |
+void ExtractRequestInfoPost(net::URLRequest* request, DictionaryValue* out) { |
+ const std::vector<net::UploadData::Element>* elements = |
+ request->get_upload()->elements(); |
+ scoped_ptr<extensions::PostDataParser> parser = |
+ extensions::PostDataParser::CreatePostDataParser(request); |
+ if (parser.get() == NULL) { |
+ // No parser means most probably unsupported form encoding. |
+ return; |
+ } |
+ scoped_ptr<DictionaryValue> post_data(new DictionaryValue()); |
+ std::vector<net::UploadData::Element>::const_iterator element; |
+ for (element = elements->begin(); element != elements->end(); ++element) { |
+ if (element->type() != net::UploadData::TYPE_BYTES) continue; |
+ if (!parser->SetSource(&(element->bytes()))) continue; |
+ extensions::PostDataParser::Result result; |
+ while (parser->GetNextPair(&result)) { |
+ GetOrCreateList(post_data.get(), result.get_key())->Append( |
+ new StringValue(result.get_val())); |
+ } |
+ } |
+ if (parser->AllDataReadOK()) |
+ out->Set(keys::kPostDataKey, post_data.release()); |
+} |
+ |
// Converts a HttpHeaders dictionary to a |name|, |value| pair. Returns |
// true if successful. |
bool FromHeaderDictionary(const DictionaryValue* header_value, |
@@ -416,6 +457,8 @@ bool ExtensionWebRequestEventRouter::ExtraInfoSpec::InitFromValue( |
*extra_info_spec |= BLOCKING; |
else if (str == "asyncBlocking") |
*extra_info_spec |= ASYNC_BLOCKING; |
+ else if (str == "requestPostData") |
+ *extra_info_spec |= REQUEST_POST_DATA; |
else |
return false; |
@@ -500,6 +543,9 @@ int ExtensionWebRequestEventRouter::OnBeforeRequest( |
ListValue args; |
DictionaryValue* dict = new DictionaryValue(); |
ExtractRequestInfo(request, dict); |
+ if (extra_info_spec & ExtraInfoSpec::REQUEST_POST_DATA && |
+ request->method() == "POST") |
+ ExtractRequestInfoPost(request, dict); |
args.Append(dict); |
initialize_blocked_requests |= |