This commit is contained in:
2025-03-15 10:17:07 +00:00
parent 1a53a9a8f3
commit 78f5fbf51a
24 changed files with 2915 additions and 282 deletions

View File

@@ -0,0 +1,93 @@
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)
}
}