mirror of
https://github.com/tauri-apps/tauri-plugin-http.git
synced 2026-01-31 00:45:17 +01:00
feat(http): enhance scope config to accept string as well (#1025)
Committed via a GitHub action: https://github.com/tauri-apps/plugins-workspace/actions/runs/8182312945 Co-authored-by: lucasfernog <lucasfernog@users.noreply.github.com>
This commit is contained in:
35
build.rs
35
build.rs
@@ -9,8 +9,10 @@ mod scope;
|
||||
const COMMANDS: &[&str] = &["fetch", "fetch_cancel", "fetch_send", "fetch_read_body"];
|
||||
|
||||
/// HTTP scope entry object definition.
|
||||
#[allow(unused)]
|
||||
#[derive(schemars::JsonSchema)]
|
||||
struct ScopeEntry {
|
||||
#[serde(untagged)]
|
||||
enum ScopeEntry {
|
||||
/// A URL that can be accessed by the webview when using the HTTP APIs.
|
||||
/// Wildcards can be used following the URL pattern standard.
|
||||
///
|
||||
@@ -25,18 +27,39 @@ struct ScopeEntry {
|
||||
/// - "https://*.github.com/tauri-apps/tauri": allows any subdomain of "github.com" with the "tauri-apps/api" path
|
||||
///
|
||||
/// - "https://myapi.service.com/users/*": allows access to any URLs that begins with "https://myapi.service.com/users/"
|
||||
url: String,
|
||||
Value(String),
|
||||
|
||||
Object {
|
||||
/// A URL that can be accessed by the webview when using the HTTP APIs.
|
||||
/// Wildcards can be used following the URL pattern standard.
|
||||
///
|
||||
/// See [the URL Pattern spec](https://urlpattern.spec.whatwg.org/) for more information.
|
||||
///
|
||||
/// Examples:
|
||||
///
|
||||
/// - "https://*" : allows all HTTPS origin on port 443
|
||||
///
|
||||
/// - "https://*:*" : allows all HTTPS origin on any port
|
||||
///
|
||||
/// - "https://*.github.com/tauri-apps/tauri": allows any subdomain of "github.com" with the "tauri-apps/api" path
|
||||
///
|
||||
/// - "https://myapi.service.com/users/*": allows access to any URLs that begins with "https://myapi.service.com/users/"
|
||||
url: String,
|
||||
},
|
||||
}
|
||||
|
||||
// ensure scope entry is up to date
|
||||
impl From<ScopeEntry> for scope::Entry {
|
||||
fn from(value: ScopeEntry) -> Self {
|
||||
let url = match value {
|
||||
ScopeEntry::Value(url) => url,
|
||||
ScopeEntry::Object { url } => url,
|
||||
};
|
||||
|
||||
scope::Entry {
|
||||
url: urlpattern::UrlPattern::parse(
|
||||
urlpattern::UrlPatternInit::parse_constructor_string::<regex::Regex>(
|
||||
&value.url, None,
|
||||
)
|
||||
.unwrap(),
|
||||
urlpattern::UrlPatternInit::parse_constructor_string::<regex::Regex>(&url, None)
|
||||
.unwrap(),
|
||||
)
|
||||
.unwrap(),
|
||||
}
|
||||
|
||||
17
src/scope.rs
17
src/scope.rs
@@ -25,17 +25,20 @@ impl<'de> Deserialize<'de> for Entry {
|
||||
D: Deserializer<'de>,
|
||||
{
|
||||
#[derive(Deserialize)]
|
||||
struct EntryRaw {
|
||||
url: String,
|
||||
#[serde(untagged)]
|
||||
enum EntryRaw {
|
||||
Value(String),
|
||||
Object { url: String },
|
||||
}
|
||||
|
||||
EntryRaw::deserialize(deserializer).and_then(|raw| {
|
||||
let url = match raw {
|
||||
EntryRaw::Value(url) => url,
|
||||
EntryRaw::Object { url } => url,
|
||||
};
|
||||
Ok(Entry {
|
||||
url: parse_url_pattern(&raw.url).map_err(|e| {
|
||||
serde::de::Error::custom(format!(
|
||||
"`{}` is not a valid URL pattern: {e}",
|
||||
raw.url
|
||||
))
|
||||
url: parse_url_pattern(&url).map_err(|e| {
|
||||
serde::de::Error::custom(format!("`{}` is not a valid URL pattern: {e}", url))
|
||||
})?,
|
||||
})
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user