94 lines
2.3 KiB
Go
94 lines
2.3 KiB
Go
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)
|
||
}
|
||
}
|