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.
This commit is contained in:
Gary Burd 2017-12-28 07:29:59 -08:00 committed by GitHub
parent cdedf21e58
commit d965e9adc6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 8 additions and 4 deletions

12
conn.go
View File

@ -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) { func (c *Conn) SetCloseHandler(h func(code int, text string) error) {
if h == nil { if h == nil {
h = func(code int, text string) error { h = func(code int, text string) error {
message := []byte{} message := FormatCloseMessage(code, "")
if code != CloseNoStatusReceived {
message = FormatCloseMessage(code, "")
}
c.WriteControl(CloseMessage, message, time.Now().Add(writeWait)) c.WriteControl(CloseMessage, message, time.Now().Add(writeWait))
return nil return nil
} }
@ -1142,7 +1139,14 @@ func (c *Conn) SetCompressionLevel(level int) error {
} }
// FormatCloseMessage formats closeCode and text as a WebSocket close message. // 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 { 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)) buf := make([]byte, 2+len(text))
binary.BigEndian.PutUint16(buf, uint16(closeCode)) binary.BigEndian.PutUint16(buf, uint16(closeCode))
copy(buf[2:], text) copy(buf[2:], text)