You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
55 lines
1.8 KiB
55 lines
1.8 KiB
use std::{
|
|
io::{prelude::*, BufReader},
|
|
net::{TcpListener, TcpStream},
|
|
str,
|
|
};
|
|
use rust_embed::RustEmbed;
|
|
|
|
#[derive(RustEmbed)]
|
|
#[folder = "./Articles"]
|
|
struct Asset;
|
|
|
|
fn main() {
|
|
let listener = TcpListener::bind("0.0.0.0:7878").unwrap();
|
|
|
|
for stream in listener.incoming() {
|
|
let stream = stream.unwrap();
|
|
|
|
handle_connection(stream);
|
|
}
|
|
}
|
|
|
|
fn handle_connection(mut stream: TcpStream) {
|
|
let buf_reader = BufReader::new(&mut stream);
|
|
let request_line = buf_reader.lines().next().unwrap().unwrap();
|
|
let mut content = "<html><head><strong>Error 404</strong><br /></head><body><img src=\"https://http.cat/404\"></img><br /><p>Not Found</p></body></html>";
|
|
let mut status_line = "HTTP/1.1 404 NOT FOUND";
|
|
let end = request_line.len()-9;
|
|
let keyword = &request_line[0..3];
|
|
let mut path = &request_line[5..end];
|
|
let version = &request_line[(end+1)..request_line.len()];
|
|
let page: rust_embed::EmbeddedFile;
|
|
if keyword == "GET" {
|
|
if version == "HTTP/1.1" || version == "HTTP/2.0" || version == "HTTP/1.0" {
|
|
if path == "" {
|
|
path = "index.html";
|
|
}
|
|
if Asset::iter().any(|x| x.as_ref().eq(path)) {
|
|
page = Asset::get(path).unwrap();
|
|
status_line = "HTTP/1.1 200 OK";
|
|
content = std::str::from_utf8(page.data.as_ref()).unwrap();
|
|
}
|
|
}else{
|
|
status_line = "HTTP/1.1 505 NOT IMPLEMENTED";
|
|
content = "<html><head><strong>Error 505</strong><br /></head><body><br /><p>HTTP Version Not Supported</p></body></html>";
|
|
}
|
|
}else{
|
|
status_line = "HTTP/1.1 501 Not Implemented";
|
|
content = "<html><head><strong>Error 501</strong><br /></head><body><img src=\"https://http.cat/501\"></img><br /><p>Not Implemented</p></body></html>";
|
|
}
|
|
let length = content.len();
|
|
let response = format!(
|
|
"{}\r\nContent-Length: {}\r\n\r\n{}"
|
|
, status_line, length, content);
|
|
stream.write_all(response.as_bytes());
|
|
}
|
|
|