| Index: google_apis/gcm/engine/unregistration_request.cc
|
| diff --git a/google_apis/gcm/engine/unregistration_request.cc b/google_apis/gcm/engine/unregistration_request.cc
|
| index 9b337786f3e8a9c985fffd4206e242eeeb6566de..931a5e9479cd8283c5d7c85ec473e402ed80b6ab 100644
|
| --- a/google_apis/gcm/engine/unregistration_request.cc
|
| +++ b/google_apis/gcm/engine/unregistration_request.cc
|
| @@ -10,6 +10,7 @@
|
| #include "base/strings/string_number_conversions.h"
|
| #include "base/strings/string_piece.h"
|
| #include "base/values.h"
|
| +#include "google_apis/gcm/base/gcm_util.h"
|
| #include "google_apis/gcm/monitoring/gcm_stats_recorder.h"
|
| #include "net/base/escape.h"
|
| #include "net/http/http_request_headers.h"
|
| @@ -30,71 +31,6 @@ const char kDeleteKey[] = "delete";
|
| const char kDeleteValue[] = "true";
|
| const char kDeviceIdKey[] = "device";
|
| const char kLoginHeader[] = "AidLogin";
|
| -const char kUnregistrationCallerKey[] = "gcm_unreg_caller";
|
| -// We are going to set the value to "false" in order to forcefully unregister
|
| -// the application.
|
| -const char kUnregistrationCallerValue[] = "false";
|
| -
|
| -// Response constants.
|
| -const char kDeletedPrefix[] = "deleted=";
|
| -const char kErrorPrefix[] = "Error=";
|
| -const char kInvalidParameters[] = "INVALID_PARAMETERS";
|
| -
|
| -
|
| -void BuildFormEncoding(const std::string& key,
|
| - const std::string& value,
|
| - std::string* out) {
|
| - if (!out->empty())
|
| - out->append("&");
|
| - out->append(key + "=" + net::EscapeUrlEncodedData(value, true));
|
| -}
|
| -
|
| -UnregistrationRequest::Status ParseFetcherResponse(
|
| - const net::URLFetcher* source,
|
| - std::string request_app_id) {
|
| - if (!source->GetStatus().is_success()) {
|
| - DVLOG(1) << "Fetcher failed";
|
| - return UnregistrationRequest::URL_FETCHING_FAILED;
|
| - }
|
| -
|
| - net::HttpStatusCode response_status = static_cast<net::HttpStatusCode>(
|
| - source->GetResponseCode());
|
| - if (response_status != net::HTTP_OK) {
|
| - DVLOG(1) << "HTTP Status code is not OK, but: " << response_status;
|
| - if (response_status == net::HTTP_SERVICE_UNAVAILABLE)
|
| - return UnregistrationRequest::SERVICE_UNAVAILABLE;
|
| - else if (response_status == net::HTTP_INTERNAL_SERVER_ERROR)
|
| - return UnregistrationRequest::INTERNAL_SERVER_ERROR;
|
| - return UnregistrationRequest::HTTP_NOT_OK;
|
| - }
|
| -
|
| - std::string response;
|
| - if (!source->GetResponseAsString(&response)) {
|
| - DVLOG(1) << "Failed to get response body.";
|
| - return UnregistrationRequest::NO_RESPONSE_BODY;
|
| - }
|
| -
|
| - DVLOG(1) << "Parsing unregistration response.";
|
| - if (response.find(kDeletedPrefix) != std::string::npos) {
|
| - std::string app_id = response.substr(
|
| - response.find(kDeletedPrefix) + arraysize(kDeletedPrefix) - 1);
|
| - if (app_id == request_app_id)
|
| - return UnregistrationRequest::SUCCESS;
|
| - return UnregistrationRequest::INCORRECT_APP_ID;
|
| - }
|
| -
|
| - if (response.find(kErrorPrefix) != std::string::npos) {
|
| - std::string error = response.substr(
|
| - response.find(kErrorPrefix) + arraysize(kErrorPrefix) - 1);
|
| - if (error == kInvalidParameters)
|
| - return UnregistrationRequest::INVALID_PARAMETERS;
|
| - return UnregistrationRequest::UNKNOWN_ERROR;
|
| - }
|
| -
|
| - DVLOG(1) << "Not able to parse a meaningful output from response body."
|
| - << response;
|
| - return UnregistrationRequest::RESPONSE_PARSING_FAILED;
|
| -}
|
|
|
| } // namespace
|
|
|
| @@ -105,19 +41,27 @@ UnregistrationRequest::RequestInfo::RequestInfo(
|
| : android_id(android_id),
|
| security_token(security_token),
|
| app_id(app_id) {
|
| + DCHECK(android_id != 0UL);
|
| + DCHECK(security_token != 0UL);
|
| }
|
|
|
| UnregistrationRequest::RequestInfo::~RequestInfo() {}
|
|
|
| +UnregistrationRequest::CustomRequestHandler::CustomRequestHandler() {}
|
| +
|
| +UnregistrationRequest::CustomRequestHandler::~CustomRequestHandler() {}
|
| +
|
| UnregistrationRequest::UnregistrationRequest(
|
| const GURL& registration_url,
|
| const RequestInfo& request_info,
|
| + scoped_ptr<CustomRequestHandler> custom_request_handler,
|
| const net::BackoffEntry::Policy& backoff_policy,
|
| const UnregistrationCallback& callback,
|
| scoped_refptr<net::URLRequestContextGetter> request_context_getter,
|
| GCMStatsRecorder* recorder)
|
| : callback_(callback),
|
| request_info_(request_info),
|
| + custom_request_handler_(custom_request_handler.Pass()),
|
| registration_url_(registration_url),
|
| backoff_entry_(&backoff_policy),
|
| request_context_getter_(request_context_getter),
|
| @@ -129,30 +73,18 @@ UnregistrationRequest::~UnregistrationRequest() {}
|
|
|
| void UnregistrationRequest::Start() {
|
| DCHECK(!callback_.is_null());
|
| - DCHECK(request_info_.android_id != 0UL);
|
| - DCHECK(request_info_.security_token != 0UL);
|
| DCHECK(!url_fetcher_.get());
|
|
|
| url_fetcher_ =
|
| net::URLFetcher::Create(registration_url_, net::URLFetcher::POST, this);
|
| url_fetcher_->SetRequestContext(request_context_getter_.get());
|
|
|
| - std::string android_id = base::Uint64ToString(request_info_.android_id);
|
| - std::string auth_header =
|
| - std::string(kLoginHeader) + " " + android_id + ":" +
|
| - base::Uint64ToString(request_info_.security_token);
|
| - net::HttpRequestHeaders headers;
|
| - headers.SetHeader(net::HttpRequestHeaders::kAuthorization, auth_header);
|
| - headers.SetHeader(kAppIdKey, request_info_.app_id);
|
| - url_fetcher_->SetExtraRequestHeaders(headers.ToString());
|
| + std::string extra_headers;
|
| + BuildRequestHeaders(&extra_headers);
|
| + url_fetcher_->SetExtraRequestHeaders(extra_headers);
|
|
|
| std::string body;
|
| - BuildFormEncoding(kAppIdKey, request_info_.app_id, &body);
|
| - BuildFormEncoding(kDeviceIdKey, android_id, &body);
|
| - BuildFormEncoding(kDeleteKey, kDeleteValue, &body);
|
| - BuildFormEncoding(kUnregistrationCallerKey,
|
| - kUnregistrationCallerValue,
|
| - &body);
|
| + BuildRequestBody(&body);
|
|
|
| DVLOG(1) << "Unregistration request: " << body;
|
| url_fetcher_->SetUploadData(kRequestContentType, body);
|
| @@ -163,6 +95,50 @@ void UnregistrationRequest::Start() {
|
| url_fetcher_->Start();
|
| }
|
|
|
| +void UnregistrationRequest::BuildRequestHeaders(std::string* extra_headers) {
|
| + net::HttpRequestHeaders headers;
|
| + headers.SetHeader(
|
| + net::HttpRequestHeaders::kAuthorization,
|
| + std::string(kLoginHeader) + " " +
|
| + base::Uint64ToString(request_info_.android_id) + ":" +
|
| + base::Uint64ToString(request_info_.security_token));
|
| + headers.SetHeader(kAppIdKey, request_info_.app_id);
|
| + *extra_headers = headers.ToString();
|
| +}
|
| +
|
| +void UnregistrationRequest::BuildRequestBody(std::string* body) {
|
| + BuildFormEncoding(kAppIdKey, request_info_.app_id, body);
|
| + BuildFormEncoding(kDeviceIdKey,
|
| + base::Uint64ToString(request_info_.android_id),
|
| + body);
|
| + BuildFormEncoding(kDeleteKey, kDeleteValue, body);
|
| +
|
| + DCHECK(custom_request_handler_.get());
|
| + custom_request_handler_->BuildRequestBody(body);
|
| +}
|
| +
|
| +UnregistrationRequest::Status UnregistrationRequest::ParseResponse(
|
| + const net::URLFetcher* source) {
|
| + if (!source->GetStatus().is_success()) {
|
| + DVLOG(1) << "Fetcher failed";
|
| + return URL_FETCHING_FAILED;
|
| + }
|
| +
|
| + net::HttpStatusCode response_status = static_cast<net::HttpStatusCode>(
|
| + source->GetResponseCode());
|
| + if (response_status != net::HTTP_OK) {
|
| + DVLOG(1) << "HTTP Status code is not OK, but: " << response_status;
|
| + if (response_status == net::HTTP_SERVICE_UNAVAILABLE)
|
| + return SERVICE_UNAVAILABLE;
|
| + if (response_status == net::HTTP_INTERNAL_SERVER_ERROR)
|
| + return INTERNAL_SERVER_ERROR;
|
| + return HTTP_NOT_OK;
|
| + }
|
| +
|
| + DCHECK(custom_request_handler_.get());
|
| + return custom_request_handler_->ParseResponse(source);
|
| +}
|
| +
|
| void UnregistrationRequest::RetryWithBackoff(bool update_backoff) {
|
| if (update_backoff) {
|
| url_fetcher_.reset();
|
| @@ -190,8 +166,7 @@ void UnregistrationRequest::RetryWithBackoff(bool update_backoff) {
|
| }
|
|
|
| void UnregistrationRequest::OnURLFetchComplete(const net::URLFetcher* source) {
|
| - UnregistrationRequest::Status status =
|
| - ParseFetcherResponse(source, request_info_.app_id);
|
| + UnregistrationRequest::Status status = ParseResponse(source);
|
|
|
| DVLOG(1) << "UnregistrationRequestStauts: " << status;
|
| UMA_HISTOGRAM_ENUMERATION("GCM.UnregistrationRequestStatus",
|
|
|