feat: basic routing done

This commit is contained in:
2025-01-17 12:41:27 +01:00
parent db210a2c4e
commit 0723c2411d
3 changed files with 27 additions and 8 deletions

View File

@@ -11,8 +11,10 @@
- [ ] Transversal utility
- [ ] Let programmer set the default not found response
- [x] Manage basic defaults app and route headers
- [ ] Manage route specific headers
- [x] Manage route specific headers
- [ ] Allow middleware
- [ ] Middleware to redirect or block petitions
- [ ] Middleware to insert headers and data
- [ ] Study how to organize functions on structs or types if possible
## Improvements

View File

@@ -1,4 +1,5 @@
use std::collections::HashMap;
use std::fs;
use std::io::prelude::*;
use std::net::{SocketAddr, TcpListener, TcpStream};
@@ -8,7 +9,7 @@ impl Default for HttpAppConfig {
fn default() -> Self {
Self {
port: 3000,
max_buffer_size_bytes: 5120,
max_request_size_bytes: 5120,
}
}
}
@@ -23,12 +24,26 @@ impl Default for HttpApp<'_> {
}
}
impl HttpAppRouteResponse<'_> {
pub fn from_url(url: &str) -> Self {
let response_body = fs::read_to_string(url).unwrap();
Self {
body: response_body,
content_type: "text/html; charset=utf-8",
status: 200,
headers: HashMap::new(),
}
}
}
impl HttpApp<'_> {
fn get_route(&self, _path: &str) -> Option<&HttpAppRoute> {
self.routes.first() // TODO: search the real one
fn get_route(&self, path: &str) -> Option<&HttpAppRoute> {
// self.routes.first() // TODO: search the real one
self.routes.iter().find(|&route| route.route.eq(path))
}
pub fn add_route(&mut self, route: HttpAppRoute) {
// TODO: check if already exists
self.routes.push(route);
}
@@ -56,7 +71,10 @@ impl HttpApp<'_> {
break;
}
}
if petition.bytes().len() > self.config.max_buffer_size_bytes {
// FIXME: this does not cover marginal cases: bigger buffer than max_buffer
if self.config.max_request_size_bytes > 0
&& petition.bytes().len() > self.config.max_request_size_bytes
{
break;
}
}
@@ -65,14 +83,13 @@ impl HttpApp<'_> {
match petition {
Ok(petition_parsed) => {
// let mut response_content = fs::read_to_string("./routes/index.html").unwrap();
if let Some(route) = self.get_route(petition_parsed.request.query.path) {
let matched_route = (route.action)(petition_parsed);
return format_response(matched_route);
} else {
// TODO: return not found
return ProcessedResponse {
data: "".to_string(),
data: "Error 404".to_string(),
status: 400,
};
}

View File

@@ -5,7 +5,7 @@ use std::collections::HashMap;
* */
pub struct HttpAppConfig {
pub port: u16,
pub max_buffer_size_bytes: usize,
pub max_request_size_bytes: usize, // 0 to not max
}
pub type HttpAppRouteFunction = Box<fn(HttpRequest) -> HttpAppRouteResponse>;