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