121 lines
3.4 KiB
Go
121 lines
3.4 KiB
Go
package goproxy
|
|
|
|
import (
|
|
"net/http"
|
|
"net/url"
|
|
)
|
|
|
|
// Delegate 代理委托接口
|
|
// 定义了代理处理请求的各个阶段的回调方法
|
|
type Delegate interface {
|
|
// Connect 连接事件
|
|
Connect(ctx *Context, rw http.ResponseWriter)
|
|
|
|
// Auth 认证事件
|
|
Auth(ctx *Context, rw http.ResponseWriter)
|
|
|
|
// BeforeRequest 请求前事件
|
|
BeforeRequest(ctx *Context)
|
|
|
|
// BeforeResponse 响应前事件
|
|
BeforeResponse(ctx *Context, resp *http.Response, err error)
|
|
|
|
// WebSocketSendMessage websocket发送消息拦截
|
|
WebSocketSendMessage(ctx *Context, messageType *int, p *[]byte)
|
|
|
|
// WebSocketReceiveMessage websocket接收消息拦截
|
|
WebSocketReceiveMessage(ctx *Context, messageType *int, p *[]byte)
|
|
|
|
// ParentProxy 获取上级代理
|
|
ParentProxy(req *http.Request) (*url.URL, error)
|
|
|
|
// ErrorLog 错误日志
|
|
ErrorLog(err error)
|
|
|
|
// Finish 完成事件
|
|
Finish(ctx *Context)
|
|
|
|
// 以下是反向代理相关的方法
|
|
|
|
// ResolveBackend 解析后端服务器
|
|
// 在反向代理模式下,根据请求确定应该转发到哪个后端服务器
|
|
ResolveBackend(req *http.Request) (string, error)
|
|
|
|
// ModifyRequest 修改请求
|
|
// 在反向代理模式下,可以修改发往后端服务器的请求
|
|
ModifyRequest(req *http.Request)
|
|
|
|
// ModifyResponse 修改响应
|
|
// 在反向代理模式下,可以修改来自后端服务器的响应
|
|
ModifyResponse(resp *http.Response) error
|
|
|
|
// HandleError 处理错误
|
|
// 在反向代理模式下,可以自定义错误处理逻辑
|
|
HandleError(rw http.ResponseWriter, req *http.Request, err error)
|
|
}
|
|
|
|
// DefaultDelegate 默认代理委托
|
|
type DefaultDelegate struct{}
|
|
|
|
// Connect 连接事件
|
|
func (d *DefaultDelegate) Connect(ctx *Context, rw http.ResponseWriter) {}
|
|
|
|
// Auth 认证事件
|
|
func (d *DefaultDelegate) Auth(ctx *Context, rw http.ResponseWriter) {}
|
|
|
|
// BeforeRequest 请求前事件
|
|
func (d *DefaultDelegate) BeforeRequest(ctx *Context) {}
|
|
|
|
// BeforeResponse 响应前事件
|
|
func (d *DefaultDelegate) BeforeResponse(ctx *Context, resp *http.Response, err error) {
|
|
// 默认实现不做任何处理
|
|
}
|
|
|
|
// ParentProxy 获取上级代理
|
|
func (d *DefaultDelegate) ParentProxy(req *http.Request) (*url.URL, error) {
|
|
// 默认实现不使用上级代理
|
|
return nil, nil
|
|
}
|
|
|
|
// WebSocketSendMessage websocket发送消息拦截
|
|
func (h *DefaultDelegate) WebSocketSendMessage(ctx *Context, messageType *int, payload *[]byte) {
|
|
// 默认实现不做任何处理
|
|
}
|
|
|
|
// WebSocketReceiveMessage websocket接收消息拦截
|
|
func (h *DefaultDelegate) WebSocketReceiveMessage(ctx *Context, messageType *int, payload *[]byte) {
|
|
// 默认实现不做任何处理
|
|
}
|
|
|
|
// ErrorLog 错误日志
|
|
func (d *DefaultDelegate) ErrorLog(err error) {
|
|
// 默认实现不做任何处理
|
|
}
|
|
|
|
// Finish 完成事件
|
|
func (d *DefaultDelegate) Finish(ctx *Context) {
|
|
// 默认实现不做任何处理
|
|
}
|
|
|
|
// ResolveBackend 解析后端服务器
|
|
func (d *DefaultDelegate) ResolveBackend(req *http.Request) (string, error) {
|
|
// 默认实现返回请求中的主机
|
|
return req.Host, nil
|
|
}
|
|
|
|
// ModifyRequest 修改请求
|
|
func (d *DefaultDelegate) ModifyRequest(req *http.Request) {
|
|
// 默认实现不做任何修改
|
|
}
|
|
|
|
// ModifyResponse 修改响应
|
|
func (d *DefaultDelegate) ModifyResponse(resp *http.Response) error {
|
|
// 默认实现不做任何修改
|
|
return nil
|
|
}
|
|
|
|
// HandleError 处理错误
|
|
func (d *DefaultDelegate) HandleError(rw http.ResponseWriter, req *http.Request, err error) {
|
|
http.Error(rw, err.Error(), http.StatusBadGateway)
|
|
}
|