Index: sync/internal_api/attachments/attachment_downloader_impl.cc |
diff --git a/sync/internal_api/attachments/attachment_downloader_impl.cc b/sync/internal_api/attachments/attachment_downloader_impl.cc |
index d43b3ea1cc276620738d6cd538fd718436580af9..a7a43b42b342d164da2f872453de8d6917920197 100644 |
--- a/sync/internal_api/attachments/attachment_downloader_impl.cc |
+++ b/sync/internal_api/attachments/attachment_downloader_impl.cc |
@@ -115,7 +115,7 @@ void AttachmentDownloaderImpl::OnGetTokenFailure( |
DownloadState* download_state = *iter; |
scoped_refptr<base::RefCountedString> null_attachment_data; |
ReportResult( |
- *download_state, DOWNLOAD_UNSPECIFIED_ERROR, null_attachment_data); |
+ *download_state, DOWNLOAD_TRANSIENT_ERROR, null_attachment_data); |
DCHECK(state_map_.find(download_state->attachment_url) != state_map_.end()); |
state_map_.erase(download_state->attachment_url); |
} |
@@ -133,22 +133,28 @@ void AttachmentDownloaderImpl::OnURLFetchComplete( |
const DownloadState& download_state = *iter->second; |
DCHECK(source == download_state.url_fetcher.get()); |
- DownloadResult result = DOWNLOAD_UNSPECIFIED_ERROR; |
+ DownloadResult result = DOWNLOAD_TRANSIENT_ERROR; |
scoped_refptr<base::RefCountedString> attachment_data; |
- if (source->GetResponseCode() == net::HTTP_OK) { |
+ const int response_code = source->GetResponseCode(); |
+ if (response_code == net::HTTP_OK) { |
result = DOWNLOAD_SUCCESS; |
std::string data_as_string; |
source->GetResponseAsString(&data_as_string); |
attachment_data = base::RefCountedString::TakeString(&data_as_string); |
- } else if (source->GetResponseCode() == net::HTTP_UNAUTHORIZED) { |
+ } else if (response_code == net::HTTP_UNAUTHORIZED) { |
+ // Server tells us we've got a bad token so invalidate it. |
OAuth2TokenServiceRequest::InvalidateToken(token_service_provider_.get(), |
account_id_, |
oauth2_scopes_, |
download_state.access_token); |
- // TODO(pavely): crbug/380437. This is transient error. Request new access |
- // token for this DownloadState. The only trick is to do it with exponential |
- // backoff. |
+ // Fail the request, but indicate that it may be successful if retried. |
+ result = DOWNLOAD_TRANSIENT_ERROR; |
+ } else if (response_code == net::HTTP_FORBIDDEN) { |
+ // User is not allowed to use attachments. Retrying won't help. |
+ result = DOWNLOAD_UNSPECIFIED_ERROR; |
+ } else if (response_code == net::URLFetcher::RESPONSE_CODE_INVALID) { |
+ result = DOWNLOAD_TRANSIENT_ERROR; |
} |
ReportResult(download_state, result, attachment_data); |
state_map_.erase(iter); |
@@ -159,6 +165,7 @@ scoped_ptr<net::URLFetcher> AttachmentDownloaderImpl::CreateFetcher( |
const std::string& access_token) { |
scoped_ptr<net::URLFetcher> url_fetcher( |
net::URLFetcher::Create(GURL(url), net::URLFetcher::GET, this)); |
+ url_fetcher->SetAutomaticallyRetryOn5xx(false); |
const std::string auth_header("Authorization: Bearer " + access_token); |
url_fetcher->AddExtraRequestHeader(auth_header); |
url_fetcher->SetRequestContext(url_request_context_getter_.get()); |