http_parser 0.0.2

Http request/response parser for rust
Documentation
extern crate http_parser;

use self::http_parser::{HttpParser, HttpParserCallback, HttpParserType,
                        HttpErrno};

pub mod helper;

const HEADER_LINE : &'static str = "header-key: header-value\r\n";

#[test]
fn test_request_header() {
    test_header(HttpParserType::Request);
}

#[test]
fn test_request_header_overflow() {
    test_header_overflow(HttpParserType::Request);
}

#[test]
fn test_response_header() {
    test_header(HttpParserType::Response);
}

#[test]
fn test_response_header_overflow() {
    test_header_overflow(HttpParserType::Response);
}

fn test_header(tp : HttpParserType) {
    let mut hp : HttpParser = HttpParser::new(tp);
    let mut cb = helper::CallbackEmpty;

    before(&mut hp, &mut cb, tp);

    let parsed: usize = hp.execute(&mut cb, HEADER_LINE.as_bytes());
    assert_eq!(parsed, HEADER_LINE.len());
}

fn test_header_overflow(tp: HttpParserType) {
    let mut hp : HttpParser = HttpParser::new(tp);
    let mut cb = helper::CallbackEmpty;

    before(&mut hp, &mut cb, tp);

    let len : usize = HEADER_LINE.len();
    let mut done = false;

    while !done {
        let parsed = hp.execute(&mut cb, HEADER_LINE.as_bytes());
        if parsed != len {
            assert!(hp.errno == Option::Some(HttpErrno::HeaderOverflow));
            done = true;
        }
    }
    assert!(done);
}

fn before<CB: HttpParserCallback>(hp : &mut HttpParser, cb : &mut CB, tp : HttpParserType) {
    let line = if tp == HttpParserType::Request {
        "GET / HTTP/1.1\r\n"
    } else {
        "HTTP/1.0 200 OK\r\n"
    };
    let parsed : usize = hp.execute(cb, line.as_bytes());
    assert_eq!(parsed, line.len());
}