Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit c3bf516

Browse files
committed
move to coderd.go
1 parent 9472717 commit c3bf516

File tree

6 files changed

+65
-75
lines changed

6 files changed

+65
-75
lines changed

coderd/coderd.go

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
package coderd
22

33
import (
4+
"fmt"
45
"net/http"
56
"net/url"
7+
"strings"
68
"sync"
79
"time"
810

@@ -199,3 +201,37 @@ type api struct {
199201
websocketWaitMutex sync.Mutex
200202
websocketWaitGroup sync.WaitGroup
201203
}
204+
205+
const websocketCloseMaxLen = 123
206+
207+
// fmtWebsocketCloseMsg formats a websocket close message and ensures it is
208+
// truncated to the maximum allowed length.
209+
func FmtWebsocketCloseMsg(format string, vars ...any) string {
210+
msg := fmt.Sprintf(format, vars...)
211+
212+
// Cap msg length at 123 bytes. nhooyr/websocket only allows close messages
213+
// of this length.
214+
if len(msg) > websocketCloseMaxLen {
215+
// truncateString safely truncates a string to a maximum size of byteLen. It
216+
// writes whole runes until a single rune would increase the string size above
217+
// byteLen.
218+
truncateString := func(str string, byteLen int) string {
219+
builder := strings.Builder{}
220+
builder.Grow(byteLen)
221+
222+
for _, char := range str {
223+
if builder.Len()+len(string(char)) > byteLen {
224+
break
225+
}
226+
227+
_, _ = builder.WriteRune(char)
228+
}
229+
230+
return builder.String()
231+
}
232+
233+
return truncateString(msg, websocketCloseMaxLen)
234+
}
235+
236+
return msg
237+
}

coderd/coderd_test.go

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,35 @@
11
package coderd_test
22

33
import (
4+
"strings"
45
"testing"
56

7+
"github.com/stretchr/testify/assert"
68
"go.uber.org/goleak"
9+
10+
"github.com/coder/coder/coderd"
711
)
812

913
func TestMain(m *testing.M) {
1014
goleak.VerifyTestMain(m)
1115
}
16+
17+
func TestFmtWebsocketCloseMsg(t *testing.T) {
18+
t.Parallel()
19+
20+
t.Run("TruncateSingleByteCharacters", func(t *testing.T) {
21+
t.Parallel()
22+
23+
msg := strings.Repeat("d", 255)
24+
trunc := coderd.FmtWebsocketCloseMsg(msg)
25+
assert.LessOrEqual(t, len(trunc), 123)
26+
})
27+
28+
t.Run("TruncateMultiByteCharacters", func(t *testing.T) {
29+
t.Parallel()
30+
31+
msg := strings.Repeat("こんにちは", 10)
32+
trunc := coderd.FmtWebsocketCloseMsg(msg)
33+
assert.LessOrEqual(t, len(trunc), 123)
34+
})
35+
}

coderd/provisionerdaemons.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ func (api *api) provisionerDaemonsListen(rw http.ResponseWriter, r *http.Request
5656
Provisioners: []database.ProvisionerType{database.ProvisionerTypeEcho, database.ProvisionerTypeTerraform},
5757
})
5858
if err != nil {
59-
_ = conn.Close(websocket.StatusInternalError, fmtWebsocketCloseMsg("insert provisioner daemon: %s", err))
59+
_ = conn.Close(websocket.StatusInternalError, FmtWebsocketCloseMsg("insert provisioner daemon: %s", err))
6060
return
6161
}
6262

@@ -67,7 +67,7 @@ func (api *api) provisionerDaemonsListen(rw http.ResponseWriter, r *http.Request
6767
config.LogOutput = io.Discard
6868
session, err := yamux.Server(websocket.NetConn(r.Context(), conn, websocket.MessageBinary), config)
6969
if err != nil {
70-
_ = conn.Close(websocket.StatusInternalError, fmtWebsocketCloseMsg("multiplex server: %s", err))
70+
_ = conn.Close(websocket.StatusInternalError, FmtWebsocketCloseMsg("multiplex server: %s", err))
7171
return
7272
}
7373
mux := drpcmux.New()
@@ -80,13 +80,13 @@ func (api *api) provisionerDaemonsListen(rw http.ResponseWriter, r *http.Request
8080
Logger: api.Logger.Named(fmt.Sprintf("provisionerd-%s", daemon.Name)),
8181
})
8282
if err != nil {
83-
_ = conn.Close(websocket.StatusInternalError, fmtWebsocketCloseMsg("drpc register provisioner daemon: %s", err))
83+
_ = conn.Close(websocket.StatusInternalError, FmtWebsocketCloseMsg("drpc register provisioner daemon: %s", err))
8484
return
8585
}
8686
server := drpcserver.New(mux)
8787
err = server.Serve(r.Context(), session)
8888
if err != nil {
89-
_ = conn.Close(websocket.StatusInternalError, fmtWebsocketCloseMsg("serve: %s", err))
89+
_ = conn.Close(websocket.StatusInternalError, FmtWebsocketCloseMsg("serve: %s", err))
9090
return
9191
}
9292
_ = conn.Close(websocket.StatusGoingAway, "")

coderd/workspaceresources.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ func (api *api) workspaceResourceDial(rw http.ResponseWriter, r *http.Request) {
108108
Pubsub: api.Pubsub,
109109
})
110110
if err != nil {
111-
_ = conn.Close(websocket.StatusInternalError, fmtWebsocketCloseMsg("serve: %s", err))
111+
_ = conn.Close(websocket.StatusInternalError, FmtWebsocketCloseMsg("serve: %s", err))
112112
return
113113
}
114114
}

coderd/ws.go

Lines changed: 0 additions & 40 deletions
This file was deleted.

coderd/ws_test.go

Lines changed: 0 additions & 30 deletions
This file was deleted.

0 commit comments

Comments
 (0)