OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 "google_apis/gaia/oauth2_access_token_fetcher_impl.h" | 5 #include "google_apis/gaia/oauth2_access_token_fetcher_impl.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <string> | 8 #include <string> |
9 #include <vector> | 9 #include <vector> |
10 | 10 |
(...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
176 histogram_value); | 176 histogram_value); |
177 if (!status.is_success()) { | 177 if (!status.is_success()) { |
178 OnGetTokenFailure(CreateAuthError(status)); | 178 OnGetTokenFailure(CreateAuthError(status)); |
179 return; | 179 return; |
180 } | 180 } |
181 | 181 |
182 switch (source->GetResponseCode()) { | 182 switch (source->GetResponseCode()) { |
183 case net::HTTP_OK: | 183 case net::HTTP_OK: |
184 break; | 184 break; |
185 case net::HTTP_FORBIDDEN: | 185 case net::HTTP_FORBIDDEN: |
186 case net::HTTP_INTERNAL_SERVER_ERROR: | |
187 // HTTP_FORBIDDEN (403) is treated as temporary error, because it may be | 186 // HTTP_FORBIDDEN (403) is treated as temporary error, because it may be |
188 // '403 Rate Limit Exeeded.' 500 is always treated as transient. | 187 // '403 Rate Limit Exeeded.' |
189 OnGetTokenFailure( | 188 OnGetTokenFailure( |
190 GoogleServiceAuthError(GoogleServiceAuthError::SERVICE_UNAVAILABLE)); | 189 GoogleServiceAuthError(GoogleServiceAuthError::SERVICE_UNAVAILABLE)); |
191 return; | 190 return; |
192 case net::HTTP_BAD_REQUEST: { | 191 case net::HTTP_BAD_REQUEST: { |
193 // HTTP_BAD_REQUEST (400) usually contains error as per | 192 // HTTP_BAD_REQUEST (400) usually contains error as per |
194 // http://tools.ietf.org/html/rfc6749#section-5.2. | 193 // http://tools.ietf.org/html/rfc6749#section-5.2. |
195 std::string gaia_error; | 194 std::string gaia_error; |
196 if (!ParseGetAccessTokenFailureResponse(source, &gaia_error)) { | 195 if (!ParseGetAccessTokenFailureResponse(source, &gaia_error)) { |
197 OnGetTokenFailure( | 196 OnGetTokenFailure( |
198 GoogleServiceAuthError(GoogleServiceAuthError::SERVICE_ERROR)); | 197 GoogleServiceAuthError(GoogleServiceAuthError::SERVICE_ERROR)); |
199 return; | 198 return; |
200 } | 199 } |
201 | 200 |
202 OAuth2ErrorCodesForHistogram access_error( | 201 OAuth2ErrorCodesForHistogram access_error( |
203 OAuth2ErrorToHistogramValue(gaia_error)); | 202 OAuth2ErrorToHistogramValue(gaia_error)); |
204 UMA_HISTOGRAM_ENUMERATION("Gaia.BadRequestTypeForOAuth2AccessToken", | 203 UMA_HISTOGRAM_ENUMERATION("Gaia.BadRequestTypeForOAuth2AccessToken", |
205 access_error, | 204 access_error, |
206 OAUTH2_ACCESS_ERROR_COUNT); | 205 OAUTH2_ACCESS_ERROR_COUNT); |
207 | 206 |
208 OnGetTokenFailure( | 207 OnGetTokenFailure( |
209 access_error == OAUTH2_ACCESS_ERROR_INVALID_GRANT | 208 access_error == OAUTH2_ACCESS_ERROR_INVALID_GRANT |
210 ? GoogleServiceAuthError( | 209 ? GoogleServiceAuthError( |
211 GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS) | 210 GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS) |
212 : GoogleServiceAuthError(GoogleServiceAuthError::SERVICE_ERROR)); | 211 : GoogleServiceAuthError(GoogleServiceAuthError::SERVICE_ERROR)); |
213 return; | 212 return; |
214 } | 213 } |
215 default: | 214 default: { |
216 // The other errors are treated as permanent error. | 215 if (source->GetResponseCode() >= net::HTTP_INTERNAL_SERVER_ERROR) { |
217 OnGetTokenFailure(GoogleServiceAuthError( | 216 // 5xx is always treated as transient. |
218 GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS)); | 217 OnGetTokenFailure(GoogleServiceAuthError( |
| 218 GoogleServiceAuthError::SERVICE_UNAVAILABLE)); |
| 219 } else { |
| 220 // The other errors are treated as permanent error. |
| 221 DLOG(ERROR) << "Unexpected persistent error: http_status=" |
| 222 << source->GetResponseCode(); |
| 223 OnGetTokenFailure(GoogleServiceAuthError( |
| 224 GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS)); |
| 225 } |
219 return; | 226 return; |
| 227 } |
220 } | 228 } |
221 | 229 |
222 // The request was successfully fetched and it returned OK. | 230 // The request was successfully fetched and it returned OK. |
223 // Parse out the access token and the expiration time. | 231 // Parse out the access token and the expiration time. |
224 std::string access_token; | 232 std::string access_token; |
225 int expires_in; | 233 int expires_in; |
226 if (!ParseGetAccessTokenSuccessResponse(source, &access_token, &expires_in)) { | 234 if (!ParseGetAccessTokenSuccessResponse(source, &access_token, &expires_in)) { |
227 DLOG(WARNING) << "Response doesn't match expected format"; | 235 DLOG(WARNING) << "Response doesn't match expected format"; |
228 OnGetTokenFailure( | 236 OnGetTokenFailure( |
229 GoogleServiceAuthError(GoogleServiceAuthError::SERVICE_UNAVAILABLE)); | 237 GoogleServiceAuthError(GoogleServiceAuthError::SERVICE_UNAVAILABLE)); |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
304 // static | 312 // static |
305 bool OAuth2AccessTokenFetcherImpl::ParseGetAccessTokenFailureResponse( | 313 bool OAuth2AccessTokenFetcherImpl::ParseGetAccessTokenFailureResponse( |
306 const net::URLFetcher* source, | 314 const net::URLFetcher* source, |
307 std::string* error) { | 315 std::string* error) { |
308 CHECK(error); | 316 CHECK(error); |
309 scoped_ptr<base::DictionaryValue> value = ParseGetAccessTokenResponse(source); | 317 scoped_ptr<base::DictionaryValue> value = ParseGetAccessTokenResponse(source); |
310 if (value.get() == NULL) | 318 if (value.get() == NULL) |
311 return false; | 319 return false; |
312 return value->GetString(kErrorKey, error); | 320 return value->GetString(kErrorKey, error); |
313 } | 321 } |
OLD | NEW |