diff --git a/Cargo.lock b/Cargo.lock index 1605494..16afa08 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -408,9 +408,9 @@ checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" [[package]] name = "base64" -version = "0.21.5" +version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35636a1494ede3b646cc98f74f8e62c773a38a659ebc777a2cf26b9b74171df9" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" [[package]] name = "bitflags" @@ -852,6 +852,7 @@ dependencies = [ "js-sys", "mime", "mime_guess", + "native-tls", "rand", "serde", "serde_json", @@ -1573,6 +1574,23 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "native-tls" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8614eb2c83d59d1c8cc974dd3f920198647674a0a035e1af1fa58707e317466" +dependencies = [ + "libc", + "log", + "openssl", + "openssl-probe", + "openssl-sys", + "schannel", + "security-framework", + "security-framework-sys", + "tempfile", +] + [[package]] name = "ndk" version = "0.7.0" @@ -1778,6 +1796,50 @@ version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" +[[package]] +name = "openssl" +version = "0.10.66" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9529f4786b70a3e8c61e11179af17ab6188ad8d0ded78c5529441ed39d4bd9c1" +dependencies = [ + "bitflags 2.4.1", + "cfg-if", + "foreign-types", + "libc", + "once_cell", + "openssl-macros", + "openssl-sys", +] + +[[package]] +name = "openssl-macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.43", +] + +[[package]] +name = "openssl-probe" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" + +[[package]] +name = "openssl-sys" +version = "0.9.103" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f9e8deee91df40a943c71b917e5874b951d32a802526c85721ce3b776c929d6" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] + [[package]] name = "orbclient" version = "0.3.47" @@ -2036,20 +2098,6 @@ version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" -[[package]] -name = "ring" -version = "0.17.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "688c63d65483050968b2a8937f7995f443e27041a0f7700aa59b0822aedebb74" -dependencies = [ - "cc", - "getrandom", - "libc", - "spin", - "untrusted", - "windows-sys 0.48.0", -] - [[package]] name = "rustix" version = "0.37.27" @@ -2077,28 +2125,6 @@ dependencies = [ "windows-sys 0.52.0", ] -[[package]] -name = "rustls" -version = "0.21.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9d5a6813c0759e4609cd494e8e725babae6a2ca7b62a5536a13daaec6fcb7ba" -dependencies = [ - "log", - "ring", - "rustls-webpki", - "sct", -] - -[[package]] -name = "rustls-webpki" -version = "0.101.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" -dependencies = [ - "ring", - "untrusted", -] - [[package]] name = "ryu" version = "1.0.16" @@ -2114,6 +2140,15 @@ dependencies = [ "winapi-util", ] +[[package]] +name = "schannel" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534" +dependencies = [ + "windows-sys 0.52.0", +] + [[package]] name = "scoped-tls" version = "1.0.1" @@ -2126,16 +2161,6 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" -[[package]] -name = "sct" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" -dependencies = [ - "ring", - "untrusted", -] - [[package]] name = "sctk-adwaita" version = "0.5.4" @@ -2149,6 +2174,29 @@ dependencies = [ "tiny-skia", ] +[[package]] +name = "security-framework" +version = "2.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "770452e37cad93e0a50d5abc3990d2bc351c36d0328f86cefec2f2fb206eaef6" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75da29fe9b9b08fe9d6b22b5b4bcbc75d8db3aa31e639aa56bb62e9d46bfceaf" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "serde" version = "1.0.193" @@ -2280,12 +2328,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "spin" -version = "0.9.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" - [[package]] name = "static_assertions" version = "1.1.0" @@ -2509,26 +2551,17 @@ dependencies = [ "tinyvec", ] -[[package]] -name = "untrusted" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" - [[package]] name = "ureq" -version = "2.9.1" +version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8cdd25c339e200129fe4de81451814e5228c9b771d57378817d6117cc2b3f97" +checksum = "72139d247e5f97a3eff96229a7ae85ead5328a39efe76f8bf5a06313d505b6ea" dependencies = [ "base64", - "flate2", "log", + "native-tls", "once_cell", - "rustls", - "rustls-webpki", "url", - "webpki-roots", ] [[package]] @@ -2542,6 +2575,12 @@ dependencies = [ "percent-encoding", ] +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + [[package]] name = "vec_map" version = "0.8.2" @@ -2777,12 +2816,6 @@ dependencies = [ "web-sys", ] -[[package]] -name = "webpki-roots" -version = "0.25.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1778a42e8b3b90bff8d0f5032bf22250792889a5cdc752aa0020c84abe3aaf10" - [[package]] name = "winapi" version = "0.3.9" diff --git a/ehttp/Cargo.toml b/ehttp/Cargo.toml index 38caf46..c6cf4c0 100644 --- a/ehttp/Cargo.toml +++ b/ehttp/Cargo.toml @@ -49,9 +49,9 @@ serde_json = { version = "1.0", optional = true } # For compiling natively: [target.'cfg(not(target_arch = "wasm32"))'.dependencies] -# ureq = { version = "2.0", default-features = false, features = ["gzip", "tls_native_certs"] } -ureq = "2.0" +ureq = { version = "2.0", default-features = false, features = ["native-tls"] } async-channel = { version = "2.0", optional = true } +native-tls = "0.2.12" # For compiling to web: [target.'cfg(target_arch = "wasm32")'.dependencies] diff --git a/ehttp/src/native.rs b/ehttp/src/native.rs index b0c9e1e..8cd1d68 100644 --- a/ehttp/src/native.rs +++ b/ehttp/src/native.rs @@ -1,4 +1,5 @@ use crate::{Request, Response}; +use std::sync::Arc; #[cfg(feature = "native-async")] use async_channel::{Receiver, Sender}; @@ -23,7 +24,18 @@ use async_channel::{Receiver, Sender}; /// * A browser extension blocked the request (e.g. ad blocker) /// * … pub fn fetch_blocking(request: &Request) -> crate::Result { - let mut req = ureq::request(&request.method, &request.url); + let tls_connector = Arc::new( + native_tls::TlsConnector::builder() + .danger_accept_invalid_hostnames(request.danger_accept_invalid_hostnames) + .danger_accept_invalid_certs(request.danger_accept_invalid_certs) + .build() + .unwrap(), + ); + + let mut req = ureq::builder() + .tls_connector(tls_connector) + .build() + .request(&request.method, &request.url); for (k, v) in &request.headers { req = req.set(k, v); diff --git a/ehttp/src/streaming/native.rs b/ehttp/src/streaming/native.rs index b26c4c6..96e9368 100644 --- a/ehttp/src/streaming/native.rs +++ b/ehttp/src/streaming/native.rs @@ -1,4 +1,5 @@ use std::ops::ControlFlow; +use std::sync::Arc; use crate::Request; @@ -9,7 +10,18 @@ pub fn fetch_streaming_blocking( request: Request, on_data: Box) -> ControlFlow<()> + Send>, ) { - let mut req = ureq::request(&request.method, &request.url); + let tls_connector = Arc::new( + native_tls::TlsConnector::builder() + .danger_accept_invalid_hostnames(request.danger_accept_invalid_hostnames) + .danger_accept_invalid_certs(request.danger_accept_invalid_certs) + .build() + .unwrap(), + ); + + let mut req = ureq::builder() + .tls_connector(tls_connector) + .build() + .request(&request.method, &request.url); for (k, v) in &request.headers { req = req.set(k, v); @@ -54,7 +66,7 @@ pub fn fetch_streaming_blocking( let mut reader = resp.into_reader(); loop { - let mut buf = vec![0; 2048]; + let mut buf = vec![0; 5120]; match reader.read(&mut buf) { Ok(n) if n > 0 => { // clone data from buffer and clear it diff --git a/ehttp/src/types.rs b/ehttp/src/types.rs index 86b4557..c916d57 100644 --- a/ehttp/src/types.rs +++ b/ehttp/src/types.rs @@ -145,6 +145,9 @@ pub struct Request { /// /// Used on Web to control CORS. pub mode: Mode, + + pub danger_accept_invalid_hostnames: bool, + pub danger_accept_invalid_certs: bool, } impl Request { @@ -157,6 +160,8 @@ impl Request { body: vec![], headers: Headers::new(&[("Accept", "*/*")]), mode: Mode::default(), + danger_accept_invalid_hostnames: false, + danger_accept_invalid_certs: false, } } @@ -169,6 +174,8 @@ impl Request { body: vec![], headers: Headers::new(&[("Accept", "*/*")]), mode: Mode::default(), + danger_accept_invalid_hostnames: false, + danger_accept_invalid_certs: false, } } @@ -184,6 +191,21 @@ impl Request { ("Content-Type", "text/plain; charset=utf-8"), ]), mode: Mode::default(), + danger_accept_invalid_hostnames: false, + danger_accept_invalid_certs: false, + } + } + + #[allow(clippy::needless_pass_by_value)] + pub fn delete(url: impl ToString) -> Self { + Self { + method: "DELETE".to_string(), + url: url.to_string(), + body: vec![], + headers: Headers::new(&[("Accept", "*/*")]), + mode: Mode::default(), + danger_accept_invalid_hostnames: false, + danger_accept_invalid_certs: false, } } @@ -218,6 +240,8 @@ impl Request { body: data, headers: Headers::new(&[("Accept", "*/*"), ("Content-Type", content_type.as_str())]), mode: Mode::default(), + danger_accept_invalid_hostnames: false, + danger_accept_invalid_certs: false, } } @@ -234,8 +258,20 @@ impl Request { body: serde_json::to_string(body)?.into_bytes(), headers: Headers::new(&[("Accept", "*/*"), ("Content-Type", "application/json")]), mode: Mode::default(), + danger_accept_invalid_hostnames: false, + danger_accept_invalid_certs: false, }) } + + pub fn danger_accept_invalid_hostnames(mut self, accept_invalid_hostnames: bool) -> Self { + self.danger_accept_invalid_hostnames = accept_invalid_hostnames; + self + } + + pub fn danger_accept_invalid_certs(mut self, accept_invalid_certs: bool) -> Self { + self.danger_accept_invalid_certs = accept_invalid_certs; + self + } } /// Response from a completed HTTP request.