diff --git a/src/header/mod.rs b/src/header/mod.rs index 10ec5d83..4281092c 100644 --- a/src/header/mod.rs +++ b/src/header/mod.rs @@ -10,7 +10,7 @@ use std::borrow::Cow::{Borrowed, Owned}; use std::fmt::{self, Show}; use std::intrinsics::TypeId; use std::raw::TraitObject; -use std::str::FromStr; +use std::str::{FromStr, from_utf8}; use std::string::CowString; use std::collections::HashMap; use std::collections::hash_map::{Iter, Entry}; @@ -439,7 +439,13 @@ impl fmt::Show for Item { None => match self.raw { Some(ref raw) => { for part in raw.iter() { - try!(write!(fmt, "{}", part.as_slice())); + match from_utf8(part[]) { + Ok(s) => try!(fmt.write_str(s)), + Err(e) => { + error!("raw header value is not utf8. header={}, error={}", part[], e); + return Err(fmt::Error); + } + } } Ok(()) }, @@ -646,6 +652,13 @@ mod tests { assert_eq!(s[], "Host: foo.bar\r\nContent-Length: 15\r\n"); } + #[test] + fn test_headers_show_raw() { + let headers = Headers::from_raw(&mut mem("Content-Length: 10\r\n\r\n")).unwrap(); + let s = headers.to_string(); + assert_eq!(s, "Content-Length: 10\r\n"); + } + #[test] fn test_set_raw() { let mut headers = Headers::new(); diff --git a/src/header/shared/quality_item.rs b/src/header/shared/quality_item.rs index 5272faac..04bad305 100644 --- a/src/header/shared/quality_item.rs +++ b/src/header/shared/quality_item.rs @@ -79,7 +79,7 @@ pub fn qitem(item: T) -> QualityItem { #[test] fn test_quality_item_show1() { let x = qitem(Chunked); - assert_eq!(format!("{}", x), "chunked; q=1.000"); + assert_eq!(format!("{}", x), "chunked; q=1"); } #[test] fn test_quality_item_show2() { @@ -93,7 +93,7 @@ fn test_quality_item_show3() { item: EncodingExt("identity".to_string()), quality: 0.5f32, }; - assert_eq!(format!("{}", x), "identity; q=0.500"); + assert_eq!(format!("{}", x), "identity; q=0.5"); } #[test]