http_tiny 1.1.0

A simple, dependency-less HTTP-header builder and parser
Documentation
mod helpers;

use http_tiny::{ Header, error::ErrorKind };
use std::{ collections::BTreeMap, ops::Deref };


struct Test {
    raw: &'static [u8],
    method: &'static [u8],
    target: &'static [u8],
    fields: BTreeMap<Vec<u8>, Vec<u8>>
}
impl Test {
    fn test(self) {
        let header = Header::read(&mut helpers::source(self.raw)).expect("Failed to read header");
        assert_eq!(self.method, header.start_line().request_method());
        assert_eq!(self.target, header.start_line().request_target());
        assert_eq!(&self.fields, header.fields().deref());
    }
}
#[test]
fn test() {
    Test {
        raw: b"HEAD / HTTP/1.1\r\n\r\n",
        method: b"HEAD",
        target: b"/",
        fields: BTreeMap::new(),
    }.test();
    
    Test {
        raw: concat!(
            "POST /upl%C3%B6ad/form.php HTTP/1.1\r\n",
            "Host: www.heise.de\r\n",
            "User-Agent: http_tiny/0.3.0\r\n",
            "\r\n",
            "Test\r\nBODY\r\nolope"
        ).as_bytes(),
        method: b"POST",
        target: b"/upl%C3%B6ad/form.php",
        fields: helpers::map([
            ("host", "www.heise.de"),
            ("user-agent", "http_tiny/0.3.0")
        ])
    }.test();
}


#[derive(Debug)]
struct TestErr {
    data: &'static[u8],
    error: ErrorKind
}
impl TestErr {
    fn test(self) {
        let error = match Header::read(&mut helpers::source(self.data)) {
            Err(error) => error,
            Ok(header) => panic!("Unexpected `Ok` for header: {} ({:?})", String::from_utf8_lossy(self.data), header)
        };
        assert_eq!(&self.error, error.err(), "Unexpected error for header: {}", String::from_utf8_lossy(self.data));
    }
}
#[test]
fn test_err() {
    TestErr {
        data: b"HEAD / HTTP/1.1\r\n",
        error: ErrorKind::InvalidValue
    }.test();
    TestErr {
        data: b"\r\n\r\n",
        error: ErrorKind::InvalidValue
    }.test();
    TestErr {
        data: b"HEAD / \r\n\r\n",
        error: ErrorKind::InvalidValue
    }.test();
    
    TestErr {
        data: concat!(
            "HEAD / HTTP/1.1\r\n",
            "Host: www.heise.de\r\n",
            "User-Agent \r\n",
            "\r\n"
        ).as_bytes(),
        error: ErrorKind::InvalidValue
    }.test();
}