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