// Copyright 2013 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "net/log/write_to_file_net_log_observer.h" #include #include #include "base/json/json_writer.h" #include "base/logging.h" #include "base/memory/scoped_ptr.h" #include "base/values.h" #include "net/log/net_log_util.h" #include "net/url_request/url_request_context.h" namespace net { WriteToFileNetLogObserver::WriteToFileNetLogObserver() : capture_mode_(NetLogCaptureMode::Default()), added_events_(false) { } WriteToFileNetLogObserver::~WriteToFileNetLogObserver() { } void WriteToFileNetLogObserver::set_capture_mode( NetLogCaptureMode capture_mode) { DCHECK(!net_log()); capture_mode_ = capture_mode; } void WriteToFileNetLogObserver::StartObserving( NetLog* net_log, base::ScopedFILE file, base::Value* constants, URLRequestContext* url_request_context) { DCHECK(file.get()); file_ = file.Pass(); added_events_ = false; // Write constants to the output file. This allows loading files that have // different source and event types, as they may be added and removed // between Chrome versions. std::string json; if (constants) { base::JSONWriter::Write(constants, &json); } else { scoped_ptr scoped_constants(GetNetConstants()); base::JSONWriter::Write(scoped_constants.get(), &json); } fprintf(file_.get(), "{\"constants\": %s,\n", json.c_str()); // Start events array. It's closed in StopObserving(). fprintf(file_.get(), "\"events\": [\n"); // Add events for in progress requests if a context is given. if (url_request_context) { DCHECK(url_request_context->CalledOnValidThread()); std::set contexts; contexts.insert(url_request_context); CreateNetLogEntriesForActiveObjects(contexts, this); } net_log->DeprecatedAddObserver(this, capture_mode_); } void WriteToFileNetLogObserver::StopObserving( URLRequestContext* url_request_context) { net_log()->DeprecatedRemoveObserver(this); // End events array. fprintf(file_.get(), "]"); // Write state of the URLRequestContext when logging stopped. if (url_request_context) { DCHECK(url_request_context->CalledOnValidThread()); std::string json; scoped_ptr net_info = GetNetInfo(url_request_context, NET_INFO_ALL_SOURCES); base::JSONWriter::Write(net_info.get(), &json); fprintf(file_.get(), ",\"tabInfo\": %s\n", json.c_str()); } fprintf(file_.get(), "}"); file_.reset(); } void WriteToFileNetLogObserver::OnAddEntry(const NetLog::Entry& entry) { // Add a comma and newline for every event but the first. Newlines are needed // so can load partial log files by just ignoring the last line. For this to // work, lines cannot be pretty printed. scoped_ptr value(entry.ToValue()); std::string json; base::JSONWriter::Write(value.get(), &json); fprintf(file_.get(), "%s%s", (added_events_ ? ",\n" : ""), json.c_str()); added_events_ = true; } } // namespace net