| Index: extensions/browser/api/cast_channel/logger.cc
|
| diff --git a/extensions/browser/api/cast_channel/logger.cc b/extensions/browser/api/cast_channel/logger.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..f31a8496032483d4b7550e0e6df91408311bef2c
|
| --- /dev/null
|
| +++ b/extensions/browser/api/cast_channel/logger.cc
|
| @@ -0,0 +1,156 @@
|
| +// Copyright 2014 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "extensions/browser/api/cast_channel/logger.h"
|
| +
|
| +#include <stdint.h>
|
| +
|
| +#include <string>
|
| +#include <utility>
|
| +
|
| +#include "base/memory/ptr_util.h"
|
| +#include "base/strings/string_util.h"
|
| +#include "extensions/browser/api/cast_channel/cast_auth_util.h"
|
| +#include "extensions/browser/api/cast_channel/cast_socket.h"
|
| +#include "net/base/net_errors.h"
|
| +
|
| +namespace extensions {
|
| +namespace api {
|
| +namespace cast_channel {
|
| +
|
| +using net::IPEndPoint;
|
| +using proto::EventType;
|
| +using proto::Log;
|
| +using proto::SocketEvent;
|
| +
|
| +namespace {
|
| +
|
| +proto::ChallengeReplyErrorType ChallegeReplyErrorToProto(
|
| + AuthResult::ErrorType error_type) {
|
| + switch (error_type) {
|
| + case AuthResult::ERROR_NONE:
|
| + return proto::CHALLENGE_REPLY_ERROR_NONE;
|
| + case AuthResult::ERROR_PEER_CERT_EMPTY:
|
| + return proto::CHALLENGE_REPLY_ERROR_PEER_CERT_EMPTY;
|
| + case AuthResult::ERROR_WRONG_PAYLOAD_TYPE:
|
| + return proto::CHALLENGE_REPLY_ERROR_WRONG_PAYLOAD_TYPE;
|
| + case AuthResult::ERROR_NO_PAYLOAD:
|
| + return proto::CHALLENGE_REPLY_ERROR_NO_PAYLOAD;
|
| + case AuthResult::ERROR_PAYLOAD_PARSING_FAILED:
|
| + return proto::CHALLENGE_REPLY_ERROR_PAYLOAD_PARSING_FAILED;
|
| + case AuthResult::ERROR_MESSAGE_ERROR:
|
| + return proto::CHALLENGE_REPLY_ERROR_MESSAGE_ERROR;
|
| + case AuthResult::ERROR_NO_RESPONSE:
|
| + return proto::CHALLENGE_REPLY_ERROR_NO_RESPONSE;
|
| + case AuthResult::ERROR_FINGERPRINT_NOT_FOUND:
|
| + return proto::CHALLENGE_REPLY_ERROR_FINGERPRINT_NOT_FOUND;
|
| + case AuthResult::ERROR_CERT_PARSING_FAILED:
|
| + return proto::CHALLENGE_REPLY_ERROR_CERT_PARSING_FAILED;
|
| + case AuthResult::ERROR_CERT_NOT_SIGNED_BY_TRUSTED_CA:
|
| + return proto::CHALLENGE_REPLY_ERROR_CERT_NOT_SIGNED_BY_TRUSTED_CA;
|
| + case AuthResult::ERROR_CANNOT_EXTRACT_PUBLIC_KEY:
|
| + return proto::CHALLENGE_REPLY_ERROR_CANNOT_EXTRACT_PUBLIC_KEY;
|
| + case AuthResult::ERROR_SIGNED_BLOBS_MISMATCH:
|
| + return proto::CHALLENGE_REPLY_ERROR_SIGNED_BLOBS_MISMATCH;
|
| + case AuthResult::ERROR_TLS_CERT_VALIDITY_PERIOD_TOO_LONG:
|
| + return proto::CHALLENGE_REPLY_ERROR_TLS_CERT_VALIDITY_PERIOD_TOO_LONG;
|
| + case AuthResult::ERROR_TLS_CERT_VALID_START_DATE_IN_FUTURE:
|
| + return proto::CHALLENGE_REPLY_ERROR_TLS_CERT_VALID_START_DATE_IN_FUTURE;
|
| + case AuthResult::ERROR_TLS_CERT_EXPIRED:
|
| + return proto::CHALLENGE_REPLY_ERROR_TLS_CERT_EXPIRED;
|
| + case AuthResult::ERROR_CRL_INVALID:
|
| + return proto::CHALLENGE_REPLY_ERROR_CRL_INVALID;
|
| + case AuthResult::ERROR_CERT_REVOKED:
|
| + return proto::CHALLENGE_REPLY_ERROR_CERT_REVOKED;
|
| + default:
|
| + NOTREACHED();
|
| + return proto::CHALLENGE_REPLY_ERROR_NONE;
|
| + }
|
| +}
|
| +
|
| +// Propagate any error fields set in |event| to |last_errors|. If any error
|
| +// field in |event| is set, then also set |last_errors->event_type|.
|
| +void MaybeSetLastErrors(const SocketEvent& event, LastErrors* last_errors) {
|
| + if (event.has_net_return_value() &&
|
| + event.net_return_value() < net::ERR_IO_PENDING) {
|
| + last_errors->net_return_value = event.net_return_value();
|
| + last_errors->event_type = event.type();
|
| + }
|
| + if (event.has_challenge_reply_error_type()) {
|
| + last_errors->challenge_reply_error_type =
|
| + event.challenge_reply_error_type();
|
| + last_errors->event_type = event.type();
|
| + }
|
| +}
|
| +
|
| +} // namespace
|
| +
|
| +LastErrors::LastErrors()
|
| + : event_type(proto::EVENT_TYPE_UNKNOWN),
|
| + challenge_reply_error_type(proto::CHALLENGE_REPLY_ERROR_NONE),
|
| + net_return_value(net::OK) {}
|
| +
|
| +LastErrors::~LastErrors() {}
|
| +
|
| +Logger::Logger() {
|
| + // Logger may not be necessarily be created on the IO thread, but logging
|
| + // happens exclusively there.
|
| + thread_checker_.DetachFromThread();
|
| +}
|
| +
|
| +Logger::~Logger() {
|
| +}
|
| +
|
| +void Logger::LogSocketEventWithRv(int channel_id,
|
| + EventType event_type,
|
| + int rv) {
|
| + DCHECK(thread_checker_.CalledOnValidThread());
|
| +
|
| + SocketEvent event = CreateEvent(event_type);
|
| + event.set_net_return_value(rv);
|
| +
|
| + LogSocketEvent(channel_id, event);
|
| +}
|
| +
|
| +void Logger::LogSocketChallengeReplyEvent(int channel_id,
|
| + const AuthResult& auth_result) {
|
| + DCHECK(thread_checker_.CalledOnValidThread());
|
| +
|
| + SocketEvent event = CreateEvent(proto::AUTH_CHALLENGE_REPLY);
|
| + event.set_challenge_reply_error_type(
|
| + ChallegeReplyErrorToProto(auth_result.error_type));
|
| +
|
| + LogSocketEvent(channel_id, event);
|
| +}
|
| +
|
| +LastErrors Logger::GetLastErrors(int channel_id) const {
|
| + LastErrorsMap::const_iterator it = last_errors_.find(channel_id);
|
| + if (it != last_errors_.end()) {
|
| + return it->second;
|
| + } else {
|
| + return LastErrors();
|
| + }
|
| +}
|
| +
|
| +void Logger::ClearLastErrors(int channel_id) {
|
| + last_errors_.erase(channel_id);
|
| +}
|
| +
|
| +SocketEvent Logger::CreateEvent(EventType event_type) {
|
| + SocketEvent event;
|
| + event.set_type(event_type);
|
| + return event;
|
| +}
|
| +
|
| +void Logger::LogSocketEvent(int channel_id, const SocketEvent& socket_event) {
|
| + LastErrorsMap::iterator it = last_errors_.find(channel_id);
|
| + if (it == last_errors_.end())
|
| + last_errors_[channel_id] = LastErrors();
|
| +
|
| + MaybeSetLastErrors(socket_event, &last_errors_[channel_id]);
|
| +}
|
| +
|
| +} // namespace cast_channel
|
| +} // namespace api
|
| +} // namespace extensions
|
|
|