Add URL API to Error
Adds `without_url`, `with_url`, and `url_mut` to `Error`. Closes #297
This commit is contained in:
		
							
								
								
									
										49
									
								
								src/error.rs
									
									
									
									
									
								
							
							
						
						
									
										49
									
								
								src/error.rs
									
									
									
									
									
								
							| @@ -9,6 +9,10 @@ use crate::{StatusCode, Url}; | |||||||
| pub type Result<T> = std::result::Result<T, Error>; | pub type Result<T> = std::result::Result<T, Error>; | ||||||
|  |  | ||||||
| /// The Errors that may occur when processing a `Request`. | /// The Errors that may occur when processing a `Request`. | ||||||
|  | /// | ||||||
|  | /// Note: Errors may include the full URL used to make the `Request`. If the URL | ||||||
|  | /// contains sensitive information (e.g. an API key as a query parameter), be | ||||||
|  | /// sure to remove it ([`without_url`](Error::without_url)) | ||||||
| pub struct Error { | pub struct Error { | ||||||
|     inner: Box<Inner>, |     inner: Box<Inner>, | ||||||
| } | } | ||||||
| @@ -56,6 +60,28 @@ impl Error { | |||||||
|         self.inner.url.as_ref() |         self.inner.url.as_ref() | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     /// Returns a mutable referene to the URL related to this error | ||||||
|  |     /// | ||||||
|  |     /// This is useful if you need to remove sensitive information from the URL | ||||||
|  |     /// (e.g. an API key in the query), but do not want to remove the URL | ||||||
|  |     /// entirely. | ||||||
|  |     pub fn url_mut(&mut self) -> Option<&mut Url> { | ||||||
|  |         self.inner.url.as_mut() | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /// Add a url related to this error (overwriting any existing) | ||||||
|  |     pub fn with_url(mut self, url: Url) -> Self { | ||||||
|  |         self.inner.url = Some(url); | ||||||
|  |         self | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /// Strip the related url from this error (if, for example, it contains | ||||||
|  |     /// sensitive information) | ||||||
|  |     pub fn without_url(mut self) -> Self { | ||||||
|  |         self.inner.url = None; | ||||||
|  |         self | ||||||
|  |     } | ||||||
|  |  | ||||||
|     /// Returns true if the error is from a type Builder. |     /// Returns true if the error is from a type Builder. | ||||||
|     pub fn is_builder(&self) -> bool { |     pub fn is_builder(&self) -> bool { | ||||||
|         matches!(self.inner.kind, Kind::Builder) |         matches!(self.inner.kind, Kind::Builder) | ||||||
| @@ -128,11 +154,6 @@ impl Error { | |||||||
|  |  | ||||||
|     // private |     // private | ||||||
|  |  | ||||||
|     pub(crate) fn with_url(mut self, url: Url) -> Error { |  | ||||||
|         self.inner.url = Some(url); |  | ||||||
|         self |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     #[allow(unused)] |     #[allow(unused)] | ||||||
|     pub(crate) fn into_io(self) -> io::Error { |     pub(crate) fn into_io(self) -> io::Error { | ||||||
|         io::Error::new(io::ErrorKind::Other, self) |         io::Error::new(io::ErrorKind::Other, self) | ||||||
| @@ -158,18 +179,6 @@ impl fmt::Debug for Error { | |||||||
|  |  | ||||||
| impl fmt::Display for Error { | impl fmt::Display for Error { | ||||||
|     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { |     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { | ||||||
|         struct ForUrl<'a>(Option<&'a Url>); |  | ||||||
|  |  | ||||||
|         impl fmt::Display for ForUrl<'_> { |  | ||||||
|             fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { |  | ||||||
|                 if let Some(url) = self.0 { |  | ||||||
|                     write!(f, " for url ({})", url.as_str()) |  | ||||||
|                 } else { |  | ||||||
|                     Ok(()) |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         match self.inner.kind { |         match self.inner.kind { | ||||||
|             Kind::Builder => f.write_str("builder error")?, |             Kind::Builder => f.write_str("builder error")?, | ||||||
|             Kind::Request => f.write_str("error sending request")?, |             Kind::Request => f.write_str("error sending request")?, | ||||||
| @@ -187,9 +196,11 @@ impl fmt::Display for Error { | |||||||
|             } |             } | ||||||
|         }; |         }; | ||||||
|  |  | ||||||
|         ForUrl(self.inner.url.as_ref()).fmt(f)?; |         if let Some(url) = &self.inner.url { | ||||||
|  |             write!(f, " for url ({})", url.as_str())?; | ||||||
|  |         } | ||||||
|  |  | ||||||
|         if let Some(ref e) = self.inner.source { |         if let Some(e) = &self.inner.source { | ||||||
|             write!(f, ": {}", e)?; |             write!(f, ": {}", e)?; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user