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,25 +64,27 @@ impl TlsServer {
}
}
fn accept(&mut self, registry: &mio::Registry) -> bool {
match self.server.accept() {
Ok((socket, addr)) => {
debug!("Accepting new connection from {:?}", addr);
fn accept(&mut self, registry: &mio::Registry) -> Result<(), io::Error> {
loop {
match self.server.accept() {
Ok((socket, addr)) => {
debug!("Accepting new connection from {:?}", addr);
let tls_session = rustls::ServerSession::new(&self.tls_config);
let mode = self.mode.clone();
let tls_session = rustls::ServerSession::new(&self.tls_config);
let mode = self.mode.clone();
let token = mio::Token(self.next_id);
self.next_id += 1;
let token = mio::Token(self.next_id);
self.next_id += 1;
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
let mut connection = Connection::new(socket, token, mode, tls_session);
connection.register(registry);
self.connections.insert(token, connection);
}
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)
}