diff options
| author | Steven Fackler <[email protected]> | 2015-05-05 22:57:14 -0400 |
|---|---|---|
| committer | Steven Fackler <[email protected]> | 2015-05-05 22:57:14 -0400 |
| commit | 8a9aa0c657d61cc2a32a1d59dcbd2a55d6f9b694 (patch) | |
| tree | 441f3538fe7f7b1976c5d377af68c409efdd2267 | |
| parent | Merge pull request #201 from manuels/pkey_cmp (diff) | |
| parent | Add SslStream.pending() (diff) | |
| download | rust-openssl-8a9aa0c657d61cc2a32a1d59dcbd2a55d6f9b694.tar.xz rust-openssl-8a9aa0c657d61cc2a32a1d59dcbd2a55d6f9b694.zip | |
Merge pull request #210 from manuels/pending
Add SslStream.pending()
| -rw-r--r-- | openssl-sys/src/lib.rs | 1 | ||||
| -rw-r--r-- | openssl/src/ssl/mod.rs | 12 | ||||
| -rw-r--r-- | openssl/src/ssl/tests.rs | 24 |
3 files changed, 37 insertions, 0 deletions
diff --git a/openssl-sys/src/lib.rs b/openssl-sys/src/lib.rs index 9365704e..b3b9463d 100644 --- a/openssl-sys/src/lib.rs +++ b/openssl-sys/src/lib.rs @@ -497,6 +497,7 @@ extern "C" { pub fn SSLv23_method() -> *const SSL_METHOD; pub fn SSL_new(ctx: *mut SSL_CTX) -> *mut SSL; + pub fn SSL_pending(ssl: *const SSL) -> c_int; pub fn SSL_free(ssl: *mut SSL); pub fn SSL_set_bio(ssl: *mut SSL, rbio: *mut BIO, wbio: *mut BIO); pub fn SSL_get_rbio(ssl: *mut SSL) -> *mut BIO; diff --git a/openssl/src/ssl/mod.rs b/openssl/src/ssl/mod.rs index b5a138dd..17228793 100644 --- a/openssl/src/ssl/mod.rs +++ b/openssl/src/ssl/mod.rs @@ -707,6 +707,13 @@ impl Ssl { } } } + + /// pending() takes into account only bytes from the TLS/SSL record that is currently being processed (if any). + pub fn pending(&self) -> usize { + unsafe { + ffi::SSL_pending(self.ssl) as usize + } + } } macro_rules! make_LibSslError { @@ -882,6 +889,11 @@ impl<S: Read+Write> SslStream<S> { pub fn get_selected_npn_protocol(&self) -> Option<&[u8]> { self.ssl.get_selected_npn_protocol() } + + /// pending() takes into account only bytes from the TLS/SSL record that is currently being processed (if any). + pub fn pending(&self) -> usize { + self.ssl.pending() + } } impl<S: Read+Write> Read for SslStream<S> { diff --git a/openssl/src/ssl/tests.rs b/openssl/src/ssl/tests.rs index e6af551b..c9a2d73a 100644 --- a/openssl/src/ssl/tests.rs +++ b/openssl/src/ssl/tests.rs @@ -337,6 +337,30 @@ fn test_read() { io::copy(&mut stream, &mut io::sink()).ok().expect("read error"); } + +#[test] +fn test_pending() { + let tcp = TcpStream::connect("127.0.0.1:15418").unwrap(); + let mut stream = SslStream::new(&SslContext::new(Sslv23).unwrap(), tcp).unwrap(); + stream.write_all("GET /\r\n\r\n".as_bytes()).unwrap(); + stream.flush().unwrap(); + + // wait for the response and read first byte... + let mut buf = [0u8; 16*1024]; + stream.read(&mut buf[..1]).unwrap(); + + let pending = stream.pending(); + let len = stream.read(&mut buf[1..]).unwrap(); + + assert_eq!(pending, len); + + stream.read(&mut buf[..1]).unwrap(); + + let pending = stream.pending(); + let len = stream.read(&mut buf[1..]).unwrap(); + assert_eq!(pending, len); +} + /// Tests that connecting with the client using NPN, but the server not does not /// break the existing connection behavior. #[test] |