| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164 |
- /*
- * libwebsockets - small server side websockets and web server implementation
- *
- * Copyright (C) 2010 - 2018 Andy Green <[email protected]>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation:
- * version 2.1 of the License.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
- * MA 02110-1301 USA
- *
- * This is included from core/private.h if LWS_ROLE_WS
- */
- extern struct lws_role_ops role_ops_ws;
- #define lwsi_role_ws(wsi) (wsi->role_ops == &role_ops_ws)
- enum lws_rx_parse_state {
- LWS_RXPS_NEW,
- LWS_RXPS_04_mask_1,
- LWS_RXPS_04_mask_2,
- LWS_RXPS_04_mask_3,
- LWS_RXPS_04_FRAME_HDR_1,
- LWS_RXPS_04_FRAME_HDR_LEN,
- LWS_RXPS_04_FRAME_HDR_LEN16_2,
- LWS_RXPS_04_FRAME_HDR_LEN16_1,
- LWS_RXPS_04_FRAME_HDR_LEN64_8,
- LWS_RXPS_04_FRAME_HDR_LEN64_7,
- LWS_RXPS_04_FRAME_HDR_LEN64_6,
- LWS_RXPS_04_FRAME_HDR_LEN64_5,
- LWS_RXPS_04_FRAME_HDR_LEN64_4,
- LWS_RXPS_04_FRAME_HDR_LEN64_3,
- LWS_RXPS_04_FRAME_HDR_LEN64_2,
- LWS_RXPS_04_FRAME_HDR_LEN64_1,
- LWS_RXPS_07_COLLECT_FRAME_KEY_1,
- LWS_RXPS_07_COLLECT_FRAME_KEY_2,
- LWS_RXPS_07_COLLECT_FRAME_KEY_3,
- LWS_RXPS_07_COLLECT_FRAME_KEY_4,
- LWS_RXPS_WS_FRAME_PAYLOAD
- };
- enum lws_websocket_opcodes_07 {
- LWSWSOPC_CONTINUATION = 0,
- LWSWSOPC_TEXT_FRAME = 1,
- LWSWSOPC_BINARY_FRAME = 2,
- LWSWSOPC_NOSPEC__MUX = 7,
- /* control extensions 8+ */
- LWSWSOPC_CLOSE = 8,
- LWSWSOPC_PING = 9,
- LWSWSOPC_PONG = 0xa,
- };
- /* this is not usable directly by user code any more, lws_close_reason() */
- #define LWS_WRITE_CLOSE 4
- #define ALREADY_PROCESSED_IGNORE_CHAR 1
- #define ALREADY_PROCESSED_NO_CB 2
- #if !defined(LWS_WITHOUT_EXTENSIONS)
- struct lws_vhost_role_ws {
- const struct lws_extension *extensions;
- };
- struct lws_pt_role_ws {
- struct lws *rx_draining_ext_list;
- struct lws *tx_draining_ext_list;
- };
- #endif
- struct _lws_websocket_related {
- char *rx_ubuf;
- #if !defined(LWS_WITHOUT_EXTENSIONS)
- const struct lws_extension *active_extensions[LWS_MAX_EXTENSIONS_ACTIVE];
- void *act_ext_user[LWS_MAX_EXTENSIONS_ACTIVE];
- struct lws *rx_draining_ext_list;
- struct lws *tx_draining_ext_list;
- #endif
- /* Also used for close content... control opcode == < 128 */
- uint8_t ping_payload_buf[128 - 3 + LWS_PRE];
- uint8_t mask[4];
- time_t time_next_ping_check;
- size_t rx_packet_length;
- uint32_t rx_ubuf_head;
- uint32_t rx_ubuf_alloc;
- uint8_t ping_payload_len;
- uint8_t mask_idx;
- uint8_t opcode;
- uint8_t rsv;
- uint8_t rsv_first_msg;
- /* zero if no info, or length including 2-byte close code */
- uint8_t close_in_ping_buffer_len;
- uint8_t utf8;
- uint8_t stashed_write_type;
- uint8_t tx_draining_stashed_wp;
- uint8_t ietf_spec_revision;
- unsigned int final:1;
- unsigned int frame_is_binary:1;
- unsigned int all_zero_nonce:1;
- unsigned int this_frame_masked:1;
- unsigned int inside_frame:1; /* next write will be more of frame */
- unsigned int clean_buffer:1; /* buffer not rewritten by extension */
- unsigned int payload_is_close:1; /* process as PONG, but it is close */
- unsigned int ping_pending_flag:1;
- unsigned int continuation_possible:1;
- unsigned int owed_a_fin:1;
- unsigned int check_utf8:1;
- unsigned int defeat_check_utf8:1;
- unsigned int stashed_write_pending:1;
- unsigned int send_check_ping:1;
- unsigned int first_fragment:1;
- unsigned int peer_has_sent_close:1;
- #if !defined(LWS_WITHOUT_EXTENSIONS)
- unsigned int extension_data_pending:1;
- unsigned int rx_draining_ext:1;
- unsigned int tx_draining_ext:1;
- uint8_t count_act_ext;
- #endif
- };
- int
- lws_ws_handshake_client(struct lws *wsi, unsigned char **buf, size_t len);
- #if !defined(LWS_WITHOUT_EXTENSIONS)
- LWS_VISIBLE void
- lws_context_init_extensions(const struct lws_context_creation_info *info,
- struct lws_context *context);
- LWS_EXTERN int
- lws_any_extension_handled(struct lws *wsi, enum lws_extension_callback_reasons r,
- void *v, size_t len);
- LWS_EXTERN int
- lws_ext_cb_active(struct lws *wsi, int reason, void *buf, int len);
- LWS_EXTERN int
- lws_ext_cb_all_exts(struct lws_context *context, struct lws *wsi, int reason,
- void *arg, int len);
- #endif
- int
- handshake_0405(struct lws_context *context, struct lws *wsi);
- int
- lws_process_ws_upgrade(struct lws *wsi);
- int
- lws_server_init_wsi_for_ws(struct lws *wsi);
|