5
0
mirror of https://github.com/wailsapp/wails.git synced 2025-05-01 13:50:17 +08:00

Merge pull request #4215 from superDingda/bugfix/4211_long_ws_msg_truncation

fix: prevent truncation of long WebSocket messages in dev mode
This commit is contained in:
Lea Anthony 2025-04-18 15:34:28 +10:00 committed by GitHub
commit 741ff242f7
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 56 additions and 33 deletions

View File

@ -15,6 +15,7 @@ require (
github.com/godbus/dbus/v5 v5.1.0
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510
github.com/google/uuid v1.6.0
github.com/gorilla/websocket v1.5.3
github.com/jackmordaunt/icns v1.0.0
github.com/jaypipes/ghw v0.13.0
github.com/labstack/echo/v4 v4.13.3

View File

@ -107,6 +107,8 @@ github.com/gookit/color v1.5.4 h1:FZmqs7XOyGgCAxmWyPslpiok1k05wmY3SJTytgvYFs0=
github.com/gookit/color v1.5.4/go.mod h1:pZJOeOS8DM43rXbp4AZo1n9zCU2qjpcRko0b6/QJi9w=
github.com/gorilla/css v1.0.1 h1:ntNaBIghp6JmvWnxbZKANoLyuXTPZ4cAMlo6RyhlbO8=
github.com/gorilla/css v1.0.1/go.mod h1:BvnYkspnSzMmwRK+b8/xgNPLiIuNZr6vbZBTPQ2A3b0=
github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg=
github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM=
github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg=
github.com/itchyny/gojq v0.12.13 h1:IxyYlHYIlspQHHTE0f3cJF0NKDMfajxViuhBLnHd/QU=

View File

@ -20,17 +20,23 @@ import (
"github.com/wailsapp/wails/v2/internal/frontend/runtime"
"github.com/gorilla/websocket"
"github.com/labstack/echo/v4"
"github.com/wailsapp/wails/v2/internal/binding"
"github.com/wailsapp/wails/v2/internal/frontend"
"github.com/wailsapp/wails/v2/internal/logger"
"github.com/wailsapp/wails/v2/internal/menumanager"
"github.com/wailsapp/wails/v2/pkg/options"
"golang.org/x/net/websocket"
)
type Screen = frontend.Screen
var upgrader = websocket.Upgrader{
ReadBufferSize: 1024,
WriteBufferSize: 1024,
CheckOrigin: func(r *http.Request) bool { return true },
}
type DevWebServer struct {
server *echo.Echo
ctx context.Context
@ -155,51 +161,64 @@ func (d *DevWebServer) handleReloadApp(c echo.Context) error {
}
func (d *DevWebServer) handleIPCWebSocket(c echo.Context) error {
websocket.Handler(func(c *websocket.Conn) {
d.LogDebug(fmt.Sprintf("Websocket client %p connected", c))
conn, err := upgrader.Upgrade(c.Response(), c.Request(), nil)
if err != nil {
d.logger.Error("WebSocket upgrade failed %v", err)
return err
}
d.LogDebug(fmt.Sprintf("WebSocket client %p connected", conn))
d.socketMutex.Lock()
d.websocketClients[conn] = &sync.Mutex{}
locker := d.websocketClients[conn]
d.socketMutex.Unlock()
var wg sync.WaitGroup
defer func() {
wg.Wait()
d.socketMutex.Lock()
d.websocketClients[c] = &sync.Mutex{}
locker := d.websocketClients[c]
delete(d.websocketClients, conn)
d.socketMutex.Unlock()
d.LogDebug(fmt.Sprintf("WebSocket client %p disconnected", conn))
conn.Close()
}()
defer func() {
d.socketMutex.Lock()
delete(d.websocketClients, c)
d.socketMutex.Unlock()
d.LogDebug(fmt.Sprintf("Websocket client %p disconnected", c))
}()
for {
_, msgBytes, err := conn.ReadMessage()
if err != nil {
break
}
var msg string
defer c.Close()
for {
if err := websocket.Message.Receive(c, &msg); err != nil {
break
}
// We do not support drag in browsers
if msg == "drag" {
continue
msg := string(msgBytes)
wg.Add(1)
go func(m string) {
defer wg.Done()
if m == "drag" {
return
}
// Notify the other browsers of "EventEmit"
if len(msg) > 2 && strings.HasPrefix(string(msg), "EE") {
d.notifyExcludingSender([]byte(msg), c)
if len(m) > 2 && strings.HasPrefix(m, "EE") {
d.notifyExcludingSender([]byte(m), conn)
}
// Send the message to dispatch to the frontend
result, err := d.dispatcher.ProcessMessage(string(msg), d)
result, err := d.dispatcher.ProcessMessage(m, d)
if err != nil {
d.logger.Error(err.Error())
}
if result != "" {
locker.Lock()
if err = websocket.Message.Send(c, result); err != nil {
locker.Unlock()
break
defer locker.Unlock()
if err := conn.WriteMessage(websocket.TextMessage, []byte(result)); err != nil {
d.logger.Error("Websocket write message failed %v", err)
}
locker.Unlock()
}
}
}).ServeHTTP(c.Response(), c.Request())
}(msg)
}
return nil
}
@ -222,7 +241,7 @@ func (d *DevWebServer) broadcast(message string) {
return
}
locker.Lock()
err := websocket.Message.Send(client, message)
err := client.WriteMessage(websocket.TextMessage, []byte(message))
if err != nil {
locker.Unlock()
d.logger.Error(err.Error())
@ -256,7 +275,7 @@ func (d *DevWebServer) broadcastExcludingSender(message string, sender *websocke
return
}
locker.Lock()
err := websocket.Message.Send(client, message)
err := client.WriteMessage(websocket.TextMessage, []byte(message))
if err != nil {
locker.Unlock()
d.logger.Error(err.Error())

View File

@ -28,6 +28,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Fixed window restoration behavior after minimization by @superDingda in [#4109](https://github.com/wailsapp/wails/issues/4109)
- Fixed excessive console logging after updating to v2.10.1 by @superDingda in [#4111](https://github.com/wailsapp/wails/issues/4111)
- Fixed incorrect Webview2 reg key in HKCU path by @leaanthony.
- Fixed long WebSocket messages being truncated in `wails dev` by @superDingda in [#4211](https://github.com/wailsapp/wails/issues/4211)
## v2.10.1 - 2025-02-24