OLD | NEW |
1 // Copyright 2015 The Crashpad Authors. All rights reserved. | 1 // Copyright 2015 The Crashpad Authors. All rights reserved. |
2 // | 2 // |
3 // Licensed under the Apache License, Version 2.0 (the "License"); | 3 // Licensed under the Apache License, Version 2.0 (the "License"); |
4 // you may not use this file except in compliance with the License. | 4 // you may not use this file except in compliance with the License. |
5 // You may obtain a copy of the License at | 5 // You may obtain a copy of the License at |
6 // | 6 // |
7 // http://www.apache.org/licenses/LICENSE-2.0 | 7 // http://www.apache.org/licenses/LICENSE-2.0 |
8 // | 8 // |
9 // Unless required by applicable law or agreed to in writing, software | 9 // Unless required by applicable law or agreed to in writing, software |
10 // distributed under the License is distributed on an "AS IS" BASIS, | 10 // distributed under the License is distributed on an "AS IS" BASIS, |
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
132 CrashReportDatabase* database_; // weak | 132 CrashReportDatabase* database_; // weak |
133 const CrashReportDatabase::Report* report_; // weak | 133 const CrashReportDatabase::Report* report_; // weak |
134 | 134 |
135 DISALLOW_COPY_AND_ASSIGN(CallRecordUploadAttempt); | 135 DISALLOW_COPY_AND_ASSIGN(CallRecordUploadAttempt); |
136 }; | 136 }; |
137 | 137 |
138 } // namespace | 138 } // namespace |
139 | 139 |
140 CrashReportUploadThread::CrashReportUploadThread(CrashReportDatabase* database, | 140 CrashReportUploadThread::CrashReportUploadThread(CrashReportDatabase* database, |
141 const std::string& url, | 141 const std::string& url, |
142 bool rate_limit) | 142 bool rate_limit, |
| 143 bool upload_gzip) |
143 : url_(url), | 144 : url_(url), |
144 // Check for pending reports every 15 minutes, even in the absence of a | 145 // Check for pending reports every 15 minutes, even in the absence of a |
145 // signal from the handler thread. This allows for failed uploads to be | 146 // signal from the handler thread. This allows for failed uploads to be |
146 // retried periodically, and for pending reports written by other | 147 // retried periodically, and for pending reports written by other |
147 // processes to be recognized. | 148 // processes to be recognized. |
148 thread_(15 * 60, this), | 149 thread_(15 * 60, this), |
149 database_(database), | 150 database_(database), |
150 rate_limit_(rate_limit) { | 151 rate_limit_(rate_limit), |
| 152 upload_gzip_(upload_gzip) { |
151 } | 153 } |
152 | 154 |
153 CrashReportUploadThread::~CrashReportUploadThread() { | 155 CrashReportUploadThread::~CrashReportUploadThread() { |
154 } | 156 } |
155 | 157 |
156 void CrashReportUploadThread::Start() { | 158 void CrashReportUploadThread::Start() { |
157 thread_.Start(0); | 159 thread_.Start(0); |
158 } | 160 } |
159 | 161 |
160 void CrashReportUploadThread::Stop() { | 162 void CrashReportUploadThread::Stop() { |
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
301 } | 303 } |
302 | 304 |
303 // If the minidump file could be opened, ignore any errors that might occur | 305 // If the minidump file could be opened, ignore any errors that might occur |
304 // when attempting to interpret it. This may result in its being uploaded | 306 // when attempting to interpret it. This may result in its being uploaded |
305 // with few or no parameters, but as long as there’s a dump file, the server | 307 // with few or no parameters, but as long as there’s a dump file, the server |
306 // can decide what to do with it. | 308 // can decide what to do with it. |
307 parameters = BreakpadHTTPFormParametersFromMinidump(&minidump_file_reader); | 309 parameters = BreakpadHTTPFormParametersFromMinidump(&minidump_file_reader); |
308 } | 310 } |
309 | 311 |
310 HTTPMultipartBuilder http_multipart_builder; | 312 HTTPMultipartBuilder http_multipart_builder; |
| 313 http_multipart_builder.SetGzipEnabled(upload_gzip_); |
311 | 314 |
312 const char kMinidumpKey[] = "upload_file_minidump"; | 315 const char kMinidumpKey[] = "upload_file_minidump"; |
313 | 316 |
314 for (const auto& kv : parameters) { | 317 for (const auto& kv : parameters) { |
315 if (kv.first == kMinidumpKey) { | 318 if (kv.first == kMinidumpKey) { |
316 LOG(WARNING) << "reserved key " << kv.first << ", discarding value " | 319 LOG(WARNING) << "reserved key " << kv.first << ", discarding value " |
317 << kv.second; | 320 << kv.second; |
318 } else { | 321 } else { |
319 http_multipart_builder.SetFormData(kv.first, kv.second); | 322 http_multipart_builder.SetFormData(kv.first, kv.second); |
320 } | 323 } |
321 } | 324 } |
322 | 325 |
323 http_multipart_builder.SetFileAttachment( | 326 http_multipart_builder.SetFileAttachment( |
324 kMinidumpKey, | 327 kMinidumpKey, |
325 #if defined(OS_WIN) | 328 #if defined(OS_WIN) |
326 base::UTF16ToUTF8(report->file_path.BaseName().value()), | 329 base::UTF16ToUTF8(report->file_path.BaseName().value()), |
327 #else | 330 #else |
328 report->file_path.BaseName().value(), | 331 report->file_path.BaseName().value(), |
329 #endif | 332 #endif |
330 report->file_path, | 333 report->file_path, |
331 "application/octet-stream"); | 334 "application/octet-stream"); |
332 | 335 |
333 std::unique_ptr<HTTPTransport> http_transport(HTTPTransport::Create()); | 336 std::unique_ptr<HTTPTransport> http_transport(HTTPTransport::Create()); |
334 http_transport->SetURL(url_); | 337 http_transport->SetURL(url_); |
335 HTTPHeaders::value_type content_type = | 338 HTTPHeaders content_headers; |
336 http_multipart_builder.GetContentType(); | 339 http_multipart_builder.PopulateContentHeaders(&content_headers); |
337 http_transport->SetHeader(content_type.first, content_type.second); | 340 for (const auto& content_header : content_headers) { |
| 341 http_transport->SetHeader(content_header.first, content_header.second); |
| 342 } |
338 http_transport->SetBodyStream(http_multipart_builder.GetBodyStream()); | 343 http_transport->SetBodyStream(http_multipart_builder.GetBodyStream()); |
339 // TODO(mark): The timeout should be configurable by the client. | 344 // TODO(mark): The timeout should be configurable by the client. |
340 http_transport->SetTimeout(60.0); // 1 minute. | 345 http_transport->SetTimeout(60.0); // 1 minute. |
341 | 346 |
342 if (!http_transport->ExecuteSynchronously(response_body)) { | 347 if (!http_transport->ExecuteSynchronously(response_body)) { |
343 return UploadResult::kRetry; | 348 return UploadResult::kRetry; |
344 } | 349 } |
345 | 350 |
346 return UploadResult::kSuccess; | 351 return UploadResult::kSuccess; |
347 } | 352 } |
348 | 353 |
349 void CrashReportUploadThread::DoWork(const WorkerThread* thread) { | 354 void CrashReportUploadThread::DoWork(const WorkerThread* thread) { |
350 ProcessPendingReports(); | 355 ProcessPendingReports(); |
351 } | 356 } |
352 | 357 |
353 } // namespace crashpad | 358 } // namespace crashpad |
OLD | NEW |