From 86b54c50d2e1e2bb9c5b6bc4f3797c80c2155901 Mon Sep 17 00:00:00 2001 From: Martin Pitt Date: Fri, 16 Sep 2022 11:41:27 +0200 Subject: [PATCH] tokio-tutorial-jbarszczewski: Implement actual balance data handling --- tokio-tutorial-jbarszczewski/src/main.rs | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/tokio-tutorial-jbarszczewski/src/main.rs b/tokio-tutorial-jbarszczewski/src/main.rs index 57af76b..f998acc 100644 --- a/tokio-tutorial-jbarszczewski/src/main.rs +++ b/tokio-tutorial-jbarszczewski/src/main.rs @@ -1,19 +1,22 @@ use std::str; +use std::sync::{ Arc, Mutex }; use tokio::io::{ AsyncReadExt, AsyncWriteExt }; -use tokio::net::{TcpListener, TcpStream}; +use tokio::net::{ TcpListener, TcpStream }; #[tokio::main] async fn main() { + let balance = Arc::new(Mutex::new(0.0f64)); let listener = TcpListener::bind("127.0.0.1:8181").await.unwrap(); loop { let (stream, _) = listener.accept().await.unwrap(); - tokio::spawn(async move { handle_connection(stream).await }); + let balance_ref = balance.clone(); + tokio::spawn(async move { handle_connection(stream, balance_ref).await }); } } -async fn handle_connection(mut stream: TcpStream) { +async fn handle_connection(mut stream: TcpStream, balance: Arc>) { // Read the first 16 characters from the incoming stream let mut buffer = [0; 16]; assert!(stream.read(&mut buffer).await.unwrap() >= 16); @@ -25,8 +28,7 @@ async fn handle_connection(mut stream: TcpStream) { let contents = match method_type { "GET " => { - // todo: return real balance - format!("{{\"balance\": {}}}", 0.0) + format!("{{\"balance\": {}}}", balance.lock().unwrap()) } "POST" => { // Take characters after 'POST /' until whitespace is detected. @@ -35,9 +37,11 @@ async fn handle_connection(mut stream: TcpStream) { .take_while(|x| **x != 32u8) .map(|x| *x as char) .collect(); - let balance_update = input.parse::().unwrap(); - // todo: add balance update handling - format!("{{\"balance\": {}}}", balance_update) + let balance_update = input.parse::().unwrap(); + println!("got POST request to update by {}", balance_update); + let mut locked_balance = balance.lock().unwrap(); + *locked_balance += balance_update; + format!("{{\"balance\": {}}}", locked_balance) } _ => { panic!("Invalid HTTP method!") -- 2.39.2