get underlying error
This commit is contained in:
@@ -102,6 +102,48 @@ impl Response {
|
|||||||
self.client_error() || self.server_error()
|
self.client_error() || self.server_error()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Tells if this response is "synthetic".
|
||||||
|
///
|
||||||
|
/// The [methods](struct.Request.html#method.call) [firing](struct.Request.html#method.send)
|
||||||
|
/// [off](struct.Request.html#method.send_str) [a request](struct.Request.html#method.send_json)
|
||||||
|
/// all return a `Response`; there is no rust style `Result`.
|
||||||
|
///
|
||||||
|
/// Rather than exposing a custom error type through results, this library has opted
|
||||||
|
/// for representing potential connection/TLS/etc errors as HTTP response codes.
|
||||||
|
/// These invented codes are called "synthetic".
|
||||||
|
///
|
||||||
|
/// The idea is that from a library user's point of view the distinction
|
||||||
|
/// of whether a failure originated in the remote server (500, 502) etc, or some transient
|
||||||
|
/// network failure, the code path of handling that would most often be the same.
|
||||||
|
///
|
||||||
|
/// The specific mapping of error to code can be seen in the (`Error`)[struct.Error.html].
|
||||||
|
///
|
||||||
|
/// However if the distinction is important, this method can be used to tell. Also see
|
||||||
|
/// [error()](struct.Response.html#method.synthetic_error) to see the actual underlying error.
|
||||||
|
///
|
||||||
|
/// ```
|
||||||
|
/// // scheme that this library doesn't understand
|
||||||
|
/// let resp = ureq::get("borkedscheme://www.google.com").call();
|
||||||
|
///
|
||||||
|
/// // it's an error
|
||||||
|
/// assert!(resp.error());
|
||||||
|
///
|
||||||
|
/// // synthetic error code 400
|
||||||
|
/// assert_eq!(*resp.status(), 400);
|
||||||
|
///
|
||||||
|
/// // tell that it's synthetic.
|
||||||
|
/// assert!(resp.synthetic());
|
||||||
|
/// ```
|
||||||
|
pub fn synthetic(&self) -> bool {
|
||||||
|
self.error.is_some()
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Get the actual underlying error when the response is
|
||||||
|
/// ["synthetic"](struct.Response.html#method.synthetic).
|
||||||
|
pub fn synthetic_error(&self) -> &Option<Error> {
|
||||||
|
&self.error
|
||||||
|
}
|
||||||
|
|
||||||
/// The content type part of the "Content-Type" header without
|
/// The content type part of the "Content-Type" header without
|
||||||
/// the charset.
|
/// the charset.
|
||||||
///
|
///
|
||||||
@@ -290,6 +332,7 @@ impl Response {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Ok(Response {
|
Ok(Response {
|
||||||
|
error: None,
|
||||||
status_line,
|
status_line,
|
||||||
index,
|
index,
|
||||||
status,
|
status,
|
||||||
@@ -347,7 +390,12 @@ impl FromStr for Response {
|
|||||||
|
|
||||||
impl Into<Response> for Error {
|
impl Into<Response> for Error {
|
||||||
fn into(self) -> Response {
|
fn into(self) -> Response {
|
||||||
Response::new(self.status(), self.status_text(), &self.body_text())
|
let status = self.status();
|
||||||
|
let status_text = self.status_text().to_string();
|
||||||
|
let body_text = self.body_text();
|
||||||
|
let mut resp = Response::new(status, &status_text, &body_text);
|
||||||
|
resp.error = Some(self);
|
||||||
|
resp
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user