OLD | NEW |
(Empty) | |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. |
| 4 |
| 5 #include "components/reporting/core/browser/reporting_uploader.h" |
| 6 |
| 7 #include "base/memory/ptr_util.h" |
| 8 |
| 9 namespace { |
| 10 const char kUploadContentType[] = "application/report"; |
| 11 } // namespace |
| 12 |
| 13 namespace reporting { |
| 14 |
| 15 namespace { |
| 16 |
| 17 ReportingUploader::Outcome ResponseCodeToOutcome(int response_code) { |
| 18 if (response_code >= 200 && response_code <= 299) |
| 19 return ReportingUploader::SUCCESS; |
| 20 if (response_code == 410) |
| 21 return ReportingUploader::REMOVE_ENDPOINT; |
| 22 return ReportingUploader::FAILURE; |
| 23 } |
| 24 |
| 25 class ReportingUploaderImpl : public ReportingUploader, |
| 26 net::URLFetcherDelegate { |
| 27 public: |
| 28 ReportingUploaderImpl(scoped_refptr<net::URLRequestContextGetter> context) {} |
| 29 ~ReportingUploaderImpl() override {} |
| 30 |
| 31 // Section 4.4. |
| 32 void AttemptDelivery(const GURL& url, |
| 33 const std::string& json, |
| 34 const Callback& callback) override { |
| 35 std::unique_ptr<net::URLFetcher> fetcher( |
| 36 net::URLFetcher::Create(url, net::URLFetcher::POST, this)); |
| 37 fetcher->SetRequestContext(context_.get()); |
| 38 fetcher->SetAutomaticallyRetryOn5xx(false); |
| 39 fetcher->SetUploadData(kUploadContentType, json); |
| 40 // This inherently sets mode = "no-cors", but that doesn't matter, because |
| 41 // the origins that are included in the upload don't actually get to see |
| 42 // the response. |
| 43 // |
| 44 // This inherently skips Service Worker, too. |
| 45 fetcher->Start(); |
| 46 |
| 47 // Have to grab this as a reference to ensure fetcher.get() happens before |
| 48 // std::move(fetcher). |
| 49 std::unique_ptr<Upload>& upload = uploads_[fetcher.get()]; |
| 50 upload = base::MakeUnique<Upload>(std::move(fetcher), callback); |
| 51 } |
| 52 |
| 53 // net::URLFetcherDelegate implementation: |
| 54 void OnURLFetchComplete(const net::URLFetcher* fetcher) override { |
| 55 UploadMap::iterator it = uploads_.find(fetcher); |
| 56 std::unique_ptr<Upload> upload = std::move(it->second); |
| 57 uploads_.erase(it); |
| 58 |
| 59 upload->second.Run(ResponseCodeToOutcome(fetcher->GetResponseCode())); |
| 60 // Deletes fetcher (upload->first) when upload goes out of scope and is |
| 61 // deleted. |
| 62 } |
| 63 |
| 64 private: |
| 65 using Upload = std::pair<std::unique_ptr<net::URLFetcher>, Callback>; |
| 66 using UploadMap = std::map<const net::URLFetcher*, std::unique_ptr<Upload>>; |
| 67 |
| 68 scoped_refptr<net::URLRequestContextGetter> context_; |
| 69 UploadMap uploads_; |
| 70 }; |
| 71 |
| 72 } // namespace |
| 73 |
| 74 // static |
| 75 std::unique_ptr<ReportingUploader> ReportingUploader::Create( |
| 76 scoped_refptr<net::URLRequestContextGetter> context) { |
| 77 return base::MakeUnique<ReportingUploaderImpl>(context); |
| 78 } |
| 79 |
| 80 } // namespace reporting |
OLD | NEW |