From cfd5cf3c68b0c6dfceb2874b5a41798a3f545fb6 Mon Sep 17 00:00:00 2001 From: Jonathan Reem Date: Wed, 10 Sep 2014 12:13:18 -0700 Subject: [PATCH] Split Server::listen into two methods to hack around ICE related to default type params Trying to default the type parameters leads to an ICE and strange type errors. I think this is just due to the experimental state of default type params and this change can be rolled back when they are fixed. --- benches/client.rs | 11 +++++------ benches/server.rs | 4 ++-- examples/concurrent-server.rs | 2 +- src/server/mod.rs | 16 ++++++++++++---- 4 files changed, 20 insertions(+), 13 deletions(-) diff --git a/benches/client.rs b/benches/client.rs index af7aef47..805b3daa 100644 --- a/benches/client.rs +++ b/benches/client.rs @@ -8,9 +8,8 @@ extern crate test; use std::fmt::{mod, Show}; use std::io::net::ip::Ipv4Addr; use hyper::server::{Incoming, Server}; -use hyper::net::HttpAcceptor; -fn listen() -> hyper::server::Listening { +fn listen() -> hyper::server::Listening { let server = Server::http(Ipv4Addr(127, 0, 0, 1), 0); server.listen(handle).unwrap() } @@ -70,11 +69,11 @@ fn bench_hyper(b: &mut test::Bencher) { let mut req = hyper::get(hyper::Url::parse(url).unwrap()).unwrap(); req.headers.set(Foo); - req - .send().unwrap() - .read_to_string().unwrap() + req + .send().unwrap() + .read_to_string().unwrap() }); - listening.close().unwrap() +listening.close().unwrap() } #[bench] diff --git a/benches/server.rs b/benches/server.rs index de9c3e8f..d3ce62f4 100644 --- a/benches/server.rs +++ b/benches/server.rs @@ -28,9 +28,9 @@ fn hyper_handle(mut incoming: hyper::server::Incoming) { #[bench] fn bench_hyper(b: &mut Bencher) { let server = hyper::Server::http(Ipv4Addr(127, 0, 0, 1), 0); - let listener = server.listen(hyper_handle).unwrap(); + let mut listener = server.listen(hyper_handle).unwrap(); - let url = hyper::Url::parse(format!("http://{}", listener.socket_addr).as_slice()).unwrap(); + let url = hyper::Url::parse(format!("http://{}", listener.sockets[0]).as_slice()).unwrap(); b.iter(|| request(url.clone())); listener.close().unwrap(); } diff --git a/examples/concurrent-server.rs b/examples/concurrent-server.rs index 740312fb..3fe9f40a 100644 --- a/examples/concurrent-server.rs +++ b/examples/concurrent-server.rs @@ -19,7 +19,7 @@ trait ConcurrentHandler: Send + Sync { struct Concurrent { handler: Arc } impl Handler for Concurrent { - fn handle(self, mut incoming: Incoming) { + fn handle(self, mut incoming: Incoming) { for (mut req, mut res) in incoming { let clone = self.handler.clone(); spawn(proc() { clone.handle(req, res) }) diff --git a/src/server/mod.rs b/src/server/mod.rs index b061a12d..d0c92a45 100644 --- a/src/server/mod.rs +++ b/src/server/mod.rs @@ -46,11 +46,14 @@ impl Server { impl, S: NetworkStream, A: NetworkAcceptor> Server { /// Binds to a socket, and starts handling connections. - pub fn listen(self, handler: H) -> HttpResult> - where S: NetworkStream, + /// + /// This method has unbound type parameters, so can be used when you want to use + /// something other than the provided HttpStream, HttpAcceptor, and HttpListener. + pub fn listen_network(self, handler: H) -> HttpResult> + where H: Handler, + S: NetworkStream, A: NetworkAcceptor, - H: Handler, - L: NetworkListener { + L: NetworkListener, { let mut acceptors = Vec::new(); let mut sockets = Vec::new(); for (ip, port) in self.pairs.move_iter() { @@ -76,6 +79,11 @@ impl, S: NetworkStream, A: NetworkAcceptor> Server>(self, handler: H) -> HttpResult> { + self.listen_network::(handler) + } } /// An iterator over incoming connections, represented as pairs of