Skip to content

Commit a4af26e

Browse files
committed
hotfix: close received after close
waitCloseHandshake waits for client to respond with close frame but handleControl receives it and writes close again which may cause errors for some clients
1 parent faf23b7 commit a4af26e

File tree

2 files changed

+8
-4
lines changed

2 files changed

+8
-4
lines changed

close.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -214,7 +214,7 @@ func (c *Conn) waitCloseHandshake() error {
214214
}
215215

216216
for {
217-
h, err := c.readLoop(ctx)
217+
h, err := c.readLoop(ctx, true)
218218
if err != nil {
219219
return err
220220
}

read.go

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,8 @@ func (c *Conn) readRSV1Illegal(h header) bool {
180180
return false
181181
}
182182

183-
func (c *Conn) readLoop(ctx context.Context) (header, error) {
183+
func (c *Conn) readLoop(ctx context.Context, ignoreControl bool) (header, error) {
184+
184185
for {
185186
h, err := c.readFrameHeader(ctx)
186187
if err != nil {
@@ -199,6 +200,9 @@ func (c *Conn) readLoop(ctx context.Context) (header, error) {
199200

200201
switch h.opcode {
201202
case opClose, opPing, opPong:
203+
if ignoreControl {
204+
return h, nil
205+
}
202206
err = c.handleControl(ctx, h)
203207
if err != nil {
204208
// Pass through CloseErrors when receiving a close frame.
@@ -344,7 +348,7 @@ func (c *Conn) reader(ctx context.Context) (_ MessageType, _ io.Reader, err erro
344348
return 0, nil, errors.New("previous message not read to completion")
345349
}
346350

347-
h, err := c.readLoop(ctx)
351+
h, err := c.readLoop(ctx, false)
348352
if err != nil {
349353
return 0, nil, err
350354
}
@@ -429,7 +433,7 @@ func (mr *msgReader) read(p []byte) (int, error) {
429433
return 0, io.EOF
430434
}
431435

432-
h, err := mr.c.readLoop(mr.ctx)
436+
h, err := mr.c.readLoop(mr.ctx, false)
433437
if err != nil {
434438
return 0, err
435439
}

0 commit comments

Comments
 (0)