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

Side by Side Diff: chrome/browser/media/webrtc_log_uploader.cc

Issue 927233005: Adding support for storing webrtc logs locally with an extension supplied unique id, for later uplo… (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase 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 unified diff | Download patch
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/media/webrtc_log_uploader.h" 5 #include "chrome/browser/media/webrtc_log_uploader.h"
6 6
7 #include "base/files/file_enumerator.h" 7 #include "base/files/file_enumerator.h"
8 #include "base/files/file_path.h" 8 #include "base/files/file_path.h"
9 #include "base/files/file_util.h" 9 #include "base/files/file_util.h"
10 #include "base/logging.h" 10 #include "base/logging.h"
11 #include "base/pickle.h"
11 #include "base/strings/string_number_conversions.h" 12 #include "base/strings/string_number_conversions.h"
12 #include "base/strings/string_split.h" 13 #include "base/strings/string_split.h"
13 #include "base/strings/stringprintf.h" 14 #include "base/strings/stringprintf.h"
14 #include "base/time/time.h" 15 #include "base/time/time.h"
15 #include "chrome/browser/browser_process.h" 16 #include "chrome/browser/browser_process.h"
16 #include "chrome/browser/media/webrtc_log_list.h" 17 #include "chrome/browser/media/webrtc_log_list.h"
17 #include "chrome/browser/media/webrtc_log_util.h" 18 #include "chrome/browser/media/webrtc_log_util.h"
18 #include "chrome/common/chrome_version_info.h" 19 #include "chrome/common/chrome_version_info.h"
19 #include "chrome/common/partial_circular_buffer.h" 20 #include "chrome/common/partial_circular_buffer.h"
20 #include "content/public/browser/browser_thread.h" 21 #include "content/public/browser/browser_thread.h"
(...skipping 21 matching lines...) Expand all
42 post_data->append(kMultipartBoundary); 43 post_data->append(kMultipartBoundary);
43 post_data->append("\r\nContent-Disposition: form-data; name=\""); 44 post_data->append("\r\nContent-Disposition: form-data; name=\"");
44 post_data->append(content_name); 45 post_data->append(content_name);
45 post_data->append("\"; filename=\""); 46 post_data->append("\"; filename=\"");
46 post_data->append(content_name + ".gz"); 47 post_data->append(content_name + ".gz");
47 post_data->append("\"\r\nContent-Type: application/gzip\r\n\r\n"); 48 post_data->append("\"\r\nContent-Type: application/gzip\r\n\r\n");
48 } 49 }
49 50
50 // Adds |compressed_log| to |post_data|. 51 // Adds |compressed_log| to |post_data|.
51 void AddLogData(std::string* post_data, 52 void AddLogData(std::string* post_data,
52 const std::vector<uint8>& compressed_log) { 53 const std::string& compressed_log) {
53 AddMultipartFileContentHeader(post_data, "webrtc_log"); 54 AddMultipartFileContentHeader(post_data, "webrtc_log");
54 post_data->append(reinterpret_cast<const char*>(&compressed_log[0]), 55 post_data->append(compressed_log);
55 compressed_log.size());
56 post_data->append("\r\n"); 56 post_data->append("\r\n");
57 } 57 }
58 58
59 // Adds the RTP dump data to |post_data|. 59 // Adds the RTP dump data to |post_data|.
60 void AddRtpDumpData(std::string* post_data, 60 void AddRtpDumpData(std::string* post_data,
61 const std::string& name, 61 const std::string& name,
62 const std::string& dump_data) { 62 const std::string& dump_data) {
63 AddMultipartFileContentHeader(post_data, name); 63 AddMultipartFileContentHeader(post_data, name);
64 post_data->append(dump_data.data(), dump_data.size()); 64 post_data->append(dump_data.data(), dump_data.size());
65 post_data->append("\r\n"); 65 post_data->append("\r\n");
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
129 } 129 }
130 return false; 130 return false;
131 } 131 }
132 132
133 void WebRtcLogUploader::LoggingStoppedDontUpload() { 133 void WebRtcLogUploader::LoggingStoppedDontUpload() {
134 content::BrowserThread::PostTask(content::BrowserThread::UI, FROM_HERE, 134 content::BrowserThread::PostTask(content::BrowserThread::UI, FROM_HERE,
135 base::Bind(&WebRtcLogUploader::DecreaseLogCount, base::Unretained(this))); 135 base::Bind(&WebRtcLogUploader::DecreaseLogCount, base::Unretained(this)));
136 } 136 }
137 137
138 void WebRtcLogUploader::LoggingStoppedDoUpload( 138 void WebRtcLogUploader::LoggingStoppedDoUpload(
139 scoped_ptr<unsigned char[]> log_buffer, 139 scoped_ptr<WebRtcLogBuffer> log_buffer,
140 uint32 length, 140 scoped_ptr<MetaDataMap> meta_data,
141 const std::map<std::string, std::string>& meta_data,
142 const WebRtcLogUploadDoneData& upload_done_data) { 141 const WebRtcLogUploadDoneData& upload_done_data) {
143 DCHECK(file_thread_checker_.CalledOnValidThread()); 142 DCHECK(file_thread_checker_.CalledOnValidThread());
144 DCHECK(log_buffer.get()); 143 DCHECK(log_buffer.get());
144 DCHECK(meta_data.get());
145 DCHECK(!upload_done_data.log_path.empty()); 145 DCHECK(!upload_done_data.log_path.empty());
146 146
147 std::vector<uint8> compressed_log; 147 std::string compressed_log;
148 CompressLog( 148 CompressLog(&compressed_log, log_buffer.get());
149 &compressed_log, reinterpret_cast<uint8*>(&log_buffer[0]), length);
150 149
151 std::string local_log_id; 150 std::string local_log_id;
152 151
153 if (base::PathExists(upload_done_data.log_path)) { 152 if (base::PathExists(upload_done_data.log_path)) {
154 WebRtcLogUtil::DeleteOldWebRtcLogFiles(upload_done_data.log_path); 153 WebRtcLogUtil::DeleteOldWebRtcLogFiles(upload_done_data.log_path);
155 154
156 local_log_id = base::DoubleToString(base::Time::Now().ToDoubleT()); 155 local_log_id = base::DoubleToString(base::Time::Now().ToDoubleT());
157 base::FilePath log_file_path = 156 base::FilePath log_file_path =
158 upload_done_data.log_path.AppendASCII(local_log_id) 157 upload_done_data.log_path.AppendASCII(local_log_id)
159 .AddExtension(FILE_PATH_LITERAL(".gz")); 158 .AddExtension(FILE_PATH_LITERAL(".gz"));
160 WriteCompressedLogToFile(compressed_log, log_file_path); 159 WriteCompressedLogToFile(compressed_log, log_file_path);
161 160
162 base::FilePath log_list_path = 161 base::FilePath log_list_path =
163 WebRtcLogList::GetWebRtcLogListFileForDirectory( 162 WebRtcLogList::GetWebRtcLogListFileForDirectory(
164 upload_done_data.log_path); 163 upload_done_data.log_path);
165 AddLocallyStoredLogInfoToUploadListFile(log_list_path, local_log_id); 164 AddLocallyStoredLogInfoToUploadListFile(log_list_path, local_log_id);
166 } 165 }
167 166
168 WebRtcLogUploadDoneData upload_done_data_with_log_id = upload_done_data; 167 WebRtcLogUploadDoneData upload_done_data_with_log_id = upload_done_data;
169 upload_done_data_with_log_id.local_log_id = local_log_id; 168 upload_done_data_with_log_id.local_log_id = local_log_id;
169 UploadCompressedLog(compressed_log, meta_data.Pass(),
170 upload_done_data_with_log_id);
171 }
172
173 void WebRtcLogUploader::UploadCompressedLog(
174 const std::string& compressed_log,
175 scoped_ptr<MetaDataMap> meta_data,
176 const WebRtcLogUploadDoneData& upload_done_data) {
177 DCHECK(file_thread_checker_.CalledOnValidThread());
178 DCHECK(!compressed_log.empty());
179 DCHECK(meta_data.get());
170 180
171 scoped_ptr<std::string> post_data(new std::string()); 181 scoped_ptr<std::string> post_data(new std::string());
172 SetupMultipart(post_data.get(), 182 SetupMultipart(post_data.get(),
173 compressed_log, 183 compressed_log,
174 upload_done_data.incoming_rtp_dump, 184 upload_done_data.incoming_rtp_dump,
175 upload_done_data.outgoing_rtp_dump, 185 upload_done_data.outgoing_rtp_dump,
176 meta_data); 186 *meta_data.get());
177 187
178 // If a test has set the test string pointer, write to it and skip uploading. 188 // If a test has set the test string pointer, write to it and skip uploading.
179 // Still fire the upload callback so that we can run an extension API test 189 // Still fire the upload callback so that we can run an extension API test
180 // using the test framework for that without hanging. 190 // using the test framework for that without hanging.
181 // TODO(grunell): Remove this when the api test for this feature is fully 191 // TODO(grunell): Remove this when the api test for this feature is fully
182 // implemented according to the test plan. http://crbug.com/257329. 192 // implemented according to the test plan. http://crbug.com/257329.
183 if (post_data_) { 193 if (post_data_) {
184 *post_data_ = *post_data; 194 *post_data_ = *post_data;
185 NotifyUploadDone(kHttpResponseOk, "", upload_done_data_with_log_id); 195 NotifyUploadDone(kHttpResponseOk, "", upload_done_data);
186 return; 196 return;
187 } 197 }
188 198
189 content::BrowserThread::PostTask( 199 content::BrowserThread::PostTask(
190 content::BrowserThread::UI, 200 content::BrowserThread::UI,
191 FROM_HERE, 201 FROM_HERE,
192 base::Bind(&WebRtcLogUploader::CreateAndStartURLFetcher, 202 base::Bind(&WebRtcLogUploader::CreateAndStartURLFetcher,
193 base::Unretained(this), 203 base::Unretained(this),
194 upload_done_data_with_log_id, 204 upload_done_data,
195 Passed(&post_data))); 205 Passed(&post_data)));
196 206
197 content::BrowserThread::PostTask(content::BrowserThread::UI, FROM_HERE, 207 content::BrowserThread::PostTask(content::BrowserThread::UI, FROM_HERE,
198 base::Bind(&WebRtcLogUploader::DecreaseLogCount, base::Unretained(this))); 208 base::Bind(&WebRtcLogUploader::DecreaseLogCount, base::Unretained(this)));
199 } 209 }
200 210
211 void WebRtcLogUploader::UploadStoredLog(
212 const WebRtcLogUploadDoneData& upload_data) {
213 DCHECK(file_thread_checker_.CalledOnValidThread());
214 DCHECK(!upload_data.local_log_id.empty());
215 DCHECK(!upload_data.log_path.empty());
216
217 base::FilePath native_log_path =
218 upload_data.log_path.AppendASCII(upload_data.local_log_id)
219 .AddExtension(FILE_PATH_LITERAL(".gz"));
220
221 std::string compressed_log;
222 if (!base::ReadFileToString(native_log_path, &compressed_log)) {
223 DPLOG(WARNING) << "Could not read WebRTC log file.";
224 content::BrowserThread::PostTask(
225 content::BrowserThread::UI, FROM_HERE,
226 base::Bind(upload_data.callback, false, "", "Log doesn't exist."));
227 return;
228 }
229
230 WebRtcLogUploadDoneData upload_data_with_rtp = upload_data;
231
232 // Optimistically set the rtp paths to what they should be if they exist.
233 upload_data_with_rtp.incoming_rtp_dump =
234 upload_data.log_path.AppendASCII(upload_data.local_log_id)
235 .AddExtension(FILE_PATH_LITERAL(".rtp_in"));
236
237 upload_data_with_rtp.outgoing_rtp_dump =
238 upload_data.log_path.AppendASCII(upload_data.local_log_id)
239 .AddExtension(FILE_PATH_LITERAL(".rtp_out"));
240
241 scoped_ptr<MetaDataMap> meta_data(new MetaDataMap());
242 {
243 std::string meta_data_contents;
244 base::FilePath meta_path =
245 upload_data.log_path.AppendASCII(upload_data.local_log_id)
246 .AddExtension(FILE_PATH_LITERAL(".meta"));
247 if (base::ReadFileToString(meta_path, &meta_data_contents) &&
248 !meta_data_contents.empty()) {
249 Pickle pickle(&meta_data_contents[0], meta_data_contents.size());
250 PickleIterator it(pickle);
251 std::string key, value;
252 while (it.ReadString(&key) && it.ReadString(&value))
253 (*meta_data.get())[key] = value;
254 }
255 }
256
257 UploadCompressedLog(compressed_log, meta_data.Pass(), upload_data_with_rtp);
258 }
259
260 void WebRtcLogUploader::LoggingStoppedDoStore(
261 const WebRtcLogPaths& log_paths,
262 const std::string& log_id,
263 scoped_ptr<WebRtcLogBuffer> log_buffer,
264 scoped_ptr<MetaDataMap> meta_data,
265 const WebRtcLoggingHandlerHost::GenericDoneCallback& done_callback) {
266 DCHECK(file_thread_checker_.CalledOnValidThread());
267 DCHECK(!log_id.empty());
268 DCHECK(log_buffer.get());
269 DCHECK(!log_paths.log_path.empty());
270
271 WebRtcLogUtil::DeleteOldWebRtcLogFiles(log_paths.log_path);
272
273 base::FilePath log_list_path =
274 WebRtcLogList::GetWebRtcLogListFileForDirectory(log_paths.log_path);
275
276 // Store the native log with a ".gz" extension.
277 std::string compressed_log;
278 CompressLog(&compressed_log, log_buffer.get());
279 base::FilePath native_log_path = log_paths.log_path.AppendASCII(log_id)
280 .AddExtension(FILE_PATH_LITERAL(".gz"));
281 WriteCompressedLogToFile(compressed_log, native_log_path);
282 AddLocallyStoredLogInfoToUploadListFile(log_list_path, log_id);
283
284 // Move the rtp dump files to the log directory with a name of
285 // <log id>.rtp_[in|out].
286 if (!log_paths.incoming_rtp_dump.empty()) {
287 base::FilePath rtp_path = log_paths.log_path.AppendASCII(log_id)
288 .AddExtension(FILE_PATH_LITERAL(".rtp_in"));
289 base::Move(log_paths.incoming_rtp_dump, rtp_path);
290 }
291
292 if (!log_paths.outgoing_rtp_dump.empty()) {
293 base::FilePath rtp_path = log_paths.log_path.AppendASCII(log_id)
294 .AddExtension(FILE_PATH_LITERAL(".rtp_out"));
295 base::Move(log_paths.outgoing_rtp_dump, rtp_path);
296 }
297
298 if (meta_data.get() && !meta_data->empty()) {
299 Pickle pickle;
300 for (const auto& it : *meta_data.get()) {
301 pickle.WriteString(it.first);
302 pickle.WriteString(it.second);
303 }
304 base::FilePath meta_path = log_paths.log_path.AppendASCII(log_id)
305 .AddExtension(FILE_PATH_LITERAL(".meta"));
306 base::WriteFile(meta_path, static_cast<const char*>(pickle.data()),
307 pickle.size());
308 }
309
310 content::BrowserThread::PostTask(
311 content::BrowserThread::UI, FROM_HERE,
312 base::Bind(done_callback, true, ""));
313 }
314
201 void WebRtcLogUploader::StartShutdown() { 315 void WebRtcLogUploader::StartShutdown() {
202 DCHECK(create_thread_checker_.CalledOnValidThread()); 316 DCHECK(create_thread_checker_.CalledOnValidThread());
203 DCHECK(!shutting_down_); 317 DCHECK(!shutting_down_);
204 318
205 // Delete all URLFetchers first and clear the upload done map. 319 // Delete all URLFetchers first and clear the upload done map.
206 for (UploadDoneDataMap::iterator it = upload_done_data_.begin(); 320 for (UploadDoneDataMap::iterator it = upload_done_data_.begin();
207 it != upload_done_data_.end(); 321 it != upload_done_data_.end();
208 ++it) { 322 ++it) {
209 delete it->first; 323 delete it->first;
210 } 324 }
211 upload_done_data_.clear(); 325 upload_done_data_.clear();
212 shutting_down_ = true; 326 shutting_down_ = true;
213 } 327 }
214 328
215 void WebRtcLogUploader::SetupMultipart( 329 void WebRtcLogUploader::SetupMultipart(
216 std::string* post_data, 330 std::string* post_data,
217 const std::vector<uint8>& compressed_log, 331 const std::string& compressed_log,
218 const base::FilePath& incoming_rtp_dump, 332 const base::FilePath& incoming_rtp_dump,
219 const base::FilePath& outgoing_rtp_dump, 333 const base::FilePath& outgoing_rtp_dump,
220 const std::map<std::string, std::string>& meta_data) { 334 const std::map<std::string, std::string>& meta_data) {
221 #if defined(OS_WIN) 335 #if defined(OS_WIN)
222 const char product[] = "Chrome"; 336 const char product[] = "Chrome";
223 #elif defined(OS_MACOSX) 337 #elif defined(OS_MACOSX)
224 const char product[] = "Chrome_Mac"; 338 const char product[] = "Chrome_Mac";
225 #elif defined(OS_LINUX) 339 #elif defined(OS_LINUX)
226 #if !defined(ADDRESS_SANITIZER) 340 #if !defined(ADDRESS_SANITIZER)
227 const char product[] = "Chrome_Linux"; 341 const char product[] = "Chrome_Linux";
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
262 if (!rtp_dumps[i].empty() && base::PathExists(rtp_dumps[i])) { 376 if (!rtp_dumps[i].empty() && base::PathExists(rtp_dumps[i])) {
263 std::string dump_data; 377 std::string dump_data;
264 if (base::ReadFileToString(rtp_dumps[i], &dump_data)) 378 if (base::ReadFileToString(rtp_dumps[i], &dump_data))
265 AddRtpDumpData(post_data, kRtpDumpNames[i], dump_data); 379 AddRtpDumpData(post_data, kRtpDumpNames[i], dump_data);
266 } 380 }
267 } 381 }
268 382
269 net::AddMultipartFinalDelimiterForUpload(kMultipartBoundary, post_data); 383 net::AddMultipartFinalDelimiterForUpload(kMultipartBoundary, post_data);
270 } 384 }
271 385
272 void WebRtcLogUploader::CompressLog(std::vector<uint8>* compressed_log, 386 void WebRtcLogUploader::CompressLog(std::string* compressed_log,
273 uint8* input, 387 WebRtcLogBuffer* buffer) {
274 uint32 input_size) {
275 PartialCircularBuffer read_pcb(input, input_size);
276
277 z_stream stream = {0}; 388 z_stream stream = {0};
278 int result = deflateInit2(&stream, Z_DEFAULT_COMPRESSION, Z_DEFLATED, 389 int result = deflateInit2(&stream, Z_DEFAULT_COMPRESSION, Z_DEFLATED,
279 // windowBits = 15 is default, 16 is added to 390 // windowBits = 15 is default, 16 is added to
280 // produce a gzip header + trailer. 391 // produce a gzip header + trailer.
281 15 + 16, 392 15 + 16,
282 8, // memLevel = 8 is default. 393 8, // memLevel = 8 is default.
283 Z_DEFAULT_STRATEGY); 394 Z_DEFAULT_STRATEGY);
284 DCHECK_EQ(Z_OK, result); 395 DCHECK_EQ(Z_OK, result);
285 396
286 uint8 intermediate_buffer[kIntermediateCompressionBufferBytes] = {0}; 397 uint8 intermediate_buffer[kIntermediateCompressionBufferBytes] = {0};
287 ResizeForNextOutput(compressed_log, &stream); 398 ResizeForNextOutput(compressed_log, &stream);
288 uint32 read = 0; 399 uint32 read = 0;
289 400
401 PartialCircularBuffer read_buffer(buffer->Read());
290 do { 402 do {
291 if (stream.avail_in == 0) { 403 if (stream.avail_in == 0) {
292 read = read_pcb.Read(&intermediate_buffer[0], 404 read = read_buffer.Read(&intermediate_buffer[0],
293 kIntermediateCompressionBufferBytes); 405 sizeof(intermediate_buffer));
294 stream.next_in = &intermediate_buffer[0]; 406 stream.next_in = &intermediate_buffer[0];
295 stream.avail_in = read; 407 stream.avail_in = read;
296 if (read != kIntermediateCompressionBufferBytes) 408 if (read != kIntermediateCompressionBufferBytes)
297 break; 409 break;
298 } 410 }
299 result = deflate(&stream, Z_SYNC_FLUSH); 411 result = deflate(&stream, Z_SYNC_FLUSH);
300 DCHECK_EQ(Z_OK, result); 412 DCHECK_EQ(Z_OK, result);
301 if (stream.avail_out == 0) 413 if (stream.avail_out == 0)
302 ResizeForNextOutput(compressed_log, &stream); 414 ResizeForNextOutput(compressed_log, &stream);
303 } while (true); 415 } while (true);
304 416
305 // Ensure we have enough room in the output buffer. Easier to always just do a 417 // Ensure we have enough room in the output buffer. Easier to always just do a
306 // resize than looping around and resize if needed. 418 // resize than looping around and resize if needed.
307 if (stream.avail_out < kIntermediateCompressionBufferBytes) 419 if (stream.avail_out < kIntermediateCompressionBufferBytes)
308 ResizeForNextOutput(compressed_log, &stream); 420 ResizeForNextOutput(compressed_log, &stream);
309 421
310 result = deflate(&stream, Z_FINISH); 422 result = deflate(&stream, Z_FINISH);
311 DCHECK_EQ(Z_STREAM_END, result); 423 DCHECK_EQ(Z_STREAM_END, result);
312 result = deflateEnd(&stream); 424 result = deflateEnd(&stream);
313 DCHECK_EQ(Z_OK, result); 425 DCHECK_EQ(Z_OK, result);
314 426
315 compressed_log->resize(compressed_log->size() - stream.avail_out); 427 compressed_log->resize(compressed_log->size() - stream.avail_out);
316 } 428 }
317 429
318 void WebRtcLogUploader::ResizeForNextOutput(std::vector<uint8>* compressed_log, 430 void WebRtcLogUploader::ResizeForNextOutput(std::string* compressed_log,
319 z_stream* stream) { 431 z_stream* stream) {
320 size_t old_size = compressed_log->size() - stream->avail_out; 432 size_t old_size = compressed_log->size() - stream->avail_out;
321 compressed_log->resize(old_size + kIntermediateCompressionBufferBytes); 433 compressed_log->resize(old_size + kIntermediateCompressionBufferBytes);
322 stream->next_out = &(*compressed_log)[old_size]; 434 stream->next_out = reinterpret_cast<unsigned char*>(
435 &(*compressed_log)[old_size]);
323 stream->avail_out = kIntermediateCompressionBufferBytes; 436 stream->avail_out = kIntermediateCompressionBufferBytes;
324 } 437 }
325 438
326 void WebRtcLogUploader::CreateAndStartURLFetcher( 439 void WebRtcLogUploader::CreateAndStartURLFetcher(
327 const WebRtcLogUploadDoneData& upload_done_data, 440 const WebRtcLogUploadDoneData& upload_done_data,
328 scoped_ptr<std::string> post_data) { 441 scoped_ptr<std::string> post_data) {
329 DCHECK(create_thread_checker_.CalledOnValidThread()); 442 DCHECK(create_thread_checker_.CalledOnValidThread());
330 443
331 if (shutting_down_) 444 if (shutting_down_)
332 return; 445 return;
333 446
334 std::string content_type = kUploadContentType; 447 std::string content_type = kUploadContentType;
335 content_type.append("; boundary="); 448 content_type.append("; boundary=");
336 content_type.append(kMultipartBoundary); 449 content_type.append(kMultipartBoundary);
337 450
338 net::URLFetcher* url_fetcher = 451 net::URLFetcher* url_fetcher =
339 net::URLFetcher::Create(GURL(kUploadURL), net::URLFetcher::POST, this); 452 net::URLFetcher::Create(GURL(kUploadURL), net::URLFetcher::POST, this);
340 url_fetcher->SetRequestContext(g_browser_process->system_request_context()); 453 url_fetcher->SetRequestContext(g_browser_process->system_request_context());
341 url_fetcher->SetUploadData(content_type, *post_data); 454 url_fetcher->SetUploadData(content_type, *post_data);
342 url_fetcher->Start(); 455 url_fetcher->Start();
343 upload_done_data_[url_fetcher] = upload_done_data; 456 upload_done_data_[url_fetcher] = upload_done_data;
344 } 457 }
345 458
346 void WebRtcLogUploader::DecreaseLogCount() { 459 void WebRtcLogUploader::DecreaseLogCount() {
347 DCHECK(create_thread_checker_.CalledOnValidThread()); 460 DCHECK(create_thread_checker_.CalledOnValidThread());
348 --log_count_; 461 --log_count_;
349 } 462 }
350 463
351 void WebRtcLogUploader::WriteCompressedLogToFile( 464 void WebRtcLogUploader::WriteCompressedLogToFile(
352 const std::vector<uint8>& compressed_log, 465 const std::string& compressed_log,
353 const base::FilePath& log_file_path) { 466 const base::FilePath& log_file_path) {
354 DCHECK(file_thread_checker_.CalledOnValidThread()); 467 DCHECK(file_thread_checker_.CalledOnValidThread());
355 DCHECK(!compressed_log.empty()); 468 DCHECK(!compressed_log.empty());
356 base::WriteFile(log_file_path, 469 base::WriteFile(log_file_path, &compressed_log[0], compressed_log.size());
357 reinterpret_cast<const char*>(&compressed_log[0]),
358 compressed_log.size());
359 } 470 }
360 471
361 void WebRtcLogUploader::AddLocallyStoredLogInfoToUploadListFile( 472 void WebRtcLogUploader::AddLocallyStoredLogInfoToUploadListFile(
362 const base::FilePath& upload_list_path, 473 const base::FilePath& upload_list_path,
363 const std::string& local_log_id) { 474 const std::string& local_log_id) {
364 DCHECK(file_thread_checker_.CalledOnValidThread()); 475 DCHECK(file_thread_checker_.CalledOnValidThread());
365 DCHECK(!upload_list_path.empty()); 476 DCHECK(!upload_list_path.empty());
366 DCHECK(!local_log_id.empty()); 477 DCHECK(!local_log_id.empty());
367 478
368 std::string contents; 479 std::string contents;
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
453 if (!success) { 564 if (!success) {
454 error_message = "Uploading failed, response code: " + 565 error_message = "Uploading failed, response code: " +
455 base::IntToString(response_code); 566 base::IntToString(response_code);
456 } 567 }
457 content::BrowserThread::PostTask( 568 content::BrowserThread::PostTask(
458 content::BrowserThread::UI, FROM_HERE, 569 content::BrowserThread::UI, FROM_HERE,
459 base::Bind(upload_done_data.callback, success, report_id, 570 base::Bind(upload_done_data.callback, success, report_id,
460 error_message)); 571 error_message));
461 } 572 }
462 } 573 }
OLDNEW
« no previous file with comments | « chrome/browser/media/webrtc_log_uploader.h ('k') | chrome/browser/media/webrtc_log_uploader_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698