1*1c60b9acSAndroid Build Coastguard Worker /* 2*1c60b9acSAndroid Build Coastguard Worker * libwebsockets - small server side websockets and web server implementation 3*1c60b9acSAndroid Build Coastguard Worker * 4*1c60b9acSAndroid Build Coastguard Worker * Copyright (C) 2010 - 2019 Andy Green <[email protected]> 5*1c60b9acSAndroid Build Coastguard Worker * 6*1c60b9acSAndroid Build Coastguard Worker * Permission is hereby granted, free of charge, to any person obtaining a copy 7*1c60b9acSAndroid Build Coastguard Worker * of this software and associated documentation files (the "Software"), to 8*1c60b9acSAndroid Build Coastguard Worker * deal in the Software without restriction, including without limitation the 9*1c60b9acSAndroid Build Coastguard Worker * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or 10*1c60b9acSAndroid Build Coastguard Worker * sell copies of the Software, and to permit persons to whom the Software is 11*1c60b9acSAndroid Build Coastguard Worker * furnished to do so, subject to the following conditions: 12*1c60b9acSAndroid Build Coastguard Worker * 13*1c60b9acSAndroid Build Coastguard Worker * The above copyright notice and this permission notice shall be included in 14*1c60b9acSAndroid Build Coastguard Worker * all copies or substantial portions of the Software. 15*1c60b9acSAndroid Build Coastguard Worker * 16*1c60b9acSAndroid Build Coastguard Worker * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17*1c60b9acSAndroid Build Coastguard Worker * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18*1c60b9acSAndroid Build Coastguard Worker * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19*1c60b9acSAndroid Build Coastguard Worker * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20*1c60b9acSAndroid Build Coastguard Worker * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 21*1c60b9acSAndroid Build Coastguard Worker * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 22*1c60b9acSAndroid Build Coastguard Worker * IN THE SOFTWARE. 23*1c60b9acSAndroid Build Coastguard Worker */ 24*1c60b9acSAndroid Build Coastguard Worker 25*1c60b9acSAndroid Build Coastguard Worker /*! \defgroup extensions Extension related functions 26*1c60b9acSAndroid Build Coastguard Worker * ##Extension releated functions 27*1c60b9acSAndroid Build Coastguard Worker * 28*1c60b9acSAndroid Build Coastguard Worker * Ws defines optional extensions, lws provides the ability to implement these 29*1c60b9acSAndroid Build Coastguard Worker * in user code if so desired. 30*1c60b9acSAndroid Build Coastguard Worker * 31*1c60b9acSAndroid Build Coastguard Worker * We provide one extensions permessage-deflate. 32*1c60b9acSAndroid Build Coastguard Worker */ 33*1c60b9acSAndroid Build Coastguard Worker ///@{ 34*1c60b9acSAndroid Build Coastguard Worker 35*1c60b9acSAndroid Build Coastguard Worker /* 36*1c60b9acSAndroid Build Coastguard Worker * NOTE: These public enums are part of the abi. If you want to add one, 37*1c60b9acSAndroid Build Coastguard Worker * add it at where specified so existing users are unaffected. 38*1c60b9acSAndroid Build Coastguard Worker */ 39*1c60b9acSAndroid Build Coastguard Worker enum lws_extension_callback_reasons { 40*1c60b9acSAndroid Build Coastguard Worker LWS_EXT_CB_CONSTRUCT = 4, 41*1c60b9acSAndroid Build Coastguard Worker LWS_EXT_CB_CLIENT_CONSTRUCT = 5, 42*1c60b9acSAndroid Build Coastguard Worker LWS_EXT_CB_DESTROY = 8, 43*1c60b9acSAndroid Build Coastguard Worker LWS_EXT_CB_PACKET_TX_PRESEND = 12, 44*1c60b9acSAndroid Build Coastguard Worker LWS_EXT_CB_PAYLOAD_TX = 21, 45*1c60b9acSAndroid Build Coastguard Worker LWS_EXT_CB_PAYLOAD_RX = 22, 46*1c60b9acSAndroid Build Coastguard Worker LWS_EXT_CB_OPTION_DEFAULT = 23, 47*1c60b9acSAndroid Build Coastguard Worker LWS_EXT_CB_OPTION_SET = 24, 48*1c60b9acSAndroid Build Coastguard Worker LWS_EXT_CB_OPTION_CONFIRM = 25, 49*1c60b9acSAndroid Build Coastguard Worker LWS_EXT_CB_NAMED_OPTION_SET = 26, 50*1c60b9acSAndroid Build Coastguard Worker 51*1c60b9acSAndroid Build Coastguard Worker /****** add new things just above ---^ ******/ 52*1c60b9acSAndroid Build Coastguard Worker }; 53*1c60b9acSAndroid Build Coastguard Worker 54*1c60b9acSAndroid Build Coastguard Worker /** enum lws_ext_options_types */ 55*1c60b9acSAndroid Build Coastguard Worker enum lws_ext_options_types { 56*1c60b9acSAndroid Build Coastguard Worker EXTARG_NONE, /**< does not take an argument */ 57*1c60b9acSAndroid Build Coastguard Worker EXTARG_DEC, /**< requires a decimal argument */ 58*1c60b9acSAndroid Build Coastguard Worker EXTARG_OPT_DEC /**< may have an optional decimal argument */ 59*1c60b9acSAndroid Build Coastguard Worker 60*1c60b9acSAndroid Build Coastguard Worker /* Add new things just above here ---^ 61*1c60b9acSAndroid Build Coastguard Worker * This is part of the ABI, don't needlessly break compatibility */ 62*1c60b9acSAndroid Build Coastguard Worker }; 63*1c60b9acSAndroid Build Coastguard Worker 64*1c60b9acSAndroid Build Coastguard Worker /** struct lws_ext_options - Option arguments to the extension. These are 65*1c60b9acSAndroid Build Coastguard Worker * used in the negotiation at ws upgrade time. 66*1c60b9acSAndroid Build Coastguard Worker * The helper function lws_ext_parse_options() 67*1c60b9acSAndroid Build Coastguard Worker * uses these to generate callbacks */ 68*1c60b9acSAndroid Build Coastguard Worker struct lws_ext_options { 69*1c60b9acSAndroid Build Coastguard Worker const char *name; /**< Option name, eg, "server_no_context_takeover" */ 70*1c60b9acSAndroid Build Coastguard Worker enum lws_ext_options_types type; /**< What kind of args the option can take */ 71*1c60b9acSAndroid Build Coastguard Worker 72*1c60b9acSAndroid Build Coastguard Worker /* Add new things just above here ---^ 73*1c60b9acSAndroid Build Coastguard Worker * This is part of the ABI, don't needlessly break compatibility */ 74*1c60b9acSAndroid Build Coastguard Worker }; 75*1c60b9acSAndroid Build Coastguard Worker 76*1c60b9acSAndroid Build Coastguard Worker /** struct lws_ext_option_arg */ 77*1c60b9acSAndroid Build Coastguard Worker struct lws_ext_option_arg { 78*1c60b9acSAndroid Build Coastguard Worker const char *option_name; /**< may be NULL, option_index used then */ 79*1c60b9acSAndroid Build Coastguard Worker int option_index; /**< argument ordinal to use if option_name missing */ 80*1c60b9acSAndroid Build Coastguard Worker const char *start; /**< value */ 81*1c60b9acSAndroid Build Coastguard Worker int len; /**< length of value */ 82*1c60b9acSAndroid Build Coastguard Worker }; 83*1c60b9acSAndroid Build Coastguard Worker 84*1c60b9acSAndroid Build Coastguard Worker /** 85*1c60b9acSAndroid Build Coastguard Worker * typedef lws_extension_callback_function() - Hooks to allow extensions to operate 86*1c60b9acSAndroid Build Coastguard Worker * \param context: Websockets context 87*1c60b9acSAndroid Build Coastguard Worker * \param ext: This extension 88*1c60b9acSAndroid Build Coastguard Worker * \param wsi: Opaque websocket instance pointer 89*1c60b9acSAndroid Build Coastguard Worker * \param reason: The reason for the call 90*1c60b9acSAndroid Build Coastguard Worker * \param user: Pointer to ptr to per-session user data allocated by library 91*1c60b9acSAndroid Build Coastguard Worker * \param in: Pointer used for some callback reasons 92*1c60b9acSAndroid Build Coastguard Worker * \param len: Length set for some callback reasons 93*1c60b9acSAndroid Build Coastguard Worker * 94*1c60b9acSAndroid Build Coastguard Worker * Each extension that is active on a particular connection receives 95*1c60b9acSAndroid Build Coastguard Worker * callbacks during the connection lifetime to allow the extension to 96*1c60b9acSAndroid Build Coastguard Worker * operate on websocket data and manage itself. 97*1c60b9acSAndroid Build Coastguard Worker * 98*1c60b9acSAndroid Build Coastguard Worker * Libwebsockets takes care of allocating and freeing "user" memory for 99*1c60b9acSAndroid Build Coastguard Worker * each active extension on each connection. That is what is pointed to 100*1c60b9acSAndroid Build Coastguard Worker * by the user parameter. 101*1c60b9acSAndroid Build Coastguard Worker * 102*1c60b9acSAndroid Build Coastguard Worker * LWS_EXT_CB_CONSTRUCT: called when the server has decided to 103*1c60b9acSAndroid Build Coastguard Worker * select this extension from the list provided by the client, 104*1c60b9acSAndroid Build Coastguard Worker * just before the server will send back the handshake accepting 105*1c60b9acSAndroid Build Coastguard Worker * the connection with this extension active. This gives the 106*1c60b9acSAndroid Build Coastguard Worker * extension a chance to initialize its connection context found 107*1c60b9acSAndroid Build Coastguard Worker * in user. 108*1c60b9acSAndroid Build Coastguard Worker * 109*1c60b9acSAndroid Build Coastguard Worker * LWS_EXT_CB_CLIENT_CONSTRUCT: same as LWS_EXT_CB_CONSTRUCT 110*1c60b9acSAndroid Build Coastguard Worker * but called when client is instantiating this extension. Some 111*1c60b9acSAndroid Build Coastguard Worker * extensions will work the same on client and server side and then 112*1c60b9acSAndroid Build Coastguard Worker * you can just merge handlers for both CONSTRUCTS. 113*1c60b9acSAndroid Build Coastguard Worker * 114*1c60b9acSAndroid Build Coastguard Worker * LWS_EXT_CB_DESTROY: called when the connection the extension was 115*1c60b9acSAndroid Build Coastguard Worker * being used on is about to be closed and deallocated. It's the 116*1c60b9acSAndroid Build Coastguard Worker * last chance for the extension to deallocate anything it has 117*1c60b9acSAndroid Build Coastguard Worker * allocated in the user data (pointed to by user) before the 118*1c60b9acSAndroid Build Coastguard Worker * user data is deleted. This same callback is used whether you 119*1c60b9acSAndroid Build Coastguard Worker * are in client or server instantiation context. 120*1c60b9acSAndroid Build Coastguard Worker * 121*1c60b9acSAndroid Build Coastguard Worker * LWS_EXT_CB_PACKET_TX_PRESEND: this works the same way as 122*1c60b9acSAndroid Build Coastguard Worker * LWS_EXT_CB_PACKET_RX_PREPARSE above, except it gives the 123*1c60b9acSAndroid Build Coastguard Worker * extension a chance to change websocket data just before it will 124*1c60b9acSAndroid Build Coastguard Worker * be sent out. Using the same lws_token pointer scheme in in, 125*1c60b9acSAndroid Build Coastguard Worker * the extension can change the buffer and the length to be 126*1c60b9acSAndroid Build Coastguard Worker * transmitted how it likes. Again if it wants to grow the 127*1c60b9acSAndroid Build Coastguard Worker * buffer safely, it should copy the data into its own buffer and 128*1c60b9acSAndroid Build Coastguard Worker * set the lws_tokens token pointer to it. 129*1c60b9acSAndroid Build Coastguard Worker * 130*1c60b9acSAndroid Build Coastguard Worker * LWS_EXT_CB_ARGS_VALIDATE: 131*1c60b9acSAndroid Build Coastguard Worker */ 132*1c60b9acSAndroid Build Coastguard Worker typedef int 133*1c60b9acSAndroid Build Coastguard Worker lws_extension_callback_function(struct lws_context *context, 134*1c60b9acSAndroid Build Coastguard Worker const struct lws_extension *ext, struct lws *wsi, 135*1c60b9acSAndroid Build Coastguard Worker enum lws_extension_callback_reasons reason, 136*1c60b9acSAndroid Build Coastguard Worker void *user, void *in, size_t len); 137*1c60b9acSAndroid Build Coastguard Worker 138*1c60b9acSAndroid Build Coastguard Worker /** struct lws_extension - An extension we support */ 139*1c60b9acSAndroid Build Coastguard Worker struct lws_extension { 140*1c60b9acSAndroid Build Coastguard Worker const char *name; /**< Formal extension name, eg, "permessage-deflate" */ 141*1c60b9acSAndroid Build Coastguard Worker lws_extension_callback_function *callback; /**< Service callback */ 142*1c60b9acSAndroid Build Coastguard Worker const char *client_offer; /**< String containing exts and options client offers */ 143*1c60b9acSAndroid Build Coastguard Worker 144*1c60b9acSAndroid Build Coastguard Worker /* Add new things just above here ---^ 145*1c60b9acSAndroid Build Coastguard Worker * This is part of the ABI, don't needlessly break compatibility */ 146*1c60b9acSAndroid Build Coastguard Worker }; 147*1c60b9acSAndroid Build Coastguard Worker 148*1c60b9acSAndroid Build Coastguard Worker /** 149*1c60b9acSAndroid Build Coastguard Worker * lws_set_extension_option(): set extension option if possible 150*1c60b9acSAndroid Build Coastguard Worker * 151*1c60b9acSAndroid Build Coastguard Worker * \param wsi: websocket connection 152*1c60b9acSAndroid Build Coastguard Worker * \param ext_name: name of ext, like "permessage-deflate" 153*1c60b9acSAndroid Build Coastguard Worker * \param opt_name: name of option, like "rx_buf_size" 154*1c60b9acSAndroid Build Coastguard Worker * \param opt_val: value to set option to 155*1c60b9acSAndroid Build Coastguard Worker */ 156*1c60b9acSAndroid Build Coastguard Worker LWS_VISIBLE LWS_EXTERN int 157*1c60b9acSAndroid Build Coastguard Worker lws_set_extension_option(struct lws *wsi, const char *ext_name, 158*1c60b9acSAndroid Build Coastguard Worker const char *opt_name, const char *opt_val); 159*1c60b9acSAndroid Build Coastguard Worker 160*1c60b9acSAndroid Build Coastguard Worker /** 161*1c60b9acSAndroid Build Coastguard Worker * lws_ext_parse_options() - deal with parsing negotiated extension options 162*1c60b9acSAndroid Build Coastguard Worker * 163*1c60b9acSAndroid Build Coastguard Worker * \param ext: related extension struct 164*1c60b9acSAndroid Build Coastguard Worker * \param wsi: websocket connection 165*1c60b9acSAndroid Build Coastguard Worker * \param ext_user: per-connection extension private data 166*1c60b9acSAndroid Build Coastguard Worker * \param opts: list of supported options 167*1c60b9acSAndroid Build Coastguard Worker * \param o: option string to parse 168*1c60b9acSAndroid Build Coastguard Worker * \param len: length 169*1c60b9acSAndroid Build Coastguard Worker */ 170*1c60b9acSAndroid Build Coastguard Worker LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT 171*1c60b9acSAndroid Build Coastguard Worker lws_ext_parse_options(const struct lws_extension *ext, struct lws *wsi, 172*1c60b9acSAndroid Build Coastguard Worker void *ext_user, const struct lws_ext_options *opts, 173*1c60b9acSAndroid Build Coastguard Worker const char *o, int len); 174*1c60b9acSAndroid Build Coastguard Worker 175*1c60b9acSAndroid Build Coastguard Worker /** lws_extension_callback_pm_deflate() - extension for RFC7692 176*1c60b9acSAndroid Build Coastguard Worker * 177*1c60b9acSAndroid Build Coastguard Worker * \param context: lws context 178*1c60b9acSAndroid Build Coastguard Worker * \param ext: related lws_extension struct 179*1c60b9acSAndroid Build Coastguard Worker * \param wsi: websocket connection 180*1c60b9acSAndroid Build Coastguard Worker * \param reason: incoming callback reason 181*1c60b9acSAndroid Build Coastguard Worker * \param user: per-connection extension private data 182*1c60b9acSAndroid Build Coastguard Worker * \param in: pointer parameter 183*1c60b9acSAndroid Build Coastguard Worker * \param len: length parameter 184*1c60b9acSAndroid Build Coastguard Worker * 185*1c60b9acSAndroid Build Coastguard Worker * Built-in callback implementing RFC7692 permessage-deflate 186*1c60b9acSAndroid Build Coastguard Worker */ 187*1c60b9acSAndroid Build Coastguard Worker LWS_EXTERN int 188*1c60b9acSAndroid Build Coastguard Worker lws_extension_callback_pm_deflate(struct lws_context *context, 189*1c60b9acSAndroid Build Coastguard Worker const struct lws_extension *ext, 190*1c60b9acSAndroid Build Coastguard Worker struct lws *wsi, 191*1c60b9acSAndroid Build Coastguard Worker enum lws_extension_callback_reasons reason, 192*1c60b9acSAndroid Build Coastguard Worker void *user, void *in, size_t len); 193*1c60b9acSAndroid Build Coastguard Worker 194*1c60b9acSAndroid Build Coastguard Worker /* 195*1c60b9acSAndroid Build Coastguard Worker * The internal exts are part of the public abi 196*1c60b9acSAndroid Build Coastguard Worker * If we add more extensions, publish the callback here ------v 197*1c60b9acSAndroid Build Coastguard Worker */ 198*1c60b9acSAndroid Build Coastguard Worker ///@} 199