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 "mojo/services/network/url_loader_impl.h" | 5 #include "mojo/services/network/url_loader_impl.h" |
6 | 6 |
7 #include <memory> | 7 #include <memory> |
8 | 8 |
9 #include "base/memory/scoped_vector.h" | 9 #include "base/memory/scoped_vector.h" |
10 #include "base/message_loop/message_loop.h" | 10 #include "base/message_loop/message_loop.h" |
(...skipping 250 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
261 URLLoaderImpl::URLLoaderImpl(NetworkContext* context, | 261 URLLoaderImpl::URLLoaderImpl(NetworkContext* context, |
262 InterfaceRequest<URLLoader> request, | 262 InterfaceRequest<URLLoader> request, |
263 std::vector<URLLoaderInterceptorPtr> interceptors) | 263 std::vector<URLLoaderInterceptorPtr> interceptors) |
264 : context_(context), | 264 : context_(context), |
265 interceptors_(std::move(interceptors)), | 265 interceptors_(std::move(interceptors)), |
266 response_body_buffer_size_(0), | 266 response_body_buffer_size_(0), |
267 auto_follow_redirects_(true), | 267 auto_follow_redirects_(true), |
268 current_fetcher_id_(0), | 268 current_fetcher_id_(0), |
269 binding_(this, request.Pass()) { | 269 binding_(this, request.Pass()) { |
270 for (auto& interceptor : interceptors_) { | 270 for (auto& interceptor : interceptors_) { |
271 interceptor.set_error_handler(this); | 271 interceptor.set_connection_error_handler([this]() { OnConnectionError(); }); |
272 } | 272 } |
273 interceptor_index_ = interceptors_.size() - 1; | 273 interceptor_index_ = interceptors_.size() - 1; |
274 binding_.set_error_handler(this); | 274 binding_.set_connection_error_handler([this]() { OnConnectionError(); }); |
275 context_->RegisterURLLoader(this); | 275 context_->RegisterURLLoader(this); |
276 } | 276 } |
277 | 277 |
278 URLLoaderImpl::~URLLoaderImpl() { | 278 URLLoaderImpl::~URLLoaderImpl() { |
279 context_->DeregisterURLLoader(this); | 279 context_->DeregisterURLLoader(this); |
280 } | 280 } |
281 | 281 |
282 void URLLoaderImpl::Cleanup() { | 282 void URLLoaderImpl::Cleanup() { |
283 // The associated network context is going away and we have to destroy | 283 // The associated network context is going away and we have to destroy |
284 // net::URLRequest hold by this loader. | 284 // net::URLRequest hold by this loader. |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
329 status = last_status_.Clone(); | 329 status = last_status_.Clone(); |
330 } else { | 330 } else { |
331 // No network request has been made yet. | 331 // No network request has been made yet. |
332 status->is_loading = false; | 332 status->is_loading = false; |
333 } | 333 } |
334 } | 334 } |
335 // TODO(darin): Populate more status fields. | 335 // TODO(darin): Populate more status fields. |
336 callback.Run(status.Pass()); | 336 callback.Run(status.Pass()); |
337 } | 337 } |
338 | 338 |
339 void URLLoaderImpl::OnConnectionError() { | |
340 binding_.Close(); | |
341 if (body_fetchers_.empty()) | |
342 delete this; | |
343 } | |
344 | |
345 void URLLoaderImpl::OnReceivedRedirect(net::URLRequest* url_request, | 339 void URLLoaderImpl::OnReceivedRedirect(net::URLRequest* url_request, |
346 const net::RedirectInfo& redirect_info, | 340 const net::RedirectInfo& redirect_info, |
347 bool* defer_redirect) { | 341 bool* defer_redirect) { |
348 DCHECK(url_request == url_request_.get()); | 342 DCHECK(url_request == url_request_.get()); |
349 DCHECK(url_request->status().is_success()); | 343 DCHECK(url_request->status().is_success()); |
350 DCHECK(!redirect_info_); | 344 DCHECK(!redirect_info_); |
351 | 345 |
352 if (auto_follow_redirects_) | 346 if (auto_follow_redirects_) |
353 return; | 347 return; |
354 | 348 |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
392 body_fetchers_.push_back(std::move(body_fetcher)); | 386 body_fetchers_.push_back(std::move(body_fetcher)); |
393 body_fetchers_.back()->Start(); | 387 body_fetchers_.back()->Start(); |
394 } | 388 } |
395 | 389 |
396 void URLLoaderImpl::OnReadCompleted(net::URLRequest* url_request, | 390 void URLLoaderImpl::OnReadCompleted(net::URLRequest* url_request, |
397 int bytes_read) { | 391 int bytes_read) { |
398 // This should never be called on this object. | 392 // This should never be called on this object. |
399 DCHECK(false); | 393 DCHECK(false); |
400 } | 394 } |
401 | 395 |
| 396 void URLLoaderImpl::OnConnectionError() { |
| 397 binding_.Close(); |
| 398 if (body_fetchers_.empty()) |
| 399 delete this; |
| 400 } |
| 401 |
402 void URLLoaderImpl::SendError( | 402 void URLLoaderImpl::SendError( |
403 int error_code, | 403 int error_code, |
404 const Callback<void(URLResponsePtr)>& callback) { | 404 const Callback<void(URLResponsePtr)>& callback) { |
405 URLResponsePtr response(URLResponse::New()); | 405 URLResponsePtr response(URLResponse::New()); |
406 if (url_request_) | 406 if (url_request_) |
407 response->url = String::From(url_request_->url()); | 407 response->url = String::From(url_request_->url()); |
408 response->error = MakeNetworkError(error_code); | 408 response->error = MakeNetworkError(error_code); |
409 callback.Run(response.Pass()); | 409 callback.Run(response.Pass()); |
410 } | 410 } |
411 | 411 |
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
529 } | 529 } |
530 if (request->body) { | 530 if (request->body) { |
531 ScopedVector<net::UploadElementReader> element_readers; | 531 ScopedVector<net::UploadElementReader> element_readers; |
532 for (size_t i = 0; i < request->body.size(); ++i) { | 532 for (size_t i = 0; i < request->body.size(); ++i) { |
533 element_readers.push_back( | 533 element_readers.push_back( |
534 new UploadDataPipeElementReader(request->body[i].Pass())); | 534 new UploadDataPipeElementReader(request->body[i].Pass())); |
535 } | 535 } |
536 url_request_->set_upload(make_scoped_ptr<net::UploadDataStream>( | 536 url_request_->set_upload(make_scoped_ptr<net::UploadDataStream>( |
537 new net::ElementsUploadDataStream(element_readers.Pass(), 0))); | 537 new net::ElementsUploadDataStream(element_readers.Pass(), 0))); |
538 } | 538 } |
| 539 int load_flags = 0; |
539 if (request->bypass_cache) | 540 if (request->bypass_cache) |
540 url_request_->SetLoadFlags(net::LOAD_BYPASS_CACHE); | 541 load_flags |= net::LOAD_BYPASS_CACHE; |
| 542 if (request->only_from_cache) |
| 543 load_flags |= net::LOAD_ONLY_FROM_CACHE; |
| 544 if (load_flags) |
| 545 url_request_->SetLoadFlags(load_flags); |
541 | 546 |
542 response_body_buffer_size_ = request->response_body_buffer_size; | 547 response_body_buffer_size_ = request->response_body_buffer_size; |
543 auto_follow_redirects_ = request->auto_follow_redirects; | 548 auto_follow_redirects_ = request->auto_follow_redirects; |
544 | 549 |
545 url_request_->Start(); | 550 url_request_->Start(); |
546 } | 551 } |
547 | 552 |
548 void URLLoaderImpl::SendResponse(URLResponsePtr response) { | 553 void URLLoaderImpl::SendResponse(URLResponsePtr response) { |
549 if (interceptor_index_ >= 0 && | 554 if (interceptor_index_ >= 0 && |
550 interceptor_index_ < static_cast<int>(interceptors_.size())) { | 555 interceptor_index_ < static_cast<int>(interceptors_.size())) { |
(...skipping 20 matching lines...) Expand all Loading... |
571 if ((*it)->id() == current_fetcher_id_) { | 576 if ((*it)->id() == current_fetcher_id_) { |
572 last_status_ = fetcher->QueryStatus(); | 577 last_status_ = fetcher->QueryStatus(); |
573 last_status_->is_loading = false; | 578 last_status_->is_loading = false; |
574 } | 579 } |
575 body_fetchers_.erase(it); | 580 body_fetchers_.erase(it); |
576 if (body_fetchers_.empty() and !binding_.is_bound()) | 581 if (body_fetchers_.empty() and !binding_.is_bound()) |
577 delete this; | 582 delete this; |
578 } | 583 } |
579 | 584 |
580 } // namespace mojo | 585 } // namespace mojo |
OLD | NEW |