Redesign Error type
- The `Error`'s kind is a now a set of variants depending on the context of when an error could occur. - If another error was the cause, it is now always the `source`. Along with the `is_*` methods, this should help in understanding *when* a certain error occurred. For example, an error setting the TLS certificates will return a builder error, with the TLS error as the source. This should help differentiate from a TLS error that happens when connecting to a server. It also makes the internal code less dependent on all the exact dependencies that can be enabled or disabled.
This commit is contained in:
@@ -154,11 +154,11 @@ impl Stream for ImplStream {
|
||||
} => {
|
||||
if let Some(ref mut timeout) = timeout {
|
||||
if let Poll::Ready(()) = Pin::new(timeout).poll(cx) {
|
||||
return Poll::Ready(Some(Err(crate::error::timedout(None))));
|
||||
return Poll::Ready(Some(Err(crate::error::body(crate::error::TimedOut))));
|
||||
}
|
||||
}
|
||||
futures_core::ready!(Pin::new(body).poll_data(cx))
|
||||
.map(|opt_chunk| opt_chunk.map(Into::into).map_err(crate::error::from))
|
||||
.map(|opt_chunk| opt_chunk.map(Into::into).map_err(crate::error::body))
|
||||
}
|
||||
Inner::Reusable(ref mut bytes) => {
|
||||
if bytes.is_empty() {
|
||||
|
||||
@@ -746,13 +746,17 @@ impl Future for PendingRequest {
|
||||
fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {
|
||||
if let Some(delay) = self.as_mut().timeout().as_mut().as_pin_mut() {
|
||||
if let Poll::Ready(()) = delay.poll(cx) {
|
||||
return Poll::Ready(Err(crate::error::timedout(Some(self.url.clone()))));
|
||||
return Poll::Ready(Err(
|
||||
crate::error::request(crate::error::TimedOut).with_url(self.url.clone())
|
||||
));
|
||||
}
|
||||
}
|
||||
|
||||
loop {
|
||||
let res = match self.as_mut().in_flight().as_mut().poll(cx) {
|
||||
Poll::Ready(Err(e)) => return Poll::Ready(url_error!(e, &self.url)),
|
||||
Poll::Ready(Err(e)) => {
|
||||
return Poll::Ready(Err(crate::error::request(e).with_url(self.url.clone())));
|
||||
}
|
||||
Poll::Ready(Ok(res)) => res,
|
||||
Poll::Pending => return Poll::Pending,
|
||||
};
|
||||
|
||||
@@ -137,14 +137,14 @@ impl Stream for Decoder {
|
||||
let new_value = match self.inner {
|
||||
Inner::Pending(ref mut future) => match Pin::new(future).poll(cx) {
|
||||
Poll::Ready(Ok(inner)) => inner,
|
||||
Poll::Ready(Err(e)) => return Poll::Ready(Some(Err(crate::error::from_io(e)))),
|
||||
Poll::Ready(Err(e)) => return Poll::Ready(Some(Err(crate::error::decode_io(e)))),
|
||||
Poll::Pending => return Poll::Pending,
|
||||
},
|
||||
Inner::PlainText(ref mut body) => return Pin::new(body).poll_next(cx),
|
||||
Inner::Gzip(ref mut decoder) => {
|
||||
return match futures_core::ready!(Pin::new(decoder).poll_next(cx)) {
|
||||
Some(Ok(bytes)) => Poll::Ready(Some(Ok(bytes))),
|
||||
Some(Err(err)) => Poll::Ready(Some(Err(crate::error::from_io(err)))),
|
||||
Some(Err(err)) => Poll::Ready(Some(Err(crate::error::decode_io(err)))),
|
||||
None => Poll::Ready(None),
|
||||
}
|
||||
}
|
||||
|
||||
@@ -203,7 +203,7 @@ impl Part {
|
||||
|
||||
/// Tries to set the mime of this part.
|
||||
pub fn mime_str(self, mime: &str) -> crate::Result<Part> {
|
||||
Ok(self.mime(mime.parse().map_err(crate::error::from)?))
|
||||
Ok(self.mime(mime.parse().map_err(crate::error::builder)?))
|
||||
}
|
||||
|
||||
// Re-export when mime 0.4 is available, with split MediaType/MediaRange.
|
||||
|
||||
@@ -111,9 +111,9 @@ impl RequestBuilder {
|
||||
Ok(value) => {
|
||||
req.headers_mut().append(key, value);
|
||||
}
|
||||
Err(e) => error = Some(crate::error::from(e.into())),
|
||||
Err(e) => error = Some(crate::error::builder(e.into())),
|
||||
},
|
||||
Err(e) => error = Some(crate::error::from(e.into())),
|
||||
Err(e) => error = Some(crate::error::builder(e.into())),
|
||||
};
|
||||
}
|
||||
if let Some(err) = error {
|
||||
@@ -250,7 +250,7 @@ impl RequestBuilder {
|
||||
let serializer = serde_urlencoded::Serializer::new(&mut pairs);
|
||||
|
||||
if let Err(err) = query.serialize(serializer) {
|
||||
error = Some(crate::error::from(err));
|
||||
error = Some(crate::error::builder(err));
|
||||
}
|
||||
}
|
||||
if let Ok(ref mut req) = self.request {
|
||||
@@ -276,7 +276,7 @@ impl RequestBuilder {
|
||||
);
|
||||
*req.body_mut() = Some(body.into());
|
||||
}
|
||||
Err(err) => error = Some(crate::error::from(err)),
|
||||
Err(err) => error = Some(crate::error::builder(err)),
|
||||
}
|
||||
}
|
||||
if let Some(err) = error {
|
||||
@@ -300,7 +300,7 @@ impl RequestBuilder {
|
||||
.insert(CONTENT_TYPE, HeaderValue::from_static("application/json"));
|
||||
*req.body_mut() = Some(body.into());
|
||||
}
|
||||
Err(err) => error = Some(crate::error::from(err)),
|
||||
Err(err) => error = Some(crate::error::builder(err)),
|
||||
}
|
||||
}
|
||||
if let Some(err) = error {
|
||||
|
||||
@@ -227,7 +227,7 @@ impl Response {
|
||||
pub async fn json<T: DeserializeOwned>(self) -> crate::Result<T> {
|
||||
let full = self.bytes().await?;
|
||||
|
||||
serde_json::from_slice(&full).map_err(crate::error::from)
|
||||
serde_json::from_slice(&full).map_err(crate::error::decode)
|
||||
}
|
||||
|
||||
/// Get the full response body as `Bytes`.
|
||||
|
||||
Reference in New Issue
Block a user