Home / Class/ QuicClientSessionCache Class — netty Architecture

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;
    }

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