QuicClientSessionCache Class — netty Architecture
Architecture documentation for the QuicClientSessionCache class in QuicClientSessionCache.java from the netty codebase.
Entity Profile
Dependency Diagram
graph TD 5d182568_b440_b59f_55b6_3e43b2f435b4["QuicClientSessionCache"] fe0b2fa3_d404_54d8_3cec_bb7bbf163445["QuicClientSessionCache.java"] 5d182568_b440_b59f_55b6_3e43b2f435b4 -->|defined in| fe0b2fa3_d404_54d8_3cec_bb7bbf163445 ba7e5416_0084_c6b3_614e_77129ef7aa52["saveSession()"] 5d182568_b440_b59f_55b6_3e43b2f435b4 -->|method| ba7e5416_0084_c6b3_614e_77129ef7aa52 f45c4641_41c8_f493_635d_5fe4d48bddfe["hasSession()"] 5d182568_b440_b59f_55b6_3e43b2f435b4 -->|method| f45c4641_41c8_f493_635d_5fe4d48bddfe 631b83c3_487b_35d7_f613_9447cbf4482a["getSession()"] 5d182568_b440_b59f_55b6_3e43b2f435b4 -->|method| 631b83c3_487b_35d7_f613_9447cbf4482a 6c24e0c9_90ec_25d0_a52e_b750bddd627c["removeSession()"] 5d182568_b440_b59f_55b6_3e43b2f435b4 -->|method| 6c24e0c9_90ec_25d0_a52e_b750bddd627c ca5c31da_c273_9596_a1f4_835b91fff679["setSessionTimeout()"] 5d182568_b440_b59f_55b6_3e43b2f435b4 -->|method| ca5c31da_c273_9596_a1f4_835b91fff679 87d04ba7_c21b_aa0d_e099_4bbb9ce82098["getSessionTimeout()"] 5d182568_b440_b59f_55b6_3e43b2f435b4 -->|method| 87d04ba7_c21b_aa0d_e099_4bbb9ce82098 e925a35a_904c_2631_36d4_744f52a795f2["setSessionCacheSize()"] 5d182568_b440_b59f_55b6_3e43b2f435b4 -->|method| e925a35a_904c_2631_36d4_744f52a795f2 cb338409_08f8_d4c2_48df_171ad3bef7b7["getSessionCacheSize()"] 5d182568_b440_b59f_55b6_3e43b2f435b4 -->|method| cb338409_08f8_d4c2_48df_171ad3bef7b7 0fc68975_1276_a6ff_e379_efba77780526["clear()"] 5d182568_b440_b59f_55b6_3e43b2f435b4 -->|method| 0fc68975_1276_a6ff_e379_efba77780526 40aee01c_40f0_656b_4271_003bc6cf9723["expungeInvalidSessions()"] 5d182568_b440_b59f_55b6_3e43b2f435b4 -->|method| 40aee01c_40f0_656b_4271_003bc6cf9723 702745ac_e32b_b963_b962_5af878febaad["HostPort()"] 5d182568_b440_b59f_55b6_3e43b2f435b4 -->|method| 702745ac_e32b_b963_b962_5af878febaad
Relationship Graph
Source Code
codec-classes-quic/src/main/java/io/netty/handler/codec/quic/QuicClientSessionCache.java lines 27–246
final class QuicClientSessionCache {
private static final int DEFAULT_CACHE_SIZE;
static {
// Respect the same system property as the JDK implementation to make it easy to switch between implementations.
int cacheSize = SystemPropertyUtil.getInt("javax.net.ssl.sessionCacheSize", 20480);
if (cacheSize >= 0) {
DEFAULT_CACHE_SIZE = cacheSize;
} else {
DEFAULT_CACHE_SIZE = 20480;
}
}
private final AtomicInteger maximumCacheSize = new AtomicInteger(DEFAULT_CACHE_SIZE);
// Let's use the same default value as OpenSSL does.
// See https://www.openssl.org/docs/man1.1.1/man3/SSL_get_default_timeout.html
private final AtomicInteger sessionTimeout = new AtomicInteger(300);
private int sessionCounter;
private final Map<HostPort, SessionHolder> sessions =
new LinkedHashMap<HostPort, SessionHolder>() {
private static final long serialVersionUID = -7773696788135734448L;
@Override
protected boolean removeEldestEntry(Map.Entry<HostPort, SessionHolder> eldest) {
int maxSize = maximumCacheSize.get();
return maxSize >= 0 && size() > maxSize;
}
};
void saveSession(@Nullable String host, int port, long creationTime, long timeout, byte[] session,
boolean isSingleUse) {
HostPort hostPort = keyFor(host, port);
if (hostPort != null) {
synchronized (sessions) {
// Mimic what OpenSSL is doing and expunge every 255 new sessions
// See https://www.openssl.org/docs/man1.0.2/man3/SSL_CTX_flush_sessions.html
if (++sessionCounter == 255) {
sessionCounter = 0;
expungeInvalidSessions();
}
sessions.put(hostPort, new SessionHolder(creationTime, timeout, session, isSingleUse));
}
}
}
// Only used for testing.
boolean hasSession(@Nullable String host, int port) {
HostPort hostPort = keyFor(host, port);
if (hostPort != null) {
synchronized (sessions) {
return sessions.containsKey(hostPort);
}
}
return false;
}
byte @Nullable [] getSession(@Nullable String host, int port) {
HostPort hostPort = keyFor(host, port);
if (hostPort != null) {
SessionHolder sessionHolder;
synchronized (sessions) {
sessionHolder = sessions.get(hostPort);
if (sessionHolder == null) {
return null;
}
if (sessionHolder.isSingleUse()) {
// Remove session as it should only be re-used once.
sessions.remove(hostPort);
}
}
if (sessionHolder.isValid()) {
return sessionHolder.sessionBytes();
}
}
return null;
}
Source
Frequently Asked Questions
What is the QuicClientSessionCache class?
QuicClientSessionCache is a class in the netty codebase, defined in codec-classes-quic/src/main/java/io/netty/handler/codec/quic/QuicClientSessionCache.java.
Where is QuicClientSessionCache defined?
QuicClientSessionCache is defined in codec-classes-quic/src/main/java/io/netty/handler/codec/quic/QuicClientSessionCache.java at line 27.
Analyze Your Own Codebase
Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.
Try Supermodel Free