Files
demo/cmd/middleware_reverse_proxy.go
2025-03-14 18:50:49 +00:00

94 lines
2.3 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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)
}
}