fix(http): stackoverflow in Conn::ready

I've had a couple of instances during stress testing now where
Conn::ready would overflow its stack due to recursing on itself. This
moves subsequent calls to ready() into a loop outside the function.
This commit is contained in:
Joe Wilm
2016-10-06 17:23:18 -07:00
parent 8672ec5a36
commit c32d0e9adf
4 changed files with 58 additions and 20 deletions

View File

@@ -14,7 +14,7 @@ use rotor::{self, Scope};
pub use self::request::Request;
pub use self::response::Response;
use http::{self, Next};
use http::{self, Next, ReadyResult};
pub use net::{Accept, HttpListener, HttpsListener};
use net::{SslServer, Transport};
@@ -248,13 +248,21 @@ where A: Accept,
}
},
ServerFsm::Conn(conn) => {
match conn.ready(events, scope) {
Some((conn, None)) => rotor::Response::ok(ServerFsm::Conn(conn)),
Some((conn, Some(dur))) => {
rotor::Response::ok(ServerFsm::Conn(conn))
.deadline(scope.now() + dur)
let mut conn = Some(conn);
loop {
match conn.take().unwrap().ready(events, scope) {
ReadyResult::Continue(c) => conn = Some(c),
ReadyResult::Done(res) => {
return match res {
Some((conn, None)) => rotor::Response::ok(ServerFsm::Conn(conn)),
Some((conn, Some(dur))) => {
rotor::Response::ok(ServerFsm::Conn(conn))
.deadline(scope.now() + dur)
}
None => rotor::Response::done()
};
}
}
None => rotor::Response::done()
}
}
}