| 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 |=
|
|
|