Modify QuicResumptionState and SessionCache to support multiple TLS sessions.
gfe-relnote: unused code. not protected.
Merge instructions: This CL introduces API changes that are not trivial to fix in Chromium. The best way to merge is to remove "quic/quic_client_session_cache.cc", "quic/quic_client_session_cache.h", "quic/quic_client_session_cache_unittests.cc" from BUILD.gn.
The implementation isn't used yet. So it's safe to do so.
PiperOrigin-RevId: 305534943
Change-Id: I7b427d2ca2e6fe0d53c74bea548910eb629b5488
diff --git a/quic/core/crypto/quic_crypto_client_config.h b/quic/core/crypto/quic_crypto_client_config.h
index e4f7061..99ed31a 100644
--- a/quic/core/crypto/quic_crypto_client_config.h
+++ b/quic/core/crypto/quic_crypto_client_config.h
@@ -42,13 +42,13 @@
// client didn't receive a 0-RTT capable session ticket from the server,
// |transport_params| will be null. Otherwise, it will contain the transport
// parameters received from the server on the original connection.
- std::unique_ptr<TransportParameters> transport_params;
+ TransportParameters* transport_params;
// If |transport_params| is null, then |application_state| is ignored and
// should be empty. |application_state| contains serialized state that the
// client received from the server at the application layer that the client
// needs to remember when performing a 0-RTT handshake.
- std::vector<uint8_t> application_state;
+ std::vector<uint8_t>* application_state;
};
// SessionCache is an interface for managing storing and retrieving
@@ -57,15 +57,18 @@
public:
virtual ~SessionCache() {}
- // Inserts |state| into the cache, keyed by |server_id|. Insert is called
- // after a session ticket is received. If the session ticket is valid for
- // 0-RTT, there may be a delay between its receipt and the call to Insert
- // while waiting for application state for |state|.
- //
- // Insert may be called multiple times per connection. SessionCache
- // implementations should support storing multiple entries per server ID.
+ // Inserts |session|, |params|, and |application_states| into the cache, keyed
+ // by |server_id|. Insert is first called after all three values are present.
+ // The ownership of |session| is transferred to the cache, while other two are
+ // copied. Multiple sessions might need to be inserted for a connection.
+ // SessionCache implementations should support storing
+ // multiple entries per server ID.
+ // TODO(renjietang): Once params and application_states are wired up, change
+ // the argument type to const&.
virtual void Insert(const QuicServerId& server_id,
- std::unique_ptr<QuicResumptionState> state) = 0;
+ bssl::UniquePtr<SSL_SESSION> session,
+ TransportParameters* params,
+ std::vector<uint8_t>* application_states) = 0;
// Lookup is called once at the beginning of each TLS handshake to potentially
// provide the saved state both for the TLS handshake and for sending 0-RTT
diff --git a/quic/core/tls_client_handshaker.cc b/quic/core/tls_client_handshaker.cc
index 5148e71..b0a7d36 100644
--- a/quic/core/tls_client_handshaker.cc
+++ b/quic/core/tls_client_handshaker.cc
@@ -486,9 +486,7 @@
QUIC_DVLOG(1) << "No session cache, not inserting a session";
return;
}
- auto cache_state = std::make_unique<QuicResumptionState>();
- cache_state->tls_session = std::move(session);
- session_cache_->Insert(server_id_, std::move(cache_state));
+ session_cache_->Insert(server_id_, std::move(session), nullptr, nullptr);
}
void TlsClientHandshaker::WriteMessage(EncryptionLevel level,
diff --git a/quic/test_tools/simple_session_cache.cc b/quic/test_tools/simple_session_cache.cc
index 7787fbe..32f8436 100644
--- a/quic/test_tools/simple_session_cache.cc
+++ b/quic/test_tools/simple_session_cache.cc
@@ -3,12 +3,18 @@
// found in the LICENSE file.
#include "net/third_party/quiche/src/quic/test_tools/simple_session_cache.h"
+#include <memory>
+#include "net/third_party/quiche/src/quic/core/crypto/quic_crypto_client_config.h"
namespace quic {
namespace test {
void SimpleSessionCache::Insert(const QuicServerId& server_id,
- std::unique_ptr<QuicResumptionState> state) {
+ bssl::UniquePtr<SSL_SESSION> session,
+ TransportParameters* /*params*/,
+ std::vector<uint8_t>* /*application_states*/) {
+ auto state = std::make_unique<QuicResumptionState>();
+ state->tls_session = std::move(session);
cache_entries_.insert(std::make_pair(server_id, std::move(state)));
}
diff --git a/quic/test_tools/simple_session_cache.h b/quic/test_tools/simple_session_cache.h
index 40a6946..62dbd6f 100644
--- a/quic/test_tools/simple_session_cache.h
+++ b/quic/test_tools/simple_session_cache.h
@@ -21,7 +21,9 @@
~SimpleSessionCache() override = default;
void Insert(const QuicServerId& server_id,
- std::unique_ptr<QuicResumptionState> state) override;
+ bssl::UniquePtr<SSL_SESSION> session,
+ TransportParameters* params,
+ std::vector<uint8_t>* application_states) override;
std::unique_ptr<QuicResumptionState> Lookup(const QuicServerId& server_id,
const SSL_CTX* ctx) override;