initial commit

This commit is contained in:
Xory 2024-09-28 21:39:16 +03:00
commit 8ff1aca4de
5 changed files with 58 additions and 0 deletions

2
.gitignore vendored Normal file
View file

@ -0,0 +1,2 @@
/target
/Cargo.lock

6
Cargo.toml Normal file
View file

@ -0,0 +1,6 @@
[package]
name = "whitehole"
version = "0.1.0"
edition = "2021"
[dependencies]

6
README.md Normal file
View file

@ -0,0 +1,6 @@
# whitehole
A no-bullshit broccoli-like file hosting server.
## Usage
In development environment: `cargo r -- [targetdir]` where `[targetdir]` is the directory you want to host.
In production: `whitehole [targetdir]` where `[targetdir]` is the directory you want to host.

25
src/lib.rs Normal file
View file

@ -0,0 +1,25 @@
use std::path::Path;
use std::net::{TcpStream, Shutdown};
use std::io::{Read, Write};
use std::fs;
pub fn handle_client(mut connection: TcpStream, target_dir: &String) -> std::io::Result<()> {
let mut buffer = vec![0 as u8; 1024]; // Little bit of wiggle room.
connection.read(&mut buffer)?;
let header = String::from_utf8_lossy(&buffer).to_string();
println!("{header}");
if !header.starts_with("GET") {
connection.shutdown(Shutdown::Both)?;
println!("ion wanna hear it");
return Ok(())
}
let client_desired_file_path = format!("{}/{}", target_dir, &header.split(" ").collect::<Vec<&str>>()[1][1..]); // Your code is not optimised if it doesn't make an inexperienced rustdev have a heart attack.
dbg!(&client_desired_file_path);
// let file_size: usize = fs::metadata(client_desired_file_path)?.len().try_into().unwrap();
// let mut buffer = vec![0 as u8; file_size]; // Nuke the buffer.
let mut response: Vec<u8> = String::from("HTTP/1.1 200 OK").into_bytes();
let mut file_contents = fs::read(&client_desired_file_path)?;
response.append(&mut file_contents);
connection.write(&response)?;
Ok(())
}

19
src/main.rs Normal file
View file

@ -0,0 +1,19 @@
use std::net;
use std::path::Path;
use whitehole::handle_client;
fn main() -> std::io::Result<()> {
let args = &std::env::args().collect::<Vec<String>>()[1..];
let target_dir = Path::new(&args[0]);
if !target_dir.is_dir() {
panic!("Target is not a directory");
}
let listener = net::TcpListener::bind("0.0.0.0:23898")?; // Alphanumerical for "WHIH" or
// "Whitehole". No idea why I did
// this.
for connection in listener.incoming() {
handle_client(connection?, &args[0])?; // See lib.rs for handle_client()
}
Ok(())
}