OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 "extensions/browser/api/cast_channel/logger.h" | 5 #include "extensions/browser/api/cast_channel/logger.h" |
6 | 6 |
7 #include "base/strings/string_util.h" | 7 #include "base/strings/string_util.h" |
8 #include "base/time/tick_clock.h" | 8 #include "base/time/tick_clock.h" |
9 #include "extensions/browser/api/cast_channel/cast_auth_util.h" | 9 #include "extensions/browser/api/cast_channel/cast_auth_util.h" |
| 10 #include "third_party/zlib/zlib.h" |
10 | 11 |
11 namespace extensions { | 12 namespace extensions { |
12 namespace core_api { | 13 namespace core_api { |
13 namespace cast_channel { | 14 namespace cast_channel { |
14 | 15 |
15 using net::IPEndPoint; | 16 using net::IPEndPoint; |
16 using proto::AggregatedSocketEvent; | 17 using proto::AggregatedSocketEvent; |
17 using proto::EventType; | 18 using proto::EventType; |
18 using proto::Log; | 19 using proto::Log; |
19 using proto::SocketEvent; | 20 using proto::SocketEvent; |
(...skipping 28 matching lines...) Expand all Loading... |
48 case AuthResult::ERROR_NSS_CANNOT_EXTRACT_PUBLIC_KEY: | 49 case AuthResult::ERROR_NSS_CANNOT_EXTRACT_PUBLIC_KEY: |
49 return proto::CHALLENGE_REPLY_ERROR_NSS_CANNOT_EXTRACT_PUBLIC_KEY; | 50 return proto::CHALLENGE_REPLY_ERROR_NSS_CANNOT_EXTRACT_PUBLIC_KEY; |
50 case AuthResult::ERROR_NSS_SIGNED_BLOBS_MISMATCH: | 51 case AuthResult::ERROR_NSS_SIGNED_BLOBS_MISMATCH: |
51 return proto::CHALLENGE_REPLY_ERROR_NSS_SIGNED_BLOBS_MISMATCH; | 52 return proto::CHALLENGE_REPLY_ERROR_NSS_SIGNED_BLOBS_MISMATCH; |
52 default: | 53 default: |
53 NOTREACHED(); | 54 NOTREACHED(); |
54 return proto::CHALLENGE_REPLY_ERROR_NONE; | 55 return proto::CHALLENGE_REPLY_ERROR_NONE; |
55 } | 56 } |
56 } | 57 } |
57 | 58 |
| 59 scoped_ptr<char[]> Compress(const std::string& input, size_t* length) { |
| 60 *length = 0; |
| 61 z_stream stream = {0}; |
| 62 int result = deflateInit2(&stream, |
| 63 Z_DEFAULT_COMPRESSION, |
| 64 Z_DEFLATED, |
| 65 // 16 is added to produce a gzip header + trailer. |
| 66 MAX_WBITS + 16, |
| 67 8, // memLevel = 8 is default. |
| 68 Z_DEFAULT_STRATEGY); |
| 69 DCHECK_EQ(Z_OK, result); |
| 70 |
| 71 size_t out_size = deflateBound(&stream, input.size()); |
| 72 scoped_ptr<char[]> out(new char[out_size]); |
| 73 |
| 74 COMPILE_ASSERT(sizeof(uint8) == sizeof(char), uint8_char_different_sizes); |
| 75 |
| 76 stream.next_in = reinterpret_cast<uint8*>(const_cast<char*>(input.data())); |
| 77 stream.avail_in = input.size(); |
| 78 stream.next_out = reinterpret_cast<uint8*>(out.get()); |
| 79 stream.avail_out = out_size; |
| 80 |
| 81 // Do a one-shot compression. This will return Z_STREAM_END only if |output| |
| 82 // is large enough to hold all compressed data. |
| 83 result = deflate(&stream, Z_FINISH); |
| 84 |
| 85 bool success = (result == Z_STREAM_END); |
| 86 |
| 87 if (!success) |
| 88 VLOG(2) << "deflate() failed. Result: " << result; |
| 89 |
| 90 result = deflateEnd(&stream); |
| 91 DCHECK(result == Z_OK || result == Z_DATA_ERROR); |
| 92 |
| 93 if (success) |
| 94 *length = out_size - stream.avail_out; |
| 95 |
| 96 return out.Pass(); |
| 97 } |
| 98 |
58 } // namespace | 99 } // namespace |
59 | 100 |
60 Logger::AggregatedSocketEventLog::AggregatedSocketEventLog() { | 101 Logger::AggregatedSocketEventLog::AggregatedSocketEventLog() { |
61 } | 102 } |
62 Logger::AggregatedSocketEventLog::~AggregatedSocketEventLog() { | 103 Logger::AggregatedSocketEventLog::~AggregatedSocketEventLog() { |
63 } | 104 } |
64 | 105 |
65 Logger::Logger(scoped_ptr<base::TickClock> clock, | 106 Logger::Logger(scoped_ptr<base::TickClock> clock, |
66 base::TimeTicks unix_epoch_time_ticks) | 107 base::TimeTicks unix_epoch_time_ticks) |
67 : clock_(clock.Pass()), | 108 : clock_(clock.Pass()), |
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
194 ChannegeReplyErrorToProto(auth_result.error_type)); | 235 ChannegeReplyErrorToProto(auth_result.error_type)); |
195 if (auth_result.nss_error_code != 0) | 236 if (auth_result.nss_error_code != 0) |
196 event.set_return_value(auth_result.nss_error_code); | 237 event.set_return_value(auth_result.nss_error_code); |
197 | 238 |
198 LogSocketEvent(channel_id, event); | 239 LogSocketEvent(channel_id, event); |
199 } | 240 } |
200 | 241 |
201 SocketEvent Logger::CreateEvent(EventType event_type) { | 242 SocketEvent Logger::CreateEvent(EventType event_type) { |
202 SocketEvent event; | 243 SocketEvent event; |
203 event.set_type(event_type); | 244 event.set_type(event_type); |
204 event.set_timestamp_micros(clock_->NowTicks().ToInternalValue() + | 245 event.set_timestamp_micros(clock_->NowTicks().ToInternalValue() - |
205 unix_epoch_time_ticks_.ToInternalValue()); | 246 unix_epoch_time_ticks_.ToInternalValue()); |
206 return event; | 247 return event; |
207 } | 248 } |
208 | 249 |
209 void Logger::LogSocketEvent(int channel_id, const SocketEvent& socket_event) { | 250 void Logger::LogSocketEvent(int channel_id, const SocketEvent& socket_event) { |
210 AggregatedSocketEventLogMap::iterator it = | 251 AggregatedSocketEventLogMap::iterator it = |
211 aggregated_socket_events_.find(channel_id); | 252 aggregated_socket_events_.find(channel_id); |
212 if (it == aggregated_socket_events_.end()) { | 253 if (it == aggregated_socket_events_.end()) { |
213 if (aggregated_socket_events_.size() >= kMaxSocketsToLog) { | 254 if (aggregated_socket_events_.size() >= kMaxSocketsToLog) { |
214 AggregatedSocketEventLogMap::iterator erase_it = | 255 AggregatedSocketEventLogMap::iterator erase_it = |
(...skipping 14 matching lines...) Expand all Loading... |
229 | 270 |
230 std::deque<proto::SocketEvent>& socket_events = it->second->socket_events; | 271 std::deque<proto::SocketEvent>& socket_events = it->second->socket_events; |
231 if (socket_events.size() >= kMaxEventsPerSocket) { | 272 if (socket_events.size() >= kMaxEventsPerSocket) { |
232 socket_events.pop_front(); | 273 socket_events.pop_front(); |
233 num_evicted_socket_events_++; | 274 num_evicted_socket_events_++; |
234 } | 275 } |
235 | 276 |
236 socket_events.push_back(socket_event); | 277 socket_events.push_back(socket_event); |
237 } | 278 } |
238 | 279 |
239 bool Logger::LogToString(std::string* output) const { | 280 scoped_ptr<char[]> Logger::GetLogs(size_t* length) const { |
240 output->clear(); | 281 *length = 0; |
241 | 282 |
242 Log log; | 283 Log log; |
243 log.set_num_evicted_aggregated_socket_events( | 284 log.set_num_evicted_aggregated_socket_events( |
244 num_evicted_aggregated_socket_events_); | 285 num_evicted_aggregated_socket_events_); |
245 log.set_num_evicted_socket_events(num_evicted_socket_events_); | 286 log.set_num_evicted_socket_events(num_evicted_socket_events_); |
246 | 287 |
247 for (AggregatedSocketEventLogMap::const_iterator it = | 288 for (AggregatedSocketEventLogMap::const_iterator it = |
248 aggregated_socket_events_.begin(); | 289 aggregated_socket_events_.begin(); |
249 it != aggregated_socket_events_.end(); | 290 it != aggregated_socket_events_.end(); |
250 ++it) { | 291 ++it) { |
251 AggregatedSocketEvent* new_aggregated_socket_event = | 292 AggregatedSocketEvent* new_aggregated_socket_event = |
252 log.add_aggregated_socket_event(); | 293 log.add_aggregated_socket_event(); |
253 new_aggregated_socket_event->CopyFrom(it->second->aggregated_socket_event); | 294 new_aggregated_socket_event->CopyFrom(it->second->aggregated_socket_event); |
254 | 295 |
255 const std::deque<SocketEvent>& socket_events = it->second->socket_events; | 296 const std::deque<SocketEvent>& socket_events = it->second->socket_events; |
256 for (std::deque<SocketEvent>::const_iterator socket_event_it = | 297 for (std::deque<SocketEvent>::const_iterator socket_event_it = |
257 socket_events.begin(); | 298 socket_events.begin(); |
258 socket_event_it != socket_events.end(); | 299 socket_event_it != socket_events.end(); |
259 ++socket_event_it) { | 300 ++socket_event_it) { |
260 SocketEvent* socket_event = | 301 SocketEvent* socket_event = |
261 new_aggregated_socket_event->add_socket_event(); | 302 new_aggregated_socket_event->add_socket_event(); |
262 socket_event->CopyFrom(*socket_event_it); | 303 socket_event->CopyFrom(*socket_event_it); |
263 } | 304 } |
264 } | 305 } |
265 | 306 |
266 return log.SerializeToString(output); | 307 std::string serialized; |
| 308 if (!log.SerializeToString(&serialized)) { |
| 309 VLOG(2) << "Failed to serialized proto to string."; |
| 310 return scoped_ptr<char[]>(); |
| 311 } |
| 312 |
| 313 return Compress(serialized, length); |
267 } | 314 } |
268 | 315 |
269 void Logger::Reset() { | 316 void Logger::Reset() { |
270 aggregated_socket_events_.clear(); | 317 aggregated_socket_events_.clear(); |
271 num_evicted_aggregated_socket_events_ = 0; | 318 num_evicted_aggregated_socket_events_ = 0; |
272 num_evicted_socket_events_ = 0; | 319 num_evicted_socket_events_ = 0; |
273 } | 320 } |
274 | 321 |
275 } // namespace cast_channel | 322 } // namespace cast_channel |
276 } // namespace api | 323 } // namespace api |
277 } // namespace extensions | 324 } // namespace extensions |
OLD | NEW |