//! Implement a StreamHandler that proxies connections to ports, typically on //! localhost. use std::{collections::HashMap, net::SocketAddr}; use async_trait::async_trait; use crate::StreamHandler; pub(crate) struct StreamProxy { /// Map from virtual port on the onion service to an address we connect to /// in order to implement that port. ports: HashMap, } impl StreamProxy { // TODO hs need a new() function. It should reject non-localhost addresses // by default, and have a way to override. (Alternatively, that should be // done in the configuration code?) } #[async_trait] impl StreamHandler for StreamProxy { async fn handle_request(&self, circinfo: &(), stream: ()) { todo!() // TODO hs: implement // - Look up the port for the incoming stream request. // - If no port is found, reject the request, and possibly increment a // counter in circinfo. // - Otherwise, open a TCP connection to the target address. // - On success, accept the stream, and launch tasks to relay traffic // from the stream to the TCP connection. // - On failure, reject the stream with an error. } }