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 3 // found in the LICENSE file. 4 5 #include "components/component_updater/request_sender.h" 6 7 #include "base/bind.h" 8 #include "base/bind_helpers.h" 9 #include "base/location.h" 10 #include "base/logging.h" 11 #include "base/single_thread_task_runner.h" 12 #include "base/thread_task_runner_handle.h" 13 #include "components/component_updater/component_updater_configurator.h" 14 #include "components/component_updater/component_updater_utils.h" 15 #include "net/url_request/url_fetcher.h" 16 17 namespace component_updater { 18 RequestSender(const Configurator & config)19RequestSender::RequestSender(const Configurator& config) : config_(config) { 20 } 21 ~RequestSender()22RequestSender::~RequestSender() { 23 DCHECK(thread_checker_.CalledOnValidThread()); 24 } 25 Send(const std::string & request_string,const std::vector<GURL> & urls,const RequestSenderCallback & request_sender_callback)26void RequestSender::Send(const std::string& request_string, 27 const std::vector<GURL>& urls, 28 const RequestSenderCallback& request_sender_callback) { 29 DCHECK(thread_checker_.CalledOnValidThread()); 30 if (urls.empty()) { 31 request_sender_callback.Run(NULL); 32 return; 33 } 34 35 request_string_ = request_string; 36 urls_ = urls; 37 request_sender_callback_ = request_sender_callback; 38 39 cur_url_ = urls_.begin(); 40 41 SendInternal(); 42 } 43 SendInternal()44void RequestSender::SendInternal() { 45 DCHECK(cur_url_ != urls_.end()); 46 DCHECK(cur_url_->is_valid()); 47 DCHECK(thread_checker_.CalledOnValidThread()); 48 49 url_fetcher_.reset(SendProtocolRequest( 50 *cur_url_, request_string_, this, config_.RequestContext())); 51 } 52 OnURLFetchComplete(const net::URLFetcher * source)53void RequestSender::OnURLFetchComplete(const net::URLFetcher* source) { 54 DCHECK(thread_checker_.CalledOnValidThread()); 55 if (GetFetchError(*source) == 0) { 56 request_sender_callback_.Run(source); 57 return; 58 } 59 60 if (++cur_url_ != urls_.end() && 61 base::ThreadTaskRunnerHandle::Get()->PostTask( 62 FROM_HERE, 63 base::Bind(&RequestSender::SendInternal, base::Unretained(this)))) { 64 return; 65 } 66 67 request_sender_callback_.Run(source); 68 } 69 70 } // namespace component_updater 71