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.
 
 
 
shock/src/main.rs

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());
}