package main import ( "fmt" "log" "net/http" "time" "github.com/darkit/goproxy" "github.com/darkit/goproxy/config" ) // 自定义代理委托实现 type CustomDelegate struct { goproxy.DefaultDelegate logger *log.Logger } // 创建自定义代理委托 func NewCustomDelegate() *CustomDelegate { return &CustomDelegate{ logger: log.New(log.Writer(), "[反向代理] ", log.LstdFlags), } } // 连接处理 func (d *CustomDelegate) Connect(ctx *goproxy.Context, rw http.ResponseWriter) { d.logger.Printf("新连接: %s -> %s", ctx.Req.RemoteAddr, ctx.Req.Host) } // 请求前处理 func (d *CustomDelegate) BeforeRequest(ctx *goproxy.Context) { // 添加自定义请求头 ctx.Req.Header.Set("X-Proxy-Time", time.Now().Format(time.RFC3339)) ctx.Req.Header.Set("X-Proxy-ID", "custom-proxy-1") d.logger.Printf("处理请求: %s %s", ctx.Req.Method, ctx.Req.URL.String()) } // 响应前处理 func (d *CustomDelegate) BeforeResponse(ctx *goproxy.Context, resp *http.Response, err error) { if err != nil { d.logger.Printf("请求错误: %s", err.Error()) return } if resp != nil { // 添加自定义响应头 resp.Header.Set("X-Proxy-Server", "GoProxy") // 记录响应状态 d.logger.Printf("响应状态: %d %s", resp.StatusCode, http.StatusText(resp.StatusCode)) } } // 请求完成处理 func (d *CustomDelegate) Finish(ctx *goproxy.Context) { d.logger.Printf("请求完成: %s %s", ctx.Req.Method, ctx.Req.URL.String()) } // 错误日志 func (d *CustomDelegate) ErrorLog(err error) { d.logger.Printf("错误: %s", err.Error()) } func main() { // 创建基本配置 cfg := config.DefaultConfig() // 配置反向代理 cfg.ReverseProxy = true // 启用反向代理模式 cfg.ListenAddr = ":8080" // 监听本地8080端口 cfg.TargetAddr = "http://example.com" // 转发到example.com // 启用基本功能 cfg.PreserveClientIP = true // 保留客户端IP cfg.AddXForwardedFor = true // 添加X-Forwarded-For头 // 创建自定义代理委托 delegate := NewCustomDelegate() // 创建代理实例 proxy := goproxy.New(&goproxy.Options{ Config: cfg, Delegate: delegate, // 使用自定义委托 }) // 启动服务器 fmt.Println("反向代理启动在 :8080,转发到 http://example.com") if err := http.ListenAndServe(":8080", proxy); err != nil { log.Fatalf("服务器启动失败: %v", err) } }