proxy-go/main.go

87 lines
2.1 KiB
Go

package main
import (
"log"
"net/http"
"os"
"os/signal"
"proxy-go/internal/compression"
"proxy-go/internal/config"
"proxy-go/internal/handler"
"proxy-go/internal/middleware"
"strings"
"syscall"
)
func main() {
// 加载配置
cfg, err := config.Load("data/config.json")
if err != nil {
log.Fatal("Error loading config:", err)
}
// 创建压缩管理器
compManager := compression.NewManager(compression.Config{
Gzip: compression.CompressorConfig(cfg.Compression.Gzip),
Brotli: compression.CompressorConfig(cfg.Compression.Brotli),
})
// 创建代理处理器
proxyHandler := handler.NewProxyHandler(cfg.MAP)
// 创建 CDNJS 中间件配置
cdnjsConfigs := []middleware.CDNJSConfig{
{
Path: "/cdnjs",
TargetHost: "cdnjs.cloudflare.com",
TargetURL: "https://cdnjs.cloudflare.com",
},
{
Path: "/jsdelivr",
TargetHost: "cdn.jsdelivr.net",
TargetURL: "https://cdn.jsdelivr.net",
},
}
// 创建主处理器
mainHandler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if strings.HasPrefix(r.URL.Path, "/cdnjs") {
// CDNJS 请求使用 CDNJS 中间件处理
handler := middleware.CDNJSMiddleware(cdnjsConfigs)(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {}))
handler.ServeHTTP(w, r)
} else {
// 非 CDNJS 请求使用普通代理处理器
proxyHandler.ServeHTTP(w, r)
}
})
// 对非 CDNJS 请求添加压缩中间件
var handler http.Handler = mainHandler
if cfg.Compression.Gzip.Enabled || cfg.Compression.Brotli.Enabled {
handler = middleware.CompressionMiddleware(compManager)(handler)
}
// 创建服务器
server := &http.Server{
Addr: ":80",
Handler: handler,
}
// 优雅关闭
go func() {
sigChan := make(chan os.Signal, 1)
signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM)
<-sigChan
log.Println("Shutting down server...")
if err := server.Close(); err != nil {
log.Printf("Error during server shutdown: %v\n", err)
}
}()
// 启动服务器
log.Println("Starting proxy server on :80")
if err := server.ListenAndServe(); err != http.ErrServerClosed {
log.Fatal("Error starting server:", err)
}
}