use std::{
fs,
io::{Read, Write},
net::TcpStream,
};
use http_scrap::Response;
pub struct Render<'a> {
pub stream: &'a TcpStream,
pub error_page_path: String,
pub restrict_path: Option<&'a [&'a str]>,
}
impl<'a> Render<'a> {
pub fn new(mut stream: &'a TcpStream, error_page: &str) -> Self {
Render {
stream,
error_page_path: (error_page).to_string(),
restrict_path: None,
}
}
pub fn resitrict_path(&mut self, path: &'a [&'a str]) -> Self {
self.restrict_path = Some(path);
Render {
stream: self.stream,
error_page_path: self.error_page_path.clone(),
restrict_path: self.restrict_path,
}
}
pub fn read_page(&mut self) {
let mut buffer = [0; 1024];
let resitrict_path = self.restrict_path.unwrap();
let len = self.restrict_path.unwrap().len();
self.stream.read(&mut buffer);
let response = String::from_utf8_lossy(&buffer);
let response = Response::new(&response);
let path = response.path();
if !path.starts_with("/api") && !path.starts_with("favicon") {
let file_path = format!("/src/app/{}/page.tsx", response.path());
let path = fs::read_to_string(file_path);
match path {
Ok(path) => {
let path = format!(
"HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nContent-Length: {}\r\n\r\n{}",
path.len(),
path
);
self.stream.write_all(path.as_bytes());
self.stream.flush();
}
Err(_) => {
let path = fs::read_to_string("static/page.html");
let page = match path {
Ok(err) => {
let path = format!(
"HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nContent-Length: {}\r\n\r\n{}",
err.len(),
err
);
self.stream.write_all(path.as_bytes());
self.stream.flush();
}
Err(err) => {
let file = format!("<!DOCTYPE html><html lang='en'><head><meta charset='UTF-8' /><meta name='viewport' content='width=device-width, initial-scale=1.0' /><title>404 - Page Not Found</title><style>body {{font-family: Arial, sans-serif;background-color: #f0f0f0;text-align: center;padding: 50px;}}h1 {{font-size: 50px;color: #333;}}p {{font-size: 18px;color: #666;}}a {{color: #007bff;text-decoration: none;}}a:hover {{text-decoration: underline;}}</style></head><body><h1>404</h1><p>Oops! The page you're looking for doesn't exist.</p><p><a href='/'>Go back to the homepage</a></p></body></html>");
let response = format!(
"HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nContent-Length: {}\r\n\r\n{}",
file.len(),
file
);
self.stream.write_all(response.as_bytes());
self.stream.flush();
}
};
}
}
}
}
}