diff --git a/ehttp/Cargo.toml b/ehttp/Cargo.toml index 38caf46..f150f72 100644 --- a/ehttp/Cargo.toml +++ b/ehttp/Cargo.toml @@ -74,6 +74,7 @@ web-sys = { version = "0.3.52", features = [ "Request", "RequestInit", "RequestMode", + "RequestCredentials", "Response", "Window", ] } diff --git a/ehttp/src/lib.rs b/ehttp/src/lib.rs index 550b96e..6e3d62d 100644 --- a/ehttp/src/lib.rs +++ b/ehttp/src/lib.rs @@ -77,6 +77,8 @@ pub use types::{Error, Headers, PartialResponse, Request, Response, Result}; #[cfg(target_arch = "wasm32")] pub use types::Mode; +#[cfg(target_arch = "wasm32")] +pub use types::Credentials; #[cfg(not(target_arch = "wasm32"))] mod native; diff --git a/ehttp/src/types.rs b/ehttp/src/types.rs index 86b4557..e9020d3 100644 --- a/ehttp/src/types.rs +++ b/ehttp/src/types.rs @@ -126,6 +126,35 @@ impl From for web_sys::RequestMode { } } +// ---------------------------------------------------------------------------- + +/// Determines whether or not the browser sends credentials with the request, as well as whether any Set-Cookie response headers are respected. +/// +/// Based on +#[derive(Default, Clone, Copy, Debug)] +pub enum Credentials { + /// Never send credentials in the request or include credentials in the response. + #[default] + Omit = 0, + + /// Only send and include credentials for same-origin requests. + SameOrigin = 1, + + /// Always include credentials, even for cross-origin requests. + Include = 2, +} + +#[cfg(target_arch = "wasm32")] +impl From for web_sys::RequestCredentials { + fn from(credentials: Credentials) -> Self { + match credentials { + Credentials::Omit => web_sys::RequestCredentials::Omit, + Credentials::SameOrigin => web_sys::RequestCredentials::SameOrigin, + Credentials::Include => web_sys::RequestCredentials::Include, + } + } +} + /// A simple HTTP request. #[derive(Clone, Debug)] pub struct Request { @@ -144,7 +173,14 @@ pub struct Request { /// Request mode used on fetch. /// /// Used on Web to control CORS. + #[cfg(target_arch = "wasm32")] pub mode: Mode, + + /// Credential options for fetch. + /// + /// Only applies to the web backend. + #[cfg(target_arch = "wasm32")] + pub credentials: Credentials, } impl Request { @@ -156,7 +192,10 @@ impl Request { url: url.to_string(), body: vec![], headers: Headers::new(&[("Accept", "*/*")]), + #[cfg(target_arch = "wasm32")] mode: Mode::default(), + #[cfg(target_arch = "wasm32")] + credentials: Credentials::default(), } } @@ -168,7 +207,10 @@ impl Request { url: url.to_string(), body: vec![], headers: Headers::new(&[("Accept", "*/*")]), + #[cfg(target_arch = "wasm32")] mode: Mode::default(), + #[cfg(target_arch = "wasm32")] + credentials: Credentials::default(), } } @@ -183,7 +225,10 @@ impl Request { ("Accept", "*/*"), ("Content-Type", "text/plain; charset=utf-8"), ]), + #[cfg(target_arch = "wasm32")] mode: Mode::default(), + #[cfg(target_arch = "wasm32")] + credentials: Credentials::default(), } } @@ -217,7 +262,10 @@ impl Request { url: url.to_string(), body: data, headers: Headers::new(&[("Accept", "*/*"), ("Content-Type", content_type.as_str())]), + #[cfg(target_arch = "wasm32")] mode: Mode::default(), + #[cfg(target_arch = "wasm32")] + credentials: Credentials::default(), } } @@ -233,7 +281,10 @@ impl Request { url: url.to_string(), body: serde_json::to_string(body)?.into_bytes(), headers: Headers::new(&[("Accept", "*/*"), ("Content-Type", "application/json")]), + #[cfg(target_arch = "wasm32")] mode: Mode::default(), + #[cfg(target_arch = "wasm32")] + credentials: Credentials::default(), }) } } diff --git a/ehttp/src/web.rs b/ehttp/src/web.rs index cb7d4c3..00ea3cf 100644 --- a/ehttp/src/web.rs +++ b/ehttp/src/web.rs @@ -43,6 +43,7 @@ pub(crate) async fn fetch_base(request: &Request) -> Result