| 1 | /* |
| 2 | * libwebsockets - small server side websockets and web server implementation |
| 3 | * |
| 4 | * Copyright (C) 2010 - 2019 Andy Green <andy@warmcat.com> |
| 5 | * |
| 6 | * Permission is hereby granted, free of charge, to any person obtaining a copy |
| 7 | * of this software and associated documentation files (the "Software"), to |
| 8 | * deal in the Software without restriction, including without limitation the |
| 9 | * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or |
| 10 | * sell copies of the Software, and to permit persons to whom the Software is |
| 11 | * furnished to do so, subject to the following conditions: |
| 12 | * |
| 13 | * The above copyright notice and this permission notice shall be included in |
| 14 | * all copies or substantial portions of the Software. |
| 15 | * |
| 16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
| 17 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
| 18 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
| 19 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
| 20 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING |
| 21 | * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS |
| 22 | * IN THE SOFTWARE. |
| 23 | */ |
| 24 | |
| 25 | /*! \defgroup wsclose Websocket Close |
| 26 | * |
| 27 | * ##Websocket close frame control |
| 28 | * |
| 29 | * When we close a ws connection, we can send a reason code and a short |
| 30 | * UTF-8 description back with the close packet. |
| 31 | */ |
| 32 | ///@{ |
| 33 | |
| 34 | /* |
| 35 | * NOTE: These public enums are part of the abi. If you want to add one, |
| 36 | * add it at where specified so existing users are unaffected. |
| 37 | */ |
| 38 | /** enum lws_close_status - RFC6455 close status codes */ |
| 39 | enum lws_close_status { |
| 40 | LWS_CLOSE_STATUS_NOSTATUS = 0, |
| 41 | LWS_CLOSE_STATUS_NORMAL = 1000, |
| 42 | /**< 1000 indicates a normal closure, meaning that the purpose for |
| 43 | which the connection was established has been fulfilled. */ |
| 44 | LWS_CLOSE_STATUS_GOINGAWAY = 1001, |
| 45 | /**< 1001 indicates that an endpoint is "going away", such as a server |
| 46 | going down or a browser having navigated away from a page. */ |
| 47 | LWS_CLOSE_STATUS_PROTOCOL_ERR = 1002, |
| 48 | /**< 1002 indicates that an endpoint is terminating the connection due |
| 49 | to a protocol error. */ |
| 50 | LWS_CLOSE_STATUS_UNACCEPTABLE_OPCODE = 1003, |
| 51 | /**< 1003 indicates that an endpoint is terminating the connection |
| 52 | because it has received a type of data it cannot accept (e.g., an |
| 53 | endpoint that understands only text data MAY send this if it |
| 54 | receives a binary message). */ |
| 55 | LWS_CLOSE_STATUS_RESERVED = 1004, |
| 56 | /**< Reserved. The specific meaning might be defined in the future. */ |
| 57 | LWS_CLOSE_STATUS_NO_STATUS = 1005, |
| 58 | /**< 1005 is a reserved value and MUST NOT be set as a status code in a |
| 59 | Close control frame by an endpoint. It is designated for use in |
| 60 | applications expecting a status code to indicate that no status |
| 61 | code was actually present. */ |
| 62 | LWS_CLOSE_STATUS_ABNORMAL_CLOSE = 1006, |
| 63 | /**< 1006 is a reserved value and MUST NOT be set as a status code in a |
| 64 | Close control frame by an endpoint. It is designated for use in |
| 65 | applications expecting a status code to indicate that the |
| 66 | connection was closed abnormally, e.g., without sending or |
| 67 | receiving a Close control frame. */ |
| 68 | LWS_CLOSE_STATUS_INVALID_PAYLOAD = 1007, |
| 69 | /**< 1007 indicates that an endpoint is terminating the connection |
| 70 | because it has received data within a message that was not |
| 71 | consistent with the type of the message (e.g., non-UTF-8 [RFC3629] |
| 72 | data within a text message). */ |
| 73 | LWS_CLOSE_STATUS_POLICY_VIOLATION = 1008, |
| 74 | /**< 1008 indicates that an endpoint is terminating the connection |
| 75 | because it has received a message that violates its policy. This |
| 76 | is a generic status code that can be returned when there is no |
| 77 | other more suitable status code (e.g., 1003 or 1009) or if there |
| 78 | is a need to hide specific details about the policy. */ |
| 79 | LWS_CLOSE_STATUS_MESSAGE_TOO_LARGE = 1009, |
| 80 | /**< 1009 indicates that an endpoint is terminating the connection |
| 81 | because it has received a message that is too big for it to |
| 82 | process. */ |
| 83 | LWS_CLOSE_STATUS_EXTENSION_REQUIRED = 1010, |
| 84 | /**< 1010 indicates that an endpoint (client) is terminating the |
| 85 | connection because it has expected the server to negotiate one or |
| 86 | more extension, but the server didn't return them in the response |
| 87 | message of the WebSocket handshake. The list of extensions that |
| 88 | are needed SHOULD appear in the /reason/ part of the Close frame. |
| 89 | Note that this status code is not used by the server, because it |
| 90 | can fail the WebSocket handshake instead */ |
| 91 | LWS_CLOSE_STATUS_UNEXPECTED_CONDITION = 1011, |
| 92 | /**< 1011 indicates that a server is terminating the connection because |
| 93 | it encountered an unexpected condition that prevented it from |
| 94 | fulfilling the request. */ |
| 95 | LWS_CLOSE_STATUS_TLS_FAILURE = 1015, |
| 96 | /**< 1015 is a reserved value and MUST NOT be set as a status code in a |
| 97 | Close control frame by an endpoint. It is designated for use in |
| 98 | applications expecting a status code to indicate that the |
| 99 | connection was closed due to a failure to perform a TLS handshake |
| 100 | (e.g., the server certificate can't be verified). */ |
| 101 | |
| 102 | LWS_CLOSE_STATUS_CLIENT_TRANSACTION_DONE = 2000, |
| 103 | |
| 104 | /****** add new things just above ---^ ******/ |
| 105 | |
| 106 | LWS_CLOSE_STATUS_NOSTATUS_CONTEXT_DESTROY = 9999, |
| 107 | }; |
| 108 | |
| 109 | /** |
| 110 | * lws_close_reason - Set reason and aux data to send with Close packet |
| 111 | * If you are going to return nonzero from the callback |
| 112 | * requesting the connection to close, you can optionally |
| 113 | * call this to set the reason the peer will be told if |
| 114 | * possible. |
| 115 | * |
| 116 | * \param wsi: The websocket connection to set the close reason on |
| 117 | * \param status: A valid close status from websocket standard |
| 118 | * \param buf: NULL or buffer containing up to 124 bytes of auxiliary data |
| 119 | * \param len: Length of data in \p buf to send |
| 120 | */ |
| 121 | LWS_VISIBLE LWS_EXTERN void |
| 122 | lws_close_reason(struct lws *wsi, enum lws_close_status status, |
| 123 | unsigned char *buf, size_t len); |
| 124 | |
| 125 | ///@} |
| 126 | |