Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(248)

Side by Side Diff: extensions/browser/api/cast_channel/logger.cc

Issue 456213002: Cast channel: Add cast.channel.getLogs extension API. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Addressed Wez's comments Created 6 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698