2 * libwebsockets - small server side websockets and web server implementation
4 * Copyright (C) 2010 Andy Green <andy@warmcat.com>
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation:
9 * version 2.1 of the License.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
22 #ifndef __LIBWEBSOCKET_H__
23 #define __LIBWEBSOCKET_H__
32 #ifndef WIN32_LEAN_AND_MEAN
33 #define WIN32_LEAN_AND_MEAN
38 #include "../win32port/win32helpers/websock-w32.h"
40 #include "../win32port/win32helpers/gettimeofday.h"
42 #define strcasecmp stricmp
48 #define LWS_EXTERN extern __declspec(dllexport)
50 #define LWS_EXTERN extern __declspec(dllimport)
59 #define LWS_EXTERN extern
62 #define CONTEXT_PORT_NO_LISTEN 0
63 #define MAX_MUX_RECURSION 2
65 enum libwebsocket_context_options {
66 LWS_SERVER_OPTION_DEFEAT_CLIENT_MASK = 1,
67 LWS_SERVER_OPTION_REQUIRE_VALID_OPENSSL_CLIENT_CERT = 2,
68 LWS_SERVER_OPTION_SKIP_SERVER_CANONICAL_NAME = 4,
71 enum libwebsocket_callback_reasons {
72 LWS_CALLBACK_ESTABLISHED,
73 LWS_CALLBACK_CLIENT_CONNECTION_ERROR,
74 LWS_CALLBACK_CLIENT_ESTABLISHED,
77 LWS_CALLBACK_CLIENT_RECEIVE,
78 LWS_CALLBACK_CLIENT_RECEIVE_PONG,
79 LWS_CALLBACK_CLIENT_WRITEABLE,
80 LWS_CALLBACK_SERVER_WRITEABLE,
82 LWS_CALLBACK_BROADCAST,
83 LWS_CALLBACK_FILTER_NETWORK_CONNECTION,
84 LWS_CALLBACK_FILTER_PROTOCOL_CONNECTION,
85 LWS_CALLBACK_OPENSSL_LOAD_EXTRA_CLIENT_VERIFY_CERTS,
86 LWS_CALLBACK_OPENSSL_LOAD_EXTRA_SERVER_VERIFY_CERTS,
87 LWS_CALLBACK_OPENSSL_PERFORM_CLIENT_CERT_VERIFICATION,
88 LWS_CALLBACK_CLIENT_APPEND_HANDSHAKE_HEADER,
89 LWS_CALLBACK_CONFIRM_EXTENSION_OKAY,
90 LWS_CALLBACK_CLIENT_CONFIRM_EXTENSION_SUPPORTED,
91 /* external poll() management support */
92 LWS_CALLBACK_ADD_POLL_FD,
93 LWS_CALLBACK_DEL_POLL_FD,
94 LWS_CALLBACK_SET_MODE_POLL_FD,
95 LWS_CALLBACK_CLEAR_MODE_POLL_FD,
98 enum libwebsocket_extension_callback_reasons {
99 LWS_EXT_CALLBACK_SERVER_CONTEXT_CONSTRUCT,
100 LWS_EXT_CALLBACK_CLIENT_CONTEXT_CONSTRUCT,
101 LWS_EXT_CALLBACK_SERVER_CONTEXT_DESTRUCT,
102 LWS_EXT_CALLBACK_CLIENT_CONTEXT_DESTRUCT,
103 LWS_EXT_CALLBACK_CONSTRUCT,
104 LWS_EXT_CALLBACK_CLIENT_CONSTRUCT,
105 LWS_EXT_CALLBACK_CHECK_OK_TO_REALLY_CLOSE,
106 LWS_EXT_CALLBACK_CHECK_OK_TO_PROPOSE_EXTENSION,
107 LWS_EXT_CALLBACK_DESTROY,
108 LWS_EXT_CALLBACK_DESTROY_ANY_WSI_CLOSING,
109 LWS_EXT_CALLBACK_ANY_WSI_ESTABLISHED,
110 LWS_EXT_CALLBACK_PACKET_RX_PREPARSE,
111 LWS_EXT_CALLBACK_PACKET_TX_PRESEND,
112 LWS_EXT_CALLBACK_PACKET_TX_DO_SEND,
113 LWS_EXT_CALLBACK_HANDSHAKE_REPLY_TX,
114 LWS_EXT_CALLBACK_FLUSH_PENDING_TX,
115 LWS_EXT_CALLBACK_EXTENDED_PAYLOAD_RX,
116 LWS_EXT_CALLBACK_CAN_PROXY_CLIENT_CONNECTION,
117 LWS_EXT_CALLBACK_1HZ,
118 LWS_EXT_CALLBACK_REQUEST_ON_WRITEABLE,
119 LWS_EXT_CALLBACK_IS_WRITEABLE,
122 enum libwebsocket_write_protocol {
125 LWS_WRITE_CONTINUATION,
128 /* special 04+ opcodes */
136 LWS_WRITE_NO_FIN = 0x40,
138 * client packet payload goes out on wire unmunged
139 * only useful for security tests since normal servers cannot
140 * decode the content if used
142 LWS_WRITE_CLIENT_IGNORE_XOR_MASK = 0x80
146 * you need these to look at headers that have been parsed if using the
147 * LWS_CALLBACK_FILTER_CONNECTION callback. If a header from the enum
148 * list below is absent, .token = NULL and token_len = 0. Otherwise .token
149 * points to .token_len chars containing that header content.
157 enum lws_token_indexes {
160 WSI_TOKEN_CONNECTION,
175 WSI_TOKEN_EXTENSIONS,
177 /* client receives these */
183 /* always last real token index*/
185 /* parser state additions */
188 WSI_TOKEN_SKIPPING_SAW_CR,
189 WSI_PARSING_COMPLETE,
190 WSI_INIT_TOKEN_MUXURL,
197 1000 indicates a normal closure, meaning whatever purpose the
198 connection was established for has been fulfilled.
202 1001 indicates that an endpoint is "going away", such as a server
203 going down, or a browser having navigated away from a page.
207 1002 indicates that an endpoint is terminating the connection due
212 1003 indicates that an endpoint is terminating the connection
213 because it has received a type of data it cannot accept (e.g. an
214 endpoint that understands only text data may send this if it
215 receives a binary message.)
219 1004 indicates that an endpoint is terminating the connection
220 because it has received a message that is too large.
223 enum lws_close_status {
224 LWS_CLOSE_STATUS_NOSTATUS = 0,
225 LWS_CLOSE_STATUS_NORMAL = 1000,
226 LWS_CLOSE_STATUS_GOINGAWAY = 1001,
227 LWS_CLOSE_STATUS_PROTOCOL_ERR = 1002,
228 LWS_CLOSE_STATUS_UNACCEPTABLE_OPCODE = 1003,
229 LWS_CLOSE_STATUS_PAYLOAD_TOO_LARGE = 1004,
233 struct libwebsocket_context;
234 struct libwebsocket_extension;
237 * callback_function() - User server actions
238 * @context: Websockets context
239 * @wsi: Opaque websocket instance pointer
240 * @reason: The reason for the call
241 * @user: Pointer to per-session user data allocated by library
242 * @in: Pointer used for some callback reasons
243 * @len: Length set for some callback reasons
245 * This callback is the way the user controls what is served. All the
246 * protocol detail is hidden and handled by the library.
248 * For each connection / session there is user data allocated that is
249 * pointed to by "user". You set the size of this user data area when
250 * the library is initialized with libwebsocket_create_server.
252 * You get an opportunity to initialize user data when called back with
253 * LWS_CALLBACK_ESTABLISHED reason.
255 * LWS_CALLBACK_ESTABLISHED: after the server completes a handshake with
258 * LWS_CALLBACK_CLIENT_CONNECTION_ERROR: the request client connection has
259 * been unable to complete a handshake with the remote server
261 * LWS_CALLBACK_CLIENT_ESTABLISHED: after your client connection completed
262 * a handshake with the remote server
264 * LWS_CALLBACK_CLOSED: when the websocket session ends
266 * LWS_CALLBACK_BROADCAST: signal to send to client (you would use
267 * libwebsocket_write() taking care about the
268 * special buffer requirements
270 * LWS_CALLBACK_RECEIVE: data has appeared for this server endpoint from a
271 * remote client, it can be found at *in and is
274 * LWS_CALLBACK_CLIENT_RECEIVE_PONG: if you elected to see PONG packets,
275 * they appear with this callback reason. PONG
276 * packets only exist in 04+ protocol
278 * LWS_CALLBACK_CLIENT_RECEIVE: data has appeared from the server for the
279 * client connection, it can be found at *in and
282 * LWS_CALLBACK_HTTP: an http request has come from a client that is not
283 * asking to upgrade the connection to a websocket
284 * one. This is a chance to serve http content,
285 * for example, to send a script to the client
286 * which will then open the websockets connection.
287 * @in points to the URI path requested and
288 * libwebsockets_serve_http_file() makes it very
289 * simple to send back a file to the client.
291 * LWS_CALLBACK_CLIENT_WRITEABLE:
292 * LWS_CALLBACK_SERVER_WRITEABLE: If you call
293 * libwebsocket_callback_on_writable() on a connection, you will
294 * get one of these callbacks coming when the connection socket
295 * is able to accept another write packet without blocking.
296 * If it already was able to take another packet without blocking,
297 * you'll get this callback at the next call to the service loop
298 * function. Notice that CLIENTs get LWS_CALLBACK_CLIENT_WRITEABLE
299 * and servers get LWS_CALLBACK_SERVER_WRITEABLE.
301 * LWS_CALLBACK_FILTER_NETWORK_CONNECTION: called when a client connects to
302 * the server at network level; the connection is accepted but then
303 * passed to this callback to decide whether to hang up immediately
304 * or not, based on the client IP. @user contains the connection
305 * socket's descriptor. Return non-zero to terminate
306 * the connection before sending or receiving anything.
307 * Because this happens immediately after the network connection
308 * from the client, there's no websocket protocol selected yet so
309 * this callback is issued only to protocol 0.
311 * LWS_CALLBACK_FILTER_PROTOCOL_CONNECTION: called when the handshake has
312 * been received and parsed from the client, but the response is
313 * not sent yet. Return non-zero to disallow the connection.
314 * @user is a pointer to an array of struct lws_tokens, you can
315 * use the header enums lws_token_indexes from libwebsockets.h
316 * to check for and read the supported header presence and
317 * content before deciding to allow the handshake to proceed or
318 * to kill the connection.
320 * LWS_CALLBACK_OPENSSL_LOAD_EXTRA_CLIENT_VERIFY_CERTS: if configured for
321 * including OpenSSL support, this callback allows your user code
322 * to perform extra SSL_CTX_load_verify_locations() or similar
323 * calls to direct OpenSSL where to find certificates the client
324 * can use to confirm the remote server identity. @user is the
327 * LWS_CALLBACK_OPENSSL_LOAD_EXTRA_SERVER_VERIFY_CERTS: if configured for
328 * including OpenSSL support, this callback allows your user code
329 * to load extra certifcates into the server which allow it to
330 * verify the validity of certificates returned by clients. @user
331 * is the server's OpenSSL SSL_CTX*
333 * LWS_CALLBACK_OPENSSL_PERFORM_CLIENT_CERT_VERIFICATION: if the
334 * libwebsockets context was created with the option
335 * LWS_SERVER_OPTION_REQUIRE_VALID_OPENSSL_CLIENT_CERT, then this
336 * callback is generated during OpenSSL verification of the cert
337 * sent from the client. It is sent to protocol[0] callback as
338 * no protocol has been negotiated on the connection yet.
339 * Notice that the libwebsockets context and wsi are both NULL
340 * during this callback. See
341 * http://www.openssl.org/docs/ssl/SSL_CTX_set_verify.html
342 * to understand more detail about the OpenSSL callback that
343 * generates this libwebsockets callback and the meanings of the
344 * arguments passed. In this callback, @user is the x509_ctx,
345 * @in is the ssl pointer and @len is preverify_ok
346 * Notice that this callback maintains libwebsocket return
347 * conventions, return 0 to mean the cert is OK or 1 to fail it.
348 * This also means that if you don't handle this callback then
349 * the default callback action of returning 0 allows the client
352 * LWS_CALLBACK_CLIENT_APPEND_HANDSHAKE_HEADER: this callback happens
353 * when a client handshake is being compiled. @user is NULL,
354 * @in is a char **, it's pointing to a char * which holds the
355 * next location in the header buffer where you can add
356 * headers, and @len is the remaining space in the header buffer,
357 * which is typically some hundreds of bytes. So, to add a canned
358 * cookie, your handler code might look similar to:
360 * char **p = (char **)in;
365 * *p += sprintf(*p, "Cookie: a=b\x0d\x0a");
369 * Notice if you add anything, you just have to take care about
370 * the CRLF on the line you added. Obviously this callback is
371 * optional, if you don't handle it everything is fine.
373 * Notice the callback is coming to protocols[0] all the time,
374 * because there is no specific protocol handshook yet.
376 * LWS_CALLBACK_CONFIRM_EXTENSION_OKAY: When the server handshake code
377 * sees that it does support a requested extension, before
378 * accepting the extension by additing to the list sent back to
379 * the client it gives this callback just to check that it's okay
380 * to use that extension. It calls back to the requested protocol
381 * and with @in being the extension name, @len is 0 and @user is
382 * valid. Note though at this time the ESTABLISHED callback hasn't
383 * happened yet so if you initialize @user content there, @user
384 * content during this callback might not be useful for anything.
385 * Notice this callback comes to protocols[0].
387 * LWS_CALLBACK_CLIENT_CONFIRM_EXTENSION_SUPPORTED: When a client
388 * connection is being prepared to start a handshake to a server,
389 * each supported extension is checked with protocols[0] callback
390 * with this reason, giving the user code a chance to suppress the
391 * claim to support that extension by returning non-zero. If
392 * unhandled, by default 0 will be returned and the extension
393 * support included in the header to the server. Notice this
394 * callback comes to protocols[0].
396 * The next four reasons are optional and only need taking care of if you
397 * will be integrating libwebsockets sockets into an external polling
400 * LWS_CALLBACK_ADD_POLL_FD: libwebsocket deals with its poll() loop
401 * internally, but in the case you are integrating with another
402 * server you will need to have libwebsocket sockets share a
403 * polling array with the other server. This and the other
404 * POLL_FD related callbacks let you put your specialized
405 * poll array interface code in the callback for protocol 0, the
406 * first protocol you support, usually the HTTP protocol in the
407 * serving case. This callback happens when a socket needs to be
408 * added to the polling loop: @user contains the fd, and
409 * @len is the events bitmap (like, POLLIN). If you are using the
410 * internal polling loop (the "service" callback), you can just
411 * ignore these callbacks.
413 * LWS_CALLBACK_DEL_POLL_FD: This callback happens when a socket descriptor
414 * needs to be removed from an external polling array. @user is
415 * the socket desricptor. If you are using the internal polling
416 * loop, you can just ignore it.
418 * LWS_CALLBACK_SET_MODE_POLL_FD: This callback happens when libwebsockets
419 * wants to modify the events for the socket descriptor in @user.
420 * The handler should OR @len on to the events member of the pollfd
421 * struct for this socket descriptor. If you are using the
422 * internal polling loop, you can just ignore it.
424 * LWS_CALLBACK_CLEAR_MODE_POLL_FD: This callback occurs when libwebsockets
425 * wants to modify the events for the socket descriptor in @user.
426 * The handler should AND ~@len on to the events member of the
427 * pollfd struct for this socket descriptor. If you are using the
428 * internal polling loop, you can just ignore it.
430 LWS_EXTERN int callback(struct libwebsocket_context * context,
431 struct libwebsocket *wsi,
432 enum libwebsocket_callback_reasons reason, void *user,
433 void *in, size_t len);
435 typedef int (callback_function)(struct libwebsocket_context * context,
436 struct libwebsocket *wsi,
437 enum libwebsocket_callback_reasons reason, void *user,
438 void *in, size_t len);
442 * extension_callback_function() - Hooks to allow extensions to operate
443 * @context: Websockets context
444 * @ext: This extension
445 * @wsi: Opaque websocket instance pointer
446 * @reason: The reason for the call
447 * @user: Pointer to per-session user data allocated by library
448 * @in: Pointer used for some callback reasons
449 * @len: Length set for some callback reasons
451 * Each extension that is active on a particular connection receives
452 * callbacks during the connection lifetime to allow the extension to
453 * operate on websocket data and manage itself.
455 * Libwebsockets takes care of allocating and freeing "user" memory for
456 * each active extension on each connection. That is what is pointed to
457 * by the @user parameter.
459 * LWS_EXT_CALLBACK_CONSTRUCT: called when the server has decided to
460 * select this extension from the list provided by the client,
461 * just before the server will send back the handshake accepting
462 * the connection with this extension active. This gives the
463 * extension a chance to initialize its connection context found
466 * LWS_EXT_CALLBACK_CLIENT_CONSTRUCT: same as LWS_EXT_CALLBACK_CONSTRUCT
467 * but called when client is instantiating this extension. Some
468 * extensions will work the same on client and server side and then
469 * you can just merge handlers for both CONSTRUCTS.
471 * LWS_EXT_CALLBACK_DESTROY: called when the connection the extension was
472 * being used on is about to be closed and deallocated. It's the
473 * last chance for the extension to deallocate anything it has
474 * allocated in the user data (pointed to by @user) before the
475 * user data is deleted. This same callback is used whether you
476 * are in client or server instantiation context.
478 * LWS_EXT_CALLBACK_PACKET_RX_PREPARSE: when this extension was active on
479 * a connection, and a packet of data arrived at the connection,
480 * it is passed to this callback to give the extension a chance to
481 * change the data, eg, decompress it. @user is pointing to the
482 * extension's private connection context data, @in is pointing
483 * to an lws_tokens struct, it consists of a char * pointer called
484 * token, and an int called token_len. At entry, these are
485 * set to point to the received buffer and set to the content
486 * length. If the extension will grow the content, it should use
487 * a new buffer allocated in its private user context data and
488 * set the pointed-to lws_tokens members to point to its buffer.
490 * LWS_EXT_CALLBACK_PACKET_TX_PRESEND: this works the same way as
491 * LWS_EXT_CALLBACK_PACKET_RX_PREPARSE above, except it gives the
492 * extension a chance to change websocket data just before it will
493 * be sent out. Using the same lws_token pointer scheme in @in,
494 * the extension can change the buffer and the length to be
495 * transmitted how it likes. Again if it wants to grow the
496 * buffer safely, it should copy the data into its own buffer and
497 * set the lws_tokens token pointer to it.
499 LWS_EXTERN int extension_callback(struct libwebsocket_context * context,
500 struct libwebsocket_extension *ext,
501 struct libwebsocket *wsi,
502 enum libwebsocket_extension_callback_reasons reason, void *user,
503 void *in, size_t len);
505 typedef int (extension_callback_function)(struct libwebsocket_context * context,
506 struct libwebsocket_extension *ext,
507 struct libwebsocket *wsi,
508 enum libwebsocket_extension_callback_reasons reason, void *user,
509 void *in, size_t len);
512 * struct libwebsocket_protocols - List of protocols and handlers server
514 * @name: Protocol name that must match the one given in the client
515 * Javascript new WebSocket(url, 'protocol') name
516 * @callback: The service callback used for this protocol. It allows the
517 * service action for an entire protocol to be encapsulated in
518 * the protocol-specific callback
519 * @per_session_data_size: Each new connection using this protocol gets
520 * this much memory allocated on connection establishment and
521 * freed on connection takedown. A pointer to this per-connection
522 * allocation is passed into the callback in the 'user' parameter
523 * @owning_server: the server init call fills in this opaque pointer when
524 * registering this protocol with the server.
525 * @broadcast_socket_port: the server init call fills this in with the
526 * localhost port number used to forward broadcasts for this
528 * @broadcast_socket_user_fd: the server init call fills this in ... the main()
529 * process context can write to this socket to perform broadcasts
530 * (use the libwebsockets_broadcast() api to do this instead,
531 * it works from any process context)
532 * @protocol_index: which protocol we are starting from zero
534 * This structure represents one protocol supported by the server. An
535 * array of these structures is passed to libwebsocket_create_server()
536 * allows as many protocols as you like to be handled by one server.
539 struct libwebsocket_protocols {
541 callback_function *callback;
542 size_t per_session_data_size;
545 * below are filled in on server init and can be left uninitialized,
546 * no need for user to use them directly either
549 struct libwebsocket_context *owning_server;
550 int broadcast_socket_port;
551 int broadcast_socket_user_fd;
556 * struct libwebsocket_extension - An extension we know how to cope with
558 * @name: Formal extension name, eg, "deflate-stream"
559 * @callback: Service callback
560 * @per_session_data_size: Libwebsockets will auto-malloc this much
561 * memory for the use of the extension, a pointer
562 * to it comes in the @user callback parameter
563 * @per_context_private_data: Optional storage for this externsion that
564 * is per-context, so it can track stuff across
565 * all sessions, etc, if it wants
568 struct libwebsocket_extension {
570 extension_callback_function *callback;
571 size_t per_session_data_size;
572 void * per_context_private_data;
577 LWS_EXTERN struct libwebsocket_context *
578 libwebsocket_create_context(int port, const char * interf,
579 struct libwebsocket_protocols *protocols,
580 struct libwebsocket_extension *extensions,
581 const char *ssl_cert_filepath,
582 const char *ssl_private_key_filepath, int gid, int uid,
583 unsigned int options, void *user);
586 libwebsocket_context_destroy(struct libwebsocket_context *context);
589 libwebsockets_fork_service_loop(struct libwebsocket_context *context);
592 libwebsocket_service(struct libwebsocket_context *context, int timeout_ms);
595 libwebsocket_service_fd(struct libwebsocket_context *context,
596 struct pollfd *pollfd);
599 libwebsocket_context_user(struct libwebsocket_context *context);
604 * When sending with websocket protocol (LWS_WRITE_TEXT or LWS_WRITE_BINARY)
605 * the send buffer has to have LWS_SEND_BUFFER_PRE_PADDING bytes valid BEFORE
606 * buf, and LWS_SEND_BUFFER_POST_PADDING bytes valid AFTER (buf + len).
608 * This allows us to add protocol info before and after the data, and send as
609 * one packet on the network without payload copying, for maximum efficiency.
611 * So for example you need this kind of code to use libwebsocket_write with a
614 * char buf[LWS_SEND_BUFFER_PRE_PADDING + 128 + LWS_SEND_BUFFER_POST_PADDING];
616 * // fill your part of the buffer... for example here it's all zeros
617 * memset(&buf[LWS_SEND_BUFFER_PRE_PADDING], 0, 128);
619 * libwebsocket_write(wsi, &buf[LWS_SEND_BUFFER_PRE_PADDING], 128);
621 * When sending LWS_WRITE_HTTP, there is no protocol addition and you can just
622 * use the whole buffer without taking care of the above.
626 * this is the frame nonce plus two header plus 8 length
627 * there's an additional two for mux extension per mux nesting level
628 * 2 byte prepend on close will already fit because control frames cannot use
629 * the big length style
632 #define LWS_SEND_BUFFER_PRE_PADDING (4 + 10 + (2 * MAX_MUX_RECURSION))
633 #define LWS_SEND_BUFFER_POST_PADDING 1
636 libwebsocket_write(struct libwebsocket *wsi, unsigned char *buf, size_t len,
637 enum libwebsocket_write_protocol protocol);
640 libwebsockets_serve_http_file(struct libwebsocket *wsi, const char *file,
641 const char *content_type);
643 /* notice - you need the pre- and post- padding allocation for buf below */
646 libwebsockets_broadcast(const struct libwebsocket_protocols *protocol,
647 unsigned char *buf, size_t len);
649 LWS_EXTERN const struct libwebsocket_protocols *
650 libwebsockets_get_protocol(struct libwebsocket *wsi);
653 libwebsocket_callback_on_writable(struct libwebsocket_context *context,
654 struct libwebsocket *wsi);
657 libwebsocket_callback_on_writable_all_protocol(
658 const struct libwebsocket_protocols *protocol);
661 libwebsocket_get_socket_fd(struct libwebsocket *wsi);
664 libwebsocket_is_final_fragment(struct libwebsocket *wsi);
667 libwebsocket_ensure_user_space(struct libwebsocket *wsi);
670 libwebsocket_rx_flow_control(struct libwebsocket *wsi, int enable);
673 libwebsockets_remaining_packet_payload(struct libwebsocket *wsi);
675 LWS_EXTERN struct libwebsocket *
676 libwebsocket_client_connect(struct libwebsocket_context *clients,
683 const char *protocol,
684 int ietf_version_or_minus_one);
686 LWS_EXTERN struct libwebsocket *
687 libwebsocket_client_connect_extended(struct libwebsocket_context *clients,
694 const char *protocol,
695 int ietf_version_or_minus_one,
698 LWS_EXTERN const char *
699 libwebsocket_canonical_hostname(struct libwebsocket_context *context);
703 libwebsockets_get_peer_addresses(int fd, char *name, int name_len,
704 char *rip, int rip_len);
707 libwebsockets_hangup_on_client(struct libwebsocket_context *context, int fd);
710 libwebsocket_close_and_free_session(struct libwebsocket_context *context,
711 struct libwebsocket *wsi, enum lws_close_status);
714 libwebsockets_get_random(struct libwebsocket_context *context,
718 lws_send_pipe_choked(struct libwebsocket *wsi);
720 LWS_EXTERN unsigned char *
721 libwebsockets_SHA1(const unsigned char *d, size_t n, unsigned char *md);
724 lws_b64_encode_string(const char *in, int in_len, char *out, int out_size);
727 lws_b64_decode_string(const char *in, char *out, int out_size);
729 LWS_EXTERN struct libwebsocket_extension libwebsocket_internal_extensions[];