From d5d223389698b361ed362721ee4f3a7ab8a110cb Mon Sep 17 00:00:00 2001 From: Jan Wolff Date: Fri, 15 May 2020 10:57:15 +0200 Subject: move to a modular design --- src/server/handler.rs | 16 ++++++++++++ src/server/mod.rs | 30 +++++++++++++++++++++++ src/server/response.rs | 66 ++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 112 insertions(+) create mode 100644 src/server/handler.rs create mode 100644 src/server/mod.rs create mode 100644 src/server/response.rs (limited to 'src/server') 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; +} + +pub struct TestHandler { +} + +impl Handler for TestHandler { + fn handle(&self, url : Url) -> Option { + 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>, +} + +impl Server { + pub fn new() -> Server { + Server{handlers: Vec::>::new()} + } +} + +pub fn register(host: &str, server: Server) { +//// servers.insert( +//// host.to_string(), +//// server, +//// ); +} + +pub fn handle(url: &Url) -> Vec { + return Vec::new(); +} + +//static mut servers : HashMap = 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, +} + +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) -> Response { + Response{ + header: header, + data: data, + } + } + + pub fn new_empty(header: Header) -> Response { + Response{ + header: header, + data: Vec::new(), + } + } + + pub fn format(&self) -> Vec { + let mut resp: Vec = 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" + ), + ) +} -- cgit v1.2.3