privet_url_fetcher.h revision 6e8cce623b6e4fe0c9e4af605d675dd9d0338c38
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/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 18namespace base { 19class FilePath; 20} 21 22namespace local_discovery { 23 24const 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). 29class 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