@@ -2198,6 +2198,24 @@ impl Connection {
2198
2198
Ok(())
2199
2199
}
2200
2200
2201
+ /// Sets the `max_idle_timeout` transport parameter, in milliseconds.
2202
+ ///
2203
+ /// This must only be called immediately after creating a connection, that
2204
+ /// is, before any packet is sent or received. Otherwise Error::Done is
2205
+ /// returned.
2206
+ ///
2207
+ /// The default value is infinite, that is, no timeout is used unless
2208
+ /// already configured when creating the connection.
2209
+ pub fn set_max_idle_timeout(&mut self, v: u64) -> Result<()> {
2210
+ if self.is_established() || self.is_in_early_data() {
2211
+ return Err(Error::Done);
2212
+ }
2213
+
2214
+ self.local_transport_params.max_idle_timeout = v;
2215
+
2216
+ self.encode_transport_params()
2217
+ }
2218
+
2201
2219
/// Processes QUIC packets received from the peer.
2202
2220
///
2203
2221
/// On success the number of bytes processed from the input buffer is
@@ -9228,6 +9246,48 @@ mod tests {
9228
9246
);
9229
9247
}
9230
9248
9249
+ #[test]
9250
+ fn change_idle_timeout() {
9251
+ let mut config = Config::new(0x1).unwrap();
9252
+ config
9253
+ .set_application_protos(&[b"proto1", b"proto2"])
9254
+ .unwrap();
9255
+ config.set_max_idle_timeout(999999);
9256
+ config.verify_peer(false);
9257
+
9258
+ let mut pipe = testing::Pipe::with_client_config(&mut config).unwrap();
9259
+ assert_eq!(pipe.client.local_transport_params.max_idle_timeout, 999999);
9260
+ assert_eq!(pipe.client.peer_transport_params.max_idle_timeout, 0);
9261
+ assert_eq!(pipe.server.local_transport_params.max_idle_timeout, 0);
9262
+ assert_eq!(pipe.server.peer_transport_params.max_idle_timeout, 0);
9263
+
9264
+ pipe.client.set_max_idle_timeout(456).unwrap();
9265
+ pipe.server.set_max_idle_timeout(234).unwrap();
9266
+ assert_eq!(pipe.client.local_transport_params.max_idle_timeout, 456000);
9267
+ assert_eq!(pipe.client.peer_transport_params.max_idle_timeout, 0);
9268
+ assert_eq!(pipe.server.local_transport_params.max_idle_timeout, 234000);
9269
+ assert_eq!(pipe.server.peer_transport_params.max_idle_timeout, 0);
9270
+
9271
+ assert_eq!(pipe.handshake(), Ok(()));
9272
+
9273
+ // Attempting to change after handshake is a no-op
9274
+ assert_eq!(pipe.client.set_max_idle_timeout(789), Err(Error::Done));
9275
+ assert_eq!(pipe.server.set_max_idle_timeout(345), Err(Error::Done));
9276
+ assert_eq!(pipe.client.local_transport_params.max_idle_timeout, 456000);
9277
+ assert_eq!(pipe.client.peer_transport_params.max_idle_timeout, 234000);
9278
+ assert_eq!(pipe.server.local_transport_params.max_idle_timeout, 234000);
9279
+ assert_eq!(pipe.server.peer_transport_params.max_idle_timeout, 456000);
9280
+
9281
+ assert_eq!(
9282
+ pipe.client.idle_timeout(),
9283
+ Some(time::Duration::from_millis(234000))
9284
+ );
9285
+ assert_eq!(
9286
+ pipe.server.idle_timeout(),
9287
+ Some(time::Duration::from_millis(234000))
9288
+ );
9289
+ }
9290
+
9231
9291
#[test]
9232
9292
fn handshake() {
9233
9293
let mut pipe = testing::Pipe::new().unwrap();
0 commit comments