in core/sdk/src/quic/client.rs [474:533]
fn configure(config: &QuicClientConfig) -> Result<ClientConfig, IggyError> {
let max_concurrent_bidi_streams = VarInt::try_from(config.max_concurrent_bidi_streams);
if max_concurrent_bidi_streams.is_err() {
error!(
"Invalid 'max_concurrent_bidi_streams': {}",
config.max_concurrent_bidi_streams
);
return Err(IggyError::InvalidConfiguration);
}
let receive_window = VarInt::try_from(config.receive_window);
if receive_window.is_err() {
error!("Invalid 'receive_window': {}", config.receive_window);
return Err(IggyError::InvalidConfiguration);
}
let mut transport = quinn::TransportConfig::default();
transport.initial_mtu(config.initial_mtu);
transport.send_window(config.send_window);
transport.receive_window(receive_window.unwrap());
transport.datagram_send_buffer_size(config.datagram_send_buffer_size as usize);
transport.max_concurrent_bidi_streams(max_concurrent_bidi_streams.unwrap());
if config.keep_alive_interval > 0 {
transport.keep_alive_interval(Some(Duration::from_millis(config.keep_alive_interval)));
}
if config.max_idle_timeout > 0 {
let max_idle_timeout =
IdleTimeout::try_from(Duration::from_millis(config.max_idle_timeout));
if max_idle_timeout.is_err() {
error!("Invalid 'max_idle_timeout': {}", config.max_idle_timeout);
return Err(IggyError::InvalidConfiguration);
}
transport.max_idle_timeout(Some(max_idle_timeout.unwrap()));
}
if CryptoProvider::get_default().is_none() {
if let Err(e) = rustls::crypto::ring::default_provider().install_default() {
warn!("Failed to install rustls crypto provider. Error: {:?}. This may be normal if another thread installed it first.", e);
}
}
let mut client_config = match config.validate_certificate {
true => ClientConfig::with_platform_verifier(),
false => {
match QuinnQuicClientConfig::try_from(
rustls::ClientConfig::builder()
.dangerous()
.with_custom_certificate_verifier(SkipServerVerification::new())
.with_no_client_auth(),
) {
Ok(config) => ClientConfig::new(Arc::new(config)),
Err(error) => {
error!("Failed to create QUIC client configuration: {error}");
return Err(IggyError::InvalidConfiguration);
}
}
}
};
client_config.transport_config(Arc::new(transport));
Ok(client_config)
}