OLD | NEW |
---|---|
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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/devtools/devtools_network_transaction.h" | 5 #include "chrome/browser/devtools/devtools_network_transaction.h" |
6 | 6 |
7 #include "chrome/browser/devtools/devtools_network_controller.h" | 7 #include "chrome/browser/devtools/devtools_network_controller.h" |
8 #include "chrome/browser/devtools/devtools_network_realm.h" | |
8 #include "net/base/net_errors.h" | 9 #include "net/base/net_errors.h" |
9 #include "net/base/upload_progress.h" | 10 #include "net/base/upload_progress.h" |
10 #include "net/http/http_network_transaction.h" | 11 #include "net/http/http_network_transaction.h" |
11 #include "net/http/http_request_info.h" | 12 #include "net/http/http_request_info.h" |
12 | 13 |
14 namespace { | |
15 | |
16 const char kDevToolsRequestInitiator[] = "X-DevTools-Request-Initiator"; | |
17 const char kDevToolsEmulateNetworkConditionsClientId[] = | |
18 "X-DevTools-Emulate-Network-Conditions-Client-Id"; | |
19 | |
20 } // namespace | |
21 | |
13 DevToolsNetworkTransaction::DevToolsNetworkTransaction( | 22 DevToolsNetworkTransaction::DevToolsNetworkTransaction( |
14 DevToolsNetworkController* controller, | 23 DevToolsNetworkController* controller, |
15 scoped_ptr<net::HttpTransaction> network_transaction) | 24 scoped_ptr<net::HttpTransaction> network_transaction) |
16 : controller_(controller), | 25 : controller_(controller), |
17 network_transaction_(network_transaction.Pass()), | 26 network_transaction_(network_transaction.Pass()), |
18 request_(NULL), | 27 request_(NULL), |
19 failed_(false), | 28 failed_(false), |
20 throttled_byte_count_(0), | 29 throttled_byte_count_(0), |
21 callback_type_(NONE), | 30 callback_type_(NONE), |
22 proxy_callback_(base::Bind(&DevToolsNetworkTransaction::OnCallback, | 31 proxy_callback_(base::Bind(&DevToolsNetworkTransaction::OnCallback, |
23 base::Unretained(this))) { | 32 base::Unretained(this))) { |
24 DCHECK(controller); | 33 DCHECK(controller); |
25 controller->AddTransaction(this); | |
26 } | 34 } |
27 | 35 |
28 DevToolsNetworkTransaction::~DevToolsNetworkTransaction() { | 36 DevToolsNetworkTransaction::~DevToolsNetworkTransaction() { |
29 controller_->RemoveTransaction(this); | 37 if (realm_) |
38 realm_->RemoveTransaction(this); | |
30 } | 39 } |
31 | 40 |
32 void DevToolsNetworkTransaction::Throttle(int result) { | 41 void DevToolsNetworkTransaction::Throttle(int result) { |
33 throttled_result_ = result; | 42 throttled_result_ = result; |
34 | 43 |
35 if (callback_type_ == START) | 44 if (callback_type_ == START) |
36 throttled_byte_count_ += network_transaction_->GetTotalReceivedBytes(); | 45 throttled_byte_count_ += network_transaction_->GetTotalReceivedBytes(); |
37 if (result > 0) | 46 if (result > 0) |
38 throttled_byte_count_ += result; | 47 throttled_byte_count_ += result; |
39 | 48 |
40 controller_->ThrottleTransaction(this); | 49 if (realm_) |
50 realm_->ThrottleTransaction(this); | |
41 } | 51 } |
42 | 52 |
43 void DevToolsNetworkTransaction::OnCallback(int rv) { | 53 void DevToolsNetworkTransaction::OnCallback(int rv) { |
44 if (failed_) | 54 if (failed_) |
45 return; | 55 return; |
46 DCHECK(!callback_.is_null()); | 56 DCHECK(!callback_.is_null()); |
47 if (callback_type_ == START || callback_type_ == READ) { | 57 if (callback_type_ == START || callback_type_ == READ) { |
48 if (controller_->ShouldThrottle(request_)) { | 58 if (realm_ && realm_->ShouldThrottle(this)) { |
49 Throttle(rv); | 59 Throttle(rv); |
50 return; | 60 return; |
51 } | 61 } |
52 } | 62 } |
53 net::CompletionCallback callback = callback_; | 63 net::CompletionCallback callback = callback_; |
54 callback_.Reset(); | 64 callback_.Reset(); |
55 callback_type_ = NONE; | 65 callback_type_ = NONE; |
56 callback.Run(rv); | 66 callback.Run(rv); |
57 } | 67 } |
58 | 68 |
59 int DevToolsNetworkTransaction::SetupCallback( | 69 int DevToolsNetworkTransaction::SetupCallback( |
60 net::CompletionCallback callback, | 70 net::CompletionCallback callback, |
61 int result, | 71 int result, |
62 CallbackType callback_type) { | 72 CallbackType callback_type) { |
63 DCHECK(callback_type_ == NONE); | 73 DCHECK(callback_type_ == NONE); |
64 | 74 |
65 if (result == net::ERR_IO_PENDING) { | 75 if (result == net::ERR_IO_PENDING) { |
66 callback_type_ = callback_type; | 76 callback_type_ = callback_type; |
67 callback_ = callback; | 77 callback_ = callback; |
68 return result; | 78 return result; |
69 } | 79 } |
70 | 80 |
71 if (!controller_->ShouldThrottle(request_)) | 81 if (!realm_ || !realm_->ShouldThrottle(this)) |
72 return result; | 82 return result; |
73 | 83 |
74 // Only START and READ operation throttling is supported. | 84 // Only START and READ operation throttling is supported. |
75 if (callback_type != START && callback_type != READ) | 85 if (callback_type != START && callback_type != READ) |
76 return result; | 86 return result; |
77 | 87 |
78 // In case of error |throttled_byte_count_| is unknown. | 88 // In case of error |throttled_byte_count_| is unknown. |
79 if (result < 0) | 89 if (result < 0) |
80 return result; | 90 return result; |
81 | 91 |
(...skipping 20 matching lines...) Expand all Loading... | |
102 callback_type_ = NONE; | 112 callback_type_ = NONE; |
103 callback.Run(net::ERR_INTERNET_DISCONNECTED); | 113 callback.Run(net::ERR_INTERNET_DISCONNECTED); |
104 } | 114 } |
105 | 115 |
106 int DevToolsNetworkTransaction::Start( | 116 int DevToolsNetworkTransaction::Start( |
107 const net::HttpRequestInfo* request, | 117 const net::HttpRequestInfo* request, |
108 const net::CompletionCallback& callback, | 118 const net::CompletionCallback& callback, |
109 const net::BoundNetLog& net_log) { | 119 const net::BoundNetLog& net_log) { |
110 DCHECK(request); | 120 DCHECK(request); |
111 request_ = request; | 121 request_ = request; |
122 realm_ = controller_->GetRealm(this); | |
123 realm_->AddTransaction(this); | |
112 | 124 |
113 if (controller_->ShouldFail(request_)) { | 125 if (realm_->ShouldFail(this)) { |
114 failed_ = true; | 126 failed_ = true; |
115 network_transaction_->SetBeforeNetworkStartCallback( | 127 network_transaction_->SetBeforeNetworkStartCallback( |
116 BeforeNetworkStartCallback()); | 128 BeforeNetworkStartCallback()); |
117 return net::ERR_INTERNET_DISCONNECTED; | 129 return net::ERR_INTERNET_DISCONNECTED; |
118 } | 130 } |
119 int rv = network_transaction_->Start(request, proxy_callback_, net_log); | 131 int rv = network_transaction_->Start(request_, proxy_callback_, net_log); |
120 return SetupCallback(callback, rv, START); | 132 return SetupCallback(callback, rv, START); |
121 } | 133 } |
122 | 134 |
135 void DevToolsNetworkTransaction::ProcessRequest() { | |
136 DCHECK(request_); | |
137 bool hasDevToolsClientId = request_->extra_headers.HasHeader( | |
vsevik
2014/06/18 12:33:37
has_devtools_...
eustas
2014/06/18 12:57:47
Done.
| |
138 kDevToolsEmulateNetworkConditionsClientId); | |
139 bool hasDevToolsRequestInitiator = request_->extra_headers.HasHeader( | |
140 kDevToolsRequestInitiator); | |
141 if (!hasDevToolsClientId && !hasDevToolsRequestInitiator) | |
142 return; | |
143 | |
144 custom_request_.reset(new net::HttpRequestInfo(*request_)); | |
145 | |
146 if (hasDevToolsClientId) { | |
147 custom_request_->extra_headers.GetHeader( | |
148 kDevToolsEmulateNetworkConditionsClientId, &client_id_); | |
149 custom_request_->extra_headers.RemoveHeader( | |
150 kDevToolsEmulateNetworkConditionsClientId); | |
151 } | |
152 | |
153 if (hasDevToolsRequestInitiator) { | |
154 custom_request_->extra_headers.GetHeader( | |
155 kDevToolsRequestInitiator, &request_initiator_); | |
156 custom_request_->extra_headers.RemoveHeader(kDevToolsRequestInitiator); | |
157 } | |
158 | |
159 request_ = custom_request_.get(); | |
160 } | |
161 | |
123 int DevToolsNetworkTransaction::RestartIgnoringLastError( | 162 int DevToolsNetworkTransaction::RestartIgnoringLastError( |
124 const net::CompletionCallback& callback) { | 163 const net::CompletionCallback& callback) { |
125 if (failed_) | 164 if (failed_) |
126 return net::ERR_INTERNET_DISCONNECTED; | 165 return net::ERR_INTERNET_DISCONNECTED; |
127 int rv = network_transaction_->RestartIgnoringLastError(proxy_callback_); | 166 int rv = network_transaction_->RestartIgnoringLastError(proxy_callback_); |
128 return SetupCallback(callback, rv, RESTART_IGNORING_LAST_ERROR); | 167 return SetupCallback(callback, rv, RESTART_IGNORING_LAST_ERROR); |
129 } | 168 } |
130 | 169 |
131 int DevToolsNetworkTransaction::RestartWithCertificate( | 170 int DevToolsNetworkTransaction::RestartWithCertificate( |
132 net::X509Certificate* client_cert, | 171 net::X509Certificate* client_cert, |
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
222 } | 261 } |
223 | 262 |
224 void DevToolsNetworkTransaction::FireThrottledCallback() { | 263 void DevToolsNetworkTransaction::FireThrottledCallback() { |
225 DCHECK(!callback_.is_null()); | 264 DCHECK(!callback_.is_null()); |
226 DCHECK(callback_type_ == READ || callback_type_ == START); | 265 DCHECK(callback_type_ == READ || callback_type_ == START); |
227 net::CompletionCallback callback = callback_; | 266 net::CompletionCallback callback = callback_; |
228 callback_.Reset(); | 267 callback_.Reset(); |
229 callback_type_ = NONE; | 268 callback_type_ = NONE; |
230 callback.Run(throttled_result_); | 269 callback.Run(throttled_result_); |
231 } | 270 } |
OLD | NEW |