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

Side by Side Diff: components/reporting/core/browser/reporting_uploader.cc

Issue 2249213002: [OBSOLETE] Reporting: Initial implementation. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix ProfileImplIOData 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
(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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698