summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorbattre@chromium.org <battre@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-05-13 11:05:15 +0000
committerbattre@chromium.org <battre@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-05-13 11:05:15 +0000
commit783573b8fb2326144387e6198a5c76ec4b449aea (patch)
tree9bd2400c709a83156eebdd578de3efa830b50756
parent40d1ad6e65a61be12f82f0ad9a1710b353e5c60b (diff)
downloadchromium_src-783573b8fb2326144387e6198a5c76ec4b449aea.zip
chromium_src-783573b8fb2326144387e6198a5c76ec4b449aea.tar.gz
chromium_src-783573b8fb2326144387e6198a5c76ec4b449aea.tar.bz2
Implemented RequestHeaders field in extraInfoSpec of webRequest API
BUG=60101 TEST=no Review URL: http://codereview.chromium.org/6931055 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@85260 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--chrome/browser/extensions/extension_webrequest_api.cc35
-rw-r--r--chrome/browser/extensions/extension_webrequest_api.h3
-rw-r--r--chrome/browser/net/chrome_network_delegate.cc5
-rw-r--r--chrome/browser/net/chrome_network_delegate.h3
-rw-r--r--chrome/common/extensions/api/extension_api.json3
-rw-r--r--chrome/common/extensions/docs/experimental.webRequest.html68
-rw-r--r--chrome/test/data/extensions/api_test/webrequest/events/test.html8
-rw-r--r--net/base/network_delegate.cc5
-rw-r--r--net/base/network_delegate.h7
-rw-r--r--net/http/http_network_transaction.cc2
-rw-r--r--net/proxy/network_delegate_error_observer_unittest.cc3
-rw-r--r--net/url_request/url_request_test_util.cc3
-rw-r--r--net/url_request/url_request_test_util.h3
13 files changed, 119 insertions, 29 deletions
diff --git a/chrome/browser/extensions/extension_webrequest_api.cc b/chrome/browser/extensions/extension_webrequest_api.cc
index df62282..63ddd3e 100644
--- a/chrome/browser/extensions/extension_webrequest_api.cc
+++ b/chrome/browser/extensions/extension_webrequest_api.cc
@@ -139,7 +139,7 @@ void EventHandledOnIOThread(
// Creates a list of HttpHeaders (see extension_api.json). If |headers| is
// NULL, the list is empty. Ownership is passed to the caller.
-ListValue* GetResponseHeadersList(net::HttpResponseHeaders* headers) {
+ListValue* GetResponseHeadersList(const net::HttpResponseHeaders* headers) {
ListValue* headers_value = new ListValue();
if (headers) {
void* iter = NULL;
@@ -155,6 +155,19 @@ ListValue* GetResponseHeadersList(net::HttpResponseHeaders* headers) {
return headers_value;
}
+ListValue* GetRequestHeadersList(const net::HttpRequestHeaders* headers) {
+ ListValue* headers_value = new ListValue();
+ if (headers) {
+ for (net::HttpRequestHeaders::Iterator it(*headers); it.GetNext(); ) {
+ DictionaryValue* header = new DictionaryValue();
+ header->SetString(keys::kHeaderNameKey, it.name());
+ header->SetString(keys::kHeaderValueKey, it.name());
+ headers_value->Append(header);
+ }
+ }
+ return headers_value;
+}
+
// Creates a StringValue with the status line of |headers|. If |headers| is
// NULL, an empty string is returned. Ownership is passed to the caller.
StringValue* GetStatusLine(net::HttpResponseHeaders* headers) {
@@ -414,16 +427,9 @@ int ExtensionWebRequestEventRouter::OnBeforeSendHeaders(
dict->SetString(keys::kUrlKey, request->url().spec());
dict->SetDouble(keys::kTimeStampKey, base::Time::Now().ToDoubleT() * 1000);
- if (extra_info_spec & ExtraInfoSpec::REQUEST_HEADERS) {
- ListValue* headers_value = new ListValue();
- for (net::HttpRequestHeaders::Iterator it(*headers); it.GetNext(); ) {
- DictionaryValue* header = new DictionaryValue();
- header->SetString(keys::kHeaderNameKey, it.name());
- header->SetString(keys::kHeaderValueKey, it.name());
- headers_value->Append(header);
- }
- dict->Set(keys::kRequestHeadersKey, headers_value);
- }
+ if (extra_info_spec & ExtraInfoSpec::REQUEST_HEADERS)
+ dict->Set(keys::kRequestHeadersKey, GetRequestHeadersList(headers));
+ // TODO(battre): implement request line.
args.Append(dict);
@@ -440,7 +446,8 @@ void ExtensionWebRequestEventRouter::OnRequestSent(
ProfileId profile_id,
ExtensionEventRouterForwarder* event_router,
uint64 request_id,
- const net::HostPortPair& socket_address) {
+ const net::HostPortPair& socket_address,
+ const net::HttpRequestHeaders& headers) {
if (profile_id == Profile::kInvalidProfileId)
return;
base::Time time(base::Time::Now());
@@ -470,7 +477,9 @@ void ExtensionWebRequestEventRouter::OnRequestSent(
dict->SetString(keys::kUrlKey, request->url().spec());
dict->SetString(keys::kIpKey, socket_address.host());
dict->SetDouble(keys::kTimeStampKey, time.ToDoubleT() * 1000);
- // TODO(battre): support "request line" and "request headers".
+ if (extra_info_spec & ExtraInfoSpec::REQUEST_HEADERS)
+ dict->Set(keys::kRequestHeadersKey, GetRequestHeadersList(&headers));
+ // TODO(battre): support "request line".
args.Append(dict);
DispatchEvent(profile_id, event_router, request, listeners, args);
diff --git a/chrome/browser/extensions/extension_webrequest_api.h b/chrome/browser/extensions/extension_webrequest_api.h
index 4afe531..3c83a5e 100644
--- a/chrome/browser/extensions/extension_webrequest_api.h
+++ b/chrome/browser/extensions/extension_webrequest_api.h
@@ -129,7 +129,8 @@ class ExtensionWebRequestEventRouter {
void OnRequestSent(ProfileId profile_id,
ExtensionEventRouterForwarder* event_router,
uint64 request_id,
- const net::HostPortPair& socket_address);
+ const net::HostPortPair& socket_address,
+ const net::HttpRequestHeaders& headers);
// Dispatches the onBeforeRedirect event. This is fired for HTTP(s) requests
// only.
diff --git a/chrome/browser/net/chrome_network_delegate.cc b/chrome/browser/net/chrome_network_delegate.cc
index 6d8a542..ee3afad 100644
--- a/chrome/browser/net/chrome_network_delegate.cc
+++ b/chrome/browser/net/chrome_network_delegate.cc
@@ -82,9 +82,10 @@ int ChromeNetworkDelegate::OnBeforeSendHeaders(
void ChromeNetworkDelegate::OnRequestSent(
uint64 request_id,
- const net::HostPortPair& socket_address) {
+ const net::HostPortPair& socket_address,
+ const net::HttpRequestHeaders& headers) {
ExtensionWebRequestEventRouter::GetInstance()->OnRequestSent(
- profile_id_, event_router_.get(), request_id, socket_address);
+ profile_id_, event_router_.get(), request_id, socket_address, headers);
}
void ChromeNetworkDelegate::OnBeforeRedirect(net::URLRequest* request,
diff --git a/chrome/browser/net/chrome_network_delegate.h b/chrome/browser/net/chrome_network_delegate.h
index a26bc31..aa556de 100644
--- a/chrome/browser/net/chrome_network_delegate.h
+++ b/chrome/browser/net/chrome_network_delegate.h
@@ -46,7 +46,8 @@ class ChromeNetworkDelegate : public net::NetworkDelegate {
net::CompletionCallback* callback,
net::HttpRequestHeaders* headers);
virtual void OnRequestSent(uint64 request_id,
- const net::HostPortPair& socket_address);
+ const net::HostPortPair& socket_address,
+ const net::HttpRequestHeaders& headers);
virtual void OnBeforeRedirect(net::URLRequest* request,
const GURL& new_location);
virtual void OnResponseStarted(net::URLRequest* request);
diff --git a/chrome/common/extensions/api/extension_api.json b/chrome/common/extensions/api/extension_api.json
index 36d28b4..cdaf051 100644
--- a/chrome/common/extensions/api/extension_api.json
+++ b/chrome/common/extensions/api/extension_api.json
@@ -3853,7 +3853,8 @@
"requestId": {"type": "string", "description": "The ID of the request."},
"url": {"type": "string"},
"ip": {"type": "string", "description": "The server IP address that is actually connected to. Note that it may be a literal IPv6 address."},
- "timeStamp": {"type": "number", "description": "The time when the browser finished sending the request, in milliseconds since the epoch."}
+ "timeStamp": {"type": "number", "description": "The time when the browser finished sending the request, in milliseconds since the epoch."},
+ "requestHeaders": {"$ref": "HttpHeaders", "optional": true, "description": "The HTTP request headers that have been sent out with this request."}
}
}
],
diff --git a/chrome/common/extensions/docs/experimental.webRequest.html b/chrome/common/extensions/docs/experimental.webRequest.html
index 27155f3..709ec15 100644
--- a/chrome/common/extensions/docs/experimental.webRequest.html
+++ b/chrome/common/extensions/docs/experimental.webRequest.html
@@ -4018,6 +4018,74 @@ unexpected results.
</dd>
</div>
+ </div><div>
+ <div>
+ <dt>
+ <var>requestHeaders</var>
+ <em>
+
+ <!-- TYPE -->
+ <div style="display:inline">
+ (
+ <span class="optional">optional</span>
+ <span class="enum" style="display: none; ">enumerated</span>
+ <span id="typeTemplate">
+ <span>
+ <a href="experimental.webRequest.html#type-HttpHeaders">HttpHeaders</a>
+ </span>
+ <span style="display: none; ">
+ <span>
+ array of <span><span></span></span>
+ </span>
+ <span>paramType</span>
+ <span></span>
+ </span>
+ </span>
+ )
+ </div>
+
+ </em>
+ </dt>
+ <dd class="todo" style="display: none; ">
+ Undocumented.
+ </dd>
+ <dd>The HTTP request headers that have been sent out with this request.</dd>
+ <dd style="display: none; ">
+ This parameter was added in version
+ <b><span></span></b>.
+ You must omit this parameter in earlier versions,
+ and you may omit it in any version. If you require this
+ parameter, the manifest key
+ <a href="manifest.html#minimum_chrome_version">minimum_chrome_version</a>
+ can ensure that your extension won't be run in an earlier browser version.
+ </dd>
+
+ <!-- OBJECT PROPERTIES -->
+ <dd style="display: none; ">
+ <dl>
+ <div>
+ <div>
+ </div>
+ </div>
+ </dl>
+ </dd>
+
+ <!-- OBJECT METHODS -->
+ <dd style="display: none; ">
+ <div></div>
+ </dd>
+
+ <!-- OBJECT EVENT FIELDS -->
+ <dd style="display: none; ">
+ <div></div>
+ </dd>
+
+ <!-- FUNCTION PARAMETERS -->
+ <dd style="display: none; ">
+ <div></div>
+ </dd>
+
+ </div>
</div>
</dl>
</dd>
diff --git a/chrome/test/data/extensions/api_test/webrequest/events/test.html b/chrome/test/data/extensions/api_test/webrequest/events/test.html
index 6f04e4d..b286f01 100644
--- a/chrome/test/data/extensions/api_test/webrequest/events/test.html
+++ b/chrome/test/data/extensions/api_test/webrequest/events/test.html
@@ -173,7 +173,7 @@ function initListeners(filter, extraInfoSpec) {
chrome.experimental.webRequest.onRequestSent.addListener(
function(details) {
return captureEvent("onRequestSent", details);
- }, filter);
+ }, filter, intersect(extraInfoSpec, ["requestHeaders"]));
chrome.experimental.webRequest.onResponseStarted.addListener(
function(details) {
return captureEvent("onResponseStarted", details);
@@ -270,7 +270,8 @@ runTests([
event: "onRequestSent",
details: {
url: URL_HTTP_SIMPLE_LOAD_REDIRECT,
- ip: "127.0.0.1"
+ ip: "127.0.0.1",
+ requestHeadersExist: true
}
},
{ label: "onBeforeRedirect",
@@ -303,7 +304,8 @@ runTests([
event: "onRequestSent",
details: {
url: URL_HTTP_SIMPLE_LOAD,
- ip: "127.0.0.1"
+ ip: "127.0.0.1",
+ requestHeadersExist: true
}
},
{ label: "onResponseStarted",
diff --git a/net/base/network_delegate.cc b/net/base/network_delegate.cc
index f9165728..d895667 100644
--- a/net/base/network_delegate.cc
+++ b/net/base/network_delegate.cc
@@ -28,9 +28,10 @@ int NetworkDelegate::NotifyBeforeSendHeaders(uint64 request_id,
void NetworkDelegate::NotifyRequestSent(
uint64 request_id,
- const HostPortPair& socket_address) {
+ const HostPortPair& socket_address,
+ const HttpRequestHeaders& headers) {
DCHECK(CalledOnValidThread());
- OnRequestSent(request_id, socket_address);
+ OnRequestSent(request_id, socket_address, headers);
}
void NetworkDelegate::NotifyResponseStarted(URLRequest* request) {
diff --git a/net/base/network_delegate.h b/net/base/network_delegate.h
index f0f3325..ce913e9 100644
--- a/net/base/network_delegate.h
+++ b/net/base/network_delegate.h
@@ -43,7 +43,9 @@ class NetworkDelegate : public base::NonThreadSafe {
int NotifyBeforeSendHeaders(uint64 request_id,
CompletionCallback* callback,
HttpRequestHeaders* headers);
- void NotifyRequestSent(uint64 request_id, const HostPortPair& socket_address);
+ void NotifyRequestSent(uint64 request_id,
+ const HostPortPair& socket_address,
+ const HttpRequestHeaders& headers);
void NotifyBeforeRedirect(URLRequest* request,
const GURL& new_location);
void NotifyResponseStarted(URLRequest* request);
@@ -86,7 +88,8 @@ class NetworkDelegate : public base::NonThreadSafe {
// Called right after the HTTP headers have been sent and notifies where
// the request has actually been sent to.
virtual void OnRequestSent(uint64 request_id,
- const HostPortPair& socket_address) = 0;
+ const HostPortPair& socket_address,
+ const HttpRequestHeaders& headers) = 0;
// Called right after a redirect response code was received.
virtual void OnBeforeRedirect(URLRequest* request,
diff --git a/net/http/http_network_transaction.cc b/net/http/http_network_transaction.cc
index f298679..9054346 100644
--- a/net/http/http_network_transaction.cc
+++ b/net/http/http_network_transaction.cc
@@ -794,7 +794,7 @@ int HttpNetworkTransaction::DoSendRequest() {
int HttpNetworkTransaction::DoSendRequestComplete(int result) {
if (session_->network_delegate()) {
session_->network_delegate()->NotifyRequestSent(
- request_->request_id, response_.socket_address);
+ request_->request_id, response_.socket_address, request_headers_);
}
if (result < 0)
diff --git a/net/proxy/network_delegate_error_observer_unittest.cc b/net/proxy/network_delegate_error_observer_unittest.cc
index b5f09c6..f76f2d0 100644
--- a/net/proxy/network_delegate_error_observer_unittest.cc
+++ b/net/proxy/network_delegate_error_observer_unittest.cc
@@ -35,7 +35,8 @@ class TestNetworkDelegate : public net::NetworkDelegate {
return net::OK;
}
virtual void OnRequestSent(uint64 request_id,
- const HostPortPair& socket_address) {}
+ const HostPortPair& socket_address,
+ const HttpRequestHeaders& headers) {}
virtual void OnBeforeRedirect(URLRequest* request,
const GURL& new_location) {}
virtual void OnResponseStarted(URLRequest* request) {}
diff --git a/net/url_request/url_request_test_util.cc b/net/url_request/url_request_test_util.cc
index 4f4fa65..680f12d 100644
--- a/net/url_request/url_request_test_util.cc
+++ b/net/url_request/url_request_test_util.cc
@@ -262,7 +262,8 @@ int TestNetworkDelegate::OnBeforeSendHeaders(
void TestNetworkDelegate::OnRequestSent(
uint64 request_id,
- const net::HostPortPair& socket_address) {
+ const net::HostPortPair& socket_address,
+ const net::HttpRequestHeaders& headers) {
}
void TestNetworkDelegate::OnBeforeRedirect(net::URLRequest* request,
diff --git a/net/url_request/url_request_test_util.h b/net/url_request/url_request_test_util.h
index 777d060..c4371c7 100644
--- a/net/url_request/url_request_test_util.h
+++ b/net/url_request/url_request_test_util.h
@@ -189,7 +189,8 @@ class TestNetworkDelegate : public net::NetworkDelegate {
net::CompletionCallback* callback,
net::HttpRequestHeaders* headers);
virtual void OnRequestSent(uint64 request_id,
- const net::HostPortPair& socket_address);
+ const net::HostPortPair& socket_address,
+ const net::HttpRequestHeaders& headers);
virtual void OnBeforeRedirect(net::URLRequest* request,
const GURL& new_location);
virtual void OnResponseStarted(net::URLRequest* request);