diff --git a/src/header/common/set_cookie.rs b/src/header/common/set_cookie.rs index ad0f7689..fc6ceff1 100644 --- a/src/header/common/set_cookie.rs +++ b/src/header/common/set_cookie.rs @@ -90,8 +90,13 @@ impl Header for SetCookie { 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"); + } } diff --git a/src/header/mod.rs b/src/header/mod.rs index d56716f1..c5d73266 100644 --- a/src/header/mod.rs +++ b/src/header/mod.rs @@ -601,28 +601,32 @@ impl<'a> FromIterator> for Headers { impl<'a> fmt::Display for &'a (Header + Send + Sync) { #[inline] 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`. /// /// This can be used like so: `format!("{}", HeaderFormatter(&header))` to -/// get the representation of a Header which will be written to an -/// outgoing `TcpStream`. +/// get the 'value string' representation of this Header. +/// +/// 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); impl<'a, H: Header> fmt::Display for HeaderFormatter<'a, H> { #[inline] 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> { #[inline] fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - self.0.fmt_header(f) + fmt::Display::fmt(self, f) } }