| Index: google_apis/gcm/engine/registration_request.cc
|
| diff --git a/google_apis/gcm/engine/registration_request.cc b/google_apis/gcm/engine/registration_request.cc
|
| index 58ce94b9df012b35da77ea0cb7711b87b960b92f..386af0e7eab3f55967901e5e066684f10acaaf75 100644
|
| --- a/google_apis/gcm/engine/registration_request.cc
|
| +++ b/google_apis/gcm/engine/registration_request.cc
|
| @@ -45,11 +45,12 @@ const char kDeviceRegistrationError[] = "PHONE_REGISTRATION_ERROR";
|
| const char kAuthenticationFailed[] = "AUTHENTICATION_FAILED";
|
| const char kInvalidSender[] = "INVALID_SENDER";
|
| const char kInvalidParameters[] = "INVALID_PARAMETERS";
|
| +const char kInternalServerError[] = "InternalServerError";
|
| +const char kQuotaExceeded[] = "QUOTA_EXCEEDED";
|
| +const char kTooManyRegistrations[] = "TOO_MANY_REGISTRATIONS";
|
|
|
| // Gets correct status from the error message.
|
| RegistrationRequest::Status GetStatusFromError(const std::string& error) {
|
| - // TODO(fgorski): Improve error parsing in case there is nore then just an
|
| - // Error=ERROR_STRING in response.
|
| if (error.find(kDeviceRegistrationError) != std::string::npos)
|
| return RegistrationRequest::DEVICE_REGISTRATION_ERROR;
|
| if (error.find(kAuthenticationFailed) != std::string::npos)
|
| @@ -58,6 +59,13 @@ RegistrationRequest::Status GetStatusFromError(const std::string& error) {
|
| return RegistrationRequest::INVALID_SENDER;
|
| if (error.find(kInvalidParameters) != std::string::npos)
|
| return RegistrationRequest::INVALID_PARAMETERS;
|
| + if (error.find(kInternalServerError) != std::string::npos)
|
| + return RegistrationRequest::INTERNAL_SERVER_ERROR;
|
| + if (error.find(kQuotaExceeded) != std::string::npos)
|
| + return RegistrationRequest::QUOTA_EXCEEDED;
|
| + if (error.find(kTooManyRegistrations) != std::string::npos)
|
| + return RegistrationRequest::TOO_MANY_REGISTRATIONS;
|
| + // Should not be reached, unless the server adds new error types.
|
| return RegistrationRequest::UNKNOWN_ERROR;
|
| }
|
|
|
| @@ -70,10 +78,14 @@ bool ShouldRetryWithStatus(RegistrationRequest::Status status) {
|
| case RegistrationRequest::URL_FETCHING_FAILED:
|
| case RegistrationRequest::HTTP_NOT_OK:
|
| case RegistrationRequest::NO_RESPONSE_BODY:
|
| + case RegistrationRequest::RESPONSE_PARSING_FAILED:
|
| + case RegistrationRequest::INTERNAL_SERVER_ERROR:
|
| return true;
|
| case RegistrationRequest::SUCCESS:
|
| case RegistrationRequest::INVALID_PARAMETERS:
|
| case RegistrationRequest::INVALID_SENDER:
|
| + case RegistrationRequest::QUOTA_EXCEEDED:
|
| + case RegistrationRequest::TOO_MANY_REGISTRATIONS:
|
| case RegistrationRequest::REACHED_MAX_RETRIES:
|
| return false;
|
| case RegistrationRequest::STATUS_COUNT:
|
| @@ -199,42 +211,41 @@ void RegistrationRequest::RetryWithBackoff() {
|
| RegistrationRequest::Status RegistrationRequest::ParseResponse(
|
| const net::URLFetcher* source, std::string* token) {
|
| if (!source->GetStatus().is_success()) {
|
| - LOG(ERROR) << "URL fetching failed.";
|
| + DVLOG(1) << "Registration URL fetching failed.";
|
| return URL_FETCHING_FAILED;
|
| }
|
|
|
| std::string response;
|
| if (!source->GetResponseAsString(&response)) {
|
| - LOG(ERROR) << "Failed to parse registration response as a string.";
|
| + DVLOG(1) << "Failed to get registration response body.";
|
| return NO_RESPONSE_BODY;
|
| }
|
|
|
| - if (source->GetResponseCode() == net::HTTP_OK) {
|
| - size_t token_pos = response.find(kTokenPrefix);
|
| - if (token_pos != std::string::npos) {
|
| - *token = response.substr(token_pos + arraysize(kTokenPrefix) - 1);
|
| - return SUCCESS;
|
| - }
|
| - }
|
| -
|
| - // If we are able to parse a meaningful known error, let's do so. Some errors
|
| - // will have HTTP_BAD_REQUEST, some will have HTTP_OK response code.
|
| + // If we are able to parse a meaningful known error, let's do so. Note that
|
| + // some errors will have HTTP_OK response code!
|
| size_t error_pos = response.find(kErrorPrefix);
|
| if (error_pos != std::string::npos) {
|
| std::string error = response.substr(
|
| error_pos + arraysize(kErrorPrefix) - 1);
|
| + DVLOG(1) << "Registration response error message: " << error;
|
| return GetStatusFromError(error);
|
| }
|
|
|
| // If we cannot tell what the error is, but at least we know response code was
|
| // not OK.
|
| if (source->GetResponseCode() != net::HTTP_OK) {
|
| - DLOG(ERROR) << "URL fetching HTTP response code is not OK. It is "
|
| - << source->GetResponseCode();
|
| + DVLOG(1) << "Registration HTTP response code not OK: "
|
| + << source->GetResponseCode();
|
| return HTTP_NOT_OK;
|
| }
|
|
|
| - return UNKNOWN_ERROR;
|
| + size_t token_pos = response.find(kTokenPrefix);
|
| + if (token_pos != std::string::npos) {
|
| + *token = response.substr(token_pos + arraysize(kTokenPrefix) - 1);
|
| + return SUCCESS;
|
| + }
|
| +
|
| + return RESPONSE_PARSING_FAILED;
|
| }
|
|
|
| void RegistrationRequest::OnURLFetchComplete(const net::URLFetcher* source) {
|
|
|