ohkami_lib 0.24.9

internal library for Ohkami - A performant, declarative, and runtime-flexible web framework for Rust
Documentation
use super::File;
use super::parse::{Multipart, Part};

#[test]
fn parse_single() {
    const BOUNDARY: &str = "AaB03x";

    let case = format!(
        "\
        --{BOUNDARY}\r\n\
        Content-Disposition: form-data; name=\"user-name\"\r\n\
        \r\n\
        Joe Blow\r\n\
        --{BOUNDARY}--"
    );
    assert_eq!(
        Multipart::parse(case.as_bytes()).unwrap(),
        Multipart(vec![Part::Text {
            name: "user-name",
            text: "Joe Blow"
        },])
    );

    let case = format!(
        "\
        --{BOUNDARY}\r\n\
        Content-Disposition: form-data; name=\"files\"; filename=\"test.md\"\r\n\
        content-type: text/markdown\r\n\
        \r\n\
        # Why ohkami\n\
        \n\
        `ohkami` is a newbee Rust web framework with features:\n\
        \n\
        - (...TODO...)\n\
        \r\n--{BOUNDARY}--"
    );
    assert_eq!(
        Multipart::parse(case.as_bytes()).unwrap(),
        Multipart(vec![Part::File {
            name: "files",
            file: File {
                filename: "test.md",
                mimetype: "text/markdown",
                content: "\
                        # Why ohkami\n\
                        \n\
                        `ohkami` is a newbee Rust web framework with features:\n\
                        \n\
                        - (...TODO...)\n"
                    .as_bytes(),
            }
        },])
    );
}

#[test]
fn parse_multiple_in_one_name_one_item() {
    const BOUNDARY: &str = "Bbax09y";

    let case = format!(
        "\
        --{BOUNDARY}\r\n\
        Content-Disposition: form-data; name=\"user-name\"\r\n\
        \r\n\
        Mr. admin\r\n\
        (hmm...)\r\n\
        --{BOUNDARY}\r\n\
        content-type: text/html\r\n\
        CONTENT-DISPOSITION: form-data; name=\"template\"; filename=\"index.html\"\r\n\
        \r\n\
        <!DOCTYPE html>\n\
        <html lang=\"en-US\">\n\
        <head>\n\
        <title>Document</title>\n\
        </head>\n\
        <body>\n\
        <p>Hello, this is a test case!</p>\n\
        </body>\n\
        </html>\
        \r\n--{BOUNDARY}--"
    );
    assert_eq!(
        Multipart::parse(case.as_bytes()).unwrap(),
        Multipart(vec![
            Part::Text {
                name: "user-name",
                text: "Mr. admin\r\n(hmm...)",
            },
            Part::File {
                name: "template",
                file: File {
                    filename: "index.html",
                    mimetype: "text/html",
                    content: "\
                    <!DOCTYPE html>\n\
                    <html lang=\"en-US\">\n\
                    <head>\n\
                    <title>Document</title>\n\
                    </head>\n\
                    <body>\n\
                    <p>Hello, this is a test case!</p>\n\
                    </body>\n\
                    </html>"
                        .as_bytes(),
                },
            },
        ])
    );
}

#[test]
fn parse_multiple() {
    const BOUNDARY: &str = "Bbax09y";

    let case = format!(
        "\
        --{BOUNDARY}\r\n\
        Content-Disposition: form-data; name=\"user-name\"\r\n\
        \r\n\
        Mr. admin\r\n\
        (hmm...)\r\n\
        --{BOUNDARY}\r\n\
        content-type: text/html\r\n\
        CONTENT-DISPOSITION: form-data; name=\"templates\"; filename=\"index.html\"\r\n\
        \r\n\
        <!DOCTYPE html>\n\
        <html lang=\"en-US\">\n\
        <head>\n\
        <title>Document</title>\n\
        </head>\n\
        <body>\n\
        <p>Hello, this is a test case!</p>\n\
        </body>\n\
        </html>\r\n\
        --{BOUNDARY}\r\n\
        Content-Disposition: form-data; name=\"templates\"; filename=\"home.html\"\r\n\
        Content-Type: text/html\r\n\
        \r\n\
        <!DOCTYPE html>\n\
        <html lang=\"en-US\">\n\
        <head>\n\
        <style>\n\
        h1 {{\n\
        color: red;\n\
        }}\n\
        </style>\n\
        <title>Home</title>\n\
        </head>\n\
        <body>\n\
        <h1>This is HOME page.</h1>\n\
        </body>\n\
        </html>\n\
        \r\n\
        --{BOUNDARY}\r\n\
        Content-Type: unknown/some-binary\r\n\
        Content-Disposition: form-data; name=\"binary_sample\"; filename=\"x.bin\"\r\n\
        Something-Unknown-Header: unknown-header-value\r\n\
        \r\n\
        \r\u{0}\r\u{0}\n0123xyz\u{11}\r\n\u{10}\rabc\r\n\
        --{BOUNDARY}--"
    );
    assert_eq!(
        Multipart::parse(case.as_bytes()).unwrap(),
        Multipart(vec![
            Part::Text {
                name: "user-name",
                text: "Mr. admin\r\n(hmm...)",
            },
            Part::File {
                name: "templates",
                file: File {
                    filename: "index.html",
                    mimetype: "text/html",
                    content: "\
                    <!DOCTYPE html>\n\
                    <html lang=\"en-US\">\n\
                    <head>\n\
                    <title>Document</title>\n\
                    </head>\n\
                    <body>\n\
                    <p>Hello, this is a test case!</p>\n\
                    </body>\n\
                    </html>"
                        .as_bytes()
                },
            },
            Part::File {
                name: "templates",
                file: File {
                    filename: "home.html",
                    mimetype: "text/html",
                    content: "\
                    <!DOCTYPE html>\n\
                    <html lang=\"en-US\">\n\
                    <head>\n\
                    <style>\n\
                    h1 {\n\
                    color: red;\n\
                    }\n\
                    </style>\n\
                    <title>Home</title>\n\
                    </head>\n\
                    <body>\n\
                    <h1>This is HOME page.</h1>\n\
                    </body>\n\
                    </html>\n"
                        .as_bytes(),
                },
            },
            Part::File {
                name: "binary_sample",
                file: File {
                    filename: "x.bin",
                    mimetype: "unknown/some-binary",
                    content: "\r\u{0}\r\u{0}\n0123xyz\u{11}\r\n\u{10}\rabc".as_bytes(),
                },
            },
        ])
    );
}