diff --git a/Cargo.toml b/Cargo.toml index 3ea71e73e7..a897052369 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -162,6 +162,7 @@ features = [ "Blob", "BlobPropertyBag", "ServiceWorkerGlobalScope", + "RequestCredentials" ] [target.'cfg(target_arch = "wasm32")'.dev-dependencies] diff --git a/src/wasm/client.rs b/src/wasm/client.rs index 1741d576a6..86ea040125 100644 --- a/src/wasm/client.rs +++ b/src/wasm/client.rs @@ -207,6 +207,8 @@ async fn fetch(req: Request) -> crate::Result { init.mode(web_sys::RequestMode::NoCors); } + init.credentials(req.credentials); + if let Some(body) = req.body() { if !body.is_empty() { init.body(Some(&body.to_js_value()?.as_ref().as_ref())); diff --git a/src/wasm/request.rs b/src/wasm/request.rs index 8cbb5629d0..fa5fe5e769 100644 --- a/src/wasm/request.rs +++ b/src/wasm/request.rs @@ -7,6 +7,7 @@ use serde::Serialize; use serde_json; use serde_urlencoded; use url::Url; +use web_sys::RequestCredentials; use super::{Body, Client, Response}; use crate::header::{HeaderMap, HeaderName, HeaderValue, CONTENT_TYPE}; @@ -18,6 +19,7 @@ pub struct Request { headers: HeaderMap, body: Option, pub(super) cors: bool, + pub(super) credentials: RequestCredentials, } /// A builder to construct the properties of a `Request`. @@ -36,6 +38,7 @@ impl Request { headers: HeaderMap::new(), body: None, cors: true, + credentials: RequestCredentials::SameOrigin, } } @@ -254,6 +257,54 @@ impl RequestBuilder { self } + /// Set fetch credentials to 'same-origin' + /// + /// # WASM + /// + /// This option is only effective with WebAssembly target. + /// + /// The [request credentials][mdn] will be set to 'same-origin'. + /// + /// [mdn]: https://developer.mozilla.org/zh-CN/docs/Web/API/Request/credentials + pub fn fetch_credentials_same_origin(mut self) -> RequestBuilder { + if let Ok(ref mut req) = self.request { + req.credentials = RequestCredentials::SameOrigin; + } + self + } + + /// Set fetch credentials to 'include' + /// + /// # WASM + /// + /// This option is only effective with WebAssembly target. + /// + /// The [request credentials][mdn] will be set to 'include'. + /// + /// [mdn]: https://developer.mozilla.org/zh-CN/docs/Web/API/Request/credentials + pub fn fetch_credentials_include(mut self) -> RequestBuilder { + if let Ok(ref mut req) = self.request { + req.credentials = RequestCredentials::Include; + } + self + } + + /// Set fetch credentials to 'omit' + /// + /// # WASM + /// + /// This option is only effective with WebAssembly target. + /// + /// The [request credentials][mdn] will be set to 'omit'. + /// + /// [mdn]: https://developer.mozilla.org/zh-CN/docs/Web/API/Request/credentials + pub fn fetch_credentials_imit(mut self) -> RequestBuilder { + if let Ok(ref mut req) = self.request { + req.credentials = RequestCredentials::Omit; + } + self + } + /// Build a `Request`, which can be inspected, modified and executed with /// `Client::execute()`. pub fn build(self) -> crate::Result { @@ -332,6 +383,7 @@ where headers, body: Some(body.into()), cors: true, + credentials: RequestCredentials::SameOrigin, }) } }