Home | History | Annotate | Download | only in local_discovery
      1 // Copyright 2013 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 #ifndef CHROME_BROWSER_LOCAL_DISCOVERY_PRIVET_URL_FETCHER_H_
      6 #define CHROME_BROWSER_LOCAL_DISCOVERY_PRIVET_URL_FETCHER_H_
      7 
      8 #include <string>
      9 
     10 #include "base/files/file_util.h"
     11 #include "base/memory/weak_ptr.h"
     12 #include "base/values.h"
     13 #include "net/url_request/url_fetcher.h"
     14 #include "net/url_request/url_fetcher_delegate.h"
     15 #include "net/url_request/url_request_context_getter.h"
     16 #include "url/gurl.h"
     17 
     18 namespace base {
     19 class FilePath;
     20 }
     21 
     22 namespace local_discovery {
     23 
     24 const int kPrivetHTTPCodeInternalFailure = -1;
     25 
     26 // Privet-specific URLFetcher adapter. Currently supports only the subset
     27 // of HTTP features required by Privet for GCP 1.5
     28 // (/privet/info and /privet/register).
     29 class PrivetURLFetcher : public net::URLFetcherDelegate {
     30  public:
     31   enum ErrorType {
     32     JSON_PARSE_ERROR,
     33     URL_FETCH_ERROR,
     34     RESPONSE_CODE_ERROR,
     35     RETRY_ERROR,
     36     TOKEN_ERROR
     37   };
     38 
     39   typedef base::Callback<void(const std::string& /*token*/)> TokenCallback;
     40 
     41   class Delegate {
     42    public:
     43     virtual ~Delegate() {}
     44 
     45     // If you do not implement this method for PrivetV1 callers, you will always
     46     // get a TOKEN_ERROR error when your token is invalid.
     47     virtual void OnNeedPrivetToken(
     48         PrivetURLFetcher* fetcher,
     49         const TokenCallback& callback);
     50 
     51     // If this returns the empty string, will not send an auth token.
     52     virtual std::string GetAuthToken();
     53 
     54     virtual void OnError(PrivetURLFetcher* fetcher, ErrorType error) = 0;
     55     virtual void OnParsedJson(PrivetURLFetcher* fetcher,
     56                               const base::DictionaryValue& value,
     57                               bool has_error) = 0;
     58 
     59     // If this method is returns true, the data will not be parsed as JSON, and
     60     // |OnParsedJson| will not be called. Otherwise, |OnParsedJson| will be
     61     // called.
     62     virtual bool OnRawData(PrivetURLFetcher* fetcher,
     63                            bool response_is_file,
     64                            const std::string& data_string,
     65                            const base::FilePath& data_file);
     66   };
     67 
     68   PrivetURLFetcher(
     69       const GURL& url,
     70       net::URLFetcher::RequestType request_type,
     71       net::URLRequestContextGetter* request_context,
     72       Delegate* delegate);
     73 
     74   virtual ~PrivetURLFetcher();
     75 
     76   // net::URLFetcherDelegate methods.
     77   virtual void OnURLFetchComplete(const net::URLFetcher* source) OVERRIDE;
     78 
     79   static void SetTokenForHost(const std::string& host,
     80                               const std::string& token);
     81 
     82   static void ResetTokenMapForTests();
     83 
     84   void DoNotRetryOnTransientError();
     85 
     86   void SendEmptyPrivetToken();
     87 
     88   void V3Mode();
     89 
     90   // Set the contents of the Range header. |OnRawData| must return true if this
     91   // is called.
     92   void SetByteRange(int start, int end);
     93 
     94   // Save the response to a file. |OnRawData| must return true if this is
     95   // called.
     96   void SaveResponseToFile();
     97 
     98   void Start();
     99 
    100   void SetUploadData(const std::string& upload_content_type,
    101                      const std::string& upload_data);
    102 
    103   void SetUploadFilePath(const std::string& upload_content_type,
    104                          const base::FilePath& upload_file_path);
    105 
    106   const GURL& url() const { return url_fetcher_->GetOriginalURL(); }
    107   int response_code() const { return url_fetcher_->GetResponseCode(); }
    108 
    109  private:
    110   void OnURLFetchCompleteParseData(const net::URLFetcher* source);
    111   bool OnURLFetchCompleteDoNotParseData(const net::URLFetcher* source);
    112 
    113   std::string GetHostString();  // Get string representing the host.
    114   std::string GetPrivetAccessToken();
    115   void Try();
    116   void ScheduleRetry(int timeout_seconds);
    117   bool PrivetErrorTransient(const std::string& error);
    118   void RequestTokenRefresh();
    119   void RefreshToken(const std::string& token);
    120 
    121   GURL url_;
    122   net::URLFetcher::RequestType request_type_;
    123   scoped_refptr<net::URLRequestContextGetter> request_context_;
    124   Delegate* delegate_;
    125 
    126   bool do_not_retry_on_transient_error_;
    127   bool send_empty_privet_token_;
    128   bool has_byte_range_;
    129   bool make_response_file_;
    130   bool v3_mode_;
    131 
    132   int byte_range_start_;
    133   int byte_range_end_;
    134 
    135   int tries_;
    136   std::string upload_data_;
    137   std::string upload_content_type_;
    138   base::FilePath upload_file_path_;
    139   scoped_ptr<net::URLFetcher> url_fetcher_;
    140 
    141   base::WeakPtrFactory<PrivetURLFetcher> weak_factory_;
    142   DISALLOW_COPY_AND_ASSIGN(PrivetURLFetcher);
    143 };
    144 
    145 }  // namespace local_discovery
    146 
    147 #endif  // CHROME_BROWSER_LOCAL_DISCOVERY_PRIVET_URL_FETCHER_H_
    148