Upstream version 10.39.225.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / local_discovery / privet_url_fetcher.h
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_