feat(server): allow consumer to supply an SslContext

Closes #471
This commit is contained in:
Mike Dilger
2015-04-26 21:10:43 +12:00
parent fef04d282f
commit 3a1a24270d

View File

@@ -26,6 +26,7 @@ use std::path::Path;
use std::thread::{self, JoinHandle}; use std::thread::{self, JoinHandle};
use num_cpus; use num_cpus;
use openssl::ssl::SslContext;
pub use self::request::Request; pub use self::request::Request;
pub use self::response::Response; pub use self::response::Response;
@@ -50,6 +51,12 @@ pub mod response;
mod listener; mod listener;
#[derive(Debug)]
enum SslConfig<'a> {
CertAndKey(&'a Path, &'a Path),
Context(SslContext),
}
/// A server can listen on a TCP socket. /// A server can listen on a TCP socket.
/// ///
/// Once listening, it will create a `Request`/`Response` pair for each /// Once listening, it will create a `Request`/`Response` pair for each
@@ -57,7 +64,7 @@ mod listener;
#[derive(Debug)] #[derive(Debug)]
pub struct Server<'a, H: Handler, L = HttpListener> { pub struct Server<'a, H: Handler, L = HttpListener> {
handler: H, handler: H,
ssl: Option<(&'a Path, &'a Path)>, ssl: Option<SslConfig<'a>>,
_marker: PhantomData<L> _marker: PhantomData<L>
} }
@@ -90,7 +97,15 @@ impl<'a, H: Handler + 'static> Server<'a, H, HttpListener> {
pub fn https(handler: H, cert: &'a Path, key: &'a Path) -> Server<'a, H, HttpListener> { pub fn https(handler: H, cert: &'a Path, key: &'a Path) -> Server<'a, H, HttpListener> {
Server { Server {
handler: handler, handler: handler,
ssl: Some((cert, key)), ssl: Some(SslConfig::CertAndKey(cert, key)),
_marker: PhantomData
}
}
/// Creates a new server that will handler `HttpStreams`s using a TLS connection defined by an SslContext.
pub fn https_with_context(handler: H, ssl_context: SslContext) -> Server<'a, H, HttpListener> {
Server {
handler: handler,
ssl: Some(SslConfig::Context(ssl_context)),
_marker: PhantomData _marker: PhantomData
} }
} }
@@ -100,7 +115,8 @@ impl<'a, H: Handler + 'static> Server<'a, H, HttpListener> {
/// Binds to a socket, and starts handling connections using a task pool. /// Binds to a socket, and starts handling connections using a task pool.
pub fn listen_threads<T: ToSocketAddrs>(self, addr: T, threads: usize) -> HttpResult<Listening> { pub fn listen_threads<T: ToSocketAddrs>(self, addr: T, threads: usize) -> HttpResult<Listening> {
let listener = try!(match self.ssl { let listener = try!(match self.ssl {
Some((cert, key)) => HttpListener::https(addr, cert, key), Some(SslConfig::CertAndKey(cert, key)) => HttpListener::https(addr, cert, key),
Some(SslConfig::Context(ssl_context)) => HttpListener::https_with_context(addr, ssl_context),
None => HttpListener::http(addr) None => HttpListener::http(addr)
}); });
with_listener(self.handler, listener, threads) with_listener(self.handler, listener, threads)