Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1459)

Unified Diff: chrome/browser/extensions/api/web_request/web_request_api.cc

Issue 10694055: Add read-only access to POST data for webRequest's onBeforeRequest (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Typo fixed Created 8 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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 |=

Powered by Google App Engine
This is Rietveld 408576698