+async fn handle_connection(mut stream: TcpStream, balance: Arc<Mutex<f64>>) {
+ // Read the first 16 characters from the incoming stream
+ let mut buffer = [0; 16];
+ assert!(stream.read(&mut buffer).await.unwrap() >= 16);
+ // First 4 characters are used to detect HTTP method
+ let method_type = match str::from_utf8(&buffer[0..4]) {
+ Ok(v) => v,
+ Err(e) => panic!("Invalid UTF-8 sequence: {}", e),
+ };
+
+ let contents = match method_type {
+ "GET " => {
+ format!("{{\"balance\": {}}}", balance.lock().unwrap())
+ }
+ "POST" => {
+ // Take characters after 'POST /' until whitespace is detected.
+ let input: String = buffer[6..16]
+ .iter()
+ .take_while(|x| **x != 32u8)
+ .map(|x| *x as char)
+ .collect();
+ let balance_update = input.parse::<f64>().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!")
+ }
+ };