perf(headers): skip newline replacer for safe headers
This commit is contained in:
@@ -66,7 +66,7 @@ impl Header for ContentLength {
|
||||
|
||||
#[inline]
|
||||
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, "Content-Type") => [Mime]
|
||||
(ContentType, "Content-Type") => danger [Mime]
|
||||
|
||||
test_content_type {
|
||||
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
|
||||
($(#[$a:meta])*($id:ident, $n:expr) => Cow[$value:ty]) => {
|
||||
$(#[$a])*
|
||||
@@ -383,6 +411,14 @@ macro_rules! header {
|
||||
|
||||
__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)*}) => {
|
||||
header! {
|
||||
$(#[$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);
|
||||
|
||||
Reference in New Issue
Block a user