summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.cirrus.yml2
-rw-r--r--Cargo.toml1
-rw-r--r--azure-pipelines.yml1
-rw-r--r--ci/azure-cross-compile.yml4
-rw-r--r--ci/patch.toml1
-rw-r--r--tokio-tls/CHANGELOG.md43
-rw-r--r--tokio-tls/Cargo.toml66
-rw-r--r--tokio-tls/LICENSE25
-rw-r--r--tokio-tls/README.md16
-rw-r--r--tokio-tls/examples/download-rust-lang.rs40
-rw-r--r--tokio-tls/examples/identity.p12bin3386 -> 0 bytes
-rw-r--r--tokio-tls/examples/tls-echo.rs55
-rw-r--r--tokio-tls/src/lib.rs364
-rw-r--r--tokio-tls/tests/bad.rs124
-rw-r--r--tokio-tls/tests/google.rs102
-rw-r--r--tokio-tls/tests/smoke.rs629
16 files changed, 3 insertions, 1470 deletions
diff --git a/.cirrus.yml b/.cirrus.yml
index c2344c0c..7a5f9a6d 100644
--- a/.cirrus.yml
+++ b/.cirrus.yml
@@ -39,4 +39,4 @@ task:
# i686_test_script:
# - . $HOME/.cargo/env
# - |
- # cargo test --all --exclude tokio-tls --exclude tokio-macros --target i686-unknown-freebsd
+ # cargo test --all --exclude tokio-macros --target i686-unknown-freebsd
diff --git a/Cargo.toml b/Cargo.toml
index ebae0d3d..39d29366 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -4,7 +4,6 @@ members = [
"tokio",
"tokio-macros",
"tokio-test",
- "tokio-tls",
"tokio-util",
# Internal
diff --git a/azure-pipelines.yml b/azure-pipelines.yml
index cc50f3c8..b1396a95 100644
--- a/azure-pipelines.yml
+++ b/azure-pipelines.yml
@@ -26,7 +26,6 @@ jobs:
crates:
- tokio-macros
- tokio-test
- - tokio-tls
- tokio-util
- examples
diff --git a/ci/azure-cross-compile.yml b/ci/azure-cross-compile.yml
index 74acaee2..11c530ca 100644
--- a/ci/azure-cross-compile.yml
+++ b/ci/azure-cross-compile.yml
@@ -37,8 +37,8 @@ jobs:
# Always patch
- template: azure-patch-crates.yml
- - script: cross check --all --exclude tokio-tls --target $(target)
+ - script: cross check --all --target $(target)
displayName: Check source
- # - script: cross check --tests --all --exclude tokio-tls --target $(target)
+ # - script: cross check --tests --all --target $(target)
# displayName: Check tests
diff --git a/ci/patch.toml b/ci/patch.toml
index 22311cf9..1650e3b1 100644
--- a/ci/patch.toml
+++ b/ci/patch.toml
@@ -4,5 +4,4 @@
tokio = { path = "tokio" }
tokio-macros = { path = "tokio-macros" }
tokio-test = { path = "tokio-test" }
-tokio-tls = { path = "tokio-tls" }
tokio-util = { path = "tokio-util" }
diff --git a/tokio-tls/CHANGELOG.md b/tokio-tls/CHANGELOG.md
deleted file mode 100644
index dc626a76..00000000
--- a/tokio-tls/CHANGELOG.md
+++ /dev/null
@@ -1,43 +0,0 @@
-# 0.3.1 (April 4, 2020)
-
-- Deprecate crate in favor of `tokio-native-tls`.
-
-# 0.3.0 (November 26, 2019)
-
-- Updates for tokio 0.2 release.
-
-# 0.3.0-alpha.6 (September 30, 2019)
-
-- Move to `futures-*-preview 0.3.0-alpha.19`.
-- Move to `pin-project 0.4`.
-
-# 0.3.0-alpha.5 (September 19, 2019)
-
-### Added
-- `TlsStream::get_ref` and `TlsStream::get_mut` ([#1537]).
-
-# 0.3.0-alpha.4 (August 30, 2019)
-
-### Changed
-- Track `tokio` 0.2.0-alpha.4.
-
-# 0.3.0-alpha.2 (August 17, 2019)
-
-### Changed
-- Update `futures` dependency to 0.3.0-alpha.18.
-
-# 0.3.0-alpha.1 (August 8, 2019)
-
-### Changed
-- Switch to `async`, `await`, and `std::future`.
-
-# 0.2.1 (January 6, 2019)
-
-* Implement `Clone` for `TlsConnector` and `TlsAcceptor` ([#777])
-
-# 0.2.0 (August 8, 2018)
-
-* Initial release with `tokio` support.
-
-[#1537]: https://github.com/tokio-rs/tokio/pull/1537
-[#777]: https://github.com/tokio-rs/tokio/pull/777
diff --git a/tokio-tls/Cargo.toml b/tokio-tls/Cargo.toml
deleted file mode 100644
index 2ec01bfa..00000000
--- a/tokio-tls/Cargo.toml
+++ /dev/null
@@ -1,66 +0,0 @@
-[package]
-name = "tokio-tls"
-# When releasing to crates.io:
-# - Remove path dependencies
-# - Update html_root_url.
-# - Update doc url
-# - Cargo.toml
-# - README.md
-# - Update CHANGELOG.md.
-# - Create "v0.3.x" git tag.
-version = "0.3.1"
-edition = "2018"
-authors = ["Tokio Contributors <team@tokio.rs>"]
-license = "MIT"
-repository = "https://github.com/tokio-rs/tokio"
-homepage = "https://tokio.rs"
-documentation = "https://docs.rs/tokio-tls/0.3.1/tokio_tls/"
-description = """
-Deprecated in favor of `tokio-naitve-tls`.
-
-An implementation of TLS/SSL streams for Tokio giving an implementation of TLS
-for nonblocking I/O streams.
-"""
-categories = ["asynchronous", "network-programming"]
-maintenance = { status = "deprecated" }
-
-[badges]
-travis-ci = { repository = "tokio-rs/tokio-tls" }
-
-[dependencies]
-native-tls = "0.2"
-tokio = { version = "0.2.0", path = "../tokio" }
-
-[dev-dependencies]
-tokio = { version = "0.2.0", path = "../tokio", features = ["macros", "stream", "rt-core", "io-util", "net"] }
-tokio-util = { version = "0.3.0", path = "../tokio-util", features = ["full"] }
-
-cfg-if = "0.1"
-env_logger = { version = "0.6", default-features = false }
-futures = { version = "0.3.0", features = ["async-await"] }
-
-[target.'cfg(all(not(target_os = "macos"), not(windows), not(target_os = "ios")))'.dev-dependencies]
-openssl = "0.10"
-
-[target.'cfg(any(target_os = "macos", target_os = "ios"))'.dev-dependencies]
-security-framework = "0.2"
-
-[target.'cfg(windows)'.dev-dependencies]
-schannel = "0.1"
-
-[target.'cfg(windows)'.dev-dependencies.winapi]
-version = "0.3"
-features = [
- "lmcons",
- "basetsd",
- "minwinbase",
- "minwindef",
- "ntdef",
- "sysinfoapi",
- "timezoneapi",
- "wincrypt",
- "winerror",
-]
-
-[package.metadata.docs.rs]
-all-features = true
diff --git a/tokio-tls/LICENSE b/tokio-tls/LICENSE
deleted file mode 100644
index cdb28b4b..00000000
--- a/tokio-tls/LICENSE
+++ /dev/null
@@ -1,25 +0,0 @@
-Copyright (c) 2019 Tokio Contributors
-
-Permission is hereby granted, free of charge, to any
-person obtaining a copy of this software and associated
-documentation files (the "Software"), to deal in the
-Software without restriction, including without
-limitation the rights to use, copy, modify, merge,
-publish, distribute, sublicense, and/or sell copies of
-the Software, and to permit persons to whom the Software
-is furnished to do so, subject to the following
-conditions:
-
-The above copyright notice and this permission notice
-shall be included in all copies or substantial portions
-of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
-ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
-TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
-PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
-SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
-CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
-IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
diff --git a/tokio-tls/README.md b/tokio-tls/README.md
deleted file mode 100644
index 6cfb9ec0..00000000
--- a/tokio-tls/README.md
+++ /dev/null
@@ -1,16 +0,0 @@
-# tokio-tls
-
-**Deprecated** in favor of `tokio-native-tls`.
-
-An implementation of TLS/SSL streams for Tokio built on top of the [`native-tls`
-crate]
-
-## License
-
-This project is licensed under the [MIT license](./LICENSE).
-
-### Contribution
-
-Unless you explicitly state otherwise, any contribution intentionally submitted
-for inclusion in Tokio by you, shall be licensed as MIT, without any additional
-terms or conditions.
diff --git a/tokio-tls/examples/download-rust-lang.rs b/tokio-tls/examples/download-rust-lang.rs
deleted file mode 100644
index 324c0775..00000000
--- a/tokio-tls/examples/download-rust-lang.rs
+++ /dev/null
@@ -1,40 +0,0 @@
-// #![warn(rust_2018_idioms)]
-
-use native_tls::TlsConnector;
-use std::error::Error;
-use std::net::ToSocketAddrs;
-use tokio::io::{AsyncReadExt, AsyncWriteExt};
-use tokio::net::TcpStream;
-use tokio_tls;
-
-#[tokio::main]
-async fn main() -> Result<(), Box<dyn Error + Send + Sync>> {
- let addr = "www.rust-lang.org:443"
- .to_socket_addrs()?
- .next()
- .ok_or("failed to resolve www.rust-lang.org")?;
-
- let socket = TcpStream::connect(&addr).await?;
- let cx = TlsConnector::builder().build()?;
- let cx = tokio_tls::TlsConnector::from(cx);
-
- let mut socket = cx.connect("www.rust-lang.org", socket).await?;
-
- socket
- .write_all(
- "\
- GET / HTTP/1.0\r\n\
- Host: www.rust-lang.org\r\n\
- \r\n\
- "
- .as_bytes(),
- )
- .await?;
-
- let mut data = Vec::new();
- socket.read_to_end(&mut data).await?;
-
- // println!("data: {:?}", &data);
- println!("{}", String::from_utf8_lossy(&data[..]));
- Ok(())
-}
diff --git a/tokio-tls/examples/identity.p12 b/tokio-tls/examples/identity.p12
deleted file mode 100644
index d16abb8c..00000000
--- a/tokio-tls/examples/identity.p12
+++ /dev/null
Binary files differ
diff --git a/tokio-tls/examples/tls-echo.rs b/tokio-tls/examples/tls-echo.rs
deleted file mode 100644
index 96309567..00000000
--- a/tokio-tls/examples/tls-echo.rs
+++ /dev/null
@@ -1,55 +0,0 @@
-#![warn(rust_2018_idioms)]
-
-// A tiny async TLS echo server with Tokio
-use native_tls;
-use native_tls::Identity;
-use tokio;
-use tokio::io::{AsyncReadExt, AsyncWriteExt};
-use tokio::net::TcpListener;
-use tokio_tls;
-
-/**
-an example to setup a tls server.
-how to test:
-wget https://127.0.0.1:12345 --no-check-certificate
-*/
-#[tokio::main]
-async fn main() -> Result<(), Box<dyn std::error::Error>> {
- // Bind the server's socket
- let addr = "127.0.0.1:12345".to_string();
- let mut tcp: TcpListener = TcpListener::bind(&addr).await?;
-
- // Create the TLS acceptor.
- let der = include_bytes!("identity.p12");
- let cert = Identity::from_pkcs12(der, "mypass")?;
- let tls_acceptor =
- tokio_tls::TlsAcceptor::from(native_tls::TlsAcceptor::builder(cert).build()?);
- loop {
- // Asynchronously wait for an inbound socket.
- let (socket, remote_addr) = tcp.accept().await?;
- let tls_acceptor = tls_acceptor.clone();
- println!("accept connection from {}", remote_addr);
- tokio::spawn(async move {
- // Accept the TLS connection.
- let mut tls_stream = tls_acceptor.accept(socket).await.expect("accept error");
- // In a loop, read data from the socket and write the data back.
-
- let mut buf = [0; 1024];
- let n = tls_stream
- .read(&mut buf)
- .await
- .expect("failed to read data from socket");
-
- if n == 0 {
- return;
- }
- println!("read={}", unsafe {
- String::from_utf8_unchecked(buf[0..n].into())
- });
- tls_stream
- .write_all(&buf[0..n])
- .await
- .expect("failed to write data to socket");
- });
- }
-}
diff --git a/tokio-tls/src/lib.rs b/tokio-tls/src/lib.rs
deleted file mode 100644
index 48c9d522..00000000
--- a/tokio-tls/src/lib.rs
+++ /dev/null
@@ -1,364 +0,0 @@
-#![doc(html_root_url = "https://docs.rs/tokio-tls/0.3.1")]
-#![warn(
- missing_debug_implementations,
- missing_docs,
- rust_2018_idioms,
- unreachable_pub
-)]
-#![deny(intra_doc_link_resolution_failure)]
-#![doc(test(
- no_crate_inject,
- attr(deny(warnings, rust_2018_idioms), allow(dead_code, unused_variables))
-))]
-
-//! Async TLS streams
-//!
-//! > **Note:** This crate is **deprecated** and has been moved
-//! into the [`tokio-native-tls`] crate.
-//!
-//! This library is an implementation of TLS streams using the most appropriate
-//! system library by default for negotiating the connection. That is, on
-//! Windows this library uses SChannel, on OSX it uses SecureTransport, and on
-//! other platforms it uses OpenSSL.
-//!
-//! Each TLS stream implements the `Read` and `Write` traits to interact and
-//! interoperate with the rest of the futures I/O ecosystem. Client connections
-//! initiated from this crate verify hostnames automatically and by default.
-//!
-//! This crate primarily exports this ability through two newtypes,
-//! `TlsConnector` and `TlsAcceptor`. These newtypes augment the
-//! functionality provided by the `native-tls` crate, on which this crate is
-//! built. Configuration of TLS parameters is still primarily done through the
-//! `native-tls` crate.
-
-use tokio::io::{AsyncRead, AsyncWrite};
-
-use native_tls::{Error, HandshakeError, MidHandshakeTlsStream};
-use std::fmt;
-use std::future::Future;
-use std::io::{self, Read, Write};
-use std::marker::Unpin;
-use std::mem::MaybeUninit;
-use std::pin::Pin;
-use std::ptr::null_mut;
-use std::task::{Context, Poll};
-
-#[derive(Debug)]
-struct AllowStd<S> {
- inner: S,
- context: *mut (),
-}
-
-/// A wrapper around an underlying raw stream which implements the TLS or SSL
-/// protocol.
-///
-/// A `TlsStream<S>` represents a handshake that has been completed successfully
-/// and both the server and the client are ready for receiving and sending
-/// data. Bytes read from a `TlsStream` are decrypted from `S` and bytes written
-/// to a `TlsStream` are encrypted when passing through to `S`.
-#[derive(Debug)]
-pub struct TlsStream<S>(native_tls::TlsStream<AllowStd<S>>);
-
-/// A wrapper around a `native_tls::TlsConnector`, providing an async `connect`
-/// method.
-#[derive(Clone)]
-pub struct TlsConnector(native_tls::TlsConnector);
-
-/// A wrapper around a `native_tls::TlsAcceptor`, providing an async `accept`
-/// method.
-#[derive(Clone)]
-pub struct TlsAcceptor(native_tls::TlsAcceptor);
-
-struct MidHandshake<S>(Option<MidHandshakeTlsStream<AllowStd<S>>>);
-
-enum StartedHandshake<S> {
- Done(TlsStream<S>),
- Mid(MidHandshakeTlsStream<AllowStd<S>>),
-}
-
-struct StartedHandshakeFuture<F, S>(Option<StartedHandshakeFutureInner<F, S>>);
-struct StartedHandshakeFutureInner<F, S> {
- f: F,
- stream: S,
-}
-
-struct Guard<'a, S>(&'a mut TlsStream<S>)
-where
- AllowStd<S>: Read + Write;
-
-impl<S> Drop for Guard<'_, S>
-where
- AllowStd<S>: Read + Write,
-{
- fn drop(&mut self) {
- (self.0).0.get_mut().context = null_mut();
- }
-}
-
-// *mut () context is neither Send nor Sync
-unsafe impl<S: Send> Send for AllowStd<S> {}
-unsafe impl<S: Sync> Sync for AllowStd<S> {}
-
-impl<S> AllowStd<S>
-where
- S: Unpin,
-{
- fn with_context<F, R>(&mut self, f: F) -> R
- where
- F: FnOnce(&mut Context<'_>, Pin<&mut S>) -> R,
- {
- unsafe {
- assert!(!self.context.is_null());
- let waker = &mut *(self.context as *mut _);
- f(waker, Pin::new(&mut self.inner))
- }
- }
-}
-
-impl<S> Read for AllowStd<S>
-where
- S: AsyncRead + Unpin,
-{
- fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
- match self.with_context(|ctx, stream| stream.poll_read(ctx, buf)) {
- Poll::Ready(r) => r,
- Poll::Pending => Err(io::Error::from(io::ErrorKind::WouldBlock)),
- }
- }
-}
-
-impl<S> Write for AllowStd<S>
-where
- S: AsyncWrite + Unpin,
-{
- fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
- match self.with_context(|ctx, stream| stream.poll_write(ctx, buf)) {
- Poll::Ready(r) => r,
- Poll::Pending => Err(io::Error::from(io::ErrorKind::WouldBlock)),
- }
- }
-
- fn flush(&mut self) -> io::Result<()> {
- match self.with_context(|ctx, stream| stream.poll_flush(ctx)) {
- Poll::Ready(r) => r,
- Poll::Pending => Err(io::Error::from(io::ErrorKind::WouldBlock)),
- }
- }
-}
-
-fn cvt<T>(r: io::Result<T>) -> Poll<io::Result<T>> {
- match r {
- Ok(v) => Poll::Ready(Ok(v)),
- Err(ref e) if e.kind() == io::ErrorKind::WouldBlock => Poll::Pending,
- Err(e) => Poll::Ready(Err(e)),
- }
-}
-
-impl<S> TlsStream<S> {
- fn with_context<F, R>(&mut self, ctx: &mut Context<'_>, f: F) -> R
- where
- F: FnOnce(&mut native_tls::TlsStream<AllowStd<S>>) -> R,
- AllowStd<S>: Read + Write,
- {
- self.0.get_mut().context = ctx as *mut _ as *mut ();
- let g = Guard(self);
- f(&mut (g.0).0)
- }
-
- /// Returns a shared reference to the inner stream.
- pub fn get_ref(&self) -> &S
- where
- S: AsyncRead + AsyncWrite + Unpin,
- {
- &self.0.get_ref().inner
- }
-
- /// Returns a mutable reference to the inner stream.
- pub fn get_mut(&mut self) -> &mut S
- where
- S: AsyncRead + AsyncWrite + Unpin,
- {
- &mut self.0.get_mut().inner
- }
-}
-
-impl<S> AsyncRead for TlsStream<S>
-where
- S: AsyncRead + AsyncWrite + Unpin,
-{
- unsafe fn prepare_uninitialized_buffer(&self, _: &mut [MaybeUninit<u8>]) -> bool {
- // Note that this does not forward to `S` because the buffer is
- // unconditionally filled in by OpenSSL, not the actual object `S`.
- // We're decrypting bytes from `S` into the buffer above!
- false
- }
-
- fn poll_read(
- mut self: Pin<&mut Self>,
- ctx: &mut Context<'_>,
- buf: &mut [u8],
- ) -> Poll<io::Result<usize>> {
- self.with_context(ctx, |s| cvt(s.read(buf)))
- }
-}
-
-impl<S> AsyncWrite for TlsStream<S>
-where
- S: AsyncRead + AsyncWrite + Unpin,
-{
- fn poll_write(
- mut self: Pin<&mut Self>,
- ctx: &mut Context<'_>,
- buf: &[u8],
- ) -> Poll<io::Result<usize>> {
- self.with_context(ctx, |s| cvt(s.write(buf)))
- }
-
- fn poll_flush(mut self: Pin<&mut Self>, ctx: &mut Context<'_>) -> Poll<io::Result<()>> {
- self.with_context(ctx, |s| cvt(s.flush()))
- }
-
- fn poll_shutdown(mut self: Pin<&mut Self>, ctx: &mut Context<'_>) -> Poll<io::Result<()>> {
- match self.with_context(ctx, |s| s.shutdown()) {
- Ok(()) => Poll::Ready(Ok(())),
- Err(ref e) if e.kind() == io::ErrorKind::WouldBlock => Poll::Pending,
- Err(e) => Poll::Ready(Err(e)),
- }
- }
-}
-
-async fn handshake<F, S>(f: F, stream: S) -> Result<TlsStream<S>, Error>
-where
- F: FnOnce(
- AllowStd<S>,
- ) -> Result<native_tls::TlsStream<AllowStd<S>>, HandshakeError<AllowStd<S>>>
- + Unpin,
- S: AsyncRead + AsyncWrite + Unpin,
-{
- let start = StartedHandshakeFuture(Some(StartedHandshakeFutureInner { f, stream }));
-
- match start.await {
- Err(e) => Err(e),
- Ok(StartedHandshake::Done(s)) => Ok(s),
- Ok(StartedHandshake::Mid(s)) => MidHandshake(Some(s)).await,
- }
-}
-
-impl<F, S> Future for StartedHandshakeFuture<F, S>
-where
- F: FnOnce(
- AllowStd<S>,
- ) -> Result<native_tls::TlsStream<AllowStd<S>>, HandshakeError<AllowStd<S>>>
- + Unpin,
- S: Unpin,
- AllowStd<S>: Read + Write,
-{
- type Output = Result<StartedHandshake<S>, Error>;
-
- fn poll(
- mut self: Pin<&mut Self>,
- ctx: &mut Context<'_>,
- ) -> Poll<Result<StartedHandshake<S>, Error>> {
- let inner = self.0.take().expect("future polled after completion");
- let stream = AllowStd {
- inner: inner.stream,
- context: ctx as *mut _ as *mut (),
- };
-
- match (inner.f)(stream) {
- Ok(mut s) => {
- s.get_mut().context = null_mut();
- Poll::Ready(Ok(StartedHandshake::Done(TlsStream(s))))
- }
- Err(HandshakeError::WouldBlock(mut s)) => {
- s.get_mut().context = null_mut();
- Poll::Ready(Ok(StartedHandshake::Mid(s)))
- }
- Err(HandshakeError::Failure(e)) => Poll::Ready(Err(e)),
- }
- }
-}
-
-impl TlsConnector {
- /// Connects the provided stream with this connector, assuming the provided
- /// domain.
- ///
- /// This function will internally call `TlsConnector::connect` to connect
- /// the stream and returns a future representing the resolution of the
- /// connection operation. The returned future will resolve to either
- /// `TlsStream<S>` or `Error` depending if it's successful or not.
- ///
- /// This is typically used for clients who have already established, for
- /// example, a TCP connection to a remote server. That stream is then
- /// provided here to perform the client half of a connection to a
- /// TLS-powered server.
- pub async fn connect<S>(&self, domain: &str, stream: S) -> Result<TlsStream<S>, Error>
- where
- S: AsyncRead + AsyncWrite + Unpin,
- {
- handshake(move |s| self.0.connect(domain, s), stream).await
- }
-}
-
-impl fmt::Debug for TlsConnector {
- fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
- f.debug_struct("TlsConnector").finish()
- }
-}
-
-impl From<native_tls::TlsConnector> for TlsConnector {
- fn from(inner: native_tls::TlsConnector) -> TlsConnector {
- TlsConnector(inner)
- }
-}
-
-impl TlsAcceptor {
- /// Accepts a new client connection with the provided stream.
- ///
- /// This function will internally call `TlsAcceptor::accept` to connect
- /// the stream and returns a future representing the resolution of the
- /// connection operation. The returned future will resolve to either
- /// `TlsStream<S>` or `Error` depending if it's successful or not.
- ///
- /// This is typically used after a new socket has been accepted from a
- /// `TcpListener`. That socket is then passed to this function to perform
- /// the server half of accepting a client connection.
- pub async fn accept<S>(&self, stream: S) -> Result<TlsStream<S>, Error>
- where
- S: AsyncRead + AsyncWrite + Unpin,
- {
- handshake(move |s| self.0.accept(s), stream).await
- }
-}
-
-impl fmt::Debug for TlsAcceptor {
- fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
- f.debug_struct("TlsAcceptor").finish()
- }
-}
-
-impl From<native_tls::TlsAcceptor> for TlsAcceptor {
- fn from(inner: native_tls::TlsAcceptor) -> TlsAcceptor {
- TlsAcceptor(inner)
- }
-}
-
-impl<S: AsyncRead + AsyncWrite + Unpin> Future for MidHandshake<S> {
- type Output = Result<TlsStream<S>, Error>;
-
- fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {
- let mut_self = self.get_mut();
- let mut s = mut_self.0.take().expect("future polled after completion");
-
- s.get_mut().context = cx as *mut _ as *mut ();
- match s.handshake() {
- Ok(stream) => Poll::Ready(Ok(TlsStream(stream))),
- Err(HandshakeError::Failure(e)) => Poll::Ready(Err(e)),
- Err(HandshakeError::WouldBlock(mut s)) => {
- s.get_mut().context = null_mut();
- mut_self.0 = Some(s);
- Poll::Pending
- }
- }
- }
-}
diff --git a/tokio-tls/tests/bad.rs b/tokio-tls/tests/bad.rs
deleted file mode 100644
index 87d4ca27..00000000
--- a/tokio-tls/tests/bad.rs
+++ /dev/null
@@ -1,124 +0,0 @@
-#![warn(rust_2018_idioms)]
-
-use cfg_if::cfg_if;
-use env_logger;
-use native_tls::TlsConnector;
-use std::io::{self, Error};
-use std::net::ToSocketAddrs;
-use tokio::net::TcpStream;
-use tokio_tls;
-
-macro_rules! t {
- ($e:expr) => {
- match $e {
- Ok(e) => e,
- Err(e) => panic!("{} failed with {:?}", stringify!($e), e),
- }
- };
-}
-
-cfg_if! {
- if #[cfg(feature = "force-rustls")] {
- fn verify_failed(err: &Error, s: &str) {
- let err = err.to_string();
- assert!(err.contains(s), "bad error: {}", err);
- }
-
- fn assert_expired_error(err: &Error) {
- verify_failed(err, "CertExpired");
- }
-
- fn assert_wrong_host(err: &Error) {
- verify_failed(err, "CertNotValidForName");
- }
-
- fn assert_self_signed(err: &Error) {
- verify_failed(err, "UnknownIssuer");
- }
-
- fn assert_untrusted_root(err: &Error) {
- verify_failed(err, "UnknownIssuer");
- }
- } else if #[cfg(any(feature = "force-openssl",
- all(not(target_os = "macos"),
- not(target_os = "windows"),
- not(target_os = "ios"))))] {
- fn verify_failed(err: &Error) {
- assert!(format!("{}", err).contains("certificate verify failed"))
- }
-
- use verify_failed as assert_expired_error;
- use verify_failed as assert_wrong_host;
- use verify_failed as assert_self_signed;
- use verify_failed as assert_untrusted_root;
- } else if #[cfg(any(target_os = "macos", target_os = "ios"))] {
-
- fn assert_invalid_cert_chain(err: &Error) {
- assert!(format!("{}", err).contains("was not trusted."))
- }
-
- use crate::assert_invalid_cert_chain as assert_expired_error;
- use crate::assert_invalid_cert_chain as assert_wrong_host;
- use crate::assert_invalid_cert_chain as assert_self_signed;
- use crate::assert_invalid_cert_chain as assert_untrusted_root;
- } else {
- fn assert_expired_error(err: &Error) {
- let s = err.to_string();
- assert!(s.contains("system clock"), "error = {:?}", s);
- }
-
- fn assert_wrong_host(err: &Error) {
- let s = err.to_string();
- assert!(s.contains("CN name"), "error = {:?}", s);
- }
-
- fn assert_self_signed(err: &Error) {
- let s = err.to_string();
- assert!(s.contains("root certificate which is not trusted"), "error = {:?}", s);
- }
-
- use assert_self_signed as assert_untrusted_root;
- }
-}
-
-async fn get_host(host: &'static str) -> Error {
- drop(env_logger::try_init());
-
- let addr = format!("{}:443", host);
- let addr = t!(addr.to_socket_addrs()).next().unwrap();
-
- let socket = t!(TcpStream::connect(&addr).await);
- let builder = TlsConnector::builder();
- let cx = t!(builder.build());
- let cx = tokio_tls::TlsConnector::from(cx);
- let res = cx
- .connect(host, socket)
- .await
- .map_err(|e| Error::new(io::ErrorKind::Other, e));
-
- assert!(res.is_err());
- res.err().unwrap()
-}
-
-#[tokio::test]
-async fn expired() {
- assert_expired_error(&get_host("expired.badssl.com").await)
-}
-
-// TODO: the OSX builders on Travis apparently fail this tests spuriously?
-// passes locally though? Seems... bad!
-#[tokio::test]
-#[cfg_attr(all(target_os = "macos", feature = "force-openssl"), ignore)]
-async fn wrong_host() {
- assert_wrong_host(&get_host("wrong.host.badssl.com").await)
-}
-
-#[tokio::test]
-async fn self_signed() {
- assert_self_signed(&get_host("self-signed.badssl.com").await)
-}
-
-#[tokio::test]
-async fn untrusted_root() {
- assert_untrusted_root(&get_host("untrusted-root.badssl.com").await)
-}
diff --git a/tokio-tls/tests/google.rs b/tokio-tls/tests/google.rs
deleted file mode 100644
index 13b78d31..00000000
--- a/tokio-tls/tests/google.rs
+++ /dev/null
@@ -1,102 +0,0 @@
-#![warn(rust_2018_idioms)]
-
-use cfg_if::cfg_if;
-use env_logger;
-use native_tls;
-use native_tls::TlsConnector;
-use std::io;
-use std::net::ToSocketAddrs;
-use tokio::io::{AsyncReadExt, AsyncWriteExt};
-use tokio::net::TcpStream;
-use tokio_tls;
-
-macro_rules! t {
- ($e:expr) => {
- match $e {
- Ok(e) => e,
- Err(e) => panic!("{} failed with {:?}", stringify!($e), e),
- }
- };
-}
-
-cfg_if! {
- if #[cfg(feature = "force-rustls")] {
- fn assert_bad_hostname_error(err: &io::Error) {
- let err = err.to_string();
- assert!(err.contains("CertNotValidForName"), "bad error: {}", err);
- }
- } else if #[cfg(any(feature = "force-openssl",
- all(not(target_os = "macos"),
- not(target_os = "windows"),
- not(target_os = "ios"))))] {
- fn assert_bad_hostname_error(err: &io::Error) {
- let err = err.get_ref().unwrap();
- let err = err.downcast_ref::<native_tls::Error>().unwrap();
- assert!(format!("{}", err).contains("certificate verify failed"));
- }
- } else if #[cfg(any(target_os = "macos", target_os = "ios"))] {
- fn assert_bad_hostname_error(err: &io::Error) {
- let err = err.get_ref().unwrap();
- let err = err.downcast_ref::<native_tls::Error>().unwrap();
- assert!(format!("{}", err).contains("was not trusted."));
- }
- } else {
- fn assert_bad_hostname_error(err: &io::Error) {
- let err = err.get_ref().unwrap();
- let err = err.downcast_ref::<native_tls::Error>().unwrap();
- assert!(format!("{}", err).contains("CN name"));
- }
- }
-}
-
-#[tokio::test]
-async fn fetch_google() {
- drop(env_logger::try_init());
-
- // First up, resolve google.com
- let addr = t!("google.com:443".to_socket_addrs()).next().unwrap();
-
- let socket = TcpStream::connect(&addr).await.unwrap();
-
- // Send off the request by first negotiating an SSL handshake, then writing
- // of our request, then flushing, then finally read off the response.
- let builder = TlsConnector::builder();
- let connector = t!(builder.build());
- let connector = tokio_tls::TlsConnector::from(connector);
- let mut socket = t!(connector.connect("google.com", socket).await);
- t!(socket.write_all(b"GET / HTTP/1.0\r\n\r\n").await);
- let mut data = Vec::new();
- t!(socket.read_to_end(&mut data).await);
-
- // any response code is fine
- assert!(data.starts_with(b"HTTP/1.0 "));
-
- let data = String::from_utf8_lossy(&data);
- let data = data.trim_end();
- assert!(data.ends_with("</html>") || data.ends_with("</HTML>"));
-}
-
-fn native2io(e: native_tls::Error) -> io::Error {
- io::Error::new(io::ErrorKind::Other, e)
-}
-
-// see comment in bad.rs for ignore reason
-#[cfg_attr(all(target_os = "macos", feature = "force-openssl"), ignore)]
-#[tokio::test]
-async fn wrong_hostname_error() {
- drop(env_logger::try_init());
-
- let addr = t!("google.com:443".to_socket_addrs()).next().unwrap();
-
- let socket = t!(TcpStream::connect(&addr).await);
- let builder = TlsConnector::builder();
- let connector = t!(builder.build());
- let connector = tokio_tls::TlsConnector::from(connector);
- let res = connector
- .connect("rust-lang.org", socket)
- .await
- .map_err(native2io);
-
- assert!(res.is_err());
- assert_bad_hostname_error(&res.err().unwrap());
-}
diff --git a/tokio-tls/tests/smoke.rs b/tokio-tls/tests/smoke.rs
deleted file mode 100644
index 8788dd6d..00000000
--- a/tokio-tls/tests/smoke.rs
+++ /dev/null
@@ -1,629 +0,0 @@
-#![warn(rust_2018_idioms)]
-
-use cfg_if::cfg_if;
-use env_logger;
-use futures::join;
-use native_tls;
-use native_tls::{Identity, TlsAcceptor, TlsConnector};
-use std::io::Write;
-use std::marker::Unpin;
-use std::process::Command;
-use std::ptr;