diff options
| author | Steven Fackler <[email protected]> | 2013-10-23 21:10:38 -0700 |
|---|---|---|
| committer | Steven Fackler <[email protected]> | 2013-10-23 21:12:29 -0700 |
| commit | eea07ef137992c80ab80e17f28d71abf04ef9079 (patch) | |
| tree | 3427c8b8524e4d759532c2834dcbe04a116c5134 | |
| parent | Remove Sslv2 option (diff) | |
| download | rust-openssl-eea07ef137992c80ab80e17f28d71abf04ef9079.tar.xz rust-openssl-eea07ef137992c80ab80e17f28d71abf04ef9079.zip | |
Slightly better error handling
| -rw-r--r-- | .gitignore | 5 | ||||
| -rw-r--r-- | .travis.yml | 2 | ||||
| -rw-r--r-- | error.rs | 24 | ||||
| -rw-r--r-- | lib.rs | 2 | ||||
| -rw-r--r-- | tests.rs | 15 |
5 files changed, 38 insertions, 10 deletions
@@ -1,4 +1 @@ -/.rust/ -/bin/ -/build/ -/lib/ +/lib diff --git a/.travis.yml b/.travis.yml index 2fb7b213..55c9e432 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,7 +4,7 @@ before_install: install: - sudo apt-get install rust-nightly before_script: - - openssl s_server -accept 15418 -www -cert test/cert.pem -key test/key.pem & + - openssl s_server -accept 15418 -www -cert test/cert.pem -key test/key.pem >/dev/null & script: - rustc --test lib.rs - ./lib @@ -6,14 +6,34 @@ use super::ffi; pub enum SslError { StreamEof, SslSessionClosed, - UnknownError(c_ulong) + UnknownError { + library: u8, + function: u16, + reason: u16 + } +} + +fn get_lib(err: c_ulong) -> u8 { + ((err >> 24) & 0xff) as u8 +} + +fn get_func(err: c_ulong) -> u16 { + ((err >> 12) & 0xfff) as u16 +} + +fn get_reason(err: c_ulong) -> u16 { + (err & 0xfff) as u16 } impl SslError { pub fn get() -> Option<SslError> { match unsafe { ffi::ERR_get_error() } { 0 => None, - err => Some(UnknownError(err)) + err => Some(UnknownError { + library: get_lib(err), + function: get_func(err), + reason: get_reason(err) + }) } } } @@ -1,3 +1,5 @@ +#[feature(struct_variant)]; + use std::cast; use std::libc::{c_int, c_void}; use std::ptr; @@ -32,7 +32,10 @@ fn test_verify_trusted() { let stream = TcpStream::connect(FromStr::from_str("127.0.0.1:15418").unwrap()).unwrap(); let mut ctx = SslContext::new(Sslv23); ctx.set_verify(SslVerifyPeer, None); - assert!(ctx.set_CA_file("test/cert.pem").is_none()); + match ctx.set_CA_file("test/cert.pem") { + None => {} + Some(err) => fail!("Unexpected error {:?}", err) + } match SslStream::try_new(&ctx, stream) { Ok(_) => (), Err(err) => fail!("Expected success, got {:?}", err) @@ -72,7 +75,10 @@ fn test_verify_trusted_callback_override_ok() { let stream = TcpStream::connect(FromStr::from_str("127.0.0.1:15418").unwrap()).unwrap(); let mut ctx = SslContext::new(Sslv23); ctx.set_verify(SslVerifyPeer, Some(callback)); - assert!(ctx.set_CA_file("test/cert.pem").is_none()); + match ctx.set_CA_file("test/cert.pem") { + None => {} + Some(err) => fail!("Unexpected error {:?}", err) + } match SslStream::try_new(&ctx, stream) { Ok(_) => (), Err(err) => fail!("Expected success, got {:?}", err) @@ -87,7 +93,10 @@ fn test_verify_trusted_callback_override_bad() { let stream = TcpStream::connect(FromStr::from_str("127.0.0.1:15418").unwrap()).unwrap(); let mut ctx = SslContext::new(Sslv23); ctx.set_verify(SslVerifyPeer, Some(callback)); - assert!(ctx.set_CA_file("test/cert.pem").is_none()); + match ctx.set_CA_file("test/cert.pem") { + None => {} + Some(err) => fail!("Unexpected error {:?}", err) + } assert!(SslStream::try_new(&ctx, stream).is_err()); } |