refactor(h1): in debug builds, assert payload known length matchs custom content-length headers
This commit is contained in:
		| @@ -241,7 +241,7 @@ where | ||||
|                         return Err(::Error::new_header()); | ||||
|                     } | ||||
|                     match msg.body { | ||||
|                         Some(BodyLength::Known(len)) => { | ||||
|                         Some(BodyLength::Known(known_len)) => { | ||||
|                             // The Payload claims to know a length, and | ||||
|                             // the headers are already set. For performance | ||||
|                             // reasons, we are just going to trust that | ||||
| @@ -249,7 +249,42 @@ where | ||||
|                             // | ||||
|                             // In debug builds, we'll assert they are the | ||||
|                             // same to help developers find bugs. | ||||
|                             encoder = Encoder::length(len); | ||||
|                             encoder = Encoder::length(known_len); | ||||
|  | ||||
|                             #[cfg(debug_assertions)] | ||||
|                             { | ||||
|                                 let mut folded = None::<(u64, HeaderValue)>; | ||||
|                                 for value in values { | ||||
|                                     if let Some(len) = headers::content_length_parse(&value) { | ||||
|                                         if let Some(fold) = folded { | ||||
|                                             if fold.0 != len { | ||||
|                                                 panic!("multiple Content-Length values found: [{}, {}]", fold.0, len); | ||||
|                                             } | ||||
|                                             folded = Some(fold); | ||||
|                                         } else { | ||||
|                                             folded = Some((len, value)); | ||||
|                                         } | ||||
|                                     } else { | ||||
|                                         panic!("illegal Content-Length value: {:?}", value); | ||||
|                                     } | ||||
|                                 } | ||||
|                                 if let Some((len, value)) = folded { | ||||
|                                     assert!( | ||||
|                                         len == known_len, | ||||
|                                         "payload claims content-length of {}, custom content-length header claims {}", | ||||
|                                         known_len, | ||||
|                                         len, | ||||
|                                     ); | ||||
|                                     extend(dst, b"content-length: "); | ||||
|                                     extend(dst, value.as_bytes()); | ||||
|                                     extend(dst, b"\r\n"); | ||||
|                                     wrote_len = true; | ||||
|                                     continue 'headers; | ||||
|                                 } else { | ||||
|                                     // No values in content-length... ignore? | ||||
|                                     continue 'headers; | ||||
|                                 } | ||||
|                             } | ||||
|                         }, | ||||
|                         Some(BodyLength::Unknown) => { | ||||
|                             // The Payload impl didn't know how long the | ||||
|   | ||||
		Reference in New Issue
	
	Block a user