fix(header): enable SetCookie.fmt_header when only 1 cookie

This commit is contained in:
Sean McArthur
2017-01-25 22:38:48 -08:00
parent 5f1fa06089
commit 53762cafc6
2 changed files with 16 additions and 7 deletions

View File

@@ -90,8 +90,13 @@ impl Header for SetCookie {
Err(::Error::Header) Err(::Error::Header)
} }
} }
fn fmt_header(&self, _f: &mut fmt::Formatter) -> fmt::Result {
panic!("SetCookie cannot be used with fmt_header, must use fmt_multi_header"); fn fmt_header(&self, f: &mut fmt::Formatter) -> fmt::Result {
if self.0.len() == 1 {
write!(f, "{}", &self.0[0])
} else {
panic!("SetCookie with multiple cookies cannot be used with fmt_header, must use fmt_multi_header");
}
} }

View File

@@ -601,28 +601,32 @@ impl<'a> FromIterator<HeaderView<'a>> for Headers {
impl<'a> fmt::Display for &'a (Header + Send + Sync) { impl<'a> fmt::Display for &'a (Header + Send + Sync) {
#[inline] #[inline]
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
(**self).fmt_header(f) let mut multi = MultilineFormatter(Multi::Join(true, f));
self.fmt_multi_header(&mut multi)
} }
} }
/// A wrapper around any Header with a Display impl that calls `fmt_header`. /// A wrapper around any Header with a Display impl that calls `fmt_header`.
/// ///
/// This can be used like so: `format!("{}", HeaderFormatter(&header))` to /// This can be used like so: `format!("{}", HeaderFormatter(&header))` to
/// get the representation of a Header which will be written to an /// get the 'value string' representation of this Header.
/// outgoing `TcpStream`. ///
/// Note: This may not necessarily be the value written to stream, such
/// as with the SetCookie header.
pub struct HeaderFormatter<'a, H: Header>(pub &'a H); pub struct HeaderFormatter<'a, H: Header>(pub &'a H);
impl<'a, H: Header> fmt::Display for HeaderFormatter<'a, H> { impl<'a, H: Header> fmt::Display for HeaderFormatter<'a, H> {
#[inline] #[inline]
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
self.0.fmt_header(f) let mut multi = MultilineFormatter(Multi::Join(true, f));
self.0.fmt_multi_header(&mut multi)
} }
} }
impl<'a, H: Header> fmt::Debug for HeaderFormatter<'a, H> { impl<'a, H: Header> fmt::Debug for HeaderFormatter<'a, H> {
#[inline] #[inline]
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
self.0.fmt_header(f) fmt::Display::fmt(self, f)
} }
} }