blob: 0058ca539899f0af6116a8390aeccc04bb5f8d6d [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]8523ba52011-05-22 19:00:588#include "chrome/browser/custom_handlers/protocol_handler_registry.h"
[email protected]3ce02412011-03-01 12:01:159#include "chrome/browser/extensions/extension_event_router_forwarder.h"
[email protected]8202d0c2011-02-23 08:31:1410#include "chrome/browser/extensions/extension_proxy_api.h"
[email protected]d05ef99c2011-02-01 21:38:1611#include "chrome/browser/extensions/extension_webrequest_api.h"
[email protected]0a8db0d2011-04-13 15:15:4012#include "chrome/browser/prefs/pref_member.h"
[email protected]8523ba52011-05-22 19:00:5813#include "chrome/browser/task_manager/task_manager.h"
[email protected]0a8db0d2011-04-13 15:15:4014#include "chrome/common/pref_names.h"
15#include "content/browser/browser_thread.h"
[email protected]82b42302011-04-20 16:28:1616#include "net/base/host_port_pair.h"
[email protected]8202d0c2011-02-23 08:31:1417#include "net/base/net_errors.h"
[email protected]ac039522010-06-15 16:39:4418#include "net/http/http_request_headers.h"
[email protected]48944382011-04-23 13:28:1619#include "net/http/http_response_headers.h"
[email protected]d05ef99c2011-02-01 21:38:1620#include "net/url_request/url_request.h"
21
22namespace {
23
[email protected]8202d0c2011-02-23 08:31:1424// If the |request| failed due to problems with a proxy, forward the error to
25// the proxy extension API.
[email protected]0651b812011-02-24 00:22:5026void ForwardProxyErrors(net::URLRequest* request,
[email protected]3ce02412011-03-01 12:01:1527 ExtensionEventRouterForwarder* event_router,
28 ProfileId profile_id) {
[email protected]8202d0c2011-02-23 08:31:1429 if (request->status().status() == net::URLRequestStatus::FAILED) {
30 switch (request->status().os_error()) {
31 case net::ERR_PROXY_AUTH_UNSUPPORTED:
32 case net::ERR_PROXY_CONNECTION_FAILED:
33 case net::ERR_TUNNEL_CONNECTION_FAILED:
34 ExtensionProxyEventRouter::GetInstance()->OnProxyError(
[email protected]3ce02412011-03-01 12:01:1535 event_router, profile_id, request->status().os_error());
[email protected]8202d0c2011-02-23 08:31:1436 }
37 }
38}
39
[email protected]d05ef99c2011-02-01 21:38:1640} // namespace
[email protected]ac039522010-06-15 16:39:4441
[email protected]0651b812011-02-24 00:22:5042ChromeNetworkDelegate::ChromeNetworkDelegate(
[email protected]3ce02412011-03-01 12:01:1543 ExtensionEventRouterForwarder* event_router,
[email protected]4b50cb52011-03-10 00:29:3744 ProfileId profile_id,
[email protected]a8c1e7452011-05-14 06:17:0745 BooleanPrefMember* enable_referrers)
[email protected]3ce02412011-03-01 12:01:1546 : event_router_(event_router),
[email protected]4b50cb52011-03-10 00:29:3747 profile_id_(profile_id),
[email protected]a8c1e7452011-05-14 06:17:0748 enable_referrers_(enable_referrers) {
[email protected]4b50cb52011-03-10 00:29:3749 DCHECK(event_router);
[email protected]0a8db0d2011-04-13 15:15:4050 DCHECK(enable_referrers);
[email protected]0651b812011-02-24 00:22:5051}
52
[email protected]ac039522010-06-15 16:39:4453ChromeNetworkDelegate::~ChromeNetworkDelegate() {}
54
[email protected]0a8db0d2011-04-13 15:15:4055// static
56void ChromeNetworkDelegate::InitializeReferrersEnabled(
57 BooleanPrefMember* enable_referrers,
58 PrefService* pref_service) {
59 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
60 enable_referrers->Init(prefs::kEnableReferrers, pref_service, NULL);
61 enable_referrers->MoveToThread(BrowserThread::IO);
62}
63
[email protected]4875ba12011-03-30 22:31:5164int ChromeNetworkDelegate::OnBeforeURLRequest(
[email protected]4c76d7c2011-04-15 19:14:1265 net::URLRequest* request,
66 net::CompletionCallback* callback,
67 GURL* new_url) {
[email protected]0a8db0d2011-04-13 15:15:4068 if (!enable_referrers_->GetValue())
69 request->set_referrer(std::string());
[email protected]05cc4e72011-03-08 21:29:4870 return ExtensionWebRequestEventRouter::GetInstance()->OnBeforeRequest(
[email protected]4c76d7c2011-04-15 19:14:1271 profile_id_, event_router_.get(), request, callback, new_url);
[email protected]d05ef99c2011-02-01 21:38:1672}
73
[email protected]4875ba12011-03-30 22:31:5174int ChromeNetworkDelegate::OnBeforeSendHeaders(
75 uint64 request_id,
[email protected]4c76d7c2011-04-15 19:14:1276 net::CompletionCallback* callback,
77 net::HttpRequestHeaders* headers) {
[email protected]4875ba12011-03-30 22:31:5178 return ExtensionWebRequestEventRouter::GetInstance()->OnBeforeSendHeaders(
[email protected]4c76d7c2011-04-15 19:14:1279 profile_id_, event_router_.get(), request_id, callback, headers);
[email protected]ac039522010-06-15 16:39:4480}
[email protected]8202d0c2011-02-23 08:31:1481
[email protected]82b42302011-04-20 16:28:1682void ChromeNetworkDelegate::OnRequestSent(
83 uint64 request_id,
[email protected]783573b2011-05-13 11:05:1584 const net::HostPortPair& socket_address,
85 const net::HttpRequestHeaders& headers) {
[email protected]82b42302011-04-20 16:28:1686 ExtensionWebRequestEventRouter::GetInstance()->OnRequestSent(
[email protected]783573b2011-05-13 11:05:1587 profile_id_, event_router_.get(), request_id, socket_address, headers);
[email protected]82b42302011-04-20 16:28:1688}
89
[email protected]31b2e5f2011-04-20 16:58:3290void ChromeNetworkDelegate::OnBeforeRedirect(net::URLRequest* request,
91 const GURL& new_location) {
92 ExtensionWebRequestEventRouter::GetInstance()->OnBeforeRedirect(
93 profile_id_, event_router_.get(), request, new_location);
94}
95
96
[email protected]8202d0c2011-02-23 08:31:1497void ChromeNetworkDelegate::OnResponseStarted(net::URLRequest* request) {
[email protected]62fecae2011-04-21 11:08:2498 ExtensionWebRequestEventRouter::GetInstance()->OnResponseStarted(
99 profile_id_, event_router_.get(), request);
[email protected]3ce02412011-03-01 12:01:15100 ForwardProxyErrors(request, event_router_.get(), profile_id_);
[email protected]8202d0c2011-02-23 08:31:14101}
102
[email protected]8523ba52011-05-22 19:00:58103void ChromeNetworkDelegate::OnRawBytesRead(const net::URLRequest& request,
104 int bytes_read) {
105 TaskManager::GetInstance()->model()->NotifyBytesRead(request, bytes_read);
106}
107
[email protected]48944382011-04-23 13:28:16108void ChromeNetworkDelegate::OnCompleted(net::URLRequest* request) {
109 if (request->status().status() == net::URLRequestStatus::SUCCESS) {
110 bool is_redirect = request->response_headers() &&
111 net::HttpResponseHeaders::IsRedirectResponseCode(
112 request->response_headers()->response_code());
113 if (!is_redirect) {
114 ExtensionWebRequestEventRouter::GetInstance()->OnCompleted(
115 profile_id_, event_router_.get(), request);
116 }
[email protected]05b6ab42011-04-23 13:46:04117 } else if (request->status().status() == net::URLRequestStatus::FAILED) {
118 ExtensionWebRequestEventRouter::GetInstance()->OnErrorOccurred(
119 profile_id_, event_router_.get(), request);
[email protected]48944382011-04-23 13:28:16120 }
[email protected]3ce02412011-03-01 12:01:15121 ForwardProxyErrors(request, event_router_.get(), profile_id_);
[email protected]8202d0c2011-02-23 08:31:14122}
[email protected]4b50cb52011-03-10 00:29:37123
[email protected]4875ba12011-03-30 22:31:51124void ChromeNetworkDelegate::OnURLRequestDestroyed(net::URLRequest* request) {
125 ExtensionWebRequestEventRouter::GetInstance()->OnURLRequestDestroyed(
126 profile_id_, request);
127}
128
[email protected]5aa20132011-04-27 23:11:34129void ChromeNetworkDelegate::OnHttpTransactionDestroyed(uint64 request_id) {
130 ExtensionWebRequestEventRouter::GetInstance()->OnHttpTransactionDestroyed(
131 profile_id_, request_id);
132}
133
[email protected]82a37672011-05-03 12:02:41134void ChromeNetworkDelegate::OnPACScriptError(int line_number,
135 const string16& error) {
[email protected]3daf92302011-05-05 15:04:31136 ExtensionProxyEventRouter::GetInstance()->OnPACScriptError(
137 event_router_.get(), profile_id_, line_number, error);
[email protected]82a37672011-05-03 12:02:41138}