From d965e9adc66deebadcc7d0c6c7598e2a4baa7838 Mon Sep 17 00:00:00 2001 From: Gary Burd Date: Thu, 28 Dec 2017 07:29:59 -0800 Subject: [PATCH] Handle no status in FormatCloseMessage Return empty message for CloseNoStatusReceived. This status indicates that the message is empty, so make it so. Because it's illegal to send CloseNoStatusReceived, this change should not break a correct application. --- conn.go | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/conn.go b/conn.go index 7d7f140..b54ef65 100644 --- a/conn.go +++ b/conn.go @@ -1061,10 +1061,7 @@ func (c *Conn) CloseHandler() func(code int, text string) error { func (c *Conn) SetCloseHandler(h func(code int, text string) error) { if h == nil { h = func(code int, text string) error { - message := []byte{} - if code != CloseNoStatusReceived { - message = FormatCloseMessage(code, "") - } + message := FormatCloseMessage(code, "") c.WriteControl(CloseMessage, message, time.Now().Add(writeWait)) return nil } @@ -1142,7 +1139,14 @@ func (c *Conn) SetCompressionLevel(level int) error { } // FormatCloseMessage formats closeCode and text as a WebSocket close message. +// An empty message is returned for code CloseNoStatusReceived. func FormatCloseMessage(closeCode int, text string) []byte { + if closeCode == CloseNoStatusReceived { + // Return empty message because it's illegal to send + // CloseNoStatusReceived. Return non-nil value in case application + // checks for nil. + return []byte{} + } buf := make([]byte, 2+len(text)) binary.BigEndian.PutUint16(buf, uint16(closeCode)) copy(buf[2:], text)