Skip to content

Commit 3500fce

Browse files
committed
close: Implement CloseNow
Closes #384
1 parent 1dbc141 commit 3500fce

File tree

3 files changed

+22
-1
lines changed

3 files changed

+22
-1
lines changed

close.go

+10-1
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,15 @@ func (c *Conn) Close(code StatusCode, reason string) error {
102102
return c.closeHandshake(code, reason)
103103
}
104104

105+
// CloseNow closes the WebSocket connection without attempting a close handshake.
106+
// Use When you do not want the overhead of the close handshake.
107+
func (c *Conn) CloseNow() (err error) {
108+
defer errd.Wrap(&err, "failed to close WebSocket")
109+
110+
c.close(nil)
111+
return c.closeErr
112+
}
113+
105114
func (c *Conn) closeHandshake(code StatusCode, reason string) (err error) {
106115
defer errd.Wrap(&err, "failed to close WebSocket")
107116

@@ -265,7 +274,7 @@ func (c *Conn) setCloseErr(err error) {
265274
}
266275

267276
func (c *Conn) setCloseErrLocked(err error) {
268-
if c.closeErr == nil {
277+
if c.closeErr == nil && err != nil {
269278
c.closeErr = fmt.Errorf("WebSocket closed: %w", err)
270279
}
271280
}

conn.go

+3
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,9 @@ func (c *Conn) close(err error) {
147147
if c.isClosed() {
148148
return
149149
}
150+
if err == nil {
151+
err = c.rwc.Close()
152+
}
150153
c.setCloseErrLocked(err)
151154
close(c.closed)
152155
runtime.SetFinalizer(c, nil)

conn_test.go

+9
Original file line numberDiff line numberDiff line change
@@ -295,6 +295,15 @@ func TestConn(t *testing.T) {
295295
err = c1.Close(websocket.StatusNormalClosure, "")
296296
assert.Success(t, err)
297297
})
298+
299+
t.Run("CloseNow", func(t *testing.T) {
300+
_, c1, c2 := newConnTest(t, nil, nil)
301+
302+
err1 := c1.CloseNow()
303+
err2 := c2.CloseNow()
304+
assert.Success(t, err1)
305+
assert.Success(t, err2)
306+
})
298307
}
299308

300309
func TestWasm(t *testing.T) {

0 commit comments

Comments
 (0)