body/
body.rs

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}