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

Side by Side 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: Comments addressed, unit tests split 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 unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/extensions/api/web_request/web_request_api.h" 5 #include "chrome/browser/extensions/api/web_request/web_request_api.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/json/json_writer.h" 10 #include "base/json/json_writer.h"
11 #include "base/metrics/histogram.h" 11 #include "base/metrics/histogram.h"
12 #include "base/string_number_conversions.h" 12 #include "base/string_number_conversions.h"
13 #include "base/string_util.h" 13 #include "base/string_util.h"
14 #include "base/time.h" 14 #include "base/time.h"
15 #include "base/utf_string_conversions.h" 15 #include "base/utf_string_conversions.h"
16 #include "base/values.h" 16 #include "base/values.h"
17 #include "chrome/browser/browser_process.h" 17 #include "chrome/browser/browser_process.h"
18 #include "chrome/browser/chrome_content_browser_client.h" 18 #include "chrome/browser/chrome_content_browser_client.h"
19 #include "chrome/browser/extensions/api/declarative_webrequest/webrequest_rule.h " 19 #include "chrome/browser/extensions/api/declarative_webrequest/webrequest_rule.h "
20 #include "chrome/browser/extensions/api/declarative_webrequest/webrequest_rules_ registry.h" 20 #include "chrome/browser/extensions/api/declarative_webrequest/webrequest_rules_ registry.h"
21 #include "chrome/browser/extensions/api/web_request/post_data_parser.h"
21 #include "chrome/browser/extensions/api/web_request/web_request_api_constants.h" 22 #include "chrome/browser/extensions/api/web_request/web_request_api_constants.h"
22 #include "chrome/browser/extensions/api/web_request/web_request_api_helpers.h" 23 #include "chrome/browser/extensions/api/web_request/web_request_api_helpers.h"
23 #include "chrome/browser/extensions/api/web_request/web_request_time_tracker.h" 24 #include "chrome/browser/extensions/api/web_request/web_request_time_tracker.h"
24 #include "chrome/browser/extensions/extension_event_router.h" 25 #include "chrome/browser/extensions/extension_event_router.h"
25 #include "chrome/browser/extensions/extension_info_map.h" 26 #include "chrome/browser/extensions/extension_info_map.h"
26 #include "chrome/browser/extensions/extension_prefs.h" 27 #include "chrome/browser/extensions/extension_prefs.h"
27 #include "chrome/browser/extensions/extension_service.h" 28 #include "chrome/browser/extensions/extension_service.h"
28 #include "chrome/browser/extensions/extension_tab_id_map.h" 29 #include "chrome/browser/extensions/extension_tab_id_map.h"
29 #include "chrome/browser/profiles/profile.h" 30 #include "chrome/browser/profiles/profile.h"
30 #include "chrome/browser/profiles/profile_manager.h" 31 #include "chrome/browser/profiles/profile_manager.h"
31 #include "chrome/browser/renderer_host/chrome_render_message_filter.h" 32 #include "chrome/browser/renderer_host/chrome_render_message_filter.h"
32 #include "chrome/browser/renderer_host/web_cache_manager.h" 33 #include "chrome/browser/renderer_host/web_cache_manager.h"
33 #include "chrome/common/extensions/extension.h" 34 #include "chrome/common/extensions/extension.h"
34 #include "chrome/common/extensions/extension_constants.h" 35 #include "chrome/common/extensions/extension_constants.h"
35 #include "chrome/common/extensions/extension_error_utils.h" 36 #include "chrome/common/extensions/extension_error_utils.h"
36 #include "chrome/common/extensions/extension_messages.h" 37 #include "chrome/common/extensions/extension_messages.h"
37 #include "chrome/common/extensions/url_pattern.h" 38 #include "chrome/common/extensions/url_pattern.h"
38 #include "chrome/common/url_constants.h" 39 #include "chrome/common/url_constants.h"
39 #include "content/public/browser/browser_message_filter.h" 40 #include "content/public/browser/browser_message_filter.h"
40 #include "content/public/browser/browser_thread.h" 41 #include "content/public/browser/browser_thread.h"
41 #include "content/public/browser/render_process_host.h" 42 #include "content/public/browser/render_process_host.h"
42 #include "content/public/browser/resource_request_info.h" 43 #include "content/public/browser/resource_request_info.h"
43 #include "googleurl/src/gurl.h" 44 #include "googleurl/src/gurl.h"
44 #include "grit/generated_resources.h" 45 #include "grit/generated_resources.h"
45 #include "net/base/auth.h" 46 #include "net/base/auth.h"
46 #include "net/base/net_errors.h" 47 #include "net/base/net_errors.h"
48 #include "net/base/upload_data.h"
47 #include "net/http/http_response_headers.h" 49 #include "net/http/http_response_headers.h"
48 #include "net/url_request/url_request.h" 50 #include "net/url_request/url_request.h"
49 #include "ui/base/l10n/l10n_util.h" 51 #include "ui/base/l10n/l10n_util.h"
50 52
51 using content::BrowserMessageFilter; 53 using content::BrowserMessageFilter;
52 using content::BrowserThread; 54 using content::BrowserThread;
53 using content::ResourceRequestInfo; 55 using content::ResourceRequestInfo;
54 using extensions::Extension; 56 using extensions::Extension;
55 57
56 namespace helpers = extension_web_request_api_helpers; 58 namespace helpers = extension_web_request_api_helpers;
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after
162 base::Uint64ToString(request->identifier())); 164 base::Uint64ToString(request->identifier()));
163 out->SetString(keys::kUrlKey, request->url().spec()); 165 out->SetString(keys::kUrlKey, request->url().spec());
164 out->SetString(keys::kMethodKey, request->method()); 166 out->SetString(keys::kMethodKey, request->method());
165 out->SetInteger(keys::kFrameIdKey, frame_id_for_extension); 167 out->SetInteger(keys::kFrameIdKey, frame_id_for_extension);
166 out->SetInteger(keys::kParentFrameIdKey, parent_frame_id_for_extension); 168 out->SetInteger(keys::kParentFrameIdKey, parent_frame_id_for_extension);
167 out->SetInteger(keys::kTabIdKey, tab_id); 169 out->SetInteger(keys::kTabIdKey, tab_id);
168 out->SetString(keys::kTypeKey, helpers::ResourceTypeToString(resource_type)); 170 out->SetString(keys::kTypeKey, helpers::ResourceTypeToString(resource_type));
169 out->SetDouble(keys::kTimeStampKey, base::Time::Now().ToDoubleT() * 1000); 171 out->SetDouble(keys::kTimeStampKey, base::Time::Now().ToDoubleT() * 1000);
170 } 172 }
171 173
174 // Takes |dictionary| of <string, list of strings> pairs, and gets the list
175 // for |key|, creating it if necessary.
176 ListValue* GetOrCreateList(DictionaryValue* dictionary,
177 const std::string& key) {
178 ListValue* list = NULL;
179 if (!dictionary->GetList(key, &list)) {
180 list = new ListValue();
181 dictionary->Set(key, list);
182 }
183 return list;
184 }
185
186 // Extracts the POST data from |request| and writes the data into |out|.
187 // This can be expensive, so it's separated from ExtractRequestInfo().
188 // Contract: request->method() == "POST"
189 void ExtractRequestInfoPost(net::URLRequest* request, DictionaryValue* out) {
190 const std::vector<net::UploadData::Element>* elements =
191 request->get_upload()->elements();
192 scoped_ptr<extensions::PostDataParser> parser =
193 extensions::PostDataParser::CreatePostDataParser(request);
194 if (parser.get() == NULL) {
195 // No parser means most probably unsupported form encoding.
196 return;
197 }
198 scoped_ptr<DictionaryValue> post_data(new DictionaryValue());
199 std::vector<net::UploadData::Element>::const_iterator element;
200 for (element = elements->begin(); element != elements->end(); ++element) {
201 if (element->type() != net::UploadData::TYPE_BYTES) continue;
202 if (!parser->SetSource(&(element->bytes()))) continue;
203 extensions::PostDataParser::Result result;
204 while (parser->GetNextPair(&result)) {
205 GetOrCreateList(post_data.get(), result.get_key())->Append(
206 new StringValue(result.get_val()));
207 }
208 }
209 if (parser->AllDataReadOK())
210 out->Set(keys::kPostDataKey, post_data.release());
211 }
212
172 // Converts a HttpHeaders dictionary to a |name|, |value| pair. Returns 213 // Converts a HttpHeaders dictionary to a |name|, |value| pair. Returns
173 // true if successful. 214 // true if successful.
174 bool FromHeaderDictionary(const DictionaryValue* header_value, 215 bool FromHeaderDictionary(const DictionaryValue* header_value,
175 std::string* name, 216 std::string* name,
176 std::string* value) { 217 std::string* value) {
177 if (!header_value->GetString(keys::kHeaderNameKey, name)) 218 if (!header_value->GetString(keys::kHeaderNameKey, name))
178 return false; 219 return false;
179 220
180 // We require either a "value" or a "binaryValue" entry. 221 // We require either a "value" or a "binaryValue" entry.
181 if (!(header_value->HasKey(keys::kHeaderValueKey) ^ 222 if (!(header_value->HasKey(keys::kHeaderValueKey) ^
(...skipping 227 matching lines...) Expand 10 before | Expand all | Expand 10 after
409 return false; 450 return false;
410 451
411 if (str == "requestHeaders") 452 if (str == "requestHeaders")
412 *extra_info_spec |= REQUEST_HEADERS; 453 *extra_info_spec |= REQUEST_HEADERS;
413 else if (str == "responseHeaders") 454 else if (str == "responseHeaders")
414 *extra_info_spec |= RESPONSE_HEADERS; 455 *extra_info_spec |= RESPONSE_HEADERS;
415 else if (str == "blocking") 456 else if (str == "blocking")
416 *extra_info_spec |= BLOCKING; 457 *extra_info_spec |= BLOCKING;
417 else if (str == "asyncBlocking") 458 else if (str == "asyncBlocking")
418 *extra_info_spec |= ASYNC_BLOCKING; 459 *extra_info_spec |= ASYNC_BLOCKING;
460 else if (str == "requestPostData")
461 *extra_info_spec |= REQUEST_POST_DATA;
419 else 462 else
420 return false; 463 return false;
421 464
422 // BLOCKING and ASYNC_BLOCKING are mutually exclusive. 465 // BLOCKING and ASYNC_BLOCKING are mutually exclusive.
423 if ((*extra_info_spec & BLOCKING) && (*extra_info_spec & ASYNC_BLOCKING)) 466 if ((*extra_info_spec & BLOCKING) && (*extra_info_spec & ASYNC_BLOCKING))
424 return false; 467 return false;
425 } 468 }
426 return true; 469 return true;
427 } 470 }
428 471
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
493 536
494 int extra_info_spec = 0; 537 int extra_info_spec = 0;
495 std::vector<const EventListener*> listeners = 538 std::vector<const EventListener*> listeners =
496 GetMatchingListeners(profile, extension_info_map, keys::kOnBeforeRequest, 539 GetMatchingListeners(profile, extension_info_map, keys::kOnBeforeRequest,
497 request, &extra_info_spec); 540 request, &extra_info_spec);
498 if (!listeners.empty() && 541 if (!listeners.empty() &&
499 !GetAndSetSignaled(request->identifier(), kOnBeforeRequest)) { 542 !GetAndSetSignaled(request->identifier(), kOnBeforeRequest)) {
500 ListValue args; 543 ListValue args;
501 DictionaryValue* dict = new DictionaryValue(); 544 DictionaryValue* dict = new DictionaryValue();
502 ExtractRequestInfo(request, dict); 545 ExtractRequestInfo(request, dict);
546 if (extra_info_spec & ExtraInfoSpec::REQUEST_POST_DATA &&
547 request->method() == "POST")
548 ExtractRequestInfoPost(request, dict);
503 args.Append(dict); 549 args.Append(dict);
504 550
505 initialize_blocked_requests |= 551 initialize_blocked_requests |=
506 DispatchEvent(profile, request, listeners, args); 552 DispatchEvent(profile, request, listeners, args);
507 } 553 }
508 554
509 if (!initialize_blocked_requests) 555 if (!initialize_blocked_requests)
510 return net::OK; // Nobody saw a reason for modifying the request. 556 return net::OK; // Nobody saw a reason for modifying the request.
511 557
512 blocked_requests_[request->identifier()].event = kOnBeforeRequest; 558 blocked_requests_[request->identifier()].event = kOnBeforeRequest;
(...skipping 1276 matching lines...) Expand 10 before | Expand all | Expand 10 after
1789 } else if ((*it)->name().find("AdBlock") != std::string::npos) { 1835 } else if ((*it)->name().find("AdBlock") != std::string::npos) {
1790 adblock = true; 1836 adblock = true;
1791 } else { 1837 } else {
1792 other = true; 1838 other = true;
1793 } 1839 }
1794 } 1840 }
1795 } 1841 }
1796 1842
1797 host->Send(new ExtensionMsg_UsingWebRequestAPI(adblock, adblock_plus, other)); 1843 host->Send(new ExtensionMsg_UsingWebRequestAPI(adblock, adblock_plus, other));
1798 } 1844 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698