use hudsucker::{ certificate_authority::OpensslAuthority, hyper::{Request, Response}, openssl::{hash::MessageDigest, pkey::PKey, x509::X509}, rustls::crypto::aws_lc_rs, tokio_tungstenite::tungstenite::Message, *, }; use std::net::SocketAddr; use tracing::*; async fn shutdown_signal() { tokio::signal::ctrl_c() .await .expect("Failed to install CTRL+C signal handler"); } #[derive(Clone)] struct LogHandler; impl HttpHandler for LogHandler { async fn handle_request( &mut self, _ctx: &HttpContext, req: Request<Body>, ) -> RequestOrResponse { println!("{:?}", req); req.into() } async fn handle_response(&mut self, _ctx: &HttpContext, res: Response<Body>) -> Response<Body> { println!("{:?}", res); res } } impl WebSocketHandler for LogHandler { async fn handle_message(&mut self, _ctx: &WebSocketContext, msg: Message) -> Option<Message> { println!("{:?}", msg); Some(msg) } } #[tokio::main] async fn main() { tracing_subscriber::fmt::init(); let private_key_bytes: &[u8] = include_bytes!("ca/hudsucker.key"); let ca_cert_bytes: &[u8] = include_bytes!("ca/hudsucker.cer"); let private_key = PKey::private_key_from_pem(private_key_bytes).expect("Failed to parse private key"); let ca_cert = X509::from_pem(ca_cert_bytes).expect("Failed to parse CA certificate"); let ca = OpensslAuthority::new( private_key, ca_cert, MessageDigest::sha256(), 1_000, aws_lc_rs::default_provider(), ); let proxy = Proxy::builder() .with_addr(SocketAddr::from(([127, 0, 0, 1], 3000))) .with_ca(ca) .with_rustls_client(aws_lc_rs::default_provider()) .with_http_handler(LogHandler) .with_graceful_shutdown(shutdown_signal()) .build() .expect("Failed to create proxy"); if let Err(e) = proxy.start().await { error!("{}", e); } }