| 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 DevToolsNetworkTransaction::DevToolsNetworkTransaction( | 13 DevToolsNetworkTransaction::DevToolsNetworkTransaction( |
| 14 DevToolsNetworkController* controller, | 14 DevToolsNetworkController* controller, |
| 15 scoped_ptr<net::HttpTransaction> network_transaction) | 15 scoped_ptr<net::HttpTransaction> network_transaction) |
| 16 : controller_(controller), | 16 : controller_(controller), |
| 17 network_transaction_(network_transaction.Pass()), | 17 network_transaction_(network_transaction.Pass()), |
| 18 request_(NULL), | 18 request_(NULL), |
| 19 failed_(false), | 19 failed_(false), |
| 20 throttled_byte_count_(0), |
| 21 callback_type_(NONE), |
| 20 proxy_callback_(base::Bind(&DevToolsNetworkTransaction::OnCallback, | 22 proxy_callback_(base::Bind(&DevToolsNetworkTransaction::OnCallback, |
| 21 base::Unretained(this))) { | 23 base::Unretained(this))) { |
| 22 DCHECK(controller); | 24 DCHECK(controller); |
| 23 controller->AddTransaction(this); | 25 controller->AddTransaction(this); |
| 24 } | 26 } |
| 25 | 27 |
| 26 DevToolsNetworkTransaction::~DevToolsNetworkTransaction() { | 28 DevToolsNetworkTransaction::~DevToolsNetworkTransaction() { |
| 27 controller_->RemoveTransaction(this); | 29 controller_->RemoveTransaction(this); |
| 28 } | 30 } |
| 29 | 31 |
| 32 void DevToolsNetworkTransaction::Throttle(int result) { |
| 33 throttled_result_ = result; |
| 34 |
| 35 if (callback_type_ == START) |
| 36 throttled_byte_count_ += network_transaction_->GetTotalReceivedBytes(); |
| 37 if (result > 0) |
| 38 throttled_byte_count_ += result; |
| 39 |
| 40 controller_->ThrottleTransaction(this); |
| 41 } |
| 42 |
| 30 void DevToolsNetworkTransaction::OnCallback(int rv) { | 43 void DevToolsNetworkTransaction::OnCallback(int rv) { |
| 31 if (failed_) | 44 if (failed_) |
| 32 return; | 45 return; |
| 33 DCHECK(!callback_.is_null()); | 46 DCHECK(!callback_.is_null()); |
| 47 if (callback_type_ == START || callback_type_ == READ) { |
| 48 if (controller_->ShouldThrottle(request_)) { |
| 49 Throttle(rv); |
| 50 return; |
| 51 } |
| 52 } |
| 34 net::CompletionCallback callback = callback_; | 53 net::CompletionCallback callback = callback_; |
| 35 callback_.Reset(); | 54 callback_.Reset(); |
| 55 callback_type_ = NONE; |
| 36 callback.Run(rv); | 56 callback.Run(rv); |
| 37 } | 57 } |
| 38 | 58 |
| 59 int DevToolsNetworkTransaction::SetupCallback( |
| 60 net::CompletionCallback callback, |
| 61 int result, |
| 62 CallbackType callback_type) { |
| 63 DCHECK(callback_type_ == NONE); |
| 64 |
| 65 if (result == net::ERR_IO_PENDING) { |
| 66 callback_type_ = callback_type; |
| 67 callback_ = callback; |
| 68 return result; |
| 69 } |
| 70 |
| 71 if (!controller_->ShouldThrottle(request_)) |
| 72 return result; |
| 73 |
| 74 // Only START and READ operation throttling is supported. |
| 75 if (callback_type != START && callback_type != READ) |
| 76 return result; |
| 77 |
| 78 // In case of error |throttled_byte_count_| is unknown. |
| 79 if (result < 0) |
| 80 return result; |
| 81 |
| 82 // URLRequestJob relies on synchronous end-of-stream notification. |
| 83 if (callback_type == READ && result == 0) |
| 84 return result; |
| 85 |
| 86 callback_type_ = callback_type; |
| 87 callback_ = callback; |
| 88 Throttle(result); |
| 89 return net::ERR_IO_PENDING; |
| 90 } |
| 91 |
| 39 void DevToolsNetworkTransaction::Fail() { | 92 void DevToolsNetworkTransaction::Fail() { |
| 40 DCHECK(request_); | 93 DCHECK(request_); |
| 41 DCHECK(!failed_); | 94 DCHECK(!failed_); |
| 42 failed_ = true; | 95 failed_ = true; |
| 43 network_transaction_->SetBeforeNetworkStartCallback( | 96 network_transaction_->SetBeforeNetworkStartCallback( |
| 44 BeforeNetworkStartCallback()); | 97 BeforeNetworkStartCallback()); |
| 45 if (callback_.is_null()) | 98 if (callback_.is_null()) |
| 46 return; | 99 return; |
| 47 net::CompletionCallback callback = callback_; | 100 net::CompletionCallback callback = callback_; |
| 48 callback_.Reset(); | 101 callback_.Reset(); |
| 102 callback_type_ = NONE; |
| 49 callback.Run(net::ERR_INTERNET_DISCONNECTED); | 103 callback.Run(net::ERR_INTERNET_DISCONNECTED); |
| 50 } | 104 } |
| 51 | 105 |
| 52 int DevToolsNetworkTransaction::Start( | 106 int DevToolsNetworkTransaction::Start( |
| 53 const net::HttpRequestInfo* request, | 107 const net::HttpRequestInfo* request, |
| 54 const net::CompletionCallback& callback, | 108 const net::CompletionCallback& callback, |
| 55 const net::BoundNetLog& net_log) { | 109 const net::BoundNetLog& net_log) { |
| 56 DCHECK(request); | 110 DCHECK(request); |
| 57 request_ = request; | 111 request_ = request; |
| 58 | 112 |
| 59 if (controller_->ShouldFail(request_)) { | 113 if (controller_->ShouldFail(request_)) { |
| 60 failed_ = true; | 114 failed_ = true; |
| 61 network_transaction_->SetBeforeNetworkStartCallback( | 115 network_transaction_->SetBeforeNetworkStartCallback( |
| 62 BeforeNetworkStartCallback()); | 116 BeforeNetworkStartCallback()); |
| 63 return net::ERR_INTERNET_DISCONNECTED; | 117 return net::ERR_INTERNET_DISCONNECTED; |
| 64 } | 118 } |
| 65 int rv = network_transaction_->Start(request, proxy_callback_, net_log); | 119 int rv = network_transaction_->Start(request, proxy_callback_, net_log); |
| 66 if (rv == net::ERR_IO_PENDING) | 120 return SetupCallback(callback, rv, START); |
| 67 callback_ = callback; | |
| 68 return rv; | |
| 69 } | 121 } |
| 70 | 122 |
| 71 int DevToolsNetworkTransaction::RestartIgnoringLastError( | 123 int DevToolsNetworkTransaction::RestartIgnoringLastError( |
| 72 const net::CompletionCallback& callback) { | 124 const net::CompletionCallback& callback) { |
| 73 if (failed_) | 125 if (failed_) |
| 74 return net::ERR_INTERNET_DISCONNECTED; | 126 return net::ERR_INTERNET_DISCONNECTED; |
| 75 int rv = network_transaction_->RestartIgnoringLastError(proxy_callback_); | 127 int rv = network_transaction_->RestartIgnoringLastError(proxy_callback_); |
| 76 if (rv == net::ERR_IO_PENDING) | 128 return SetupCallback(callback, rv, RESTART_IGNORING_LAST_ERROR); |
| 77 callback_ = callback; | |
| 78 return rv; | |
| 79 } | 129 } |
| 80 | 130 |
| 81 int DevToolsNetworkTransaction::RestartWithCertificate( | 131 int DevToolsNetworkTransaction::RestartWithCertificate( |
| 82 net::X509Certificate* client_cert, | 132 net::X509Certificate* client_cert, |
| 83 const net::CompletionCallback& callback) { | 133 const net::CompletionCallback& callback) { |
| 84 if (failed_) | 134 if (failed_) |
| 85 return net::ERR_INTERNET_DISCONNECTED; | 135 return net::ERR_INTERNET_DISCONNECTED; |
| 86 int rv = network_transaction_->RestartWithCertificate( | 136 int rv = network_transaction_->RestartWithCertificate( |
| 87 client_cert, proxy_callback_); | 137 client_cert, proxy_callback_); |
| 88 if (rv == net::ERR_IO_PENDING) | 138 return SetupCallback(callback, rv, RESTART_WITH_CERTIFICATE); |
| 89 callback_ = callback; | |
| 90 return rv; | |
| 91 } | 139 } |
| 92 | 140 |
| 93 int DevToolsNetworkTransaction::RestartWithAuth( | 141 int DevToolsNetworkTransaction::RestartWithAuth( |
| 94 const net::AuthCredentials& credentials, | 142 const net::AuthCredentials& credentials, |
| 95 const net::CompletionCallback& callback) { | 143 const net::CompletionCallback& callback) { |
| 96 if (failed_) | 144 if (failed_) |
| 97 return net::ERR_INTERNET_DISCONNECTED; | 145 return net::ERR_INTERNET_DISCONNECTED; |
| 98 int rv = network_transaction_->RestartWithAuth(credentials, proxy_callback_); | 146 int rv = network_transaction_->RestartWithAuth(credentials, proxy_callback_); |
| 99 if (rv == net::ERR_IO_PENDING) | 147 return SetupCallback(callback, rv, RESTART_WITH_AUTH); |
| 100 callback_ = callback; | |
| 101 return rv; | |
| 102 } | 148 } |
| 103 | 149 |
| 104 bool DevToolsNetworkTransaction::IsReadyToRestartForAuth() { | 150 bool DevToolsNetworkTransaction::IsReadyToRestartForAuth() { |
| 105 return network_transaction_->IsReadyToRestartForAuth(); | 151 return network_transaction_->IsReadyToRestartForAuth(); |
| 106 } | 152 } |
| 107 | 153 |
| 108 int DevToolsNetworkTransaction::Read( | 154 int DevToolsNetworkTransaction::Read( |
| 109 net::IOBuffer* buf, | 155 net::IOBuffer* buf, |
| 110 int buf_len, | 156 int buf_len, |
| 111 const net::CompletionCallback& callback) { | 157 const net::CompletionCallback& callback) { |
| 112 if (failed_) | 158 if (failed_) |
| 113 return net::ERR_INTERNET_DISCONNECTED; | 159 return net::ERR_INTERNET_DISCONNECTED; |
| 114 int rv = network_transaction_->Read(buf, buf_len, proxy_callback_); | 160 int rv = network_transaction_->Read(buf, buf_len, proxy_callback_); |
| 115 if (rv == net::ERR_IO_PENDING) | 161 return SetupCallback(callback, rv, READ); |
| 116 callback_ = callback; | |
| 117 return rv; | |
| 118 } | 162 } |
| 119 | 163 |
| 120 void DevToolsNetworkTransaction::StopCaching() { | 164 void DevToolsNetworkTransaction::StopCaching() { |
| 121 network_transaction_->StopCaching(); | 165 network_transaction_->StopCaching(); |
| 122 } | 166 } |
| 123 | 167 |
| 124 bool DevToolsNetworkTransaction::GetFullRequestHeaders( | 168 bool DevToolsNetworkTransaction::GetFullRequestHeaders( |
| 125 net::HttpRequestHeaders* headers) const { | 169 net::HttpRequestHeaders* headers) const { |
| 126 return network_transaction_->GetFullRequestHeaders(headers); | 170 return network_transaction_->GetFullRequestHeaders(headers); |
| 127 } | 171 } |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 169 void DevToolsNetworkTransaction::SetBeforeNetworkStartCallback( | 213 void DevToolsNetworkTransaction::SetBeforeNetworkStartCallback( |
| 170 const BeforeNetworkStartCallback& callback) { | 214 const BeforeNetworkStartCallback& callback) { |
| 171 network_transaction_->SetBeforeNetworkStartCallback(callback); | 215 network_transaction_->SetBeforeNetworkStartCallback(callback); |
| 172 } | 216 } |
| 173 | 217 |
| 174 int DevToolsNetworkTransaction::ResumeNetworkStart() { | 218 int DevToolsNetworkTransaction::ResumeNetworkStart() { |
| 175 if (failed_) | 219 if (failed_) |
| 176 return net::ERR_INTERNET_DISCONNECTED; | 220 return net::ERR_INTERNET_DISCONNECTED; |
| 177 return network_transaction_->ResumeNetworkStart(); | 221 return network_transaction_->ResumeNetworkStart(); |
| 178 } | 222 } |
| 223 |
| 224 void DevToolsNetworkTransaction::FireThrottledCallback() { |
| 225 DCHECK(!callback_.is_null()); |
| 226 DCHECK(callback_type_ == READ || callback_type_ == START); |
| 227 net::CompletionCallback callback = callback_; |
| 228 callback_.Reset(); |
| 229 callback_type_ = NONE; |
| 230 callback.Run(throttled_result_); |
| 231 } |
| OLD | NEW |