83 lines
1.8 KiB
Go
83 lines
1.8 KiB
Go
//go:build darwin
|
|
|
|
package internal
|
|
|
|
import (
|
|
"fmt"
|
|
"os/exec"
|
|
"strings"
|
|
)
|
|
|
|
// readSystemProxy 从 macOS 系统偏好设置读取代理配置
|
|
// 使用 scutil --proxy 命令获取系统代理信息
|
|
func readSystemProxy(info *ProxyInfo) error {
|
|
out, err := exec.Command("scutil", "--proxy").Output()
|
|
if err != nil {
|
|
return fmt.Errorf("执行 scutil --proxy 失败: %w", err)
|
|
}
|
|
|
|
lines := strings.Split(string(out), "\n")
|
|
settings := make(map[string]string)
|
|
for _, line := range lines {
|
|
line = strings.TrimSpace(line)
|
|
parts := strings.SplitN(line, " : ", 2)
|
|
if len(parts) == 2 {
|
|
settings[strings.TrimSpace(parts[0])] = strings.TrimSpace(parts[1])
|
|
}
|
|
}
|
|
|
|
// 检查 HTTP 代理
|
|
if settings["HTTPEnable"] == "1" {
|
|
host := settings["HTTPProxy"]
|
|
port := settings["HTTPPort"]
|
|
if host != "" {
|
|
info.Enabled = true
|
|
info.Server = host
|
|
if port != "" && port != "0" {
|
|
info.Server = host + ":" + port
|
|
}
|
|
info.Protocol = "http"
|
|
}
|
|
}
|
|
|
|
// 检查 HTTPS 代理
|
|
if !info.Enabled && settings["HTTPSEnable"] == "1" {
|
|
host := settings["HTTPSProxy"]
|
|
port := settings["HTTPSPort"]
|
|
if host != "" {
|
|
info.Enabled = true
|
|
info.Server = host
|
|
if port != "" && port != "0" {
|
|
info.Server = host + ":" + port
|
|
}
|
|
info.Protocol = "http"
|
|
}
|
|
}
|
|
|
|
// 检查 SOCKS 代理
|
|
if !info.Enabled && settings["SOCKSEnable"] == "1" {
|
|
host := settings["SOCKSProxy"]
|
|
port := settings["SOCKSPort"]
|
|
if host != "" {
|
|
info.Enabled = true
|
|
info.Server = host
|
|
if port != "" && port != "0" {
|
|
info.Server = host + ":" + port
|
|
}
|
|
info.Protocol = "socks5"
|
|
}
|
|
}
|
|
|
|
// 如果通过以上方式检测到了代理,根据端口再次猜测协议
|
|
if info.Enabled && info.Server != "" {
|
|
info.Protocol = guessProtocol(info.Server)
|
|
}
|
|
|
|
// 读取绕过列表
|
|
if exceptions, ok := settings["ExceptionsList"]; ok {
|
|
info.Bypass = exceptions
|
|
}
|
|
|
|
return nil
|
|
}
|