77 lines
2.3 KiB
Go
77 lines
2.3 KiB
Go
|
package websocket
|
||
|
|
||
|
import (
|
||
|
"errors"
|
||
|
"fmt"
|
||
|
)
|
||
|
|
||
|
// StatusCode represents a WebSocket status code.
|
||
|
// https://tools.ietf.org/html/rfc6455#section-7.4
|
||
|
type StatusCode int
|
||
|
|
||
|
// https://www.iana.org/assignments/websocket/websocket.xhtml#close-code-number
|
||
|
//
|
||
|
// These are only the status codes defined by the protocol.
|
||
|
//
|
||
|
// You can define custom codes in the 3000-4999 range.
|
||
|
// The 3000-3999 range is reserved for use by libraries, frameworks and applications.
|
||
|
// The 4000-4999 range is reserved for private use.
|
||
|
const (
|
||
|
StatusNormalClosure StatusCode = 1000
|
||
|
StatusGoingAway StatusCode = 1001
|
||
|
StatusProtocolError StatusCode = 1002
|
||
|
StatusUnsupportedData StatusCode = 1003
|
||
|
|
||
|
// 1004 is reserved and so unexported.
|
||
|
statusReserved StatusCode = 1004
|
||
|
|
||
|
// StatusNoStatusRcvd cannot be sent in a close message.
|
||
|
// It is reserved for when a close message is received without
|
||
|
// a status code.
|
||
|
StatusNoStatusRcvd StatusCode = 1005
|
||
|
|
||
|
// StatusAbnormalClosure is exported for use only with Wasm.
|
||
|
// In non Wasm Go, the returned error will indicate whether the
|
||
|
// connection was closed abnormally.
|
||
|
StatusAbnormalClosure StatusCode = 1006
|
||
|
|
||
|
StatusInvalidFramePayloadData StatusCode = 1007
|
||
|
StatusPolicyViolation StatusCode = 1008
|
||
|
StatusMessageTooBig StatusCode = 1009
|
||
|
StatusMandatoryExtension StatusCode = 1010
|
||
|
StatusInternalError StatusCode = 1011
|
||
|
StatusServiceRestart StatusCode = 1012
|
||
|
StatusTryAgainLater StatusCode = 1013
|
||
|
StatusBadGateway StatusCode = 1014
|
||
|
|
||
|
// StatusTLSHandshake is only exported for use with Wasm.
|
||
|
// In non Wasm Go, the returned error will indicate whether there was
|
||
|
// a TLS handshake failure.
|
||
|
StatusTLSHandshake StatusCode = 1015
|
||
|
)
|
||
|
|
||
|
// CloseError is returned when the connection is closed with a status and reason.
|
||
|
//
|
||
|
// Use Go 1.13's errors.As to check for this error.
|
||
|
// Also see the CloseStatus helper.
|
||
|
type CloseError struct {
|
||
|
Code StatusCode
|
||
|
Reason string
|
||
|
}
|
||
|
|
||
|
func (ce CloseError) Error() string {
|
||
|
return fmt.Sprintf("status = %v and reason = %q", ce.Code, ce.Reason)
|
||
|
}
|
||
|
|
||
|
// CloseStatus is a convenience wrapper around Go 1.13's errors.As to grab
|
||
|
// the status code from a CloseError.
|
||
|
//
|
||
|
// -1 will be returned if the passed error is nil or not a CloseError.
|
||
|
func CloseStatus(err error) StatusCode {
|
||
|
var ce CloseError
|
||
|
if errors.As(err, &ce) {
|
||
|
return ce.Code
|
||
|
}
|
||
|
return -1
|
||
|
}
|