// Copyright (c) 2011 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/ftp/ftp_auth_cache.h"

#include "base/logging.h"
#include "url/gurl.h"

namespace net {

// static
const size_t FtpAuthCache::kMaxEntries = 10;

FtpAuthCache::Entry::Entry(const GURL& origin,
                           const AuthCredentials& credentials)
    : origin(origin),
      credentials(credentials) {
}

FtpAuthCache::Entry::~Entry() = default;

FtpAuthCache::FtpAuthCache() = default;

FtpAuthCache::~FtpAuthCache() = default;

FtpAuthCache::Entry* FtpAuthCache::Lookup(const GURL& origin) {
  for (EntryList::iterator it = entries_.begin(); it != entries_.end(); ++it) {
    if (it->origin == origin)
      return &(*it);
  }
  return NULL;
}

void FtpAuthCache::Add(const GURL& origin, const AuthCredentials& credentials) {
  DCHECK(origin.SchemeIs("ftp"));
  DCHECK_EQ(origin.GetOrigin(), origin);

  Entry* entry = Lookup(origin);
  if (entry) {
    entry->credentials = credentials;
  } else {
    entries_.push_front(Entry(origin, credentials));

    // Prevent unbound memory growth of the cache.
    if (entries_.size() > kMaxEntries)
      entries_.pop_back();
  }
}

void FtpAuthCache::Remove(const GURL& origin,
                          const AuthCredentials& credentials) {
  for (EntryList::iterator it = entries_.begin(); it != entries_.end(); ++it) {
    if (it->origin == origin && it->credentials.Equals(credentials)) {
      entries_.erase(it);
      DCHECK(!Lookup(origin));
      return;
    }
  }
}

}  // namespace net
