]> piware.de Git - learn-rust.git/blob - tokio-tutorial-jbarszczewski/src/main.rs
57af76b2c9c46435d30fadb3c85671a2d29249ca
[learn-rust.git] / tokio-tutorial-jbarszczewski / src / main.rs
1 use std::str;
2
3 use tokio::io::{ AsyncReadExt, AsyncWriteExt };
4 use tokio::net::{TcpListener, TcpStream};
5
6 #[tokio::main]
7 async fn main() {
8     let listener = TcpListener::bind("127.0.0.1:8181").await.unwrap();
9
10     loop {
11         let (stream, _) = listener.accept().await.unwrap();
12         tokio::spawn(async move { handle_connection(stream).await });
13     }
14 }
15
16 async fn handle_connection(mut stream: TcpStream) {
17     // Read the first 16 characters from the incoming stream
18     let mut buffer = [0; 16];
19     assert!(stream.read(&mut buffer).await.unwrap() >= 16);
20     // First 4 characters are used to detect HTTP method
21     let method_type = match str::from_utf8(&buffer[0..4]) {
22         Ok(v) => v,
23         Err(e) => panic!("Invalid UTF-8 sequence: {}", e),
24     };
25
26     let contents = match method_type {
27         "GET " => {
28             // todo: return real balance
29             format!("{{\"balance\": {}}}", 0.0)
30         }
31         "POST" => {
32             // Take characters after 'POST /' until whitespace is detected.
33             let input: String = buffer[6..16]
34                 .iter()
35                 .take_while(|x| **x != 32u8)
36                 .map(|x| *x as char)
37                 .collect();
38             let balance_update = input.parse::<f32>().unwrap();
39             // todo: add balance update handling
40             format!("{{\"balance\": {}}}", balance_update)
41         }
42         _ => {
43             panic!("Invalid HTTP method!")
44         }
45     };
46
47     let response = format!(
48         "HTTP/1.1 200 OK\r\nContent-Type: application/json\r\nContent-Length: {}\r\n\r\n{}",
49         contents.len(),
50         contents
51     );
52     assert!(stream.write(response.as_bytes()).await.unwrap() > 0);
53     stream.flush().await.unwrap();
54 }