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

Side by Side Diff: google_apis/gcm/engine/unregistration_request.cc

Issue 2434243002: GCM Engine: Split up reg/unreg UNKNOWN_ERROR to improve metrics (Closed)
Patch Set: Created 4 years, 2 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 unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "google_apis/gcm/engine/unregistration_request.h" 5 #include "google_apis/gcm/engine/unregistration_request.h"
6 6
7 #include <utility> 7 #include <utility>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/location.h" 10 #include "base/location.h"
(...skipping 18 matching lines...) Expand all
29 const char kRequestContentType[] = "application/x-www-form-urlencoded"; 29 const char kRequestContentType[] = "application/x-www-form-urlencoded";
30 30
31 // Request constants. 31 // Request constants.
32 const char kCategoryKey[] = "app"; 32 const char kCategoryKey[] = "app";
33 const char kSubtypeKey[] = "X-subtype"; 33 const char kSubtypeKey[] = "X-subtype";
34 const char kDeleteKey[] = "delete"; 34 const char kDeleteKey[] = "delete";
35 const char kDeleteValue[] = "true"; 35 const char kDeleteValue[] = "true";
36 const char kDeviceIdKey[] = "device"; 36 const char kDeviceIdKey[] = "device";
37 const char kLoginHeader[] = "AidLogin"; 37 const char kLoginHeader[] = "AidLogin";
38 38
39 // Response constants.
40 const char kErrorPrefix[] = "Error=";
41 const char kInvalidParameters[] = "INVALID_PARAMETERS";
42 const char kInternalServerError[] = "InternalServerError";
43 const char kPhoneRegistrationError[] = "PHONE_REGISTRATION_ERROR";
Nicolas Zea 2016/10/20 21:05:23 nit: Given this maps to DEVICE_REGISTRATION_ERROR,
johnme 2016/11/01 14:15:40 Done.
44
45 // Gets correct status from the error message.
46 UnregistrationRequest::Status GetStatusFromError(const std::string& error) {
47 if (error.find(kInvalidParameters) != std::string::npos)
48 return UnregistrationRequest::INVALID_PARAMETERS;
49 if (error.find(kInternalServerError) != std::string::npos)
50 return UnregistrationRequest::INTERNAL_SERVER_ERROR;
51 if (error.find(kPhoneRegistrationError) != std::string::npos)
52 return UnregistrationRequest::DEVICE_REGISTRATION_ERROR;
53 // Should not be reached, unless the server adds new error types.
54 return UnregistrationRequest::UNKNOWN_ERROR;
55 }
56
39 // Determines whether to retry based on the status of the last request. 57 // Determines whether to retry based on the status of the last request.
40 bool ShouldRetryWithStatus(UnregistrationRequest::Status status) { 58 bool ShouldRetryWithStatus(UnregistrationRequest::Status status) {
41 switch (status) { 59 switch (status) {
42 case UnregistrationRequest::URL_FETCHING_FAILED: 60 case UnregistrationRequest::URL_FETCHING_FAILED:
43 case UnregistrationRequest::NO_RESPONSE_BODY: 61 case UnregistrationRequest::NO_RESPONSE_BODY:
44 case UnregistrationRequest::RESPONSE_PARSING_FAILED: 62 case UnregistrationRequest::RESPONSE_PARSING_FAILED:
45 case UnregistrationRequest::INCORRECT_APP_ID: 63 case UnregistrationRequest::INCORRECT_APP_ID:
46 case UnregistrationRequest::SERVICE_UNAVAILABLE: 64 case UnregistrationRequest::SERVICE_UNAVAILABLE:
47 case UnregistrationRequest::INTERNAL_SERVER_ERROR: 65 case UnregistrationRequest::INTERNAL_SERVER_ERROR:
48 case UnregistrationRequest::HTTP_NOT_OK: 66 case UnregistrationRequest::HTTP_NOT_OK:
49 return true; 67 return true;
50 case UnregistrationRequest::SUCCESS: 68 case UnregistrationRequest::SUCCESS:
51 case UnregistrationRequest::INVALID_PARAMETERS: 69 case UnregistrationRequest::INVALID_PARAMETERS:
70 case UnregistrationRequest::DEVICE_REGISTRATION_ERROR:
52 case UnregistrationRequest::UNKNOWN_ERROR: 71 case UnregistrationRequest::UNKNOWN_ERROR:
53 case UnregistrationRequest::REACHED_MAX_RETRIES: 72 case UnregistrationRequest::REACHED_MAX_RETRIES:
54 return false; 73 return false;
55 case UnregistrationRequest::UNREGISTRATION_STATUS_COUNT: 74 case UnregistrationRequest::UNREGISTRATION_STATUS_COUNT:
56 NOTREACHED(); 75 NOTREACHED();
57 break; 76 break;
58 } 77 }
59 return false; 78 return false;
60 } 79 }
61 80
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
152 body); 171 body);
153 BuildFormEncoding(kDeleteKey, kDeleteValue, body); 172 BuildFormEncoding(kDeleteKey, kDeleteValue, body);
154 173
155 DCHECK(custom_request_handler_.get()); 174 DCHECK(custom_request_handler_.get());
156 custom_request_handler_->BuildRequestBody(body); 175 custom_request_handler_->BuildRequestBody(body);
157 } 176 }
158 177
159 UnregistrationRequest::Status UnregistrationRequest::ParseResponse( 178 UnregistrationRequest::Status UnregistrationRequest::ParseResponse(
160 const net::URLFetcher* source) { 179 const net::URLFetcher* source) {
161 if (!source->GetStatus().is_success()) { 180 if (!source->GetStatus().is_success()) {
162 DVLOG(1) << "Fetcher failed"; 181 DVLOG(1) << "Unregistration URL fetching failed.";
163 return URL_FETCHING_FAILED; 182 return URL_FETCHING_FAILED;
164 } 183 }
165 184
185 std::string response;
186 if (!source->GetResponseAsString(&response)) {
187 DVLOG(1) << "Failed to get unregistration response body.";
188 return NO_RESPONSE_BODY;
189 }
190
191 // If we are able to parse a meaningful known error, let's do so. Note that
192 // some errors will have HTTP_OK response code!
193 if (response.find(kErrorPrefix) != std::string::npos) {
194 std::string error = response.substr(
195 response.find(kErrorPrefix) + arraysize(kErrorPrefix) - 1);
196 DVLOG(1) << "Unregistration response error message: " << error;
197 return GetStatusFromError(error);
198 }
199
166 net::HttpStatusCode response_status = static_cast<net::HttpStatusCode>( 200 net::HttpStatusCode response_status = static_cast<net::HttpStatusCode>(
167 source->GetResponseCode()); 201 source->GetResponseCode());
168 if (response_status != net::HTTP_OK) { 202 if (response_status != net::HTTP_OK) {
169 DVLOG(1) << "HTTP Status code is not OK, but: " << response_status; 203 DVLOG(1) << "Unregistration HTTP response code not OK: " << response_status;
170 if (response_status == net::HTTP_SERVICE_UNAVAILABLE) 204 if (response_status == net::HTTP_SERVICE_UNAVAILABLE)
171 return SERVICE_UNAVAILABLE; 205 return SERVICE_UNAVAILABLE;
172 if (response_status == net::HTTP_INTERNAL_SERVER_ERROR) 206 if (response_status == net::HTTP_INTERNAL_SERVER_ERROR)
173 return INTERNAL_SERVER_ERROR; 207 return INTERNAL_SERVER_ERROR;
174 return HTTP_NOT_OK; 208 return HTTP_NOT_OK;
175 } 209 }
176 210
177 DCHECK(custom_request_handler_.get()); 211 DCHECK(custom_request_handler_.get());
178 return custom_request_handler_->ParseResponse(source); 212 return custom_request_handler_->ParseResponse(response);
179 } 213 }
180 214
181 void UnregistrationRequest::RetryWithBackoff() { 215 void UnregistrationRequest::RetryWithBackoff() {
182 DCHECK_GT(retries_left_, 0); 216 DCHECK_GT(retries_left_, 0);
183 --retries_left_; 217 --retries_left_;
184 url_fetcher_.reset(); 218 url_fetcher_.reset();
185 backoff_entry_.InformOfRequest(false); 219 backoff_entry_.InformOfRequest(false);
186 220
187 DVLOG(1) << "Delaying GCM unregistration of app: " << request_info_.app_id() 221 DVLOG(1) << "Delaying GCM unregistration of app: " << request_info_.app_id()
188 << ", for " << backoff_entry_.GetTimeUntilRelease().InMilliseconds() 222 << ", for " << backoff_entry_.GetTimeUntilRelease().InMilliseconds()
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
224 // Only REACHED_MAX_RETRIES is reported because the function will skip 258 // Only REACHED_MAX_RETRIES is reported because the function will skip
225 // reporting count and time when status is not SUCCESS. 259 // reporting count and time when status is not SUCCESS.
226 DCHECK(custom_request_handler_.get()); 260 DCHECK(custom_request_handler_.get());
227 custom_request_handler_->ReportUMAs(status, 0, base::TimeDelta()); 261 custom_request_handler_->ReportUMAs(status, 0, base::TimeDelta());
228 } 262 }
229 263
230 callback_.Run(status); 264 callback_.Run(status);
231 } 265 }
232 266
233 } // namespace gcm 267 } // namespace gcm
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698