Home | History | Annotate | Download | only in tracing
      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 #ifndef CONTENT_BROWSER_TRACING_TRACE_UPLOADER_H_
      6 #define CONTENT_BROWSER_TRACING_TRACE_UPLOADER_H_
      7 
      8 #include <map>
      9 #include <string>
     10 #include <vector>
     11 
     12 #include "base/basictypes.h"
     13 #include "base/callback.h"
     14 #include "base/gtest_prod_util.h"
     15 #include "base/memory/ref_counted.h"
     16 #include "base/memory/scoped_ptr.h"
     17 #include "base/memory/weak_ptr.h"
     18 #include "base/threading/thread_checker.h"
     19 #include "net/url_request/url_fetcher_delegate.h"
     20 
     21 namespace net {
     22 class URLFetcher;
     23 class URLRequestContextGetter;
     24 }  // namespace net
     25 
     26 namespace content {
     27 
     28 namespace {
     29 
     30 // Allow up to 10MB for trace upload
     31 const int kMaxUploadBytes = 10000000;
     32 
     33 }  // namespace
     34 
     35 // TraceUploader uploads traces.
     36 class TraceUploader : public net::URLFetcherDelegate {
     37  public:
     38   typedef base::Callback<void(bool, const std::string&, const std::string&)>
     39       UploadDoneCallback;
     40   typedef base::Callback<void(int64, int64)> UploadProgressCallback;
     41 
     42   TraceUploader(const std::string& product,
     43                 const std::string& version,
     44                 const std::string& upload_url,
     45                 net::URLRequestContextGetter* request_context);
     46   virtual ~TraceUploader();
     47 
     48   // net::URLFetcherDelegate implementation.
     49   virtual void OnURLFetchComplete(const net::URLFetcher* source) OVERRIDE;
     50   virtual void OnURLFetchUploadProgress(const net::URLFetcher* source,
     51                                         int64 current, int64 total) OVERRIDE;
     52 
     53   // Compresses and uploads the given file contents.
     54   void DoUpload(const std::string& file_contents,
     55                 UploadProgressCallback progress_callback,
     56                 UploadDoneCallback done_callback);
     57 
     58  private:
     59   // Sets up a multipart body to be uploaded. The body is produced according
     60   // to RFC 2046.
     61   void SetupMultipart(const std::string& trace_filename,
     62                       const std::string& trace_contents,
     63                       std::string* post_data);
     64   void AddTraceFile(const std::string& trace_filename,
     65                     const std::string& trace_contents,
     66                     std::string* post_data);
     67   // Compresses the input and returns whether compression was successful.
     68   bool Compress(std::string input,
     69                 int max_compressed_bytes,
     70                 char* compressed_contents,
     71                 int* compressed_bytes);
     72   void CreateAndStartURLFetcher(const std::string& post_data);
     73   void OnUploadError(std::string error_message);
     74 
     75   std::string product_;
     76   std::string version_;
     77 
     78   std::string upload_url_;
     79 
     80   scoped_ptr<net::URLFetcher> url_fetcher_;
     81   UploadProgressCallback progress_callback_;
     82   UploadDoneCallback done_callback_;
     83 
     84   net::URLRequestContextGetter* request_context_;
     85 
     86   DISALLOW_COPY_AND_ASSIGN(TraceUploader);
     87 };
     88 
     89 }  // namespace content
     90 
     91 #endif  // CONTENT_BROWSER_TRACING_TRACE_UPLOADER_H_
     92