| OLD | NEW |
| 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 "components/domain_reliability/uploader.h" | 5 #include "components/domain_reliability/uploader.h" |
| 6 | 6 |
| 7 #include <utility> |
| 8 |
| 7 #include "base/bind.h" | 9 #include "base/bind.h" |
| 8 #include "base/callback.h" | 10 #include "base/callback.h" |
| 9 #include "base/metrics/sparse_histogram.h" | 11 #include "base/metrics/sparse_histogram.h" |
| 10 #include "base/stl_util.h" | |
| 11 #include "base/supports_user_data.h" | 12 #include "base/supports_user_data.h" |
| 12 #include "components/data_use_measurement/core/data_use_user_data.h" | 13 #include "components/data_use_measurement/core/data_use_user_data.h" |
| 13 #include "components/domain_reliability/util.h" | 14 #include "components/domain_reliability/util.h" |
| 14 #include "net/base/load_flags.h" | 15 #include "net/base/load_flags.h" |
| 15 #include "net/base/net_errors.h" | 16 #include "net/base/net_errors.h" |
| 16 #include "net/http/http_response_headers.h" | 17 #include "net/http/http_response_headers.h" |
| 17 #include "net/http/http_util.h" | 18 #include "net/http/http_util.h" |
| 18 #include "net/url_request/url_fetcher.h" | 19 #include "net/url_request/url_fetcher.h" |
| 19 #include "net/url_request/url_fetcher_delegate.h" | 20 #include "net/url_request/url_fetcher_delegate.h" |
| 20 #include "net/url_request/url_request_context_getter.h" | 21 #include "net/url_request/url_request_context_getter.h" |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 53 : public DomainReliabilityUploader, net::URLFetcherDelegate { | 54 : public DomainReliabilityUploader, net::URLFetcherDelegate { |
| 54 public: | 55 public: |
| 55 DomainReliabilityUploaderImpl( | 56 DomainReliabilityUploaderImpl( |
| 56 MockableTime* time, | 57 MockableTime* time, |
| 57 const scoped_refptr< | 58 const scoped_refptr< |
| 58 net::URLRequestContextGetter>& url_request_context_getter) | 59 net::URLRequestContextGetter>& url_request_context_getter) |
| 59 : time_(time), | 60 : time_(time), |
| 60 url_request_context_getter_(url_request_context_getter), | 61 url_request_context_getter_(url_request_context_getter), |
| 61 discard_uploads_(true) {} | 62 discard_uploads_(true) {} |
| 62 | 63 |
| 63 ~DomainReliabilityUploaderImpl() override { | 64 ~DomainReliabilityUploaderImpl() override {} |
| 64 // Delete any in-flight URLFetchers. | |
| 65 base::STLDeleteContainerPairFirstPointers(upload_callbacks_.begin(), | |
| 66 upload_callbacks_.end()); | |
| 67 } | |
| 68 | 65 |
| 69 // DomainReliabilityUploader implementation: | 66 // DomainReliabilityUploader implementation: |
| 70 void UploadReport( | 67 void UploadReport( |
| 71 const std::string& report_json, | 68 const std::string& report_json, |
| 72 int max_upload_depth, | 69 int max_upload_depth, |
| 73 const GURL& upload_url, | 70 const GURL& upload_url, |
| 74 const DomainReliabilityUploader::UploadCallback& callback) override { | 71 const DomainReliabilityUploader::UploadCallback& callback) override { |
| 75 VLOG(1) << "Uploading report to " << upload_url; | 72 VLOG(1) << "Uploading report to " << upload_url; |
| 76 VLOG(2) << "Report JSON: " << report_json; | 73 VLOG(2) << "Report JSON: " << report_json; |
| 77 | 74 |
| 78 if (discard_uploads_) { | 75 if (discard_uploads_) { |
| 79 VLOG(1) << "Discarding report instead of uploading."; | 76 VLOG(1) << "Discarding report instead of uploading."; |
| 80 UploadResult result; | 77 UploadResult result; |
| 81 result.status = UploadResult::SUCCESS; | 78 result.status = UploadResult::SUCCESS; |
| 82 callback.Run(result); | 79 callback.Run(result); |
| 83 return; | 80 return; |
| 84 } | 81 } |
| 85 | 82 |
| 86 net::URLFetcher* fetcher = | 83 std::unique_ptr<net::URLFetcher> owned_fetcher = |
| 87 net::URLFetcher::Create(0, upload_url, net::URLFetcher::POST, this) | 84 net::URLFetcher::Create(0, upload_url, net::URLFetcher::POST, this); |
| 88 .release(); | 85 net::URLFetcher* fetcher = owned_fetcher.get(); |
| 89 data_use_measurement::DataUseUserData::AttachToFetcher( | 86 data_use_measurement::DataUseUserData::AttachToFetcher( |
| 90 fetcher, data_use_measurement::DataUseUserData::DOMAIN_RELIABILITY); | 87 fetcher, data_use_measurement::DataUseUserData::DOMAIN_RELIABILITY); |
| 91 fetcher->SetRequestContext(url_request_context_getter_.get()); | 88 fetcher->SetRequestContext(url_request_context_getter_.get()); |
| 92 fetcher->SetLoadFlags(net::LOAD_DO_NOT_SEND_COOKIES | | 89 fetcher->SetLoadFlags(net::LOAD_DO_NOT_SEND_COOKIES | |
| 93 net::LOAD_DO_NOT_SAVE_COOKIES); | 90 net::LOAD_DO_NOT_SAVE_COOKIES); |
| 94 fetcher->SetUploadData(kJsonMimeType, report_json); | 91 fetcher->SetUploadData(kJsonMimeType, report_json); |
| 95 fetcher->SetAutomaticallyRetryOn5xx(false); | 92 fetcher->SetAutomaticallyRetryOn5xx(false); |
| 96 fetcher->SetURLRequestUserData( | 93 fetcher->SetURLRequestUserData( |
| 97 UploadUserData::kUserDataKey, | 94 UploadUserData::kUserDataKey, |
| 98 UploadUserData::CreateCreateDataCallback(max_upload_depth + 1)); | 95 UploadUserData::CreateCreateDataCallback(max_upload_depth + 1)); |
| 99 fetcher->Start(); | 96 fetcher->Start(); |
| 100 | 97 |
| 101 upload_callbacks_[fetcher] = callback; | 98 upload_callbacks_[fetcher] = {std::move(owned_fetcher), callback}; |
| 102 } | 99 } |
| 103 | 100 |
| 104 void set_discard_uploads(bool discard_uploads) override { | 101 void set_discard_uploads(bool discard_uploads) override { |
| 105 discard_uploads_ = discard_uploads; | 102 discard_uploads_ = discard_uploads; |
| 106 VLOG(1) << "Setting discard_uploads to " << discard_uploads; | 103 VLOG(1) << "Setting discard_uploads to " << discard_uploads; |
| 107 } | 104 } |
| 108 | 105 |
| 109 // net::URLFetcherDelegate implementation: | 106 // net::URLFetcherDelegate implementation: |
| 110 void OnURLFetchComplete(const net::URLFetcher* fetcher) override { | 107 void OnURLFetchComplete(const net::URLFetcher* fetcher) override { |
| 111 DCHECK(fetcher); | 108 DCHECK(fetcher); |
| 112 | 109 |
| 113 UploadCallbackMap::iterator callback_it = upload_callbacks_.find(fetcher); | 110 auto callback_it = upload_callbacks_.find(fetcher); |
| 114 DCHECK(callback_it != upload_callbacks_.end()); | 111 DCHECK(callback_it != upload_callbacks_.end()); |
| 115 | 112 |
| 116 int net_error = GetNetErrorFromURLRequestStatus(fetcher->GetStatus()); | 113 int net_error = GetNetErrorFromURLRequestStatus(fetcher->GetStatus()); |
| 117 int http_response_code = fetcher->GetResponseCode(); | 114 int http_response_code = fetcher->GetResponseCode(); |
| 118 base::TimeDelta retry_after; | 115 base::TimeDelta retry_after; |
| 119 { | 116 { |
| 120 std::string retry_after_string; | 117 std::string retry_after_string; |
| 121 if (fetcher->GetResponseHeaders() && | 118 if (fetcher->GetResponseHeaders() && |
| 122 fetcher->GetResponseHeaders()->EnumerateHeader(nullptr, | 119 fetcher->GetResponseHeaders()->EnumerateHeader(nullptr, |
| 123 "Retry-After", | 120 "Retry-After", |
| (...skipping 11 matching lines...) Expand all Loading... |
| 135 UMA_HISTOGRAM_SPARSE_SLOWLY("DomainReliability.UploadResponseCode", | 132 UMA_HISTOGRAM_SPARSE_SLOWLY("DomainReliability.UploadResponseCode", |
| 136 http_response_code); | 133 http_response_code); |
| 137 UMA_HISTOGRAM_SPARSE_SLOWLY("DomainReliability.UploadNetError", | 134 UMA_HISTOGRAM_SPARSE_SLOWLY("DomainReliability.UploadNetError", |
| 138 -net_error); | 135 -net_error); |
| 139 | 136 |
| 140 UploadResult result; | 137 UploadResult result; |
| 141 GetUploadResultFromResponseDetails(net_error, | 138 GetUploadResultFromResponseDetails(net_error, |
| 142 http_response_code, | 139 http_response_code, |
| 143 retry_after, | 140 retry_after, |
| 144 &result); | 141 &result); |
| 145 callback_it->second.Run(result); | 142 callback_it->second.second.Run(result); |
| 146 | 143 |
| 147 delete callback_it->first; | |
| 148 upload_callbacks_.erase(callback_it); | 144 upload_callbacks_.erase(callback_it); |
| 149 } | 145 } |
| 150 | 146 |
| 151 private: | 147 private: |
| 152 using DomainReliabilityUploader::UploadCallback; | 148 using DomainReliabilityUploader::UploadCallback; |
| 153 typedef std::map<const net::URLFetcher*, UploadCallback> UploadCallbackMap; | |
| 154 | 149 |
| 155 MockableTime* time_; | 150 MockableTime* time_; |
| 156 scoped_refptr<net::URLRequestContextGetter> url_request_context_getter_; | 151 scoped_refptr<net::URLRequestContextGetter> url_request_context_getter_; |
| 157 UploadCallbackMap upload_callbacks_; | 152 std::map<const net::URLFetcher*, |
| 153 std::pair<std::unique_ptr<net::URLFetcher>, UploadCallback>> |
| 154 upload_callbacks_; |
| 158 bool discard_uploads_; | 155 bool discard_uploads_; |
| 159 }; | 156 }; |
| 160 | 157 |
| 161 } // namespace | 158 } // namespace |
| 162 | 159 |
| 163 DomainReliabilityUploader::DomainReliabilityUploader() {} | 160 DomainReliabilityUploader::DomainReliabilityUploader() {} |
| 164 DomainReliabilityUploader::~DomainReliabilityUploader() {} | 161 DomainReliabilityUploader::~DomainReliabilityUploader() {} |
| 165 | 162 |
| 166 // static | 163 // static |
| 167 std::unique_ptr<DomainReliabilityUploader> DomainReliabilityUploader::Create( | 164 std::unique_ptr<DomainReliabilityUploader> DomainReliabilityUploader::Create( |
| 168 MockableTime* time, | 165 MockableTime* time, |
| 169 const scoped_refptr<net::URLRequestContextGetter>& | 166 const scoped_refptr<net::URLRequestContextGetter>& |
| 170 url_request_context_getter) { | 167 url_request_context_getter) { |
| 171 return std::unique_ptr<DomainReliabilityUploader>( | 168 return std::unique_ptr<DomainReliabilityUploader>( |
| 172 new DomainReliabilityUploaderImpl(time, url_request_context_getter)); | 169 new DomainReliabilityUploaderImpl(time, url_request_context_getter)); |
| 173 } | 170 } |
| 174 | 171 |
| 175 // static | 172 // static |
| 176 int DomainReliabilityUploader::GetURLRequestUploadDepth( | 173 int DomainReliabilityUploader::GetURLRequestUploadDepth( |
| 177 const net::URLRequest& request) { | 174 const net::URLRequest& request) { |
| 178 UploadUserData* data = static_cast<UploadUserData*>( | 175 UploadUserData* data = static_cast<UploadUserData*>( |
| 179 request.GetUserData(UploadUserData::kUserDataKey)); | 176 request.GetUserData(UploadUserData::kUserDataKey)); |
| 180 if (!data) | 177 if (!data) |
| 181 return 0; | 178 return 0; |
| 182 return data->depth(); | 179 return data->depth(); |
| 183 } | 180 } |
| 184 | 181 |
| 185 } // namespace domain_reliability | 182 } // namespace domain_reliability |
| OLD | NEW |