use http1::*;
use http1::test::*;
use test::*;
macro_rules! setup {
() => ({
let (mut p, mut h) = http1_setup!();
assert_eos(
&mut p,
&mut h,
b"GET / HTTP/1.1\r\n",
ParserState::HeaderCr2,
b"GET / HTTP/1.1\r\n".len()
);
(p, h)
});
}
#[test]
fn allowed_alpha_lowercase() {
for b in alpha_lower_vec().iter() {
let (mut p, mut h) = setup!();
assert_eos(
&mut p,
&mut h,
&[*b],
ParserState::LowerHeaderName,
[*b].len()
);
assert_eos(
&mut p,
&mut h,
b":",
ParserState::StripHeaderValue,
b":".len()
);
assert_eq!(
h.header_name,
&[*b]
);
}
}
#[test]
fn allowed_alpha_uppercase() {
for b in alpha_upper_vec().iter() {
let (mut p, mut h) = setup!();
assert_eos(
&mut p,
&mut h,
&[*b],
ParserState::LowerHeaderName,
[*b].len()
);
assert_eos(
&mut p,
&mut h,
b":",
ParserState::StripHeaderValue,
b":".len()
);
assert_eq!(
h.header_name,
&[*b + 0x20]
);
}
}
#[test]
fn allowed_tokens_without_alpha() {
for b in token_vec().iter().filter(|&x| !is_alpha!(*x)) {
let (mut p, mut h) = setup!();
assert_eos(
&mut p,
&mut h,
&[*b],
ParserState::LowerHeaderName,
[*b].len()
);
assert_eos(
&mut p,
&mut h,
b":",
ParserState::StripHeaderValue,
b":".len()
);
assert_eq!(
h.header_name,
&[*b]
);
}
}
#[test]
fn entire_iter() {
let (mut p, mut h) = setup!();
iter_assert_eos(
&mut p,
&mut h,
&[(b'H', ParserState::LowerHeaderName),
(b'e', ParserState::LowerHeaderName),
(b'a', ParserState::LowerHeaderName),
(b'd', ParserState::LowerHeaderName),
(b'e', ParserState::LowerHeaderName),
(b'r', ParserState::LowerHeaderName),
(b':', ParserState::StripHeaderValue)]
);
assert_eq!(
h.header_name,
b"header"
);
}
#[test]
fn not_allowed_error() {
for b in non_token_vec().iter().filter(|&x| *x != b':') {
let (mut p, mut h) = setup!();
assert_eos(
&mut p,
&mut h,
b"X",
ParserState::LowerHeaderName,
b"X".len()
);
assert_error(
&mut p,
&mut h,
&[*b],
ParserError::HeaderName(*b)
);
}
}
#[test]
fn state_strip_header_value() {
let (mut p, mut h) = setup!();
iter_assert_eos(
&mut p,
&mut h,
&[(b'H', ParserState::LowerHeaderName),
(b':', ParserState::StripHeaderValue)]
);
}