1use std::io;
2use std::net::TcpListener;
3use std::net::TcpStream;
4use std::thread;
5
6use rusty_http::Http;
7use rusty_http::Method;
8use rusty_http::Request;
9use rusty_http::Response;
10use rusty_http::StatusCode;
11
12fn say_hi(request: Request, response: Response) -> io::Result<()> {
13 if request.body.is_empty() {
14 response.status_code(StatusCode::BadRequest)
15 .set_header("Content-Type", "text/html").flush()?
16 .add_to_body("<h1>400 Bad Request</h1>")
17 .add_to_body("<p>No message was delivered via body</p>").flush()?;
18
19 return Ok(());
20 };
21
22 let content = format!("{{ \"message\": \"{}\" }}", request.body);
23
24 response.json(content)?;
25
26 Ok(())
27}
28
29fn not_found(request: Request, response: Response) -> io::Result<()> {
30 let content = format!("<p>Page '{}' could not been found</p>", request.uri);
31
32 response.status_code(StatusCode::NotFound)
33 .set_header("Content-Type", "text/html").flush()?
34 .add_to_body("<h1>404 Not Found</h1>")
35 .add_to_body(content).flush()?;
36
37 Ok(())
38}
39
40fn init_stream(stream: TcpStream) -> io::Result<()> {
41 let (request, response) = Http::from(stream)?;
42
43 match (&request.method, request.uri.as_str()) {
44 (Method::Post, "/say-hi") => say_hi(request, response)?,
45 _ => not_found(request, response)?
46 }
47
48 Ok(())
49}
50
51fn main() -> io::Result<()> {
52 let listener = TcpListener::bind("127.0.0.1:8080")?;
53
54 for stream in listener.incoming().filter_map(Result::ok) {
55 thread::spawn(|| init_stream(stream));
56 }
57
58 Ok(())
59}