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
21namespace net {
22class URLFetcher;
23class URLRequestContextGetter;
24}  // namespace net
25
26namespace content {
27
28namespace {
29
30// Allow up to 10MB for trace upload
31const int kMaxUploadBytes = 10000000;
32
33}  // namespace
34
35// TraceUploader uploads traces.
36class 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