blob: e223828273ce51e00a80de50742123659879fc36 [file] [log] [blame]
[email protected]8202d0c2011-02-23 08:31:141// Copyright (c) 2011 The Chromium Authors. All rights reserved.
[email protected]ac039522010-06-15 16:39:442// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "chrome/browser/net/chrome_network_delegate.h"
6
7#include "base/logging.h"
[email protected]3ce02412011-03-01 12:01:158#include "chrome/browser/extensions/extension_event_router_forwarder.h"
[email protected]8202d0c2011-02-23 08:31:149#include "chrome/browser/extensions/extension_proxy_api.h"
[email protected]d05ef99c2011-02-01 21:38:1610#include "chrome/browser/extensions/extension_webrequest_api.h"
[email protected]0a8db0d2011-04-13 15:15:4011#include "chrome/browser/prefs/pref_member.h"
12#include "chrome/common/pref_names.h"
13#include "content/browser/browser_thread.h"
[email protected]82b42302011-04-20 16:28:1614#include "net/base/host_port_pair.h"
[email protected]8202d0c2011-02-23 08:31:1415#include "net/base/net_errors.h"
[email protected]ac039522010-06-15 16:39:4416#include "net/http/http_request_headers.h"
[email protected]48944382011-04-23 13:28:1617#include "net/http/http_response_headers.h"
[email protected]d05ef99c2011-02-01 21:38:1618#include "net/url_request/url_request.h"
19
20namespace {
21
[email protected]8202d0c2011-02-23 08:31:1422// If the |request| failed due to problems with a proxy, forward the error to
23// the proxy extension API.
[email protected]0651b812011-02-24 00:22:5024void ForwardProxyErrors(net::URLRequest* request,
[email protected]3ce02412011-03-01 12:01:1525 ExtensionEventRouterForwarder* event_router,
26 ProfileId profile_id) {
[email protected]8202d0c2011-02-23 08:31:1427 if (request->status().status() == net::URLRequestStatus::FAILED) {
28 switch (request->status().os_error()) {
29 case net::ERR_PROXY_AUTH_UNSUPPORTED:
30 case net::ERR_PROXY_CONNECTION_FAILED:
31 case net::ERR_TUNNEL_CONNECTION_FAILED:
32 ExtensionProxyEventRouter::GetInstance()->OnProxyError(
[email protected]3ce02412011-03-01 12:01:1533 event_router, profile_id, request->status().os_error());
[email protected]8202d0c2011-02-23 08:31:1434 }
35 }
36}
37
[email protected]d05ef99c2011-02-01 21:38:1638} // namespace
[email protected]ac039522010-06-15 16:39:4439
[email protected]0651b812011-02-24 00:22:5040ChromeNetworkDelegate::ChromeNetworkDelegate(
[email protected]3ce02412011-03-01 12:01:1541 ExtensionEventRouterForwarder* event_router,
[email protected]4b50cb52011-03-10 00:29:3742 ProfileId profile_id,
[email protected]a8c1e7452011-05-14 06:17:0743 BooleanPrefMember* enable_referrers)
[email protected]3ce02412011-03-01 12:01:1544 : event_router_(event_router),
[email protected]4b50cb52011-03-10 00:29:3745 profile_id_(profile_id),
[email protected]a8c1e7452011-05-14 06:17:0746 enable_referrers_(enable_referrers) {
[email protected]4b50cb52011-03-10 00:29:3747 DCHECK(event_router);
[email protected]0a8db0d2011-04-13 15:15:4048 DCHECK(enable_referrers);
[email protected]0651b812011-02-24 00:22:5049}
50
[email protected]ac039522010-06-15 16:39:4451ChromeNetworkDelegate::~ChromeNetworkDelegate() {}
52
[email protected]0a8db0d2011-04-13 15:15:4053// static
54void ChromeNetworkDelegate::InitializeReferrersEnabled(
55 BooleanPrefMember* enable_referrers,
56 PrefService* pref_service) {
57 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
58 enable_referrers->Init(prefs::kEnableReferrers, pref_service, NULL);
59 enable_referrers->MoveToThread(BrowserThread::IO);
60}
61
[email protected]4875ba12011-03-30 22:31:5162int ChromeNetworkDelegate::OnBeforeURLRequest(
[email protected]4c76d7c2011-04-15 19:14:1263 net::URLRequest* request,
64 net::CompletionCallback* callback,
65 GURL* new_url) {
[email protected]0a8db0d2011-04-13 15:15:4066 if (!enable_referrers_->GetValue())
67 request->set_referrer(std::string());
[email protected]05cc4e72011-03-08 21:29:4868 return ExtensionWebRequestEventRouter::GetInstance()->OnBeforeRequest(
[email protected]4c76d7c2011-04-15 19:14:1269 profile_id_, event_router_.get(), request, callback, new_url);
[email protected]d05ef99c2011-02-01 21:38:1670}
71
[email protected]4875ba12011-03-30 22:31:5172int ChromeNetworkDelegate::OnBeforeSendHeaders(
73 uint64 request_id,
[email protected]4c76d7c2011-04-15 19:14:1274 net::CompletionCallback* callback,
75 net::HttpRequestHeaders* headers) {
[email protected]4875ba12011-03-30 22:31:5176 return ExtensionWebRequestEventRouter::GetInstance()->OnBeforeSendHeaders(
[email protected]4c76d7c2011-04-15 19:14:1277 profile_id_, event_router_.get(), request_id, callback, headers);
[email protected]ac039522010-06-15 16:39:4478}
[email protected]8202d0c2011-02-23 08:31:1479
[email protected]82b42302011-04-20 16:28:1680void ChromeNetworkDelegate::OnRequestSent(
81 uint64 request_id,
[email protected]783573b2011-05-13 11:05:1582 const net::HostPortPair& socket_address,
83 const net::HttpRequestHeaders& headers) {
[email protected]82b42302011-04-20 16:28:1684 ExtensionWebRequestEventRouter::GetInstance()->OnRequestSent(
[email protected]783573b2011-05-13 11:05:1585 profile_id_, event_router_.get(), request_id, socket_address, headers);
[email protected]82b42302011-04-20 16:28:1686}
87
[email protected]31b2e5f2011-04-20 16:58:3288void ChromeNetworkDelegate::OnBeforeRedirect(net::URLRequest* request,
89 const GURL& new_location) {
90 ExtensionWebRequestEventRouter::GetInstance()->OnBeforeRedirect(
91 profile_id_, event_router_.get(), request, new_location);
92}
93
94
[email protected]8202d0c2011-02-23 08:31:1495void ChromeNetworkDelegate::OnResponseStarted(net::URLRequest* request) {
[email protected]62fecae2011-04-21 11:08:2496 ExtensionWebRequestEventRouter::GetInstance()->OnResponseStarted(
97 profile_id_, event_router_.get(), request);
[email protected]3ce02412011-03-01 12:01:1598 ForwardProxyErrors(request, event_router_.get(), profile_id_);
[email protected]8202d0c2011-02-23 08:31:1499}
100
[email protected]48944382011-04-23 13:28:16101void ChromeNetworkDelegate::OnCompleted(net::URLRequest* request) {
102 if (request->status().status() == net::URLRequestStatus::SUCCESS) {
103 bool is_redirect = request->response_headers() &&
104 net::HttpResponseHeaders::IsRedirectResponseCode(
105 request->response_headers()->response_code());
106 if (!is_redirect) {
107 ExtensionWebRequestEventRouter::GetInstance()->OnCompleted(
108 profile_id_, event_router_.get(), request);
109 }
[email protected]05b6ab42011-04-23 13:46:04110 } else if (request->status().status() == net::URLRequestStatus::FAILED) {
111 ExtensionWebRequestEventRouter::GetInstance()->OnErrorOccurred(
112 profile_id_, event_router_.get(), request);
[email protected]48944382011-04-23 13:28:16113 }
[email protected]3ce02412011-03-01 12:01:15114 ForwardProxyErrors(request, event_router_.get(), profile_id_);
[email protected]8202d0c2011-02-23 08:31:14115}
[email protected]4b50cb52011-03-10 00:29:37116
[email protected]4875ba12011-03-30 22:31:51117void ChromeNetworkDelegate::OnURLRequestDestroyed(net::URLRequest* request) {
118 ExtensionWebRequestEventRouter::GetInstance()->OnURLRequestDestroyed(
119 profile_id_, request);
120}
121
[email protected]5aa20132011-04-27 23:11:34122void ChromeNetworkDelegate::OnHttpTransactionDestroyed(uint64 request_id) {
123 ExtensionWebRequestEventRouter::GetInstance()->OnHttpTransactionDestroyed(
124 profile_id_, request_id);
125}
126
[email protected]82a37672011-05-03 12:02:41127void ChromeNetworkDelegate::OnPACScriptError(int line_number,
128 const string16& error) {
[email protected]3daf92302011-05-05 15:04:31129 ExtensionProxyEventRouter::GetInstance()->OnPACScriptError(
130 event_router_.get(), profile_id_, line_number, error);
[email protected]82a37672011-05-03 12:02:41131}