@@ 40,6 40,11 @@ enum Request {
// HELPERS
+// Response headers MUST have a CRLF, so use a helper
+fn response_header<S: std::fmt::Display>(status: u8, meta: S) {
+ print!("{} {}\r\n", status, meta);
+}
+
fn base_url() -> String {
env::var("SCRIPT_NAME").unwrap()
}
@@ 121,7 126,7 @@ fn print_footer() {
fn create_page(db: sled::Db, page: &str) -> sled::Result<()> {
if !validate_page_name(page) {
- println!("59 Invalid page name");
+ response_header(59, "Invalid page name");
return Ok(());
}
@@ 153,7 158,7 @@ fn edit_page(db: sled::Db, page: &str, command: &str) -> sled::Result<()> {
let new_content: sled::IVec = match sed::sed(from_utf8(&old_content).unwrap(), command) {
Ok(edited) => edited.as_bytes().into(),
Err(e) => {
- println!("40 {}", e);
+ response_header(40, e);
return Ok(());
}
};
@@ 180,7 185,7 @@ fn revert_page(db: sled::Db, page: &str, version: &str) -> sled::Result<()> {
redirect_response(page, "");
}
None => {
- println!("51 Not found!");
+ response_header(51, "Not found!");
}
}
Ok(())
@@ 193,7 198,7 @@ fn page_response(page: &str, maybe_content: Option<sled::IVec>) {
Some(bytes) => match from_utf8(&bytes) {
Ok(content) => {
let url = absolute_url(page);
- println!("20 text/gemini");
+ response_header(20, "text/gemini");
if page != "" {
println!("# {}\n", page);
}
@@ 204,11 209,11 @@ fn page_response(page: &str, maybe_content: Option<sled::IVec>) {
print_footer();
}
Err(_) => {
- println!("40 Content is not valid UTF-8");
+ response_header(40, "Content is not valid UTF-8");
}
},
None => {
- println!("51 Not found");
+ response_header(51, "Not found");
}
}
}
@@ 216,7 221,7 @@ fn page_response(page: &str, maybe_content: Option<sled::IVec>) {
fn index_response(bytes: sled::IVec) {
match from_utf8(&bytes) {
Ok(content) => {
- println!("20 text/gemini");
+ response_header(20, "text/gemini");
println!("# Index of all pages in this wiki\n");
println!("=> {} (front page)", base_url());
content
@@ 225,27 230,27 @@ fn index_response(bytes: sled::IVec) {
print_footer();
}
Err(_) => {
- println!("40 Content is not valid UTF-8");
+ response_header(40, "Content is not valid UTF-8");
}
}
}
fn input_response(prompt: &str) {
- println!("10 {}", prompt);
+ response_header(10, prompt);
}
fn redirect_response(page: &str, subpath: &str) {
let url = absolute_url(page);
match subpath {
- "" => println!("30 {}", url),
- _ => println!("30 {}/{}", url, subpath),
+ "" => response_header(30, url),
+ _ => response_header(30, format!("30 {}/{}", url, subpath)),
}
}
fn history_response(db: sled::Db, page: &str) -> sled::Result<()> {
let page_edits = db.open_tree(format!("edits_{}", page))?;
- println!("20 text/gemini");
+ response_header(20, "text/gemini");
println!("# Page history: {}\n", page);
page_edits.iter().rev().for_each(|item| {
if let Ok((key, val)) = item {
@@ 269,7 274,7 @@ fn old_version_response(db: sled::Db, page: &str, ts: &str) -> sled::Result<()>
match page_history.get(ts)? {
Some(content) => {
let url = absolute_url(page);
- println!("20 text/gemini");
+ response_header(20, "text/gemini");
println!("=> {}/_history Page history", url);
println!("\n# {} (old version: {})", page, ts);
println!("\n{}", from_utf8(&content).unwrap());
@@ 278,7 283,7 @@ fn old_version_response(db: sled::Db, page: &str, ts: &str) -> sled::Result<()>
print_footer();
}
None => {
- println!("51 Not found!");
+ response_header(51, "Not found!");
}
}
Ok(())
@@ 286,7 291,7 @@ fn old_version_response(db: sled::Db, page: &str, ts: &str) -> sled::Result<()>
fn help_response() {
let content = include_str!("help.gemini");
- println!("20 text/gemini");
+ response_header(20, "text/gemini");
println!("{}", content);
print_footer();
}
@@ 306,7 311,7 @@ fn main() -> sled::Result<()> {
} else {
match percent_decode_str(&raw_query.to_string_lossy()).decode_utf8() {
Err(_) => {
- println!("59 Input is not valid UTF-8");
+ response_header(59, "Input is not valid UTF-8");
return Ok(());
}
Ok(cow) => Some(cow.into_owned()),