diff --git a/Cargo.toml b/Cargo.toml index 5ffc0d6..d3335d0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "gemserv" -version = "0.1.1" +version = "0.2.0" authors = ["int 80h "] edition = "2018" diff --git a/config.toml b/config.toml index e7e8605..87f69e9 100644 --- a/config.toml +++ b/config.toml @@ -10,6 +10,9 @@ hostname = "example.com" dir = "/path/to/serv" key = "/path/to/key" cert = "/path/to/cert" +# index is optional but defaults to index.gemini. The server will serve files +# ending in gemini or gmi. +index = "index.gmi" # cgi dir is optional cgi = "/path/to/cgi-bin/" # cgienv is optional diff --git a/src/config.rs b/src/config.rs index 48bcffc..b4da1e1 100644 --- a/src/config.rs +++ b/src/config.rs @@ -17,6 +17,7 @@ pub struct Server { pub dir: String, pub key: String, pub cert: String, + pub index: Option, pub cgi: Option, pub cgienv: Option>, pub usrdir: Option, @@ -30,6 +31,7 @@ pub struct ServerCfg { pub dir: String, pub key: String, pub cert: String, + pub index: String, pub cgi: String, pub cgienv: HashMap, pub usrdir: bool, @@ -72,6 +74,10 @@ impl Config { Some(c) => cmap = c.clone(), None => {} }; + let index = match srv.index.to_owned() { + Some(i) => i, + None => "index.gemini".to_string() + }; map.insert( srv.hostname.clone(), @@ -80,6 +86,7 @@ impl Config { dir: srv.dir.clone(), key: srv.key.clone(), cert: srv.cert.clone(), + index: index.to_string(), cgi: cgi, cgienv: cmap.clone(), usrdir: usrdir, diff --git a/src/main.rs b/src/main.rs index e067574..d62a52e 100644 --- a/src/main.rs +++ b/src/main.rs @@ -34,11 +34,17 @@ fn get_mime(path: &PathBuf) -> String { Some(p) => p.to_str().unwrap(), None => return mime.to_string(), }; - if ext != "gemini" { - m = mime_guess::from_ext(ext).first().unwrap(); - mime = m.essence_str(); - } - mime.to_string() + + mime = match ext { + "gemini" => mime, + "gmi" => mime, + _ => { + m = mime_guess::from_ext(ext).first().unwrap(); + m.essence_str() + }, + }; + + return mime.to_string() } async fn get_binary(mut con: conn::Connection, path: PathBuf, meta: String) -> io::Result<()> { @@ -202,8 +208,8 @@ async fn handle_connection( .await?; return Ok(()); } - if path.join("index.gemini").exists() { - path.push("index.gemini"); + if path.join(&srv.index).exists() { + path.push(&srv.index); meta = fs::metadata(&path).expect("Unable to read metadata"); perm = meta.permissions(); if perm.mode() & 0o0444 != 0o444 { @@ -241,7 +247,7 @@ async fn handle_connection( return Ok(()); } let content = get_content(path, url)?; - con.send_body(status::Status::Success, Some(mime.as_str()), Some(content)) + con.send_body(status::Status::Success, Some(&mime), Some(content)) .await?; logger::logger(con.peer_addr, Status::Success, &request);