| Index: sync/internal_api/attachments/attachment_uploader_impl.cc
|
| diff --git a/sync/internal_api/attachments/attachment_uploader_impl.cc b/sync/internal_api/attachments/attachment_uploader_impl.cc
|
| index 4d197eb6da7edb9d4114c7111c77b0eafe15aca3..59885b76d8854aa2ae967cd33ae060cda3f34b86 100644
|
| --- a/sync/internal_api/attachments/attachment_uploader_impl.cc
|
| +++ b/sync/internal_api/attachments/attachment_uploader_impl.cc
|
| @@ -133,20 +133,22 @@ const Attachment& AttachmentUploaderImpl::UploadState::GetAttachment() {
|
| void AttachmentUploaderImpl::UploadState::OnURLFetchComplete(
|
| const net::URLFetcher* source) {
|
| DCHECK(CalledOnValidThread());
|
| - UploadResult result = UPLOAD_UNSPECIFIED_ERROR;
|
| + UploadResult result = UPLOAD_TRANSIENT_ERROR;
|
| AttachmentId attachment_id = attachment_.GetId();
|
| - if (source->GetResponseCode() == net::HTTP_OK) {
|
| + const int response_code = source->GetResponseCode();
|
| + if (response_code == net::HTTP_OK) {
|
| result = UPLOAD_SUCCESS;
|
| - } else if (source->GetResponseCode() == net::HTTP_UNAUTHORIZED) {
|
| - // TODO(maniscalco): One possibility is that we received a 401 because our
|
| - // access token has expired. We should probably fetch a new access token
|
| - // and retry this upload before giving up and reporting failure to our
|
| - // caller (bug 380437).
|
| + } else if (response_code == net::HTTP_UNAUTHORIZED) {
|
| + // Server tells us we've got a bad token so invalidate it.
|
| OAuth2TokenServiceRequest::InvalidateToken(
|
| token_service_provider_, account_id_, scopes_, access_token_);
|
| - } else {
|
| - // TODO(maniscalco): Once the protocol is better defined, deal with the
|
| - // various HTTP response codes we may encounter.
|
| + // Fail the request, but indicate that it may be successful if retried.
|
| + result = UPLOAD_TRANSIENT_ERROR;
|
| + } else if (response_code == net::HTTP_FORBIDDEN) {
|
| + // User is not allowed to use attachments. Retrying won't help.
|
| + result = UPLOAD_UNSPECIFIED_ERROR;
|
| + } else if (response_code == net::URLFetcher::RESPONSE_CODE_INVALID) {
|
| + result = UPLOAD_TRANSIENT_ERROR;
|
| }
|
| ReportResult(result, attachment_id);
|
| }
|
| @@ -160,6 +162,7 @@ void AttachmentUploaderImpl::UploadState::OnGetTokenSuccess(
|
| access_token_ = access_token;
|
| fetcher_.reset(
|
| net::URLFetcher::Create(upload_url_, net::URLFetcher::POST, this));
|
| + fetcher_->SetAutomaticallyRetryOn5xx(false);
|
| fetcher_->SetRequestContext(url_request_context_getter_.get());
|
| // TODO(maniscalco): Is there a better way? Copying the attachment data into
|
| // a string feels wrong given how large attachments may be (several MBs). If
|
| @@ -184,7 +187,11 @@ void AttachmentUploaderImpl::UploadState::OnGetTokenFailure(
|
| const GoogleServiceAuthError& error) {
|
| DCHECK_EQ(access_token_request_.get(), request);
|
| access_token_request_.reset();
|
| - ReportResult(UPLOAD_UNSPECIFIED_ERROR, attachment_.GetId());
|
| + // TODO(maniscalco): We treat this as a transient error, but it may in fact be
|
| + // a very long lived error and require user action. Consider differentiating
|
| + // between the causes of GetToken failure and act accordingly. Think about
|
| + // the causes of GetToken failure. Are there (bug 412802).
|
| + ReportResult(UPLOAD_TRANSIENT_ERROR, attachment_.GetId());
|
| }
|
|
|
| void AttachmentUploaderImpl::UploadState::GetToken() {
|
|
|