diff --git a/problem_05/.gitignore b/problem_05/.gitignore new file mode 100644 index 0000000..52e4d31 --- /dev/null +++ b/problem_05/.gitignore @@ -0,0 +1,12 @@ +# Generated by Cargo +# will have compiled files and executables +/target/ + +# Remove Cargo.lock from gitignore if creating an executable, leave it for libraries +# More information here https://doc.rust-lang.org/cargo/guide/cargo-toml-vs-cargo-lock.html +Cargo.lock + +# These are backup files generated by rustfmt +**/*.rs.bk + +.idea diff --git a/problem_05/Cargo.toml b/problem_05/Cargo.toml new file mode 100644 index 0000000..2a321ee --- /dev/null +++ b/problem_05/Cargo.toml @@ -0,0 +1,13 @@ +[package] +name = "problem_05" +version = "0.1.0" +edition = "2021" + +[[bin]] +name = "server" +path = "bin/server.rs" + +[dependencies] +tokio = { version = "1.14.0", features = ["full"] } +tracing = "0.1.37" +tracing-subscriber = "0.3.17" diff --git a/problem_05/bin/server.rs b/problem_05/bin/server.rs new file mode 100644 index 0000000..75715df --- /dev/null +++ b/problem_05/bin/server.rs @@ -0,0 +1,61 @@ +use tokio::net::{TcpListener, TcpStream}; +use tracing::{info, error}; +use std::net::SocketAddr; +use tokio_util::codec::{Framed, LinesCodec}; +use tokio::sync::broadcast; + +const DEFAULT_IP: &str = "0.0.0.0"; +const DEFAULT_PORT: &str = "1222"; + +const UPSTREAM_IP: &str = "206.189.113.124"; +const UPSTREAM_PORT: &str = "16963"; + +type Error = Box; +type Result = std::result::Result; + +enum Events { + ClientRequest(String), + ClientResponse(String), + UpstreamRequest(String), + UpstreamResponse(String), +} + +#[tokio::main] +pub async fn main() -> Result<()> { + tracing_subscriber::fmt::try_init()?; + + let listener = TcpListener::bind(&format!("{DEFAULT_IP}:{DEFAULT_PORT}")).await?; + let stream = TcpStream::connect(&format!("{UPSTREAM_IP}:{UPSTREAM_PORT}")).await?; + + let (sender, receiver) = broadcast::channel(2); + + info!("Start TCP server on {DEFAULT_IP}:{DEFAULT_PORT}"); + info!("Connect to upstream on {UPSTREAM_IP}:{UPSTREAM_PORT}"); + + let listener_handle = tokio::spawn(async move { + loop { + let (socket, address) = listener.accept().await?; + + tokio::spawn(async move { + info!("New request from: {address}"); + let _ = handle_request(socket).await; + }); + } + }); + + let upstream_handle = tokio::spawn({ + loop { + + } + }); + + let _ = listener_handle.await; + let _ = upstream_handle.await; + + Ok(()) + +} + +pub async fn handle_request(mut socket: TcpStream) -> Result<()> { + let framed = Framed::new(socket, LinesCodec::new()); +}