diff options
| author | mo khan <mo@mokhan.ca> | 2025-05-29 15:30:52 -0600 |
|---|---|---|
| committer | mo khan <mo@mokhan.ca> | 2025-05-29 15:30:52 -0600 |
| commit | 11e1e3b25469c248985f469951c644ba83fa788d (patch) | |
| tree | e63ef3a3b3a938779a00da969f75f7832b31d026 | |
| parent | 01f56da2faccecd1081e6e1e2a4a9968ba91de99 (diff) | |
refactor: extract a server type
| -rw-r--r-- | src/main.rs | 59 |
1 files changed, 32 insertions, 27 deletions
diff --git a/src/main.rs b/src/main.rs index 993d72b..15e17ae 100644 --- a/src/main.rs +++ b/src/main.rs @@ -4,46 +4,51 @@ use std::io::prelude::*; use std::net::TcpListener; use std::net::TcpStream; -fn main() { - start_server("127.0.0.1:7878".to_string()) +pub struct Server { + bind: String, } -pub fn start_server(bind: String) { - let listener = TcpListener::bind(bind).unwrap(); - for next_stream in listener.incoming() { - handle(next_stream.unwrap()); +impl Server { + pub fn new(bind: String) -> Server { + Server { bind } } -} - -fn handle(mut stream: TcpStream) { - let io = BufReader::new(&stream); - let request_line = io.lines().next().unwrap().unwrap(); - let (status_line, filename) = match &request_line[..] { - "GET / HTTP/1.1" => ("HTTP/1.1 200 OK", "./public/index.html"), - "GET /.well-known/oauth-authorization-server HTTP/1.1" => { - ("HTTP/1.1 200 OK", "./public/metadata.json") + pub fn start(&self) { + let listener = TcpListener::bind(self.bind.clone()).unwrap(); + for next_stream in listener.incoming() { + self.handle(next_stream.unwrap()); } - _ => ("HTTP/1.1 404 NOT FOUND", "./public/404.html"), - }; + } + + pub fn handle(&self, mut stream: TcpStream) { + let io = BufReader::new(&stream); + let request_line = io.lines().next().unwrap().unwrap(); + + let (status_line, filename) = match &request_line[..] { + "GET / HTTP/1.1" => ("HTTP/1.1 200 OK", "./public/index.html"), + "GET /.well-known/oauth-authorization-server HTTP/1.1" => { + ("HTTP/1.1 200 OK", "./public/metadata.json") + } + _ => ("HTTP/1.1 404 NOT FOUND", "./public/404.html"), + }; - let contents = fs::read_to_string(filename).unwrap(); - let length = contents.len(); - let response = format!("{status_line}\r\nContent-Length: {length}\r\n\r\n{contents}"); + let contents = fs::read_to_string(filename).unwrap(); + let length = contents.len(); + let response = format!("{status_line}\r\nContent-Length: {length}\r\n\r\n{contents}"); - stream.write_all(response.as_bytes()).unwrap(); + stream.write_all(response.as_bytes()).unwrap(); + } +} + +fn main() { + let server = Server::new("127.0.0.1:7878".to_string()); + server.start() } #[cfg(test)] mod tests { - use crate::start_server; - use std::thread; - #[test] fn it_starts_a_server() { - // TODO:: figure out how to spawn a server in a background thread - // let server = thread::spawn(|| start_server("127.0.0.1:7878".to_string())); assert!(true); - // server.join().unwrap(); } } |
