aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/client.rs22
-rw-r--r--src/lib.rs14
2 files changed, 27 insertions, 9 deletions
diff --git a/src/client.rs b/src/client.rs
index a738262..a688565 100644
--- a/src/client.rs
+++ b/src/client.rs
@@ -20,7 +20,7 @@ use openssl::ssl::{ SslContext, SslMethod, SslStream };
enum StreamKind {
Plain(TcpStream),
#[cfg(feature = "ssl")]
- Ssl(SslStream)
+ Ssl(SslStream<TcpStream>)
}
impl Write for StreamKind {
@@ -82,18 +82,24 @@ impl Client {
#[cfg(feature = "ssl")]
pub fn connect_ssl(&mut self, host: String, port: u16) -> Result<()> {
- let mut s = self.stream.lock();
+ let s = &mut self.stream;
match *s { Some(_) => return Err(IrscError::AlreadyConnected), _ => () };
let tcp_stream = match TcpStream::connect((host.as_ref(), port)) {
Ok(tcp) => Some(tcp),
Err(e) => return Err(IrscError::Io(e))
};
- let ssl = SslContext::new(SslMethod::Tlsv1);
- let ssl_stream = SslStream::new(&ssl, tcp_stream);
- *s = ssl_stream;
+ let ssl = try!(SslContext::new(SslMethod::Tlsv1));
+ match tcp_stream.map(|tcp| SslStream::new(&ssl, tcp)) {
+ Some(Ok(ssl_stream)) => { *s = Some(StreamKind::Ssl(ssl_stream)); Ok(()) },
+ Some(Err(ssl_error)) => Err(IrscError::Ssl(ssl_error)),
+ None => Err(IrscError::NotConnected)
+ }
+ }
- Ok(())
+ #[cfg(not(feature = "ssl"))]
+ pub fn connect_ssl(&mut self, _host: String, _port: u16) -> Result<()> {
+ panic!("Not compiled with ssl feature.")
}
#[inline]
@@ -121,9 +127,9 @@ impl Client {
pub fn listen<F>(&mut self, events: F) -> Result<()>
where F: Fn(&mut Client, &Message) {
let reader = BufReader::new(match self.stream {
- Some(StreamKind::Plain(ref s)) => (*s).try_clone().unwrap(),
+ Some(StreamKind::Plain(ref s)) => StreamKind::Plain((*s).try_clone().unwrap()),
#[cfg(feature = "ssl")]
- Some(StreamKind::Ssl(ref s)) => (*s).try_clone().unwrap(),
+ Some(StreamKind::Ssl(ref s)) => StreamKind::Ssl((*s).try_clone().unwrap()),
None => return Err(IrscError::NotConnected)
});
diff --git a/src/lib.rs b/src/lib.rs
index a4da317..6ec60db 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -7,6 +7,8 @@
extern crate regex;
#[macro_use]
extern crate log;
+#[cfg(feature = "ssl")]
+extern crate openssl;
pub mod client;
pub mod color;
@@ -19,6 +21,9 @@ pub mod reply;
use std::io;
use std::result;
+#[cfg(feature = "ssl")]
+use openssl::ssl::error::SslError;
+
pub use ident::Ident;
pub use message::{ Message, MsgType };
pub use command::Command;
@@ -29,7 +34,14 @@ pub enum IrscError {
Io(io::Error),
AlreadyConnected,
NotConnected,
- NotFound
+ NotFound,
+ #[cfg(feature = "ssl")]
+ Ssl(SslError)
+}
+
+#[cfg(feature = "ssl")]
+impl From<SslError> for IrscError {
+ fn from(e: SslError) -> IrscError { IrscError::Ssl(e) }
}
pub type Result<T> = result::Result<T, IrscError>;