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