A bunch of work

This commit is contained in:
Carl Lerche
2017-06-16 21:45:44 -07:00
parent f6fd6a6d6e
commit b4c3161d74
3 changed files with 183 additions and 54 deletions

View File

@@ -7,9 +7,9 @@ use bytes::Bytes;
/// HTTP/2.0 Header
#[derive(Debug, Clone, Eq, PartialEq)]
pub enum Header {
pub enum Header<T = HeaderName> {
Field {
name: HeaderName,
name: T,
value: HeaderValue,
},
Authority(ByteStr),
@@ -35,6 +35,22 @@ pub fn len(name: &HeaderName, value: &HeaderValue) -> usize {
32 + n.len() + value.len()
}
impl Header<Option<HeaderName>> {
pub fn reify(self) -> Result<Header, HeaderValue> {
use self::Header::*;
Ok(match self {
Field { name: Some(n), value } => Field { name: n, value: value },
Field { name: None, value } => return Err(value),
Authority(v) => Authority(v),
Method(v) => Method(v),
Scheme(v) => Scheme(v),
Path(v) => Path(v),
Status(v) => Status(v),
})
}
}
impl Header {
pub fn new(name: Bytes, value: Bytes) -> Result<Header, DecoderError> {
if name[0] == b':' {
@@ -191,6 +207,20 @@ impl Header {
}
}
// Mostly for tests
impl From<Header> for Header<Option<HeaderName>> {
fn from(src: Header) -> Self {
match src {
Header::Field { name, value } => Header::Field { name: Some(name), value },
Header::Authority(v) => Header::Authority(v),
Header::Method(v) => Header::Method(v),
Header::Scheme(v) => Header::Scheme(v),
Header::Path(v) => Header::Path(v),
Header::Status(v) => Header::Status(v),
}
}
}
impl<'a> Name<'a> {
pub fn into_entry(self, value: Bytes) -> Result<Header, DecoderError> {
match self {