| 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 |