feat(header): introduce header::Raw (#869)
The Raw type repesents the raw bytes of a header-value. Having a special type allows a couple of benefits: - The exact representation has become private, allowing "uglier" internals. Specifically, since the common case is for a header to only have 1 line of bytes, an enum is used to skip allocating a Vec for only 1 line. Additionally, a Cow<'static, [u8]> is used, so static bytes don't require a copy. Finally, since we can use static bytes, when parsing, we can compare the incoming bytes against a couple of the most common header-values, and possibly remove another copy. - As its own type, the `Headers.set_raw` method can be generic over `Into<Raw>`, which allows for more ergnomic method calls. BREAKING CHANGE: `Header::parse_header` now receives `&Raw`, instead of a `&[Vec<u8>]`. `Raw` provides several methods to ease using it, but may require some changes to existing code.
This commit is contained in:
		| @@ -67,10 +67,10 @@ mod tests { | ||||
|     fn test_if_none_match() { | ||||
|         let mut if_none_match: ::Result<IfNoneMatch>; | ||||
|  | ||||
|         if_none_match = Header::parse_header([b"*".to_vec()].as_ref()); | ||||
|         if_none_match = Header::parse_header(&b"*".as_ref().into()); | ||||
|         assert_eq!(if_none_match.ok(), Some(IfNoneMatch::Any)); | ||||
|  | ||||
|         if_none_match = Header::parse_header([b"\"foobar\", W/\"weak-etag\"".to_vec()].as_ref()); | ||||
|         if_none_match = Header::parse_header(&b"\"foobar\", W/\"weak-etag\"".as_ref().into()); | ||||
|         let mut entities: Vec<EntityTag> = Vec::new(); | ||||
|         let foobar_etag = EntityTag::new(false, "foobar".to_owned()); | ||||
|         let weak_etag = EntityTag::new(true, "weak-etag".to_owned()); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user