summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorAdam <[email protected]>2026-01-21 02:21:21 -0600
committerGitHub <[email protected]>2026-01-21 16:21:21 +0800
commitd6caaee8169ff1abd7012cc1d036f2621703a757 (patch)
tree28e7bbef1b7a9833683b90742d9f5a5b191ee8d9
parent65938baf00f58ef9d5e275b85cb4641d40f8ceae (diff)
downloadopencode-d6caaee8169ff1abd7012cc1d036f2621703a757.tar.gz
opencode-d6caaee8169ff1abd7012cc1d036f2621703a757.zip
fix(desktop): no proxy for connecting to sidecar (#9690)
Co-authored-by: Brendan Allan <[email protected]>
-rw-r--r--packages/desktop/src-tauri/src/lib.rs33
1 files changed, 27 insertions, 6 deletions
diff --git a/packages/desktop/src-tauri/src/lib.rs b/packages/desktop/src-tauri/src/lib.rs
index 3cfa8a9be..7b11397a3 100644
--- a/packages/desktop/src-tauri/src/lib.rs
+++ b/packages/desktop/src-tauri/src/lib.rs
@@ -156,6 +156,7 @@ fn spawn_sidecar(app: &AppHandle, port: u32, password: &str) -> CommandChild {
println!("spawning sidecar on port {port}");
let (mut rx, child) = cli::create_command(app, format!("serve --port {port}").as_str())
+ .env("OPENCODE_SERVER_USERNAME", "opencode")
.env("OPENCODE_SERVER_PASSWORD", password)
.spawn()
.expect("Failed to spawn opencode");
@@ -197,17 +198,37 @@ fn spawn_sidecar(app: &AppHandle, port: u32, password: &str) -> CommandChild {
child
}
+fn url_is_localhost(url: &reqwest::Url) -> bool {
+ url.host_str().is_some_and(|host| {
+ host.eq_ignore_ascii_case("localhost")
+ || host
+ .parse::<std::net::IpAddr>()
+ .is_ok_and(|ip| ip.is_loopback())
+ })
+}
+
async fn check_server_health(url: &str, password: Option<&str>) -> bool {
- let health_url = format!("{}/global/health", url.trim_end_matches('/'));
- let client = reqwest::Client::builder()
- .timeout(Duration::from_secs(3))
- .build();
+ let Ok(url) = reqwest::Url::parse(url) else {
+ return false;
+ };
+
+ let mut builder = reqwest::Client::builder().timeout(Duration::from_secs(3));
- let Ok(client) = client else {
+ if url_is_localhost(&url) {
+ // Some environments set proxy variables (HTTP_PROXY/HTTPS_PROXY/ALL_PROXY) without
+ // excluding loopback. reqwest respects these by default, which can prevent the desktop
+ // app from reaching its own local sidecar server.
+ builder = builder.no_proxy();
+ };
+
+ let Ok(client) = builder.build() else {
+ return false;
+ };
+ let Ok(health_url) = url.join("/global/health") else {
return false;
};
- let mut req = client.get(&health_url);
+ let mut req = client.get(health_url);
if let Some(password) = password {
req = req.basic_auth("opencode", Some(password));