WASM: Add try_clone implementations to Request and RequestBuilder (#1286)
Currently the wasm client does not implement `try_clone` on `Request` or `RequestBuilder` like the blocking and async clients. This PR adds infallible `try_clone` implementations to the wasm client to improve the API parity. *Note*: Even though these APIs are infallible on wasm (no streaming bodies), I chose to keep the API identical.
This commit is contained in:
@@ -17,6 +17,7 @@ pub struct Body {
|
|||||||
inner: Inner,
|
inner: Inner,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Clone)]
|
||||||
enum Inner {
|
enum Inner {
|
||||||
Bytes(Bytes),
|
Bytes(Bytes),
|
||||||
#[cfg(feature = "multipart")]
|
#[cfg(feature = "multipart")]
|
||||||
@@ -56,6 +57,12 @@ impl Body {
|
|||||||
Inner::Multipart(form) => form.is_empty(),
|
Inner::Multipart(form) => form.is_empty(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub(crate) fn clone(&self) -> Body {
|
||||||
|
Self {
|
||||||
|
inner: self.inner.clone(),
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl From<Bytes> for Body {
|
impl From<Bytes> for Body {
|
||||||
|
|||||||
@@ -89,6 +89,21 @@ impl Request {
|
|||||||
pub fn body_mut(&mut self) -> &mut Option<Body> {
|
pub fn body_mut(&mut self) -> &mut Option<Body> {
|
||||||
&mut self.body
|
&mut self.body
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Attempts to clone the `Request`.
|
||||||
|
///
|
||||||
|
/// None is returned if a body is which can not be cloned. This method
|
||||||
|
/// currently always returns `Some`, but that may change in the future.
|
||||||
|
pub fn try_clone(&self) -> Option<Request> {
|
||||||
|
Some(Self {
|
||||||
|
method: self.method.clone(),
|
||||||
|
url: self.url.clone(),
|
||||||
|
headers: self.headers.clone(),
|
||||||
|
body: self.body.as_ref().map(|body| body.clone()),
|
||||||
|
cors: self.cors,
|
||||||
|
credentials: self.credentials.clone(),
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl RequestBuilder {
|
impl RequestBuilder {
|
||||||
@@ -335,6 +350,36 @@ impl RequestBuilder {
|
|||||||
let req = self.request?;
|
let req = self.request?;
|
||||||
self.client.execute_request(req).await
|
self.client.execute_request(req).await
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Attempt to clone the RequestBuilder.
|
||||||
|
///
|
||||||
|
/// `None` is returned if the RequestBuilder can not be cloned. This method
|
||||||
|
/// currently always returns `Some`, but that may change in the future.
|
||||||
|
///
|
||||||
|
/// # Examples
|
||||||
|
///
|
||||||
|
/// ```no_run
|
||||||
|
/// # use reqwest::Error;
|
||||||
|
/// #
|
||||||
|
/// # fn run() -> Result<(), Error> {
|
||||||
|
/// let client = reqwest::Client::new();
|
||||||
|
/// let builder = client.post("http://httpbin.org/post")
|
||||||
|
/// .body("from a &str!");
|
||||||
|
/// let clone = builder.try_clone();
|
||||||
|
/// assert!(clone.is_some());
|
||||||
|
/// # Ok(())
|
||||||
|
/// # }
|
||||||
|
/// ```
|
||||||
|
pub fn try_clone(&self) -> Option<RequestBuilder> {
|
||||||
|
self.request
|
||||||
|
.as_ref()
|
||||||
|
.ok()
|
||||||
|
.and_then(|req| req.try_clone())
|
||||||
|
.map(|req| RequestBuilder {
|
||||||
|
client: self.client.clone(),
|
||||||
|
request: Ok(req),
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl fmt::Debug for Request {
|
impl fmt::Debug for Request {
|
||||||
|
|||||||
Reference in New Issue
Block a user