webserver/src/main.rs

57 lines
1.3 KiB
Rust
Raw Normal View History

2022-06-11 05:38:09 +02:00
use std::io::prelude::*;
use std::{fs, env};
use std::net::{TcpStream, TcpListener};
2022-06-04 19:22:41 +02:00
fn main() {
2022-06-05 20:45:19 +02:00
let args: Vec<String> = env::args().collect();
2022-06-04 19:22:41 +02:00
2022-06-05 20:45:19 +02:00
let host = if args.len() < 2 {
2022-06-11 05:38:09 +02:00
"127.0.0.1:55566"
2022-06-05 20:45:19 +02:00
} else {
&args[1]
};
println!("Starting server on {:?}...\n", &host);
let listener = TcpListener::bind(host).expect("Could not bind to address");
2022-06-04 19:22:41 +02:00
2022-06-05 20:45:19 +02:00
for stream in listener.incoming() {
if let Ok(stream) = stream {
handle_connection(stream);
}
else {
println!("Error with incoming stream: {}", stream.err().unwrap());
}
2022-06-04 19:22:41 +02:00
}
}
fn handle_connection(mut stream: TcpStream) {
2022-06-11 05:38:09 +02:00
let mut buffer = vec![0; 2048];
2022-06-04 19:22:41 +02:00
let size = stream.read(&mut buffer).unwrap();
2022-06-11 05:38:09 +02:00
buffer.resize(size, 0);
2022-06-05 20:45:19 +02:00
2022-06-11 05:38:09 +02:00
send_file(&mut stream, "src/main.rs");
2022-06-04 19:22:41 +02:00
2022-06-05 20:45:19 +02:00
let peer_addr = stream.peer_addr().unwrap();
2022-06-11 05:38:09 +02:00
println!("Received {} bytes from {}\n\n[{}]\n", size, peer_addr,
2022-06-04 19:22:41 +02:00
String::from_utf8_lossy(&buffer)
.escape_debug()
.collect::<String>()
.replace("\\r\\n", "\n")
.replace("\\n", "\n")
);
}
2022-06-11 05:38:09 +02:00
fn send_file(stream: &mut TcpStream, path: &str) {
let contents = fs::read_to_string(path).unwrap() + "\n\n";
let response = format!(
"HTTP/1.1 200 OK\nContent-Length: {}\n\n{}",
contents.len(),
contents
);
stream.write_all(response.as_bytes()).unwrap();
stream.flush().unwrap();
}