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