[email protected] | 1eab4e9 | 2014-05-09 02:17:19 | [diff] [blame] | 1 | // Copyright 2014 The Chromium Authors. All rights reserved. |
[email protected] | 4837225 | 2013-12-20 12:18:01 | [diff] [blame] | 2 | // Use of this source code is governed by a BSD-style license that can be |
3 | // found in the LICENSE file. | ||||
4 | |||||
[email protected] | 1eab4e9 | 2014-05-09 02:17:19 | [diff] [blame] | 5 | #include "components/feedback/feedback_uploader_delegate.h" |
[email protected] | 4837225 | 2013-12-20 12:18:01 | [diff] [blame] | 6 | |
dcheng | 84c358e | 2016-04-26 07:05:53 | [diff] [blame] | 7 | #include <memory> |
[email protected] | 4837225 | 2013-12-20 12:18:01 | [diff] [blame] | 8 | #include <sstream> |
9 | |||||
10 | #include "base/logging.h" | ||||
Ahmed Fakhry | af8ab05 | 2017-07-21 21:39:07 | [diff] [blame^] | 11 | #include "components/feedback/feedback_report.h" |
[email protected] | 4837225 | 2013-12-20 12:18:01 | [diff] [blame] | 12 | #include "net/url_request/url_fetcher.h" |
[email protected] | 4837225 | 2013-12-20 12:18:01 | [diff] [blame] | 13 | |
14 | namespace feedback { | ||||
Ahmed Fakhry | af8ab05 | 2017-07-21 21:39:07 | [diff] [blame^] | 15 | |
[email protected] | 4837225 | 2013-12-20 12:18:01 | [diff] [blame] | 16 | namespace { |
17 | |||||
Ahmed Fakhry | af8ab05 | 2017-07-21 21:39:07 | [diff] [blame^] | 18 | constexpr int kHttpPostSuccessNoContent = 204; |
19 | constexpr int kHttpPostFailNoConnection = -1; | ||||
20 | constexpr int kHttpPostFailClientError = 400; | ||||
21 | constexpr int kHttpPostFailServerError = 500; | ||||
[email protected] | 4837225 | 2013-12-20 12:18:01 | [diff] [blame] | 22 | |
23 | } // namespace | ||||
24 | |||||
25 | FeedbackUploaderDelegate::FeedbackUploaderDelegate( | ||||
Ahmed Fakhry | af8ab05 | 2017-07-21 21:39:07 | [diff] [blame^] | 26 | scoped_refptr<FeedbackReport> pending_report, |
[email protected] | 4837225 | 2013-12-20 12:18:01 | [diff] [blame] | 27 | const base::Closure& success_callback, |
Ahmed Fakhry | af8ab05 | 2017-07-21 21:39:07 | [diff] [blame^] | 28 | const ReportFailureCallback& error_callback) |
29 | : pending_report_(pending_report), | ||||
30 | success_callback_(success_callback), | ||||
31 | error_callback_(error_callback) {} | ||||
[email protected] | 4837225 | 2013-12-20 12:18:01 | [diff] [blame] | 32 | |
33 | FeedbackUploaderDelegate::~FeedbackUploaderDelegate() {} | ||||
34 | |||||
35 | void FeedbackUploaderDelegate::OnURLFetchComplete( | ||||
36 | const net::URLFetcher* source) { | ||||
dcheng | 84c358e | 2016-04-26 07:05:53 | [diff] [blame] | 37 | std::unique_ptr<const net::URLFetcher> source_scoper(source); |
[email protected] | 4837225 | 2013-12-20 12:18:01 | [diff] [blame] | 38 | |
39 | std::stringstream error_stream; | ||||
40 | int response_code = source->GetResponseCode(); | ||||
41 | if (response_code == kHttpPostSuccessNoContent) { | ||||
42 | error_stream << "Success"; | ||||
43 | success_callback_.Run(); | ||||
44 | } else { | ||||
Ahmed Fakhry | af8ab05 | 2017-07-21 21:39:07 | [diff] [blame^] | 45 | bool should_retry = true; |
[email protected] | 4837225 | 2013-12-20 12:18:01 | [diff] [blame] | 46 | // Process the error for debug output |
47 | if (response_code == kHttpPostFailNoConnection) { | ||||
48 | error_stream << "No connection to server."; | ||||
Ahmed Fakhry | af8ab05 | 2017-07-21 21:39:07 | [diff] [blame^] | 49 | } else if ((response_code >= kHttpPostFailClientError) && |
[email protected] | 4837225 | 2013-12-20 12:18:01 | [diff] [blame] | 50 | (response_code < kHttpPostFailServerError)) { |
Ahmed Fakhry | af8ab05 | 2017-07-21 21:39:07 | [diff] [blame^] | 51 | // Client errors mean that the server failed to parse the proto that was |
52 | // sent, or that some requirements weren't met by the server side | ||||
53 | // validation, and hence we should NOT retry sending this corrupt report | ||||
54 | // and give up. | ||||
55 | should_retry = false; | ||||
56 | |||||
[email protected] | 4837225 | 2013-12-20 12:18:01 | [diff] [blame] | 57 | error_stream << "Client error: HTTP response code " << response_code; |
Ahmed Fakhry | af8ab05 | 2017-07-21 21:39:07 | [diff] [blame^] | 58 | } else if (response_code >= kHttpPostFailServerError) { |
[email protected] | 4837225 | 2013-12-20 12:18:01 | [diff] [blame] | 59 | error_stream << "Server error: HTTP response code " << response_code; |
60 | } else { | ||||
61 | error_stream << "Unknown error: HTTP response code " << response_code; | ||||
62 | } | ||||
Ahmed Fakhry | af8ab05 | 2017-07-21 21:39:07 | [diff] [blame^] | 63 | |
64 | if (should_retry) | ||||
65 | error_callback_.Run(pending_report_); | ||||
[email protected] | 4837225 | 2013-12-20 12:18:01 | [diff] [blame] | 66 | } |
67 | |||||
68 | LOG(WARNING) << "FEEDBACK: Submission to feedback server (" | ||||
69 | << source->GetURL() << ") status: " << error_stream.str(); | ||||
70 | |||||
71 | // This instance won't be used for anything else, delete us. | ||||
72 | delete this; | ||||
73 | } | ||||
74 | |||||
75 | } // namespace feedback |