diff options
Diffstat (limited to 'vendor/hyper-rustls/examples/server.rs')
| -rw-r--r-- | vendor/hyper-rustls/examples/server.rs | 138 |
1 files changed, 0 insertions, 138 deletions
diff --git a/vendor/hyper-rustls/examples/server.rs b/vendor/hyper-rustls/examples/server.rs deleted file mode 100644 index 8f7803fa..00000000 --- a/vendor/hyper-rustls/examples/server.rs +++ /dev/null @@ -1,138 +0,0 @@ -//! Simple HTTPS echo service based on hyper_util and rustls -//! -//! First parameter is the mandatory port to use. -//! Certificate and private key are hardcoded to sample files. -//! hyper will automatically use HTTP/2 if a client starts talking HTTP/2, -//! otherwise HTTP/1.1 will be used. - -use std::net::{Ipv4Addr, SocketAddr}; -use std::sync::Arc; -use std::{env, fs, io}; - -use http::{Method, Request, Response, StatusCode}; -use http_body_util::{BodyExt, Full}; -use hyper::body::{Bytes, Incoming}; -use hyper::service::service_fn; -use hyper_util::rt::{TokioExecutor, TokioIo}; -use hyper_util::server::conn::auto::Builder; -use pki_types::{CertificateDer, PrivateKeyDer}; -use rustls::ServerConfig; -use tokio::net::TcpListener; -use tokio_rustls::TlsAcceptor; - -fn main() { - // Serve an echo service over HTTPS, with proper error handling. - if let Err(e) = run_server() { - eprintln!("FAILED: {}", e); - std::process::exit(1); - } -} - -fn error(err: String) -> io::Error { - io::Error::new(io::ErrorKind::Other, err) -} - -#[tokio::main] -async fn run_server() -> Result<(), Box<dyn std::error::Error + Send + Sync>> { - // Set a process wide default crypto provider. - #[cfg(feature = "ring")] - let _ = rustls::crypto::ring::default_provider().install_default(); - #[cfg(feature = "aws-lc-rs")] - let _ = rustls::crypto::aws_lc_rs::default_provider().install_default(); - - // First parameter is port number (optional, defaults to 1337) - let port = match env::args().nth(1) { - Some(ref p) => p.parse()?, - None => 1337, - }; - let addr = SocketAddr::new(Ipv4Addr::LOCALHOST.into(), port); - - // Load public certificate. - let certs = load_certs("examples/sample.pem")?; - // Load private key. - let key = load_private_key("examples/sample.rsa")?; - - println!("Starting to serve on https://{}", addr); - - // Create a TCP listener via tokio. - let incoming = TcpListener::bind(&addr).await?; - - // Build TLS configuration. - let mut server_config = ServerConfig::builder() - .with_no_client_auth() - .with_single_cert(certs, key) - .map_err(|e| error(e.to_string()))?; - server_config.alpn_protocols = vec![b"h2".to_vec(), b"http/1.1".to_vec(), b"http/1.0".to_vec()]; - let tls_acceptor = TlsAcceptor::from(Arc::new(server_config)); - - let service = service_fn(echo); - - loop { - let (tcp_stream, _remote_addr) = incoming.accept().await?; - - let tls_acceptor = tls_acceptor.clone(); - tokio::spawn(async move { - let tls_stream = match tls_acceptor.accept(tcp_stream).await { - Ok(tls_stream) => tls_stream, - Err(err) => { - eprintln!("failed to perform tls handshake: {err:#}"); - return; - } - }; - if let Err(err) = Builder::new(TokioExecutor::new()) - .serve_connection(TokioIo::new(tls_stream), service) - .await - { - eprintln!("failed to serve connection: {err:#}"); - } - }); - } -} - -// Custom echo service, handling two different routes and a -// catch-all 404 responder. -async fn echo(req: Request<Incoming>) -> Result<Response<Full<Bytes>>, hyper::Error> { - let mut response = Response::new(Full::default()); - match (req.method(), req.uri().path()) { - // Help route. - (&Method::GET, "/") => { - *response.body_mut() = Full::from("Try POST /echo\n"); - } - // Echo service route. - (&Method::POST, "/echo") => { - *response.body_mut() = Full::from( - req.into_body() - .collect() - .await? - .to_bytes(), - ); - } - // Catch-all 404. - _ => { - *response.status_mut() = StatusCode::NOT_FOUND; - } - }; - Ok(response) -} - -// Load public certificate from file. -fn load_certs(filename: &str) -> io::Result<Vec<CertificateDer<'static>>> { - // Open certificate file. - let certfile = fs::File::open(filename) - .map_err(|e| error(format!("failed to open {}: {}", filename, e)))?; - let mut reader = io::BufReader::new(certfile); - - // Load and return certificate. - rustls_pemfile::certs(&mut reader).collect() -} - -// Load private key from file. -fn load_private_key(filename: &str) -> io::Result<PrivateKeyDer<'static>> { - // Open keyfile. - let keyfile = fs::File::open(filename) - .map_err(|e| error(format!("failed to open {}: {}", filename, e)))?; - let mut reader = io::BufReader::new(keyfile); - - // Load and return a single private key. - rustls_pemfile::private_key(&mut reader).map(|key| key.unwrap()) -} |
