This commit is contained in:
putyy
2024-12-23 16:59:18 +08:00
parent f92d898136
commit 6d2705112d
22 changed files with 131 additions and 138 deletions

View File

@@ -166,7 +166,7 @@ func (a *App) OpenSystemProxy() bool {
a.IsProxy = true
return true
}
DialogErr("设置失败")
DialogErr("设置失败" + err.Error())
return false
}

View File

@@ -9,6 +9,7 @@ import (
"net/url"
"os"
"path/filepath"
"strings"
"sync"
)
@@ -68,7 +69,7 @@ func (fd *FileDownloader) init() error {
fd.Referer = parsedURL.Scheme + "://" + parsedURL.Host + "/"
}
if globalConfig.DownloadProxy && globalConfig.UpstreamProxy != "" {
if globalConfig.DownloadProxy && globalConfig.UpstreamProxy != "" && !strings.Contains(globalConfig.UpstreamProxy, globalConfig.Port) {
proxyURL, err := url.Parse(globalConfig.UpstreamProxy)
if err == nil {
fd.ProxyUrl = proxyURL

View File

@@ -20,15 +20,11 @@ type ResponseData struct {
Data interface{} `json:"data"`
}
type HttpServer struct {
broadcast chan []byte
}
type HttpServer struct{}
func initHttpServer() *HttpServer {
if httpServerOnce == nil {
httpServerOnce = &HttpServer{
broadcast: make(chan []byte),
}
httpServerOnce = &HttpServer{}
}
return httpServerOnce
}
@@ -38,7 +34,6 @@ func (h *HttpServer) run() {
if err != nil {
log.Fatalf("无法启动监听: %v", err)
}
go h.handleMessages()
fmt.Println("服务已启动,监听 http://" + globalConfig.Host + ":" + globalConfig.Port)
if err := http.Serve(listener, proxyOnce.Proxy); err != nil {
fmt.Printf("服务器异常: %v", err)
@@ -90,13 +85,6 @@ func (h *HttpServer) preview(w http.ResponseWriter, r *http.Request) {
return
}
func (h *HttpServer) handleMessages() {
for {
msg := <-h.broadcast
runtime.EventsEmit(appOnce.ctx, "event", string(msg))
}
}
func (h *HttpServer) send(t string, data interface{}) {
jsonData, err := json.Marshal(map[string]interface{}{
"type": t,
@@ -106,7 +94,7 @@ func (h *HttpServer) send(t string, data interface{}) {
fmt.Println("Error converting map to JSON:", err)
return
}
h.broadcast <- jsonData
runtime.EventsEmit(appOnce.ctx, "event", string(jsonData))
}
func (h *HttpServer) writeJson(w http.ResponseWriter, data ResponseData) {
@@ -179,13 +167,13 @@ func (h *HttpServer) openFolder(w http.ResponseWriter, r *http.Request) {
case "linux":
// linux
// 尝试使用不同的文件管理器
cmd = exec.Command("nautilus", filePath) // 尝试Nautilus
cmd = exec.Command("nautilus", filePath)
if err := cmd.Start(); err != nil {
cmd = exec.Command("thunar", filePath) // 尝试Thunar
cmd = exec.Command("thunar", filePath)
if err := cmd.Start(); err != nil {
cmd = exec.Command("dolphin", filePath) // 尝试Dolphin
cmd = exec.Command("dolphin", filePath)
if err := cmd.Start(); err != nil {
cmd = exec.Command("pcmanfm", filePath) // 尝试PCManFM
cmd = exec.Command("pcmanfm", filePath)
if err := cmd.Start(); err != nil {
globalLogger.err(err)
h.writeJson(w, ResponseData{Code: 0, Message: err.Error()})

View File

@@ -15,14 +15,14 @@ func Middleware(next http.Handler) http.Handler {
}
func HandleApi(w http.ResponseWriter, r *http.Request) bool {
w.Header().Set("Access-Control-Allow-Origin", "*")
w.Header().Set("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS")
w.Header().Set("Access-Control-Allow-Headers", "Content-Type")
if r.Method == http.MethodOptions {
w.WriteHeader(http.StatusNoContent)
return true
}
if strings.HasPrefix(r.URL.Path, "/api") {
w.Header().Set("Access-Control-Allow-Origin", "*")
w.Header().Set("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS")
w.Header().Set("Access-Control-Allow-Headers", "Content-Type")
if r.Method == http.MethodOptions {
w.WriteHeader(http.StatusNoContent)
return true
}
switch r.URL.Path {
case "/api/preview":
httpServerOnce.preview(w, r)

View File

@@ -95,7 +95,7 @@ func (p *Proxy) setTransport() {
IdleConnTimeout: 30 * time.Second,
}
if globalConfig.UpstreamProxy != "" && globalConfig.OpenProxy {
if globalConfig.UpstreamProxy != "" && globalConfig.OpenProxy && !strings.Contains(globalConfig.UpstreamProxy, globalConfig.Port) {
proxyURL, err := url.Parse(globalConfig.UpstreamProxy)
if err == nil {
transport.Proxy = http.ProxyURL(proxyURL)

View File

@@ -5,94 +5,88 @@ package core
import (
"bytes"
"fmt"
"log"
"net"
"os/exec"
"strings"
)
func (s *SystemSetup) getActiveInterface() (string, error) {
interfaces, err := net.Interfaces()
func (s *SystemSetup) getNetworkServices() ([]string, error) {
cmd := exec.Command("networksetup", "-listallnetworkservices")
output, err := cmd.Output()
if err != nil {
return "", err
return nil, fmt.Errorf("failed to execute command: %v", err)
}
for _, inter := range interfaces {
if inter.Flags&net.FlagUp != 0 && inter.Flags&net.FlagLoopback == 0 {
return inter.Name, nil
}
}
return "", fmt.Errorf("no active network interface found")
}
services := strings.Split(string(output), "\n")
func (s *SystemSetup) getNetworkServiceName(interfaceName string) (string, error) {
cmd := exec.Command("networksetup", "-listallhardwareports")
var out bytes.Buffer
cmd.Stdout = &out
if err := cmd.Run(); err != nil {
return "", err
var validServices []string
for _, service := range services {
service = strings.TrimSpace(service)
if service != "" && !strings.Contains(service, "*") && !strings.Contains(service, "Serial Port") {
validServices = append(validServices, service)
}
}
output := out.String()
lines := strings.Split(output, "\n")
var serviceName string
for _, line := range lines {
if strings.Contains(line, "Hardware Port:") {
serviceName = strings.TrimSpace(strings.Split(line, ":")[1])
}
if strings.Contains(line, "Device: "+interfaceName) {
return serviceName, nil
}
}
return "", fmt.Errorf("no matching network service found for interface %s", interfaceName)
return validServices, nil
}
func (s *SystemSetup) setProxy() error {
interfaceName, err := s.getActiveInterface()
services, err := s.getNetworkServices()
if err != nil {
return err
}
serviceName, err := s.getNetworkServiceName(interfaceName)
if err != nil {
return err
}
commands := [][]string{
{"networksetup", "-setwebproxy", serviceName, "127.0.0.1", globalConfig.Port},
{"networksetup", "-setsecurewebproxy", serviceName, "127.0.0.1", globalConfig.Port},
if len(services) == 0 {
return fmt.Errorf("find to Network failed")
}
for _, cmd := range commands {
if err := exec.Command(cmd[0], cmd[1:]...).Run(); err != nil {
return err
is := false
for _, serviceName := range services {
if err := exec.Command("networksetup", "-setwebproxy", serviceName, "127.0.0.1", globalConfig.Port).Run(); err != nil {
fmt.Println(err)
} else {
is = true
}
if err := exec.Command("networksetup", "-setsecurewebproxy", serviceName, "127.0.0.1", globalConfig.Port).Run(); err != nil {
fmt.Println(err)
} else {
is = true
}
}
return nil
if is {
return nil
}
return fmt.Errorf("find to Network failed")
}
func (s *SystemSetup) unsetProxy() error {
interfaceName, err := s.getActiveInterface()
services, err := s.getNetworkServices()
if err != nil {
return err
}
serviceName, err := s.getNetworkServiceName(interfaceName)
if err != nil {
return err
}
commands := [][]string{
{"networksetup", "-setwebproxystate", serviceName, "off"},
{"networksetup", "-setsecurewebproxystate", serviceName, "off"},
if len(services) == 0 {
return fmt.Errorf("find to Network failed")
}
for _, cmd := range commands {
if err := exec.Command(cmd[0], cmd[1:]...).Run(); err != nil {
log.Println("UnsetProxy failed:", err)
return err
is := false
for _, serviceName := range services {
if err := exec.Command("networksetup", "-setwebproxystate", serviceName, "off").Run(); err != nil {
fmt.Println(err)
} else {
is = true
}
if err := exec.Command("networksetup", "-setsecurewebproxystate", serviceName, "off").Run(); err != nil {
fmt.Println(err)
} else {
is = true
}
}
return nil
if is {
return nil
}
return fmt.Errorf("find to Network failed")
}
func (s *SystemSetup) installCert() (string, error) {