~dancek/twinwiki

899d6c394002812f2dcbe314cb02153fa32eeef1 — Hannu Hartikainen 3 years ago 6172113
Use CRLF in response headers
1 files changed, 21 insertions(+), 16 deletions(-)

M src/main.rs
M src/main.rs => src/main.rs +21 -16
@@ 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()),