/* Copyright (C) 2015 Neo Visionaries Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License")), you may not use this file except in
* compliance with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under the License is
* distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and limitations under the License. */
package com.github.czyzby.websocket.data;
/** Official close codes. Originally from the Neo Visionaries web socket library, modified to be an enum.
*
* @see <a href="http://tools.ietf.org/html/rfc6455#section-7.4.1" >RFC 6455, 7.4.1. Defined Status Codes</a> */
public enum WebSocketCloseCode {
/** 1000), <i> 1000 indicates a normal closure, meaning that the purpose for which the connection was established
* has been fulfilled. </i> */
NORMAL(1000),
/** 1001), <i> 1001 indicates that an endpoint is "going away", such as a server going down or a browser having
* navigated away from a page. </i> */
AWAY(1001),
/** 1002), <i> 1002 indicates that an endpoint is terminating the connection due to a protocol error. </i> */
UNCONFORMED(1002),
/** 1003; <i> 1003 indicates that an endpoint is terminating the connection because it has received a type of data
* it cannot accept (e.g., an endpoint that understands only text data MAY send this if it receives a binary
* message). </i> */
UNACCEPTABLE(1003),
/** 1005; <i> 1005 is a reserved value and MUST NOT be set as a status code in a Close control frame by an
* endpoint. It is designated for use in applications expecting a status code to indicate that no status code
* was actually present. </i> */
NONE(1005),
/** 1006; <i> 1006 is a reserved value and MUST NOT be set as a status code in a Close control frame by an
* endpoint. It is designated for use in applications expecting a status code to indicate that the connection
* was closed abnormally, e.g., without sending or receiving a Close control frame. </i> */
ABNORMAL(1006),
/** 1007; <i> 1007 indicates that an endpoint is terminating the connection because it has received data within a
* message that was not consistent with the type of the message (e.g., non-UTF-8 [
* <a href="http://tools.ietf.org/html/rfc3629">RFC3629</a>] data within a text message). </i> */
INCONSISTENT(1007),
/** 1008; <i> 1008 indicates that an endpoint is terminating the connection because it has received a message that
* violates its policy. This is a generic status code that can be returned when there is no other more suitable
* status code (e.g., 1003 or 1009) or if there is a need to hide specific details about the policy. </i> */
VIOLATED(1008),
/** 1009), <i> 1009 indicates that an endpoint is terminating the connection because it has received a message that
* is too big for it to process. </i> */
OVERSIZE(1009),
/** 1010; <i> 1010 indicates that an endpoint (client) is terminating the connection because it has expected the
* server to negotiate one or more extension, but the server didn't return them in the response message of the
* WebSocket handshake. The list of extensions that are needed SHOULD appear in the /reason/ part of the Close
* frame. Note that this status code is not used by the server, because it can fail the WebSocket handshake
* instead. </i> */
UNEXTENDED(1010),
/** 1011), <i> 1011 indicates that a server is terminating the connection because it encountered an unexpected
* condition that prevented it from fulfilling the request. </i> */
UNEXPECTED(1011),
/** 1015; <i> 1015 is a reserved value and MUST NOT be set as a status code in a Close control frame by an
* endpoint. It is designated for use in applications expecting a status code to indicate that the connection
* was closed due to a failure to perform a TLS handshake (e.g., the server certificate can't be
* verified). </i> */
INSECURE(1015);
private final int code;
private WebSocketCloseCode(final int code) {
this.code = code;
}
/** @return actual value of close code. */
public int getCode() {
return code;
}
/** @param code web socket close code. Usually in 1000-1011 range.
* @return close code enum constant connected with the passed code.
* @throws WebSocketException if invalid code is given. */
public static WebSocketCloseCode getByCode(final int code) throws WebSocketException {
// Ugly, but works without extra meta-data, like a map.
if (code == INSECURE.code) {
return INSECURE;
}
if (code < NORMAL.code || code > UNEXPECTED.code || code == 1004) {
throw new WebSocketException("Unexpected close code: " + code);
}
if (code < 1004) {
return values()[code - 1000];
}
// There's no 1004:
return values()[code - 1001];
}
/** @param code possibly valid close code.
* @param alternative returned if code is invalid.
* @return close code connected with the object or the alternative if code is invalid. */
public static WebSocketCloseCode getByCodeOrElse(final int code, final WebSocketCloseCode alternative) {
// Ugly, but works without extra meta-data, like a map.
if (code == INSECURE.code) {
return INSECURE;
}
if (code < NORMAL.code || code > UNEXPECTED.code || code == 1004) {
return alternative;
}
if (code < 1004) {
return values()[code - 1000];
}
// There's no 1004:
return values()[code - 1001];
}
}