fix(lib): properly handle body streaming errors
This commit is contained in:
		| @@ -1,3 +1,4 @@ | ||||
| use std::error::Error as StdError; | ||||
| use std::fmt; | ||||
| use std::usize; | ||||
| use std::io; | ||||
| @@ -97,7 +98,7 @@ impl Decoder { | ||||
|                     if num > *remaining { | ||||
|                         *remaining = 0; | ||||
|                     } else if num == 0 { | ||||
|                         return Err(io::Error::new(io::ErrorKind::Other, "early eof")); | ||||
|                         return Err(io::Error::new(io::ErrorKind::UnexpectedEof, IncompleteBody)); | ||||
|                     } else { | ||||
|                         *remaining -= num; | ||||
|                     } | ||||
| @@ -262,7 +263,7 @@ impl ChunkedState { | ||||
|  | ||||
|         if count == 0 { | ||||
|             *rem = 0; | ||||
|             return Err(io::Error::new(io::ErrorKind::UnexpectedEof, "early eof")); | ||||
|             return Err(io::Error::new(io::ErrorKind::UnexpectedEof, IncompleteBody)); | ||||
|         } | ||||
|         *buf = Some(slice); | ||||
|         *rem -= count as u64; | ||||
| @@ -300,9 +301,23 @@ impl ChunkedState { | ||||
|     } | ||||
| } | ||||
|  | ||||
| #[derive(Debug)] | ||||
| struct IncompleteBody; | ||||
|  | ||||
| impl fmt::Display for IncompleteBody { | ||||
|     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { | ||||
|         f.write_str(self.description()) | ||||
|     } | ||||
| } | ||||
|  | ||||
| impl StdError for IncompleteBody { | ||||
|     fn description(&self) -> &str { | ||||
|         "end of file before message length reached" | ||||
|     } | ||||
| } | ||||
|  | ||||
| #[cfg(test)] | ||||
| mod tests { | ||||
|     use std::error::Error; | ||||
|     use std::io; | ||||
|     use std::io::Write; | ||||
|     use super::Decoder; | ||||
| @@ -422,8 +437,7 @@ mod tests { | ||||
|         let mut decoder = Decoder::length(10); | ||||
|         assert_eq!(decoder.decode(&mut bytes).unwrap().unwrap().len(), 7); | ||||
|         let e = decoder.decode(&mut bytes).unwrap_err(); | ||||
|         assert_eq!(e.kind(), io::ErrorKind::Other); | ||||
|         assert_eq!(e.description(), "early eof"); | ||||
|         assert_eq!(e.kind(), io::ErrorKind::UnexpectedEof); | ||||
|     } | ||||
|  | ||||
|     #[test] | ||||
| @@ -436,7 +450,6 @@ mod tests { | ||||
|         assert_eq!(decoder.decode(&mut bytes).unwrap().unwrap().len(), 7); | ||||
|         let e = decoder.decode(&mut bytes).unwrap_err(); | ||||
|         assert_eq!(e.kind(), io::ErrorKind::UnexpectedEof); | ||||
|         assert_eq!(e.description(), "early eof"); | ||||
|     } | ||||
|  | ||||
|     #[test] | ||||
|   | ||||
		Reference in New Issue
	
	Block a user