in neqo-transport/src/connection/mod.rs [652:690]
fn create_resumption_token(&mut self, now: Instant) {
if self.role == Role::Server || self.state < State::Connected {
return;
}
qtrace!(
"[{self}] Maybe create resumption token: {} {}",
self.crypto.has_resumption_token(),
self.new_token.has_token()
);
while self.crypto.has_resumption_token() && self.new_token.has_token() {
let token = self.make_resumption_token();
self.events.client_resumption_token(token);
}
// If we have a resumption ticket check or set a timer.
if self.crypto.has_resumption_token() {
let arm = if let Some(expiration_time) = self.release_resumption_token_timer {
if expiration_time <= now {
let token = self.make_resumption_token();
self.events.client_resumption_token(token);
self.release_resumption_token_timer = None;
// This means that we release one session ticket every 3 PTOs
// if no NEW_TOKEN frame is received.
self.crypto.has_resumption_token()
} else {
false
}
} else {
true
};
if arm {
self.release_resumption_token_timer = Some(now + 3 * self.pto());
}
}
}