aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSteven Fackler <[email protected]>2015-05-05 22:57:14 -0400
committerSteven Fackler <[email protected]>2015-05-05 22:57:14 -0400
commit8a9aa0c657d61cc2a32a1d59dcbd2a55d6f9b694 (patch)
tree441f3538fe7f7b1976c5d377af68c409efdd2267
parentMerge pull request #201 from manuels/pkey_cmp (diff)
parentAdd SslStream.pending() (diff)
downloadrust-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.rs1
-rw-r--r--openssl/src/ssl/mod.rs12
-rw-r--r--openssl/src/ssl/tests.rs24
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]