diff options
| author | Jan Wolff <janw@mailbox.org> | 2020-05-15 10:57:15 +0200 |
|---|---|---|
| committer | Jan Wolff <janw@mailbox.org> | 2020-05-15 10:57:15 +0200 |
| commit | d5d223389698b361ed362721ee4f3a7ab8a110cb (patch) | |
| tree | df440ed62cbc007022ae702e747721356624040b /src/server | |
| parent | d9e51706768dcb11ef32f4a2d5fd9161e1e92fed (diff) | |
move to a modular design
Diffstat (limited to 'src/server')
| -rw-r--r-- | src/server/handler.rs | 16 | ||||
| -rw-r--r-- | src/server/mod.rs | 30 | ||||
| -rw-r--r-- | src/server/response.rs | 66 |
3 files changed, 112 insertions, 0 deletions
diff --git a/src/server/handler.rs b/src/server/handler.rs new file mode 100644 index 0000000..ec4193d --- /dev/null +++ b/src/server/handler.rs @@ -0,0 +1,16 @@ +use url::Url; +use crate::server::response::{Status, Header, Response}; + +pub trait Handler { + fn handle(&self, url : Url) -> Option<Response>; +} + +pub struct TestHandler { +} + +impl Handler for TestHandler { + fn handle(&self, url : Url) -> Option<Response> { + let header = Header::new(Status::Success, "text/gemini"); + return Some(Response::new(header, Vec::new())); + } +} diff --git a/src/server/mod.rs b/src/server/mod.rs new file mode 100644 index 0000000..01a686d --- /dev/null +++ b/src/server/mod.rs @@ -0,0 +1,30 @@ +use std::vec::Vec; +use std::collections::HashMap; +use url::Url; + +mod handler; +mod response; + +pub struct Server { + handlers: Vec<Box<dyn handler::Handler>>, +} + +impl Server { + pub fn new() -> Server { + Server{handlers: Vec::<Box<dyn handler::Handler>>::new()} + } +} + +pub fn register(host: &str, server: Server) { +//// servers.insert( +//// host.to_string(), +//// server, +//// ); +} + +pub fn handle(url: &Url) -> Vec<u8> { + return Vec::new(); +} + +//static mut servers : HashMap<String, Server> = HashMap::new(); + diff --git a/src/server/response.rs b/src/server/response.rs new file mode 100644 index 0000000..f2df722 --- /dev/null +++ b/src/server/response.rs @@ -0,0 +1,66 @@ +use std::vec::Vec; + +#[derive(Copy, Clone)] +pub enum Status { + Input = 1, + Success = 2, + Redirect = 3, + TemporaryFailure = 4, + PermanentFailure = 5, + ClientCertificateRequired = 6, +} + +pub struct Header { + status: Status, + meta: String, +} + +pub struct Response { + header: Header, + data: Vec<u8>, +} + +impl Header { + pub fn new(status: Status, meta: &str) -> Header { + Header{ + status: status, + meta: meta.to_string(), + } + } + + pub fn format(&self) -> String { + let status: u8 = self.status as u8; + return format!("{} {}\r\n", status * 10, self.meta) + } +} + +impl Response { + pub fn new(header: Header, data: Vec<u8>) -> Response { + Response{ + header: header, + data: data, + } + } + + pub fn new_empty(header: Header) -> Response { + Response{ + header: header, + data: Vec::new(), + } + } + + pub fn format(&self) -> Vec<u8> { + let mut resp: Vec<u8> = self.header.format().as_bytes().to_vec(); + resp.extend(&self.data); + return resp; + } +} + +pub fn invalid_protocol () -> Response { + Response::new_empty( + Header::new( + Status::PermanentFailure, + "this protocol is not supported" + ), + ) +} |
