Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(218)

Unified Diff: google_apis/gcm/engine/unregistration_request.cc

Issue 1137463003: Support getting and deleting token for Instance ID. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Patch to land Created 5 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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",
« no previous file with comments | « google_apis/gcm/engine/unregistration_request.h ('k') | google_apis/gcm/engine/unregistration_request_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698