Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
165 changes: 162 additions & 3 deletions src-tauri/Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions src-tauri/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ tauri-plugin-updater = "2"
serde = { version = "1", features = ["derive"] }
serde_json = "1"
tokio = { version = "1", features = ["full"] }
reqwest = { version = "0.12", features = ["json", "rustls-tls"], default-features = false }
chrono = "0.4"
lazy_static = "1.5"
image = "0.25"
Expand Down
61 changes: 61 additions & 0 deletions src-tauri/src/commands.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1029,3 +1029,64 @@ mod tests {
assert_eq!(out.get_pixel(3, 3), &image::Rgba([5, 5, 0, 255]));
}
}

// ---- HTTP request proxy (used by the API Client tool) ----

#[derive(serde::Serialize)]
pub struct HttpResponse {
pub status: u16,
pub status_text: String,
pub headers: std::collections::HashMap<String, String>,
pub body: String,
pub duration_ms: u64,
}

#[tauri::command]
pub async fn http_request(
method: String,
url: String,
headers: std::collections::HashMap<String, String>,
body: Option<String>,
) -> Result<HttpResponse, String> {
let start = std::time::Instant::now();
let client = reqwest::Client::builder()
.danger_accept_invalid_certs(false)
.redirect(reqwest::redirect::Policy::limited(10))
.build()
.map_err(|e| e.to_string())?;

let method_parsed = reqwest::Method::from_bytes(method.to_uppercase().as_bytes())
.map_err(|e| e.to_string())?;

let mut builder = client.request(method_parsed, &url);
for (k, v) in &headers {
if let (Ok(name), Ok(val)) = (
reqwest::header::HeaderName::from_bytes(k.as_bytes()),
reqwest::header::HeaderValue::from_str(v),
) {
builder = builder.header(name, val);
}
}
if let Some(b) = body {
builder = builder.body(b);
}

let res = builder.send().await.map_err(|e| e.to_string())?;
let duration_ms = start.elapsed().as_millis() as u64;
let status = res.status().as_u16();
let status_text = res.status().canonical_reason().unwrap_or("").to_string();
let mut resp_headers = std::collections::HashMap::new();
for (k, v) in res.headers() {
if let Ok(val) = v.to_str() {
resp_headers.insert(k.as_str().to_string(), val.to_string());
}
}
let body_str = res.text().await.map_err(|e| e.to_string())?;
Ok(HttpResponse {
status,
status_text,
headers: resp_headers,
body: body_str,
duration_ms,
})
}
1 change: 1 addition & 0 deletions src-tauri/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ fn main() {
commands::check_permissions,
commands::mark_first_run_complete,
commands::open_system_preferences,
commands::http_request,
])
.run(tauri::generate_context!())
.expect("error while running tauri application");
Expand Down
Loading
Loading