From: Martin Pitt Date: Fri, 3 Sep 2021 08:06:07 +0000 (+0200) Subject: simple-http: Parse path from request X-Git-Url: https://piware.de/gitweb/?a=commitdiff_plain;h=f95d7fa0bfdb818fbc8aada5cc4ab3c2aeea876c;p=learn-rust.git simple-http: Parse path from request --- diff --git a/simple-http/hello.html b/simple-http/hello.html deleted file mode 100644 index fe442d6..0000000 --- a/simple-http/hello.html +++ /dev/null @@ -1,11 +0,0 @@ - - - - - Hello! - - -

Hello!

-

Hi from Rust

- - diff --git a/simple-http/index.html b/simple-http/index.html new file mode 100644 index 0000000..fe442d6 --- /dev/null +++ b/simple-http/index.html @@ -0,0 +1,11 @@ + + + + + Hello! + + +

Hello!

+

Hi from Rust

+ + diff --git a/simple-http/src/main.rs b/simple-http/src/main.rs index 3036fcc..3316864 100644 --- a/simple-http/src/main.rs +++ b/simple-http/src/main.rs @@ -3,16 +3,41 @@ use std::io::prelude::*; use std::net::TcpListener; use std::net::TcpStream; use std::fs; +use std::str; fn handle_connection(mut stream: TcpStream) { let mut buffer = [0; 1024]; - let get_root = b"GET / HTTP/1.1\r\n"; stream.read(&mut buffer).unwrap(); - println!("Request: {}", String::from_utf8_lossy(&buffer[..])); - let (code, file) = if buffer.starts_with(get_root) { - ("200 OK", "hello.html") + let buffer = match str::from_utf8(&buffer[..]) { + Ok(s) => s, + Err(e) => { + eprintln!("Invalid non-UTF8 request: {}\n{}", e, String::from_utf8_lossy(&buffer[..])); + return; + } + }; + println!("Request: {}", buffer); + + let path; + + // simple web server, just interested in first line + if let Some(line) = buffer.lines().next() { + let request: Vec<_> = line.split_whitespace().collect(); + if request.len() != 3 || request[0] != "GET" || request[2] != "HTTP/1.1" { + stream.write(b"HTTP/1.1 501 NOT IMPLEMENTED\r\n").unwrap(); + stream.flush().unwrap(); + return; + } + + path = request[1]; + } else { + eprintln!("Ignoring empty request: {}", buffer); + return; + } + + let (code, file) = if path == "/" || path == "/index.html" { + ("200 OK", "index.html") } else { ("404 NOT FOUND", "404.html") };