Code Dump

This commit is contained in:
zahkc 2024-11-27 23:07:40 +11:00
parent 4c6f42251d
commit 7b5f7c5d4b
9 changed files with 152 additions and 0 deletions

1
.gitignore vendored Normal file
View File

@ -0,0 +1 @@
/target

7
Cargo.lock generated Normal file
View File

@ -0,0 +1,7 @@
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
version = 3
[[package]]
name = "miniweb"
version = "0.1.0"

8
Cargo.toml Normal file
View File

@ -0,0 +1,8 @@
[package]
name = "miniweb"
version = "0.1.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]

View File

@ -1 +1,3 @@
# miniweb
A light weight rust web server I am working on for a bit of fun.
FOR EDUCATION PURPOSE ONLY, NOT RECCOMENDED FOR USE AT THIS TIME.

3
index.html Normal file
View File

@ -0,0 +1,3 @@
<html>
<h1>Hello World</h1>
</html>

59
src/main.rs Normal file
View File

@ -0,0 +1,59 @@
use std::net::{TcpListener, TcpStream};
use std::{println, io::{Read}};
// use std::time::Duration;
mod methods;
fn method_handler(mut stream: TcpStream) {
let mut packet = [0; 65535];
let bytes_read = stream.read(&mut packet[..]);
match bytes_read {
Ok(n) if n >= 7 => {
if packet[0..3] == [0x47, 0x45, 0x54] {
println!("GET Method");
methods::get::handler(stream, &packet);
} else if packet[0..4] == [0x48, 0x45, 0x41, 0x44] {
println!("HEAD Method");
} else if packet[0..6] == [0x4F, 0x50, 0x49, 0x4F, 0x4E, 0x53] {
println!("OPTIONS Method");
} else if packet[0..5] == [0x54, 0x52, 0x41, 0x43, 0x45] {
println!("TRACE Method");
} else if packet[0..3] == [0x50, 0x55, 0x54] {
println!("PUT Method");
} else if packet[0..6] == [0x44, 0x45, 0x4C, 0x45, 0x54, 0x45] {
println!("DELETE Method");
} else if packet[0..4] == [0x50, 0x4F, 0x53, 0x54] {
println!("POST Method");
} else if packet[0..5] == [0x50, 0x41, 0x54, 0x43, 0x48] {
println!("PATCH Method");
} else if packet[0..7] == [0x43, 0x4F, 0x4E, 0x4E, 0x45, 0x43, 0x54] {
println!("CONNECT method");
} else {
println!("Unknown Method");
}
},
Ok(_) => {
println!("Packet appears too small");
},
Err(_e) => {
println!("No data recieved");
}
}
}
fn main() {
let listener = TcpListener::bind("0.0.0.0:80").unwrap();
for stream in listener.incoming() {
match stream {
Ok(stream) => {
method_handler(stream);
}
Err(_e) => {
println!("Couldn't conenct to client...");
}
}
}
}

13
src/methods.rs Normal file
View File

@ -0,0 +1,13 @@
enum Methods{
GET,
// HEAD,
// OPTIONS,
// TRACE,
// PUT,
// DELETE,
// POST,
// PATCH,
// CONNECT,
}
pub mod get;

59
src/methods/get.rs Normal file
View File

@ -0,0 +1,59 @@
use std::net::TcpStream;
use std::io::{Write};
use super::Methods;
use std::fs;
struct Packet {
method: Methods,
path: String,
protocol_version: String,
}
pub fn handler(stream: TcpStream, binary_packet: &[u8]) {
let string_packet = String::from_utf8_lossy(&binary_packet);
let packet_breakdown: Vec<&str> = string_packet.lines().collect();
let mut header = packet_breakdown[0].split_whitespace();
let _ = header.next();
let this_packet = Packet {
method: Methods::GET,
path: String::from(header.next().unwrap_or("/")),
protocol_version: String::from(header.next().unwrap_or("/")),
};
println!("{}",string_packet);
response(stream, this_packet);
}
fn response(mut stream: TcpStream, this_packet: Packet){
let mut content = Vec::new();
let code = get_content(this_packet.path, &mut content);
match code{
200 => { stream.write(&content); },
404 => { stream.write("404 Page not found".as_bytes()); },
_ => println!("Unknown Error Code"),
};
}
fn get_content(path: String, content: &mut Vec<u8>) -> i32 {
let mut this_path = ".".to_string() + &path;
if this_path == "./" {
this_path = "./index.html".to_string();
}
let data = match fs::read(this_path) {
Ok(vec) => vec,
Err(e) => return 404
};
content.extend_from_slice(data.as_slice());
return 200;
}
// fn gen_header(){
//
// }

0
src/methods/test.html Normal file
View File