OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/google_apis/operations_base.h" | 5 #include "chrome/browser/google_apis/operations_base.h" |
6 | 6 |
7 #include "base/json/json_reader.h" | 7 #include "base/json/json_reader.h" |
8 #include "base/metrics/histogram.h" | 8 #include "base/metrics/histogram.h" |
9 #include "base/string_number_conversions.h" | 9 #include "base/string_number_conversions.h" |
10 #include "base/stringprintf.h" | 10 #include "base/stringprintf.h" |
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
102 // used to start fetching user data. | 102 // used to start fetching user data. |
103 void AuthOperation::OnGetTokenSuccess(const std::string& access_token, | 103 void AuthOperation::OnGetTokenSuccess(const std::string& access_token, |
104 const base::Time& expiration_time) { | 104 const base::Time& expiration_time) { |
105 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 105 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
106 | 106 |
107 UMA_HISTOGRAM_ENUMERATION("GData.AuthSuccess", | 107 UMA_HISTOGRAM_ENUMERATION("GData.AuthSuccess", |
108 kSuccessRatioHistogramSuccess, | 108 kSuccessRatioHistogramSuccess, |
109 kSuccessRatioHistogramMaxValue); | 109 kSuccessRatioHistogramMaxValue); |
110 | 110 |
111 callback_.Run(HTTP_SUCCESS, access_token); | 111 callback_.Run(HTTP_SUCCESS, access_token); |
112 NotifyFinish(OperationRegistry::OPERATION_COMPLETED); | 112 NotifyFinish(OPERATION_COMPLETED); |
113 } | 113 } |
114 | 114 |
115 // Callback for OAuth2AccessTokenFetcher on failure. | 115 // Callback for OAuth2AccessTokenFetcher on failure. |
116 void AuthOperation::OnGetTokenFailure(const GoogleServiceAuthError& error) { | 116 void AuthOperation::OnGetTokenFailure(const GoogleServiceAuthError& error) { |
117 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 117 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
118 | 118 |
119 LOG(WARNING) << "AuthOperation: token request using refresh token failed" | 119 LOG(WARNING) << "AuthOperation: token request using refresh token failed" |
120 << error.ToString(); | 120 << error.ToString(); |
121 | 121 |
122 // There are many ways to fail, but if the failure is due to connection, | 122 // There are many ways to fail, but if the failure is due to connection, |
123 // it's likely that the device is off-line. We treat the error differently | 123 // it's likely that the device is off-line. We treat the error differently |
124 // so that the file manager works while off-line. | 124 // so that the file manager works while off-line. |
125 if (error.state() == GoogleServiceAuthError::CONNECTION_FAILED) { | 125 if (error.state() == GoogleServiceAuthError::CONNECTION_FAILED) { |
126 UMA_HISTOGRAM_ENUMERATION("GData.AuthSuccess", | 126 UMA_HISTOGRAM_ENUMERATION("GData.AuthSuccess", |
127 kSuccessRatioHistogramNoConnection, | 127 kSuccessRatioHistogramNoConnection, |
128 kSuccessRatioHistogramMaxValue); | 128 kSuccessRatioHistogramMaxValue); |
129 callback_.Run(GDATA_NO_CONNECTION, std::string()); | 129 callback_.Run(GDATA_NO_CONNECTION, std::string()); |
130 } else { | 130 } else { |
131 UMA_HISTOGRAM_ENUMERATION("GData.AuthSuccess", | 131 UMA_HISTOGRAM_ENUMERATION("GData.AuthSuccess", |
132 kSuccessRatioHistogramFailure, | 132 kSuccessRatioHistogramFailure, |
133 kSuccessRatioHistogramMaxValue); | 133 kSuccessRatioHistogramMaxValue); |
134 callback_.Run(HTTP_UNAUTHORIZED, std::string()); | 134 callback_.Run(HTTP_UNAUTHORIZED, std::string()); |
135 } | 135 } |
136 NotifyFinish(OperationRegistry::OPERATION_FAILED); | 136 NotifyFinish(OPERATION_FAILED); |
137 } | 137 } |
138 | 138 |
139 //============================ UrlFetchOperationBase =========================== | 139 //============================ UrlFetchOperationBase =========================== |
140 | 140 |
141 UrlFetchOperationBase::UrlFetchOperationBase(OperationRegistry* registry) | 141 UrlFetchOperationBase::UrlFetchOperationBase(OperationRegistry* registry) |
142 : OperationRegistry::Operation(registry), | 142 : OperationRegistry::Operation(registry), |
143 re_authenticate_count_(0), | 143 re_authenticate_count_(0), |
144 save_temp_file_(false), | 144 save_temp_file_(false), |
145 started_(false) { | 145 started_(false) { |
146 } | 146 } |
147 | 147 |
148 UrlFetchOperationBase::UrlFetchOperationBase( | 148 UrlFetchOperationBase::UrlFetchOperationBase(OperationRegistry* registry, |
149 OperationRegistry* registry, | 149 OperationType type, |
150 OperationRegistry::OperationType type, | 150 const FilePath& path) |
151 const FilePath& path) | |
152 : OperationRegistry::Operation(registry, type, path), | 151 : OperationRegistry::Operation(registry, type, path), |
153 re_authenticate_count_(0), | 152 re_authenticate_count_(0), |
154 save_temp_file_(false) { | 153 save_temp_file_(false) { |
155 } | 154 } |
156 | 155 |
157 UrlFetchOperationBase::~UrlFetchOperationBase() {} | 156 UrlFetchOperationBase::~UrlFetchOperationBase() {} |
158 | 157 |
159 void UrlFetchOperationBase::Start(const std::string& auth_token) { | 158 void UrlFetchOperationBase::Start(const std::string& auth_token) { |
160 DCHECK(!auth_token.empty()); | 159 DCHECK(!auth_token.empty()); |
161 | 160 |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
238 // likely that the failure is due to loss of connection. | 237 // likely that the failure is due to loss of connection. |
239 code = GDATA_NO_CONNECTION; | 238 code = GDATA_NO_CONNECTION; |
240 } | 239 } |
241 return code; | 240 return code; |
242 } | 241 } |
243 | 242 |
244 void UrlFetchOperationBase::OnProcessURLFetchResultsComplete(bool result) { | 243 void UrlFetchOperationBase::OnProcessURLFetchResultsComplete(bool result) { |
245 if (result) | 244 if (result) |
246 NotifySuccessToOperationRegistry(); | 245 NotifySuccessToOperationRegistry(); |
247 else | 246 else |
248 NotifyFinish(OperationRegistry::OPERATION_FAILED); | 247 NotifyFinish(OPERATION_FAILED); |
249 } | 248 } |
250 | 249 |
251 void UrlFetchOperationBase::OnURLFetchComplete(const URLFetcher* source) { | 250 void UrlFetchOperationBase::OnURLFetchComplete(const URLFetcher* source) { |
252 GDataErrorCode code = GetErrorCode(source); | 251 GDataErrorCode code = GetErrorCode(source); |
253 DVLOG(1) << "Response headers:\n" << GetResponseHeadersAsString(source); | 252 DVLOG(1) << "Response headers:\n" << GetResponseHeadersAsString(source); |
254 | 253 |
255 if (code == HTTP_UNAUTHORIZED) { | 254 if (code == HTTP_UNAUTHORIZED) { |
256 if (!re_authenticate_callback_.is_null() && | 255 if (!re_authenticate_callback_.is_null() && |
257 ++re_authenticate_count_ <= kMaxReAuthenticateAttemptsPerOperation) { | 256 ++re_authenticate_count_ <= kMaxReAuthenticateAttemptsPerOperation) { |
258 re_authenticate_callback_.Run(this); | 257 re_authenticate_callback_.Run(this); |
259 return; | 258 return; |
260 } | 259 } |
261 | 260 |
262 OnAuthFailed(code); | 261 OnAuthFailed(code); |
263 return; | 262 return; |
264 } | 263 } |
265 | 264 |
266 // Overridden by each specialization | 265 // Overridden by each specialization |
267 ProcessURLFetchResults(source); | 266 ProcessURLFetchResults(source); |
268 } | 267 } |
269 | 268 |
270 void UrlFetchOperationBase::NotifySuccessToOperationRegistry() { | 269 void UrlFetchOperationBase::NotifySuccessToOperationRegistry() { |
271 NotifyFinish(OperationRegistry::OPERATION_COMPLETED); | 270 NotifyFinish(OPERATION_COMPLETED); |
272 } | 271 } |
273 | 272 |
274 void UrlFetchOperationBase::NotifyStartToOperationRegistry() { | 273 void UrlFetchOperationBase::NotifyStartToOperationRegistry() { |
275 NotifyStart(); | 274 NotifyStart(); |
276 } | 275 } |
277 | 276 |
278 void UrlFetchOperationBase::OnAuthFailed(GDataErrorCode code) { | 277 void UrlFetchOperationBase::OnAuthFailed(GDataErrorCode code) { |
279 RunCallbackOnPrematureFailure(code); | 278 RunCallbackOnPrematureFailure(code); |
280 | 279 |
281 // Notify authentication failed. | 280 // Notify authentication failed. |
282 NotifyAuthFailed(); | 281 NotifyAuthFailed(); |
283 | 282 |
284 // Check if this failed before we even started fetching. If so, register | 283 // Check if this failed before we even started fetching. If so, register |
285 // for start so we can properly unregister with finish. | 284 // for start so we can properly unregister with finish. |
286 if (!started_) | 285 if (!started_) |
287 NotifyStart(); | 286 NotifyStart(); |
288 | 287 |
289 // Note: NotifyFinish() must be invoked at the end, after all other callbacks | 288 // Note: NotifyFinish() must be invoked at the end, after all other callbacks |
290 // and notifications. Once NotifyFinish() is called, the current instance of | 289 // and notifications. Once NotifyFinish() is called, the current instance of |
291 // gdata operation will be deleted from the OperationRegistry and become | 290 // gdata operation will be deleted from the OperationRegistry and become |
292 // invalid. | 291 // invalid. |
293 NotifyFinish(OperationRegistry::OPERATION_FAILED); | 292 NotifyFinish(OPERATION_FAILED); |
294 } | 293 } |
295 | 294 |
296 std::string UrlFetchOperationBase::GetResponseHeadersAsString( | 295 std::string UrlFetchOperationBase::GetResponseHeadersAsString( |
297 const URLFetcher* url_fetcher) { | 296 const URLFetcher* url_fetcher) { |
298 // net::HttpResponseHeaders::raw_headers(), as the name implies, stores | 297 // net::HttpResponseHeaders::raw_headers(), as the name implies, stores |
299 // all headers in their raw format, i.e each header is null-terminated. | 298 // all headers in their raw format, i.e each header is null-terminated. |
300 // So logging raw_headers() only shows the first header, which is probably | 299 // So logging raw_headers() only shows the first header, which is probably |
301 // the status line. GetNormalizedHeaders, on the other hand, will show all | 300 // the status line. GetNormalizedHeaders, on the other hand, will show all |
302 // the headers, one per line, which is probably what we want. | 301 // the headers, one per line, which is probably what we want. |
303 std::string headers; | 302 std::string headers; |
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
417 } | 416 } |
418 | 417 |
419 void GetDataOperation::RunCallback(GDataErrorCode fetch_error_code, | 418 void GetDataOperation::RunCallback(GDataErrorCode fetch_error_code, |
420 scoped_ptr<base::Value> value) { | 419 scoped_ptr<base::Value> value) { |
421 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 420 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
422 if (!callback_.is_null()) | 421 if (!callback_.is_null()) |
423 callback_.Run(fetch_error_code, value.Pass()); | 422 callback_.Run(fetch_error_code, value.Pass()); |
424 } | 423 } |
425 | 424 |
426 } // namespace gdata | 425 } // namespace gdata |
OLD | NEW |