1010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
25d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// found in the LICENSE file.
45d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "components/feedback/feedback_uploader_delegate.h"
65d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include <sstream>
85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/logging.h"
105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "net/url_request/url_fetcher.h"
115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace feedback {
135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace {
145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const int kHttpPostSuccessNoContent = 204;
165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const int kHttpPostFailNoConnection = -1;
175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const int kHttpPostFailClientError = 400;
185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const int kHttpPostFailServerError = 500;
195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}  // namespace
215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)FeedbackUploaderDelegate::FeedbackUploaderDelegate(
235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const std::string& post_body,
245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::Closure& success_callback,
255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const ReportDataCallback& error_callback)
265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        : post_body_(post_body),
275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          success_callback_(success_callback),
285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          error_callback_(error_callback) {
295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)FeedbackUploaderDelegate::~FeedbackUploaderDelegate() {}
325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void FeedbackUploaderDelegate::OnURLFetchComplete(
345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const net::URLFetcher* source) {
355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<const net::URLFetcher> source_scoper(source);
365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  std::stringstream error_stream;
385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  int response_code = source->GetResponseCode();
395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (response_code == kHttpPostSuccessNoContent) {
405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    error_stream << "Success";
415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    success_callback_.Run();
425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  } else {
435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Process the error for debug output
445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (response_code == kHttpPostFailNoConnection) {
455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      error_stream << "No connection to server.";
465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    } else if ((response_code > kHttpPostFailClientError) &&
475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)               (response_code < kHttpPostFailServerError)) {
485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      error_stream << "Client error: HTTP response code " << response_code;
495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    } else if (response_code > kHttpPostFailServerError) {
505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      error_stream << "Server error: HTTP response code " << response_code;
515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    } else {
525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      error_stream << "Unknown error: HTTP response code " << response_code;
535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    error_callback_.Run(post_body_);
555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  LOG(WARNING) << "FEEDBACK: Submission to feedback server ("
585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)               << source->GetURL() << ") status: " << error_stream.str();
595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // This instance won't be used for anything else, delete us.
615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  delete this;
625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}  // namespace feedback
65