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/lib.rs b/src/lib.rs index f13140c5dd..7637df207d 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -320,7 +320,7 @@ if_wasm! { mod wasm; mod util; - pub use self::wasm::{Body, Client, ClientBuilder, Request, RequestBuilder, Response}; + pub use self::wasm::{Body, Client, ClientBuilder, Request, RequestBuilder, RequestCredentials, Response}; #[cfg(feature = "multipart")] pub use self::wasm::multipart; } 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/mod.rs b/src/wasm/mod.rs index 249b4a2843..5294db3dd5 100644 --- a/src/wasm/mod.rs +++ b/src/wasm/mod.rs @@ -10,7 +10,7 @@ mod response; pub use self::body::Body; pub use self::client::{Client, ClientBuilder}; -pub use self::request::{Request, RequestBuilder}; +pub use self::request::{Request, RequestBuilder, RequestCredentials}; pub use self::response::Response; async fn promise(promise: js_sys::Promise) -> Result diff --git a/src/wasm/request.rs b/src/wasm/request.rs index 8cbb5629d0..0b99dce13b 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; +pub 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,22 @@ impl RequestBuilder { self } + /// Set fetch credentials + /// + /// # WASM + /// + /// This option is only effective with WebAssembly target. + /// + ///The [request credentials][mdn] will be set. + /// + ///[mdn]: https://developer.mozilla.org/zh-CN/docs/Web/API/Request/credentials + pub fn fetch_credentials(mut self, credentials: RequestCredentials) -> RequestBuilder { + if let Ok(ref mut req) = self.request { + req.credentials = credentials; + } + self + } + /// Build a `Request`, which can be inspected, modified and executed with /// `Client::execute()`. pub fn build(self) -> crate::Result { @@ -332,6 +351,7 @@ where headers, body: Some(body.into()), cors: true, + credentials: RequestCredentials::SameOrigin, }) } }