Slightly better error handling
This commit is contained in:
parent
83d702df2b
commit
eea07ef137
|
|
@ -1,4 +1 @@
|
||||||
/.rust/
|
/lib
|
||||||
/bin/
|
|
||||||
/build/
|
|
||||||
/lib/
|
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@ before_install:
|
||||||
install:
|
install:
|
||||||
- sudo apt-get install rust-nightly
|
- sudo apt-get install rust-nightly
|
||||||
before_script:
|
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:
|
script:
|
||||||
- rustc --test lib.rs
|
- rustc --test lib.rs
|
||||||
- ./lib
|
- ./lib
|
||||||
|
|
|
||||||
24
error.rs
24
error.rs
|
|
@ -6,14 +6,34 @@ use super::ffi;
|
||||||
pub enum SslError {
|
pub enum SslError {
|
||||||
StreamEof,
|
StreamEof,
|
||||||
SslSessionClosed,
|
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 {
|
impl SslError {
|
||||||
pub fn get() -> Option<SslError> {
|
pub fn get() -> Option<SslError> {
|
||||||
match unsafe { ffi::ERR_get_error() } {
|
match unsafe { ffi::ERR_get_error() } {
|
||||||
0 => None,
|
0 => None,
|
||||||
err => Some(UnknownError(err))
|
err => Some(UnknownError {
|
||||||
|
library: get_lib(err),
|
||||||
|
function: get_func(err),
|
||||||
|
reason: get_reason(err)
|
||||||
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
2
lib.rs
2
lib.rs
|
|
@ -1,3 +1,5 @@
|
||||||
|
#[feature(struct_variant)];
|
||||||
|
|
||||||
use std::cast;
|
use std::cast;
|
||||||
use std::libc::{c_int, c_void};
|
use std::libc::{c_int, c_void};
|
||||||
use std::ptr;
|
use std::ptr;
|
||||||
|
|
|
||||||
15
tests.rs
15
tests.rs
|
|
@ -32,7 +32,10 @@ fn test_verify_trusted() {
|
||||||
let stream = TcpStream::connect(FromStr::from_str("127.0.0.1:15418").unwrap()).unwrap();
|
let stream = TcpStream::connect(FromStr::from_str("127.0.0.1:15418").unwrap()).unwrap();
|
||||||
let mut ctx = SslContext::new(Sslv23);
|
let mut ctx = SslContext::new(Sslv23);
|
||||||
ctx.set_verify(SslVerifyPeer, None);
|
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) {
|
match SslStream::try_new(&ctx, stream) {
|
||||||
Ok(_) => (),
|
Ok(_) => (),
|
||||||
Err(err) => fail!("Expected success, got {:?}", err)
|
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 stream = TcpStream::connect(FromStr::from_str("127.0.0.1:15418").unwrap()).unwrap();
|
||||||
let mut ctx = SslContext::new(Sslv23);
|
let mut ctx = SslContext::new(Sslv23);
|
||||||
ctx.set_verify(SslVerifyPeer, Some(callback));
|
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) {
|
match SslStream::try_new(&ctx, stream) {
|
||||||
Ok(_) => (),
|
Ok(_) => (),
|
||||||
Err(err) => fail!("Expected success, got {:?}", err)
|
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 stream = TcpStream::connect(FromStr::from_str("127.0.0.1:15418").unwrap()).unwrap();
|
||||||
let mut ctx = SslContext::new(Sslv23);
|
let mut ctx = SslContext::new(Sslv23);
|
||||||
ctx.set_verify(SslVerifyPeer, Some(callback));
|
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());
|
assert!(SslStream::try_new(&ctx, stream).is_err());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue