Fix tlsserver on Windows

mio 0.6 allowed selection of level- or edge-triggered events.  mio 0.7 removed
that, and on Windows events on server sockets are genuinely edge-triggered:
coalescing multiple incoming sockets into one event.  Therefore, accept
sockets until we can't accept any more.
This commit is contained in:
Joseph Birr-Pixton 2020-05-10 15:06:10 +01:00
parent ab9dc83d9b
commit 616392f4d8
1 changed files with 20 additions and 19 deletions

View File

@ -64,7 +64,8 @@ impl TlsServer {
}
}
fn accept(&mut self, registry: &mio::Registry) -> bool {
fn accept(&mut self, registry: &mio::Registry) -> Result<(), io::Error> {
loop {
match self.server.accept() {
Ok((socket, addr)) => {
debug!("Accepting new connection from {:?}", addr);
@ -78,11 +79,12 @@ impl TlsServer {
let mut connection = Connection::new(socket, token, mode, tls_session);
connection.register(registry);
self.connections.insert(token, connection);
true
}
Err(e) => {
println!("encountered error while accepting connection; err={:?}", e);
false
Err(ref err) if err.kind() == io::ErrorKind::WouldBlock => return Ok(()),
Err(err) => {
println!("encountered error while accepting connection; err={:?}", err);
return Err(err);
}
}
}
}
@ -635,9 +637,8 @@ fn main() {
for event in events.iter() {
match event.token() {
LISTENER => {
if !tlsserv.accept(poll.registry()) {
break;
}
tlsserv.accept(poll.registry())
.expect("error accepting socket");
}
_ => tlsserv.conn_event(poll.registry(), &event)
}