perf(headers): skip newline replacer for safe headers
This commit is contained in:
@@ -66,7 +66,7 @@ impl Header for ContentLength {
|
|||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn fmt_header(&self, f: &mut ::header::Formatter) -> fmt::Result {
|
fn fmt_header(&self, f: &mut ::header::Formatter) -> fmt::Result {
|
||||||
f.fmt_line(self)
|
f.danger_fmt_line_without_newline_replacer(self)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -45,7 +45,7 @@ header! {
|
|||||||
/// ContentType(mime::TEXT_HTML)
|
/// ContentType(mime::TEXT_HTML)
|
||||||
/// );
|
/// );
|
||||||
/// ```
|
/// ```
|
||||||
(ContentType, "Content-Type") => [Mime]
|
(ContentType, "Content-Type") => danger [Mime]
|
||||||
|
|
||||||
test_content_type {
|
test_content_type {
|
||||||
test_header!(
|
test_header!(
|
||||||
|
|||||||
@@ -275,6 +275,34 @@ macro_rules! header {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
// Single value header (internal)
|
||||||
|
($(#[$a:meta])*($id:ident, $n:expr) => danger [$value:ty]) => {
|
||||||
|
$(#[$a])*
|
||||||
|
#[derive(Clone, Debug, PartialEq)]
|
||||||
|
pub struct $id(pub $value);
|
||||||
|
__hyper__deref!($id => $value);
|
||||||
|
impl $crate::header::Header for $id {
|
||||||
|
#[inline]
|
||||||
|
fn header_name() -> &'static str {
|
||||||
|
static NAME: &'static str = $n;
|
||||||
|
NAME
|
||||||
|
}
|
||||||
|
#[inline]
|
||||||
|
fn parse_header(raw: &$crate::header::Raw) -> $crate::Result<Self> {
|
||||||
|
$crate::header::parsing::from_one_raw_str(raw).map($id)
|
||||||
|
}
|
||||||
|
#[inline]
|
||||||
|
fn fmt_header(&self, f: &mut $crate::header::Formatter) -> ::std::fmt::Result {
|
||||||
|
f.danger_fmt_line_without_newline_replacer(self)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
impl ::std::fmt::Display for $id {
|
||||||
|
#[inline]
|
||||||
|
fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
|
||||||
|
::std::fmt::Display::fmt(&self.0, f)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
// Single value cow header
|
// Single value cow header
|
||||||
($(#[$a:meta])*($id:ident, $n:expr) => Cow[$value:ty]) => {
|
($(#[$a:meta])*($id:ident, $n:expr) => Cow[$value:ty]) => {
|
||||||
$(#[$a])*
|
$(#[$a])*
|
||||||
@@ -383,6 +411,14 @@ macro_rules! header {
|
|||||||
|
|
||||||
__hyper__tm! { $id, $tm { $($tf)* }}
|
__hyper__tm! { $id, $tm { $($tf)* }}
|
||||||
};
|
};
|
||||||
|
($(#[$a:meta])*($id:ident, $n:expr) => danger [$item:ty] $tm:ident{$($tf:item)*}) => {
|
||||||
|
header! {
|
||||||
|
$(#[$a])*
|
||||||
|
($id, $n) => danger [$item]
|
||||||
|
}
|
||||||
|
|
||||||
|
__hyper__tm! { $id, $tm { $($tf)* }}
|
||||||
|
};
|
||||||
($(#[$a:meta])*($id:ident, $n:expr) => Cow[$item:ty] $tm:ident{$($tf:item)*}) => {
|
($(#[$a:meta])*($id:ident, $n:expr) => Cow[$item:ty] $tm:ident{$($tf:item)*}) => {
|
||||||
header! {
|
header! {
|
||||||
$(#[$a])*
|
$(#[$a])*
|
||||||
|
|||||||
@@ -224,6 +224,32 @@ impl<'a, 'b> Formatter<'a, 'b> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn danger_fmt_line_without_newline_replacer<T: fmt::Display>(&mut self, line: &T) -> fmt::Result {
|
||||||
|
use std::fmt::Write;
|
||||||
|
match self.0 {
|
||||||
|
Multi::Line(name, ref mut f) => {
|
||||||
|
try!(f.write_str(name));
|
||||||
|
try!(f.write_str(": "));
|
||||||
|
try!(fmt::Display::fmt(line, f));
|
||||||
|
f.write_str("\r\n")
|
||||||
|
},
|
||||||
|
Multi::Join(ref mut first, ref mut f) => {
|
||||||
|
if !*first {
|
||||||
|
try!(f.write_str(", "));
|
||||||
|
} else {
|
||||||
|
*first = false;
|
||||||
|
}
|
||||||
|
fmt::Display::fmt(line, f)
|
||||||
|
}
|
||||||
|
Multi::Raw(ref mut raw) => {
|
||||||
|
let mut s = String::new();
|
||||||
|
try!(write!(s, "{}", line));
|
||||||
|
raw.push(s);
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
struct ValueString<'a>(&'a Item);
|
struct ValueString<'a>(&'a Item);
|
||||||
|
|||||||
Reference in New Issue
Block a user