Commit eea07ef1 authored by Steven Fackler's avatar Steven Fackler
Browse files

Slightly better error handling

parent 83d702df
Loading
Loading
Loading
Loading
+1 −4
Original line number Diff line number Diff line
/.rust/
/bin/
/build/
/lib/
/lib
+1 −1
Original line number Diff line number Diff line
@@ -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
+22 −2
Original line number Diff line number Diff line
@@ -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 −0
Original line number Diff line number Diff line
#[feature(struct_variant)];

use std::cast;
use std::libc::{c_int, c_void};
use std::ptr;
+12 −3
Original line number Diff line number Diff line
@@ -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());
}