// Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef CONTENT_BROWSER_TRACING_TRACE_UPLOADER_H_ #define CONTENT_BROWSER_TRACING_TRACE_UPLOADER_H_ #include #include #include #include "base/basictypes.h" #include "base/callback.h" #include "base/gtest_prod_util.h" #include "base/memory/ref_counted.h" #include "base/memory/scoped_ptr.h" #include "base/memory/weak_ptr.h" #include "base/threading/thread_checker.h" #include "net/url_request/url_fetcher_delegate.h" namespace net { class URLFetcher; class URLRequestContextGetter; } // namespace net namespace content { namespace { // Allow up to 10MB for trace upload const int kMaxUploadBytes = 10000000; } // namespace // TraceUploader uploads traces. class TraceUploader : public net::URLFetcherDelegate { public: typedef base::Callback UploadDoneCallback; typedef base::Callback UploadProgressCallback; TraceUploader(const std::string& product, const std::string& version, const std::string& upload_url, net::URLRequestContextGetter* request_context); virtual ~TraceUploader(); // net::URLFetcherDelegate implementation. virtual void OnURLFetchComplete(const net::URLFetcher* source) OVERRIDE; virtual void OnURLFetchUploadProgress(const net::URLFetcher* source, int64 current, int64 total) OVERRIDE; // Compresses and uploads the given file contents. void DoUpload(const std::string& file_contents, UploadProgressCallback progress_callback, UploadDoneCallback done_callback); private: // Sets up a multipart body to be uploaded. The body is produced according // to RFC 2046. void SetupMultipart(const std::string& trace_filename, const std::string& trace_contents, std::string* post_data); void AddTraceFile(const std::string& trace_filename, const std::string& trace_contents, std::string* post_data); // Compresses the input and returns whether compression was successful. bool Compress(std::string input, int max_compressed_bytes, char* compressed_contents, int* compressed_bytes); void CreateAndStartURLFetcher(const std::string& post_data); void OnUploadError(std::string error_message); std::string product_; std::string version_; std::string upload_url_; scoped_ptr url_fetcher_; UploadProgressCallback progress_callback_; UploadDoneCallback done_callback_; net::URLRequestContextGetter* request_context_; DISALLOW_COPY_AND_ASSIGN(TraceUploader); }; } // namespace content #endif // CONTENT_BROWSER_TRACING_TRACE_UPLOADER_H_