move to a modular design
This commit is contained in:
parent
d9e5170676
commit
d5d2233896
8 changed files with 184 additions and 58 deletions
14
src/main.rs
14
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() {
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
16
src/server/handler.rs
Normal file
16
src/server/handler.rs
Normal file
|
@ -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()));
|
||||
}
|
||||
}
|
30
src/server/mod.rs
Normal file
30
src/server/mod.rs
Normal file
|
@ -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();
|
||||
|
66
src/server/response.rs
Normal file
66
src/server/response.rs
Normal file
|
@ -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"
|
||||
),
|
||||
)
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue