mirror of
https://github.com/l0ng-ai/openidea.git
synced 2026-11-07 16:36:58 +00:00
* feat(settings): HTTP Proxy settings for the IDE's outgoing connections Add Appearance & Behavior › System Settings › HTTP Proxy with three modes: No proxy, Auto-detect proxy settings (the default; environment proxy as before) and Manual proxy configuration (HTTP or SOCKS, host and port, a comma-separated "No proxy for" list with `*` wildcards, optional proxy authentication). "Check connection…" GETs a URL with the settings as edited and reports the status or the error. - ide-core: `ProxySettings` plus routing (no-proxy globs, loopback always direct, credentials percent-encoded), the current proxy for the process, curl arguments and child-process variables. - ide-http: `client::build` / `client::shared` is the one HTTP client constructor; the HTTP Client requests and the update check go through it. - ide-tools: curl downloads (tools, JDKs, debug adapters, agent registry, remote server) follow the setting. - A manual proxy reaches child processes (language servers, debug adapters, terminals, git) as HTTP_PROXY / HTTPS_PROXY / ALL_PROXY / NO_PROXY. - The proxy password is kept in the owner-only saved passwords file (`proxy-password.json` in the app data directory), not in settings.toml. Co-Authored-By: Claude <[email protected]> * fix(host): Allow the Unix-only post-start test helpers on Windows Co-Authored-By: Claude <[email protected]> --------- Co-authored-by: Claude <[email protected]>
51 lines
2.0 KiB
Rust
51 lines
2.0 KiB
Rust
//! System Settings › HTTP Proxy on the host: the global settings made current for
|
||
//! connections and child processes, the password kept in the saved passwords
|
||
//! (owner-only `proxy-password.json`) instead of `settings.toml`.
|
||
|
||
use crate::Host;
|
||
use ide_core::IdeResult;
|
||
use ide_core::settings::Settings;
|
||
|
||
const PASSWORD_KEY: &str = "httpProxy";
|
||
|
||
impl Host {
|
||
/// `settings` with the saved proxy password filled in, as the Settings dialog edits it.
|
||
pub fn with_proxy_password(&self, mut settings: Settings) -> Settings {
|
||
// A password typed into settings.toml by hand counts too, unless one was saved.
|
||
if let Some(password) = self.proxy_password.get(PASSWORD_KEY) {
|
||
settings.proxy.password = password;
|
||
}
|
||
settings
|
||
}
|
||
|
||
/// Makes the global proxy settings the proxy of every later connection and child process.
|
||
pub fn apply_proxy(&self) {
|
||
let settings = self.with_proxy_password(self.global_settings.effective());
|
||
if let Some(problem) = settings.proxy.problem() {
|
||
tracing::warn!("HTTP proxy: {problem}");
|
||
}
|
||
ide_core::proxy_settings::set_proxy(settings.proxy);
|
||
}
|
||
|
||
/// Takes the proxy password out of a settings write of `key` and saves it.
|
||
/// Returns the value left to write, `None` when nothing is.
|
||
pub(crate) fn take_proxy_password(
|
||
&self,
|
||
key: &str,
|
||
mut value: serde_json::Value,
|
||
) -> IdeResult<Option<serde_json::Value>> {
|
||
let password = match key {
|
||
"proxy.password" => Some(value.take()),
|
||
"proxy" => value.as_object_mut().and_then(|o| o.remove("password")),
|
||
_ => return Ok(Some(value)),
|
||
};
|
||
if let Some(password) = password {
|
||
match password.as_str().filter(|p| !p.is_empty()) {
|
||
Some(p) => self.proxy_password.set(PASSWORD_KEY, p)?,
|
||
None => self.proxy_password.delete(PASSWORD_KEY),
|
||
}
|
||
}
|
||
Ok((key != "proxy.password").then_some(value))
|
||
}
|
||
}
|