Skip to content

Commit

Permalink
feat: provide an option to defer an idle timeout
Browse files Browse the repository at this point in the history
  • Loading branch information
huster-zhangpeng committed Jan 1, 2025
1 parent 7942109 commit ab653e7
Show file tree
Hide file tree
Showing 2 changed files with 57 additions and 0 deletions.
29 changes: 29 additions & 0 deletions gm-quic/src/client.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ use std::{
io::{self},
net::{IpAddr, Ipv4Addr, Ipv6Addr, SocketAddr, ToSocketAddrs},
sync::Arc,
time::Duration,
};

use qbase::{
Expand Down Expand Up @@ -29,9 +30,13 @@ pub struct QuicClient {
bind_addresseses: Vec<SocketAddr>,
reuse_udp_sockets: bool,
_reuse_connection: bool, // TODO
// TODO: 好像得创建2个quic连接,一个用ipv4,一个用ipv6
// 然后看谁先收到服务器的响应比较好
_enable_happy_eyepballs: bool,
_prefer_versions: Vec<u32>,
_defer_idle_timeout: Duration,
parameters: ClientParameters,
// TODO: 要改成一个加载上次连接的parameters的函数,根据server name
remembered: Option<CommonParameters>,
tls_config: Arc<TlsClientConfig>,
streams_controller: Box<dyn Fn(u64, u64) -> Box<dyn ControlConcurrency> + Send + Sync>,
Expand Down Expand Up @@ -66,6 +71,7 @@ impl QuicClient {
reuse_connection: true,
enable_happy_eyepballs: false,
prefer_versions: vec![1],
defer_idle_timeout: Duration::ZERO,
parameters: ClientParameters::default(),
tls_config: TlsClientConfig::builder_with_protocol_versions(&[&rustls::version::TLS13]),
streams_controller: Box::new(|bi, uni| Box::new(ConsistentConcurrency::new(bi, uni))),
Expand All @@ -83,6 +89,7 @@ impl QuicClient {
reuse_connection: true,
enable_happy_eyepballs: false,
prefer_versions: vec![1],
defer_idle_timeout: Duration::ZERO,
parameters: ClientParameters::default(),
tls_config: TlsClientConfig::builder_with_provider(provider)
.with_protocol_versions(&[&rustls::version::TLS13])
Expand All @@ -102,6 +109,7 @@ impl QuicClient {
reuse_connection: true,
enable_happy_eyepballs: false,
prefer_versions: vec![1],
defer_idle_timeout: Duration::ZERO,
parameters: ClientParameters::default(),
tls_config,
streams_controller: Box::new(|bi, uni| Box::new(ConsistentConcurrency::new(bi, uni))),
Expand Down Expand Up @@ -250,6 +258,7 @@ pub struct QuicClientBuilder<T> {
reuse_connection: bool,
enable_happy_eyepballs: bool,
prefer_versions: Vec<u32>,
defer_idle_timeout: Duration,
parameters: ClientParameters,
tls_config: T,
streams_controller: Box<dyn Fn(u64, u64) -> Box<dyn ControlConcurrency> + Send + Sync>,
Expand Down Expand Up @@ -305,6 +314,20 @@ impl<T> QuicClientBuilder<T> {
self
}

/// Provide an option to defer an idle timeout.
///
/// This facility could be used when the application wishes to avoid losing
/// state that has been associated with an open connection but does not expect
/// to exchange application data for some time.
///
/// See [Deferring Idle Timeout](https://datatracker.ietf.org/doc/html/rfc9000#name-deferring-idle-timeout)
/// of [RFC 9000](https://datatracker.ietf.org/doc/html/rfc9000)
/// for more information.
pub fn keep_alive(mut self, duration: Duration) -> Self {
self.defer_idle_timeout = duration;
self
}

/// Specify the [transport parameters] for the client.
///
/// If you call this multiple times, only the last `parameters` will be used.
Expand Down Expand Up @@ -361,6 +384,7 @@ impl QuicClientBuilder<TlsClientConfigBuilder<WantsVerifier>> {
reuse_connection: self.reuse_connection,
enable_happy_eyepballs: self.enable_happy_eyepballs,
prefer_versions: self.prefer_versions,
defer_idle_timeout: self.defer_idle_timeout,
parameters: self.parameters,
tls_config: self.tls_config.with_root_certificates(root_store),
streams_controller: self.streams_controller,
Expand All @@ -381,6 +405,7 @@ impl QuicClientBuilder<TlsClientConfigBuilder<WantsVerifier>> {
reuse_connection: self.reuse_connection,
enable_happy_eyepballs: self.enable_happy_eyepballs,
prefer_versions: self.prefer_versions,
defer_idle_timeout: self.defer_idle_timeout,
parameters: self.parameters,
tls_config: self.tls_config.with_webpki_verifier(verifier),
streams_controller: self.streams_controller,
Expand All @@ -405,6 +430,7 @@ impl QuicClientBuilder<TlsClientConfigBuilder<WantsClientCert>> {
reuse_connection: self.reuse_connection,
enable_happy_eyepballs: self.enable_happy_eyepballs,
prefer_versions: self.prefer_versions,
defer_idle_timeout: self.defer_idle_timeout,
parameters: self.parameters,
tls_config: self
.tls_config
Expand All @@ -423,6 +449,7 @@ impl QuicClientBuilder<TlsClientConfigBuilder<WantsClientCert>> {
reuse_connection: self.reuse_connection,
enable_happy_eyepballs: self.enable_happy_eyepballs,
prefer_versions: self.prefer_versions,
defer_idle_timeout: self.defer_idle_timeout,
parameters: self.parameters,
tls_config: self.tls_config.with_no_client_auth(),
streams_controller: self.streams_controller,
Expand All @@ -441,6 +468,7 @@ impl QuicClientBuilder<TlsClientConfigBuilder<WantsClientCert>> {
reuse_connection: self.reuse_connection,
enable_happy_eyepballs: self.enable_happy_eyepballs,
prefer_versions: self.prefer_versions,
defer_idle_timeout: self.defer_idle_timeout,
parameters: self.parameters,
tls_config: self.tls_config.with_client_cert_resolver(cert_resolver),
streams_controller: self.streams_controller,
Expand Down Expand Up @@ -484,6 +512,7 @@ impl QuicClientBuilder<TlsClientConfig> {
_reuse_connection: self.reuse_connection,
_enable_happy_eyepballs: self.enable_happy_eyepballs,
_prefer_versions: self.prefer_versions,
_defer_idle_timeout: self.defer_idle_timeout,
parameters: self.parameters,
// TODO: 要能加载上次连接的parameters
remembered: None,
Expand Down
28 changes: 28 additions & 0 deletions gm-quic/src/server.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ use std::{
io::{self},
net::{SocketAddr, ToSocketAddrs},
sync::{Arc, LazyLock, RwLock, Weak},
time::Duration,
};

use dashmap::DashMap;
Expand Down Expand Up @@ -62,6 +63,7 @@ pub struct QuicServer {
passive_listening: bool,
_supported_versions: Vec<u32>,
_load_balance: Arc<dyn Fn(InitialHeader) -> Option<RetryHeader> + Send + Sync + 'static>,
_defer_idle_timeout: Duration,
parameters: ServerParameters,
tls_config: Arc<TlsServerConfig>,
streams_controller:
Expand All @@ -76,6 +78,7 @@ impl QuicServer {
passive_listening: false,
supported_versions: Vec::with_capacity(2),
load_balance: Arc::new(|_| None),
defer_idle_timeout: Duration::ZERO,
parameters: ServerParameters::default(),
tls_config: TlsServerConfig::builder_with_protocol_versions(&[&rustls::version::TLS13]),
streams_controller: Box::new(|bi, uni| Box::new(ConsistentConcurrency::new(bi, uni))),
Expand All @@ -91,6 +94,7 @@ impl QuicServer {
passive_listening: false,
supported_versions: Vec::with_capacity(2),
load_balance: Arc::new(|_| None),
defer_idle_timeout: Duration::ZERO,
parameters: ServerParameters::default(),
tls_config,
streams_controller: Box::new(|bi, uni| Box::new(ConsistentConcurrency::new(bi, uni))),
Expand All @@ -106,6 +110,7 @@ impl QuicServer {
passive_listening: false,
supported_versions: Vec::with_capacity(2),
load_balance: Arc::new(|_| None),
defer_idle_timeout: Duration::ZERO,
parameters: ServerParameters::default(),
tls_config: TlsServerConfig::builder_with_provider(provider)
.with_protocol_versions(&[&rustls::version::TLS13])
Expand Down Expand Up @@ -253,6 +258,7 @@ pub struct QuicServerBuilder<T> {
supported_versions: Vec<u32>,
passive_listening: bool,
load_balance: Arc<dyn Fn(InitialHeader) -> Option<RetryHeader> + Send + Sync + 'static>,
defer_idle_timeout: Duration,
parameters: ServerParameters,
tls_config: T,
streams_controller:
Expand All @@ -266,6 +272,7 @@ pub struct QuicServerSniBuilder<T> {
passive_listening: bool,
load_balance: Arc<dyn Fn(InitialHeader) -> Option<RetryHeader> + Send + Sync + 'static>,
hosts: Arc<DashMap<String, Host>>,
defer_idle_timeout: Duration,
parameters: ServerParameters,
tls_config: T,
streams_controller:
Expand Down Expand Up @@ -328,6 +335,20 @@ impl<T> QuicServerBuilder<T> {
self
}

/// Provide an option to defer an idle timeout.
///
/// This facility could be used when the application wishes to avoid losing
/// state that has been associated with an open connection but does not expect
/// to exchange application data for some time.
///
/// See [Deferring Idle Timeout](https://datatracker.ietf.org/doc/html/rfc9000#name-deferring-idle-timeout)
/// of [RFC 9000](https://datatracker.ietf.org/doc/html/rfc9000)
/// for more information.
pub fn keep_alive(mut self, duration: Duration) -> Self {
self.defer_idle_timeout = duration;
self
}

/// Specify the [transport parameters] for the server.
///
/// If you call this multiple times, only the last `parameters` will be used.
Expand Down Expand Up @@ -364,6 +385,7 @@ impl QuicServerBuilder<TlsServerConfigBuilder<WantsVerifier>> {
passive_listening: self.passive_listening,
supported_versions: self.supported_versions,
load_balance: self.load_balance,
defer_idle_timeout: self.defer_idle_timeout,
parameters: self.parameters,
tls_config: self
.tls_config
Expand All @@ -381,6 +403,7 @@ impl QuicServerBuilder<TlsServerConfigBuilder<WantsVerifier>> {
passive_listening: self.passive_listening,
supported_versions: self.supported_versions,
load_balance: self.load_balance,
defer_idle_timeout: self.defer_idle_timeout,
parameters: self.parameters,
tls_config: self
.tls_config
Expand All @@ -406,6 +429,7 @@ impl QuicServerBuilder<TlsServerConfigBuilder<WantsServerCert>> {
passive_listening: self.passive_listening,
supported_versions: self.supported_versions,
load_balance: self.load_balance,
defer_idle_timeout: self.defer_idle_timeout,
parameters: self.parameters,
tls_config: self
.tls_config
Expand All @@ -431,6 +455,7 @@ impl QuicServerBuilder<TlsServerConfigBuilder<WantsServerCert>> {
passive_listening: self.passive_listening,
supported_versions: self.supported_versions,
load_balance: self.load_balance,
defer_idle_timeout: self.defer_idle_timeout,
parameters: self.parameters,
tls_config: self
.tls_config
Expand All @@ -452,6 +477,7 @@ impl QuicServerBuilder<TlsServerConfigBuilder<WantsServerCert>> {
passive_listening: self.passive_listening,
supported_versions: self.supported_versions,
load_balance: self.load_balance,
defer_idle_timeout: self.defer_idle_timeout,
parameters: self.parameters,
tls_config: self
.tls_config
Expand Down Expand Up @@ -553,6 +579,7 @@ impl QuicServerBuilder<TlsServerConfig> {
listener: Default::default(),
_supported_versions: self.supported_versions,
_load_balance: self.load_balance,
_defer_idle_timeout: self.defer_idle_timeout,
parameters: self.parameters,
tls_config: Arc::new(self.tls_config),
streams_controller: self.streams_controller,
Expand Down Expand Up @@ -618,6 +645,7 @@ impl QuicServerSniBuilder<TlsServerConfig> {
listener: Default::default(),
_supported_versions: self.supported_versions,
_load_balance: self.load_balance,
_defer_idle_timeout: self.defer_idle_timeout,
parameters: self.parameters,
tls_config: Arc::new(self.tls_config),
streams_controller: self.streams_controller,
Expand Down

0 comments on commit ab653e7

Please sign in to comment.