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
3// found in the LICENSE file.
4
5#include "components/feedback/feedback_uploader_delegate.h"
6
7#include <sstream>
8
9#include "base/logging.h"
10#include "net/url_request/url_fetcher.h"
11
12namespace feedback {
13namespace {
14
15const int kHttpPostSuccessNoContent = 204;
16const int kHttpPostFailNoConnection = -1;
17const int kHttpPostFailClientError = 400;
18const int kHttpPostFailServerError = 500;
19
20}  // namespace
21
22FeedbackUploaderDelegate::FeedbackUploaderDelegate(
23    const std::string& post_body,
24    const base::Closure& success_callback,
25    const ReportDataCallback& error_callback)
26        : post_body_(post_body),
27          success_callback_(success_callback),
28          error_callback_(error_callback) {
29}
30
31FeedbackUploaderDelegate::~FeedbackUploaderDelegate() {}
32
33void FeedbackUploaderDelegate::OnURLFetchComplete(
34    const net::URLFetcher* source) {
35  scoped_ptr<const net::URLFetcher> source_scoper(source);
36
37  std::stringstream error_stream;
38  int response_code = source->GetResponseCode();
39  if (response_code == kHttpPostSuccessNoContent) {
40    error_stream << "Success";
41    success_callback_.Run();
42  } else {
43    // Process the error for debug output
44    if (response_code == kHttpPostFailNoConnection) {
45      error_stream << "No connection to server.";
46    } else if ((response_code > kHttpPostFailClientError) &&
47               (response_code < kHttpPostFailServerError)) {
48      error_stream << "Client error: HTTP response code " << response_code;
49    } else if (response_code > kHttpPostFailServerError) {
50      error_stream << "Server error: HTTP response code " << response_code;
51    } else {
52      error_stream << "Unknown error: HTTP response code " << response_code;
53    }
54    error_callback_.Run(post_body_);
55  }
56
57  LOG(WARNING) << "FEEDBACK: Submission to feedback server ("
58               << source->GetURL() << ") status: " << error_stream.str();
59
60  // This instance won't be used for anything else, delete us.
61  delete this;
62}
63
64}  // namespace feedback
65