Commit 3fe3d579 authored by Manuel Schölling's avatar Manuel Schölling
Browse files

Add get_state_string()

parent df32e53a
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -529,6 +529,8 @@ extern "C" {
    pub fn SSL_get_current_compression(ssl: *mut SSL) -> *const COMP_METHOD;
    pub fn SSL_get_peer_certificate(ssl: *mut SSL) -> *mut X509;
    pub fn SSL_get_ssl_method(ssl: *mut SSL) -> *const SSL_METHOD;
    pub fn SSL_state_string(ssl: *mut SSL) -> *const c_char;
    pub fn SSL_state_string_long(ssl: *mut SSL) -> *const c_char;

    pub fn SSL_COMP_get_name(comp: *const COMP_METHOD) -> *const c_char;

+27 −0
Original line number Diff line number Diff line
@@ -6,6 +6,7 @@ use std::fmt;
use std::io;
use std::io::prelude::*;
use std::mem;
use std::str;
use std::net;
use std::path::Path;
use std::ptr;
@@ -690,6 +691,24 @@ impl Ssl {
        Ok(ssl)
    }

    pub fn get_state_string(&self) -> &'static str {
        let state = unsafe {
            let ptr = ffi::SSL_state_string(self.ssl);
            CStr::from_ptr(ptr)
        };

        str::from_utf8(state.to_bytes()).unwrap()
    }

    pub fn get_state_string_long(&self) -> &'static str {
        let state = unsafe {
            let ptr = ffi::SSL_state_string_long(self.ssl);
            CStr::from_ptr(ptr)
        };

        str::from_utf8(state.to_bytes()).unwrap()
    }

    fn get_rbio<'a>(&'a self) -> MemBioRef<'a> {
        unsafe { self.wrap_bio(ffi::SSL_get_rbio(self.ssl)) }
    }
@@ -1316,6 +1335,14 @@ impl<S: Read+Write> SslStream<S> {
    pub fn pending(&self) -> usize {
        self.kind.ssl().pending()
    }

    pub fn get_state_string(&self) -> &'static str {
        self.kind.ssl().get_state_string()
    }

    pub fn get_state_string_long(&self) -> &'static str {
        self.kind.ssl().get_state_string_long()
    }
}

impl<S: Read+Write> Read for SslStream<S> {
+8 −0
Original line number Diff line number Diff line
@@ -395,6 +395,14 @@ fn test_pending() {
    assert_eq!(pending, len);
}

#[test]
fn test_state() {
    let tcp = TcpStream::connect("127.0.0.1:15418").unwrap();
    let stream = SslStream::connect_generic(&SslContext::new(Sslv23).unwrap(), tcp).unwrap();
    assert_eq!(stream.get_state_string(), "SSLOK ");
    assert_eq!(stream.get_state_string_long(), "SSL negotiation finished successfully");
}

/// Tests that connecting with the client using NPN, but the server not does not
/// break the existing connection behavior.
#[test]