improve error messages from gzip decoder
This commit is contained in:
40
src/error.rs
40
src/error.rs
@@ -484,6 +484,18 @@ pub(crate) fn into_io(e: Error) -> io::Error {
|
||||
}
|
||||
}
|
||||
|
||||
pub(crate) fn from_io(e: io::Error) -> Error {
|
||||
if e.get_ref().map(|r| r.is::<Error>()).unwrap_or(false) {
|
||||
*e
|
||||
.into_inner()
|
||||
.expect("io::Error::get_ref was Some(_)")
|
||||
.downcast::<Error>()
|
||||
.expect("StdError::is() was true")
|
||||
} else {
|
||||
from(e)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
macro_rules! try_ {
|
||||
($e:expr) => (
|
||||
@@ -504,6 +516,20 @@ macro_rules! try_ {
|
||||
)
|
||||
}
|
||||
|
||||
macro_rules! try_io {
|
||||
($e:expr) => (
|
||||
match $e {
|
||||
Ok(v) => v,
|
||||
Err(ref err) if err.kind() == ::std::io::ErrorKind::WouldBlock => {
|
||||
return Ok(::futures::Async::NotReady);
|
||||
}
|
||||
Err(err) => {
|
||||
return Err(::error::from_io(err));
|
||||
}
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
pub(crate) fn loop_detected(url: Url) -> Error {
|
||||
Error::new(Kind::RedirectLoop, Some(url))
|
||||
}
|
||||
@@ -594,4 +620,18 @@ mod tests {
|
||||
use std::mem::size_of;
|
||||
assert_eq!(size_of::<Error>(), size_of::<usize>());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn roundtrip_io_error() {
|
||||
let orig = unknown_proxy_scheme();
|
||||
// Convert reqwest::Error into an io::Error...
|
||||
let io = into_io(orig);
|
||||
// Convert that io::Error back into a reqwest::Error...
|
||||
let err = from_io(io);
|
||||
// It should have pulled out the original, not nested it...
|
||||
match err.inner.kind {
|
||||
Kind::UnknownProxyScheme => (),
|
||||
_ => panic!("{:?}", err),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user