Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3558)

Unified Diff: chrome/browser/tracing/crash_service_uploader.cc

Issue 911153002: Moved the TraceUploader to chrome/ and abstracted it for alternative new upload destinations. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix TraceUploader ownership Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/tracing/crash_service_uploader.cc
diff --git a/content/browser/tracing/trace_uploader.cc b/chrome/browser/tracing/crash_service_uploader.cc
similarity index 49%
rename from content/browser/tracing/trace_uploader.cc
rename to chrome/browser/tracing/crash_service_uploader.cc
index 37ccb883ea083b8b06d0bedf5ae65583003a5b6e..4db80d69f8c24cc6865be1e830dfd7590681b911 100644
--- a/content/browser/tracing/trace_uploader.cc
+++ b/chrome/browser/tracing/crash_service_uploader.cc
@@ -2,15 +2,21 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "content/browser/tracing/trace_uploader.h"
+#include "chrome/browser/tracing/crash_service_uploader.h"
+#include "base/command_line.h"
#include "base/files/file_path.h"
#include "base/files/file_util.h"
+#include "base/format_macros.h"
#include "base/memory/shared_memory.h"
#include "base/strings/string_number_conversions.h"
+#include "base/strings/string_split.h"
+#include "base/strings/string_util.h"
#include "base/strings/stringprintf.h"
#include "base/time/time.h"
+#include "chrome/common/chrome_version_info.h"
#include "content/public/browser/browser_thread.h"
+#include "content/public/common/content_switches.h"
#include "net/base/mime_util.h"
#include "net/base/network_delegate.h"
#include "net/proxy/proxy_config.h"
@@ -24,35 +30,28 @@
using std::string;
-namespace content {
namespace {
+const char kUploadURL[] = "https://clients2.google.com/cr/staging_report";
const char kUploadContentType[] = "multipart/form-data";
const char kMultipartBoundary[] =
"----**--yradnuoBgoLtrapitluMklaTelgooG--**----";
-
const int kHttpResponseOk = 200;
} // namespace
-TraceUploader::TraceUploader(const std::string& product,
- const std::string& version,
- const std::string& upload_url,
- net::URLRequestContextGetter* request_context)
- : product_(product),
- version_(version),
- upload_url_(upload_url),
- request_context_(request_context) {
- DCHECK(!product_.empty());
- DCHECK(!version_.empty());
- DCHECK(!upload_url_.empty());
+TraceCrashServiceUploader::TraceCrashServiceUploader(
+ net::URLRequestContextGetter* request_context)
+ : request_context_(request_context) {
+ DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
}
-TraceUploader::~TraceUploader() {
- DCHECK_CURRENTLY_ON(BrowserThread::UI);
+TraceCrashServiceUploader::~TraceCrashServiceUploader() {
+ DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
}
-void TraceUploader::OnURLFetchComplete(const net::URLFetcher* source) {
- DCHECK_CURRENTLY_ON(BrowserThread::UI);
+void TraceCrashServiceUploader::OnURLFetchComplete(
+ const net::URLFetcher* source) {
+ DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
DCHECK_EQ(source, url_fetcher_.get());
int response_code = source->GetResponseCode();
string report_id;
@@ -61,40 +60,96 @@ void TraceUploader::OnURLFetchComplete(const net::URLFetcher* source) {
if (success) {
source->GetResponseAsString(&report_id);
} else {
- error_message = "Uploading failed, response code: " +
- base::IntToString(response_code);
+ error_message =
+ "Uploading failed, response code: " + base::IntToString(response_code);
}
- BrowserThread::PostTask(
- content::BrowserThread::UI,
- FROM_HERE,
+ content::BrowserThread::PostTask(
+ content::BrowserThread::UI, FROM_HERE,
dsinclair 2015/02/12 20:57:35 nit: This looks short enough to fit on one line?
oystein (OOO til 10th of July) 2015/02/13 17:02:45 The two first arguments yes, but the base::Bind()
base::Bind(done_callback_, success, report_id, error_message));
url_fetcher_.reset();
}
-void TraceUploader::OnURLFetchUploadProgress(
- const net::URLFetcher* source, int64 current, int64 total) {
+void TraceCrashServiceUploader::OnURLFetchUploadProgress(
+ const net::URLFetcher* source,
+ int64 current,
+ int64 total) {
DCHECK(url_fetcher_.get());
LOG(WARNING) << "Upload progress: " << current << " of " << total;
- BrowserThread::PostTask(
- content::BrowserThread::UI,
- FROM_HERE,
+ content::BrowserThread::PostTask(
+ content::BrowserThread::UI, FROM_HERE,
base::Bind(progress_callback_, current, total));
}
-void TraceUploader::DoUpload(
+void TraceCrashServiceUploader::DoUpload(
const std::string& file_contents,
- UploadProgressCallback progress_callback,
- UploadDoneCallback done_callback) {
- DCHECK_CURRENTLY_ON(BrowserThread::FILE);
+ const UploadProgressCallback& progress_callback,
+ const UploadDoneCallback& done_callback) {
+ DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
+ content::BrowserThread::PostTask(
+ content::BrowserThread::FILE, FROM_HERE,
+ base::Bind(&TraceCrashServiceUploader::DoUploadOnFileThread,
+ base::Unretained(this), file_contents, progress_callback,
+ done_callback));
+}
+
+void TraceCrashServiceUploader::DoUploadOnFileThread(
+ const std::string& file_contents,
+ const UploadProgressCallback& progress_callback,
+ const UploadDoneCallback& done_callback) {
+ DCHECK_CURRENTLY_ON(content::BrowserThread::FILE);
DCHECK(!url_fetcher_.get());
progress_callback_ = progress_callback;
done_callback_ = done_callback;
+ const base::CommandLine& command_line =
+ *base::CommandLine::ForCurrentProcess();
+ std::string upload_url = kUploadURL;
+ if (command_line.HasSwitch(switches::kTraceUploadURL)) {
+ upload_url = command_line.GetSwitchValueASCII(switches::kTraceUploadURL);
+ }
+ if (!GURL(upload_url).is_valid()) {
dsinclair 2015/02/12 20:57:35 nit: Don't need {} on single line statement.
oystein (OOO til 10th of July) 2015/02/13 17:02:45 Done.
+ upload_url.clear();
+ }
+
+ if (upload_url.empty()) {
+ OnUploadError("Upload URL empty or invalid");
+ return;
+ }
+
+#if defined(OS_WIN)
+ const char product[] = "Chrome";
+#elif defined(OS_MACOSX)
+ const char product[] = "Chrome_Mac";
+#elif defined(OS_LINUX)
+ const char product[] = "Chrome_Linux";
+#elif defined(OS_ANDROID)
+ const char product[] = "Chrome_Android";
+#elif defined(OS_CHROMEOS)
+ const char product[] = "Chrome_ChromeOS";
+#else
+#error Platform not supported.
+#endif
+
+ // VersionInfo::ProductNameAndVersionForUserAgent() returns a string like
+ // "Chrome/aa.bb.cc.dd", split out the part before the "/".
+ chrome::VersionInfo version_info;
+ std::vector<std::string> product_components;
+ base::SplitString(version_info.ProductNameAndVersionForUserAgent(), '/',
+ &product_components);
+ DCHECK_EQ(2U, product_components.size());
+ std::string version;
+ if (product_components.size() == 2U) {
+ version = product_components[1];
+ } else {
+ version = "unknown";
+ }
+
if (url_fetcher_.get()) {
OnUploadError("Already uploading.");
+ return;
}
scoped_ptr<char[]> compressed_contents(new char[kMaxUploadBytes]);
@@ -106,36 +161,37 @@ void TraceUploader::DoUpload(
}
std::string post_data;
- SetupMultipart("trace.json.gz",
+ SetupMultipart(product, version, "trace.json.gz",
std::string(compressed_contents.get(), compressed_bytes),
&post_data);
content::BrowserThread::PostTask(
content::BrowserThread::UI, FROM_HERE,
- base::Bind(&TraceUploader::CreateAndStartURLFetcher,
- base::Unretained(this),
- post_data));
+ base::Bind(&TraceCrashServiceUploader::CreateAndStartURLFetcher,
+ base::Unretained(this), upload_url, post_data));
}
-void TraceUploader::OnUploadError(std::string error_message) {
+void TraceCrashServiceUploader::OnUploadError(std::string error_message) {
LOG(ERROR) << error_message;
content::BrowserThread::PostTask(
- content::BrowserThread::UI,
- FROM_HERE,
+ content::BrowserThread::UI, FROM_HERE,
base::Bind(done_callback_, false, "", error_message));
}
-void TraceUploader::SetupMultipart(const std::string& trace_filename,
- const std::string& trace_contents,
- std::string* post_data) {
- net::AddMultipartValueForUpload("prod", product_, kMultipartBoundary, "",
+void TraceCrashServiceUploader::SetupMultipart(
+ const std::string& product,
+ const std::string& version,
+ const std::string& trace_filename,
+ const std::string& trace_contents,
+ std::string* post_data) {
+ net::AddMultipartValueForUpload("prod", product, kMultipartBoundary, "",
post_data);
- net::AddMultipartValueForUpload("ver", version_ + "-trace",
- kMultipartBoundary, "", post_data);
- net::AddMultipartValueForUpload("guid", "0", kMultipartBoundary,
- "", post_data);
- net::AddMultipartValueForUpload("type", "trace", kMultipartBoundary,
+ net::AddMultipartValueForUpload("ver", version + "-trace", kMultipartBoundary,
"", post_data);
+ net::AddMultipartValueForUpload("guid", "0", kMultipartBoundary, "",
+ post_data);
+ net::AddMultipartValueForUpload("type", "trace", kMultipartBoundary, "",
+ post_data);
// No minidump means no need for crash to process the report.
net::AddMultipartValueForUpload("should_process", "false", kMultipartBoundary,
"", post_data);
@@ -145,9 +201,9 @@ void TraceUploader::SetupMultipart(const std::string& trace_filename,
net::AddMultipartFinalDelimiterForUpload(kMultipartBoundary, post_data);
}
-void TraceUploader::AddTraceFile(const std::string& trace_filename,
- const std::string& trace_contents,
- std::string* post_data) {
+void TraceCrashServiceUploader::AddTraceFile(const std::string& trace_filename,
+ const std::string& trace_contents,
+ std::string* post_data) {
post_data->append("--");
post_data->append(kMultipartBoundary);
post_data->append("\r\n");
@@ -160,16 +216,14 @@ void TraceUploader::AddTraceFile(const std::string& trace_filename,
post_data->append("\r\n");
}
-bool TraceUploader::Compress(std::string input,
- int max_compressed_bytes,
- char* compressed,
- int* compressed_bytes) {
+bool TraceCrashServiceUploader::Compress(std::string input,
+ int max_compressed_bytes,
+ char* compressed,
+ int* compressed_bytes) {
DCHECK(compressed);
DCHECK(compressed_bytes);
z_stream stream = {0};
- int result = deflateInit2(&stream,
- Z_DEFAULT_COMPRESSION,
- Z_DEFLATED,
+ int result = deflateInit2(&stream, Z_DEFAULT_COMPRESSION, Z_DEFLATED,
// 16 is added to produce a gzip header + trailer.
MAX_WBITS + 16,
8, // memLevel = 8 is default.
@@ -194,8 +248,10 @@ bool TraceUploader::Compress(std::string input,
return success;
}
-void TraceUploader::CreateAndStartURLFetcher(const std::string& post_data) {
- DCHECK_CURRENTLY_ON(BrowserThread::UI);
+void TraceCrashServiceUploader::CreateAndStartURLFetcher(
+ const std::string& upload_url,
+ const std::string& post_data) {
+ DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
DCHECK(!url_fetcher_.get());
std::string content_type = kUploadContentType;
@@ -203,10 +259,8 @@ void TraceUploader::CreateAndStartURLFetcher(const std::string& post_data) {
content_type.append(kMultipartBoundary);
url_fetcher_.reset(
- net::URLFetcher::Create(GURL(upload_url_), net::URLFetcher::POST, this));
+ net::URLFetcher::Create(GURL(upload_url), net::URLFetcher::POST, this));
url_fetcher_->SetRequestContext(request_context_);
url_fetcher_->SetUploadData(content_type, post_data);
url_fetcher_->Start();
}
-
-} // namespace content

Powered by Google App Engine
This is Rietveld 408576698