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 "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/callback.h" | 8 #include "base/callback.h" |
9 #include "base/memory/scoped_vector.h" | 9 #include "base/memory/scoped_vector.h" |
10 #include "base/metrics/sparse_histogram.h" | 10 #include "base/metrics/sparse_histogram.h" |
(...skipping 25 matching lines...) Expand all Loading... |
36 }; | 36 }; |
37 | 37 |
38 const void* UploadUserData::kUserDataKey = | 38 const void* UploadUserData::kUserDataKey = |
39 static_cast<const void*>(&UploadUserData::kUserDataKey); | 39 static_cast<const void*>(&UploadUserData::kUserDataKey); |
40 | 40 |
41 class DomainReliabilityUploaderImpl | 41 class DomainReliabilityUploaderImpl |
42 : public DomainReliabilityUploader, net::URLFetcherDelegate { | 42 : public DomainReliabilityUploader, net::URLFetcherDelegate { |
43 public: | 43 public: |
44 DomainReliabilityUploaderImpl(const scoped_refptr< | 44 DomainReliabilityUploaderImpl(const scoped_refptr< |
45 net::URLRequestContextGetter>& url_request_context_getter) | 45 net::URLRequestContextGetter>& url_request_context_getter) |
46 : url_request_context_getter_(url_request_context_getter) {} | 46 : url_request_context_getter_(url_request_context_getter), |
| 47 discard_uploads_(true) {} |
47 | 48 |
48 virtual ~DomainReliabilityUploaderImpl() { | 49 virtual ~DomainReliabilityUploaderImpl() { |
49 // Delete any in-flight URLFetchers. | 50 // Delete any in-flight URLFetchers. |
50 STLDeleteContainerPairFirstPointers( | 51 STLDeleteContainerPairFirstPointers( |
51 upload_callbacks_.begin(), upload_callbacks_.end()); | 52 upload_callbacks_.begin(), upload_callbacks_.end()); |
52 } | 53 } |
53 | 54 |
54 // DomainReliabilityUploader implementation: | 55 // DomainReliabilityUploader implementation: |
55 virtual void UploadReport( | 56 virtual void UploadReport( |
56 const std::string& report_json, | 57 const std::string& report_json, |
57 const GURL& upload_url, | 58 const GURL& upload_url, |
58 const DomainReliabilityUploader::UploadCallback& callback) OVERRIDE { | 59 const DomainReliabilityUploader::UploadCallback& callback) OVERRIDE { |
59 VLOG(1) << "Uploading report to " << upload_url; | 60 VLOG(1) << "Uploading report to " << upload_url; |
60 VLOG(2) << "Report JSON: " << report_json; | 61 VLOG(2) << "Report JSON: " << report_json; |
61 | 62 |
| 63 if (discard_uploads_) { |
| 64 VLOG(1) << "Discarding report instead of uploading."; |
| 65 callback.Run(true); |
| 66 return; |
| 67 } |
| 68 |
62 net::URLFetcher* fetcher = | 69 net::URLFetcher* fetcher = |
63 net::URLFetcher::Create(0, upload_url, net::URLFetcher::POST, this); | 70 net::URLFetcher::Create(0, upload_url, net::URLFetcher::POST, this); |
64 fetcher->SetRequestContext(url_request_context_getter_); | 71 fetcher->SetRequestContext(url_request_context_getter_); |
65 fetcher->SetLoadFlags(net::LOAD_DO_NOT_SEND_COOKIES | | 72 fetcher->SetLoadFlags(net::LOAD_DO_NOT_SEND_COOKIES | |
66 net::LOAD_DO_NOT_SAVE_COOKIES); | 73 net::LOAD_DO_NOT_SAVE_COOKIES); |
67 fetcher->SetUploadData(kJsonMimeType, report_json); | 74 fetcher->SetUploadData(kJsonMimeType, report_json); |
68 fetcher->SetAutomaticallyRetryOn5xx(false); | 75 fetcher->SetAutomaticallyRetryOn5xx(false); |
69 fetcher->SetURLRequestUserData( | 76 fetcher->SetURLRequestUserData( |
70 UploadUserData::kUserDataKey, | 77 UploadUserData::kUserDataKey, |
71 UploadUserData::CreateCreateDataCallback()); | 78 UploadUserData::CreateCreateDataCallback()); |
72 fetcher->Start(); | 79 fetcher->Start(); |
73 | 80 |
74 upload_callbacks_[fetcher] = callback; | 81 upload_callbacks_[fetcher] = callback; |
75 } | 82 } |
76 | 83 |
| 84 virtual void set_discard_uploads(bool discard_uploads) OVERRIDE { |
| 85 discard_uploads_ = discard_uploads; |
| 86 VLOG(1) << "Setting discard_uploads to " << discard_uploads; |
| 87 } |
| 88 |
77 // net::URLFetcherDelegate implementation: | 89 // net::URLFetcherDelegate implementation: |
78 virtual void OnURLFetchComplete( | 90 virtual void OnURLFetchComplete( |
79 const net::URLFetcher* fetcher) OVERRIDE { | 91 const net::URLFetcher* fetcher) OVERRIDE { |
80 DCHECK(fetcher); | 92 DCHECK(fetcher); |
81 | 93 |
82 UploadCallbackMap::iterator callback_it = upload_callbacks_.find(fetcher); | 94 UploadCallbackMap::iterator callback_it = upload_callbacks_.find(fetcher); |
83 DCHECK(callback_it != upload_callbacks_.end()); | 95 DCHECK(callback_it != upload_callbacks_.end()); |
84 | 96 |
85 VLOG(1) << "Upload finished with " << fetcher->GetResponseCode(); | 97 VLOG(1) << "Upload finished with " << fetcher->GetResponseCode(); |
86 | 98 |
87 UMA_HISTOGRAM_SPARSE_SLOWLY("DomainReliability.UploadResponseCode", | 99 UMA_HISTOGRAM_SPARSE_SLOWLY("DomainReliability.UploadResponseCode", |
88 fetcher->GetResponseCode()); | 100 fetcher->GetResponseCode()); |
89 | 101 |
90 bool success = fetcher->GetResponseCode() == 200; | 102 bool success = fetcher->GetResponseCode() == 200; |
91 callback_it->second.Run(success); | 103 callback_it->second.Run(success); |
92 | 104 |
93 delete callback_it->first; | 105 delete callback_it->first; |
94 upload_callbacks_.erase(callback_it); | 106 upload_callbacks_.erase(callback_it); |
95 } | 107 } |
96 | 108 |
97 private: | 109 private: |
98 using DomainReliabilityUploader::UploadCallback; | 110 using DomainReliabilityUploader::UploadCallback; |
99 typedef std::map<const net::URLFetcher*, UploadCallback> UploadCallbackMap; | 111 typedef std::map<const net::URLFetcher*, UploadCallback> UploadCallbackMap; |
100 | 112 |
101 scoped_refptr<net::URLRequestContextGetter> url_request_context_getter_; | 113 scoped_refptr<net::URLRequestContextGetter> url_request_context_getter_; |
102 UploadCallbackMap upload_callbacks_; | 114 UploadCallbackMap upload_callbacks_; |
| 115 bool discard_uploads_; |
103 }; | 116 }; |
104 | 117 |
105 } // namespace | 118 } // namespace |
106 | 119 |
107 DomainReliabilityUploader::DomainReliabilityUploader() {} | 120 DomainReliabilityUploader::DomainReliabilityUploader() {} |
108 DomainReliabilityUploader::~DomainReliabilityUploader() {} | 121 DomainReliabilityUploader::~DomainReliabilityUploader() {} |
109 | 122 |
110 // static | 123 // static |
111 scoped_ptr<DomainReliabilityUploader> DomainReliabilityUploader::Create( | 124 scoped_ptr<DomainReliabilityUploader> DomainReliabilityUploader::Create( |
112 const scoped_refptr<net::URLRequestContextGetter>& | 125 const scoped_refptr<net::URLRequestContextGetter>& |
113 url_request_context_getter) { | 126 url_request_context_getter) { |
114 return scoped_ptr<DomainReliabilityUploader>( | 127 return scoped_ptr<DomainReliabilityUploader>( |
115 new DomainReliabilityUploaderImpl(url_request_context_getter)); | 128 new DomainReliabilityUploaderImpl(url_request_context_getter)); |
116 } | 129 } |
117 | 130 |
118 // static | 131 // static |
119 bool DomainReliabilityUploader::URLRequestIsUpload( | 132 bool DomainReliabilityUploader::URLRequestIsUpload( |
120 const net::URLRequest& request) { | 133 const net::URLRequest& request) { |
121 return request.GetUserData(UploadUserData::kUserDataKey) != NULL; | 134 return request.GetUserData(UploadUserData::kUserDataKey) != NULL; |
122 } | 135 } |
123 | 136 |
124 } // namespace domain_reliability | 137 } // namespace domain_reliability |
OLD | NEW |