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