OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/local_discovery/privet_url_fetcher.h" | 5 #include "chrome/browser/local_discovery/privet_url_fetcher.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 | 8 |
9 #include "base/bind.h" | 9 #include "base/bind.h" |
10 #include "base/json/json_reader.h" | 10 #include "base/json/json_reader.h" |
(...skipping 16 matching lines...) Expand all Loading... |
27 struct TokenMapHolder { | 27 struct TokenMapHolder { |
28 public: | 28 public: |
29 static TokenMapHolder* GetInstance() { | 29 static TokenMapHolder* GetInstance() { |
30 return Singleton<TokenMapHolder>::get(); | 30 return Singleton<TokenMapHolder>::get(); |
31 } | 31 } |
32 | 32 |
33 TokenMap map; | 33 TokenMap map; |
34 }; | 34 }; |
35 | 35 |
36 const char kXPrivetTokenHeaderPrefix[] = "X-Privet-Token: "; | 36 const char kXPrivetTokenHeaderPrefix[] = "X-Privet-Token: "; |
| 37 const char kXPrivetAuthTokenHeaderPrefix[] = "X-Privet-Auth: "; |
37 const char kRangeHeaderFormat[] = "Range: bytes=%d-%d"; | 38 const char kRangeHeaderFormat[] = "Range: bytes=%d-%d"; |
38 const char kXPrivetEmptyToken[] = "\"\""; | 39 const char kXPrivetEmptyToken[] = "\"\""; |
| 40 const char kPrivetAuthTokenUnknown[] = "Unknown"; |
39 const int kPrivetMaxRetries = 20; | 41 const int kPrivetMaxRetries = 20; |
40 const int kPrivetTimeoutOnError = 5; | 42 const int kPrivetTimeoutOnError = 5; |
41 const int kHTTPErrorCodeInvalidXPrivetToken = 418; | 43 const int kHTTPErrorCodeInvalidXPrivetToken = 418; |
42 | 44 |
43 std::string MakeRangeHeader(int start, int end) { | 45 std::string MakeRangeHeader(int start, int end) { |
44 DCHECK_GE(start, 0); | 46 DCHECK_GE(start, 0); |
45 DCHECK_GT(end, 0); | 47 DCHECK_GT(end, 0); |
46 DCHECK_GT(end, start); | 48 DCHECK_GT(end, start); |
47 return base::StringPrintf(kRangeHeaderFormat, start, end); | 49 return base::StringPrintf(kRangeHeaderFormat, start, end); |
48 } | 50 } |
49 | 51 |
50 } // namespace | 52 } // namespace |
51 | 53 |
52 void PrivetURLFetcher::Delegate::OnNeedPrivetToken( | 54 void PrivetURLFetcher::Delegate::OnNeedPrivetToken( |
53 PrivetURLFetcher* fetcher, | 55 PrivetURLFetcher* fetcher, |
54 const TokenCallback& callback) { | 56 const TokenCallback& callback) { |
55 OnError(fetcher, TOKEN_ERROR); | 57 OnError(fetcher, TOKEN_ERROR); |
56 } | 58 } |
57 | 59 |
| 60 std::string PrivetURLFetcher::Delegate::GetAuthToken() { |
| 61 return kPrivetAuthTokenUnknown; |
| 62 } |
| 63 |
58 bool PrivetURLFetcher::Delegate::OnRawData(PrivetURLFetcher* fetcher, | 64 bool PrivetURLFetcher::Delegate::OnRawData(PrivetURLFetcher* fetcher, |
59 bool response_is_file, | 65 bool response_is_file, |
60 const std::string& data_string, | 66 const std::string& data_string, |
61 const base::FilePath& data_file) { | 67 const base::FilePath& data_file) { |
62 return false; | 68 return false; |
63 } | 69 } |
64 | 70 |
65 PrivetURLFetcher::PrivetURLFetcher( | 71 PrivetURLFetcher::PrivetURLFetcher( |
66 const GURL& url, | 72 const GURL& url, |
67 net::URLFetcher::RequestType request_type, | 73 net::URLFetcher::RequestType request_type, |
68 net::URLRequestContextGetter* request_context, | 74 net::URLRequestContextGetter* request_context, |
69 PrivetURLFetcher::Delegate* delegate) | 75 PrivetURLFetcher::Delegate* delegate) |
70 : url_(url), | 76 : url_(url), |
71 request_type_(request_type), | 77 request_type_(request_type), |
72 request_context_(request_context), | 78 request_context_(request_context), |
73 delegate_(delegate), | 79 delegate_(delegate), |
74 do_not_retry_on_transient_error_(false), | 80 do_not_retry_on_transient_error_(false), |
75 send_empty_privet_token_(false), | 81 send_empty_privet_token_(false), |
76 has_byte_range_(false), | 82 has_byte_range_(false), |
77 make_response_file_(false), | 83 make_response_file_(false), |
| 84 v3_mode_(false), |
78 byte_range_start_(0), | 85 byte_range_start_(0), |
79 byte_range_end_(0), | 86 byte_range_end_(0), |
80 tries_(0), | 87 tries_(0), |
81 weak_factory_(this) {} | 88 weak_factory_(this) { |
| 89 } |
82 | 90 |
83 PrivetURLFetcher::~PrivetURLFetcher() { | 91 PrivetURLFetcher::~PrivetURLFetcher() { |
84 } | 92 } |
85 | 93 |
86 // static | 94 // static |
87 void PrivetURLFetcher::SetTokenForHost(const std::string& host, | 95 void PrivetURLFetcher::SetTokenForHost(const std::string& host, |
88 const std::string& token) { | 96 const std::string& token) { |
89 TokenMapHolder::GetInstance()->map[host] = token; | 97 TokenMapHolder::GetInstance()->map[host] = token; |
90 } | 98 } |
91 | 99 |
(...skipping 24 matching lines...) Expand all Loading... |
116 | 124 |
117 std::string PrivetURLFetcher::GetHostString() { | 125 std::string PrivetURLFetcher::GetHostString() { |
118 return url_.GetOrigin().spec(); | 126 return url_.GetOrigin().spec(); |
119 } | 127 } |
120 | 128 |
121 void PrivetURLFetcher::SaveResponseToFile() { | 129 void PrivetURLFetcher::SaveResponseToFile() { |
122 DCHECK(tries_ == 0); | 130 DCHECK(tries_ == 0); |
123 make_response_file_ = true; | 131 make_response_file_ = true; |
124 } | 132 } |
125 | 133 |
| 134 void PrivetURLFetcher::V3Mode() { |
| 135 v3_mode_ = true; |
| 136 } |
| 137 |
126 void PrivetURLFetcher::SetByteRange(int start, int end) { | 138 void PrivetURLFetcher::SetByteRange(int start, int end) { |
127 DCHECK(tries_ == 0); | 139 DCHECK(tries_ == 0); |
128 byte_range_start_ = start; | 140 byte_range_start_ = start; |
129 byte_range_end_ = end; | 141 byte_range_end_ = end; |
130 has_byte_range_ = true; | 142 has_byte_range_ = true; |
131 } | 143 } |
132 | 144 |
133 void PrivetURLFetcher::Try() { | 145 void PrivetURLFetcher::Try() { |
134 tries_++; | 146 tries_++; |
135 if (tries_ < kPrivetMaxRetries) { | 147 if (tries_ < kPrivetMaxRetries) { |
136 std::string token = GetPrivetAccessToken(); | |
137 | 148 |
138 if (token.empty()) | |
139 token = kXPrivetEmptyToken; | |
140 | 149 |
141 url_fetcher_.reset(net::URLFetcher::Create(url_, request_type_, this)); | 150 url_fetcher_.reset(net::URLFetcher::Create(url_, request_type_, this)); |
142 url_fetcher_->SetRequestContext(request_context_); | 151 url_fetcher_->SetRequestContext(request_context_); |
143 url_fetcher_->AddExtraRequestHeader(std::string(kXPrivetTokenHeaderPrefix) + | 152 |
144 token); | 153 if (v3_mode_) { |
| 154 std::string auth_token = delegate_->GetAuthToken(); |
| 155 |
| 156 url_fetcher_->AddExtraRequestHeader( |
| 157 std::string(kXPrivetAuthTokenHeaderPrefix) + auth_token); |
| 158 } else { |
| 159 std::string token = GetPrivetAccessToken(); |
| 160 |
| 161 if (token.empty()) |
| 162 token = kXPrivetEmptyToken; |
| 163 |
| 164 url_fetcher_->AddExtraRequestHeader( |
| 165 std::string(kXPrivetTokenHeaderPrefix) + token); |
| 166 } |
| 167 |
145 if (has_byte_range_) { | 168 if (has_byte_range_) { |
146 url_fetcher_->AddExtraRequestHeader( | 169 url_fetcher_->AddExtraRequestHeader( |
147 MakeRangeHeader(byte_range_start_, byte_range_end_)); | 170 MakeRangeHeader(byte_range_start_, byte_range_end_)); |
148 } | 171 } |
149 | 172 |
150 if (make_response_file_) { | 173 if (make_response_file_) { |
151 url_fetcher_->SaveResponseToTemporaryFile( | 174 url_fetcher_->SaveResponseToTemporaryFile( |
152 content::BrowserThread::GetMessageLoopProxyForThread( | 175 content::BrowserThread::GetMessageLoopProxyForThread( |
153 content::BrowserThread::FILE)); | 176 content::BrowserThread::FILE)); |
154 } | 177 } |
(...skipping 15 matching lines...) Expand all Loading... |
170 | 193 |
171 url_fetcher_->Start(); | 194 url_fetcher_->Start(); |
172 } else { | 195 } else { |
173 delegate_->OnError(this, RETRY_ERROR); | 196 delegate_->OnError(this, RETRY_ERROR); |
174 } | 197 } |
175 } | 198 } |
176 | 199 |
177 void PrivetURLFetcher::Start() { | 200 void PrivetURLFetcher::Start() { |
178 DCHECK_EQ(tries_, 0); // We haven't called |Start()| yet. | 201 DCHECK_EQ(tries_, 0); // We haven't called |Start()| yet. |
179 | 202 |
180 if (!send_empty_privet_token_) { | 203 if (!send_empty_privet_token_ && !v3_mode_) { |
181 std::string privet_access_token; | 204 std::string privet_access_token; |
182 privet_access_token = GetPrivetAccessToken(); | 205 privet_access_token = GetPrivetAccessToken(); |
183 if (privet_access_token.empty()) { | 206 if (privet_access_token.empty()) { |
184 RequestTokenRefresh(); | 207 RequestTokenRefresh(); |
185 return; | 208 return; |
186 } | 209 } |
187 } | 210 } |
188 | 211 |
189 Try(); | 212 Try(); |
190 } | 213 } |
(...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
344 } | 367 } |
345 | 368 |
346 bool PrivetURLFetcher::PrivetErrorTransient(const std::string& error) { | 369 bool PrivetURLFetcher::PrivetErrorTransient(const std::string& error) { |
347 return (error == kPrivetErrorDeviceBusy) || | 370 return (error == kPrivetErrorDeviceBusy) || |
348 (error == kPrivetV3ErrorDeviceBusy) || | 371 (error == kPrivetV3ErrorDeviceBusy) || |
349 (error == kPrivetErrorPendingUserAction) || | 372 (error == kPrivetErrorPendingUserAction) || |
350 (error == kPrivetErrorPrinterBusy); | 373 (error == kPrivetErrorPrinterBusy); |
351 } | 374 } |
352 | 375 |
353 } // namespace local_discovery | 376 } // namespace local_discovery |
OLD | NEW |