diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/main.rs | 14 | ||||
| -rw-r--r-- | src/response.rs | 50 | ||||
| -rw-r--r-- | src/server/handler.rs | 16 | ||||
| -rw-r--r-- | src/server/mod.rs | 30 | ||||
| -rw-r--r-- | src/server/response.rs | 66 |
5 files changed, 121 insertions, 55 deletions
diff --git a/src/main.rs b/src/main.rs index 8181b92..ab50c02 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,8 +1,9 @@ -use openssl::ssl::{SslMethod, SslAcceptor, SslStream, SslFiletype}; use std::net::{TcpListener, TcpStream, SocketAddr}; use std::sync::Arc; use std::thread; -mod response; +use openssl::ssl::{SslMethod, SslAcceptor, SslStream, SslFiletype}; +use url::Url; +mod server; fn build_acceptor() -> std::sync::Arc<SslAcceptor> { let mut acceptor = SslAcceptor::mozilla_intermediate_v5(SslMethod::tls()).unwrap(); @@ -12,15 +13,18 @@ fn build_acceptor() -> std::sync::Arc<SslAcceptor> { return Arc::new(acceptor.build()); } +fn build_server() { +} + fn handle_client(mut stream: SslStream<TcpStream>) { let mut buffer = [0; 1026]; stream.ssl_read(&mut buffer); let request = String::from_utf8(buffer.to_vec()).unwrap(); + let url = Url::parse(&request).unwrap(); - let header = response::Header::new(response::Status::Success, "text/gemini".to_string()); - let response = response::Response::new(header, [].to_vec()); + let data = server::handle(&url); - stream.ssl_write(&response.format()); + stream.ssl_write(&data); } fn main() { diff --git a/src/response.rs b/src/response.rs deleted file mode 100644 index 521cad7..0000000 --- a/src/response.rs +++ /dev/null @@ -1,50 +0,0 @@ -use std::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: std::vec::Vec<u8>, -} - -impl Header { - pub fn new(status: Status, meta: String) -> Header { - return Header{ - status: status, - meta: meta, - } - } - - 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: std::vec::Vec<u8>) -> Response { - return Response{ - header: header, - data: data, - } - } - - pub fn format(&self) -> std::vec::Vec<u8> { - let mut resp: std::vec::Vec<u8> = self.header.format().as_bytes().to_vec(); - resp.extend(&self.data); - return resp; - } -} 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" + ), + ) +} |
