Files
tokio/tokio-tls/examples/echo.rs
T

61 lines
1.8 KiB
Rust
Raw Normal View History

2019-05-14 10:27:36 -07:00
#![deny(warnings, rust_2018_idioms)]
2018-08-15 05:54:24 -06:00
2019-05-14 10:27:36 -07:00
// A tiny async TLS echo server with Tokio
use native_tls;
2018-08-15 05:54:24 -06:00
use native_tls::Identity;
2019-05-14 10:27:36 -07:00
use tokio;
2018-08-15 05:54:24 -06:00
use tokio::io;
use tokio::net::TcpListener;
use tokio::prelude::*;
2019-05-14 10:27:36 -07:00
use tokio_tls;
2018-08-15 05:54:24 -06:00
2019-05-14 10:27:36 -07:00
fn main() -> Result<(), Box<dyn std::error::Error>> {
2018-08-15 05:54:24 -06:00
// Bind the server's socket
let addr = "127.0.0.1:12345".parse()?;
let tcp = TcpListener::bind(&addr)?;
2018-08-15 05:54:24 -06:00
// Create the TLS acceptor.
let der = include_bytes!("identity.p12");
let cert = Identity::from_pkcs12(der, "mypass")?;
2019-02-21 11:56:15 -08:00
let tls_acceptor =
tokio_tls::TlsAcceptor::from(native_tls::TlsAcceptor::builder(cert).build()?);
2018-08-15 05:54:24 -06:00
// Iterate incoming connections
2019-02-21 11:56:15 -08:00
let server = tcp
.incoming()
.for_each(move |tcp| {
// Accept the TLS connection.
let tls_accept = tls_acceptor
.accept(tcp)
.and_then(move |tls| {
// Split up the read and write halves
let (reader, writer) = tls.split();
// Copy the data back to the client
let conn = io::copy(reader, writer)
// print what happened
.map(|(n, _, _)| println!("wrote {} bytes", n))
// Handle any errors
.map_err(|err| println!("IO error {:?}", err));
// Spawn the future as a concurrent task
tokio::spawn(conn);
Ok(())
})
.map_err(|err| {
println!("TLS accept error: {:?}", err);
});
tokio::spawn(tls_accept);
Ok(())
})
.map_err(|err| {
println!("server error {:?}", err);
});
2018-08-15 05:54:24 -06:00
// Start the runtime and spin up the server
tokio::run(server);
Ok(())
2018-08-15 05:54:24 -06:00
}