11320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Copyright 2014 The Chromium Authors. All rights reserved. 21320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Use of this source code is governed by a BSD-style license that can be 31320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// found in the LICENSE file. 41320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifndef COMPONENTS_COMPONENT_UPDATER_REQUEST_SENDER_H_ 61320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define COMPONENTS_COMPONENT_UPDATER_REQUEST_SENDER_H_ 71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include <string> 91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include <vector> 101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/callback.h" 121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/compiler_specific.h" 131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/macros.h" 141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/memory/scoped_ptr.h" 1578901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch#include "base/threading/thread_checker.h" 161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "net/url_request/url_fetcher_delegate.h" 171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "url/gurl.h" 181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace net { 201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass URLFetcher; 211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace component_updater { 241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass Configurator; 261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Sends a request to one of the urls provided. The class implements a chain 281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// of responsibility design pattern, where the urls are tried in the order they 291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// are specified, until the request to one of them succeeds or all have failed. 301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass RequestSender : public net::URLFetcherDelegate { 311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public: 321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // The |source| refers to the fetcher object used to make the request. This 331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // parameter can be NULL in some error cases. 341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci typedef base::Callback<void(const net::URLFetcher* source)> 351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci RequestSenderCallback; 361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci explicit RequestSender(const Configurator& config); 381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual ~RequestSender(); 391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void Send(const std::string& request_string, 411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const std::vector<GURL>& urls, 421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const RequestSenderCallback& request_sender_callback); 431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci private: 451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void SendInternal(); 461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Overrides for URLFetcherDelegate. 481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void OnURLFetchComplete(const net::URLFetcher* source) OVERRIDE; 491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const Configurator& config_; 511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci std::vector<GURL> urls_; 521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci std::vector<GURL>::const_iterator cur_url_; 531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<net::URLFetcher> url_fetcher_; 541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci std::string request_string_; 551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci RequestSenderCallback request_sender_callback_; 561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 5778901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch base::ThreadChecker thread_checker_; 5878901d17b47ef1f8d6d0a89eaf37f9523ba1de85Ben Murdoch 591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DISALLOW_COPY_AND_ASSIGN(RequestSender); 601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}; 611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} // namespace component_updater 631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif // COMPONENTS_COMPONENT_UPDATER_REQUEST_SENDER_H_ 65