Slightly better error handling

This commit is contained in:
Steven Fackler 2013-10-23 21:10:38 -07:00
parent 83d702df2b
commit eea07ef137
5 changed files with 38 additions and 10 deletions

5
.gitignore vendored
View File

@ -1,4 +1 @@
/.rust/
/bin/
/build/
/lib/
/lib

View File

@ -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

View File

@ -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)
})
}
}
}

2
lib.rs
View File

@ -1,3 +1,5 @@
#[feature(struct_variant)];
use std::cast;
use std::libc::{c_int, c_void};
use std::ptr;

View File

@ -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());
}