1 // Copyright (c) 2011 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 #include "net/base/net_log.h"
6
7 #include "base/logging.h"
8 #include "base/string_number_conversions.h"
9 #include "base/time.h"
10 #include "base/utf_string_conversions.h"
11 #include "base/values.h"
12 #include "net/base/net_errors.h"
13
14 namespace net {
15
ToValue() const16 Value* NetLog::Source::ToValue() const {
17 DictionaryValue* dict = new DictionaryValue();
18 dict->SetInteger("type", static_cast<int>(type));
19 dict->SetInteger("id", static_cast<int>(id));
20 return dict;
21 }
22
23 // static
TickCountToString(const base::TimeTicks & time)24 std::string NetLog::TickCountToString(const base::TimeTicks& time) {
25 int64 delta_time = (time - base::TimeTicks()).InMilliseconds();
26 return base::Int64ToString(delta_time);
27 }
28
29 // static
EventTypeToString(EventType event)30 const char* NetLog::EventTypeToString(EventType event) {
31 switch (event) {
32 #define EVENT_TYPE(label) case TYPE_ ## label: return #label;
33 #include "net/base/net_log_event_type_list.h"
34 #undef EVENT_TYPE
35 }
36 return NULL;
37 }
38
39 // static
GetAllEventTypes()40 std::vector<NetLog::EventType> NetLog::GetAllEventTypes() {
41 std::vector<NetLog::EventType> types;
42 #define EVENT_TYPE(label) types.push_back(TYPE_ ## label);
43 #include "net/base/net_log_event_type_list.h"
44 #undef EVENT_TYPE
45 return types;
46 }
47
48 // static
SourceTypeToString(SourceType source)49 const char* NetLog::SourceTypeToString(SourceType source) {
50 switch (source) {
51 #define SOURCE_TYPE(label, id) case id: return #label;
52 #include "net/base/net_log_source_type_list.h"
53 #undef SOURCE_TYPE
54 }
55 NOTREACHED();
56 return NULL;
57 }
58
59 // static
EventPhaseToString(EventPhase phase)60 const char* NetLog::EventPhaseToString(EventPhase phase) {
61 switch (phase) {
62 case PHASE_BEGIN:
63 return "PHASE_BEGIN";
64 case PHASE_END:
65 return "PHASE_END";
66 case PHASE_NONE:
67 return "PHASE_NONE";
68 }
69 NOTREACHED();
70 return NULL;
71 }
72
73 // static
EntryToDictionaryValue(NetLog::EventType type,const base::TimeTicks & time,const NetLog::Source & source,NetLog::EventPhase phase,NetLog::EventParameters * params,bool use_strings)74 Value* NetLog::EntryToDictionaryValue(NetLog::EventType type,
75 const base::TimeTicks& time,
76 const NetLog::Source& source,
77 NetLog::EventPhase phase,
78 NetLog::EventParameters* params,
79 bool use_strings) {
80 DictionaryValue* entry_dict = new DictionaryValue();
81
82 entry_dict->SetString("time", TickCountToString(time));
83
84 // Set the entry source.
85 DictionaryValue* source_dict = new DictionaryValue();
86 source_dict->SetInteger("id", source.id);
87 if (!use_strings) {
88 source_dict->SetInteger("type", static_cast<int>(source.type));
89 } else {
90 source_dict->SetString("type",
91 NetLog::SourceTypeToString(source.type));
92 }
93 entry_dict->Set("source", source_dict);
94
95 // Set the event info.
96 if (!use_strings) {
97 entry_dict->SetInteger("type", static_cast<int>(type));
98 entry_dict->SetInteger("phase", static_cast<int>(phase));
99 } else {
100 entry_dict->SetString("type", NetLog::EventTypeToString(type));
101 entry_dict->SetString("phase", NetLog::EventPhaseToString(phase));
102 }
103
104 // Set the event-specific parameters.
105 if (params)
106 entry_dict->Set("params", params->ToValue());
107
108 return entry_dict;
109 }
110
AddEntry(NetLog::EventType type,NetLog::EventPhase phase,const scoped_refptr<NetLog::EventParameters> & params) const111 void BoundNetLog::AddEntry(
112 NetLog::EventType type,
113 NetLog::EventPhase phase,
114 const scoped_refptr<NetLog::EventParameters>& params) const {
115 if (net_log_) {
116 net_log_->AddEntry(type, base::TimeTicks::Now(), source_, phase, params);
117 }
118 }
119
AddEntryWithTime(NetLog::EventType type,const base::TimeTicks & time,NetLog::EventPhase phase,const scoped_refptr<NetLog::EventParameters> & params) const120 void BoundNetLog::AddEntryWithTime(
121 NetLog::EventType type,
122 const base::TimeTicks& time,
123 NetLog::EventPhase phase,
124 const scoped_refptr<NetLog::EventParameters>& params) const {
125 if (net_log_) {
126 net_log_->AddEntry(type, time, source_, phase, params);
127 }
128 }
129
AddEvent(NetLog::EventType event_type,const scoped_refptr<NetLog::EventParameters> & params) const130 void BoundNetLog::AddEvent(
131 NetLog::EventType event_type,
132 const scoped_refptr<NetLog::EventParameters>& params) const {
133 AddEntry(event_type, NetLog::PHASE_NONE, params);
134 }
135
BeginEvent(NetLog::EventType event_type,const scoped_refptr<NetLog::EventParameters> & params) const136 void BoundNetLog::BeginEvent(
137 NetLog::EventType event_type,
138 const scoped_refptr<NetLog::EventParameters>& params) const {
139 AddEntry(event_type, NetLog::PHASE_BEGIN, params);
140 }
141
EndEvent(NetLog::EventType event_type,const scoped_refptr<NetLog::EventParameters> & params) const142 void BoundNetLog::EndEvent(
143 NetLog::EventType event_type,
144 const scoped_refptr<NetLog::EventParameters>& params) const {
145 AddEntry(event_type, NetLog::PHASE_END, params);
146 }
147
EndEventWithNetErrorCode(NetLog::EventType event_type,int net_error) const148 void BoundNetLog::EndEventWithNetErrorCode(NetLog::EventType event_type,
149 int net_error) const {
150 DCHECK_NE(net_error, ERR_IO_PENDING);
151 if (net_error >= 0) {
152 EndEvent(event_type, NULL);
153 } else {
154 EndEvent(
155 event_type,
156 make_scoped_refptr(new NetLogIntegerParameter("net_error", net_error)));
157 }
158 }
159
GetLogLevel() const160 NetLog::LogLevel BoundNetLog::GetLogLevel() const {
161 if (net_log_)
162 return net_log_->GetLogLevel();
163 return NetLog::LOG_BASIC;
164 }
165
IsLoggingBytes() const166 bool BoundNetLog::IsLoggingBytes() const {
167 return GetLogLevel() == NetLog::LOG_ALL;
168 }
169
IsLoggingAllEvents() const170 bool BoundNetLog::IsLoggingAllEvents() const {
171 return GetLogLevel() <= NetLog::LOG_ALL_BUT_BYTES;
172 }
173
174 // static
Make(NetLog * net_log,NetLog::SourceType source_type)175 BoundNetLog BoundNetLog::Make(NetLog* net_log,
176 NetLog::SourceType source_type) {
177 if (!net_log)
178 return BoundNetLog();
179
180 NetLog::Source source(source_type, net_log->NextID());
181 return BoundNetLog(source, net_log);
182 }
183
NetLogStringParameter(const char * name,const std::string & value)184 NetLogStringParameter::NetLogStringParameter(const char* name,
185 const std::string& value)
186 : name_(name), value_(value) {
187 }
188
~NetLogStringParameter()189 NetLogStringParameter::~NetLogStringParameter() {
190 }
191
ToValue() const192 Value* NetLogIntegerParameter::ToValue() const {
193 DictionaryValue* dict = new DictionaryValue();
194 dict->SetInteger(name_, value_);
195 return dict;
196 }
197
ToValue() const198 Value* NetLogStringParameter::ToValue() const {
199 DictionaryValue* dict = new DictionaryValue();
200 dict->SetString(name_, value_);
201 return dict;
202 }
203
ToValue() const204 Value* NetLogSourceParameter::ToValue() const {
205 DictionaryValue* dict = new DictionaryValue();
206
207 dict->Set(name_, value_.ToValue());
208 return dict;
209 }
210
ScopedNetLogEvent(const BoundNetLog & net_log,NetLog::EventType event_type,const scoped_refptr<NetLog::EventParameters> & params)211 ScopedNetLogEvent::ScopedNetLogEvent(
212 const BoundNetLog& net_log,
213 NetLog::EventType event_type,
214 const scoped_refptr<NetLog::EventParameters>& params)
215 : net_log_(net_log),
216 event_type_(event_type) {
217 net_log_.BeginEvent(event_type, params);
218 }
219
~ScopedNetLogEvent()220 ScopedNetLogEvent::~ScopedNetLogEvent() {
221 net_log_.EndEvent(event_type_, end_event_params_);
222 }
223
SetEndEventParameters(const scoped_refptr<NetLog::EventParameters> & end_event_params)224 void ScopedNetLogEvent::SetEndEventParameters(
225 const scoped_refptr<NetLog::EventParameters>& end_event_params) {
226 DCHECK(!end_event_params_.get());
227 end_event_params_ = end_event_params;
228 }
229
net_log() const230 const BoundNetLog& ScopedNetLogEvent::net_log() const {
231 return net_log_;
232 }
233
234 } // namespace net
235