feat(gateway): 添加协议自动检测和补全功能
- 实现 hasProtocol 函数检查字符串是否包含协议前缀 - 支持 http、https、ws、wss 协议检测 - 自动为没有协议的主机地址添加相应协议前缀 - 根据请求类型判断协议:WebSocket 使用 ws,HTTP 使用 http - 优化反向代理请求构建逻辑main v1.0.1014
parent
969322a912
commit
737fd041a0
|
|
@ -4,16 +4,36 @@ import (
|
|||
"net/http"
|
||||
"net/http/httputil"
|
||||
"net/url"
|
||||
"strings"
|
||||
|
||||
"git.magicany.cc/black1552/gf-common/log"
|
||||
"github.com/gogf/gf/v2/net/ghttp"
|
||||
"github.com/gogf/gf/v2/os/gctx"
|
||||
)
|
||||
|
||||
// hasProtocol 检查字符串是否包含协议前缀
|
||||
func hasProtocol(s string) bool {
|
||||
return strings.HasPrefix(s, "http://") ||
|
||||
strings.HasPrefix(s, "https://") ||
|
||||
strings.HasPrefix(s, "ws://") ||
|
||||
strings.HasPrefix(s, "wss://")
|
||||
}
|
||||
|
||||
// BuildRequest 反向代理请求到指定主机
|
||||
// 自动支持所有 HTTP 方法及 WebSocket 连接
|
||||
func BuildRequest(r *ghttp.Request, host string) {
|
||||
targetURL, err := url.Parse(host)
|
||||
// 自动添加协议前缀
|
||||
targetHost := host
|
||||
if !hasProtocol(host) {
|
||||
// 根据请求判断协议:WebSocket 用 ws,普通 HTTP 用 http
|
||||
if r.Header.Get("Upgrade") == "websocket" {
|
||||
targetHost = "ws://" + host
|
||||
} else {
|
||||
targetHost = "http://" + host
|
||||
}
|
||||
}
|
||||
|
||||
targetURL, err := url.Parse(targetHost)
|
||||
if err != nil {
|
||||
log.Error(gctx.New(), "parse target host error:", err)
|
||||
r.Response.WriteStatus(http.StatusInternalServerError)
|
||||
|
|
|
|||
Loading…
Reference in New Issue