124 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			124 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package proxy
 | |
| 
 | |
| 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) {
 | |
| 	// 默认实现返回502错误
 | |
| 	http.Error(rw, err.Error(), http.StatusBadGateway)
 | |
| }
 |