// Copyright 2011 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "net/ssl/ssl_client_auth_cache.h" #include "base/check.h" #include "net/cert/x509_certificate.h" #include "net/ssl/ssl_private_key.h" namespace net { SSLClientAuthCache::SSLClientAuthCache() = default; SSLClientAuthCache::~SSLClientAuthCache() = default; bool SSLClientAuthCache::Lookup(const HostPortPair& server, scoped_refptr* certificate, scoped_refptr* private_key) { DCHECK(certificate); auto iter = cache_.find(server); if (iter == cache_.end()) return false; *certificate = iter->second.first; *private_key = iter->second.second; return true; } void SSLClientAuthCache::Add(const HostPortPair& server, scoped_refptr certificate, scoped_refptr private_key) { cache_[server] = std::pair(std::move(certificate), std::move(private_key)); // TODO(wtc): enforce a maximum number of entries. } bool SSLClientAuthCache::Remove(const HostPortPair& server) { return cache_.erase(server); } void SSLClientAuthCache::Clear() { cache_.clear(); } base::flat_set SSLClientAuthCache::GetCachedServers() const { // TODO(mattm): If views become permitted by Chromium style maybe we could // avoid the intermediate vector by using: // auto keys = std::views::keys(m); // base::flat_set(base::sorted_unique, keys.begin(), // keys.end()); // Use the flat_set underlying container type (currently a std::vector), so we // can move the keys into the set instead of copying them. base::flat_set::container_type keys; keys.reserve(cache_.size()); for (const auto& [key, _] : cache_) { keys.push_back(key); } // `cache_` is a std::map, so the keys are already sorted. return base::flat_set(base::sorted_unique, std::move(keys)); } } // namespace net