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

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: ADd missing files 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 bool Compress(const std::string& input, std::string* output) {
60 output->resize(input.size());
61
62 z_stream stream = {0};
63 int result = deflateInit2(&stream,
64 Z_DEFAULT_COMPRESSION,
65 Z_DEFLATED,
66 // 16 is added to produce a gzip header + trailer.
67 MAX_WBITS + 16,
68 8, // memLevel = 8 is default.
69 Z_DEFAULT_STRATEGY);
70 DCHECK_EQ(Z_OK, result);
mark a. foltz 2014/08/11 23:01:44 Can this never actually fail?
imcheng 2014/08/12 07:42:10 Normally this shouldn't fail, unless there is not
71
72 stream.next_in = reinterpret_cast<uint8*>(const_cast<char*>(&input[0]));
mark a. foltz 2014/08/11 23:01:44 Add a COMPILE_ASSERT that sizeof(uint8) == sizeof(
mark a. foltz 2014/08/11 23:01:44 input.data()
imcheng 2014/08/12 07:42:09 Done.
imcheng 2014/08/12 07:42:09 Done.
73 stream.avail_in = input.size();
74 stream.next_out = reinterpret_cast<uint8*>(&(*output)[0]);
mark a. foltz 2014/08/11 23:01:44 output->data()
imcheng 2014/08/12 07:42:10 Done.
75 stream.avail_out = output->size();
76
77 // Do a one-shot compression. This will return Z_STREAM_END only if |output|
78 // is large enough to hold all compressed data. Otherwise, Z_OK will be
79 // returned (this should happen very rarely and for small inputs) and
80 // |output| will have to be resized.
81 result = deflate(&stream, Z_FINISH);
82
83 if (result == Z_OK) {
mark a. foltz 2014/08/11 23:01:44 while (result == Z_OK) { ... }
imcheng 2014/08/12 07:42:09 Removed since we are doing one-shot compression.
84 do {
85 int old_size = output->size();
86 output->resize(old_size + input.size());
mark a. foltz 2014/08/11 23:01:43 net::GrowableIOBuffer would be a better abstractio
imcheng 2014/08/12 07:42:10 Removed since we are doing one-shot compression.
87 stream.next_out = reinterpret_cast<uint8*>(&(*output)[old_size]);
mark a. foltz 2014/08/11 23:01:44 Is this code cribbed from somewhere else? I would
imcheng 2014/08/12 07:42:10 There is an utility function close to this in zlib
88 stream.avail_out = output->size() - old_size;
89 result = deflate(&stream, Z_FINISH);
90 } while (result == Z_OK);
91 }
92
93 bool success = (result == Z_STREAM_END);
94
95 if (!success)
96 VLOG(2) << "deflate() failed. Result: " << result;
mark a. foltz 2014/08/11 23:01:44 return early here?
imcheng 2014/08/12 07:42:10 deflateEnd() needs to be called even if deflate()
97
98 result = deflateEnd(&stream);
99 DCHECK(result == Z_OK || result == Z_DATA_ERROR);
100
101 if (success)
mark a. foltz 2014/08/11 23:01:44 Do we need to check result here?
imcheng 2014/08/12 07:42:09 No. deflateEnd() returns Z_OK if deflate() was suc
102 output->resize(output->size() - stream.avail_out);
103
104 return success;
105 }
106
58 } // namespace 107 } // namespace
59 108
60 Logger::AggregatedSocketEventLog::AggregatedSocketEventLog() { 109 Logger::AggregatedSocketEventLog::AggregatedSocketEventLog() {
61 } 110 }
62 Logger::AggregatedSocketEventLog::~AggregatedSocketEventLog() { 111 Logger::AggregatedSocketEventLog::~AggregatedSocketEventLog() {
63 } 112 }
64 113
65 Logger::Logger(scoped_ptr<base::TickClock> clock, 114 Logger::Logger(scoped_ptr<base::TickClock> clock,
66 base::TimeTicks unix_epoch_time_ticks) 115 base::TimeTicks unix_epoch_time_ticks)
67 : clock_(clock.Pass()), 116 : clock_(clock.Pass()),
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after
194 ChannegeReplyErrorToProto(auth_result.error_type)); 243 ChannegeReplyErrorToProto(auth_result.error_type));
195 if (auth_result.nss_error_code != 0) 244 if (auth_result.nss_error_code != 0)
196 event.set_return_value(auth_result.nss_error_code); 245 event.set_return_value(auth_result.nss_error_code);
197 246
198 LogSocketEvent(channel_id, event); 247 LogSocketEvent(channel_id, event);
199 } 248 }
200 249
201 SocketEvent Logger::CreateEvent(EventType event_type) { 250 SocketEvent Logger::CreateEvent(EventType event_type) {
202 SocketEvent event; 251 SocketEvent event;
203 event.set_type(event_type); 252 event.set_type(event_type);
204 event.set_timestamp_micros(clock_->NowTicks().ToInternalValue() + 253 event.set_timestamp_micros(clock_->NowTicks().ToInternalValue() -
205 unix_epoch_time_ticks_.ToInternalValue()); 254 unix_epoch_time_ticks_.ToInternalValue());
206 return event; 255 return event;
207 } 256 }
208 257
209 void Logger::LogSocketEvent(int channel_id, const SocketEvent& socket_event) { 258 void Logger::LogSocketEvent(int channel_id, const SocketEvent& socket_event) {
210 AggregatedSocketEventLogMap::iterator it = 259 AggregatedSocketEventLogMap::iterator it =
211 aggregated_socket_events_.find(channel_id); 260 aggregated_socket_events_.find(channel_id);
212 if (it == aggregated_socket_events_.end()) { 261 if (it == aggregated_socket_events_.end()) {
213 if (aggregated_socket_events_.size() >= kMaxSocketsToLog) { 262 if (aggregated_socket_events_.size() >= kMaxSocketsToLog) {
214 AggregatedSocketEventLogMap::iterator erase_it = 263 AggregatedSocketEventLogMap::iterator erase_it =
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
256 for (std::deque<SocketEvent>::const_iterator socket_event_it = 305 for (std::deque<SocketEvent>::const_iterator socket_event_it =
257 socket_events.begin(); 306 socket_events.begin();
258 socket_event_it != socket_events.end(); 307 socket_event_it != socket_events.end();
259 ++socket_event_it) { 308 ++socket_event_it) {
260 SocketEvent* socket_event = 309 SocketEvent* socket_event =
261 new_aggregated_socket_event->add_socket_event(); 310 new_aggregated_socket_event->add_socket_event();
262 socket_event->CopyFrom(*socket_event_it); 311 socket_event->CopyFrom(*socket_event_it);
263 } 312 }
264 } 313 }
265 314
266 return log.SerializeToString(output); 315 std::string serialized;
316 if (!log.SerializeToString(&serialized)) {
317 VLOG(2) << "Failed to serialized proto to string.";
318 return false;
319 }
320
321 if (!Compress(serialized, output)) {
322 VLOG(2) << "Failed to compress serialized contents.";
323 return false;
324 }
325
326 return true;
267 } 327 }
268 328
269 void Logger::Reset() { 329 void Logger::Reset() {
270 aggregated_socket_events_.clear(); 330 aggregated_socket_events_.clear();
271 num_evicted_aggregated_socket_events_ = 0; 331 num_evicted_aggregated_socket_events_ = 0;
272 num_evicted_socket_events_ = 0; 332 num_evicted_socket_events_ = 0;
273 } 333 }
274 334
275 } // namespace cast_channel 335 } // namespace cast_channel
276 } // namespace api 336 } // namespace api
277 } // namespace extensions 337 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698