#include "base/stl_util.h"
#include "base/supports_user_data.h"
#include "net/base/load_flags.h"
+#include "net/base/net_errors.h"
#include "net/url_request/url_fetcher.h"
#include "net/url_request/url_fetcher_delegate.h"
#include "net/url_request/url_request_context_getter.h"
: url_request_context_getter_(url_request_context_getter),
discard_uploads_(true) {}
- virtual ~DomainReliabilityUploaderImpl() {
+ ~DomainReliabilityUploaderImpl() override {
// Delete any in-flight URLFetchers.
STLDeleteContainerPairFirstPointers(
upload_callbacks_.begin(), upload_callbacks_.end());
}
// DomainReliabilityUploader implementation:
- virtual void UploadReport(
+ void UploadReport(
const std::string& report_json,
const GURL& upload_url,
- const DomainReliabilityUploader::UploadCallback& callback) OVERRIDE {
+ const DomainReliabilityUploader::UploadCallback& callback) override {
VLOG(1) << "Uploading report to " << upload_url;
VLOG(2) << "Report JSON: " << report_json;
upload_callbacks_[fetcher] = callback;
}
- virtual void set_discard_uploads(bool discard_uploads) OVERRIDE {
+ void set_discard_uploads(bool discard_uploads) override {
discard_uploads_ = discard_uploads;
VLOG(1) << "Setting discard_uploads to " << discard_uploads;
}
// net::URLFetcherDelegate implementation:
- virtual void OnURLFetchComplete(
- const net::URLFetcher* fetcher) OVERRIDE {
+ void OnURLFetchComplete(const net::URLFetcher* fetcher) override {
DCHECK(fetcher);
UploadCallbackMap::iterator callback_it = upload_callbacks_.find(fetcher);
DCHECK(callback_it != upload_callbacks_.end());
- VLOG(1) << "Upload finished with " << fetcher->GetResponseCode();
+ int net_error;
+ {
+ const net::URLRequestStatus& status = fetcher->GetStatus();
+ switch (status.status()) {
+ case net::URLRequestStatus::SUCCESS:
+ net_error = net::OK;
+ break;
+ case net::URLRequestStatus::CANCELED:
+ net_error = net::ERR_ABORTED;
+ break;
+ case net::URLRequestStatus::FAILED:
+ net_error = status.error();
+ break;
+ default:
+ NOTREACHED();
+ net_error = net::ERR_FAILED;
+ break;
+ }
+ }
+ int http_response_code = fetcher->GetResponseCode();
+
+ VLOG(1) << "Upload finished with net error " << net_error <<
+ " and HTTP response code " << http_response_code;
UMA_HISTOGRAM_SPARSE_SLOWLY("DomainReliability.UploadResponseCode",
- fetcher->GetResponseCode());
+ http_response_code);
+ UMA_HISTOGRAM_SPARSE_SLOWLY("DomainReliability.UploadNetError",
+ -net_error);
- bool success = fetcher->GetResponseCode() == 200;
- callback_it->second.Run(success);
+ callback_it->second.Run(http_response_code == 200);
delete callback_it->first;
upload_callbacks_.erase(callback_it);