xref: /aosp_15_r20/external/libwebsockets/include/libwebsockets/lws-ws-ext.h (revision 1c60b9aca93fdbc9b5f19b2d2194c91294b22281)
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