// Copyright (c) 2012 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 "net/spdy/spdy_credential_state.h"

#include "base/logging.h"
#include "base/strings/string_util.h"
#include "net/ssl/server_bound_cert_service.h"

namespace net {

namespace {

GURL GetCanonicalOrigin(const GURL& url) {
  std::string domain =
      ServerBoundCertService::GetDomainForHost(url.host());
  DCHECK(!domain.empty());
  if (domain == url.host())
    return url.GetOrigin();
  return GURL(url.scheme() + "://" + domain + ":" + url.port());
}

}  // namespace

const size_t SpdyCredentialState::kDefaultNumSlots = 8;
const size_t SpdyCredentialState::kNoEntry = 0;

SpdyCredentialState::SpdyCredentialState(size_t num_slots)
  : slots_(num_slots),
    last_added_(-1) {}

SpdyCredentialState::~SpdyCredentialState() {}

bool SpdyCredentialState::HasCredential(const GURL& origin) const {
  return FindCredentialSlot(origin) != kNoEntry;
}

size_t SpdyCredentialState::SetHasCredential(const GURL& origin) {
  size_t i = FindCredentialSlot(origin);
  if (i != kNoEntry)
    return i;
  // Add the new entry at the next index following the index of the last
  // entry added, or at index 0 if the last added index is the last index.
  if (last_added_ + 1 == slots_.size()) {
    last_added_ = 0;
  } else {
    last_added_++;
  }
  slots_[last_added_] = GetCanonicalOrigin(origin);
  return last_added_ + 1;
}

size_t SpdyCredentialState::FindCredentialSlot(const GURL& origin) const {
  GURL url = GetCanonicalOrigin(origin);
  for (size_t i = 0; i < slots_.size(); i++) {
    if (url == slots_[i])
      return i + 1;
  }
  return kNoEntry;
}

void SpdyCredentialState::Resize(size_t size) {
  slots_.resize(size);
  if (last_added_ >= slots_.size())
    last_added_ = slots_.size() - 1;
}

}  // namespace net
