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 callback_type_(NONE), | |
20 proxy_callback_(base::Bind(&DevToolsNetworkTransaction::OnCallback, | 21 proxy_callback_(base::Bind(&DevToolsNetworkTransaction::OnCallback, |
21 base::Unretained(this))) { | 22 base::Unretained(this))) { |
22 DCHECK(controller); | 23 DCHECK(controller); |
23 controller->AddTransaction(this); | 24 controller->AddTransaction(this); |
24 } | 25 } |
25 | 26 |
26 DevToolsNetworkTransaction::~DevToolsNetworkTransaction() { | 27 DevToolsNetworkTransaction::~DevToolsNetworkTransaction() { |
27 controller_->RemoveTransaction(this); | 28 controller_->RemoveTransaction(this); |
28 } | 29 } |
29 | 30 |
31 void DevToolsNetworkTransaction::Throttle(int result) { | |
32 throttled_result_ = result; | |
33 int64_t penalty = 0; | |
34 if (callback_type_ == START) | |
35 penalty += network_transaction_->GetTotalReceivedBytes(); | |
36 if (result > 0) | |
37 penalty += result; | |
38 controller_->ThrottleTransaction(this, penalty); | |
vsevik
2014/06/11 08:10:34
We should make sure we do not callback synchronous
eustas
2014/06/11 10:54:26
Done.
| |
39 } | |
40 | |
30 void DevToolsNetworkTransaction::OnCallback(int rv) { | 41 void DevToolsNetworkTransaction::OnCallback(int rv) { |
31 if (failed_) | 42 if (failed_) |
32 return; | 43 return; |
33 DCHECK(!callback_.is_null()); | 44 DCHECK(!callback_.is_null()); |
45 if (callback_type_ == START || callback_type_ == READ) { | |
46 if (controller_->ShouldThrottle(request_)) { | |
47 Throttle(rv); | |
48 return; | |
49 } | |
50 } | |
34 net::CompletionCallback callback = callback_; | 51 net::CompletionCallback callback = callback_; |
35 callback_.Reset(); | 52 callback_.Reset(); |
53 callback_type_ = NONE; | |
36 callback.Run(rv); | 54 callback.Run(rv); |
37 } | 55 } |
38 | 56 |
57 int DevToolsNetworkTransaction::SetupCallback( | |
vsevik
2014/06/11 08:10:34
DCHECK(callback_type_ == NONE);
if (result == net
eustas
2014/06/11 10:54:26
Done.
| |
58 net::CompletionCallback callback, | |
59 int result, | |
60 CallbackType callback_type) { | |
61 if (callback_type == START || (callback_type == READ && result > 0)) { | |
vsevik
2014/06/10 17:24:20
Is it possible that result != net::ERR_IO_PENDING
vsevik
2014/06/11 08:10:34
Should we also throttle the result < 0 case here?
eustas
2014/06/11 10:54:26
Yes, SPDY "push" streams can cause OK = 0 result.
eustas
2014/06/11 10:54:26
Yes, even ERROR start may have caused network traf
| |
62 if (controller_->ShouldThrottle(request_)) { | |
63 if (result != net::ERR_IO_PENDING) { | |
64 callback_type_ = callback_type; | |
65 callback_ = callback; | |
66 Throttle(result); | |
vsevik
2014/06/10 17:24:20
Is it OK that we could callback before returning f
eustas
2014/06/11 10:54:26
Done.
| |
67 return net::ERR_IO_PENDING; | |
68 } | |
69 } | |
70 } | |
71 | |
72 if (result == net::ERR_IO_PENDING) { | |
73 callback_type_ = callback_type; | |
74 callback_ = callback; | |
75 } else { | |
76 callback_type_ = NONE; | |
vsevik
2014/06/11 08:10:34
This is redundant, let's DCHECK(callback_type_ ==
eustas
2014/06/11 10:54:26
Done.
| |
77 } | |
78 return result; | |
79 } | |
80 | |
39 void DevToolsNetworkTransaction::Fail() { | 81 void DevToolsNetworkTransaction::Fail() { |
40 DCHECK(request_); | 82 DCHECK(request_); |
41 DCHECK(!failed_); | 83 DCHECK(!failed_); |
42 failed_ = true; | 84 failed_ = true; |
43 network_transaction_->SetBeforeNetworkStartCallback( | 85 network_transaction_->SetBeforeNetworkStartCallback( |
44 BeforeNetworkStartCallback()); | 86 BeforeNetworkStartCallback()); |
45 if (callback_.is_null()) | 87 if (callback_.is_null()) |
46 return; | 88 return; |
47 net::CompletionCallback callback = callback_; | 89 net::CompletionCallback callback = callback_; |
48 callback_.Reset(); | 90 callback_.Reset(); |
91 callback_type_ = NONE; | |
49 callback.Run(net::ERR_INTERNET_DISCONNECTED); | 92 callback.Run(net::ERR_INTERNET_DISCONNECTED); |
50 } | 93 } |
51 | 94 |
52 int DevToolsNetworkTransaction::Start( | 95 int DevToolsNetworkTransaction::Start( |
53 const net::HttpRequestInfo* request, | 96 const net::HttpRequestInfo* request, |
54 const net::CompletionCallback& callback, | 97 const net::CompletionCallback& callback, |
55 const net::BoundNetLog& net_log) { | 98 const net::BoundNetLog& net_log) { |
56 DCHECK(request); | 99 DCHECK(request); |
57 request_ = request; | 100 request_ = request; |
58 | 101 |
59 if (controller_->ShouldFail(request_)) { | 102 if (controller_->ShouldFail(request_)) { |
60 failed_ = true; | 103 failed_ = true; |
61 network_transaction_->SetBeforeNetworkStartCallback( | 104 network_transaction_->SetBeforeNetworkStartCallback( |
62 BeforeNetworkStartCallback()); | 105 BeforeNetworkStartCallback()); |
63 return net::ERR_INTERNET_DISCONNECTED; | 106 return net::ERR_INTERNET_DISCONNECTED; |
64 } | 107 } |
65 int rv = network_transaction_->Start(request, proxy_callback_, net_log); | 108 int rv = network_transaction_->Start(request, proxy_callback_, net_log); |
66 if (rv == net::ERR_IO_PENDING) | 109 return SetupCallback(callback, rv, START); |
67 callback_ = callback; | |
68 return rv; | |
69 } | 110 } |
70 | 111 |
71 int DevToolsNetworkTransaction::RestartIgnoringLastError( | 112 int DevToolsNetworkTransaction::RestartIgnoringLastError( |
72 const net::CompletionCallback& callback) { | 113 const net::CompletionCallback& callback) { |
73 if (failed_) | 114 if (failed_) |
74 return net::ERR_INTERNET_DISCONNECTED; | 115 return net::ERR_INTERNET_DISCONNECTED; |
75 int rv = network_transaction_->RestartIgnoringLastError(proxy_callback_); | 116 int rv = network_transaction_->RestartIgnoringLastError(proxy_callback_); |
76 if (rv == net::ERR_IO_PENDING) | 117 return SetupCallback(callback, rv, RESTART_IGNORING_LAST_ERROR); |
vsevik
2014/06/10 17:24:20
Is it somehow enforced that several of all these m
eustas
2014/06/11 10:54:26
It is required by transaction contract, but not en
| |
77 callback_ = callback; | |
78 return rv; | |
79 } | 118 } |
80 | 119 |
81 int DevToolsNetworkTransaction::RestartWithCertificate( | 120 int DevToolsNetworkTransaction::RestartWithCertificate( |
82 net::X509Certificate* client_cert, | 121 net::X509Certificate* client_cert, |
83 const net::CompletionCallback& callback) { | 122 const net::CompletionCallback& callback) { |
84 if (failed_) | 123 if (failed_) |
85 return net::ERR_INTERNET_DISCONNECTED; | 124 return net::ERR_INTERNET_DISCONNECTED; |
86 int rv = network_transaction_->RestartWithCertificate( | 125 int rv = network_transaction_->RestartWithCertificate( |
87 client_cert, proxy_callback_); | 126 client_cert, proxy_callback_); |
88 if (rv == net::ERR_IO_PENDING) | 127 return SetupCallback(callback, rv, RESTART_WITH_CERTIFICATE); |
89 callback_ = callback; | |
90 return rv; | |
91 } | 128 } |
92 | 129 |
93 int DevToolsNetworkTransaction::RestartWithAuth( | 130 int DevToolsNetworkTransaction::RestartWithAuth( |
94 const net::AuthCredentials& credentials, | 131 const net::AuthCredentials& credentials, |
95 const net::CompletionCallback& callback) { | 132 const net::CompletionCallback& callback) { |
96 if (failed_) | 133 if (failed_) |
97 return net::ERR_INTERNET_DISCONNECTED; | 134 return net::ERR_INTERNET_DISCONNECTED; |
98 int rv = network_transaction_->RestartWithAuth(credentials, proxy_callback_); | 135 int rv = network_transaction_->RestartWithAuth(credentials, proxy_callback_); |
99 if (rv == net::ERR_IO_PENDING) | 136 return SetupCallback(callback, rv, RESTART_WITH_AUTH); |
100 callback_ = callback; | |
101 return rv; | |
102 } | 137 } |
103 | 138 |
104 bool DevToolsNetworkTransaction::IsReadyToRestartForAuth() { | 139 bool DevToolsNetworkTransaction::IsReadyToRestartForAuth() { |
105 return network_transaction_->IsReadyToRestartForAuth(); | 140 return network_transaction_->IsReadyToRestartForAuth(); |
106 } | 141 } |
107 | 142 |
108 int DevToolsNetworkTransaction::Read( | 143 int DevToolsNetworkTransaction::Read( |
109 net::IOBuffer* buf, | 144 net::IOBuffer* buf, |
110 int buf_len, | 145 int buf_len, |
111 const net::CompletionCallback& callback) { | 146 const net::CompletionCallback& callback) { |
112 if (failed_) | 147 if (failed_) |
113 return net::ERR_INTERNET_DISCONNECTED; | 148 return net::ERR_INTERNET_DISCONNECTED; |
114 int rv = network_transaction_->Read(buf, buf_len, proxy_callback_); | 149 int rv = network_transaction_->Read(buf, buf_len, proxy_callback_); |
115 if (rv == net::ERR_IO_PENDING) | 150 return SetupCallback(callback, rv, READ); |
116 callback_ = callback; | |
117 return rv; | |
118 } | 151 } |
119 | 152 |
120 void DevToolsNetworkTransaction::StopCaching() { | 153 void DevToolsNetworkTransaction::StopCaching() { |
121 network_transaction_->StopCaching(); | 154 network_transaction_->StopCaching(); |
122 } | 155 } |
123 | 156 |
124 bool DevToolsNetworkTransaction::GetFullRequestHeaders( | 157 bool DevToolsNetworkTransaction::GetFullRequestHeaders( |
125 net::HttpRequestHeaders* headers) const { | 158 net::HttpRequestHeaders* headers) const { |
126 return network_transaction_->GetFullRequestHeaders(headers); | 159 return network_transaction_->GetFullRequestHeaders(headers); |
127 } | 160 } |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
169 void DevToolsNetworkTransaction::SetBeforeNetworkStartCallback( | 202 void DevToolsNetworkTransaction::SetBeforeNetworkStartCallback( |
170 const BeforeNetworkStartCallback& callback) { | 203 const BeforeNetworkStartCallback& callback) { |
171 network_transaction_->SetBeforeNetworkStartCallback(callback); | 204 network_transaction_->SetBeforeNetworkStartCallback(callback); |
172 } | 205 } |
173 | 206 |
174 int DevToolsNetworkTransaction::ResumeNetworkStart() { | 207 int DevToolsNetworkTransaction::ResumeNetworkStart() { |
175 if (failed_) | 208 if (failed_) |
176 return net::ERR_INTERNET_DISCONNECTED; | 209 return net::ERR_INTERNET_DISCONNECTED; |
177 return network_transaction_->ResumeNetworkStart(); | 210 return network_transaction_->ResumeNetworkStart(); |
178 } | 211 } |
212 | |
213 void DevToolsNetworkTransaction::FireThrottledCallback() { | |
214 DCHECK(!callback_.is_null()); | |
215 DCHECK(callback_type_ == READ || callback_type_ == START); | |
216 net::CompletionCallback callback = callback_; | |
217 callback_.Reset(); | |
218 callback_type_ = NONE; | |
219 callback.Run(throttled_result_); | |
220 } | |
OLD | NEW |