-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathforward.go
More file actions
59 lines (48 loc) · 1.35 KB
/
forward.go
File metadata and controls
59 lines (48 loc) · 1.35 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
package dgws
import (
"sync/atomic"
dgctx "github.com/darwinOrg/go-common/context"
dglogger "github.com/darwinOrg/go-logger"
"github.com/darwinOrg/go-web/utils"
"github.com/gin-gonic/gin"
"github.com/gorilla/websocket"
)
func WebSocketForward(c *gin.Context, url string) {
externalConn, err := upgrader.Upgrade(c.Writer, c.Request, nil)
if externalConn != nil {
defer func() { _ = externalConn.Close() }()
}
ctx := utils.GetDgContext(c)
if err != nil {
dglogger.Errorf(ctx, "upgrader.Upgrade error: %v", err)
return
}
internalConn, _, err := websocket.DefaultDialer.Dial(url, c.Request.Header)
if internalConn != nil {
defer func() { _ = internalConn.Close() }()
}
if err != nil {
dglogger.Errorf(ctx, "dial internal server: %v", err)
return
}
needClose := new(atomic.Bool)
needClose.Store(false)
go func() {
syncWsMessage(ctx, internalConn, externalConn, needClose)
}()
syncWsMessage(ctx, externalConn, internalConn, needClose)
}
func syncWsMessage(ctx *dgctx.DgContext, sourceConn *websocket.Conn, destConn *websocket.Conn, needClose *atomic.Bool) {
for {
if needClose.Load() {
break
}
mt, message, err := sourceConn.ReadMessage()
_ = destConn.WriteMessage(mt, message)
if mt == websocket.CloseMessage || mt == -1 {
dglogger.Infof(ctx, "received close message, error: %v", err)
needClose.Store(true)
break
}
}
}