summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authoradamelmore <[email protected]>2026-01-27 14:55:50 -0600
committeradamelmore <[email protected]>2026-01-27 15:25:06 -0600
commit1ebf63c70c552c95794325f40bbd278ba3e0c725 (patch)
tree915581abacd9c163fee97bead130242881debd79
parentd7948c2376ee2611bd64cc5ea1f787330313c2ef (diff)
downloadopencode-1ebf63c70c552c95794325f40bbd278ba3e0c725.tar.gz
opencode-1ebf63c70c552c95794325f40bbd278ba3e0c725.zip
fix(app): don't connect to localhost through vpn
-rw-r--r--packages/desktop/src-tauri/src/lib.rs12
-rw-r--r--packages/desktop/src-tauri/src/main.rs27
2 files changed, 36 insertions, 3 deletions
diff --git a/packages/desktop/src-tauri/src/lib.rs b/packages/desktop/src-tauri/src/lib.rs
index e086acd93..dab98f4a0 100644
--- a/packages/desktop/src-tauri/src/lib.rs
+++ b/packages/desktop/src-tauri/src/lib.rs
@@ -328,7 +328,15 @@ pub fn run() {
.hidden_title(true);
#[cfg(windows)]
- let window_builder = window_builder.decorations(false);
+ let window_builder = window_builder
+ // Some VPNs set a global/system proxy that WebView2 applies even for loopback
+ // connections, which breaks the app's localhost sidecar server.
+ // Note: when setting additional args, we must re-apply wry's default
+ // `--disable-features=...` flags.
+ .additional_browser_args(
+ "--proxy-bypass-list=<-loopback> --disable-features=msWebOOUI,msPdfOOUI,msSmartScreenProtection",
+ )
+ .decorations(false);
let window = window_builder.build().expect("Failed to create window");
@@ -525,4 +533,4 @@ async fn spawn_local_server(
break Ok(child);
}
}
-} \ No newline at end of file
+}
diff --git a/packages/desktop/src-tauri/src/main.rs b/packages/desktop/src-tauri/src/main.rs
index e3be4a44d..9ffee8aa5 100644
--- a/packages/desktop/src-tauri/src/main.rs
+++ b/packages/desktop/src-tauri/src/main.rs
@@ -52,7 +52,32 @@ fn configure_display_backend() -> Option<String> {
}
fn main() {
- unsafe { std::env::set_var("NO_PROXY", "127.0.0.1,localhost,::1") };
+ // Ensure loopback connections are never sent through proxy settings.
+ // Some VPNs/proxies set HTTP_PROXY/HTTPS_PROXY/ALL_PROXY without excluding localhost.
+ const LOOPBACK: [&str; 3] = ["127.0.0.1", "localhost", "::1"];
+
+ let upsert = |key: &str| {
+ let mut items = std::env::var(key)
+ .unwrap_or_default()
+ .split(',')
+ .map(|v| v.trim())
+ .filter(|v| !v.is_empty())
+ .map(|v| v.to_string())
+ .collect::<Vec<_>>();
+
+ for host in LOOPBACK {
+ if items.iter().any(|v| v.eq_ignore_ascii_case(host)) {
+ continue;
+ }
+ items.push(host.to_string());
+ }
+
+ // Safety: called during startup before any threads are spawned.
+ unsafe { std::env::set_var(key, items.join(",")) };
+ };
+
+ upsert("NO_PROXY");
+ upsert("no_proxy");
#[cfg(target_os = "linux")]
{