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 "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]() { delete this; }); |
|
ppi
2015/07/16 12:35:54
Is this intentional change that we now `delete thi
ppi
2015/07/16 12:39:45
I'd suggest to make this fix separately for histor
qsr
2015/07/16 12:41:40
Done.
| |
| 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 |