feat: update build workflow, enhance README, and modify license for version 1.4-01
Build and Release / release (push) Successful in 1m36s

This commit is contained in:
2026-06-22 11:23:22 +07:00
parent 7c3d96f1db
commit 8264f356a7
18 changed files with 417 additions and 401 deletions
+48 -48
View File
@@ -1,48 +1,48 @@
name: Build and Release
run-name: ${{ gitea.actor }} build 🚀
on:
push:
branches:
- master
jobs:
release:
runs-on: ubuntu-latest
container:
image: azenkain/go-node:latest
steps:
- uses: actions/checkout@v4
- name: Download Go dependencies
run: go mod download
- name: Build for Windows x64
run: GOOS=windows GOARCH=amd64 CGO_ENABLED=0 go build -trimpath -ldflags="-s -w" -o firefly-go-proxy-windows-amd64.exe .
- name: Build for Windows ARM64
run: GOOS=windows GOARCH=arm64 CGO_ENABLED=0 go build -trimpath -ldflags="-s -w" -o firefly-go-proxy-windows-arm64.exe .
- name: Build for macOS x64
run: GOOS=darwin GOARCH=amd64 CGO_ENABLED=0 go build -trimpath -ldflags="-s -w" -o firefly-go-proxy-macos-amd64 .
- name: Build for macOS ARM64
run: GOOS=darwin GOARCH=arm64 CGO_ENABLED=0 go build -trimpath -ldflags="-s -w" -o firefly-go-proxy-macos-arm64 .
- name: Build for Linux x64
run: GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -trimpath -ldflags="-s -w" -o firefly-go-proxy-linux-amd64 .
- name: Build for Linux ARM64
run: GOOS=linux GOARCH=arm64 CGO_ENABLED=0 go build -trimpath -ldflags="-s -w" -o firefly-go-proxy-linux-arm64 .
- name: Grant execute permissions
run: |
chmod +x ./script/publish/publish-script
- name: Publish components to API
run: ./script/publish/publish-script
env:
ENV_ROBOT_TOKEN: ${{ secrets.ENV_ROBOT_TOKEN }}
ENV_GAME_IDS: ${{ secrets.ENV_GAME_IDS }}
ENV_COMPONENT_TYPE: PROXY
ENV_FILES: "firefly-go-proxy-windows-amd64.exe,firefly-go-proxy-windows-arm64.exe,firefly-go-proxy-macos-amd64,firefly-go-proxy-macos-arm64,firefly-go-proxy-linux-amd64,firefly-go-proxy-linux-arm64"
name: Build and Release
run-name: ${{ gitea.actor }} build 🚀
on:
push:
branches:
- master
jobs:
release:
runs-on: ubuntu-latest
container:
image: azenkain/go-node:latest
steps:
- uses: actions/checkout@v4
- name: Download Go dependencies
run: go mod download
- name: Build for Windows x64
run: GOOS=windows GOARCH=amd64 CGO_ENABLED=0 go build -trimpath -ldflags="-s -w" -o firefly-go-proxy-windows-amd64.exe .
- name: Build for Windows ARM64
run: GOOS=windows GOARCH=arm64 CGO_ENABLED=0 go build -trimpath -ldflags="-s -w" -o firefly-go-proxy-windows-arm64.exe .
- name: Build for macOS x64
run: GOOS=darwin GOARCH=amd64 CGO_ENABLED=0 go build -trimpath -ldflags="-s -w" -o firefly-go-proxy-macos-amd64 .
- name: Build for macOS ARM64
run: GOOS=darwin GOARCH=arm64 CGO_ENABLED=0 go build -trimpath -ldflags="-s -w" -o firefly-go-proxy-macos-arm64 .
- name: Build for Linux x64
run: GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -trimpath -ldflags="-s -w" -o firefly-go-proxy-linux-amd64 .
- name: Build for Linux ARM64
run: GOOS=linux GOARCH=arm64 CGO_ENABLED=0 go build -trimpath -ldflags="-s -w" -o firefly-go-proxy-linux-arm64 .
- name: Grant execute permissions
run: |
chmod +x ./script/publish/publish-script
- name: Publish components to API
run: ./script/publish/publish-script
env:
ENV_ROBOT_TOKEN: ${{ secrets.ENV_ROBOT_TOKEN }}
ENV_GAME_IDS: ${{ secrets.ENV_GAME_IDS }}
ENV_COMPONENT_TYPE: PROXY
ENV_FILES: "firefly-go-proxy-windows-amd64.exe,firefly-go-proxy-windows-arm64.exe,firefly-go-proxy-macos-amd64,firefly-go-proxy-macos-arm64,firefly-go-proxy-linux-amd64,firefly-go-proxy-linux-arm64"
+18 -18
View File
@@ -1,18 +1,18 @@
MIT License
Copyright (c) 2025 Firefly-Shelter
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
associated documentation files (the "Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the
following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial
portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO
EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
USE OR OTHER DEALINGS IN THE SOFTWARE.
MIT License
Copyright (c) 2025 Firefly-Shelter
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
associated documentation files (the "Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the
following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial
portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO
EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
USE OR OTHER DEALINGS IN THE SOFTWARE.
+5 -5
View File
@@ -25,9 +25,9 @@ build_mac_arm64:
build_ico:
@echo Building application icon...
magick logo.jpg -define icon:auto-resize=256,128,64,48,32,16 ./logo.ico
@echo Done!
set_logo:
@echo Embedding application icon...
go-winres simply --icon ./logo.ico
@echo Done!
set_logo:
@echo Embedding application icon...
go-winres simply --icon ./logo.ico
@echo Done!
+68 -68
View File
@@ -1,42 +1,42 @@
# Firefly Go Proxy
A lightweight HTTP/HTTPS proxy server with domain redirection and request blocking capabilities. This tool is designed to help with local development and testing by intercepting and modifying HTTP/HTTPS traffic.
## Features
- HTTP/HTTPS proxy with MITM support
- Domain-based request redirection
- URL pattern blocking
- Automatic certificate management
- Cross-platform support (Windows, macOS, Linux)
# Firefly Go Proxy
A lightweight HTTP/HTTPS proxy server with domain redirection and request blocking capabilities. This tool is designed to help with local development and testing by intercepting and modifying HTTP/HTTPS traffic.
## Features
- HTTP/HTTPS proxy with MITM support
- Domain-based request redirection
- URL pattern blocking
- Automatic certificate management
- Cross-platform support (Windows, macOS, Linux)
- System proxy configuration
- Automatic admin prompt on macOS/Linux for certificate/proxy setup
## Installation
### Prerequisites
- Go 1.22 or higher
- Git
### Building from source
```bash
cd firefly-go-proxy
go build
```
## Usage
### Basic usage
```bash
./firefly-proxy [flags] //linux|macos
./firefly-proxy.exe [flags] //windows
```
### Available Flags
### Prerequisites
- Go 1.22 or higher
- Git
### Building from source
```bash
cd firefly-go-proxy
go build
```
## Usage
### Basic usage
```bash
./firefly-proxy [flags] //linux|macos
./firefly-proxy.exe [flags] //windows
```
### Available Flags
- `-r`: Redirect target host (default: "127.0.0.1:21000")
- `-b`: Comma-separated list of blocked ports
- `-p`: Proxy listen port (default: auto)
@@ -44,25 +44,25 @@ go build
- `-no-sys`: Run only the proxy server; skip certificate installation, system proxy setup, and macOS/Linux admin relaunch
### Examples
1. Start proxy with default settings:
```bash
./firefly-proxy //linux|macos
./firefly-proxy.exe //windows
```
2. Redirect traffic to a different host:
```bash
./firefly-proxy -r 192.168.1.100:8080 //linux|macos
./firefly-proxy.exe -r 192.168.1.100:8080 //windows
```
3. Block specific ports:
```bash
./firefly-proxy -b "80,443,8080" //linux|macos
./firefly-proxy.exe -b "80,443,8080" //windows
```
1. Start proxy with default settings:
```bash
./firefly-proxy //linux|macos
./firefly-proxy.exe //windows
```
2. Redirect traffic to a different host:
```bash
./firefly-proxy -r 192.168.1.100:8080 //linux|macos
./firefly-proxy.exe -r 192.168.1.100:8080 //windows
```
3. Block specific ports:
```bash
./firefly-proxy -b "80,443,8080" //linux|macos
./firefly-proxy.exe -b "80,443,8080" //windows
```
4. Run an executable with admin privileges:
```bash
./firefly-proxy -e "/path/to/your/executable" //linux|macos
@@ -82,17 +82,17 @@ go build
./firefly-proxy -no-sys -p 8888 //linux|macos
./firefly-proxy.exe -no-sys -p 8888 //windows
```
## How it works
The proxy intercepts HTTP/HTTPS traffic and can:
- Redirect requests based on domain names
- Block specific URLs or patterns
- Handle SSL/TLS connections with custom CA certificates
- Automatically configure system proxy settings
## License
MIT License
## How it works
The proxy intercepts HTTP/HTTPS traffic and can:
- Redirect requests based on domain names
- Block specific URLs or patterns
- Handle SSL/TLS connections with custom CA certificates
- Automatically configure system proxy settings
## License
MIT License
+36 -36
View File
@@ -1,37 +1,37 @@
package main
import (
"crypto/tls"
"sync"
)
type CertStorage struct {
certs map[string]*tls.Certificate
mtx sync.RWMutex
}
func (cs *CertStorage) Fetch(hostname string, gen func() (*tls.Certificate, error)) (*tls.Certificate, error) {
cs.mtx.RLock()
cert, ok := cs.certs[hostname]
cs.mtx.RUnlock()
if ok {
return cert, nil
}
cert, err := gen()
if err != nil {
return nil, err
}
cs.mtx.Lock()
cs.certs[hostname] = cert
cs.mtx.Unlock()
return cert, nil
}
func NewCertStorage() *CertStorage {
return &CertStorage{
certs: make(map[string]*tls.Certificate),
}
package main
import (
"crypto/tls"
"sync"
)
type CertStorage struct {
certs map[string]*tls.Certificate
mtx sync.RWMutex
}
func (cs *CertStorage) Fetch(hostname string, gen func() (*tls.Certificate, error)) (*tls.Certificate, error) {
cs.mtx.RLock()
cert, ok := cs.certs[hostname]
cs.mtx.RUnlock()
if ok {
return cert, nil
}
cert, err := gen()
if err != nil {
return nil, err
}
cs.mtx.Lock()
cs.certs[hostname] = cert
cs.mtx.Unlock()
return cert, nil
}
func NewCertStorage() *CertStorage {
return &CertStorage{
certs: make(map[string]*tls.Certificate),
}
}
+62 -62
View File
@@ -1,62 +1,62 @@
//go:build linux
// +build linux
package main
import (
"fmt"
"os"
"os/exec"
"path/filepath"
"strings"
)
func installCA(absPath string) error {
// Detect distro
data, err := os.ReadFile("/etc/os-release")
if err != nil {
return fmt.Errorf("cannot detect distro: %v", err)
}
content := string(data)
// Debian/Ubuntu/Kali
if strings.Contains(content, "ID=debian") ||
strings.Contains(content, "ID=ubuntu") ||
strings.Contains(content, "ID=kali") {
destDir := "/usr/local/share/ca-certificates"
if err := os.MkdirAll(destDir, 0755); err != nil {
return fmt.Errorf("failed to create cert dir: %v", err)
}
filename := filepath.Base(absPath)
destPath := filepath.Join(destDir, filename)
inputData, err := os.ReadFile(absPath)
if err != nil {
return fmt.Errorf("failed to read source file: %v", err)
}
if err := os.WriteFile(destPath, inputData, 0644); err != nil {
return fmt.Errorf("failed to write cert file to system: %v", err)
}
fmt.Printf("Updating certificates for Debian/Ubuntu...\n")
cmd := exec.Command("update-ca-certificates")
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
return cmd.Run()
}
// Arch / Manjaro
if strings.Contains(content, "ID=arch") ||
strings.Contains(content, "ID=manjaro") {
cmd := exec.Command("trust", "anchor", "--store", absPath)
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
return cmd.Run()
}
return fmt.Errorf("unsupported Linux distribution")
}
//go:build linux
// +build linux
package main
import (
"fmt"
"os"
"os/exec"
"path/filepath"
"strings"
)
func installCA(absPath string) error {
// Detect distro
data, err := os.ReadFile("/etc/os-release")
if err != nil {
return fmt.Errorf("cannot detect distro: %v", err)
}
content := string(data)
// Debian/Ubuntu/Kali
if strings.Contains(content, "ID=debian") ||
strings.Contains(content, "ID=ubuntu") ||
strings.Contains(content, "ID=kali") {
destDir := "/usr/local/share/ca-certificates"
if err := os.MkdirAll(destDir, 0755); err != nil {
return fmt.Errorf("failed to create cert dir: %v", err)
}
filename := filepath.Base(absPath)
destPath := filepath.Join(destDir, filename)
inputData, err := os.ReadFile(absPath)
if err != nil {
return fmt.Errorf("failed to read source file: %v", err)
}
if err := os.WriteFile(destPath, inputData, 0644); err != nil {
return fmt.Errorf("failed to write cert file to system: %v", err)
}
fmt.Printf("Updating certificates for Debian/Ubuntu...\n")
cmd := exec.Command("update-ca-certificates")
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
return cmd.Run()
}
// Arch / Manjaro
if strings.Contains(content, "ID=arch") ||
strings.Contains(content, "ID=manjaro") {
cmd := exec.Command("trust", "anchor", "--store", absPath)
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
return cmd.Run()
}
return fmt.Errorf("unsupported Linux distribution")
}
+7 -7
View File
@@ -1,7 +1,7 @@
//go:build !windows && !darwin && !linux
package main
func installCA(certPath string) error {
return nil
}
//go:build !windows && !darwin && !linux
package main
func installCA(certPath string) error {
return nil
}
+17 -17
View File
@@ -1,17 +1,17 @@
//go:build windows
// +build windows
package main
import (
"os/exec"
)
func installCA(absPath string) error {
cmd := exec.Command("certutil", "-addstore", "-user", "root", absPath)
if err := cmd.Run(); err != nil {
return err
}
return nil
}
//go:build windows
// +build windows
package main
import (
"os/exec"
)
func installCA(absPath string) error {
cmd := exec.Command("certutil", "-addstore", "-user", "root", absPath)
if err := cmd.Run(); err != nil {
return err
}
return nil
}
+17 -17
View File
@@ -1,17 +1,17 @@
package main
import (
"os"
"github.com/rs/zerolog"
"github.com/rs/zerolog/log"
)
func init() {
output := zerolog.ConsoleWriter{
Out: os.Stdout,
PartsOrder: []string{"level", "message"},
}
log.Logger = zerolog.New(output).With().Logger()
}
package main
import (
"os"
"github.com/rs/zerolog"
"github.com/rs/zerolog/log"
)
func init() {
output := zerolog.ConsoleWriter{
Out: os.Stdout,
PartsOrder: []string{"level", "message"},
}
log.Logger = zerolog.New(output).With().Logger()
}
+22 -6
View File
@@ -2,11 +2,13 @@ package main
import (
"context"
"crypto/tls"
"flag"
"fmt"
"io"
"log"
"net/http"
"net/url"
"os"
"os/signal"
"strings"
@@ -32,8 +34,17 @@ func rawQueryFromRequestURI(requestURI string) string {
return rawQuery
}
func parseRedirect(r string) (scheme, host string) {
if strings.Contains(r, "://") {
if u, err := url.Parse(r); err == nil && u.Host != "" {
return u.Scheme, u.Host
}
}
return "http", r
}
func main() {
redirectHost := flag.String("r", "127.0.0.1:21000", "redirect target host")
redirectHost := flag.String("r", "127.0.0.1:21000", "redirect target (host:port or full URL)")
blockedStr := flag.String("b", "", "comma separated list of blocked ports")
proxyPort := flag.Int("p", 0, "proxy listen port (default: auto)")
exePath := flag.String("e", "", "path to the executable")
@@ -41,6 +52,8 @@ func main() {
noSys := flag.Bool("no-sys", false, "skip certificate installation and system proxy setup")
flag.Parse()
redirectScheme, redirectTarget := parseRedirect(*redirectHost)
if !*noSys {
relaunched, err := relaunchWithAdminIfNeeded()
if err != nil {
@@ -119,6 +132,7 @@ func main() {
MaxIdleConnsPerHost: 100,
IdleConnTimeout: 90 * time.Second,
DisableCompression: false,
TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
}
proxy.CertStore = NewCertStorage()
proxy.OnRequest().HandleConnect(customAlwaysMitm)
@@ -171,8 +185,9 @@ func main() {
Str("raw_query", rawQuery).
Msg("Force redirect")
req.URL.Scheme = "http"
req.URL.Host = *redirectHost
req.URL.Scheme = redirectScheme
req.URL.Host = redirectTarget
req.Host = redirectTarget
req.URL.RawQuery = rawQuery
req.RequestURI = ""
zlog.Info().Str("to_url", req.URL.String()).Msg("Force redirected")
@@ -184,8 +199,9 @@ func main() {
Str("from_url", full).
Str("raw_query", rawQuery).
Msg("Redirect domain")
req.URL.Scheme = "http"
req.URL.Host = *redirectHost
req.URL.Scheme = redirectScheme
req.URL.Host = redirectTarget
req.Host = redirectTarget
req.URL.RawQuery = rawQuery
req.RequestURI = ""
zlog.Info().Str("to_url", req.URL.String()).Msg("Redirected domain")
@@ -246,4 +262,4 @@ func main() {
if err := srv.Shutdown(ctx); err != nil {
zlog.Error().Err(err).Msg("Server shutdown error")
}
}
}
+7 -7
View File
@@ -1,7 +1,7 @@
//go:build !windows && !darwin && !linux
package main
func runWithAdmin(exePath string, env []string) error {
return nil
}
//go:build !windows && !darwin && !linux
package main
func runWithAdmin(exePath string, env []string) error {
return nil
}
+15 -15
View File
@@ -1,15 +1,15 @@
//go:build linux
// +build linux
package main
import (
"os"
"os/exec"
)
func runWithAdmin(exePath string, env []string) error {
cmd := exec.Command("pkexec", exePath)
cmd.Env = append(os.Environ(), env...)
return cmd.Start()
}
//go:build linux
// +build linux
package main
import (
"os"
"os/exec"
)
func runWithAdmin(exePath string, env []string) error {
cmd := exec.Command("pkexec", exePath)
cmd.Env = append(os.Environ(), env...)
return cmd.Start()
}
+15 -15
View File
@@ -1,15 +1,15 @@
//go:build windows
// +build windows
package main
import (
"os"
"os/exec"
)
func runWithAdmin(exePath string, env []string) error {
cmd := exec.Command("powershell", "Start-Process", exePath, "-Verb", "runAs")
cmd.Env = append(os.Environ(), env...)
return cmd.Start()
}
//go:build windows
// +build windows
package main
import (
"os"
"os/exec"
)
func runWithAdmin(exePath string, env []string) error {
cmd := exec.Command("powershell", "Start-Process", exePath, "-Verb", "runAs")
cmd.Env = append(os.Environ(), env...)
return cmd.Start()
}
+3 -3
View File
@@ -1,4 +1,4 @@
# Changelog
### UPDATE
# Changelog
### UPDATE
- Support linux, macos, window
+4 -4
View File
@@ -1,5 +1,5 @@
{
"tag": "1.3-03",
"title": "PreBuild Version 1.3 - 03"
}
{
"tag": "1.4-01",
"title": "PreBuild Version 1.4 - 01"
}
+6 -6
View File
@@ -1,7 +1,7 @@
//go:build !windows && !darwin && !linux
package main
func setProxy(enable bool, host string, port string) error {
return nil
//go:build !windows && !darwin && !linux
package main
func setProxy(enable bool, host string, port string) error {
return nil
}
+24 -24
View File
@@ -1,24 +1,24 @@
//go:build linux
// +build linux
package main
import "fmt"
func setProxy(enable bool, host string, port string) error {
httpProxy1 := fmt.Sprintf("HTTP_PROXY=http://%s:%s", host, port)
httpProxy2 := fmt.Sprintf("http_proxy=http://%s:%s", host, port)
ENV_CONFIG = append(ENV_CONFIG, httpProxy1, httpProxy2)
httpsProxy1 := fmt.Sprintf("HTTPS_PROXY=http://%s:%s", host, port)
httpsProxy2 := fmt.Sprintf("https_proxy=http://%s:%s", host, port)
ENV_CONFIG = append(ENV_CONFIG, httpsProxy1, httpsProxy2)
if enable {
ENV_CONFIG = make([]string, 0)
}
return nil
}
//go:build linux
// +build linux
package main
import "fmt"
func setProxy(enable bool, host string, port string) error {
httpProxy1 := fmt.Sprintf("HTTP_PROXY=http://%s:%s", host, port)
httpProxy2 := fmt.Sprintf("http_proxy=http://%s:%s", host, port)
ENV_CONFIG = append(ENV_CONFIG, httpProxy1, httpProxy2)
httpsProxy1 := fmt.Sprintf("HTTPS_PROXY=http://%s:%s", host, port)
httpsProxy2 := fmt.Sprintf("https_proxy=http://%s:%s", host, port)
ENV_CONFIG = append(ENV_CONFIG, httpsProxy1, httpsProxy2)
if enable {
ENV_CONFIG = make([]string, 0)
}
return nil
}
+43 -43
View File
@@ -1,43 +1,43 @@
//go:build windows
// +build windows
package main
import (
"fmt"
"syscall"
"golang.org/x/sys/windows/registry"
)
func setProxy(enable bool, host string, port string) error {
k, _, err := registry.CreateKey(
registry.CURRENT_USER,
`Software\Microsoft\Windows\CurrentVersion\Internet Settings`,
registry.SET_VALUE,
)
if err != nil {
return err
}
if enable {
k.SetDWordValue("ProxyEnable", 1)
addr := fmt.Sprintf("%s:%s", host, port)
val := fmt.Sprintf("http=%s;https=%s", addr, addr)
k.SetStringValue("ProxyServer", val)
} else {
k.SetDWordValue("ProxyEnable", 0)
}
k.Close()
d := syscall.NewLazyDLL("wininet.dll")
o := d.NewProc("InternetSetOptionW")
o.Call(0, 39, 0, 0)
o.Call(0, 37, 0, 0)
return nil
}
//go:build windows
// +build windows
package main
import (
"fmt"
"syscall"
"golang.org/x/sys/windows/registry"
)
func setProxy(enable bool, host string, port string) error {
k, _, err := registry.CreateKey(
registry.CURRENT_USER,
`Software\Microsoft\Windows\CurrentVersion\Internet Settings`,
registry.SET_VALUE,
)
if err != nil {
return err
}
if enable {
k.SetDWordValue("ProxyEnable", 1)
addr := fmt.Sprintf("%s:%s", host, port)
val := fmt.Sprintf("http=%s;https=%s", addr, addr)
k.SetStringValue("ProxyServer", val)
} else {
k.SetDWordValue("ProxyEnable", 0)
}
k.Close()
d := syscall.NewLazyDLL("wininet.dll")
o := d.NewProc("InternetSetOptionW")
o.Call(0, 39, 0, 0)
o.Call(0, 37, 0, 0)
return nil
}