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/predictors/resource_prefetcher.h" | 5 #include "chrome/browser/predictors/resource_prefetcher.h" |
6 | 6 |
7 #include <iterator> | 7 #include <iterator> |
8 #include <utility> | 8 #include <utility> |
9 | 9 |
10 #include "content/public/browser/browser_thread.h" | 10 #include "content/public/browser/browser_thread.h" |
11 #include "net/base/io_buffer.h" | 11 #include "net/base/io_buffer.h" |
12 #include "net/base/load_flags.h" | 12 #include "net/base/load_flags.h" |
13 #include "net/base/request_priority.h" | 13 #include "net/base/request_priority.h" |
14 #include "net/url_request/url_request_context.h" | 14 #include "net/url_request/url_request_context.h" |
15 #include "url/origin.h" | 15 #include "url/origin.h" |
16 | 16 |
17 namespace { | 17 namespace { |
18 | 18 |
19 // The size of the buffer used to read the resource. | 19 // The size of the buffer used to read the resource. |
20 static const size_t kResourceBufferSizeBytes = 50000; | 20 static const size_t kResourceBufferSizeBytes = 50000; |
21 | 21 |
22 } // namespace | 22 } // namespace |
23 | 23 |
24 namespace predictors { | 24 namespace predictors { |
| 25 |
25 ResourcePrefetcher::ResourcePrefetcher( | 26 ResourcePrefetcher::ResourcePrefetcher( |
26 Delegate* delegate, | 27 Delegate* delegate, |
27 const ResourcePrefetchPredictorConfig& config, | 28 const ResourcePrefetchPredictorConfig& config, |
28 const GURL& main_frame_url, | 29 const GURL& main_frame_url, |
29 const std::vector<GURL>& urls) | 30 const std::vector<GURL>& urls) |
30 : state_(INITIALIZED), | 31 : state_(INITIALIZED), |
31 delegate_(delegate), | 32 delegate_(delegate), |
32 config_(config), | 33 config_(config), |
33 main_frame_url_(main_frame_url) { | 34 main_frame_url_(main_frame_url) { |
34 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); | 35 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); |
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
130 host_it->second -= 1; | 131 host_it->second -= 1; |
131 if (host_it->second == 0) | 132 if (host_it->second == 0) |
132 host_inflight_counts_.erase(host); | 133 host_inflight_counts_.erase(host); |
133 | 134 |
134 inflight_requests_.erase(request_it); | 135 inflight_requests_.erase(request_it); |
135 | 136 |
136 TryToLaunchPrefetchRequests(); | 137 TryToLaunchPrefetchRequests(); |
137 } | 138 } |
138 | 139 |
139 void ResourcePrefetcher::ReadFullResponse(net::URLRequest* request) { | 140 void ResourcePrefetcher::ReadFullResponse(net::URLRequest* request) { |
140 bool status = true; | 141 int bytes_read = 0; |
141 while (status) { | 142 do { |
142 int bytes_read = 0; | |
143 scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer( | 143 scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer( |
144 kResourceBufferSizeBytes)); | 144 kResourceBufferSizeBytes)); |
145 status = request->Read(buffer.get(), kResourceBufferSizeBytes, &bytes_read); | 145 bytes_read = request->Read(buffer.get(), kResourceBufferSizeBytes); |
146 | 146 if (bytes_read == net::ERR_IO_PENDING) { |
147 if (status) { | 147 return; |
148 status = ShouldContinueReadingRequest(request, bytes_read); | 148 } else if (bytes_read <= 0) { |
149 } else if (!request->status().is_success()) { | |
150 FinishRequest(request); | 149 FinishRequest(request); |
151 return; | 150 return; |
152 } | 151 } |
153 } | |
154 } | |
155 | 152 |
156 bool ResourcePrefetcher::ShouldContinueReadingRequest(net::URLRequest* request, | 153 } while (bytes_read > 0); |
157 int bytes_read) { | |
158 if (bytes_read == 0) { // When bytes_read == 0, no more data. | |
159 if (request->was_cached()) | |
160 FinishRequest(request); | |
161 else | |
162 FinishRequest(request); | |
163 return false; | |
164 } | |
165 | |
166 return true; | |
167 } | 154 } |
168 | 155 |
169 void ResourcePrefetcher::OnReceivedRedirect( | 156 void ResourcePrefetcher::OnReceivedRedirect( |
170 net::URLRequest* request, | 157 net::URLRequest* request, |
171 const net::RedirectInfo& redirect_info, | 158 const net::RedirectInfo& redirect_info, |
172 bool* defer_redirect) { | 159 bool* defer_redirect) { |
173 FinishRequest(request); | 160 FinishRequest(request); |
174 } | 161 } |
175 | 162 |
176 void ResourcePrefetcher::OnAuthRequired(net::URLRequest* request, | 163 void ResourcePrefetcher::OnAuthRequired(net::URLRequest* request, |
177 net::AuthChallengeInfo* auth_info) { | 164 net::AuthChallengeInfo* auth_info) { |
178 FinishRequest(request); | 165 FinishRequest(request); |
179 } | 166 } |
180 | 167 |
181 void ResourcePrefetcher::OnCertificateRequested( | 168 void ResourcePrefetcher::OnCertificateRequested( |
182 net::URLRequest* request, | 169 net::URLRequest* request, |
183 net::SSLCertRequestInfo* cert_request_info) { | 170 net::SSLCertRequestInfo* cert_request_info) { |
184 FinishRequest(request); | 171 FinishRequest(request); |
185 } | 172 } |
186 | 173 |
187 void ResourcePrefetcher::OnSSLCertificateError(net::URLRequest* request, | 174 void ResourcePrefetcher::OnSSLCertificateError(net::URLRequest* request, |
188 const net::SSLInfo& ssl_info, | 175 const net::SSLInfo& ssl_info, |
189 bool fatal) { | 176 bool fatal) { |
190 FinishRequest(request); | 177 FinishRequest(request); |
191 } | 178 } |
192 | 179 |
193 void ResourcePrefetcher::OnResponseStarted(net::URLRequest* request) { | 180 void ResourcePrefetcher::OnResponseStarted(net::URLRequest* request, |
| 181 int net_error) { |
| 182 DCHECK_NE(net::ERR_IO_PENDING, net_error); |
| 183 |
| 184 if (net_error != net::OK) { |
| 185 FinishRequest(request); |
| 186 return; |
| 187 } |
| 188 |
194 // TODO(shishir): Do not read cached entries, or ones that are not cacheable. | 189 // TODO(shishir): Do not read cached entries, or ones that are not cacheable. |
195 if (request->status().is_success()) | 190 ReadFullResponse(request); |
196 ReadFullResponse(request); | |
197 else | |
198 FinishRequest(request); | |
199 } | 191 } |
200 | 192 |
201 void ResourcePrefetcher::OnReadCompleted(net::URLRequest* request, | 193 void ResourcePrefetcher::OnReadCompleted(net::URLRequest* request, |
202 int bytes_read) { | 194 int bytes_read) { |
203 if (!request->status().is_success()) { | 195 DCHECK_NE(net::ERR_IO_PENDING, bytes_read); |
| 196 |
| 197 if (bytes_read <= 0) { |
204 FinishRequest(request); | 198 FinishRequest(request); |
205 return; | 199 return; |
206 } | 200 } |
207 | 201 |
208 if (ShouldContinueReadingRequest(request, bytes_read)) | 202 if (bytes_read > 0) |
209 ReadFullResponse(request); | 203 ReadFullResponse(request); |
210 } | 204 } |
211 | 205 |
212 } // namespace predictors | 206 } // namespace predictors |
OLD | NEW |