fix(server): reschedule keep alive interval timer once a pong is received

`KeepAliveState` did not transition from `PingSent` to `Scheduled` after
a pong was received. This prevented more than one ping to be sent by the
server. This fix checks if `ping_sent_at` has already been cleared by
`Ponger::poll` when `KeepAliveState::PingSent` state is active.

Fixes #2310
This commit is contained in:
Pedro Calado
2020-10-29 14:20:38 +00:00
committed by Sean McArthur
parent f288641792
commit 2a938d96ae

View File

@@ -442,7 +442,16 @@ impl KeepAlive {
let interval = shared.last_read_at() + self.interval;
self.timer.reset(interval);
}
KeepAliveState::Scheduled | KeepAliveState::PingSent => (),
KeepAliveState::PingSent => {
if shared.is_ping_sent() {
return;
}
self.state = KeepAliveState::Scheduled;
let interval = shared.last_read_at() + self.interval;
self.timer.reset(interval);
}
KeepAliveState::Scheduled => (),
}
}