Skip to content

Commit e61be34

Browse files
committed
fixing #190
doing #190
1 parent a776c80 commit e61be34

3 files changed

Lines changed: 84 additions & 1 deletion

File tree

.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,4 +16,5 @@
1616
*.log
1717
external_tools/*/main
1818
*plan.md
19-
ignores/
19+
ignores/
20+
.DS_Store

web/urlpattern.go

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,12 @@ const (
1616
FnTeardownRequest = "TeardownRequest"
1717
)
1818

19+
// websocket 定义函数名
20+
const (
21+
FnWebSocketCommunicate = "Communicate"
22+
FnWebSocketBaseHandler = "WSBaseHandler"
23+
)
24+
1925
// UrlPatternHandle 是URL路由句柄,用来驱动url路由以及其映射的handler
2026
type UrlPatternHandle struct {
2127
Handler reflect.Type
@@ -73,6 +79,17 @@ func (urlPattern *UrlPattern) AppendRouterPattern(pattern Pattern, v interface {
7379
fileRouter.PathPrefix("/").Handler(http.StripPrefix(pattern.Url, fileServer))
7480
return
7581
}
82+
// 判断是否是Websocket
83+
if _, isWSHandler := v.(*WSPatternHandle); isWSHandler {
84+
var wsMiddleware []middleware
85+
for _, mv := range pattern.Middleware {
86+
m := convertHandleFuncMV(mv)
87+
wsMiddleware = append(wsMiddleware, m)
88+
}
89+
wsMiddlewares := chainMiddleware(wsMiddleware...)
90+
urlPattern.router.HandleFunc(pattern.Url, wsMiddlewares(v.Handle))
91+
return
92+
}
7693
// 判断是否是handler
7794
baseMiddleware := []middleware{HttpContextLogMiddleware, InternalServerErrorMiddleware}
7895
for _, mv := range pattern.Middleware {
@@ -90,6 +107,16 @@ func (urlPattern *UrlPattern) Init() {
90107
if handlerType.Kind() == reflect.Ptr {
91108
handlerType = handlerType.Elem()
92109
}
110+
// 判断是否是 WSHandlerInterface 接口类型
111+
// 判断 handlerType 是否包含成员变量 WSBaseHandler
112+
_, isWSHandler := handlerType.FieldByName(FnWebSocketBaseHandler)
113+
if isWSHandler {
114+
urlPattern.AppendRouterPattern(pattern, &WSPatternHandle{
115+
Handler: handlerType,
116+
requestUrl: pattern.Url,
117+
})
118+
continue
119+
}
93120
urlPattern.AppendRouterPattern(pattern, &UrlPatternHandle{
94121
Handler: handlerType,
95122
requestUrl: pattern.Url,

web/wshandler.go

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package web
2+
3+
import (
4+
"net/http"
5+
"reflect"
6+
7+
"github.com/gorilla/websocket"
8+
"github.com/karldoenitz/Tigo/logger"
9+
)
10+
11+
// 定义一个 Upgrader,用于处理 HTTP 升级请求
12+
var upgrader = websocket.Upgrader{
13+
CheckOrigin: func(r *http.Request) bool {
14+
return true // 开发时允许所有跨域,生产环境应严格校验 Origin 头
15+
},
16+
}
17+
18+
// SetWSUpgrader 设置 websocket 升级器
19+
// - u: 自定义的升级器
20+
func SetWSUpgrader(u *websocket.Upgrader) {
21+
upgrader = *u
22+
}
23+
24+
type WSPatternHandle struct {
25+
Handler reflect.Type
26+
requestUrl string
27+
}
28+
29+
func (wsHandler WSPatternHandle) Handle(responseWriter http.ResponseWriter, request *http.Request) {
30+
// 加载handler
31+
handler := reflect.New(wsHandler.Handler)
32+
// 1. 将 HTTP 连接升级为 WebSocket 连接
33+
conn, err := upgrader.Upgrade(responseWriter, request, nil)
34+
if err != nil {
35+
logger.Error.Println("升级失败:", err)
36+
return
37+
}
38+
defer func() {
39+
// 关闭连接
40+
_ = conn.Close()
41+
}()
42+
logger.Info.Printf("websocket | %s | connect success", wsHandler.requestUrl)
43+
// 调用 Communicate 方法
44+
VoidFuncCall(handler, FnWebSocketCommunicate, reflect.ValueOf(conn))
45+
}
46+
47+
type WSBaseHandler struct {
48+
}
49+
50+
func (h *WSBaseHandler) Communicate(conn *websocket.Conn) {
51+
respMsg := []byte("Communicate is not implemented")
52+
if err := conn.WriteMessage(websocket.TextMessage, respMsg); err != nil {
53+
logger.Error.Println("发送错误:", err)
54+
}
55+
}

0 commit comments

Comments
 (0)