Chromium Code Reviews| 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 |