endif (LWS_WITH_LWSWS)
if (UNIX)
- # Generate documentation.
- # TODO: Fix this on Windows.
- message("Generating API documentation")
- file(GLOB C_FILES "${PROJECT_SOURCE_DIR}/lib/*.c")
- list(SORT C_FILES)
- execute_process(COMMAND "${CMAKE_COMMAND}" -E make_directory "${PROJECT_BINARY_DIR}/doc/")
-
- execute_process(
- COMMAND "${PROJECT_SOURCE_DIR}/scripts/kernel-doc" -html ${C_FILES} ${HDR_PUBLIC}
- OUTPUT_FILE "${PROJECT_BINARY_DIR}/doc/libwebsockets-api-doc.html"
- ERROR_QUIET)
-
- execute_process(
- COMMAND "${PROJECT_SOURCE_DIR}/scripts/kernel-doc" -text ${C_FILES} ${HDR_PUBLIC}
- OUTPUT_FILE "${PROJECT_BINARY_DIR}/doc/libwebsockets-api-doc.txt"
- ERROR_QUIET)
# Generate and install pkgconfig.
# (This is not indented, because the tabs will be part of the output)
+Notes about building lws
+========================
+
+
Introduction to CMake
---------------------
2. Install OpenSSL.
3. Generate the build files (default is Make files):
+```
+ $ cd /path/to/src
+ $ mkdir build
+ $ cd build
+ $ cmake ..
+```
- ```bash
- $ cd /path/to/src
- $ mkdir build
- $ cd build
- $ cmake ..
- ```
-
- (**NOTE**: The `build/`` directory can have any name and be located anywhere
- on your filesystem, and that the argument `..` given to cmake is simply
- the source directory of **libwebsockets** containing the [CMakeLists.txt](CMakeLists.txt)
- project file. All examples in this file assumes you use "..")
-
- **NOTE2**:
- A common option you may want to give is to set the install path, same
- as --prefix= with autotools. It defaults to /usr/local.
- You can do this by, eg
-
- ```bash
- $ cmake -DCMAKE_INSTALL_PREFIX:PATH=/usr ..
- ```
-
- **NOTE3**:
- On machines that want libraries in lib64, you can also add the
- following to the cmake line
+4. Finally you can build using the generated Makefile:
+```
+ $ make && sudo make install
+```
+**NOTE**: The `build/`` directory can have any name and be located anywhere
+ on your filesystem, and that the argument `..` given to cmake is simply
+ the source directory of **libwebsockets** containing the [CMakeLists.txt](CMakeLists.txt)
+ project file. All examples in this file assumes you use ".."
+
+**NOTE2**:
+A common option you may want to give is to set the install path, same
+as --prefix= with autotools. It defaults to /usr/local.
+You can do this by, eg
+```
+ $ cmake -DCMAKE_INSTALL_PREFIX:PATH=/usr .
+```
- ```bash
+**NOTE3**:
+On machines that want libraries in lib64, you can also add the
+following to the cmake line
+```
-DLIB_SUFFIX=64
- ```
-
- **NOTE4**:
- If you are building against a non-distro OpenSSL (eg, in order to get
- access to ALPN support only in newer OpenSSL versions) the nice way to
- express that in one cmake command is eg,
+```
- ```bash
+**NOTE4**:
+If you are building against a non-distro OpenSSL (eg, in order to get
+access to ALPN support only in newer OpenSSL versions) the nice way to
+express that in one cmake command is eg,
+```
$ cmake .. -DOPENSSL_ROOT_DIR=/usr/local/ssl \
-DCMAKE_INCLUDE_DIRECTORIES_PROJECT_BEFORE=/usr/local/ssl \
-DLWS_WITH_HTTP2=1
- ```
-
- When you run the test apps using non-distro SSL, you have to force them
- to use your libs, not the distro ones
+```
- ```bash
+When you run the test apps using non-distro SSL, you have to force them
+to use your libs, not the distro ones
+```
$ LD_LIBRARY_PATH=/usr/local/ssl/lib libwebsockets-test-server --ssl
- ```
-
- To get it to build on latest openssl (2016-04-10) it needed this approach
+```
- ```bash
+To get it to build on latest openssl (2016-04-10) it needed this approach
+```
cmake .. -DLWS_WITH_HTTP2=1 -DLWS_OPENSSL_INCLUDE_DIRS=/usr/local/include/openssl -DLWS_OPENSSL_LIBRARIES="/usr/local/lib64/libssl.so;/usr/local/lib64/libcrypto.so"
- ```
-
- **NOTE5**:
- To build with debug info and _DEBUG for lower priority debug messages
- compiled in, use
+```
- ```bash
+**NOTE5**:
+To build with debug info and _DEBUG for lower priority debug messages
+compiled in, use
+```
$ cmake .. -DCMAKE_BUILD_TYPE=DEBUG
- ````
-
-4. Finally you can build using the generated Makefile:
-
- ```bash
- $ make
- ```
+```
Quirk of cmake
--------------
3. Generate the Visual studio project by opening the Visual Studio cmd prompt:
- ```bash
- cd <path to src>
- md build
- cd build
- cmake -G "Visual Studio 10" ..
- ```
+```
+ cd <path to src>
+ md build
+ cd build
+ cmake -G "Visual Studio 10" ..
+```
(**NOTE**: There is also a cmake-gui available on Windows if you prefer that)
2. Fix up MinGW headers
a) Add the following lines to C:\MinGW\include\winsock2.h:
-
- ```c
- #if(_WIN32_WINNT >= 0x0600)
-
- typedef struct pollfd {
+```
+ #if(_WIN32_WINNT >= 0x0600)
- SOCKET fd;
- SHORT events;
- SHORT revents;
+ typedef struct pollfd {
- } WSAPOLLFD, *PWSAPOLLFD, FAR *LPWSAPOLLFD;
+ SOCKET fd;
+ SHORT events;
+ SHORT revents;
- WINSOCK_API_LINKAGE int WSAAPI WSAPoll(LPWSAPOLLFD fdArray, ULONG fds, INT timeout);
+ } WSAPOLLFD, *PWSAPOLLFD, FAR *LPWSAPOLLFD;
- #endif // (_WIN32_WINNT >= 0x0600)
- ```
+ WINSOCK_API_LINKAGE int WSAAPI WSAPoll(LPWSAPOLLFD fdArray, ULONG fds, INT timeout);
+ #endif // (_WIN32_WINNT >= 0x0600)
+```
b) Create C:\MinGW\include\mstcpip.h and copy and paste the content from following link into it:
http://wine-unstable.sourcearchive.com/documentation/1.1.32/mstcpip_8h-source.html
<OpenSSL install location>\bin\openssl.cfg
5. Generate the build files (default is Make files) using MSYS shell:
-
- ```bash
- $ cd /drive/path/to/src
- $ mkdir build
- $ cd build
- $ cmake -G "MSYS Makefiles" -DCMAKE_INSTALL_PREFIX=C:/MinGW ..
- ```
-
+```
+ $ cd /drive/path/to/src
+ $ mkdir build
+ $ cd build
+ $ cmake -G "MSYS Makefiles" -DCMAKE_INSTALL_PREFIX=C:/MinGW ..
+```
(**NOTE**: The `build/`` directory can have any name and be located anywhere
on your filesystem, and that the argument `..` given to cmake is simply
the source directory of **libwebsockets** containing the [CMakeLists.txt](CMakeLists.txt)
**NOTE2**:
To generate build files allowing to create libwebsockets binaries with debug information
set the CMAKE_BUILD_TYPE flag to DEBUG:
-
- ```bash
- $ cmake -G "MSYS Makefiles" -DCMAKE_INSTALL_PREFIX=C:/MinGW -DCMAKE_BUILD_TYPE=DEBUG ..
- ```
-
+```
+ $ cmake -G "MSYS Makefiles" -DCMAKE_INSTALL_PREFIX=C:/MinGW -DCMAKE_BUILD_TYPE=DEBUG ..
+```
6. Finally you can build using the generated Makefile and get the results deployed into your MinGW installation:
- ```bash
- $ make
- $ make install
- ```
+```
+ $ make
+ $ make install
+```
Setting compile options
-----------------------
Compiling libwebsockets with wolfSSL
------------------------------------
-
-```bash
-cmake .. -DLWS_USE_WOLFSSL=1 \
- -DLWS_WOLFSSL_INCLUDE_DIRS=/path/to/wolfssl \
- -DLWS_WOLFSSL_LIBRARIES=/path/to/wolfssl/wolfssl.a ..
+```
+ cmake .. -DLWS_USE_WOLFSSL=1 \
+ -DLWS_WOLFSSL_INCLUDE_DIRS=/path/to/wolfssl \
+ -DLWS_WOLFSSL_LIBRARIES=/path/to/wolfssl/wolfssl.a ..
```
**NOTE**: On windows use the .lib file extension for `LWS_WOLFSSL_LIBRARIES` instead.
Compiling libwebsockets with CyaSSL
-----------------------------------
-
-```bash
-cmake .. -DLWS_USE_CYASSL=1 \
- -DLWS_CYASSL_INCLUDE_DIRS=/path/to/cyassl \
- -DLWS_CYASSL_LIBRARIES=/path/to/wolfssl/cyassl.a ..
+```
+ cmake .. -DLWS_USE_CYASSL=1 \
+ -DLWS_CYASSL_INCLUDE_DIRS=/path/to/cyassl \
+ -DLWS_CYASSL_LIBRARIES=/path/to/wolfssl/cyassl.a ..
```
**NOTE**: On windows use the .lib file extension for `LWS_CYASSL_LIBRARIES` instead.
and polarssl apis... this should be treated as polarssl then.
Example config for this case is
-
+```
cmake .. -DLWS_USE_POLARSSL=1 -DLWS_POLARSSL_LIBRARIES=/usr/lib64/libmbedtls.so \
-DLWS_POLARSSL_INCLUDE_DIRS=/usr/include/polarssl/
-
+```
Building plugins outside of lws itself
--------------------------------------
The directory ./plugin-standalone/ shows how easy it is to create plugins
outside of lws itself. First build lws itself with -DLWS_WITH_PLUGINS,
then use the same flow to build the standalone plugin
-
```
-cd ./plugin-standalone
-mkdir build
-cd build
-cmake ..
-make && sudo make install
+ cd ./plugin-standalone
+ mkdir build
+ cd build
+ cmake ..
+ make && sudo make install
```
if you changed the default plugin directory when you built lws, you must
Otherwise if you run lwsws or libwebsockets-test-server-v2.0, it will now
find the additional plugin "libprotocol_example_standalone.so"
-
```
-lwsts[21257]: Plugins:
-lwsts[21257]: libprotocol_dumb_increment.so
-lwsts[21257]: libprotocol_example_standalone.so
-lwsts[21257]: libprotocol_lws_mirror.so
-lwsts[21257]: libprotocol_lws_server_status.so
-lwsts[21257]: libprotocol_lws_status.so
+ lwsts[21257]: Plugins:
+ lwsts[21257]: libprotocol_dumb_increment.so
+ lwsts[21257]: libprotocol_example_standalone.so
+ lwsts[21257]: libprotocol_lws_mirror.so
+ lwsts[21257]: libprotocol_lws_server_status.so
+ lwsts[21257]: libprotocol_lws_status.so
```
-
If you have multiple vhosts, you must enable plugins at the vhost
additionally, discovered plugins are not enabled automatically for security
reasons. You do this using info->pvo or for lwsws, in the JSON config.
You must have built and be running lws against a version of openssl that has
ALPN / NPN. Most distros still have older versions. You'll know it's right by
seeing
-
-```bash
-lwsts[4752]: Compiled with OpenSSL support
-lwsts[4752]: Using SSL mode
-lwsts[4752]: HTTP2 / ALPN enabled
```
-
+ lwsts[4752]: Compiled with OpenSSL support
+ lwsts[4752]: Using SSL mode
+ lwsts[4752]: HTTP2 / ALPN enabled
+```
at lws startup.
For non-SSL HTTP2.0 upgrade
-
-```bash
-$ nghttp -nvasu http://localhost:7681/test.htm
```
-
+ $ nghttp -nvasu http://localhost:7681/test.htm
+```
For SSL / ALPN HTTP2.0 upgrade
-
```
-$ nghttp -nvas https://localhost:7681/test.html
+ $ nghttp -nvas https://localhost:7681/test.html
```
Cross compiling
you can use as a starting point.
The commandline to configure for cross with this would look like
-
-```bash
-$ cmake .. -DCMAKE_INSTALL_PREFIX:PATH=/usr \
- -DCMAKE_TOOLCHAIN_FILE=../cross-arm-linux-gnueabihf.cmake \
- -DWITHOUT_EXTENSIONS=1 -DWITH_SSL=0
```
-
+ $ cmake .. -DCMAKE_INSTALL_PREFIX:PATH=/usr \
+ -DCMAKE_TOOLCHAIN_FILE=../cross-arm-linux-gnueabihf.cmake \
+ -DWITHOUT_EXTENSIONS=1 -DWITH_SSL=0
+```
The example shows how to build with no external cross lib dependencies, you
need to provide the cross libraries otherwise.
server, built on ARM Cortex-A9:
Update at 8dac94d (2013-02-18)
+```
+ $ ./configure --without-client --without-extensions --disable-debug --without-daemonize
-```bash
-$ ./configure --without-client --without-extensions --disable-debug --without-daemonize
-
-Context Creation, 1024 fd limit[2]: 16720 (includes 12 bytes per fd)
-Per-connection [3]: 72 bytes, +1328 during headers
+ Context Creation, 1024 fd limit[2]: 16720 (includes 12 bytes per fd)
+ Per-connection [3]: 72 bytes, +1328 during headers
-.text .rodata .data .bss
-11512 2784 288 4
+ .text .rodata .data .bss
+ 11512 2784 288 4
```
-
This shows the impact of the major configuration with/without options at
13ba5bbc633ea962d46d using Ubuntu ARM on a PandaBoard ES.
+Notes about coding with lws
+===========================
+
Daemonization
-------------
If you want to send something, do not just send it but request a callback
when the socket is writeable using
- - `lws_callback_on_writable(context, wsi)`` for a specific `wsi`, or
+ - `lws_callback_on_writable(context, wsi)` for a specific `wsi`, or
+
- `lws_callback_on_writable_all_protocol(protocol)` for all connections
using that protocol to get a callback when next writeable.
to gather the whole contents of a message, eg:
```
- case LWS_CALLBACK_RECEIVE:
- {
- Client * const client = (Client *)user;
- const size_t remaining = lws_remaining_packet_payload(wsi);
-
- if (!remaining && lws_is_final_fragment(wsi)) {
- if (client->HasFragments()) {
- client->AppendMessageFragment(in, len, 0);
- in = (void *)client->GetMessage();
- len = client->GetMessageLength();
- }
-
- client->ProcessMessage((char *)in, len, wsi);
- client->ResetMessage();
- } else
- client->AppendMessageFragment(in, len, remaining);
- }
- break;
+ case LWS_CALLBACK_RECEIVE:
+ {
+ Client * const client = (Client *)user;
+ const size_t remaining = lws_remaining_packet_payload(wsi);
+
+ if (!remaining && lws_is_final_fragment(wsi)) {
+ if (client->HasFragments()) {
+ client->AppendMessageFragment(in, len, 0);
+ in = (void *)client->GetMessage();
+ len = client->GetMessageLength();
+ }
+
+ client->ProcessMessage((char *)in, len, wsi);
+ client->ResetMessage();
+ } else
+ client->AppendMessageFragment(in, len, remaining);
+ }
+ break;
```
The test app libwebsockets-test-fraggle sources also show how to
The library is ready for use by C++ apps. You can get started quickly by
copying the test server
-```bash
-$ cp test-server/test-server.c test.cpp
+```
+ $ cp test-server/test-server.c test.cpp
```
and building it in C++ like this
-```bash
-$ g++ -DINSTALL_DATADIR=\"/usr/share\" -ocpptest test.cpp -lwebsockets
+```
+ $ g++ -DINSTALL_DATADIR=\"/usr/share\" -ocpptest test.cpp -lwebsockets
```
`INSTALL_DATADIR` is only needed because the test server uses it as shipped, if
You might want to look into that to stop the ssl peers selecting a cipher which
is too computationally expensive. To use it, point it to a string like
-`"RC4-MD5:RC4-SHA:AES128-SHA:AES256-SHA:HIGH:!DSS:!aNULL"`
+ `"RC4-MD5:RC4-SHA:AES128-SHA:AES256-SHA:HIGH:!DSS:!aNULL"`
if left `NULL`, then the "DEFAULT" set of ciphers are all possible to select.
+You can also set it to `"ALL"` to allow everything (including insecure ciphers).
+
Async nature of client connections
----------------------------------
The user code can get a pointer to the file operations struct
-LWS_VISIBLE LWS_EXTERN struct lws_plat_file_ops *
-`lws_get_fops`(struct lws_context *context);
+```
+ LWS_VISIBLE LWS_EXTERN struct lws_plat_file_ops *
+ `lws_get_fops`(struct lws_context *context);
+```
and then can use helpers to also leverage these platform-independent
file handling apis
-static inline lws_filefd_type
-`lws_plat_file_open`(struct lws *wsi, const char *filename, unsigned long *filelen, int flags)
+```
+ static inline lws_filefd_type
+ `lws_plat_file_open`(struct lws *wsi, const char *filename, unsigned long *filelen, int flags)
+
+ static inline int
+ `lws_plat_file_close`(struct lws *wsi, lws_filefd_type fd)
-static inline int
-`lws_plat_file_close`(struct lws *wsi, lws_filefd_type fd)
+ static inline unsigned long
+ `lws_plat_file_seek_cur`(struct lws *wsi, lws_filefd_type fd, long offset_from_cur_pos)
-static inline unsigned long
-`lws_plat_file_seek_cur`(struct lws *wsi, lws_filefd_type fd, long offset_from_cur_pos)
+ static inline int
+ `lws_plat_file_read`(struct lws *wsi, lws_filefd_type fd, unsigned long *amount, unsigned char *buf, unsigned long len)
-static inline int
-`lws_plat_file_read`(struct lws *wsi, lws_filefd_type fd, unsigned long *amount, unsigned char *buf, unsigned long len)
+ static inline int
+ `lws_plat_file_write`(struct lws *wsi, lws_filefd_type fd, unsigned long *amount, unsigned char *buf, unsigned long len)
+```
-static inline int
-`lws_plat_file_write`(struct lws *wsi, lws_filefd_type fd, unsigned long *amount, unsigned char *buf, unsigned long len)
-
The user code can also override or subclass the file operations, to either
wrap or replace them. An example is shown in test server.
ECDH Certs are now supported. Enable the CMake option
-cmake .. -DLWS_SSL_SERVER_WITH_ECDH_CERT=1
+ cmake .. -DLWS_SSL_SERVER_WITH_ECDH_CERT=1
**and** the info->options flag
-LWS_SERVER_OPTION_SSL_ECDH
+ LWS_SERVER_OPTION_SSL_ECDH
to build in support and select it at runtime.
You can select either or both
--DLWS_WITH_LIBEV=1
--DLWS_WITH_LIBUV=1
+ -DLWS_WITH_LIBEV=1
+ -DLWS_WITH_LIBUV=1
at cmake configure-time. The user application may use one of the
context init options flags
-LWS_SERVER_OPTION_LIBEV
-LWS_SERVER_OPTION_LIBUV
+ LWS_SERVER_OPTION_LIBEV
+ LWS_SERVER_OPTION_LIBUV
to indicate it will use either of the event libraries.
---------------------------------------
User code may set per-connection extension options now, using a new api
-"lws_set_extension_option()".
+`lws_set_extension_option()`.
This should be called from the ESTABLISHED callback like this
-
- lws_set_extension_option(wsi, "permessage-deflate",
- "rx_buf_size", "12"); /* 1 << 12 */
+```
+ lws_set_extension_option(wsi, "permessage-deflate",
+ "rx_buf_size", "12"); /* 1 << 12 */
+```
If the extension is not active (missing or not negotiated for the
connection, or extensions are disabled on the library) the call is
Either way you use the api `lws_http_client_read()` to access the
data, eg
-
+```
case LWS_CALLBACK_RECEIVE_CLIENT_HTTP:
{
char buffer[1024 + LWS_PRE];
putchar(*px++);
}
break;
-
+```
+
Using lws v2 vhosts
-------------------
afterwards to attach one or more vhosts manually.
```
-LWS_VISIBLE struct lws_vhost *
-lws_create_vhost(struct lws_context *context,
- struct lws_context_creation_info *info,
- struct lws_http_mount *mounts);
+ LWS_VISIBLE struct lws_vhost *
+ lws_create_vhost(struct lws_context *context,
+ struct lws_context_creation_info *info,
+ struct lws_http_mount *mounts);
```
lws_create_vhost() uses the same info struct as lws_create_context(),
for vhost (marked with VH in libwebsockets.h).
```
-struct lws_context_creation_info {
- int port; /* VH */
- const char *iface; /* VH */
- const struct lws_protocols *protocols; /* VH */
- const struct lws_extension *extensions; /* VH */
-...
+ struct lws_context_creation_info {
+ int port; /* VH */
+ const char *iface; /* VH */
+ const struct lws_protocols *protocols; /* VH */
+ const struct lws_extension *extensions; /* VH */
+ ...
```
When you attach the vhost, if the vhost's port already has a listen socket
filesystem how you like and deal with the contents transparently.
```
-struct lws_http_mount {
- struct lws_http_mount *mount_next;
- const char *mountpoint; /* mountpoint in http pathspace, eg, "/" */
- const char *origin; /* path to be mounted, eg, "/var/www/warmcat.com" */
- const char *def; /* default target, eg, "index.html" */
-
- struct lws_protocol_vhost_options *cgienv;
-
- int cgi_timeout;
- int cache_max_age;
-
- unsigned int cache_reusable:1;
- unsigned int cache_revalidate:1;
- unsigned int cache_intermediaries:1;
-
- unsigned char origin_protocol;
- unsigned char mountpoint_len;
-};
+ struct lws_http_mount {
+ struct lws_http_mount *mount_next;
+ const char *mountpoint; /* mountpoint in http pathspace, eg, "/" */
+ const char *origin; /* path to be mounted, eg, "/var/www/warmcat.com" */
+ const char *def; /* default target, eg, "index.html" */
+
+ struct lws_protocol_vhost_options *cgienv;
+
+ int cgi_timeout;
+ int cache_max_age;
+
+ unsigned int cache_reusable:1;
+ unsigned int cache_revalidate:1;
+ unsigned int cache_intermediaries:1;
+
+ unsigned char origin_protocol;
+ unsigned char mountpoint_len;
+ };
```
The last mount structure should have a NULL mount_next, otherwise it should
`.origin_protocol` should be one of
```
-enum {
- LWSMPRO_HTTP,
- LWSMPRO_HTTPS,
- LWSMPRO_FILE,
- LWSMPRO_CGI,
- LWSMPRO_REDIR_HTTP,
- LWSMPRO_REDIR_HTTPS,
- LWSMPRO_CALLBACK,
-};
+ enum {
+ LWSMPRO_HTTP,
+ LWSMPRO_HTTPS,
+ LWSMPRO_FILE,
+ LWSMPRO_CGI,
+ LWSMPRO_REDIR_HTTP,
+ LWSMPRO_REDIR_HTTPS,
+ LWSMPRO_CALLBACK,
+ };
```
-LWSMPRO_FILE is used for mapping url namespace to a filesystem directory and
+ - LWSMPRO_FILE is used for mapping url namespace to a filesystem directory and
serve it automatically.
-LWSMPRO_CGI associates the url namespace with the given CGI executable, which
+ - LWSMPRO_CGI associates the url namespace with the given CGI executable, which
runs when the URL is accessed and the output provided to the client.
-LWSMPRO_REDIR_HTTP and LWSMPRO_REDIR_HTTPS auto-redirect clients to the given
+ - LWSMPRO_REDIR_HTTP and LWSMPRO_REDIR_HTTPS auto-redirect clients to the given
origin URL.
-LWSMPRO_CALLBACK causes the http connection to attach to the callback
+ - LWSMPRO_CALLBACK causes the http connection to attach to the callback
associated with the named protocol (which may be a plugin).
providing "protocol-post-demo" like this
```
-static const struct lws_http_mount mount_post = {
- NULL, /* linked-list pointer to next*/
- "/formtest", /* mountpoint in URL namespace on this vhost */
- "protocol-post-demo", /* handler */
- NULL, /* default filename if none given */
- NULL,
- 0,
- 0,
- 0,
- 0,
- 0,
- LWSMPRO_CALLBACK, /* origin points to a callback */
- 9, /* strlen("/formtest"), ie length of the mountpoint */
-};
+ static const struct lws_http_mount mount_post = {
+ NULL, /* linked-list pointer to next*/
+ "/formtest", /* mountpoint in URL namespace on this vhost */
+ "protocol-post-demo", /* handler */
+ NULL, /* default filename if none given */
+ NULL,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ LWSMPRO_CALLBACK, /* origin points to a callback */
+ 9, /* strlen("/formtest"), ie length of the mountpoint */
+ };
```
Client access to /formtest[anything] will be passed to the callback registered
-Generic Sessions Plugin
------------------------
+Notes about generic-sessions Plugin
+===================================
Enabling for build
------------------
- admin account (with user-selectable username) is defined in config with a SHA-1 of the password; rest of the accounts are in sqlite3
- - user account passwords stored as salted SHA-1 with additional confounder
+ - user account passwords stored as salted SHA-1 with additional confounder
only stored in the JSON config, not the database
- login, logout, register account + email verification built-in with examples
That's it. An example is below
-
```
-<html>
- <head>
- <script src="lwsgs.js"></script>
- <style>
- .body { font-size: 12 }
- .gstitle { font-size: 18 }
- </style>
- </head>
- <body style="background-image:url(seats.jpg)">
- <table style="width:100%;transition: max-height 2s;">
- <tr>
- <td style="vertical-align:top;text-align:left;width=200px">
- <img src="lwsgs-logo.png">
- </td>
- <td style="vertical-align:top;float:right">
- <div id=lwsgs style="text-align:right;background-color: rgba(255, 255, 255, 0.8);"></div>
- </td>
- </tr>
- </table>
- </form>
-
- <script>lwsgs_initial();</script>
-
- </body>
-</html>
+ <html>
+ <head>
+ <script src="lwsgs.js"></script>
+ <style>
+ .body { font-size: 12 }
+ .gstitle { font-size: 18 }
+ </style>
+ </head>
+ <body style="background-image:url(seats.jpg)">
+ <table style="width:100%;transition: max-height 2s;">
+ <tr>
+ <td style="vertical-align:top;text-align:left;width=200px">
+ <img src="lwsgs-logo.png">
+ </td>
+ <td style="vertical-align:top;float:right">
+ <div id=lwsgs style="text-align:right;background-color: rgba(255, 255, 255, 0.8);"></div>
+ </td>
+ </tr>
+ </table>
+ </form>
+
+ <script>lwsgs_initial();</script>
+
+ </body>
+ </html>
```
-
Overall Flow
------------
- b0 is set if you are logged in as a user at all.
- b1 is set if you are logged in with the user configured to be admin
- b2 is set if the account has been verified (the account configured for admin is always verified)
+ - b3 is set if your session just did the forgot password flow successfully
```
- {
- # things in here can always be served
- "mountpoint": "/lwsgs",
- "origin": "file:///usr/share/libwebsockets-test-server/generic-sessions",
- "origin": "callback://protocol-lws-messageboard",
- "default": "generic-sessions-login-example.html",
- "auth-mask": "0",
- "interpret": {
- ".js": "protocol-lws-messageboard"
- }
- }, {
- # things in here can only be served if logged in as a user
- "mountpoint": "/lwsgs/needauth",
- "origin": "file:///usr/share/libwebsockets-test-server/generic-sessions/needauth",
- "origin": "callback://protocol-lws-messageboard",
- "default": "generic-sessions-login-example.html",
- "auth-mask": "5", # logged in as a verified user
- "interpret": {
- ".js": "protocol-lws-messageboard"
- }
- }, {
- # things in here can only be served if logged in as admin
- "mountpoint": "/lwsgs/needadmin",
- "origin": "file:///usr/share/libwebsockets-test-server/generic-sessions/needadmin",
- "origin": "callback://protocol-lws-messageboard",
- "default": "generic-sessions-login-example.html",
- "auth-mask": "7", # b2 = verified (by email / or admin), b1 = admin, b0 = logged in with any user name
- "interpret": {
- ".js": "protocol-lws-messageboard"
- }
- }
+ {
+ # things in here can always be served
+ "mountpoint": "/lwsgs",
+ "origin": "file:///usr/share/libwebsockets-test-server/generic-sessions",
+ "origin": "callback://protocol-lws-messageboard",
+ "default": "generic-sessions-login-example.html",
+ "auth-mask": "0",
+ "interpret": {
+ ".js": "protocol-lws-messageboard"
+ }
+ }, {
+ # things in here can only be served if logged in as a user
+ "mountpoint": "/lwsgs/needauth",
+ "origin": "file:///usr/share/libwebsockets-test-server/generic-sessions/needauth",
+ "origin": "callback://protocol-lws-messageboard",
+ "default": "generic-sessions-login-example.html",
+ "auth-mask": "5", # logged in as a verified user
+ "interpret": {
+ ".js": "protocol-lws-messageboard"
+ }
+ }, {
+ # things in here can only be served if logged in as admin
+ "mountpoint": "/lwsgs/needadmin",
+ "origin": "file:///usr/share/libwebsockets-test-server/generic-sessions/needadmin",
+ "origin": "callback://protocol-lws-messageboard",
+ "default": "generic-sessions-login-example.html",
+ "auth-mask": "7", # b2 = verified (by email / or admin), b1 = admin, b0 = logged in with any user name
+ "interpret": {
+ ".js": "protocol-lws-messageboard"
+ }
+ }
```
-
Note that the name of the real application protocol that uses generic-sessions
is used, not generic-sessions itself.
The vhost configures the storage dir, admin credentials and session cookie lifetimes:
```
- "ws-protocols": [{
- "protocol-generic-sessions": {
- "status": "ok",
- "admin-user": "admin",
-
-# create the pw hash like this (for the example pw, "jipdocesExunt" )
-# $ echo -n "jipdocesExunt" | sha1sum
-# 046ce9a9cca769e85798133be06ef30c9c0122c9 -
-#
-# Obviously ** change this password hash to a secret one before deploying **
-#
- "admin-password-sha1": "046ce9a9cca769e85798133be06ef30c9c0122c9",
- "session-db": "/var/www/sessions/lws.sqlite3",
- "timeout-idle-secs": "600",
- "timeout-anon-idle-secs": "1200",
- "timeout-absolute-secs": "6000",
-# the confounder is part of the salted password hashes. If this config
-# file is in a 0700 root:root dir, an attacker with apache credentials
-# will have to get the confounder out of the process image to even try
-# to guess the password hashes.
- "confounder": "Change to <=31 chars of junk",
-
- "email-from": "noreply@example.com",
- "email-smtp-ip": "127.0.0.1",
- "email-expire": "3600",
- "email-helo": "myhost.com",
- "email-contact-person": "Set Me <real-person@email.com>",
- "email-confirm-url-base": "http://localhost:7681/lwsgs"
- }
+ "ws-protocols": [{
+ "protocol-generic-sessions": {
+ "status": "ok",
+ "admin-user": "admin",
+
+ # create the pw hash like this (for the example pw, "jipdocesExunt" )
+ # $ echo -n "jipdocesExunt" | sha1sum
+ # 046ce9a9cca769e85798133be06ef30c9c0122c9 -
+ #
+ # Obviously ** change this password hash to a secret one before deploying **
+ #
+ "admin-password-sha1": "046ce9a9cca769e85798133be06ef30c9c0122c9",
+ "session-db": "/var/www/sessions/lws.sqlite3",
+ "timeout-idle-secs": "600",
+ "timeout-anon-idle-secs": "1200",
+ "timeout-absolute-secs": "6000",
+ # the confounder is part of the salted password hashes. If this config
+ # file is in a 0700 root:root dir, an attacker with apache credentials
+ # will have to get the confounder out of the process image to even try
+ # to guess the password hashes.
+ "confounder": "Change to <=31 chars of junk",
+
+ "email-from": "noreply@example.com",
+ "email-smtp-ip": "127.0.0.1",
+ "email-expire": "3600",
+ "email-helo": "myhost.com",
+ "email-contact-person": "Set Me <real-person@email.com>",
+ "email-confirm-url-base": "http://localhost:7681/lwsgs"
+ }
```
The email- related settings control generation of automatic emails for
any configuration it needs given
```
- "protocol-lws-messageboard": {
- "status": "ok",
- "message-db": "/var/www/sessions/messageboard.sqlite3"
- },
+ "protocol-lws-messageboard": {
+ "status": "ok",
+ "message-db": "/var/www/sessions/messageboard.sqlite3"
+ },
```
+
Notice the real application uses his own sqlite db, no details about how
generic-sessions works or how it stores data are available to it.
that usually means apache, eg
```
-# mkdir -p /var/www/sessions
-# chown root:apache /var/www/sessions
-# chmod 770 /var/www/sessions
+ # mkdir -p /var/www/sessions
+ # chown root:apache /var/www/sessions
+ # chmod 770 /var/www/sessions
```
Email configuration
the generic-sessions protocol struct exposes
```
-struct per_session_data__myapp {
- void *pss_gs;
-...
-
- pss->pss_gs = malloc(vhd->gsp->per_session_data_size);
+ struct per_session_data__myapp {
+ void *pss_gs;
+ ...
+
+ pss->pss_gs = malloc(vhd->gsp->per_session_data_size);
```
The allocation reserved for generic-sessions is then used as user_space when
should be used to malloc and free and kind of per-connection
secondary allocations.
-
```
case LWS_CALLBACK_HTTP_BIND_PROTOCOL:
if (!pss || pss->pss_gs)
and lws itself provides a generic session info struct to pass the related data
```
-struct lws_session_info {
- char username[32];
- char email[100];
- char ip[72];
- unsigned int mask;
- char session[42];
-};
-```
+ struct lws_session_info {
+ char username[32];
+ char email[100];
+ char ip[72];
+ unsigned int mask;
+ char session[42];
+ };
-```
struct lws_session_info sinfo;
...
vhd->gsp->callback(wsi, LWS_CALLBACK_SESSION_INFO,
+Notes about lwsws
+=================
+
Libwebsockets Web Server
------------------------
There is a single file intended for global settings
/etc/lwsws/conf
-
```
-# these are the server global settings
-# stuff related to vhosts should go in one
-# file per vhost in ../conf.d/
-
-{
- "global": {
- "uid": "48", # apache user
- "gid": "48", # apache user
- "count-threads": "1",
- "server-string": "myserver v1", # returned in http headers
- "init-ssl": "yes"
- }
-}
+ # these are the server global settings
+ # stuff related to vhosts should go in one
+ # file per vhost in ../conf.d/
+
+ {
+ "global": {
+ "uid": "48", # apache user
+ "gid": "48", # apache user
+ "count-threads": "1",
+ "server-string": "myserver v1", # returned in http headers
+ "init-ssl": "yes"
+ }
+ }
```
-
and a config directory intended to take one file per vhost
/etc/lwsws/conf.d/warmcat.com
-
```
-{
- "vhosts": [{
- "name": "warmcat.com",
- "port": "443",
- "interface": "eth0", # optional
- "host-ssl-key": "/etc/pki/tls/private/warmcat.com.key", # if given enable ssl
- "host-ssl-cert": "/etc/pki/tls/certs/warmcat.com.crt",
- "host-ssl-ca": "/etc/pki/tls/certs/warmcat.com.cer",
- "mounts": [{ # autoserve
- "mountpoint": "/",
- "origin": "file:///var/www/warmcat.com",
- "default": "index.html"
+ {
+ "vhosts": [{
+ "name": "warmcat.com",
+ "port": "443",
+ "interface": "eth0", # optional
+ "host-ssl-key": "/etc/pki/tls/private/warmcat.com.key", # if given enable ssl
+ "host-ssl-cert": "/etc/pki/tls/certs/warmcat.com.crt",
+ "host-ssl-ca": "/etc/pki/tls/certs/warmcat.com.cer",
+ "mounts": [{ # autoserve
+ "mountpoint": "/",
+ "origin": "file:///var/www/warmcat.com",
+ "default": "index.html"
+ }]
}]
- }]
-}
+ }
```
-
To get started quickly, an example config reproducing the old test server
on port 7681, non-SSL is provided. To set it up
-
```
-# mkdir -p /etc/lwsws/conf.d /var/log/lwsws
-# cp ./lwsws/etc-lwsws-conf-EXAMPLE /etc/lwsws/conf
-# cp ./lwsws/etc-lwsws-conf.d-localhost-EXAMPLE /etc/lwsws/conf.d/test-server
-# sudo lwsws
+ # mkdir -p /etc/lwsws/conf.d /var/log/lwsws
+ # cp ./lwsws/etc-lwsws-conf-EXAMPLE /etc/lwsws/conf
+ # cp ./lwsws/etc-lwsws-conf.d-localhost-EXAMPLE /etc/lwsws/conf.d/test-server
+ # sudo lwsws
```
-
Vhosts
------
negotiation.
Listing multiple vhosts looks something like this
-
```
-{
- "vhosts": [ {
- "name": "localhost",
- "port": "443",
- "host-ssl-key": "/etc/pki/tls/private/libwebsockets.org.key",
- "host-ssl-cert": "/etc/pki/tls/certs/libwebsockets.org.crt",
- "host-ssl-ca": "/etc/pki/tls/certs/libwebsockets.org.cer",
- "mounts": [{
- "mountpoint": "/",
- "origin": "file:///var/www/libwebsockets.org",
- "default": "index.html"
- }, {
- "mountpoint": "/testserver",
- "origin": "file:///usr/local/share/libwebsockets-test-server",
- "default": "test.html"
- }],
- # which protocols are enabled for this vhost, and optional
- # vhost-specific config options for the protocol
- #
- "ws-protocols": [{
- "warmcat,timezoom": {
- "status": "ok"
- }
- }]
- },
- {
- "name": "localhost",
- "port": "7681",
- "host-ssl-key": "/etc/pki/tls/private/libwebsockets.org.key",
- "host-ssl-cert": "/etc/pki/tls/certs/libwebsockets.org.crt",
- "host-ssl-ca": "/etc/pki/tls/certs/libwebsockets.org.cer",
- "mounts": [{
- "mountpoint": "/",
- "origin": ">https://localhost"
- }]
- },
- {
- "name": "localhost",
- "port": "80",
- "mounts": [{
- "mountpoint": "/",
- "origin": ">https://localhost"
- }]
- }
-
- ]
-}
+ {
+ "vhosts": [ {
+ "name": "localhost",
+ "port": "443",
+ "host-ssl-key": "/etc/pki/tls/private/libwebsockets.org.key",
+ "host-ssl-cert": "/etc/pki/tls/certs/libwebsockets.org.crt",
+ "host-ssl-ca": "/etc/pki/tls/certs/libwebsockets.org.cer",
+ "mounts": [{
+ "mountpoint": "/",
+ "origin": "file:///var/www/libwebsockets.org",
+ "default": "index.html"
+ }, {
+ "mountpoint": "/testserver",
+ "origin": "file:///usr/local/share/libwebsockets-test-server",
+ "default": "test.html"
+ }],
+ # which protocols are enabled for this vhost, and optional
+ # vhost-specific config options for the protocol
+ #
+ "ws-protocols": [{
+ "warmcat,timezoom": {
+ "status": "ok"
+ }
+ }]
+ },
+ {
+ "name": "localhost",
+ "port": "7681",
+ "host-ssl-key": "/etc/pki/tls/private/libwebsockets.org.key",
+ "host-ssl-cert": "/etc/pki/tls/certs/libwebsockets.org.crt",
+ "host-ssl-ca": "/etc/pki/tls/certs/libwebsockets.org.cer",
+ "mounts": [{
+ "mountpoint": "/",
+ "origin": ">https://localhost"
+ }]
+ },
+ {
+ "name": "localhost",
+ "port": "80",
+ "mounts": [{
+ "mountpoint": "/",
+ "origin": ">https://localhost"
+ }]
+ }
+
+ ]
+ }
```
That sets up three vhosts all called "localhost" on ports 443 and 7681 with SSL, and port 80 without SSL but with a forced redirect to https://localhost
any protocols exposed by plugins.
Vhosts can select which plugins they want to offer and give them per-vhost settings using this syntax
-
-```
- "ws-protocols": [{
- "warmcat-timezoom": {
- "status": "ok"
- }
- }]
-
+```
+ "ws-protocols": [{
+ "warmcat-timezoom": {
+ "status": "ok"
+ }
+ }]
```
The "x":"y" parameters like "status":"ok" are made available to the protocol during its per-vhost
To indicate that a protocol should be used when no Protocol: header is sent
by the client, you can use "default": "1"
-
-```
- "ws-protocols": [{
- "warmcat-timezoom": {
- "status": "ok",
- "default": "1"
- }
- }]
-
+```
+ "ws-protocols": [{
+ "warmcat-timezoom": {
+ "status": "ok",
+ "default": "1"
+ }
+ }]
```
It may be used multiple times and OR's the flags together.
The values are derived from /usr/include/openssl/ssl.h
-
- ```
- # define SSL_OP_NO_TLSv1_1 0x10000000L
- ```
+```
+ # define SSL_OP_NO_TLSv1_1 0x10000000L
+```
would equate to
+```
+ "`ssl-option-set`": "268435456"
```
- "`ssl-option-set`": "268435456"
- ```
-
- "`ssl-option-clear'": "<decimal>" Clears the SSL option flag value for the vhost.
It may be used multiple times and OR's the flags together.
- file:// serve the uri using the remainder of the url past the mountpoint based on the origin directory.
Eg, with this mountpoint
-
```
- {
- "mountpoint": "/",
- "origin": "file:///var/www/mysite.com",
- "default": "/"
- }
+ {
+ "mountpoint": "/",
+ "origin": "file:///var/www/mysite.com",
+ "default": "/"
+ }
```
-
The uri /file.jpg would serve /var/www/mysite.com/file.jpg, since / matched.
- ^http:// or ^https:// these cause any url matching the mountpoint to issue a redirect to the origin url
- cgi:// this causes any matching url to be given to the named cgi, eg
-
```
- {
- "mountpoint": "/git",
- "origin": "cgi:///var/www/cgi-bin/cgit",
- "default": "/"
- }, {
- "mountpoint": "/cgit-data",
- "origin": "file:///usr/share/cgit",
- "default": "/"
- },
+ {
+ "mountpoint": "/git",
+ "origin": "cgi:///var/www/cgi-bin/cgit",
+ "default": "/"
+ }, {
+ "mountpoint": "/cgit-data",
+ "origin": "file:///usr/share/cgit",
+ "default": "/"
+ },
```
-
would cause the url /git/myrepo to pass "myrepo" to the cgi /var/www/cgi-bin/cgit and send the results to the client.
-Note: currently only a fixed set of mimetypes are supported.
Other mount options
-------------------
1) When using a cgi:// protcol origin at a mountpoint, you may also give cgi environment variables specific to the mountpoint like this
-
```
- {
- "mountpoint": "/git",
- "origin": "cgi:///var/www/cgi-bin/cgit",
- "default": "/",
- "cgi-env": [{
- "CGIT_CONFIG": "/etc/cgitrc/libwebsockets.org"
- }]
- }
+ {
+ "mountpoint": "/git",
+ "origin": "cgi:///var/www/cgi-bin/cgit",
+ "default": "/",
+ "cgi-env": [{
+ "CGIT_CONFIG": "/etc/cgitrc/libwebsockets.org"
+ }]
+ }
```
-
This allows you to customize one cgi depending on the mountpoint (and / or vhost).
2) It's also possible to set the cgi timeout (in secs) per cgi:// mount, like this
-
```
"cgi-timeout": "30"
```
-
3) `callback://` protocol may be used when defining a mount to associate a
named protocol callback with the URL namespace area. For example
-
```
- {
- "mountpoint": "/formtest",
- "origin": "callback://protocol-post-demo"
- }
+ {
+ "mountpoint": "/formtest",
+ "origin": "callback://protocol-post-demo"
+ }
```
-
All handling of client access to /formtest[anything] will be passed to the
callback registered to the protocol "protocol-post-demo".
4) Cache policy of the files in the mount can also be set. If no
options are given, the content is marked uncacheable.
-
- {
- "mountpoint": "/",
- "origin": "file:///var/www/mysite.com",
- "cache-max-age": "60", # seconds
- "cache-reuse": "1", # allow reuse at client at all
- "cache-revalidate": "1", # check it with server each time
- "cache-intermediaries": "1" # allow intermediary caches to hold
- }
-
+```
+ {
+ "mountpoint": "/",
+ "origin": "file:///var/www/mysite.com",
+ "cache-max-age": "60", # seconds
+ "cache-reuse": "1", # allow reuse at client at all
+ "cache-revalidate": "1", # check it with server each time
+ "cache-intermediaries": "1" # allow intermediary caches to hold
+ }
+```
4) You can also define a list of additional mimetypes per-mount
-
- "extra-mimetypes": {
- ".zip": "application/zip",
- ".doc": "text/evil"
- }
-
+```
+ "extra-mimetypes": {
+ ".zip": "application/zip",
+ ".doc": "text/evil"
+ }
+```
Plugins
-------
Packages that have their own lws plugins can install them in their own
preferred dir and ask lwsws to scan there by using a config fragment
like this, in its own conf.d/ file managed by the other package
-
-{
- "global": {
- "plugin-dir": "/usr/local/share/coherent-timeline/plugins"
- }
-}
-
+```
+ {
+ "global": {
+ "plugin-dir": "/usr/local/share/coherent-timeline/plugins"
+ }
+ }
+```
lws-server-status plugin
------------------------
One provided protocol can be used to monitor the server status.
Enable the protocol like this on a vhost's ws-protocols section
-
- "lws-server-status": {
- "status": "ok",
- "update-ms": "5000"
- }
-
+```
+ "lws-server-status": {
+ "status": "ok",
+ "update-ms": "5000"
+ }
+```
"update-ms" is used to control how often updated JSON is sent on a ws link.
And map the provided HTML into the vhost in the mounts section
-
- {
- "mountpoint": "/server-status",
- "origin": "file:///usr/local/share/libwebsockets-test-server/server-status",
- "default": "server-status.html"
- }
-
+```
+ {
+ "mountpoint": "/server-status",
+ "origin": "file:///usr/local/share/libwebsockets-test-server/server-status",
+ "default": "server-status.html"
+ }
+```
You might choose to put it on its own vhost which has "interface": "lo", so it's not
externally visible.
------------------------
lwsws needs a service file like this as `/usr/lib/systemd/system/lwsws.service`
-
```
-[Unit]
-Description=Libwebsockets Web Server
-After=syslog.target
-
-[Service]
-ExecStart=/usr/local/bin/lwsws
-StandardError=null
-
-[Install]
-WantedBy=multi-user.target
-
+ [Unit]
+ Description=Libwebsockets Web Server
+ After=syslog.target
+
+ [Service]
+ ExecStart=/usr/local/bin/lwsws
+ StandardError=null
+
+ [Install]
+ WantedBy=multi-user.target
```
You can find this prepared in `./lwsws/usr-lib-systemd-system-lwsws.service`
For correct operation with logrotate, `/etc/logrotate.d/lwsws` (if that's
where we're putting the logs) should contain
-
```
-/var/log/lwsws/*log {
- copytruncate
- missingok
- notifempty
- delaycompress
-}
+ /var/log/lwsws/*log {
+ copytruncate
+ missingok
+ notifempty
+ delaycompress
+ }
```
-
You can find this prepared in `/lwsws/etc-logrotate.d-lwsws`
Prepare the log directory like this
```
-sudo mkdir /var/log/lwsws
-sudo chmod 700 /var/log/lwsws
+ sudo mkdir /var/log/lwsws
+ sudo chmod 700 /var/log/lwsws
```
- https://github.com/warmcat/libwebsockets
- https://libwebsockets.org/git
-for more information:
+Doxygen API docs for master: https://libwebsockets.org/lws-api-doc-master/html/index.html
-- [README.build.md](README.build.md) - information on building the library
-- [README.coding.md](README.coding.md) - information for writing code using the library
-- [README.test-apps.md](README.test-apps.md) - information about the test apps built with the library
After libwebsockets 1.3, tags will be signed using a key corresponding to this public key
+Notes about lws test apps
+=========================
+
Testing server with a browser
-----------------------------
If you run [libwebsockets-test-server](test-server/test-server.c) and point your browser
(eg, Chrome) to
- http://127.0.0.1:7681
+ http://127.0.0.1:7681
It will fetch a script in the form of `test.html`, and then run the
script in there on the browser to open a websocket connection.
terminates.
To stop the daemon, do
-
-```bash
-$ kill `cat /tmp/.lwsts-lock`
```
-
+ $ kill cat /tmp/.lwsts-lock
+```
If it finds a stale lock (the pid mentioned in the file does not exist
any more) it will delete the lock and create a new one during startup.
----------------------------
To test it using SSL/WSS, just run the test server with
-
-```bash
-$ libwebsockets-test-server --ssl
```
-
+ $ libwebsockets-test-server --ssl
+```
and use the URL
-
- https://127.0.0.1:7681
-
+```
+ https://127.0.0.1:7681
+```
The connection will be entirely encrypted using some generated
certificates that your browser will not accept, since they are
not signed by any real Certificate Authority. Just accept the
If you run the test server as described above, you can also
connect to it using the test client as well as a browser.
-```bash
-$ libwebsockets-test-client localhost
+```
+ $ libwebsockets-test-client localhost
```
will by default connect to the test server on localhost:7681
The test client supports SSL too, use
-```bash
-$ libwebsockets-test-client localhost --ssl -s
+```
+ $ libwebsockets-test-client localhost --ssl -s
```
the -s tells it to accept the default selfsigned cert from the server,
You can test against `echo.websockets.org` as a sanity test like
this (the client connects to port `80` by default):
-```bash
-$ libwebsockets-test-echo --client echo.websocket.org
+```
+ $ libwebsockets-test-echo --client echo.websocket.org
```
This echo test is of limited use though because it doesn't
negotiate any protocol. You can run the same test app as a
local server, by default on localhost:7681
-
-```bash
-$ libwebsockets-test-echo
```
-
+ $ libwebsockets-test-echo
+```
and do the echo test against the local echo server
-
-```bash
-$ libwebsockets-test-echo --client localhost --port 7681
```
-
+ $ libwebsockets-test-echo --client localhost --port 7681
+```
If you add the `--ssl` switch to both the client and server, you can also test
with an encrypted link.
------------------------------
To test SSL/WSS client action, just run the client test with
-
-```bash
-$ libwebsockets-test-client localhost --ssl
```
-
+ $ libwebsockets-test-client localhost --ssl
+```
By default the client test applet is set to accept selfsigned
certificates used by the test server, this is indicated by the
`use_ssl` var being set to `2`. Set it to `1` to reject any server
--------------------------------
libwebsockets-test-ping connects as a client to a remote
-websocket server using 04 protocol and pings it like the
+websocket server and pings it like the
normal unix ping utility.
-
-```bash
-$ libwebsockets-test-ping localhost
-handshake OK for protocol lws-mirror-protocol
-Websocket PING localhost.localdomain (127.0.0.1) 64 bytes of data.
-64 bytes from localhost: req=1 time=0.1ms
-64 bytes from localhost: req=2 time=0.1ms
-64 bytes from localhost: req=3 time=0.1ms
-64 bytes from localhost: req=4 time=0.2ms
-64 bytes from localhost: req=5 time=0.1ms
-64 bytes from localhost: req=6 time=0.2ms
-64 bytes from localhost: req=7 time=0.2ms
-64 bytes from localhost: req=8 time=0.1ms
-^C
---- localhost.localdomain websocket ping statistics ---
-8 packets transmitted, 8 received, 0% packet loss, time 7458ms
-rtt min/avg/max = 0.110/0.185/0.218 ms
-$
```
-
+ $ libwebsockets-test-ping localhost
+ handshake OK for protocol lws-mirror-protocol
+ Websocket PING localhost.localdomain (127.0.0.1) 64 bytes of data.
+ 64 bytes from localhost: req=1 time=0.1ms
+ 64 bytes from localhost: req=2 time=0.1ms
+ 64 bytes from localhost: req=3 time=0.1ms
+ 64 bytes from localhost: req=4 time=0.2ms
+ 64 bytes from localhost: req=5 time=0.1ms
+ 64 bytes from localhost: req=6 time=0.2ms
+ 64 bytes from localhost: req=7 time=0.2ms
+ 64 bytes from localhost: req=8 time=0.1ms
+ ^C
+ --- localhost.localdomain websocket ping statistics ---
+ 8 packets transmitted, 8 received, 0% packet loss, time 7458ms
+ rtt min/avg/max = 0.110/0.185/0.218 ms
+ $
+```
By default it sends 64 byte payload packets using the 04
PING packet opcode type. You can change the payload size
using the `-s=` flag, up to a maximum of 125 mandated by the
----------------
By default it runs in server mode
-
-```bash
-$ libwebsockets-test-fraggle
-libwebsockets test fraggle
-(C) Copyright 2010-2011 Andy Green <andy@warmcat.com> licensed under LGPL2.1
- Compiled with SSL support, not using it
- Listening on port 7681
-server sees client connect
-accepted v06 connection
-Spamming 360 random fragments
-Spamming session over, len = 371913. sum = 0x2D3C0AE
-Spamming 895 random fragments
-Spamming session over, len = 875970. sum = 0x6A74DA1
-...
```
-
+ $ libwebsockets-test-fraggle
+ libwebsockets test fraggle
+ (C) Copyright 2010-2011 Andy Green <andy@warmcat.com> licensed under LGPL2.1
+ Compiled with SSL support, not using it
+ Listening on port 7681
+ server sees client connect
+ accepted v06 connection
+ Spamming 360 random fragments
+ Spamming session over, len = 371913. sum = 0x2D3C0AE
+ Spamming 895 random fragments
+ Spamming session over, len = 875970. sum = 0x6A74DA1
+ ...
+```
You need to run a second session in client mode, you have to
give the `-c` switch and the server address at least:
-
-```bash
-$ libwebsockets-test-fraggle -c localhost
-libwebsockets test fraggle
-(C) Copyright 2010-2011 Andy Green <andy@warmcat.com> licensed under LGPL2.1
- Client mode
-Connecting to localhost:7681
-denied deflate-stream extension
-handshake OK for protocol fraggle-protocol
-client connects to server
-EOM received 371913 correctly from 360 fragments
-EOM received 875970 correctly from 895 fragments
-EOM received 247140 correctly from 258 fragments
-EOM received 695451 correctly from 692 fragments
-...
```
-
+ $ libwebsockets-test-fraggle -c localhost
+ libwebsockets test fraggle
+ (C) Copyright 2010-2011 Andy Green <andy@warmcat.com> licensed under LGPL2.1
+ Client mode
+ Connecting to localhost:7681
+ denied deflate-stream extension
+ handshake OK for protocol fraggle-protocol
+ client connects to server
+ EOM received 371913 correctly from 360 fragments
+ EOM received 875970 correctly from 895 fragments
+ EOM received 247140 correctly from 258 fragments
+ EOM received 695451 correctly from 692 fragments
+ ...
+```
The fraggle test sends a random number up to 1024 fragmented websocket frames
each of a random size between 1 and 2001 bytes in a single message, then sends
a checksum and starts sending a new randomly sized and fragmented message.
authentication.
You use it like this
-
-```bash
-$ export http_proxy=myproxy.com:3128
-$ libwebsockets-test-client someserver.com
```
-
+ $ export http_proxy=myproxy.com:3128
+ $ libwebsockets-test-client someserver.com
+```
debug logging
-------------
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.11"/>
+<title>libwebsockets: Data Structures</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="libwebsockets.org-logo.png"/></td>
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname">libwebsockets
+ </div>
+ <div id="projectbrief">Lightweight C library for HTML5 websockets</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.11 -->
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main Page</span></a></li>
+ <li><a href="pages.html"><span>Related Pages</span></a></li>
+ <li><a href="modules.html"><span>Modules</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Data Structures</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li class="current"><a href="annotated.html"><span>Data Structures</span></a></li>
+ <li><a href="classes.html"><span>Data Structure Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Data Fields</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('annotated.html','');});
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="headertitle">
+<div class="title">Data Structures</div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock">Here are the data structures with brief descriptions:</div><div class="directory">
+<table class="directory">
+<tr id="row_0_" class="even"><td class="entry"><span style="width:16px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="structlws__cgi__args.html" target="_self">lws_cgi_args</a></td><td class="desc"></td></tr>
+<tr id="row_1_"><td class="entry"><span style="width:16px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="structlws__client__connect__info.html" target="_self">lws_client_connect_info</a></td><td class="desc"></td></tr>
+<tr id="row_2_" class="even"><td class="entry"><span style="width:16px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="classlws__conn.html" target="_self">lws_conn</a></td><td class="desc"></td></tr>
+<tr id="row_3_"><td class="entry"><span style="width:16px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="classlws__conn__listener.html" target="_self">lws_conn_listener</a></td><td class="desc"></td></tr>
+<tr id="row_4_" class="even"><td class="entry"><span style="width:16px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="structlws__context__creation__info.html" target="_self">lws_context_creation_info</a></td><td class="desc"></td></tr>
+<tr id="row_5_"><td class="entry"><span style="width:16px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="structlws__email.html" target="_self">lws_email</a></td><td class="desc"></td></tr>
+<tr id="row_6_" class="even"><td class="entry"><span style="width:16px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="structlws__ext__option__arg.html" target="_self">lws_ext_option_arg</a></td><td class="desc"></td></tr>
+<tr id="row_7_"><td class="entry"><span style="width:16px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="structlws__ext__options.html" target="_self">lws_ext_options</a></td><td class="desc"></td></tr>
+<tr id="row_8_" class="even"><td class="entry"><span style="width:16px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="structlws__extension.html" target="_self">lws_extension</a></td><td class="desc"></td></tr>
+<tr id="row_9_"><td class="entry"><span style="width:16px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="structlws__gs__event__args.html" target="_self">lws_gs_event_args</a></td><td class="desc"></td></tr>
+<tr id="row_10_" class="even"><td class="entry"><span style="width:16px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="structlws__http__mount.html" target="_self">lws_http_mount</a></td><td class="desc"></td></tr>
+<tr id="row_11_"><td class="entry"><span style="width:16px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="structlws__plat__file__ops.html" target="_self">lws_plat_file_ops</a></td><td class="desc"></td></tr>
+<tr id="row_12_" class="even"><td class="entry"><span style="width:16px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="structlws__plugin.html" target="_self">lws_plugin</a></td><td class="desc"></td></tr>
+<tr id="row_13_"><td class="entry"><span style="width:16px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="structlws__plugin__capability.html" target="_self">lws_plugin_capability</a></td><td class="desc"></td></tr>
+<tr id="row_14_" class="even"><td class="entry"><span style="width:16px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="structlws__polarssl__context.html" target="_self">lws_polarssl_context</a></td><td class="desc"></td></tr>
+<tr id="row_15_"><td class="entry"><span style="width:16px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="structlws__pollargs.html" target="_self">lws_pollargs</a></td><td class="desc"></td></tr>
+<tr id="row_16_" class="even"><td class="entry"><span style="width:16px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="structlws__pollfd.html" target="_self">lws_pollfd</a></td><td class="desc"></td></tr>
+<tr id="row_17_"><td class="entry"><span style="width:16px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="structlws__process__html__args.html" target="_self">lws_process_html_args</a></td><td class="desc"></td></tr>
+<tr id="row_18_" class="even"><td class="entry"><span style="width:16px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="structlws__process__html__state.html" target="_self">lws_process_html_state</a></td><td class="desc"></td></tr>
+<tr id="row_19_"><td class="entry"><span style="width:16px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="structlws__protocol__vhost__options.html" target="_self">lws_protocol_vhost_options</a></td><td class="desc"></td></tr>
+<tr id="row_20_" class="even"><td class="entry"><span style="width:16px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="structlws__protocols.html" target="_self">lws_protocols</a></td><td class="desc"></td></tr>
+<tr id="row_21_"><td class="entry"><span style="width:16px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="structlws__session__info.html" target="_self">lws_session_info</a></td><td class="desc"></td></tr>
+<tr id="row_22_" class="even"><td class="entry"><span style="width:16px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="structlws__token__limits.html" target="_self">lws_token_limits</a></td><td class="desc"></td></tr>
+<tr id="row_23_"><td class="entry"><span style="width:16px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="structlws__tokens.html" target="_self">lws_tokens</a></td><td class="desc"></td></tr>
+<tr id="row_24_" class="even"><td class="entry"><span style="width:16px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="structlwsgw__hash.html" target="_self">lwsgw_hash</a></td><td class="desc"></td></tr>
+<tr id="row_25_"><td class="entry"><span style="width:16px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="structlwsgw__hash__bin.html" target="_self">lwsgw_hash_bin</a></td><td class="desc"></td></tr>
+<tr id="row_26_" class="even"><td class="entry"><span style="width:16px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="structpollfd.html" target="_self">pollfd</a></td><td class="desc"></td></tr>
+</table>
+</div><!-- directory -->
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">Generated by
+ <a href="http://www.doxygen.org/index.html">
+ <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.11 </li>
+ </ul>
+</div>
+</body>
+</html>
--- /dev/null
+var annotated_dup =
+[
+ [ "lws_cgi_args", "structlws__cgi__args.html", "structlws__cgi__args" ],
+ [ "lws_client_connect_info", "structlws__client__connect__info.html", "structlws__client__connect__info" ],
+ [ "lws_conn", "classlws__conn.html", "classlws__conn" ],
+ [ "lws_conn_listener", "classlws__conn__listener.html", "classlws__conn__listener" ],
+ [ "lws_context_creation_info", "structlws__context__creation__info.html", "structlws__context__creation__info" ],
+ [ "lws_email", "structlws__email.html", "structlws__email" ],
+ [ "lws_ext_option_arg", "structlws__ext__option__arg.html", "structlws__ext__option__arg" ],
+ [ "lws_ext_options", "structlws__ext__options.html", "structlws__ext__options" ],
+ [ "lws_extension", "structlws__extension.html", "structlws__extension" ],
+ [ "lws_gs_event_args", "structlws__gs__event__args.html", "structlws__gs__event__args" ],
+ [ "lws_http_mount", "structlws__http__mount.html", "structlws__http__mount" ],
+ [ "lws_plat_file_ops", "structlws__plat__file__ops.html", "structlws__plat__file__ops" ],
+ [ "lws_plugin", "structlws__plugin.html", "structlws__plugin" ],
+ [ "lws_plugin_capability", "structlws__plugin__capability.html", "structlws__plugin__capability" ],
+ [ "lws_polarssl_context", "structlws__polarssl__context.html", "structlws__polarssl__context" ],
+ [ "lws_pollargs", "structlws__pollargs.html", "structlws__pollargs" ],
+ [ "lws_pollfd", "structlws__pollfd.html", "structlws__pollfd" ],
+ [ "lws_process_html_args", "structlws__process__html__args.html", "structlws__process__html__args" ],
+ [ "lws_process_html_state", "structlws__process__html__state.html", "structlws__process__html__state" ],
+ [ "lws_protocol_vhost_options", "structlws__protocol__vhost__options.html", "structlws__protocol__vhost__options" ],
+ [ "lws_protocols", "structlws__protocols.html", "structlws__protocols" ],
+ [ "lws_session_info", "structlws__session__info.html", "structlws__session__info" ],
+ [ "lws_token_limits", "structlws__token__limits.html", "structlws__token__limits" ],
+ [ "lws_tokens", "structlws__tokens.html", "structlws__tokens" ],
+ [ "lwsgw_hash", "structlwsgw__hash.html", "structlwsgw__hash" ],
+ [ "lwsgw_hash_bin", "structlwsgw__hash__bin.html", "structlwsgw__hash__bin" ],
+ [ "pollfd", "structpollfd.html", "structpollfd" ]
+];
\ No newline at end of file
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.11"/>
+<title>libwebsockets: Data Structure Index</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="libwebsockets.org-logo.png"/></td>
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname">libwebsockets
+ </div>
+ <div id="projectbrief">Lightweight C library for HTML5 websockets</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.11 -->
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main Page</span></a></li>
+ <li><a href="pages.html"><span>Related Pages</span></a></li>
+ <li><a href="modules.html"><span>Modules</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Data Structures</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Data Structures</span></a></li>
+ <li class="current"><a href="classes.html"><span>Data Structure Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Data Fields</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('classes.html','');});
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="headertitle">
+<div class="title">Data Structure Index</div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="qindex"><a class="qindex" href="#letter_L">L</a> | <a class="qindex" href="#letter_P">P</a></div>
+<table class="classindex">
+<tr><td rowspan="2" valign="bottom"><a name="letter_l"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">  l  </div></td></tr></table>
+</td><td valign="top"><a class="el" href="structlws__email.html">lws_email</a>   </td><td valign="top"><a class="el" href="structlws__plugin.html">lws_plugin</a>   </td><td valign="top"><a class="el" href="structlws__protocol__vhost__options.html">lws_protocol_vhost_options</a>   </td><td rowspan="2" valign="bottom"><a name="letter_p"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">  p  </div></td></tr></table>
+</td></tr>
+<tr><td valign="top"><a class="el" href="structlws__ext__option__arg.html">lws_ext_option_arg</a>   </td><td valign="top"><a class="el" href="structlws__plugin__capability.html">lws_plugin_capability</a>   </td><td valign="top"><a class="el" href="structlws__protocols.html">lws_protocols</a>   </td></tr>
+<tr><td valign="top"><a class="el" href="structlws__cgi__args.html">lws_cgi_args</a>   </td><td valign="top"><a class="el" href="structlws__ext__options.html">lws_ext_options</a>   </td><td valign="top"><a class="el" href="structlws__polarssl__context.html">lws_polarssl_context</a>   </td><td valign="top"><a class="el" href="structlws__session__info.html">lws_session_info</a>   </td><td valign="top"><a class="el" href="structpollfd.html">pollfd</a>   </td></tr>
+<tr><td valign="top"><a class="el" href="structlws__client__connect__info.html">lws_client_connect_info</a>   </td><td valign="top"><a class="el" href="structlws__extension.html">lws_extension</a>   </td><td valign="top"><a class="el" href="structlws__pollargs.html">lws_pollargs</a>   </td><td valign="top"><a class="el" href="structlws__token__limits.html">lws_token_limits</a>   </td><td></td></tr>
+<tr><td valign="top"><a class="el" href="classlws__conn.html">lws_conn</a>   </td><td valign="top"><a class="el" href="structlws__gs__event__args.html">lws_gs_event_args</a>   </td><td valign="top"><a class="el" href="structlws__pollfd.html">lws_pollfd</a>   </td><td valign="top"><a class="el" href="structlws__tokens.html">lws_tokens</a>   </td><td></td></tr>
+<tr><td valign="top"><a class="el" href="classlws__conn__listener.html">lws_conn_listener</a>   </td><td valign="top"><a class="el" href="structlws__http__mount.html">lws_http_mount</a>   </td><td valign="top"><a class="el" href="structlws__process__html__args.html">lws_process_html_args</a>   </td><td valign="top"><a class="el" href="structlwsgw__hash.html">lwsgw_hash</a>   </td><td></td></tr>
+<tr><td valign="top"><a class="el" href="structlws__context__creation__info.html">lws_context_creation_info</a>   </td><td valign="top"><a class="el" href="structlws__plat__file__ops.html">lws_plat_file_ops</a>   </td><td valign="top"><a class="el" href="structlws__process__html__state.html">lws_process_html_state</a>   </td><td valign="top"><a class="el" href="structlwsgw__hash__bin.html">lwsgw_hash_bin</a>   </td><td></td></tr>
+<tr><td></td><td></td><td></td><td></td><td></td></tr>
+</table>
+<div class="qindex"><a class="qindex" href="#letter_L">L</a> | <a class="qindex" href="#letter_P">P</a></div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">Generated by
+ <a href="http://www.doxygen.org/index.html">
+ <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.11 </li>
+ </ul>
+</div>
+</body>
+</html>
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.11"/>
+<title>libwebsockets: lws_conn Class Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="libwebsockets.org-logo.png"/></td>
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname">libwebsockets
+ </div>
+ <div id="projectbrief">Lightweight C library for HTML5 websockets</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.11 -->
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main Page</span></a></li>
+ <li><a href="pages.html"><span>Related Pages</span></a></li>
+ <li><a href="modules.html"><span>Modules</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Data Structures</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Data Structures</span></a></li>
+ <li><a href="classes.html"><span>Data Structure Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Data Fields</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('classlws__conn.html','');});
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#pub-methods">Public Member Functions</a> |
+<a href="#pub-attribs">Data Fields</a> </div>
+ <div class="headertitle">
+<div class="title">lws_conn Class Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="dynheader">
+Inheritance diagram for lws_conn:</div>
+<div class="dyncontent">
+ <div class="center">
+ <img src="classlws__conn.png" usemap="#lws_5Fconn_map" alt=""/>
+ <map id="lws_5Fconn_map" name="lws_conn_map">
+<area href="classlws__conn__listener.html" alt="lws_conn_listener" shape="rect" coords="0,56,113,80"/>
+</map>
+ </div></div>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr class="memitem:afe73e53da2070f659ad6e7fd14878c7e"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="afe73e53da2070f659ad6e7fd14878c7e"></a>
+void </td><td class="memItemRight" valign="bottom"><b>set_wsi</b> (struct lws *_wsi)</td></tr>
+<tr class="separator:afe73e53da2070f659ad6e7fd14878c7e"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:aef530971372f55e862f2e09bc98f1029"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="aef530971372f55e862f2e09bc98f1029"></a>
+int </td><td class="memItemRight" valign="bottom"><b>actual_onRX</b> (Socket *s)</td></tr>
+<tr class="separator:aef530971372f55e862f2e09bc98f1029"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:aba42bdd763a36c3a331b62410969b6ba"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="aba42bdd763a36c3a331b62410969b6ba"></a>
+void </td><td class="memItemRight" valign="bottom"><b>onRX</b> (Socket *s)</td></tr>
+<tr class="separator:aba42bdd763a36c3a331b62410969b6ba"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a4fb477fad697ce1faf8ec7a884ea6c6b"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a4fb477fad697ce1faf8ec7a884ea6c6b"></a>
+void </td><td class="memItemRight" valign="bottom"><b>onError</b> (Socket *s, socket_error_t err)</td></tr>
+<tr class="separator:a4fb477fad697ce1faf8ec7a884ea6c6b"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a49f87612c6a3098cd1587f8382b8c85b"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a49f87612c6a3098cd1587f8382b8c85b"></a>
+void </td><td class="memItemRight" valign="bottom"><b>onDisconnect</b> (TCPStream *s)</td></tr>
+<tr class="separator:a49f87612c6a3098cd1587f8382b8c85b"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:aad7d2406618e560114650a91c729a596"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="aad7d2406618e560114650a91c729a596"></a>
+void </td><td class="memItemRight" valign="bottom"><b>onSent</b> (Socket *s, uint16_t len)</td></tr>
+<tr class="separator:aad7d2406618e560114650a91c729a596"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:accc57581269c554291dac840ed135231"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="accc57581269c554291dac840ed135231"></a>
+void </td><td class="memItemRight" valign="bottom"><b>serialized_writeable</b> (struct lws *wsi)</td></tr>
+<tr class="separator:accc57581269c554291dac840ed135231"><td class="memSeparator" colspan="2"> </td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:a5cad031b6b779da42b37f4007cae541b"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a5cad031b6b779da42b37f4007cae541b"></a>
+TCPStream * </td><td class="memItemRight" valign="bottom"><b>ts</b></td></tr>
+<tr class="separator:a5cad031b6b779da42b37f4007cae541b"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a7e504bd449ffb51c7ab1d2126613ebc3"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a7e504bd449ffb51c7ab1d2126613ebc3"></a>
+struct lws * </td><td class="memItemRight" valign="bottom"><b>wsi</b></td></tr>
+<tr class="separator:a7e504bd449ffb51c7ab1d2126613ebc3"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a8e1fdd467b7f66fc438dc70ae979b938"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a8e1fdd467b7f66fc438dc70ae979b938"></a>
+char </td><td class="memItemRight" valign="bottom"><b>writeable</b></td></tr>
+<tr class="separator:a8e1fdd467b7f66fc438dc70ae979b938"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a5226010afdf5421f279454e5cbb282a4"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a5226010afdf5421f279454e5cbb282a4"></a>
+char </td><td class="memItemRight" valign="bottom"><b>awaiting_on_writeable</b></td></tr>
+<tr class="separator:a5226010afdf5421f279454e5cbb282a4"><td class="memSeparator" colspan="2"> </td></tr>
+</table>
+<hr/>The documentation for this class was generated from the following file:<ul>
+<li>lib/<a class="el" href="libwebsockets_8h_source.html">libwebsockets.h</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="classlws__conn.html">lws_conn</a></li>
+ <li class="footer">Generated by
+ <a href="http://www.doxygen.org/index.html">
+ <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.11 </li>
+ </ul>
+</div>
+</body>
+</html>
--- /dev/null
+var classlws__conn =
+[
+ [ "lws_conn", "classlws__conn.html#af0e213af91d53d1e1aef70ed7816191f", null ],
+ [ "actual_onRX", "classlws__conn.html#aef530971372f55e862f2e09bc98f1029", null ],
+ [ "onDisconnect", "classlws__conn.html#a49f87612c6a3098cd1587f8382b8c85b", null ],
+ [ "onError", "classlws__conn.html#a4fb477fad697ce1faf8ec7a884ea6c6b", null ],
+ [ "onRX", "classlws__conn.html#aba42bdd763a36c3a331b62410969b6ba", null ],
+ [ "onSent", "classlws__conn.html#aad7d2406618e560114650a91c729a596", null ],
+ [ "serialized_writeable", "classlws__conn.html#accc57581269c554291dac840ed135231", null ],
+ [ "set_wsi", "classlws__conn.html#afe73e53da2070f659ad6e7fd14878c7e", null ],
+ [ "awaiting_on_writeable", "classlws__conn.html#a5226010afdf5421f279454e5cbb282a4", null ],
+ [ "ts", "classlws__conn.html#a5cad031b6b779da42b37f4007cae541b", null ],
+ [ "writeable", "classlws__conn.html#a8e1fdd467b7f66fc438dc70ae979b938", null ],
+ [ "wsi", "classlws__conn.html#a7e504bd449ffb51c7ab1d2126613ebc3", null ]
+];
\ No newline at end of file
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.11"/>
+<title>libwebsockets: lws_conn_listener Class Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="libwebsockets.org-logo.png"/></td>
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname">libwebsockets
+ </div>
+ <div id="projectbrief">Lightweight C library for HTML5 websockets</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.11 -->
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main Page</span></a></li>
+ <li><a href="pages.html"><span>Related Pages</span></a></li>
+ <li><a href="modules.html"><span>Modules</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Data Structures</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Data Structures</span></a></li>
+ <li><a href="classes.html"><span>Data Structure Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Data Fields</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('classlws__conn__listener.html','');});
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#pub-methods">Public Member Functions</a> |
+<a href="#pub-attribs">Data Fields</a> |
+<a href="#pro-methods">Protected Member Functions</a> </div>
+ <div class="headertitle">
+<div class="title">lws_conn_listener Class Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="dynheader">
+Inheritance diagram for lws_conn_listener:</div>
+<div class="dyncontent">
+ <div class="center">
+ <img src="classlws__conn__listener.png" usemap="#lws_5Fconn_5Flistener_map" alt=""/>
+ <map id="lws_5Fconn_5Flistener_map" name="lws_conn_listener_map">
+<area href="classlws__conn.html" alt="lws_conn" shape="rect" coords="0,0,113,24"/>
+</map>
+ </div></div>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr class="memitem:a3c19c314f2ea2b758407b4041e4c4010"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="classlws__conn__listener.html#a3c19c314f2ea2b758407b4041e4c4010">start</a> (const uint16_t port)</td></tr>
+<tr class="separator:a3c19c314f2ea2b758407b4041e4c4010"><td class="memSeparator" colspan="2"> </td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:aa7076f8965bb9df268798fd9a0283374"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="aa7076f8965bb9df268798fd9a0283374"></a>
+TCPListener </td><td class="memItemRight" valign="bottom"><b>srv</b></td></tr>
+<tr class="separator:aa7076f8965bb9df268798fd9a0283374"><td class="memSeparator" colspan="2"> </td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pro-methods"></a>
+Protected Member Functions</h2></td></tr>
+<tr class="memitem:ab3bc839797ba14554ac70ad09fd155c7"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="classlws__conn__listener.html#ab3bc839797ba14554ac70ad09fd155c7">onRX</a> (Socket *s)</td></tr>
+<tr class="separator:ab3bc839797ba14554ac70ad09fd155c7"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a271ac4f8ad5770b3bc96cce5b265b72c"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="classlws__conn__listener.html#a271ac4f8ad5770b3bc96cce5b265b72c">onError</a> (Socket *s, socket_error_t err)</td></tr>
+<tr class="separator:a271ac4f8ad5770b3bc96cce5b265b72c"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ab432a456c3a961ec562e06141897806b"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="classlws__conn__listener.html#ab432a456c3a961ec562e06141897806b">onIncoming</a> (TCPListener *s, void *impl)</td></tr>
+<tr class="separator:ab432a456c3a961ec562e06141897806b"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:aab3c7bf550a8f15d20f1e093125c2e60"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="classlws__conn__listener.html#aab3c7bf550a8f15d20f1e093125c2e60">onDisconnect</a> (TCPStream *s)</td></tr>
+<tr class="separator:aab3c7bf550a8f15d20f1e093125c2e60"><td class="memSeparator" colspan="2"> </td></tr>
+</table>
+<h2 class="groupheader">Member Function Documentation</h2>
+<a class="anchor" id="aab3c7bf550a8f15d20f1e093125c2e60"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">void lws_conn_listener::onDisconnect </td>
+ <td>(</td>
+ <td class="paramtype">TCPStream * </td>
+ <td class="paramname"><em>s</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">protected</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+<p>disconnection </p>
+
+</div>
+</div>
+<a class="anchor" id="a271ac4f8ad5770b3bc96cce5b265b72c"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">void lws_conn_listener::onError </td>
+ <td>(</td>
+ <td class="paramtype">Socket * </td>
+ <td class="paramname"><em>s</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">socket_error_t </td>
+ <td class="paramname"><em>err</em> </td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">protected</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+<p>if error occurs </p>
+
+</div>
+</div>
+<a class="anchor" id="ab432a456c3a961ec562e06141897806b"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">void lws_conn_listener::onIncoming </td>
+ <td>(</td>
+ <td class="paramtype">TCPListener * </td>
+ <td class="paramname"><em>s</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">void * </td>
+ <td class="paramname"><em>impl</em> </td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">protected</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+<p>new connection </p>
+
+</div>
+</div>
+<a class="anchor" id="ab3bc839797ba14554ac70ad09fd155c7"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">void lws_conn_listener::onRX </td>
+ <td>(</td>
+ <td class="paramtype">Socket * </td>
+ <td class="paramname"><em>s</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">protected</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+<p>incoming data ready </p>
+
+</div>
+</div>
+<a class="anchor" id="a3c19c314f2ea2b758407b4041e4c4010"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void lws_conn_listener::start </td>
+ <td>(</td>
+ <td class="paramtype">const uint16_t </td>
+ <td class="paramname"><em>port</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>start listening </p>
+
+</div>
+</div>
+<hr/>The documentation for this class was generated from the following file:<ul>
+<li>lib/<a class="el" href="libwebsockets_8h_source.html">libwebsockets.h</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="classlws__conn__listener.html">lws_conn_listener</a></li>
+ <li class="footer">Generated by
+ <a href="http://www.doxygen.org/index.html">
+ <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.11 </li>
+ </ul>
+</div>
+</body>
+</html>
--- /dev/null
+var classlws__conn__listener =
+[
+ [ "lws_conn_listener", "classlws__conn__listener.html#ac82c8696a36a2f386b4094490d300dee", null ],
+ [ "onDisconnect", "classlws__conn__listener.html#aab3c7bf550a8f15d20f1e093125c2e60", null ],
+ [ "onError", "classlws__conn__listener.html#a271ac4f8ad5770b3bc96cce5b265b72c", null ],
+ [ "onIncoming", "classlws__conn__listener.html#ab432a456c3a961ec562e06141897806b", null ],
+ [ "onRX", "classlws__conn__listener.html#ab3bc839797ba14554ac70ad09fd155c7", null ],
+ [ "start", "classlws__conn__listener.html#a3c19c314f2ea2b758407b4041e4c4010", null ],
+ [ "srv", "classlws__conn__listener.html#aa7076f8965bb9df268798fd9a0283374", null ]
+];
\ No newline at end of file
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.11"/>
+<title>libwebsockets: Deprecated List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="libwebsockets.org-logo.png"/></td>
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname">libwebsockets
+ </div>
+ <div id="projectbrief">Lightweight C library for HTML5 websockets</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.11 -->
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main Page</span></a></li>
+ <li class="current"><a href="pages.html"><span>Related Pages</span></a></li>
+ <li><a href="modules.html"><span>Modules</span></a></li>
+ <li><a href="annotated.html"><span>Data Structures</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('deprecated.html','');});
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="headertitle">
+<div class="title">Deprecated List </div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><dl class="reflist">
+<dt><a class="anchor" id="_deprecated000002"></a>Global <a class="el" href="group__client.html#ga4af0a20108a95e8b6d94dd4d80055ff3">lws_client_connect</a> (struct lws_context *clients, const char *address, int port, int ssl_connection, const char *path, const char *host, const char *origin, const char *protocol, int ietf_version_or_minus_one) LWS_WARN_DEPRECATED</dt>
+<dd>DEPRECATED use lws_client_connect_via_info </dd>
+<dt><a class="anchor" id="_deprecated000003"></a>Global <a class="el" href="group__client.html#gac6a8558b4410961a880241c2ac1271e2">lws_client_connect_extended</a> (struct lws_context *clients, const char *address, int port, int ssl_connection, const char *path, const char *host, const char *origin, const char *protocol, int ietf_version_or_minus_one, void *userdata) LWS_WARN_DEPRECATED</dt>
+<dd>DEPRECATED use lws_client_connect_via_info </dd>
+<dt><a class="anchor" id="_deprecated000001"></a>Global <a class="el" href="group__context-and-vhost.html#ga8db03e19a372e34ac25cf21af894a02c">lws_vhost_get</a> (struct lws *wsi) LWS_WARN_DEPRECATED</dt>
+<dd>deprecated: use <a class="el" href="group__context-and-vhost.html#ga06e77ce2916f8bc9826ef8d9d68e3932">lws_get_vhost()</a> </dd>
+</dl>
+</div></div><!-- contents -->
+</div><!-- doc-content -->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">Generated by
+ <a href="http://www.doxygen.org/index.html">
+ <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.11 </li>
+ </ul>
+</div>
+</body>
+</html>
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.11"/>
+<title>libwebsockets: lib Directory Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="libwebsockets.org-logo.png"/></td>
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname">libwebsockets
+ </div>
+ <div id="projectbrief">Lightweight C library for HTML5 websockets</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.11 -->
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main Page</span></a></li>
+ <li><a href="pages.html"><span>Related Pages</span></a></li>
+ <li><a href="modules.html"><span>Modules</span></a></li>
+ <li><a href="annotated.html"><span>Data Structures</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li class="current"><a href="files.html"><span>File List</span></a></li>
+ <li><a href="globals.html"><span>Globals</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('dir_97aefd0d527b934f1d99a682da8fe6a9.html','');});
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="headertitle">
+<div class="title">lib Directory Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="files"></a>
+Files</h2></td></tr>
+<tr class="memitem:libwebsockets_8h"><td class="memItemLeft" align="right" valign="top">file  </td><td class="memItemRight" valign="bottom"><a class="el" href="libwebsockets_8h.html">libwebsockets.h</a> <a href="libwebsockets_8h_source.html">[code]</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
+</table>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="dir_97aefd0d527b934f1d99a682da8fe6a9.html">lib</a></li>
+ <li class="footer">Generated by
+ <a href="http://www.doxygen.org/index.html">
+ <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.11 </li>
+ </ul>
+</div>
+</body>
+</html>
--- /dev/null
+var dir_97aefd0d527b934f1d99a682da8fe6a9 =
+[
+ [ "libwebsockets.h", "libwebsockets_8h.html", "libwebsockets_8h" ]
+];
\ No newline at end of file
--- /dev/null
+/* The standard CSS for doxygen 1.8.11 */
+
+body, table, div, p, dl {
+ font: 400 14px/22px Roboto,sans-serif;
+}
+
+/* @group Heading Levels */
+
+h1.groupheader {
+ font-size: 150%;
+}
+
+.title {
+ font: 400 14px/28px Roboto,sans-serif;
+ font-size: 150%;
+ font-weight: bold;
+ margin: 10px 2px;
+}
+
+h2.groupheader {
+ border-bottom: 1px solid #879ECB;
+ color: #354C7B;
+ font-size: 150%;
+ font-weight: normal;
+ margin-top: 1.75em;
+ padding-top: 8px;
+ padding-bottom: 4px;
+ width: 100%;
+}
+
+h3.groupheader {
+ font-size: 100%;
+}
+
+h1, h2, h3, h4, h5, h6 {
+ -webkit-transition: text-shadow 0.5s linear;
+ -moz-transition: text-shadow 0.5s linear;
+ -ms-transition: text-shadow 0.5s linear;
+ -o-transition: text-shadow 0.5s linear;
+ transition: text-shadow 0.5s linear;
+ margin-right: 15px;
+}
+
+h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow {
+ text-shadow: 0 0 15px cyan;
+}
+
+dt {
+ font-weight: bold;
+}
+
+div.multicol {
+ -moz-column-gap: 1em;
+ -webkit-column-gap: 1em;
+ -moz-column-count: 3;
+ -webkit-column-count: 3;
+}
+
+p.startli, p.startdd {
+ margin-top: 2px;
+}
+
+p.starttd {
+ margin-top: 0px;
+}
+
+p.endli {
+ margin-bottom: 0px;
+}
+
+p.enddd {
+ margin-bottom: 4px;
+}
+
+p.endtd {
+ margin-bottom: 2px;
+}
+
+/* @end */
+
+caption {
+ font-weight: bold;
+}
+
+span.legend {
+ font-size: 70%;
+ text-align: center;
+}
+
+h3.version {
+ font-size: 90%;
+ text-align: center;
+}
+
+div.qindex, div.navtab{
+ background-color: #EBEFF6;
+ border: 1px solid #A3B4D7;
+ text-align: center;
+}
+
+div.qindex, div.navpath {
+ width: 100%;
+ line-height: 140%;
+}
+
+div.navtab {
+ margin-right: 15px;
+}
+
+/* @group Link Styling */
+
+a {
+ color: #3D578C;
+ font-weight: normal;
+ text-decoration: none;
+}
+
+.contents a:visited {
+ color: #4665A2;
+}
+
+a:hover {
+ text-decoration: underline;
+}
+
+a.qindex {
+ font-weight: bold;
+}
+
+a.qindexHL {
+ font-weight: bold;
+ background-color: #9CAFD4;
+ color: #ffffff;
+ border: 1px double #869DCA;
+}
+
+.contents a.qindexHL:visited {
+ color: #ffffff;
+}
+
+a.el {
+ font-weight: bold;
+}
+
+a.elRef {
+}
+
+a.code, a.code:visited, a.line, a.line:visited {
+ color: #4665A2;
+}
+
+a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited {
+ color: #4665A2;
+}
+
+/* @end */
+
+dl.el {
+ margin-left: -1cm;
+}
+
+pre.fragment {
+ border: 1px solid #C4CFE5;
+ background-color: #FBFCFD;
+ padding: 4px 6px;
+ margin: 4px 8px 4px 2px;
+ overflow: auto;
+ word-wrap: break-word;
+ font-size: 9pt;
+ line-height: 125%;
+ font-family: monospace, fixed;
+ font-size: 105%;
+}
+
+div.fragment {
+ padding: 4px 6px;
+ margin: 4px 8px 4px 2px;
+ background-color: #FBFCFD;
+ border: 1px solid #C4CFE5;
+}
+
+div.line {
+ font-family: monospace, fixed;
+ font-size: 13px;
+ min-height: 13px;
+ line-height: 1.0;
+ text-wrap: unrestricted;
+ white-space: -moz-pre-wrap; /* Moz */
+ white-space: -pre-wrap; /* Opera 4-6 */
+ white-space: -o-pre-wrap; /* Opera 7 */
+ white-space: pre-wrap; /* CSS3 */
+ word-wrap: break-word; /* IE 5.5+ */
+ text-indent: -53px;
+ padding-left: 53px;
+ padding-bottom: 0px;
+ margin: 0px;
+ -webkit-transition-property: background-color, box-shadow;
+ -webkit-transition-duration: 0.5s;
+ -moz-transition-property: background-color, box-shadow;
+ -moz-transition-duration: 0.5s;
+ -ms-transition-property: background-color, box-shadow;
+ -ms-transition-duration: 0.5s;
+ -o-transition-property: background-color, box-shadow;
+ -o-transition-duration: 0.5s;
+ transition-property: background-color, box-shadow;
+ transition-duration: 0.5s;
+}
+
+div.line:after {
+ content:"\000A";
+ white-space: pre;
+}
+
+div.line.glow {
+ background-color: cyan;
+ box-shadow: 0 0 10px cyan;
+}
+
+
+span.lineno {
+ padding-right: 4px;
+ text-align: right;
+ border-right: 2px solid #0F0;
+ background-color: #E8E8E8;
+ white-space: pre;
+}
+span.lineno a {
+ background-color: #D8D8D8;
+}
+
+span.lineno a:hover {
+ background-color: #C8C8C8;
+}
+
+div.ah, span.ah {
+ background-color: black;
+ font-weight: bold;
+ color: #ffffff;
+ margin-bottom: 3px;
+ margin-top: 3px;
+ padding: 0.2em;
+ border: solid thin #333;
+ border-radius: 0.5em;
+ -webkit-border-radius: .5em;
+ -moz-border-radius: .5em;
+ box-shadow: 2px 2px 3px #999;
+ -webkit-box-shadow: 2px 2px 3px #999;
+ -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px;
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444));
+ background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000 110%);
+}
+
+div.classindex ul {
+ list-style: none;
+ padding-left: 0;
+}
+
+div.classindex span.ai {
+ display: inline-block;
+}
+
+div.groupHeader {
+ margin-left: 16px;
+ margin-top: 12px;
+ font-weight: bold;
+}
+
+div.groupText {
+ margin-left: 16px;
+ font-style: italic;
+}
+
+body {
+ background-color: white;
+ color: black;
+ margin: 0;
+}
+
+div.contents {
+ margin-top: 10px;
+ margin-left: 12px;
+ margin-right: 8px;
+}
+
+td.indexkey {
+ background-color: #EBEFF6;
+ font-weight: bold;
+ border: 1px solid #C4CFE5;
+ margin: 2px 0px 2px 0;
+ padding: 2px 10px;
+ white-space: nowrap;
+ vertical-align: top;
+}
+
+td.indexvalue {
+ background-color: #EBEFF6;
+ border: 1px solid #C4CFE5;
+ padding: 2px 10px;
+ margin: 2px 0px;
+}
+
+tr.memlist {
+ background-color: #EEF1F7;
+}
+
+p.formulaDsp {
+ text-align: center;
+}
+
+img.formulaDsp {
+
+}
+
+img.formulaInl {
+ vertical-align: middle;
+}
+
+div.center {
+ text-align: center;
+ margin-top: 0px;
+ margin-bottom: 0px;
+ padding: 0px;
+}
+
+div.center img {
+ border: 0px;
+}
+
+address.footer {
+ text-align: right;
+ padding-right: 12px;
+}
+
+img.footer {
+ border: 0px;
+ vertical-align: middle;
+}
+
+/* @group Code Colorization */
+
+span.keyword {
+ color: #008000
+}
+
+span.keywordtype {
+ color: #604020
+}
+
+span.keywordflow {
+ color: #e08000
+}
+
+span.comment {
+ color: #800000
+}
+
+span.preprocessor {
+ color: #806020
+}
+
+span.stringliteral {
+ color: #002080
+}
+
+span.charliteral {
+ color: #008080
+}
+
+span.vhdldigit {
+ color: #ff00ff
+}
+
+span.vhdlchar {
+ color: #000000
+}
+
+span.vhdlkeyword {
+ color: #700070
+}
+
+span.vhdllogic {
+ color: #ff0000
+}
+
+blockquote {
+ background-color: #F7F8FB;
+ border-left: 2px solid #9CAFD4;
+ margin: 0 24px 0 4px;
+ padding: 0 12px 0 16px;
+}
+
+/* @end */
+
+/*
+.search {
+ color: #003399;
+ font-weight: bold;
+}
+
+form.search {
+ margin-bottom: 0px;
+ margin-top: 0px;
+}
+
+input.search {
+ font-size: 75%;
+ color: #000080;
+ font-weight: normal;
+ background-color: #e8eef2;
+}
+*/
+
+td.tiny {
+ font-size: 75%;
+}
+
+.dirtab {
+ padding: 4px;
+ border-collapse: collapse;
+ border: 1px solid #A3B4D7;
+}
+
+th.dirtab {
+ background: #EBEFF6;
+ font-weight: bold;
+}
+
+hr {
+ height: 0px;
+ border: none;
+ border-top: 1px solid #4A6AAA;
+}
+
+hr.footer {
+ height: 1px;
+}
+
+/* @group Member Descriptions */
+
+table.memberdecls {
+ border-spacing: 0px;
+ padding: 0px;
+}
+
+.memberdecls td, .fieldtable tr {
+ -webkit-transition-property: background-color, box-shadow;
+ -webkit-transition-duration: 0.5s;
+ -moz-transition-property: background-color, box-shadow;
+ -moz-transition-duration: 0.5s;
+ -ms-transition-property: background-color, box-shadow;
+ -ms-transition-duration: 0.5s;
+ -o-transition-property: background-color, box-shadow;
+ -o-transition-duration: 0.5s;
+ transition-property: background-color, box-shadow;
+ transition-duration: 0.5s;
+}
+
+.memberdecls td.glow, .fieldtable tr.glow {
+ background-color: cyan;
+ box-shadow: 0 0 15px cyan;
+}
+
+.mdescLeft, .mdescRight,
+.memItemLeft, .memItemRight,
+.memTemplItemLeft, .memTemplItemRight, .memTemplParams {
+ background-color: #F9FAFC;
+ border: none;
+ margin: 4px;
+ padding: 1px 0 0 8px;
+}
+
+.mdescLeft, .mdescRight {
+ padding: 0px 8px 4px 8px;
+ color: #555;
+}
+
+.memSeparator {
+ border-bottom: 1px solid #DEE4F0;
+ line-height: 1px;
+ margin: 0px;
+ padding: 0px;
+}
+
+.memItemLeft, .memTemplItemLeft {
+ white-space: nowrap;
+}
+
+.memItemRight {
+ width: 100%;
+}
+
+.memTemplParams {
+ color: #4665A2;
+ white-space: nowrap;
+ font-size: 80%;
+}
+
+/* @end */
+
+/* @group Member Details */
+
+/* Styles for detailed member documentation */
+
+.memtemplate {
+ font-size: 80%;
+ color: #4665A2;
+ font-weight: normal;
+ margin-left: 9px;
+}
+
+.memnav {
+ background-color: #EBEFF6;
+ border: 1px solid #A3B4D7;
+ text-align: center;
+ margin: 2px;
+ margin-right: 15px;
+ padding: 2px;
+}
+
+.mempage {
+ width: 100%;
+}
+
+.memitem {
+ padding: 0;
+ margin-bottom: 10px;
+ margin-right: 5px;
+ -webkit-transition: box-shadow 0.5s linear;
+ -moz-transition: box-shadow 0.5s linear;
+ -ms-transition: box-shadow 0.5s linear;
+ -o-transition: box-shadow 0.5s linear;
+ transition: box-shadow 0.5s linear;
+ display: table !important;
+ width: 100%;
+}
+
+.memitem.glow {
+ box-shadow: 0 0 15px cyan;
+}
+
+.memname {
+ font-weight: bold;
+ margin-left: 6px;
+}
+
+.memname td {
+ vertical-align: bottom;
+}
+
+.memproto, dl.reflist dt {
+ border-top: 1px solid #A8B8D9;
+ border-left: 1px solid #A8B8D9;
+ border-right: 1px solid #A8B8D9;
+ padding: 6px 0px 6px 0px;
+ color: #253555;
+ font-weight: bold;
+ text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9);
+ background-image:url('nav_f.png');
+ background-repeat:repeat-x;
+ background-color: #E2E8F2;
+ /* opera specific markup */
+ box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
+ border-top-right-radius: 4px;
+ border-top-left-radius: 4px;
+ /* firefox specific markup */
+ -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px;
+ -moz-border-radius-topright: 4px;
+ -moz-border-radius-topleft: 4px;
+ /* webkit specific markup */
+ -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
+ -webkit-border-top-right-radius: 4px;
+ -webkit-border-top-left-radius: 4px;
+
+}
+
+.memdoc, dl.reflist dd {
+ border-bottom: 1px solid #A8B8D9;
+ border-left: 1px solid #A8B8D9;
+ border-right: 1px solid #A8B8D9;
+ padding: 6px 10px 2px 10px;
+ background-color: #FBFCFD;
+ border-top-width: 0;
+ background-image:url('nav_g.png');
+ background-repeat:repeat-x;
+ background-color: #FFFFFF;
+ /* opera specific markup */
+ border-bottom-left-radius: 4px;
+ border-bottom-right-radius: 4px;
+ box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
+ /* firefox specific markup */
+ -moz-border-radius-bottomleft: 4px;
+ -moz-border-radius-bottomright: 4px;
+ -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px;
+ /* webkit specific markup */
+ -webkit-border-bottom-left-radius: 4px;
+ -webkit-border-bottom-right-radius: 4px;
+ -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
+}
+
+dl.reflist dt {
+ padding: 5px;
+}
+
+dl.reflist dd {
+ margin: 0px 0px 10px 0px;
+ padding: 5px;
+}
+
+.paramkey {
+ text-align: right;
+}
+
+.paramtype {
+ white-space: nowrap;
+}
+
+.paramname {
+ color: #602020;
+ white-space: nowrap;
+}
+.paramname em {
+ font-style: normal;
+}
+.paramname code {
+ line-height: 14px;
+}
+
+.params, .retval, .exception, .tparams {
+ margin-left: 0px;
+ padding-left: 0px;
+}
+
+.params .paramname, .retval .paramname {
+ font-weight: bold;
+ vertical-align: top;
+}
+
+.params .paramtype {
+ font-style: italic;
+ vertical-align: top;
+}
+
+.params .paramdir {
+ font-family: "courier new",courier,monospace;
+ vertical-align: top;
+}
+
+table.mlabels {
+ border-spacing: 0px;
+}
+
+td.mlabels-left {
+ width: 100%;
+ padding: 0px;
+}
+
+td.mlabels-right {
+ vertical-align: bottom;
+ padding: 0px;
+ white-space: nowrap;
+}
+
+span.mlabels {
+ margin-left: 8px;
+}
+
+span.mlabel {
+ background-color: #728DC1;
+ border-top:1px solid #5373B4;
+ border-left:1px solid #5373B4;
+ border-right:1px solid #C4CFE5;
+ border-bottom:1px solid #C4CFE5;
+ text-shadow: none;
+ color: white;
+ margin-right: 4px;
+ padding: 2px 3px;
+ border-radius: 3px;
+ font-size: 7pt;
+ white-space: nowrap;
+ vertical-align: middle;
+}
+
+
+
+/* @end */
+
+/* these are for tree view inside a (index) page */
+
+div.directory {
+ margin: 10px 0px;
+ border-top: 1px solid #9CAFD4;
+ border-bottom: 1px solid #9CAFD4;
+ width: 100%;
+}
+
+.directory table {
+ border-collapse:collapse;
+}
+
+.directory td {
+ margin: 0px;
+ padding: 0px;
+ vertical-align: top;
+}
+
+.directory td.entry {
+ white-space: nowrap;
+ padding-right: 6px;
+ padding-top: 3px;
+}
+
+.directory td.entry a {
+ outline:none;
+}
+
+.directory td.entry a img {
+ border: none;
+}
+
+.directory td.desc {
+ width: 100%;
+ padding-left: 6px;
+ padding-right: 6px;
+ padding-top: 3px;
+ border-left: 1px solid rgba(0,0,0,0.05);
+}
+
+.directory tr.even {
+ padding-left: 6px;
+ background-color: #F7F8FB;
+}
+
+.directory img {
+ vertical-align: -30%;
+}
+
+.directory .levels {
+ white-space: nowrap;
+ width: 100%;
+ text-align: right;
+ font-size: 9pt;
+}
+
+.directory .levels span {
+ cursor: pointer;
+ padding-left: 2px;
+ padding-right: 2px;
+ color: #3D578C;
+}
+
+.arrow {
+ color: #9CAFD4;
+ -webkit-user-select: none;
+ -khtml-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+ cursor: pointer;
+ font-size: 80%;
+ display: inline-block;
+ width: 16px;
+ height: 22px;
+}
+
+.icon {
+ font-family: Arial, Helvetica;
+ font-weight: bold;
+ font-size: 12px;
+ height: 14px;
+ width: 16px;
+ display: inline-block;
+ background-color: #728DC1;
+ color: white;
+ text-align: center;
+ border-radius: 4px;
+ margin-left: 2px;
+ margin-right: 2px;
+}
+
+.icona {
+ width: 24px;
+ height: 22px;
+ display: inline-block;
+}
+
+.iconfopen {
+ width: 24px;
+ height: 18px;
+ margin-bottom: 4px;
+ background-image:url('folderopen.png');
+ background-position: 0px -4px;
+ background-repeat: repeat-y;
+ vertical-align:top;
+ display: inline-block;
+}
+
+.iconfclosed {
+ width: 24px;
+ height: 18px;
+ margin-bottom: 4px;
+ background-image:url('folderclosed.png');
+ background-position: 0px -4px;
+ background-repeat: repeat-y;
+ vertical-align:top;
+ display: inline-block;
+}
+
+.icondoc {
+ width: 24px;
+ height: 18px;
+ margin-bottom: 4px;
+ background-image:url('doc.png');
+ background-position: 0px -4px;
+ background-repeat: repeat-y;
+ vertical-align:top;
+ display: inline-block;
+}
+
+table.directory {
+ font: 400 14px Roboto,sans-serif;
+}
+
+/* @end */
+
+div.dynheader {
+ margin-top: 8px;
+ -webkit-touch-callout: none;
+ -webkit-user-select: none;
+ -khtml-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+}
+
+address {
+ font-style: normal;
+ color: #2A3D61;
+}
+
+table.doxtable caption {
+ caption-side: top;
+}
+
+table.doxtable {
+ border-collapse:collapse;
+ margin-top: 4px;
+ margin-bottom: 4px;
+}
+
+table.doxtable td, table.doxtable th {
+ border: 1px solid #2D4068;
+ padding: 3px 7px 2px;
+}
+
+table.doxtable th {
+ background-color: #374F7F;
+ color: #FFFFFF;
+ font-size: 110%;
+ padding-bottom: 4px;
+ padding-top: 5px;
+}
+
+table.fieldtable {
+ /*width: 100%;*/
+ margin-bottom: 10px;
+ border: 1px solid #A8B8D9;
+ border-spacing: 0px;
+ -moz-border-radius: 4px;
+ -webkit-border-radius: 4px;
+ border-radius: 4px;
+ -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px;
+ -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15);
+ box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15);
+}
+
+.fieldtable td, .fieldtable th {
+ padding: 3px 7px 2px;
+}
+
+.fieldtable td.fieldtype, .fieldtable td.fieldname {
+ white-space: nowrap;
+ border-right: 1px solid #A8B8D9;
+ border-bottom: 1px solid #A8B8D9;
+ vertical-align: top;
+}
+
+.fieldtable td.fieldname {
+ padding-top: 3px;
+}
+
+.fieldtable td.fielddoc {
+ border-bottom: 1px solid #A8B8D9;
+ /*width: 100%;*/
+}
+
+.fieldtable td.fielddoc p:first-child {
+ margin-top: 0px;
+}
+
+.fieldtable td.fielddoc p:last-child {
+ margin-bottom: 2px;
+}
+
+.fieldtable tr:last-child td {
+ border-bottom: none;
+}
+
+.fieldtable th {
+ background-image:url('nav_f.png');
+ background-repeat:repeat-x;
+ background-color: #E2E8F2;
+ font-size: 90%;
+ color: #253555;
+ padding-bottom: 4px;
+ padding-top: 5px;
+ text-align:left;
+ -moz-border-radius-topleft: 4px;
+ -moz-border-radius-topright: 4px;
+ -webkit-border-top-left-radius: 4px;
+ -webkit-border-top-right-radius: 4px;
+ border-top-left-radius: 4px;
+ border-top-right-radius: 4px;
+ border-bottom: 1px solid #A8B8D9;
+}
+
+
+.tabsearch {
+ top: 0px;
+ left: 10px;
+ height: 36px;
+ background-image: url('tab_b.png');
+ z-index: 101;
+ overflow: hidden;
+ font-size: 13px;
+}
+
+.navpath ul
+{
+ font-size: 11px;
+ background-image:url('tab_b.png');
+ background-repeat:repeat-x;
+ background-position: 0 -5px;
+ height:30px;
+ line-height:30px;
+ color:#8AA0CC;
+ border:solid 1px #C2CDE4;
+ overflow:hidden;
+ margin:0px;
+ padding:0px;
+}
+
+.navpath li
+{
+ list-style-type:none;
+ float:left;
+ padding-left:10px;
+ padding-right:15px;
+ background-image:url('bc_s.png');
+ background-repeat:no-repeat;
+ background-position:right;
+ color:#364D7C;
+}
+
+.navpath li.navelem a
+{
+ height:32px;
+ display:block;
+ text-decoration: none;
+ outline: none;
+ color: #283A5D;
+ font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif;
+ text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9);
+ text-decoration: none;
+}
+
+.navpath li.navelem a:hover
+{
+ color:#6884BD;
+}
+
+.navpath li.footer
+{
+ list-style-type:none;
+ float:right;
+ padding-left:10px;
+ padding-right:15px;
+ background-image:none;
+ background-repeat:no-repeat;
+ background-position:right;
+ color:#364D7C;
+ font-size: 8pt;
+}
+
+
+div.summary
+{
+ float: right;
+ font-size: 8pt;
+ padding-right: 5px;
+ width: 50%;
+ text-align: right;
+}
+
+div.summary a
+{
+ white-space: nowrap;
+}
+
+table.classindex
+{
+ margin: 10px;
+ white-space: nowrap;
+ margin-left: 3%;
+ margin-right: 3%;
+ width: 94%;
+ border: 0;
+ border-spacing: 0;
+ padding: 0;
+}
+
+div.ingroups
+{
+ font-size: 8pt;
+ width: 50%;
+ text-align: left;
+}
+
+div.ingroups a
+{
+ white-space: nowrap;
+}
+
+div.header
+{
+ background-image:url('nav_h.png');
+ background-repeat:repeat-x;
+ background-color: #F9FAFC;
+ margin: 0px;
+ border-bottom: 1px solid #C4CFE5;
+}
+
+div.headertitle
+{
+ padding: 5px 5px 5px 10px;
+}
+
+dl
+{
+ padding: 0 0 0 10px;
+}
+
+/* dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug */
+dl.section
+{
+ margin-left: 0px;
+ padding-left: 0px;
+}
+
+dl.note
+{
+ margin-left:-7px;
+ padding-left: 3px;
+ border-left:4px solid;
+ border-color: #D0C000;
+}
+
+dl.warning, dl.attention
+{
+ margin-left:-7px;
+ padding-left: 3px;
+ border-left:4px solid;
+ border-color: #FF0000;
+}
+
+dl.pre, dl.post, dl.invariant
+{
+ margin-left:-7px;
+ padding-left: 3px;
+ border-left:4px solid;
+ border-color: #00D000;
+}
+
+dl.deprecated
+{
+ margin-left:-7px;
+ padding-left: 3px;
+ border-left:4px solid;
+ border-color: #505050;
+}
+
+dl.todo
+{
+ margin-left:-7px;
+ padding-left: 3px;
+ border-left:4px solid;
+ border-color: #00C0E0;
+}
+
+dl.test
+{
+ margin-left:-7px;
+ padding-left: 3px;
+ border-left:4px solid;
+ border-color: #3030E0;
+}
+
+dl.bug
+{
+ margin-left:-7px;
+ padding-left: 3px;
+ border-left:4px solid;
+ border-color: #C08050;
+}
+
+dl.section dd {
+ margin-bottom: 6px;
+}
+
+
+#projectlogo
+{
+ text-align: center;
+ vertical-align: bottom;
+ border-collapse: separate;
+}
+
+#projectlogo img
+{
+ border: 0px none;
+}
+
+#projectalign
+{
+ vertical-align: middle;
+}
+
+#projectname
+{
+ font: 300% Tahoma, Arial,sans-serif;
+ margin: 0px;
+ padding: 2px 0px;
+}
+
+#projectbrief
+{
+ font: 120% Tahoma, Arial,sans-serif;
+ margin: 0px;
+ padding: 0px;
+}
+
+#projectnumber
+{
+ font: 50% Tahoma, Arial,sans-serif;
+ margin: 0px;
+ padding: 0px;
+}
+
+#titlearea
+{
+ padding: 0px;
+ margin: 0px;
+ width: 100%;
+ border-bottom: 1px solid #5373B4;
+}
+
+.image
+{
+ text-align: center;
+}
+
+.dotgraph
+{
+ text-align: center;
+}
+
+.mscgraph
+{
+ text-align: center;
+}
+
+.diagraph
+{
+ text-align: center;
+}
+
+.caption
+{
+ font-weight: bold;
+}
+
+div.zoom
+{
+ border: 1px solid #90A5CE;
+}
+
+dl.citelist {
+ margin-bottom:50px;
+}
+
+dl.citelist dt {
+ color:#334975;
+ float:left;
+ font-weight:bold;
+ margin-right:10px;
+ padding:5px;
+}
+
+dl.citelist dd {
+ margin:2px 0;
+ padding:5px 0;
+}
+
+div.toc {
+ padding: 14px 25px;
+ background-color: #F4F6FA;
+ border: 1px solid #D8DFEE;
+ border-radius: 7px 7px 7px 7px;
+ float: right;
+ height: auto;
+ margin: 0 8px 10px 10px;
+ width: 200px;
+}
+
+div.toc li {
+ background: url("bdwn.png") no-repeat scroll 0 5px transparent;
+ font: 10px/1.2 Verdana,DejaVu Sans,Geneva,sans-serif;
+ margin-top: 5px;
+ padding-left: 10px;
+ padding-top: 2px;
+}
+
+div.toc h3 {
+ font: bold 12px/1.2 Arial,FreeSans,sans-serif;
+ color: #4665A2;
+ border-bottom: 0 none;
+ margin: 0;
+}
+
+div.toc ul {
+ list-style: none outside none;
+ border: medium none;
+ padding: 0px;
+}
+
+div.toc li.level1 {
+ margin-left: 0px;
+}
+
+div.toc li.level2 {
+ margin-left: 15px;
+}
+
+div.toc li.level3 {
+ margin-left: 30px;
+}
+
+div.toc li.level4 {
+ margin-left: 45px;
+}
+
+.inherit_header {
+ font-weight: bold;
+ color: gray;
+ cursor: pointer;
+ -webkit-touch-callout: none;
+ -webkit-user-select: none;
+ -khtml-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+}
+
+.inherit_header td {
+ padding: 6px 0px 2px 5px;
+}
+
+.inherit {
+ display: none;
+}
+
+tr.heading h2 {
+ margin-top: 12px;
+ margin-bottom: 4px;
+}
+
+/* tooltip related style info */
+
+.ttc {
+ position: absolute;
+ display: none;
+}
+
+#powerTip {
+ cursor: default;
+ white-space: nowrap;
+ background-color: white;
+ border: 1px solid gray;
+ border-radius: 4px 4px 4px 4px;
+ box-shadow: 1px 1px 7px gray;
+ display: none;
+ font-size: smaller;
+ max-width: 80%;
+ opacity: 0.9;
+ padding: 1ex 1em 1em;
+ position: absolute;
+ z-index: 2147483647;
+}
+
+#powerTip div.ttdoc {
+ color: grey;
+ font-style: italic;
+}
+
+#powerTip div.ttname a {
+ font-weight: bold;
+}
+
+#powerTip div.ttname {
+ font-weight: bold;
+}
+
+#powerTip div.ttdeci {
+ color: #006318;
+}
+
+#powerTip div {
+ margin: 0px;
+ padding: 0px;
+ font: 12px/16px Roboto,sans-serif;
+}
+
+#powerTip:before, #powerTip:after {
+ content: "";
+ position: absolute;
+ margin: 0px;
+}
+
+#powerTip.n:after, #powerTip.n:before,
+#powerTip.s:after, #powerTip.s:before,
+#powerTip.w:after, #powerTip.w:before,
+#powerTip.e:after, #powerTip.e:before,
+#powerTip.ne:after, #powerTip.ne:before,
+#powerTip.se:after, #powerTip.se:before,
+#powerTip.nw:after, #powerTip.nw:before,
+#powerTip.sw:after, #powerTip.sw:before {
+ border: solid transparent;
+ content: " ";
+ height: 0;
+ width: 0;
+ position: absolute;
+}
+
+#powerTip.n:after, #powerTip.s:after,
+#powerTip.w:after, #powerTip.e:after,
+#powerTip.nw:after, #powerTip.ne:after,
+#powerTip.sw:after, #powerTip.se:after {
+ border-color: rgba(255, 255, 255, 0);
+}
+
+#powerTip.n:before, #powerTip.s:before,
+#powerTip.w:before, #powerTip.e:before,
+#powerTip.nw:before, #powerTip.ne:before,
+#powerTip.sw:before, #powerTip.se:before {
+ border-color: rgba(128, 128, 128, 0);
+}
+
+#powerTip.n:after, #powerTip.n:before,
+#powerTip.ne:after, #powerTip.ne:before,
+#powerTip.nw:after, #powerTip.nw:before {
+ top: 100%;
+}
+
+#powerTip.n:after, #powerTip.ne:after, #powerTip.nw:after {
+ border-top-color: #ffffff;
+ border-width: 10px;
+ margin: 0px -10px;
+}
+#powerTip.n:before {
+ border-top-color: #808080;
+ border-width: 11px;
+ margin: 0px -11px;
+}
+#powerTip.n:after, #powerTip.n:before {
+ left: 50%;
+}
+
+#powerTip.nw:after, #powerTip.nw:before {
+ right: 14px;
+}
+
+#powerTip.ne:after, #powerTip.ne:before {
+ left: 14px;
+}
+
+#powerTip.s:after, #powerTip.s:before,
+#powerTip.se:after, #powerTip.se:before,
+#powerTip.sw:after, #powerTip.sw:before {
+ bottom: 100%;
+}
+
+#powerTip.s:after, #powerTip.se:after, #powerTip.sw:after {
+ border-bottom-color: #ffffff;
+ border-width: 10px;
+ margin: 0px -10px;
+}
+
+#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before {
+ border-bottom-color: #808080;
+ border-width: 11px;
+ margin: 0px -11px;
+}
+
+#powerTip.s:after, #powerTip.s:before {
+ left: 50%;
+}
+
+#powerTip.sw:after, #powerTip.sw:before {
+ right: 14px;
+}
+
+#powerTip.se:after, #powerTip.se:before {
+ left: 14px;
+}
+
+#powerTip.e:after, #powerTip.e:before {
+ left: 100%;
+}
+#powerTip.e:after {
+ border-left-color: #ffffff;
+ border-width: 10px;
+ top: 50%;
+ margin-top: -10px;
+}
+#powerTip.e:before {
+ border-left-color: #808080;
+ border-width: 11px;
+ top: 50%;
+ margin-top: -11px;
+}
+
+#powerTip.w:after, #powerTip.w:before {
+ right: 100%;
+}
+#powerTip.w:after {
+ border-right-color: #ffffff;
+ border-width: 10px;
+ top: 50%;
+ margin-top: -10px;
+}
+#powerTip.w:before {
+ border-right-color: #808080;
+ border-width: 11px;
+ top: 50%;
+ margin-top: -11px;
+}
+
+@media print
+{
+ #top { display: none; }
+ #side-nav { display: none; }
+ #nav-path { display: none; }
+ body { overflow:visible; }
+ h1, h2, h3, h4, h5, h6 { page-break-after: avoid; }
+ .summary { display: none; }
+ .memitem { page-break-inside: avoid; }
+ #doc-content
+ {
+ margin-left:0 !important;
+ height:auto !important;
+ width:auto !important;
+ overflow:inherit;
+ display:inline;
+ }
+}
+
--- /dev/null
+function toggleVisibility(linkObj)
+{
+ var base = $(linkObj).attr('id');
+ var summary = $('#'+base+'-summary');
+ var content = $('#'+base+'-content');
+ var trigger = $('#'+base+'-trigger');
+ var src=$(trigger).attr('src');
+ if (content.is(':visible')===true) {
+ content.hide();
+ summary.show();
+ $(linkObj).addClass('closed').removeClass('opened');
+ $(trigger).attr('src',src.substring(0,src.length-8)+'closed.png');
+ } else {
+ content.show();
+ summary.hide();
+ $(linkObj).removeClass('closed').addClass('opened');
+ $(trigger).attr('src',src.substring(0,src.length-10)+'open.png');
+ }
+ return false;
+}
+
+function updateStripes()
+{
+ $('table.directory tr').
+ removeClass('even').filter(':visible:even').addClass('even');
+}
+
+function toggleLevel(level)
+{
+ $('table.directory tr').each(function() {
+ var l = this.id.split('_').length-1;
+ var i = $('#img'+this.id.substring(3));
+ var a = $('#arr'+this.id.substring(3));
+ if (l<level+1) {
+ i.removeClass('iconfopen iconfclosed').addClass('iconfopen');
+ a.html('▼');
+ $(this).show();
+ } else if (l==level+1) {
+ i.removeClass('iconfclosed iconfopen').addClass('iconfclosed');
+ a.html('►');
+ $(this).show();
+ } else {
+ $(this).hide();
+ }
+ });
+ updateStripes();
+}
+
+function toggleFolder(id)
+{
+ // the clicked row
+ var currentRow = $('#row_'+id);
+
+ // all rows after the clicked row
+ var rows = currentRow.nextAll("tr");
+
+ var re = new RegExp('^row_'+id+'\\d+_$', "i"); //only one sub
+
+ // only match elements AFTER this one (can't hide elements before)
+ var childRows = rows.filter(function() { return this.id.match(re); });
+
+ // first row is visible we are HIDING
+ if (childRows.filter(':first').is(':visible')===true) {
+ // replace down arrow by right arrow for current row
+ var currentRowSpans = currentRow.find("span");
+ currentRowSpans.filter(".iconfopen").removeClass("iconfopen").addClass("iconfclosed");
+ currentRowSpans.filter(".arrow").html('►');
+ rows.filter("[id^=row_"+id+"]").hide(); // hide all children
+ } else { // we are SHOWING
+ // replace right arrow by down arrow for current row
+ var currentRowSpans = currentRow.find("span");
+ currentRowSpans.filter(".iconfclosed").removeClass("iconfclosed").addClass("iconfopen");
+ currentRowSpans.filter(".arrow").html('▼');
+ // replace down arrows by right arrows for child rows
+ var childRowsSpans = childRows.find("span");
+ childRowsSpans.filter(".iconfopen").removeClass("iconfopen").addClass("iconfclosed");
+ childRowsSpans.filter(".arrow").html('►');
+ childRows.show(); //show all children
+ }
+ updateStripes();
+}
+
+
+function toggleInherit(id)
+{
+ var rows = $('tr.inherit.'+id);
+ var img = $('tr.inherit_header.'+id+' img');
+ var src = $(img).attr('src');
+ if (rows.filter(':first').is(':visible')===true) {
+ rows.css('display','none');
+ $(img).attr('src',src.substring(0,src.length-8)+'closed.png');
+ } else {
+ rows.css('display','table-row'); // using show() causes jump in firefox
+ $(img).attr('src',src.substring(0,src.length-10)+'open.png');
+ }
+}
+
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.11"/>
+<title>libwebsockets: File List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="libwebsockets.org-logo.png"/></td>
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname">libwebsockets
+ </div>
+ <div id="projectbrief">Lightweight C library for HTML5 websockets</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.11 -->
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main Page</span></a></li>
+ <li><a href="pages.html"><span>Related Pages</span></a></li>
+ <li><a href="modules.html"><span>Modules</span></a></li>
+ <li><a href="annotated.html"><span>Data Structures</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li class="current"><a href="files.html"><span>File List</span></a></li>
+ <li><a href="globals.html"><span>Globals</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('files.html','');});
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="headertitle">
+<div class="title">File List</div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock">Here is a list of all documented files with brief descriptions:</div><div class="directory">
+<div class="levels">[detail level <span onclick="javascript:toggleLevel(1);">1</span><span onclick="javascript:toggleLevel(2);">2</span>]</div><table class="directory">
+<tr id="row_0_" class="even"><td class="entry"><span style="width:0px;display:inline-block;"> </span><span id="arr_0_" class="arrow" onclick="toggleFolder('0_')">▼</span><span id="img_0_" class="iconfopen" onclick="toggleFolder('0_')"> </span><a class="el" href="dir_97aefd0d527b934f1d99a682da8fe6a9.html" target="_self">lib</a></td><td class="desc"></td></tr>
+<tr id="row_0_0_"><td class="entry"><span style="width:32px;display:inline-block;"> </span><a href="libwebsockets_8h_source.html"><span class="icondoc"></span></a><a class="el" href="libwebsockets_8h.html" target="_self">libwebsockets.h</a></td><td class="desc"></td></tr>
+</table>
+</div><!-- directory -->
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">Generated by
+ <a href="http://www.doxygen.org/index.html">
+ <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.11 </li>
+ </ul>
+</div>
+</body>
+</html>
--- /dev/null
+var files =
+[
+ [ "lib", "dir_97aefd0d527b934f1d99a682da8fe6a9.html", "dir_97aefd0d527b934f1d99a682da8fe6a9" ]
+];
\ No newline at end of file
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.11"/>
+<title>libwebsockets: Data Fields</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="libwebsockets.org-logo.png"/></td>
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname">libwebsockets
+ </div>
+ <div id="projectbrief">Lightweight C library for HTML5 websockets</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.11 -->
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main Page</span></a></li>
+ <li><a href="pages.html"><span>Related Pages</span></a></li>
+ <li><a href="modules.html"><span>Modules</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Data Structures</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Data Structures</span></a></li>
+ <li><a href="classes.html"><span>Data Structure Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+ <li class="current"><a href="functions.html"><span>Data Fields</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li class="current"><a href="functions.html"><span>All</span></a></li>
+ <li><a href="functions_func.html"><span>Functions</span></a></li>
+ <li><a href="functions_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="#index__"><span>_</span></a></li>
+ <li><a href="#index_a"><span>a</span></a></li>
+ <li><a href="#index_b"><span>b</span></a></li>
+ <li><a href="#index_c"><span>c</span></a></li>
+ <li><a href="#index_d"><span>d</span></a></li>
+ <li><a href="#index_e"><span>e</span></a></li>
+ <li><a href="#index_f"><span>f</span></a></li>
+ <li><a href="#index_g"><span>g</span></a></li>
+ <li><a href="#index_h"><span>h</span></a></li>
+ <li><a href="#index_i"><span>i</span></a></li>
+ <li><a href="#index_k"><span>k</span></a></li>
+ <li><a href="#index_l"><span>l</span></a></li>
+ <li><a href="#index_m"><span>m</span></a></li>
+ <li><a href="#index_n"><span>n</span></a></li>
+ <li><a href="#index_o"><span>o</span></a></li>
+ <li><a href="#index_p"><span>p</span></a></li>
+ <li><a href="#index_r"><span>r</span></a></li>
+ <li><a href="#index_s"><span>s</span></a></li>
+ <li><a href="#index_t"><span>t</span></a></li>
+ <li><a href="#index_u"><span>u</span></a></li>
+ <li><a href="#index_v"><span>v</span></a></li>
+ <li class="current"><a href="#index_w"><span>w</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('functions.html','');});
+</script>
+<div id="doc-content">
+<div class="contents">
+<div class="textblock">Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:</div>
+
+<h3><a class="anchor" id="index__"></a>- _ -</h3><ul>
+<li>_unused
+: <a class="el" href="structlws__client__connect__info.html#ad47f50d1633dc5df74548606c9a66d73">lws_client_connect_info</a>
+, <a class="el" href="structlws__context__creation__info.html#afce3b59950eca3203faa07381bbed5d7">lws_context_creation_info</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_a"></a>- a -</h3><ul>
+<li>address
+: <a class="el" href="structlws__client__connect__info.html#aa364094f94ef1bcaaabbd9161971d502">lws_client_connect_info</a>
+</li>
+<li>api_magic
+: <a class="el" href="structlws__plugin__capability.html#a523c7cde6f15bba345f56493dcf6b32a">lws_plugin_capability</a>
+</li>
+<li>auth_mask
+: <a class="el" href="structlws__http__mount.html#a614364c770b0bd4db464ad65cddab477">lws_http_mount</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_b"></a>- b -</h3><ul>
+<li>bin
+: <a class="el" href="structlwsgw__hash__bin.html#ac92f50d9471058525d110597a4e0de6b">lwsgw_hash_bin</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_c"></a>- c -</h3><ul>
+<li>ca
+: <a class="el" href="structlws__polarssl__context.html#a1872f2ea24878d807ae20ca8513674af">lws_polarssl_context</a>
+</li>
+<li>cache_intermediaries
+: <a class="el" href="structlws__http__mount.html#aabec1a326780aafe11b977000983be0c">lws_http_mount</a>
+</li>
+<li>cache_max_age
+: <a class="el" href="structlws__http__mount.html#a4283e30ea89d27ae7d061ad760d1d146">lws_http_mount</a>
+</li>
+<li>cache_reusable
+: <a class="el" href="structlws__http__mount.html#a8316dd183ffbef50419a5a4968d35d84">lws_http_mount</a>
+</li>
+<li>cache_revalidate
+: <a class="el" href="structlws__http__mount.html#ae137203040c6153694bd88a708da5395">lws_http_mount</a>
+</li>
+<li>callback
+: <a class="el" href="structlws__extension.html#afa21f3b3c8c2c9212a276c52b680c3af">lws_extension</a>
+, <a class="el" href="structlws__protocols.html#acabf94c1a9bfe7be0387fbb0e0c56b2d">lws_protocols</a>
+</li>
+<li>caps
+: <a class="el" href="structlws__plugin.html#ac7f1fdfe8cf8a21f8ee9720c21934a3f">lws_plugin</a>
+</li>
+<li>certificate
+: <a class="el" href="structlws__polarssl__context.html#ae7e11c9129ff71c7ee71b3b2e320ff27">lws_polarssl_context</a>
+</li>
+<li>cgi_timeout
+: <a class="el" href="structlws__http__mount.html#a4a7239d6d4c03986e6e1a72abb6c83aa">lws_http_mount</a>
+</li>
+<li>cgienv
+: <a class="el" href="structlws__http__mount.html#ae7b5c0f4c5408061e6ea3a8d281f45af">lws_http_mount</a>
+</li>
+<li>ch
+: <a class="el" href="structlws__cgi__args.html#adeee220b29aeacc34632c38e50f0f5a5">lws_cgi_args</a>
+</li>
+<li>client_exts
+: <a class="el" href="structlws__client__connect__info.html#a7732b996e977393c3e1076be2a8ded6c">lws_client_connect_info</a>
+</li>
+<li>client_offer
+: <a class="el" href="structlws__extension.html#a36b06c213aedb02bf9a402651751855b">lws_extension</a>
+</li>
+<li>close
+: <a class="el" href="structlws__plat__file__ops.html#a034ec96f2fbaf52b4aa3e82d20795f7b">lws_plat_file_ops</a>
+</li>
+<li>content
+: <a class="el" href="structlws__email.html#a6fff03c5a5d369a2aa3cab0c897b1bed">lws_email</a>
+</li>
+<li>context
+: <a class="el" href="structlws__client__connect__info.html#afe999d133cc240a0bfd02aade0514cfd">lws_client_connect_info</a>
+</li>
+<li>count_extensions
+: <a class="el" href="structlws__plugin__capability.html#abcf51db969522fdda9aaf902e65739d3">lws_plugin_capability</a>
+</li>
+<li>count_protocols
+: <a class="el" href="structlws__plugin__capability.html#ae38f7cf1246b9ca3af3cbf9d46b7090f">lws_plugin_capability</a>
+</li>
+<li>count_threads
+: <a class="el" href="structlws__context__creation__info.html#ae52f3237e144e9ddcab5e2cf91d1e419">lws_context_creation_info</a>
+</li>
+<li>count_vars
+: <a class="el" href="structlws__process__html__state.html#adcafd17704775b4bbeea9561fb340968">lws_process_html_state</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_d"></a>- d -</h3><ul>
+<li>data
+: <a class="el" href="structlws__cgi__args.html#a8ac842084688c02f3f94694ef700d8f7">lws_cgi_args</a>
+, <a class="el" href="structlws__email.html#add1341456045382c183f4c763bdea6bc">lws_email</a>
+, <a class="el" href="structlws__process__html__state.html#af21119890fdfebe28fb5c4dabfc1bdf5">lws_process_html_state</a>
+</li>
+<li>def
+: <a class="el" href="structlws__http__mount.html#ae90d1efe7178199fad39de2926902ee4">lws_http_mount</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_e"></a>- e -</h3><ul>
+<li>ecdh_curve
+: <a class="el" href="structlws__context__creation__info.html#afa5d4e7d9f86b58a1c6fac14f0a5f5f9">lws_context_creation_info</a>
+</li>
+<li>email
+: <a class="el" href="structlws__gs__event__args.html#acd17e4f9f91f7f9a8f0fbf0744a3a463">lws_gs_event_args</a>
+, <a class="el" href="structlws__session__info.html#a94b813cfc6b0da4b182659de30038ad3">lws_session_info</a>
+</li>
+<li>email_buf
+: <a class="el" href="structlws__email.html#a8f34ec0643a817be67ef4276aeb7fb82">lws_email</a>
+</li>
+<li>email_client
+: <a class="el" href="structlws__email.html#a01f31934166dc6d01e8a375012f8ad1e">lws_email</a>
+</li>
+<li>email_connect_req
+: <a class="el" href="structlws__email.html#a5f53d4c5a1e34b0dcaa8787e2eabb1b3">lws_email</a>
+</li>
+<li>email_connect_started
+: <a class="el" href="structlws__email.html#a9747ca85597788c2d118d287df47b7c1">lws_email</a>
+</li>
+<li>email_from
+: <a class="el" href="structlws__email.html#af7f0ae934347d81071f63a963301f9e2">lws_email</a>
+</li>
+<li>email_helo
+: <a class="el" href="structlws__email.html#a939e5d7ee0339a16de73bde71ab4d4d9">lws_email</a>
+</li>
+<li>email_smtp_ip
+: <a class="el" href="structlws__email.html#a472ae23fc9fca6599e5c512bc21458d2">lws_email</a>
+</li>
+<li>email_to
+: <a class="el" href="structlws__email.html#a6453a8b92b3de6d2c2101af3edce685e">lws_email</a>
+</li>
+<li>estate
+: <a class="el" href="structlws__email.html#ac6115d3cbef2e8bac62cc00895bf5fd3">lws_email</a>
+</li>
+<li>event
+: <a class="el" href="structlws__gs__event__args.html#a477274f8ca22ba7411b9285b9dc8dd06">lws_gs_event_args</a>
+</li>
+<li>events
+: <a class="el" href="structlws__pollargs.html#a00bbffea9f55de342783e32d71ce1de6">lws_pollargs</a>
+, <a class="el" href="structlws__pollfd.html#ac393db6fc7fb6ed8fe7ca20936908ee9">lws_pollfd</a>
+, <a class="el" href="structpollfd.html#ac9b2f2c5b1f9a7487eb57e67cd4960ef">pollfd</a>
+</li>
+<li>extensions
+: <a class="el" href="structlws__context__creation__info.html#a4a3d1155fc52f5048b481884f6fb947c">lws_context_creation_info</a>
+, <a class="el" href="structlws__plugin__capability.html#a7936f0eb93d79dea76b903d0f8a5f623">lws_plugin_capability</a>
+</li>
+<li>extra_mimetypes
+: <a class="el" href="structlws__http__mount.html#a4437423df85ee3dbcae0e15974c89ec7">lws_http_mount</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_f"></a>- f -</h3><ul>
+<li>fd
+: <a class="el" href="structlws__pollargs.html#af14a48ef4e78128aef9a76902b104a81">lws_pollargs</a>
+, <a class="el" href="structlws__pollfd.html#a714cf5ca90b41926117fdde9fa6542be">lws_pollfd</a>
+, <a class="el" href="structpollfd.html#af084f089bdece61d177f85782d6673d0">pollfd</a>
+</li>
+<li>fd_limit_per_thread
+: <a class="el" href="structlws__context__creation__info.html#a45e63e24c88289e0c8352377ef4d3646">lws_context_creation_info</a>
+</li>
+<li>final
+: <a class="el" href="structlws__process__html__args.html#a362547891ee0d693f3900a1f807ea475">lws_process_html_args</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_g"></a>- g -</h3><ul>
+<li>gid
+: <a class="el" href="structlws__context__creation__info.html#a9c9d22437de92c197f3cee52912b2c03">lws_context_creation_info</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_h"></a>- h -</h3><ul>
+<li>hdr_state
+: <a class="el" href="structlws__cgi__args.html#a741c11b9aa05997ec45a3400d7fb7739">lws_cgi_args</a>
+</li>
+<li>host
+: <a class="el" href="structlws__client__connect__info.html#a9b36d47c3422329df32c21040a35ebc7">lws_client_connect_info</a>
+</li>
+<li>http_proxy_address
+: <a class="el" href="structlws__context__creation__info.html#aef917c0b23976a264d2474901b4f5aa3">lws_context_creation_info</a>
+</li>
+<li>http_proxy_port
+: <a class="el" href="structlws__context__creation__info.html#a7b59f2bdc869871e7bde232db94f5ca6">lws_context_creation_info</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_i"></a>- i -</h3><ul>
+<li>id
+: <a class="el" href="structlws__protocols.html#a6b632018590c2b1bbe43fbab6d5e6fac">lws_protocols</a>
+, <a class="el" href="structlwsgw__hash.html#a29435f5cf78747d4257695b0f141d164">lwsgw_hash</a>
+</li>
+<li>ietf_version_or_minus_one
+: <a class="el" href="structlws__client__connect__info.html#a69abb5aeed755750b9755e5c91db6895">lws_client_connect_info</a>
+</li>
+<li>iface
+: <a class="el" href="structlws__context__creation__info.html#a75434932bb5df54665ea678eb8ac104a">lws_context_creation_info</a>
+</li>
+<li>interpret
+: <a class="el" href="structlws__http__mount.html#a11ea62b952710d59733dbcf9794a5773">lws_http_mount</a>
+</li>
+<li>ip
+: <a class="el" href="structlws__session__info.html#a53eed02325e8717a53297391e3e98fac">lws_session_info</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_k"></a>- k -</h3><ul>
+<li>ka_interval
+: <a class="el" href="structlws__context__creation__info.html#a381342a398883d6204955ff3c1849ddd">lws_context_creation_info</a>
+</li>
+<li>ka_probes
+: <a class="el" href="structlws__context__creation__info.html#a3baab4285c679fbe027c2504621d7410">lws_context_creation_info</a>
+</li>
+<li>ka_time
+: <a class="el" href="structlws__context__creation__info.html#ac583ce92b8e1c949cb6fef6bfe713d56">lws_context_creation_info</a>
+</li>
+<li>keepalive_timeout
+: <a class="el" href="structlws__context__creation__info.html#a81697c6b763b5ef3ee52862bc70b07d6">lws_context_creation_info</a>
+</li>
+<li>key
+: <a class="el" href="structlws__polarssl__context.html#a919c33af37aab170f828d954de1fa270">lws_polarssl_context</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_l"></a>- l -</h3><ul>
+<li>l
+: <a class="el" href="structlws__plugin.html#a4ef37a43653715b6c69cbf8a7be747f4">lws_plugin</a>
+</li>
+<li>len
+: <a class="el" href="structlws__cgi__args.html#a36e5c256433c187bd0eaa9c1ca667f1d">lws_cgi_args</a>
+, <a class="el" href="structlws__ext__option__arg.html#af37f0b6caa7735af51a1ac12b68d5bc5">lws_ext_option_arg</a>
+, <a class="el" href="structlws__process__html__args.html#a754513f2311241cabb0cd1c90d7307ef">lws_process_html_args</a>
+</li>
+<li>lib
+: <a class="el" href="structlws__plugin.html#af9e1042dc1de5b9d202c2f5fd1834330">lws_plugin</a>
+</li>
+<li>list
+: <a class="el" href="structlws__plugin.html#a65dffd68fd267ce17b988790d1d35f22">lws_plugin</a>
+</li>
+<li>log_filepath
+: <a class="el" href="structlws__context__creation__info.html#ad0e95ba721f7bd2b676719f8093c23a2">lws_context_creation_info</a>
+</li>
+<li>loop
+: <a class="el" href="structlws__email.html#ab5fbf121195a8e67509c78a42cfbe168">lws_email</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_m"></a>- m -</h3><ul>
+<li>mask
+: <a class="el" href="structlws__session__info.html#afb924864b70f40372920688a5c1c895e">lws_session_info</a>
+</li>
+<li>max_content_size
+: <a class="el" href="structlws__email.html#a7bbc1964889c984b3da723c86a210e05">lws_email</a>
+</li>
+<li>max_http_header_data
+: <a class="el" href="structlws__context__creation__info.html#a0cdfd3c484689ba6f0f2cc91b38ce948">lws_context_creation_info</a>
+</li>
+<li>max_http_header_data2
+: <a class="el" href="structlws__context__creation__info.html#aa8d9e85e137f35fb006f2e4a53f0887a">lws_context_creation_info</a>
+</li>
+<li>max_http_header_pool
+: <a class="el" href="structlws__context__creation__info.html#a0b154e79abc1167ba4ac3539f4af6720">lws_context_creation_info</a>
+</li>
+<li>max_len
+: <a class="el" href="structlws__process__html__args.html#a8be7fd396a1942ea2449a2fda990ff99">lws_process_html_args</a>
+</li>
+<li>method
+: <a class="el" href="structlws__client__connect__info.html#aa9e8e3da4e783a0651b0dea62c2dd1db">lws_client_connect_info</a>
+</li>
+<li>mount_next
+: <a class="el" href="structlws__http__mount.html#ad878546ae1c399bbca7d7f8a0baf973d">lws_http_mount</a>
+</li>
+<li>mountpoint
+: <a class="el" href="structlws__http__mount.html#aa2391bfcada0b7a290b3c6651f64586c">lws_http_mount</a>
+</li>
+<li>mountpoint_len
+: <a class="el" href="structlws__http__mount.html#ac8489b60b8f969eb19c9abbdeac90743">lws_http_mount</a>
+</li>
+<li>mounts
+: <a class="el" href="structlws__context__creation__info.html#a13ffbb0d010309669611f8c4eda7d7f8">lws_context_creation_info</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_n"></a>- n -</h3><ul>
+<li>name
+: <a class="el" href="structlws__ext__options.html#a1769e4a9805bbdda227821e9578ddc7e">lws_ext_options</a>
+, <a class="el" href="structlws__extension.html#a1e5018c883d85176f5c2152176843f9e">lws_extension</a>
+, <a class="el" href="structlws__plugin.html#af4ac8fcb79e10e0c2d960e1804d98105">lws_plugin</a>
+, <a class="el" href="structlws__protocol__vhost__options.html#acf9db77f8eb64cd4e314be9b43d8a8b9">lws_protocol_vhost_options</a>
+, <a class="el" href="structlws__protocols.html#a0e63edb457a613c3fa4271e0a8f19624">lws_protocols</a>
+</li>
+<li>next
+: <a class="el" href="structlws__protocol__vhost__options.html#abc714ddb4171756fc8196e9823a1e21c">lws_protocol_vhost_options</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_o"></a>- o -</h3><ul>
+<li>on_get_body
+: <a class="el" href="structlws__email.html#a2aff78c8e04db243052aa91b4d87e987">lws_email</a>
+</li>
+<li>on_next
+: <a class="el" href="structlws__email.html#ad8dc60353ee246d84dd59ec0591e9719">lws_email</a>
+</li>
+<li>on_sent
+: <a class="el" href="structlws__email.html#a39ef6263d58eb40cca417c8697b227d8">lws_email</a>
+</li>
+<li>onDisconnect()
+: <a class="el" href="classlws__conn__listener.html#aab3c7bf550a8f15d20f1e093125c2e60">lws_conn_listener</a>
+</li>
+<li>onError()
+: <a class="el" href="classlws__conn__listener.html#a271ac4f8ad5770b3bc96cce5b265b72c">lws_conn_listener</a>
+</li>
+<li>onIncoming()
+: <a class="el" href="classlws__conn__listener.html#ab432a456c3a961ec562e06141897806b">lws_conn_listener</a>
+</li>
+<li>onRX()
+: <a class="el" href="classlws__conn__listener.html#ab3bc839797ba14554ac70ad09fd155c7">lws_conn_listener</a>
+</li>
+<li>open
+: <a class="el" href="structlws__plat__file__ops.html#ad37a97abc68d0af967cef874f4d8df32">lws_plat_file_ops</a>
+</li>
+<li>option_index
+: <a class="el" href="structlws__ext__option__arg.html#af57fffcfa253dfa8d98681ac1fb1785f">lws_ext_option_arg</a>
+</li>
+<li>option_name
+: <a class="el" href="structlws__ext__option__arg.html#a0a320c56b79271b8f059eeaad9423ac9">lws_ext_option_arg</a>
+</li>
+<li>options
+: <a class="el" href="structlws__context__creation__info.html#a9d3b17a25e1fbc772f21eb4959a82724">lws_context_creation_info</a>
+, <a class="el" href="structlws__protocol__vhost__options.html#afd99fbc90be51ea2465b550c2ec47822">lws_protocol_vhost_options</a>
+</li>
+<li>origin
+: <a class="el" href="structlws__client__connect__info.html#a8595f83e64147cb687b6418cf500dd4c">lws_client_connect_info</a>
+, <a class="el" href="structlws__http__mount.html#a21d86fd6043ec00e121ababbc29af39a">lws_http_mount</a>
+</li>
+<li>origin_protocol
+: <a class="el" href="structlws__http__mount.html#a6a9b1492a0b9749e39bd19932717a0b7">lws_http_mount</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_p"></a>- p -</h3><ul>
+<li>p
+: <a class="el" href="structlws__process__html__args.html#a11859d8bedd379fbf64543b25c65fe14">lws_process_html_args</a>
+</li>
+<li>parent_wsi
+: <a class="el" href="structlws__client__connect__info.html#a6843a60e1050b10db9d98d7eeb45f587">lws_client_connect_info</a>
+</li>
+<li>path
+: <a class="el" href="structlws__client__connect__info.html#a76a8388733f114fb8fd3643874781185">lws_client_connect_info</a>
+</li>
+<li>per_session_data_size
+: <a class="el" href="structlws__protocols.html#a9bbd85f591ffb4259711cb5acbb05bea">lws_protocols</a>
+</li>
+<li>plugin_dirs
+: <a class="el" href="structlws__context__creation__info.html#a8122cfc0810bafe51edb3ba6bf9a1251">lws_context_creation_info</a>
+</li>
+<li>port
+: <a class="el" href="structlws__client__connect__info.html#a1af124d81c3c22a46d39387c5bc3d6b9">lws_client_connect_info</a>
+, <a class="el" href="structlws__context__creation__info.html#a424a5ce268d6903e42243be94487ab85">lws_context_creation_info</a>
+</li>
+<li>pos
+: <a class="el" href="structlws__process__html__state.html#a53234f2948812c7208a256f9f5b23c20">lws_process_html_state</a>
+</li>
+<li>prev_events
+: <a class="el" href="structlws__pollargs.html#a437fec0de5cf264371e1ab5a401e86d8">lws_pollargs</a>
+</li>
+<li>protocol
+: <a class="el" href="structlws__client__connect__info.html#aba35adfb74845a5fd0c3dc141cbdddd2">lws_client_connect_info</a>
+, <a class="el" href="structlws__http__mount.html#a05347d92c3d379809564bd4f3eab259b">lws_http_mount</a>
+</li>
+<li>protocols
+: <a class="el" href="structlws__context__creation__info.html#abb90ffb3e6d6db2db20f529d61bd9122">lws_context_creation_info</a>
+, <a class="el" href="structlws__plugin__capability.html#a6a4d9d01e770f378ddadc77b37522033">lws_plugin_capability</a>
+</li>
+<li>provided_client_ssl_ctx
+: <a class="el" href="structlws__context__creation__info.html#a1654d41bea6fb2f619b57e6a264b26a4">lws_context_creation_info</a>
+</li>
+<li>pt_serv_buf_size
+: <a class="el" href="structlws__context__creation__info.html#a57f88c0745adbd1d6b9b619b8de30209">lws_context_creation_info</a>
+</li>
+<li>pvo
+: <a class="el" href="structlws__context__creation__info.html#a999866fcd15dbd621773436f97190458">lws_context_creation_info</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_r"></a>- r -</h3><ul>
+<li>read
+: <a class="el" href="structlws__plat__file__ops.html#a01f483807a9862736b17ba9ed5110c40">lws_plat_file_ops</a>
+</li>
+<li>replace
+: <a class="el" href="structlws__process__html__state.html#a693d2fb45378afee5da29b539c1ea644">lws_process_html_state</a>
+</li>
+<li>revents
+: <a class="el" href="structlws__pollfd.html#ae7cecfe7511c59d4a3a44f876d030932">lws_pollfd</a>
+, <a class="el" href="structpollfd.html#aafb457d11cac415faf0e1e2b825118c2">pollfd</a>
+</li>
+<li>rx_buffer_size
+: <a class="el" href="structlws__protocols.html#a0d1d4996d81b2f5e125bcec981e461c5">lws_protocols</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_s"></a>- s -</h3><ul>
+<li>seek_cur
+: <a class="el" href="structlws__plat__file__ops.html#abfcda19b003dcc13c61ff9e2bb4ff869">lws_plat_file_ops</a>
+</li>
+<li>server_string
+: <a class="el" href="structlws__context__creation__info.html#a137a9b9de4f6a7993fed8746d551e616">lws_context_creation_info</a>
+</li>
+<li>session
+: <a class="el" href="structlws__session__info.html#a4353b5dd19400b2b15edfd7cee1e4cd5">lws_session_info</a>
+</li>
+<li>ssl_ca_filepath
+: <a class="el" href="structlws__context__creation__info.html#a4f8e65c3a059d3b586fafa9ef3282c29">lws_context_creation_info</a>
+</li>
+<li>ssl_cert_filepath
+: <a class="el" href="structlws__context__creation__info.html#ac62b0f0e8e402412ba5011d15c244103">lws_context_creation_info</a>
+</li>
+<li>ssl_cipher_list
+: <a class="el" href="structlws__context__creation__info.html#a3e1516fd7fed26bfa77c0246ed26c2eb">lws_context_creation_info</a>
+</li>
+<li>ssl_connection
+: <a class="el" href="structlws__client__connect__info.html#a9862297827639238a7a0b4054c3ddf3d">lws_client_connect_info</a>
+</li>
+<li>ssl_options_clear
+: <a class="el" href="structlws__context__creation__info.html#adb0bc0b28cd7d90ab306723d8ffa96fa">lws_context_creation_info</a>
+</li>
+<li>ssl_options_set
+: <a class="el" href="structlws__context__creation__info.html#a704940261951ced6b5d8191bd8b9bb2d">lws_context_creation_info</a>
+</li>
+<li>ssl_private_key_filepath
+: <a class="el" href="structlws__context__creation__info.html#ab9ec8893e0f7843cf5d783d2f350ef14">lws_context_creation_info</a>
+</li>
+<li>ssl_private_key_password
+: <a class="el" href="structlws__context__creation__info.html#af3fb447be15c4fcb01d3285a6678ab54">lws_context_creation_info</a>
+</li>
+<li>start()
+: <a class="el" href="classlws__conn__listener.html#a3c19c314f2ea2b758407b4041e4c4010">lws_conn_listener</a>
+, <a class="el" href="structlws__ext__option__arg.html#a0b1f7b30c3ceaf5f1bf9d105c24568d1">lws_ext_option_arg</a>
+, <a class="el" href="structlws__process__html__state.html#af0732884ef891e24fe5fa237ebaa21a3">lws_process_html_state</a>
+</li>
+<li>stdwsi
+: <a class="el" href="structlws__cgi__args.html#a4ccc1058e7e914a26eef31ab2ad46aa1">lws_cgi_args</a>
+</li>
+<li>swallow
+: <a class="el" href="structlws__process__html__state.html#a71982bc1cbd8cf876ca0f545144404eb">lws_process_html_state</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_t"></a>- t -</h3><ul>
+<li>timeout_email
+: <a class="el" href="structlws__email.html#a77723e2f2b940b1c879ef5e1cd88c2be">lws_email</a>
+</li>
+<li>timeout_secs
+: <a class="el" href="structlws__context__creation__info.html#a6cfa3d51df2def3349a5cbf0d712822d">lws_context_creation_info</a>
+</li>
+<li>token
+: <a class="el" href="structlws__tokens.html#a9f3635412bc71a5cb78e9862b55f10cd">lws_tokens</a>
+</li>
+<li>token_len
+: <a class="el" href="structlws__tokens.html#a855b7375d1d58516c0ecd4b60e9a7766">lws_tokens</a>
+</li>
+<li>token_limit
+: <a class="el" href="structlws__token__limits.html#a6ec712306cbf8585bce7a56758a3ceff">lws_token_limits</a>
+</li>
+<li>token_limits
+: <a class="el" href="structlws__context__creation__info.html#ac8a75b7b259a3c3a5fbb4219a3f06c29">lws_context_creation_info</a>
+</li>
+<li>type
+: <a class="el" href="structlws__ext__options.html#a7c4dbd62dbeba63a9d50d2306bd1cc61">lws_ext_options</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_u"></a>- u -</h3><ul>
+<li>uid
+: <a class="el" href="structlws__context__creation__info.html#ac105b4180008cb3e672d57beead8382e">lws_context_creation_info</a>
+</li>
+<li>uri_replace_from
+: <a class="el" href="structlws__client__connect__info.html#a03c305fdca809667b6a9a83b3edfd83a">lws_client_connect_info</a>
+</li>
+<li>uri_replace_to
+: <a class="el" href="structlws__client__connect__info.html#a9959ba103d3d2484e559a9f7879eebe3">lws_client_connect_info</a>
+</li>
+<li>user
+: <a class="el" href="structlws__context__creation__info.html#a0e9d94cdfb893d777b4a4db81e7b5ac0">lws_context_creation_info</a>
+, <a class="el" href="structlws__protocols.html#a3cbd903ad076736ae934a54cae36580e">lws_protocols</a>
+</li>
+<li>userdata
+: <a class="el" href="structlws__client__connect__info.html#a9831b9f9ab54a1aec4bb15324f1c3836">lws_client_connect_info</a>
+</li>
+<li>username
+: <a class="el" href="structlws__gs__event__args.html#a2bec693d8a43730d487004a44326178b">lws_gs_event_args</a>
+, <a class="el" href="structlws__session__info.html#a3d57a70b6e7181d95a8bec429b1a7697">lws_session_info</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_v"></a>- v -</h3><ul>
+<li>value
+: <a class="el" href="structlws__protocol__vhost__options.html#a0640a92513c70ee6b9b295a9ad1658e7">lws_protocol_vhost_options</a>
+</li>
+<li>vars
+: <a class="el" href="structlws__process__html__state.html#a3b113e00c03a2fded51b1c85ff5bf077">lws_process_html_state</a>
+</li>
+<li>vhost
+: <a class="el" href="structlws__client__connect__info.html#a3893181d728f326f9f5b47c1459cb8be">lws_client_connect_info</a>
+</li>
+<li>vhost_name
+: <a class="el" href="structlws__context__creation__info.html#ad50db098a208f045f7811207d2bee4b9">lws_context_creation_info</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_w"></a>- w -</h3><ul>
+<li>write
+: <a class="el" href="structlws__plat__file__ops.html#a1fae8330ee94649a3551e31a30809793">lws_plat_file_ops</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">Generated by
+ <a href="http://www.doxygen.org/index.html">
+ <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.11 </li>
+ </ul>
+</div>
+</body>
+</html>
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.11"/>
+<title>libwebsockets: Data Fields - Functions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="libwebsockets.org-logo.png"/></td>
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname">libwebsockets
+ </div>
+ <div id="projectbrief">Lightweight C library for HTML5 websockets</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.11 -->
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main Page</span></a></li>
+ <li><a href="pages.html"><span>Related Pages</span></a></li>
+ <li><a href="modules.html"><span>Modules</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Data Structures</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Data Structures</span></a></li>
+ <li><a href="classes.html"><span>Data Structure Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+ <li class="current"><a href="functions.html"><span>Data Fields</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="functions.html"><span>All</span></a></li>
+ <li class="current"><a href="functions_func.html"><span>Functions</span></a></li>
+ <li><a href="functions_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('functions_func.html','');});
+</script>
+<div id="doc-content">
+<div class="contents">
+ <ul>
+<li>onDisconnect()
+: <a class="el" href="classlws__conn__listener.html#aab3c7bf550a8f15d20f1e093125c2e60">lws_conn_listener</a>
+</li>
+<li>onError()
+: <a class="el" href="classlws__conn__listener.html#a271ac4f8ad5770b3bc96cce5b265b72c">lws_conn_listener</a>
+</li>
+<li>onIncoming()
+: <a class="el" href="classlws__conn__listener.html#ab432a456c3a961ec562e06141897806b">lws_conn_listener</a>
+</li>
+<li>onRX()
+: <a class="el" href="classlws__conn__listener.html#ab3bc839797ba14554ac70ad09fd155c7">lws_conn_listener</a>
+</li>
+<li>start()
+: <a class="el" href="classlws__conn__listener.html#a3c19c314f2ea2b758407b4041e4c4010">lws_conn_listener</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">Generated by
+ <a href="http://www.doxygen.org/index.html">
+ <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.11 </li>
+ </ul>
+</div>
+</body>
+</html>
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.11"/>
+<title>libwebsockets: Data Fields - Variables</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="libwebsockets.org-logo.png"/></td>
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname">libwebsockets
+ </div>
+ <div id="projectbrief">Lightweight C library for HTML5 websockets</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.11 -->
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main Page</span></a></li>
+ <li><a href="pages.html"><span>Related Pages</span></a></li>
+ <li><a href="modules.html"><span>Modules</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Data Structures</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Data Structures</span></a></li>
+ <li><a href="classes.html"><span>Data Structure Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+ <li class="current"><a href="functions.html"><span>Data Fields</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="functions.html"><span>All</span></a></li>
+ <li><a href="functions_func.html"><span>Functions</span></a></li>
+ <li class="current"><a href="functions_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="#index__"><span>_</span></a></li>
+ <li><a href="#index_a"><span>a</span></a></li>
+ <li><a href="#index_b"><span>b</span></a></li>
+ <li><a href="#index_c"><span>c</span></a></li>
+ <li><a href="#index_d"><span>d</span></a></li>
+ <li><a href="#index_e"><span>e</span></a></li>
+ <li><a href="#index_f"><span>f</span></a></li>
+ <li><a href="#index_g"><span>g</span></a></li>
+ <li><a href="#index_h"><span>h</span></a></li>
+ <li><a href="#index_i"><span>i</span></a></li>
+ <li><a href="#index_k"><span>k</span></a></li>
+ <li><a href="#index_l"><span>l</span></a></li>
+ <li><a href="#index_m"><span>m</span></a></li>
+ <li><a href="#index_n"><span>n</span></a></li>
+ <li><a href="#index_o"><span>o</span></a></li>
+ <li><a href="#index_p"><span>p</span></a></li>
+ <li><a href="#index_r"><span>r</span></a></li>
+ <li><a href="#index_s"><span>s</span></a></li>
+ <li><a href="#index_t"><span>t</span></a></li>
+ <li><a href="#index_u"><span>u</span></a></li>
+ <li><a href="#index_v"><span>v</span></a></li>
+ <li class="current"><a href="#index_w"><span>w</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('functions_vars.html','');});
+</script>
+<div id="doc-content">
+<div class="contents">
+ 
+
+<h3><a class="anchor" id="index__"></a>- _ -</h3><ul>
+<li>_unused
+: <a class="el" href="structlws__client__connect__info.html#ad47f50d1633dc5df74548606c9a66d73">lws_client_connect_info</a>
+, <a class="el" href="structlws__context__creation__info.html#afce3b59950eca3203faa07381bbed5d7">lws_context_creation_info</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_a"></a>- a -</h3><ul>
+<li>address
+: <a class="el" href="structlws__client__connect__info.html#aa364094f94ef1bcaaabbd9161971d502">lws_client_connect_info</a>
+</li>
+<li>api_magic
+: <a class="el" href="structlws__plugin__capability.html#a523c7cde6f15bba345f56493dcf6b32a">lws_plugin_capability</a>
+</li>
+<li>auth_mask
+: <a class="el" href="structlws__http__mount.html#a614364c770b0bd4db464ad65cddab477">lws_http_mount</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_b"></a>- b -</h3><ul>
+<li>bin
+: <a class="el" href="structlwsgw__hash__bin.html#ac92f50d9471058525d110597a4e0de6b">lwsgw_hash_bin</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_c"></a>- c -</h3><ul>
+<li>ca
+: <a class="el" href="structlws__polarssl__context.html#a1872f2ea24878d807ae20ca8513674af">lws_polarssl_context</a>
+</li>
+<li>cache_intermediaries
+: <a class="el" href="structlws__http__mount.html#aabec1a326780aafe11b977000983be0c">lws_http_mount</a>
+</li>
+<li>cache_max_age
+: <a class="el" href="structlws__http__mount.html#a4283e30ea89d27ae7d061ad760d1d146">lws_http_mount</a>
+</li>
+<li>cache_reusable
+: <a class="el" href="structlws__http__mount.html#a8316dd183ffbef50419a5a4968d35d84">lws_http_mount</a>
+</li>
+<li>cache_revalidate
+: <a class="el" href="structlws__http__mount.html#ae137203040c6153694bd88a708da5395">lws_http_mount</a>
+</li>
+<li>callback
+: <a class="el" href="structlws__extension.html#afa21f3b3c8c2c9212a276c52b680c3af">lws_extension</a>
+, <a class="el" href="structlws__protocols.html#acabf94c1a9bfe7be0387fbb0e0c56b2d">lws_protocols</a>
+</li>
+<li>caps
+: <a class="el" href="structlws__plugin.html#ac7f1fdfe8cf8a21f8ee9720c21934a3f">lws_plugin</a>
+</li>
+<li>certificate
+: <a class="el" href="structlws__polarssl__context.html#ae7e11c9129ff71c7ee71b3b2e320ff27">lws_polarssl_context</a>
+</li>
+<li>cgi_timeout
+: <a class="el" href="structlws__http__mount.html#a4a7239d6d4c03986e6e1a72abb6c83aa">lws_http_mount</a>
+</li>
+<li>cgienv
+: <a class="el" href="structlws__http__mount.html#ae7b5c0f4c5408061e6ea3a8d281f45af">lws_http_mount</a>
+</li>
+<li>ch
+: <a class="el" href="structlws__cgi__args.html#adeee220b29aeacc34632c38e50f0f5a5">lws_cgi_args</a>
+</li>
+<li>client_exts
+: <a class="el" href="structlws__client__connect__info.html#a7732b996e977393c3e1076be2a8ded6c">lws_client_connect_info</a>
+</li>
+<li>client_offer
+: <a class="el" href="structlws__extension.html#a36b06c213aedb02bf9a402651751855b">lws_extension</a>
+</li>
+<li>close
+: <a class="el" href="structlws__plat__file__ops.html#a034ec96f2fbaf52b4aa3e82d20795f7b">lws_plat_file_ops</a>
+</li>
+<li>content
+: <a class="el" href="structlws__email.html#a6fff03c5a5d369a2aa3cab0c897b1bed">lws_email</a>
+</li>
+<li>context
+: <a class="el" href="structlws__client__connect__info.html#afe999d133cc240a0bfd02aade0514cfd">lws_client_connect_info</a>
+</li>
+<li>count_extensions
+: <a class="el" href="structlws__plugin__capability.html#abcf51db969522fdda9aaf902e65739d3">lws_plugin_capability</a>
+</li>
+<li>count_protocols
+: <a class="el" href="structlws__plugin__capability.html#ae38f7cf1246b9ca3af3cbf9d46b7090f">lws_plugin_capability</a>
+</li>
+<li>count_threads
+: <a class="el" href="structlws__context__creation__info.html#ae52f3237e144e9ddcab5e2cf91d1e419">lws_context_creation_info</a>
+</li>
+<li>count_vars
+: <a class="el" href="structlws__process__html__state.html#adcafd17704775b4bbeea9561fb340968">lws_process_html_state</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_d"></a>- d -</h3><ul>
+<li>data
+: <a class="el" href="structlws__cgi__args.html#a8ac842084688c02f3f94694ef700d8f7">lws_cgi_args</a>
+, <a class="el" href="structlws__email.html#add1341456045382c183f4c763bdea6bc">lws_email</a>
+, <a class="el" href="structlws__process__html__state.html#af21119890fdfebe28fb5c4dabfc1bdf5">lws_process_html_state</a>
+</li>
+<li>def
+: <a class="el" href="structlws__http__mount.html#ae90d1efe7178199fad39de2926902ee4">lws_http_mount</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_e"></a>- e -</h3><ul>
+<li>ecdh_curve
+: <a class="el" href="structlws__context__creation__info.html#afa5d4e7d9f86b58a1c6fac14f0a5f5f9">lws_context_creation_info</a>
+</li>
+<li>email
+: <a class="el" href="structlws__gs__event__args.html#acd17e4f9f91f7f9a8f0fbf0744a3a463">lws_gs_event_args</a>
+, <a class="el" href="structlws__session__info.html#a94b813cfc6b0da4b182659de30038ad3">lws_session_info</a>
+</li>
+<li>email_buf
+: <a class="el" href="structlws__email.html#a8f34ec0643a817be67ef4276aeb7fb82">lws_email</a>
+</li>
+<li>email_client
+: <a class="el" href="structlws__email.html#a01f31934166dc6d01e8a375012f8ad1e">lws_email</a>
+</li>
+<li>email_connect_req
+: <a class="el" href="structlws__email.html#a5f53d4c5a1e34b0dcaa8787e2eabb1b3">lws_email</a>
+</li>
+<li>email_connect_started
+: <a class="el" href="structlws__email.html#a9747ca85597788c2d118d287df47b7c1">lws_email</a>
+</li>
+<li>email_from
+: <a class="el" href="structlws__email.html#af7f0ae934347d81071f63a963301f9e2">lws_email</a>
+</li>
+<li>email_helo
+: <a class="el" href="structlws__email.html#a939e5d7ee0339a16de73bde71ab4d4d9">lws_email</a>
+</li>
+<li>email_smtp_ip
+: <a class="el" href="structlws__email.html#a472ae23fc9fca6599e5c512bc21458d2">lws_email</a>
+</li>
+<li>email_to
+: <a class="el" href="structlws__email.html#a6453a8b92b3de6d2c2101af3edce685e">lws_email</a>
+</li>
+<li>estate
+: <a class="el" href="structlws__email.html#ac6115d3cbef2e8bac62cc00895bf5fd3">lws_email</a>
+</li>
+<li>event
+: <a class="el" href="structlws__gs__event__args.html#a477274f8ca22ba7411b9285b9dc8dd06">lws_gs_event_args</a>
+</li>
+<li>events
+: <a class="el" href="structlws__pollargs.html#a00bbffea9f55de342783e32d71ce1de6">lws_pollargs</a>
+, <a class="el" href="structlws__pollfd.html#ac393db6fc7fb6ed8fe7ca20936908ee9">lws_pollfd</a>
+, <a class="el" href="structpollfd.html#ac9b2f2c5b1f9a7487eb57e67cd4960ef">pollfd</a>
+</li>
+<li>extensions
+: <a class="el" href="structlws__context__creation__info.html#a4a3d1155fc52f5048b481884f6fb947c">lws_context_creation_info</a>
+, <a class="el" href="structlws__plugin__capability.html#a7936f0eb93d79dea76b903d0f8a5f623">lws_plugin_capability</a>
+</li>
+<li>extra_mimetypes
+: <a class="el" href="structlws__http__mount.html#a4437423df85ee3dbcae0e15974c89ec7">lws_http_mount</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_f"></a>- f -</h3><ul>
+<li>fd
+: <a class="el" href="structlws__pollargs.html#af14a48ef4e78128aef9a76902b104a81">lws_pollargs</a>
+, <a class="el" href="structlws__pollfd.html#a714cf5ca90b41926117fdde9fa6542be">lws_pollfd</a>
+, <a class="el" href="structpollfd.html#af084f089bdece61d177f85782d6673d0">pollfd</a>
+</li>
+<li>fd_limit_per_thread
+: <a class="el" href="structlws__context__creation__info.html#a45e63e24c88289e0c8352377ef4d3646">lws_context_creation_info</a>
+</li>
+<li>final
+: <a class="el" href="structlws__process__html__args.html#a362547891ee0d693f3900a1f807ea475">lws_process_html_args</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_g"></a>- g -</h3><ul>
+<li>gid
+: <a class="el" href="structlws__context__creation__info.html#a9c9d22437de92c197f3cee52912b2c03">lws_context_creation_info</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_h"></a>- h -</h3><ul>
+<li>hdr_state
+: <a class="el" href="structlws__cgi__args.html#a741c11b9aa05997ec45a3400d7fb7739">lws_cgi_args</a>
+</li>
+<li>host
+: <a class="el" href="structlws__client__connect__info.html#a9b36d47c3422329df32c21040a35ebc7">lws_client_connect_info</a>
+</li>
+<li>http_proxy_address
+: <a class="el" href="structlws__context__creation__info.html#aef917c0b23976a264d2474901b4f5aa3">lws_context_creation_info</a>
+</li>
+<li>http_proxy_port
+: <a class="el" href="structlws__context__creation__info.html#a7b59f2bdc869871e7bde232db94f5ca6">lws_context_creation_info</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_i"></a>- i -</h3><ul>
+<li>id
+: <a class="el" href="structlws__protocols.html#a6b632018590c2b1bbe43fbab6d5e6fac">lws_protocols</a>
+, <a class="el" href="structlwsgw__hash.html#a29435f5cf78747d4257695b0f141d164">lwsgw_hash</a>
+</li>
+<li>ietf_version_or_minus_one
+: <a class="el" href="structlws__client__connect__info.html#a69abb5aeed755750b9755e5c91db6895">lws_client_connect_info</a>
+</li>
+<li>iface
+: <a class="el" href="structlws__context__creation__info.html#a75434932bb5df54665ea678eb8ac104a">lws_context_creation_info</a>
+</li>
+<li>interpret
+: <a class="el" href="structlws__http__mount.html#a11ea62b952710d59733dbcf9794a5773">lws_http_mount</a>
+</li>
+<li>ip
+: <a class="el" href="structlws__session__info.html#a53eed02325e8717a53297391e3e98fac">lws_session_info</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_k"></a>- k -</h3><ul>
+<li>ka_interval
+: <a class="el" href="structlws__context__creation__info.html#a381342a398883d6204955ff3c1849ddd">lws_context_creation_info</a>
+</li>
+<li>ka_probes
+: <a class="el" href="structlws__context__creation__info.html#a3baab4285c679fbe027c2504621d7410">lws_context_creation_info</a>
+</li>
+<li>ka_time
+: <a class="el" href="structlws__context__creation__info.html#ac583ce92b8e1c949cb6fef6bfe713d56">lws_context_creation_info</a>
+</li>
+<li>keepalive_timeout
+: <a class="el" href="structlws__context__creation__info.html#a81697c6b763b5ef3ee52862bc70b07d6">lws_context_creation_info</a>
+</li>
+<li>key
+: <a class="el" href="structlws__polarssl__context.html#a919c33af37aab170f828d954de1fa270">lws_polarssl_context</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_l"></a>- l -</h3><ul>
+<li>l
+: <a class="el" href="structlws__plugin.html#a4ef37a43653715b6c69cbf8a7be747f4">lws_plugin</a>
+</li>
+<li>len
+: <a class="el" href="structlws__cgi__args.html#a36e5c256433c187bd0eaa9c1ca667f1d">lws_cgi_args</a>
+, <a class="el" href="structlws__ext__option__arg.html#af37f0b6caa7735af51a1ac12b68d5bc5">lws_ext_option_arg</a>
+, <a class="el" href="structlws__process__html__args.html#a754513f2311241cabb0cd1c90d7307ef">lws_process_html_args</a>
+</li>
+<li>lib
+: <a class="el" href="structlws__plugin.html#af9e1042dc1de5b9d202c2f5fd1834330">lws_plugin</a>
+</li>
+<li>list
+: <a class="el" href="structlws__plugin.html#a65dffd68fd267ce17b988790d1d35f22">lws_plugin</a>
+</li>
+<li>log_filepath
+: <a class="el" href="structlws__context__creation__info.html#ad0e95ba721f7bd2b676719f8093c23a2">lws_context_creation_info</a>
+</li>
+<li>loop
+: <a class="el" href="structlws__email.html#ab5fbf121195a8e67509c78a42cfbe168">lws_email</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_m"></a>- m -</h3><ul>
+<li>mask
+: <a class="el" href="structlws__session__info.html#afb924864b70f40372920688a5c1c895e">lws_session_info</a>
+</li>
+<li>max_content_size
+: <a class="el" href="structlws__email.html#a7bbc1964889c984b3da723c86a210e05">lws_email</a>
+</li>
+<li>max_http_header_data
+: <a class="el" href="structlws__context__creation__info.html#a0cdfd3c484689ba6f0f2cc91b38ce948">lws_context_creation_info</a>
+</li>
+<li>max_http_header_data2
+: <a class="el" href="structlws__context__creation__info.html#aa8d9e85e137f35fb006f2e4a53f0887a">lws_context_creation_info</a>
+</li>
+<li>max_http_header_pool
+: <a class="el" href="structlws__context__creation__info.html#a0b154e79abc1167ba4ac3539f4af6720">lws_context_creation_info</a>
+</li>
+<li>max_len
+: <a class="el" href="structlws__process__html__args.html#a8be7fd396a1942ea2449a2fda990ff99">lws_process_html_args</a>
+</li>
+<li>method
+: <a class="el" href="structlws__client__connect__info.html#aa9e8e3da4e783a0651b0dea62c2dd1db">lws_client_connect_info</a>
+</li>
+<li>mount_next
+: <a class="el" href="structlws__http__mount.html#ad878546ae1c399bbca7d7f8a0baf973d">lws_http_mount</a>
+</li>
+<li>mountpoint
+: <a class="el" href="structlws__http__mount.html#aa2391bfcada0b7a290b3c6651f64586c">lws_http_mount</a>
+</li>
+<li>mountpoint_len
+: <a class="el" href="structlws__http__mount.html#ac8489b60b8f969eb19c9abbdeac90743">lws_http_mount</a>
+</li>
+<li>mounts
+: <a class="el" href="structlws__context__creation__info.html#a13ffbb0d010309669611f8c4eda7d7f8">lws_context_creation_info</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_n"></a>- n -</h3><ul>
+<li>name
+: <a class="el" href="structlws__ext__options.html#a1769e4a9805bbdda227821e9578ddc7e">lws_ext_options</a>
+, <a class="el" href="structlws__extension.html#a1e5018c883d85176f5c2152176843f9e">lws_extension</a>
+, <a class="el" href="structlws__plugin.html#af4ac8fcb79e10e0c2d960e1804d98105">lws_plugin</a>
+, <a class="el" href="structlws__protocol__vhost__options.html#acf9db77f8eb64cd4e314be9b43d8a8b9">lws_protocol_vhost_options</a>
+, <a class="el" href="structlws__protocols.html#a0e63edb457a613c3fa4271e0a8f19624">lws_protocols</a>
+</li>
+<li>next
+: <a class="el" href="structlws__protocol__vhost__options.html#abc714ddb4171756fc8196e9823a1e21c">lws_protocol_vhost_options</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_o"></a>- o -</h3><ul>
+<li>on_get_body
+: <a class="el" href="structlws__email.html#a2aff78c8e04db243052aa91b4d87e987">lws_email</a>
+</li>
+<li>on_next
+: <a class="el" href="structlws__email.html#ad8dc60353ee246d84dd59ec0591e9719">lws_email</a>
+</li>
+<li>on_sent
+: <a class="el" href="structlws__email.html#a39ef6263d58eb40cca417c8697b227d8">lws_email</a>
+</li>
+<li>open
+: <a class="el" href="structlws__plat__file__ops.html#ad37a97abc68d0af967cef874f4d8df32">lws_plat_file_ops</a>
+</li>
+<li>option_index
+: <a class="el" href="structlws__ext__option__arg.html#af57fffcfa253dfa8d98681ac1fb1785f">lws_ext_option_arg</a>
+</li>
+<li>option_name
+: <a class="el" href="structlws__ext__option__arg.html#a0a320c56b79271b8f059eeaad9423ac9">lws_ext_option_arg</a>
+</li>
+<li>options
+: <a class="el" href="structlws__context__creation__info.html#a9d3b17a25e1fbc772f21eb4959a82724">lws_context_creation_info</a>
+, <a class="el" href="structlws__protocol__vhost__options.html#afd99fbc90be51ea2465b550c2ec47822">lws_protocol_vhost_options</a>
+</li>
+<li>origin
+: <a class="el" href="structlws__client__connect__info.html#a8595f83e64147cb687b6418cf500dd4c">lws_client_connect_info</a>
+, <a class="el" href="structlws__http__mount.html#a21d86fd6043ec00e121ababbc29af39a">lws_http_mount</a>
+</li>
+<li>origin_protocol
+: <a class="el" href="structlws__http__mount.html#a6a9b1492a0b9749e39bd19932717a0b7">lws_http_mount</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_p"></a>- p -</h3><ul>
+<li>p
+: <a class="el" href="structlws__process__html__args.html#a11859d8bedd379fbf64543b25c65fe14">lws_process_html_args</a>
+</li>
+<li>parent_wsi
+: <a class="el" href="structlws__client__connect__info.html#a6843a60e1050b10db9d98d7eeb45f587">lws_client_connect_info</a>
+</li>
+<li>path
+: <a class="el" href="structlws__client__connect__info.html#a76a8388733f114fb8fd3643874781185">lws_client_connect_info</a>
+</li>
+<li>per_session_data_size
+: <a class="el" href="structlws__protocols.html#a9bbd85f591ffb4259711cb5acbb05bea">lws_protocols</a>
+</li>
+<li>plugin_dirs
+: <a class="el" href="structlws__context__creation__info.html#a8122cfc0810bafe51edb3ba6bf9a1251">lws_context_creation_info</a>
+</li>
+<li>port
+: <a class="el" href="structlws__client__connect__info.html#a1af124d81c3c22a46d39387c5bc3d6b9">lws_client_connect_info</a>
+, <a class="el" href="structlws__context__creation__info.html#a424a5ce268d6903e42243be94487ab85">lws_context_creation_info</a>
+</li>
+<li>pos
+: <a class="el" href="structlws__process__html__state.html#a53234f2948812c7208a256f9f5b23c20">lws_process_html_state</a>
+</li>
+<li>prev_events
+: <a class="el" href="structlws__pollargs.html#a437fec0de5cf264371e1ab5a401e86d8">lws_pollargs</a>
+</li>
+<li>protocol
+: <a class="el" href="structlws__client__connect__info.html#aba35adfb74845a5fd0c3dc141cbdddd2">lws_client_connect_info</a>
+, <a class="el" href="structlws__http__mount.html#a05347d92c3d379809564bd4f3eab259b">lws_http_mount</a>
+</li>
+<li>protocols
+: <a class="el" href="structlws__context__creation__info.html#abb90ffb3e6d6db2db20f529d61bd9122">lws_context_creation_info</a>
+, <a class="el" href="structlws__plugin__capability.html#a6a4d9d01e770f378ddadc77b37522033">lws_plugin_capability</a>
+</li>
+<li>provided_client_ssl_ctx
+: <a class="el" href="structlws__context__creation__info.html#a1654d41bea6fb2f619b57e6a264b26a4">lws_context_creation_info</a>
+</li>
+<li>pt_serv_buf_size
+: <a class="el" href="structlws__context__creation__info.html#a57f88c0745adbd1d6b9b619b8de30209">lws_context_creation_info</a>
+</li>
+<li>pvo
+: <a class="el" href="structlws__context__creation__info.html#a999866fcd15dbd621773436f97190458">lws_context_creation_info</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_r"></a>- r -</h3><ul>
+<li>read
+: <a class="el" href="structlws__plat__file__ops.html#a01f483807a9862736b17ba9ed5110c40">lws_plat_file_ops</a>
+</li>
+<li>replace
+: <a class="el" href="structlws__process__html__state.html#a693d2fb45378afee5da29b539c1ea644">lws_process_html_state</a>
+</li>
+<li>revents
+: <a class="el" href="structlws__pollfd.html#ae7cecfe7511c59d4a3a44f876d030932">lws_pollfd</a>
+, <a class="el" href="structpollfd.html#aafb457d11cac415faf0e1e2b825118c2">pollfd</a>
+</li>
+<li>rx_buffer_size
+: <a class="el" href="structlws__protocols.html#a0d1d4996d81b2f5e125bcec981e461c5">lws_protocols</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_s"></a>- s -</h3><ul>
+<li>seek_cur
+: <a class="el" href="structlws__plat__file__ops.html#abfcda19b003dcc13c61ff9e2bb4ff869">lws_plat_file_ops</a>
+</li>
+<li>server_string
+: <a class="el" href="structlws__context__creation__info.html#a137a9b9de4f6a7993fed8746d551e616">lws_context_creation_info</a>
+</li>
+<li>session
+: <a class="el" href="structlws__session__info.html#a4353b5dd19400b2b15edfd7cee1e4cd5">lws_session_info</a>
+</li>
+<li>ssl_ca_filepath
+: <a class="el" href="structlws__context__creation__info.html#a4f8e65c3a059d3b586fafa9ef3282c29">lws_context_creation_info</a>
+</li>
+<li>ssl_cert_filepath
+: <a class="el" href="structlws__context__creation__info.html#ac62b0f0e8e402412ba5011d15c244103">lws_context_creation_info</a>
+</li>
+<li>ssl_cipher_list
+: <a class="el" href="structlws__context__creation__info.html#a3e1516fd7fed26bfa77c0246ed26c2eb">lws_context_creation_info</a>
+</li>
+<li>ssl_connection
+: <a class="el" href="structlws__client__connect__info.html#a9862297827639238a7a0b4054c3ddf3d">lws_client_connect_info</a>
+</li>
+<li>ssl_options_clear
+: <a class="el" href="structlws__context__creation__info.html#adb0bc0b28cd7d90ab306723d8ffa96fa">lws_context_creation_info</a>
+</li>
+<li>ssl_options_set
+: <a class="el" href="structlws__context__creation__info.html#a704940261951ced6b5d8191bd8b9bb2d">lws_context_creation_info</a>
+</li>
+<li>ssl_private_key_filepath
+: <a class="el" href="structlws__context__creation__info.html#ab9ec8893e0f7843cf5d783d2f350ef14">lws_context_creation_info</a>
+</li>
+<li>ssl_private_key_password
+: <a class="el" href="structlws__context__creation__info.html#af3fb447be15c4fcb01d3285a6678ab54">lws_context_creation_info</a>
+</li>
+<li>start
+: <a class="el" href="structlws__ext__option__arg.html#a0b1f7b30c3ceaf5f1bf9d105c24568d1">lws_ext_option_arg</a>
+, <a class="el" href="structlws__process__html__state.html#af0732884ef891e24fe5fa237ebaa21a3">lws_process_html_state</a>
+</li>
+<li>stdwsi
+: <a class="el" href="structlws__cgi__args.html#a4ccc1058e7e914a26eef31ab2ad46aa1">lws_cgi_args</a>
+</li>
+<li>swallow
+: <a class="el" href="structlws__process__html__state.html#a71982bc1cbd8cf876ca0f545144404eb">lws_process_html_state</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_t"></a>- t -</h3><ul>
+<li>timeout_email
+: <a class="el" href="structlws__email.html#a77723e2f2b940b1c879ef5e1cd88c2be">lws_email</a>
+</li>
+<li>timeout_secs
+: <a class="el" href="structlws__context__creation__info.html#a6cfa3d51df2def3349a5cbf0d712822d">lws_context_creation_info</a>
+</li>
+<li>token
+: <a class="el" href="structlws__tokens.html#a9f3635412bc71a5cb78e9862b55f10cd">lws_tokens</a>
+</li>
+<li>token_len
+: <a class="el" href="structlws__tokens.html#a855b7375d1d58516c0ecd4b60e9a7766">lws_tokens</a>
+</li>
+<li>token_limit
+: <a class="el" href="structlws__token__limits.html#a6ec712306cbf8585bce7a56758a3ceff">lws_token_limits</a>
+</li>
+<li>token_limits
+: <a class="el" href="structlws__context__creation__info.html#ac8a75b7b259a3c3a5fbb4219a3f06c29">lws_context_creation_info</a>
+</li>
+<li>type
+: <a class="el" href="structlws__ext__options.html#a7c4dbd62dbeba63a9d50d2306bd1cc61">lws_ext_options</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_u"></a>- u -</h3><ul>
+<li>uid
+: <a class="el" href="structlws__context__creation__info.html#ac105b4180008cb3e672d57beead8382e">lws_context_creation_info</a>
+</li>
+<li>uri_replace_from
+: <a class="el" href="structlws__client__connect__info.html#a03c305fdca809667b6a9a83b3edfd83a">lws_client_connect_info</a>
+</li>
+<li>uri_replace_to
+: <a class="el" href="structlws__client__connect__info.html#a9959ba103d3d2484e559a9f7879eebe3">lws_client_connect_info</a>
+</li>
+<li>user
+: <a class="el" href="structlws__context__creation__info.html#a0e9d94cdfb893d777b4a4db81e7b5ac0">lws_context_creation_info</a>
+, <a class="el" href="structlws__protocols.html#a3cbd903ad076736ae934a54cae36580e">lws_protocols</a>
+</li>
+<li>userdata
+: <a class="el" href="structlws__client__connect__info.html#a9831b9f9ab54a1aec4bb15324f1c3836">lws_client_connect_info</a>
+</li>
+<li>username
+: <a class="el" href="structlws__gs__event__args.html#a2bec693d8a43730d487004a44326178b">lws_gs_event_args</a>
+, <a class="el" href="structlws__session__info.html#a3d57a70b6e7181d95a8bec429b1a7697">lws_session_info</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_v"></a>- v -</h3><ul>
+<li>value
+: <a class="el" href="structlws__protocol__vhost__options.html#a0640a92513c70ee6b9b295a9ad1658e7">lws_protocol_vhost_options</a>
+</li>
+<li>vars
+: <a class="el" href="structlws__process__html__state.html#a3b113e00c03a2fded51b1c85ff5bf077">lws_process_html_state</a>
+</li>
+<li>vhost
+: <a class="el" href="structlws__client__connect__info.html#a3893181d728f326f9f5b47c1459cb8be">lws_client_connect_info</a>
+</li>
+<li>vhost_name
+: <a class="el" href="structlws__context__creation__info.html#ad50db098a208f045f7811207d2bee4b9">lws_context_creation_info</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_w"></a>- w -</h3><ul>
+<li>write
+: <a class="el" href="structlws__plat__file__ops.html#a1fae8330ee94649a3551e31a30809793">lws_plat_file_ops</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">Generated by
+ <a href="http://www.doxygen.org/index.html">
+ <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.11 </li>
+ </ul>
+</div>
+</body>
+</html>
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.11"/>
+<title>libwebsockets: Globals</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="libwebsockets.org-logo.png"/></td>
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname">libwebsockets
+ </div>
+ <div id="projectbrief">Lightweight C library for HTML5 websockets</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.11 -->
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main Page</span></a></li>
+ <li><a href="pages.html"><span>Related Pages</span></a></li>
+ <li><a href="modules.html"><span>Modules</span></a></li>
+ <li><a href="annotated.html"><span>Data Structures</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File List</span></a></li>
+ <li class="current"><a href="globals.html"><span>Globals</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li class="current"><a href="globals.html"><span>All</span></a></li>
+ <li><a href="globals_func.html"><span>Functions</span></a></li>
+ <li><a href="globals_type.html"><span>Typedefs</span></a></li>
+ <li><a href="globals_enum.html"><span>Enumerations</span></a></li>
+ <li><a href="globals_eval.html"><span>Enumerator</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li class="current"><a href="globals.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_l.html#index_l"><span>l</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals.html','');});
+</script>
+<div id="doc-content">
+<div class="contents">
+<div class="textblock">Here is a list of all documented functions, variables, defines, enums, and typedefs with links to the documentation:</div>
+
+<h3><a class="anchor" id="index_e"></a>- e -</h3><ul>
+<li>EXTARG_DEC
+: <a class="el" href="group__extensions.html#ggacc9f55936dc165257a2e1f7d47bce89ea1c86adf924c8786a12bee9687094673e">libwebsockets.h</a>
+</li>
+<li>EXTARG_NONE
+: <a class="el" href="group__extensions.html#ggacc9f55936dc165257a2e1f7d47bce89eaabcf56c456c1ff6e81dc82586a16f14c">libwebsockets.h</a>
+</li>
+<li>EXTARG_OPT_DEC
+: <a class="el" href="group__extensions.html#ggacc9f55936dc165257a2e1f7d47bce89ea5265abe3e1c3f64412f2affe7bffd880">libwebsockets.h</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">Generated by
+ <a href="http://www.doxygen.org/index.html">
+ <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.11 </li>
+ </ul>
+</div>
+</body>
+</html>
--- /dev/null
+var globals_dup =
+[
+ [ "e", "globals.html", null ],
+ [ "l", "globals_l.html", null ]
+];
\ No newline at end of file
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.11"/>
+<title>libwebsockets: Globals</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="libwebsockets.org-logo.png"/></td>
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname">libwebsockets
+ </div>
+ <div id="projectbrief">Lightweight C library for HTML5 websockets</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.11 -->
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main Page</span></a></li>
+ <li><a href="pages.html"><span>Related Pages</span></a></li>
+ <li><a href="modules.html"><span>Modules</span></a></li>
+ <li><a href="annotated.html"><span>Data Structures</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File List</span></a></li>
+ <li class="current"><a href="globals.html"><span>Globals</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="globals.html"><span>All</span></a></li>
+ <li><a href="globals_func.html"><span>Functions</span></a></li>
+ <li><a href="globals_type.html"><span>Typedefs</span></a></li>
+ <li class="current"><a href="globals_enum.html"><span>Enumerations</span></a></li>
+ <li><a href="globals_eval.html"><span>Enumerator</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_enum.html','');});
+</script>
+<div id="doc-content">
+<div class="contents">
+ <ul>
+<li>lws_callback_reasons
+: <a class="el" href="group__usercb.html#gad62860e19975ba4c4af401c3cdb6abf7">libwebsockets.h</a>
+</li>
+<li>lws_close_status
+: <a class="el" href="group__wsclose.html#gae399c571df32ba532c0ca67da9284985">libwebsockets.h</a>
+</li>
+<li>lws_context_options
+: <a class="el" href="group__context-and-vhost.html#ga41c2d763f78cc248df3b9f8645dbd2a5">libwebsockets.h</a>
+</li>
+<li>lws_ext_options_types
+: <a class="el" href="group__extensions.html#gacc9f55936dc165257a2e1f7d47bce89e">libwebsockets.h</a>
+</li>
+<li>lws_gs_event
+: <a class="el" href="group__generic-sessions.html#gaa93946b3d921072209d5cd8cdfa5332e">libwebsockets.h</a>
+</li>
+<li>lws_mount_protocols
+: <a class="el" href="group__vhost-mounts.html#ga31eca18e50cb4357480f2fcad36ff437">libwebsockets.h</a>
+</li>
+<li>lws_spa_fileupload_states
+: <a class="el" href="group__form-parsing.html#ga41a74a822771d3dce89751aa3bce28ae">libwebsockets.h</a>
+</li>
+<li>lws_write_protocol
+: <a class="el" href="group__sending-data.html#ga98b099cf8c1c7e38ad78501f270e193d">libwebsockets.h</a>
+</li>
+<li>lwsgs_auth_bits
+: <a class="el" href="group__generic-sessions.html#ga7c2dc7bfb4ccb91c5d771f9e9ea237e1">libwebsockets.h</a>
+</li>
+<li>lwsgs_smtp_states
+: <a class="el" href="group__smtp.html#ga116be79bf44f9dc2a97f46e051fe4dc0">libwebsockets.h</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">Generated by
+ <a href="http://www.doxygen.org/index.html">
+ <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.11 </li>
+ </ul>
+</div>
+</body>
+</html>
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.11"/>
+<title>libwebsockets: Globals</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="libwebsockets.org-logo.png"/></td>
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname">libwebsockets
+ </div>
+ <div id="projectbrief">Lightweight C library for HTML5 websockets</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.11 -->
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main Page</span></a></li>
+ <li><a href="pages.html"><span>Related Pages</span></a></li>
+ <li><a href="modules.html"><span>Modules</span></a></li>
+ <li><a href="annotated.html"><span>Data Structures</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File List</span></a></li>
+ <li class="current"><a href="globals.html"><span>Globals</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="globals.html"><span>All</span></a></li>
+ <li><a href="globals_func.html"><span>Functions</span></a></li>
+ <li><a href="globals_type.html"><span>Typedefs</span></a></li>
+ <li><a href="globals_enum.html"><span>Enumerations</span></a></li>
+ <li class="current"><a href="globals_eval.html"><span>Enumerator</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="#index_e"><span>e</span></a></li>
+ <li class="current"><a href="#index_l"><span>l</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_eval.html','');});
+</script>
+<div id="doc-content">
+<div class="contents">
+ 
+
+<h3><a class="anchor" id="index_e"></a>- e -</h3><ul>
+<li>EXTARG_DEC
+: <a class="el" href="group__extensions.html#ggacc9f55936dc165257a2e1f7d47bce89ea1c86adf924c8786a12bee9687094673e">libwebsockets.h</a>
+</li>
+<li>EXTARG_NONE
+: <a class="el" href="group__extensions.html#ggacc9f55936dc165257a2e1f7d47bce89eaabcf56c456c1ff6e81dc82586a16f14c">libwebsockets.h</a>
+</li>
+<li>EXTARG_OPT_DEC
+: <a class="el" href="group__extensions.html#ggacc9f55936dc165257a2e1f7d47bce89ea5265abe3e1c3f64412f2affe7bffd880">libwebsockets.h</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_l"></a>- l -</h3><ul>
+<li>LGSSMTP_CONNECTED
+: <a class="el" href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0ab61778f70ecac007b334bb14942eb41d">libwebsockets.h</a>
+</li>
+<li>LGSSMTP_CONNECTING
+: <a class="el" href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0ab89442b7a3ca2b94c3cdcf33756eb933">libwebsockets.h</a>
+</li>
+<li>LGSSMTP_IDLE
+: <a class="el" href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a29e5b0ecf75375b5a643faa3d6222b7c">libwebsockets.h</a>
+</li>
+<li>LGSSMTP_SENT_BODY
+: <a class="el" href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a38fba41f28d754e38079b31418a86a69">libwebsockets.h</a>
+</li>
+<li>LGSSMTP_SENT_DATA
+: <a class="el" href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a85e3c452950c09a79086bff4b9be5c14">libwebsockets.h</a>
+</li>
+<li>LGSSMTP_SENT_FROM
+: <a class="el" href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a929bb4623ff3f585108aba2a1b047fab">libwebsockets.h</a>
+</li>
+<li>LGSSMTP_SENT_HELO
+: <a class="el" href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a1dfec948a864205cec875f63cbe0d4ad">libwebsockets.h</a>
+</li>
+<li>LGSSMTP_SENT_QUIT
+: <a class="el" href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a2c2ed16ffc572326e3040684084b21d5">libwebsockets.h</a>
+</li>
+<li>LGSSMTP_SENT_TO
+: <a class="el" href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0aae20a0cb95b97a70f6b45d0ed2d5be83">libwebsockets.h</a>
+</li>
+<li>LWS_CALLBACK_ADD_POLL_FD
+: <a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ab69783a9fbf2ca71ad70706bda77b412">libwebsockets.h</a>
+</li>
+<li>LWS_CALLBACK_CHANGE_MODE_POLL_FD
+: <a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aa87d2e82fffa42c3680c7403ef94216e">libwebsockets.h</a>
+</li>
+<li>LWS_CALLBACK_CLIENT_APPEND_HANDSHAKE_HEADER
+: <a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a909cc2a7018864b0b71abacc4058fd8f">libwebsockets.h</a>
+</li>
+<li>LWS_CALLBACK_CLIENT_CONFIRM_EXTENSION_SUPPORTED
+: <a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a1ce5b22039ca37ee224d00047596ea46">libwebsockets.h</a>
+</li>
+<li>LWS_CALLBACK_CLIENT_CONNECTION_ERROR
+: <a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ad8c6207b0c4e732f3d507f0fb79370e8">libwebsockets.h</a>
+</li>
+<li>LWS_CALLBACK_CLIENT_ESTABLISHED
+: <a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a7e12418eec9bce85735e6460176ab604">libwebsockets.h</a>
+</li>
+<li>LWS_CALLBACK_CLIENT_FILTER_PRE_ESTABLISH
+: <a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aa536e574a642ff3ab9e12bff7ba2c6a2">libwebsockets.h</a>
+</li>
+<li>LWS_CALLBACK_CLIENT_RECEIVE
+: <a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7abbbe7a0a67c5866ca9109d46823fc5b1">libwebsockets.h</a>
+</li>
+<li>LWS_CALLBACK_CLIENT_RECEIVE_PONG
+: <a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a136a7cec11c3afd13245623bd84e76c9">libwebsockets.h</a>
+</li>
+<li>LWS_CALLBACK_CLIENT_WRITEABLE
+: <a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a8e8b2e6dbeac76d8d126947d2166a514">libwebsockets.h</a>
+</li>
+<li>LWS_CALLBACK_CLOSED
+: <a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a48a9590e5e18c7920282e094a0bfd9d8">libwebsockets.h</a>
+</li>
+<li>LWS_CALLBACK_CLOSED_HTTP
+: <a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a838b18d255c1b94a533287ba302a2eba">libwebsockets.h</a>
+</li>
+<li>LWS_CALLBACK_CONFIRM_EXTENSION_OKAY
+: <a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a390da3639296660a78cc1a5dcb19037e">libwebsockets.h</a>
+</li>
+<li>LWS_CALLBACK_DEL_POLL_FD
+: <a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a1df60f314710236f9b53efbf468da768">libwebsockets.h</a>
+</li>
+<li>LWS_CALLBACK_ESTABLISHED
+: <a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a24d39bf1cfc0bad9d92da9ac1717e439">libwebsockets.h</a>
+</li>
+<li>LWS_CALLBACK_FILTER_HTTP_CONNECTION
+: <a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a75199176c82c1a56e4a6bbf1cc30c12c">libwebsockets.h</a>
+</li>
+<li>LWS_CALLBACK_FILTER_NETWORK_CONNECTION
+: <a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a026502768778b8d79d62dd0fe4375fc6">libwebsockets.h</a>
+</li>
+<li>LWS_CALLBACK_FILTER_PROTOCOL_CONNECTION
+: <a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7accd8753672d319a30b4b4c2fb775e84d">libwebsockets.h</a>
+</li>
+<li>LWS_CALLBACK_GET_THREAD_ID
+: <a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7adfb41c92e2522712207ef7f2462b5e34">libwebsockets.h</a>
+</li>
+<li>LWS_CALLBACK_HTTP
+: <a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ae8d1de0bb56e03aa58cb4d44b18edd2e">libwebsockets.h</a>
+</li>
+<li>LWS_CALLBACK_HTTP_BODY
+: <a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ac4c68e00efcf1ff7bda7ada462aff8ae">libwebsockets.h</a>
+</li>
+<li>LWS_CALLBACK_HTTP_BODY_COMPLETION
+: <a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a2fce9a8608220f32abbf1422a5498804">libwebsockets.h</a>
+</li>
+<li>LWS_CALLBACK_HTTP_FILE_COMPLETION
+: <a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aa627548e1296e654fcfab463ec3c9587">libwebsockets.h</a>
+</li>
+<li>LWS_CALLBACK_HTTP_WRITEABLE
+: <a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7afedadfb3cde37a8ea4c84ed535f26d09">libwebsockets.h</a>
+</li>
+<li>LWS_CALLBACK_LOCK_POLL
+: <a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a8909732521d379179003d97ab7a05428">libwebsockets.h</a>
+</li>
+<li>LWS_CALLBACK_OPENSSL_CONTEXT_REQUIRES_PRIVATE_KEY
+: <a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aa46f705dcf97502e95627ffde614f98b">libwebsockets.h</a>
+</li>
+<li>LWS_CALLBACK_OPENSSL_LOAD_EXTRA_CLIENT_VERIFY_CERTS
+: <a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ae4986291b7a810fe290851d73bebeb1c">libwebsockets.h</a>
+</li>
+<li>LWS_CALLBACK_OPENSSL_LOAD_EXTRA_SERVER_VERIFY_CERTS
+: <a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a06006e98d27e1e884364d88317f83493">libwebsockets.h</a>
+</li>
+<li>LWS_CALLBACK_OPENSSL_PERFORM_CLIENT_CERT_VERIFICATION
+: <a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ae5ad65d779b7eab32ab67ceff91a3bac">libwebsockets.h</a>
+</li>
+<li>LWS_CALLBACK_PROTOCOL_DESTROY
+: <a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a54269ca88508e6efd3afdb9d360a9caa">libwebsockets.h</a>
+</li>
+<li>LWS_CALLBACK_PROTOCOL_INIT
+: <a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ad5d34583e3556e153eda91620b48cc49">libwebsockets.h</a>
+</li>
+<li>LWS_CALLBACK_RECEIVE
+: <a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a492c1b1c0ac0ed980042ee732fe2990c">libwebsockets.h</a>
+</li>
+<li>LWS_CALLBACK_RECEIVE_PONG
+: <a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a2db02fc6e1c17ab62b52109d1aa9d738">libwebsockets.h</a>
+</li>
+<li>LWS_CALLBACK_SERVER_NEW_CLIENT_INSTANTIATED
+: <a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ae9734e1d7af2abf291665ce9e4a728d3">libwebsockets.h</a>
+</li>
+<li>LWS_CALLBACK_SERVER_WRITEABLE
+: <a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a7ec8e2e9557ee02a4fc9f7dec7e2babc">libwebsockets.h</a>
+</li>
+<li>LWS_CALLBACK_UNLOCK_POLL
+: <a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a0e9e3dd667c0c42cdbe1a3d921f4fd79">libwebsockets.h</a>
+</li>
+<li>LWS_CALLBACK_USER
+: <a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a982579753e70e59a9ea13ce628ac891a">libwebsockets.h</a>
+</li>
+<li>LWS_CALLBACK_WS_PEER_INITIATED_CLOSE
+: <a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ac3fc5bbb55e69f90396526287ee84a51">libwebsockets.h</a>
+</li>
+<li>LWS_CALLBACK_WSI_CREATE
+: <a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7afd8fd77a1cc9405fcb4f26915d7f2d01">libwebsockets.h</a>
+</li>
+<li>LWS_CALLBACK_WSI_DESTROY
+: <a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aca834dc035b7f7486f9ce40fde54fe9e">libwebsockets.h</a>
+</li>
+<li>LWS_CLOSE_STATUS_ABNORMAL_CLOSE
+: <a class="el" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a68b3d34bebd88547dcfa5cadba0acd6c">libwebsockets.h</a>
+</li>
+<li>LWS_CLOSE_STATUS_EXTENSION_REQUIRED
+: <a class="el" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985ac6a161822783ee873be1c66f48d14e0e">libwebsockets.h</a>
+</li>
+<li>LWS_CLOSE_STATUS_GOINGAWAY
+: <a class="el" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a9737a68759e739856b150ff9dfa30218">libwebsockets.h</a>
+</li>
+<li>LWS_CLOSE_STATUS_INVALID_PAYLOAD
+: <a class="el" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a7aef2da0062da606eeb35aaca5cf9050">libwebsockets.h</a>
+</li>
+<li>LWS_CLOSE_STATUS_MESSAGE_TOO_LARGE
+: <a class="el" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a2e1f0113494a58e762eed3d22e7080d8">libwebsockets.h</a>
+</li>
+<li>LWS_CLOSE_STATUS_NO_STATUS
+: <a class="el" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a4b8a3b7ce6f731e5248e4b0fb64a5044">libwebsockets.h</a>
+</li>
+<li>LWS_CLOSE_STATUS_NORMAL
+: <a class="el" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a3ffa38d5081b85fb739e02a747ccf2c4">libwebsockets.h</a>
+</li>
+<li>LWS_CLOSE_STATUS_POLICY_VIOLATION
+: <a class="el" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985ad09e68295eabdddcba4e332fbea70ae5">libwebsockets.h</a>
+</li>
+<li>LWS_CLOSE_STATUS_PROTOCOL_ERR
+: <a class="el" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a1bb501d212fa4d57053db681b1dfab98">libwebsockets.h</a>
+</li>
+<li>LWS_CLOSE_STATUS_RESERVED
+: <a class="el" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985af90cb98d983ad3d4c79df9b6f3d4a4d2">libwebsockets.h</a>
+</li>
+<li>LWS_CLOSE_STATUS_TLS_FAILURE
+: <a class="el" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985ad2b477a91c8445bf34ecd43977f9b390">libwebsockets.h</a>
+</li>
+<li>LWS_CLOSE_STATUS_UNACCEPTABLE_OPCODE
+: <a class="el" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a462c99b05459df700919cfd3f53c8276">libwebsockets.h</a>
+</li>
+<li>LWS_CLOSE_STATUS_UNEXPECTED_CONDITION
+: <a class="el" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985ad0869604d79e13700ae5d196a431b350">libwebsockets.h</a>
+</li>
+<li>LWS_SERVER_OPTION_ALLOW_NON_SSL_ON_SSL_PORT
+: <a class="el" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a1cc4562d05cba52a6dfa0697a65ade0d">libwebsockets.h</a>
+</li>
+<li>LWS_SERVER_OPTION_DISABLE_IPV6
+: <a class="el" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a34ab36e68c0d593b6f19b8d5ef1240a9">libwebsockets.h</a>
+</li>
+<li>LWS_SERVER_OPTION_DISABLE_OS_CA_CERTS
+: <a class="el" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a4933347a821e73c3f1e13fb6bfc7ad93">libwebsockets.h</a>
+</li>
+<li>LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT
+: <a class="el" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a7fed6a527c8d5e0acac1b4179644583a">libwebsockets.h</a>
+</li>
+<li>LWS_SERVER_OPTION_EXPLICIT_VHOSTS
+: <a class="el" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5accc9d0d11d1124a21659586164b0962e">libwebsockets.h</a>
+</li>
+<li>LWS_SERVER_OPTION_IPV6_V6ONLY_MODIFY
+: <a class="el" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5af62887536e25e053e68741006dba46d8">libwebsockets.h</a>
+</li>
+<li>LWS_SERVER_OPTION_IPV6_V6ONLY_VALUE
+: <a class="el" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5aca5d42820b65eac5618ec3f0bd8a1160">libwebsockets.h</a>
+</li>
+<li>LWS_SERVER_OPTION_LIBEV
+: <a class="el" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a273d9975675130de0c6dc937dde7c8a6">libwebsockets.h</a>
+</li>
+<li>LWS_SERVER_OPTION_LIBUV
+: <a class="el" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5aff121db04a10cf8b2c5df9d4f2b89f1e">libwebsockets.h</a>
+</li>
+<li>LWS_SERVER_OPTION_PEER_CERT_NOT_REQUIRED
+: <a class="el" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5ac56a8a6590e74a8016d0fae09fb404fc">libwebsockets.h</a>
+</li>
+<li>LWS_SERVER_OPTION_REDIRECT_HTTP_TO_HTTPS
+: <a class="el" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a4832187186c4d130c68051214cd42ada">libwebsockets.h</a>
+</li>
+<li>LWS_SERVER_OPTION_REQUIRE_VALID_OPENSSL_CLIENT_CERT
+: <a class="el" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a274ed462a1a9239eb6ddf9007f5b7092">libwebsockets.h</a>
+</li>
+<li>LWS_SERVER_OPTION_SKIP_SERVER_CANONICAL_NAME
+: <a class="el" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a6582c985ee0ceaadc1d277030eae2d7c">libwebsockets.h</a>
+</li>
+<li>LWS_SERVER_OPTION_SSL_ECDH
+: <a class="el" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a1b2f8bde0f62adc7ebe81b2043f34c0c">libwebsockets.h</a>
+</li>
+<li>LWS_SERVER_OPTION_STS
+: <a class="el" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5ac962efd35abf6c402f9fb14aa14f5016">libwebsockets.h</a>
+</li>
+<li>LWS_SERVER_OPTION_UNIX_SOCK
+: <a class="el" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a9637e9001d8c8b2521086bcafbd8a941">libwebsockets.h</a>
+</li>
+<li>LWS_SERVER_OPTION_VALIDATE_UTF8
+: <a class="el" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5aa0158b4e85420811e6b0f1378c6ded0f">libwebsockets.h</a>
+</li>
+<li>LWS_UFS_CONTENT
+: <a class="el" href="group__form-parsing.html#gga41a74a822771d3dce89751aa3bce28aead3a958e7719ac273c3ba4f684f00c87f">libwebsockets.h</a>
+</li>
+<li>LWS_UFS_FINAL_CONTENT
+: <a class="el" href="group__form-parsing.html#gga41a74a822771d3dce89751aa3bce28aea6ce2a55a4c3695cdb640c893d95bd3a7">libwebsockets.h</a>
+</li>
+<li>LWS_UFS_OPEN
+: <a class="el" href="group__form-parsing.html#gga41a74a822771d3dce89751aa3bce28aea2d25de44865bd44e5a3903a2bab9ca83">libwebsockets.h</a>
+</li>
+<li>LWS_WRITE_BINARY
+: <a class="el" href="group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193daf6486c0dba50c44198100717721d9ab2">libwebsockets.h</a>
+</li>
+<li>LWS_WRITE_CLIENT_IGNORE_XOR_MASK
+: <a class="el" href="group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193da220d8e8652d9b97fb66e476e2a60ffce">libwebsockets.h</a>
+</li>
+<li>LWS_WRITE_CONTINUATION
+: <a class="el" href="group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193da10047eb05b5e1c298151dc47a5b44826">libwebsockets.h</a>
+</li>
+<li>LWS_WRITE_HTTP
+: <a class="el" href="group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193dabb6705e1d1327cdda5025be28f07712e">libwebsockets.h</a>
+</li>
+<li>LWS_WRITE_HTTP_HEADERS
+: <a class="el" href="group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193dafe5a38e940ce56708ac814627e9c0917">libwebsockets.h</a>
+</li>
+<li>LWS_WRITE_NO_FIN
+: <a class="el" href="group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193da115440f272a5d55518adfc8099acfee3">libwebsockets.h</a>
+</li>
+<li>LWS_WRITE_TEXT
+: <a class="el" href="group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193da80e8f169fda236c56bfb795ed62903db">libwebsockets.h</a>
+</li>
+<li>LWSGS_AUTH_ADMIN
+: <a class="el" href="group__generic-sessions.html#gga7c2dc7bfb4ccb91c5d771f9e9ea237e1a0657a9e846814781b128c397fe4b10bf">libwebsockets.h</a>
+</li>
+<li>LWSGS_AUTH_FORGOT_FLOW
+: <a class="el" href="group__generic-sessions.html#gga7c2dc7bfb4ccb91c5d771f9e9ea237e1a2cd8fb86e3b85c106e7711c03f0ddd0a">libwebsockets.h</a>
+</li>
+<li>LWSGS_AUTH_LOGGED_IN
+: <a class="el" href="group__generic-sessions.html#gga7c2dc7bfb4ccb91c5d771f9e9ea237e1a81e63075115dedd150265d81b8f7fa57">libwebsockets.h</a>
+</li>
+<li>LWSGS_AUTH_VERIFIED
+: <a class="el" href="group__generic-sessions.html#gga7c2dc7bfb4ccb91c5d771f9e9ea237e1a5a607e4668d20cadada62c4b8007f887">libwebsockets.h</a>
+</li>
+<li>LWSGSE_CREATED
+: <a class="el" href="group__generic-sessions.html#ggaa93946b3d921072209d5cd8cdfa5332ea596010a165bf13473c5eea3a34cd4308">libwebsockets.h</a>
+</li>
+<li>LWSGSE_DELETED
+: <a class="el" href="group__generic-sessions.html#ggaa93946b3d921072209d5cd8cdfa5332ead908cdc5689c5d22c9d3c8934e94dcde">libwebsockets.h</a>
+</li>
+<li>LWSMPRO_CALLBACK
+: <a class="el" href="group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437a946a88cf9c852eed2c0317f4115d19da">libwebsockets.h</a>
+</li>
+<li>LWSMPRO_CGI
+: <a class="el" href="group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437a13ab58b01ac6e05f595977f1e0f0db69">libwebsockets.h</a>
+</li>
+<li>LWSMPRO_FILE
+: <a class="el" href="group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437a42f2361cfe76cd287fa8fcfc502357e2">libwebsockets.h</a>
+</li>
+<li>LWSMPRO_HTTP
+: <a class="el" href="group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437a1e9f0842b0e85db50fe648ed4ba9a4b0">libwebsockets.h</a>
+</li>
+<li>LWSMPRO_HTTPS
+: <a class="el" href="group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437afbd10eb4777517ed1f6bfdcf3b9ea1d1">libwebsockets.h</a>
+</li>
+<li>LWSMPRO_REDIR_HTTP
+: <a class="el" href="group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437aec137a2434851bd856ceebfb697b9970">libwebsockets.h</a>
+</li>
+<li>LWSMPRO_REDIR_HTTPS
+: <a class="el" href="group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437a8894d16316863077dfe530963ca59f67">libwebsockets.h</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">Generated by
+ <a href="http://www.doxygen.org/index.html">
+ <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.11 </li>
+ </ul>
+</div>
+</body>
+</html>
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.11"/>
+<title>libwebsockets: Globals</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="libwebsockets.org-logo.png"/></td>
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname">libwebsockets
+ </div>
+ <div id="projectbrief">Lightweight C library for HTML5 websockets</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.11 -->
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main Page</span></a></li>
+ <li><a href="pages.html"><span>Related Pages</span></a></li>
+ <li><a href="modules.html"><span>Modules</span></a></li>
+ <li><a href="annotated.html"><span>Data Structures</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File List</span></a></li>
+ <li class="current"><a href="globals.html"><span>Globals</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="globals.html"><span>All</span></a></li>
+ <li class="current"><a href="globals_func.html"><span>Functions</span></a></li>
+ <li><a href="globals_type.html"><span>Typedefs</span></a></li>
+ <li><a href="globals_enum.html"><span>Enumerations</span></a></li>
+ <li><a href="globals_eval.html"><span>Enumerator</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li class="current"><a href="#index_l"><span>l</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_func.html','');});
+</script>
+<div id="doc-content">
+<div class="contents">
+ 
+
+<h3><a class="anchor" id="index_l"></a>- l -</h3><ul>
+<li>lws_add_http_header_by_name()
+: <a class="el" href="group__HTTP-headers-create.html#ga2b36bf44405755ff51c1939303b995a8">libwebsockets.h</a>
+</li>
+<li>lws_add_http_header_by_token()
+: <a class="el" href="group__HTTP-headers-create.html#gaf74adb761b22566ad70004882712dce1">libwebsockets.h</a>
+</li>
+<li>lws_add_http_header_content_length()
+: <a class="el" href="group__HTTP-headers-create.html#gacc76a5babcb4dce1b01b1955aa7a2faf">libwebsockets.h</a>
+</li>
+<li>lws_add_http_header_status()
+: <a class="el" href="group__HTTP-headers-create.html#ga29b7d6d2ddfdbaff3d8b607e7e3151b6">libwebsockets.h</a>
+</li>
+<li>lws_adopt_socket()
+: <a class="el" href="group__sock-adopt.html#gabe71b7462afb21c767bdc67334f305af">libwebsockets.h</a>
+</li>
+<li>lws_adopt_socket_readbuf()
+: <a class="el" href="group__sock-adopt.html#gab2d045df0f81afe00891aaed312d552b">libwebsockets.h</a>
+</li>
+<li>lws_b64_decode_string()
+: <a class="el" href="group__sha.html#ga66316e6a5a0644a09d5a10e919dfdd8d">libwebsockets.h</a>
+</li>
+<li>lws_b64_encode_string()
+: <a class="el" href="group__sha.html#gaf39765e4a3b413efb65e4698b2ec3575">libwebsockets.h</a>
+</li>
+<li>lws_callback_all_protocol()
+: <a class="el" href="group__callback-when-writeable.html#gacf04bbe089f47c971c6408c5efe2ac70">libwebsockets.h</a>
+</li>
+<li>lws_callback_all_protocol_vhost()
+: <a class="el" href="group__callback-when-writeable.html#ga13c984d8c5a44a745fd02bc2fba36053">libwebsockets.h</a>
+</li>
+<li>lws_callback_on_writable()
+: <a class="el" href="group__callback-when-writeable.html#ga941caaa468bc507b1cae52275f58800d">libwebsockets.h</a>
+</li>
+<li>lws_callback_on_writable_all_protocol()
+: <a class="el" href="group__callback-when-writeable.html#gabbe4655c7eeb3eb1671b2323ec6b3107">libwebsockets.h</a>
+</li>
+<li>lws_callback_on_writable_all_protocol_vhost()
+: <a class="el" href="group__callback-when-writeable.html#ga8570860e191b62db264f2bac67354ea8">libwebsockets.h</a>
+</li>
+<li>lws_callback_vhost_protocols()
+: <a class="el" href="group__callback-when-writeable.html#ga60939cf0c073d933fde3d17f3591caf5">libwebsockets.h</a>
+</li>
+<li>lws_cancel_service()
+: <a class="el" href="group__service.html#ga53e3d0801dfda7960a7249dd559e68a2">libwebsockets.h</a>
+</li>
+<li>lws_cancel_service_pt()
+: <a class="el" href="group__service.html#ga29c246707997ab7a466aa709aecd2d7b">libwebsockets.h</a>
+</li>
+<li>lws_canonical_hostname()
+: <a class="el" href="group__net.html#gad0df22db2be9fc65a667a1e83f9a92a4">libwebsockets.h</a>
+</li>
+<li>lws_cgi()
+: <a class="el" href="libwebsockets_8h.html#af52923473c59e643a974d65e12290831">libwebsockets.h</a>
+</li>
+<li>lws_cgi_kill()
+: <a class="el" href="libwebsockets_8h.html#a27bb0b3cdcd0af839c928c253b521ff4">libwebsockets.h</a>
+</li>
+<li>lws_cgi_write_split_stdout_headers()
+: <a class="el" href="libwebsockets_8h.html#a5326d3402af8429a166dd991dc65c4a2">libwebsockets.h</a>
+</li>
+<li>lws_chunked_html_process()
+: <a class="el" href="group__html-chunked-substitution.html#ga643073f918c0a7016b690aae9793fd60">libwebsockets.h</a>
+</li>
+<li>lws_client_connect()
+: <a class="el" href="group__client.html#ga4af0a20108a95e8b6d94dd4d80055ff3">libwebsockets.h</a>
+</li>
+<li>lws_client_connect_extended()
+: <a class="el" href="group__client.html#gac6a8558b4410961a880241c2ac1271e2">libwebsockets.h</a>
+</li>
+<li>lws_client_connect_via_info()
+: <a class="el" href="group__client.html#gac30a7be106abd0cedfbb2e8b8fe3a2f5">libwebsockets.h</a>
+</li>
+<li>lws_close_reason()
+: <a class="el" href="group__wsclose.html#gaa1c863415d1783cd8de7938aa6efa262">libwebsockets.h</a>
+</li>
+<li>lws_context_destroy()
+: <a class="el" href="group__context-and-vhost.html#ga8ee0314028755f1ddfa9428e09b4fddb">libwebsockets.h</a>
+</li>
+<li>lws_context_user()
+: <a class="el" href="group__context-and-vhost.html#gaeb12f934bfd178bd2132a9e73fc641da">libwebsockets.h</a>
+</li>
+<li>lws_create_context()
+: <a class="el" href="group__context-and-vhost.html#gaf2fff58562caab7510c41eeac85a8648">libwebsockets.h</a>
+</li>
+<li>lws_create_vhost()
+: <a class="el" href="group__context-and-vhost.html#ga0c54c667ccd9b8b3dddcd123ca72f87c">libwebsockets.h</a>
+</li>
+<li>lws_daemonize()
+: <a class="el" href="group__misc.html#gace5171b1dbbc03ec89a98f8afdb5c9af">libwebsockets.h</a>
+</li>
+<li>lws_email_check()
+: <a class="el" href="group__smtp.html#ga5e535e346d92a9daf00be33abf79d4eb">libwebsockets.h</a>
+</li>
+<li>lws_email_destroy()
+: <a class="el" href="group__smtp.html#ga25298a5afc1074e13b2d5711a86432b2">libwebsockets.h</a>
+</li>
+<li>lws_email_init()
+: <a class="el" href="group__smtp.html#ga77fc9b56a1bb39484844981ec375fc29">libwebsockets.h</a>
+</li>
+<li>lws_ext_parse_options()
+: <a class="el" href="group__extensions.html#ga6fb3e2c3dfb9d64dc87026a4e99c128b">libwebsockets.h</a>
+</li>
+<li>lws_extension_callback_pm_deflate()
+: <a class="el" href="group__extensions.html#ga4cdbe42d872e21a448a947714d6c607e">libwebsockets.h</a>
+</li>
+<li>lws_finalize_http_header()
+: <a class="el" href="group__HTTP-headers-create.html#ga4887605ff2242a54db3a7fa01f6f864b">libwebsockets.h</a>
+</li>
+<li>lws_finalize_startup()
+: <a class="el" href="group__Protocols-and-Plugins.html#ga106b37ae9c247e84d191ab09441adc43">libwebsockets.h</a>
+</li>
+<li>lws_frame_is_binary()
+: <a class="el" href="group__wsstatus.html#gaccd9c59336efad8af0554f79cc5966fd">libwebsockets.h</a>
+</li>
+<li>lws_get_child()
+: <a class="el" href="group__misc.html#gacae4d7b6a8d22e4c2d82ff8b12c1e234">libwebsockets.h</a>
+</li>
+<li>lws_get_context()
+: <a class="el" href="group__misc.html#ga0af4f7d2dd375aeedcfa7eb0e1101c4b">libwebsockets.h</a>
+</li>
+<li>lws_get_count_threads()
+: <a class="el" href="group__misc.html#ga629f48268fd1856b54b11172991b97d9">libwebsockets.h</a>
+</li>
+<li>lws_get_fops()
+: <a class="el" href="group__fops.html#gac08aef64c4c34647ed699b24759b6b0e">libwebsockets.h</a>
+</li>
+<li>lws_get_library_version()
+: <a class="el" href="group__misc.html#gac6abfc0b2bd5b2f09281a4432bb2f5f0">libwebsockets.h</a>
+</li>
+<li>lws_get_parent()
+: <a class="el" href="group__misc.html#ga8930fe36a3f3eefe4a6a4fd499d8e899">libwebsockets.h</a>
+</li>
+<li>lws_get_peer_addresses()
+: <a class="el" href="group__net.html#ga092e5f473b3347f03ffeef8a950080f3">libwebsockets.h</a>
+</li>
+<li>lws_get_peer_simple()
+: <a class="el" href="group__net.html#gad01014fed09759741b6d23afccfdaacc">libwebsockets.h</a>
+</li>
+<li>lws_get_peer_write_allowance()
+: <a class="el" href="group__callback-when-writeable.html#gac4643fe16b0940ae5b68b4ee6195cbde">libwebsockets.h</a>
+</li>
+<li>lws_get_protocol()
+: <a class="el" href="group__Protocols-and-Plugins.html#ga72ad550786ca7976463589d347e62112">libwebsockets.h</a>
+</li>
+<li>lws_get_random()
+: <a class="el" href="group__misc.html#ga58f906c6be0ca80efd813f694569dd4a">libwebsockets.h</a>
+</li>
+<li>lws_get_reserved_bits()
+: <a class="el" href="group__wsstatus.html#ga3df5045656dfb6b0e63a38de2dca79d2">libwebsockets.h</a>
+</li>
+<li>lws_get_socket_fd()
+: <a class="el" href="group__callback-when-writeable.html#gaa709e02a10558753c851e58f1e2c16ba">libwebsockets.h</a>
+</li>
+<li>lws_get_urlarg_by_name()
+: <a class="el" href="group__HTTP-headers-read.html#ga84e9ce5e71a77501a0998ac403a984c2">libwebsockets.h</a>
+</li>
+<li>lws_get_vhost()
+: <a class="el" href="group__context-and-vhost.html#ga06e77ce2916f8bc9826ef8d9d68e3932">libwebsockets.h</a>
+</li>
+<li>lws_hdr_copy()
+: <a class="el" href="group__HTTP-headers-read.html#ga6ce6aa1c0155ea42b7708bed271d1c77">libwebsockets.h</a>
+</li>
+<li>lws_hdr_copy_fragment()
+: <a class="el" href="group__HTTP-headers-read.html#gaa427cad61a9a5e3004afd65c4527b5e9">libwebsockets.h</a>
+</li>
+<li>lws_hdr_fragment_length()
+: <a class="el" href="group__HTTP-headers-read.html#ga594f3d0ece5b09c2ccf9f98ea533bb4e">libwebsockets.h</a>
+</li>
+<li>lws_hdr_total_length()
+: <a class="el" href="group__HTTP-headers-read.html#ga8ade0e1ffb0da7e62b989d8d867bf6c8">libwebsockets.h</a>
+</li>
+<li>lws_http_redirect()
+: <a class="el" href="group__http.html#ga8fbf01e473ac421fc33ad9f8da8b8a25">libwebsockets.h</a>
+</li>
+<li>lws_http_transaction_completed()
+: <a class="el" href="group__http.html#gad27aed6c66a41b2b89ffe4da2a309e8a">libwebsockets.h</a>
+</li>
+<li>lws_init_vhost_client_ssl()
+: <a class="el" href="group__client.html#ga4f44b8230e6732816ca5cd8d1aaaf340">libwebsockets.h</a>
+</li>
+<li>lws_interface_to_sa()
+: <a class="el" href="group__net.html#ga869d8bdffb0f2a7ce08e3ce10d6be3d8">libwebsockets.h</a>
+</li>
+<li>lws_is_cgi()
+: <a class="el" href="group__wsstatus.html#ga4ad226d5e01024b4046f4a5a37199aa1">libwebsockets.h</a>
+</li>
+<li>lws_is_final_fragment()
+: <a class="el" href="group__wsstatus.html#ga08e9ee165fca503fd9427d55cfecac37">libwebsockets.h</a>
+</li>
+<li>lws_is_ssl()
+: <a class="el" href="group__wsstatus.html#ga26a140623d202dd2bf2004deb6994baa">libwebsockets.h</a>
+</li>
+<li>lws_json_dump_context()
+: <a class="el" href="group__context-and-vhost.html#gae2134657cdd2ea7a59e13ad314e4c50d">libwebsockets.h</a>
+</li>
+<li>lws_json_dump_vhost()
+: <a class="el" href="group__context-and-vhost.html#ga94e6cc2223c4eec316b13bcebc3628b6">libwebsockets.h</a>
+</li>
+<li>lws_json_purify()
+: <a class="el" href="group__pur.html#gab15187efcfa256b7c928562c182b92a3">libwebsockets.h</a>
+</li>
+<li>lws_now_secs()
+: <a class="el" href="group__misc.html#ga33bf2635033710b25f931b57ed663e1e">libwebsockets.h</a>
+</li>
+<li>lws_parse_uri()
+: <a class="el" href="group__misc.html#ga1ec0d9faac5d3a5824d765c287c043aa">libwebsockets.h</a>
+</li>
+<li>lws_partial_buffered()
+: <a class="el" href="group__wsstatus.html#gaeca4afc94b1f026034f99cbba37e2f85">libwebsockets.h</a>
+</li>
+<li>lws_protocol_get()
+: <a class="el" href="group__Protocols-and-Plugins.html#ga8bbe5e65faca068845704bab911a5030">libwebsockets.h</a>
+</li>
+<li>lws_protocol_vh_priv_get()
+: <a class="el" href="group__Protocols-and-Plugins.html#gaf3be4243443baac0f8be1fcfb4d25129">libwebsockets.h</a>
+</li>
+<li>lws_protocol_vh_priv_zalloc()
+: <a class="el" href="group__Protocols-and-Plugins.html#gaec0c0477288ff3f83aff38d357b883d1">libwebsockets.h</a>
+</li>
+<li>lws_remaining_packet_payload()
+: <a class="el" href="libwebsockets_8h.html#a72fe65e83b8bb03f904a1a256c673536">libwebsockets.h</a>
+</li>
+<li>lws_return_http_status()
+: <a class="el" href="group__http.html#gac8a4a71240857dc6b2ed70456b6923f4">libwebsockets.h</a>
+</li>
+<li>lws_rx_flow_allow_all_protocol()
+: <a class="el" href="libwebsockets_8h.html#a5e627dbf1db48170ef486edbaf268672">libwebsockets.h</a>
+</li>
+<li>lws_rx_flow_control()
+: <a class="el" href="libwebsockets_8h.html#adf4abd01e8c43f07c6e498ce13590c3e">libwebsockets.h</a>
+</li>
+<li>lws_send_pipe_choked()
+: <a class="el" href="group__wsstatus.html#ga2bb3655329b4651cd06f79ee3a764421">libwebsockets.h</a>
+</li>
+<li>lws_serve_http_file()
+: <a class="el" href="group__httpft.html#gab393a06d3d2722af4c3f8b06842c80d7">libwebsockets.h</a>
+</li>
+<li>lws_service()
+: <a class="el" href="group__service.html#gaf95bd0c663d6516a0c80047d9b1167a8">libwebsockets.h</a>
+</li>
+<li>lws_service_fd()
+: <a class="el" href="group__service.html#gad82efa5466d14a9f05aa06416375b28d">libwebsockets.h</a>
+</li>
+<li>lws_service_fd_tsi()
+: <a class="el" href="group__service.html#gaebf426eda371ba23642fc11d8e0ace6b">libwebsockets.h</a>
+</li>
+<li>lws_service_tsi()
+: <a class="el" href="group__service.html#ga9b3cc4473fd8848e5bbee7f310712939">libwebsockets.h</a>
+</li>
+<li>lws_set_allocator()
+: <a class="el" href="group__misc.html#gab321ed812f46f6dc7ef9e3ca6f00cf1b">libwebsockets.h</a>
+</li>
+<li>lws_set_extension_option()
+: <a class="el" href="group__extensions.html#gae0e24e1768f83a7fb07896ce975704b9">libwebsockets.h</a>
+</li>
+<li>lws_set_log_level()
+: <a class="el" href="group__log.html#ga244647f9e1bf0097ccdde66d74f41e26">libwebsockets.h</a>
+</li>
+<li>lws_set_proxy()
+: <a class="el" href="group__context-and-vhost.html#ga7e9d5405547a457d86e0b4f0ae2bb1c4">libwebsockets.h</a>
+</li>
+<li>lws_set_timeout()
+: <a class="el" href="group__timeout.html#gaced9f9237f6172fed9f730a2af51345a">libwebsockets.h</a>
+</li>
+<li>lws_SHA1()
+: <a class="el" href="group__sha.html#ga7b09ab74646266f0b555103b3bb8dfe5">libwebsockets.h</a>
+</li>
+<li>lws_spa_create()
+: <a class="el" href="group__form-parsing.html#ga162f86762173a2bc8c28497941d74815">libwebsockets.h</a>
+</li>
+<li>lws_spa_destroy()
+: <a class="el" href="group__form-parsing.html#gaaa482f07dad3f04b391cccf0a814e13b">libwebsockets.h</a>
+</li>
+<li>lws_spa_finalize()
+: <a class="el" href="group__form-parsing.html#ga83835bf250ee3d4a60f36a182f2b8d24">libwebsockets.h</a>
+</li>
+<li>lws_spa_get_length()
+: <a class="el" href="group__form-parsing.html#ga3fbe378632f85ec9a14cc2c1687bf05f">libwebsockets.h</a>
+</li>
+<li>lws_spa_get_string()
+: <a class="el" href="group__form-parsing.html#ga2da476217166da02704b90d3a8d4f3cd">libwebsockets.h</a>
+</li>
+<li>lws_spa_process()
+: <a class="el" href="group__form-parsing.html#ga9ad9ebf5ea1a7108415ed7e04cb231d2">libwebsockets.h</a>
+</li>
+<li>lws_sql_purify()
+: <a class="el" href="group__pur.html#ga9cc82f06e5ae7e71458626d7a39a5865">libwebsockets.h</a>
+</li>
+<li>lws_token_to_string()
+: <a class="el" href="group__HTTP-headers-read.html#ga2c0597b2ef1d2cee35736c338bcbd17b">libwebsockets.h</a>
+</li>
+<li>lws_urldecode()
+: <a class="el" href="group__urlendec.html#gaa373a9c16acdd96c395af61ab915ece3">libwebsockets.h</a>
+</li>
+<li>lws_urlencode()
+: <a class="el" href="group__urlendec.html#gabc2888476e50e001c875c1a8abf455b7">libwebsockets.h</a>
+</li>
+<li>lws_vhost_get()
+: <a class="el" href="group__context-and-vhost.html#ga8db03e19a372e34ac25cf21af894a02c">libwebsockets.h</a>
+</li>
+<li>lws_vhost_name_to_protocol()
+: <a class="el" href="group__Protocols-and-Plugins.html#ga25754726d97c5f519d313e691a9fe29d">libwebsockets.h</a>
+</li>
+<li>lws_write()
+: <a class="el" href="group__sending-data.html#gafd5fdd285a0e25ba7e3e1051deec1001">libwebsockets.h</a>
+</li>
+<li>lws_wsi_user()
+: <a class="el" href="group__misc.html#gaa194584fff9698f3b280658f770ccd0f">libwebsockets.h</a>
+</li>
+<li>lwsl_emit_syslog()
+: <a class="el" href="group__log.html#gab7c0fc936cc9f1eb58e2bb234c15147c">libwebsockets.h</a>
+</li>
+<li>lwsl_hexdump()
+: <a class="el" href="group__log.html#ga898b1f03872ad019f507d4e35bbefa90">libwebsockets.h</a>
+</li>
+<li>lwsl_timestamp()
+: <a class="el" href="group__log.html#ga42e39775c6b69b7251bdbf5a2cdd5dcd">libwebsockets.h</a>
+</li>
+<li>lwsws_get_config_globals()
+: <a class="el" href="group__context-and-vhost.html#ga98d88c9080fd89c37114363a6474ea73">libwebsockets.h</a>
+</li>
+<li>lwsws_get_config_vhosts()
+: <a class="el" href="group__context-and-vhost.html#ga341064721add2618ae1b29717493a212">libwebsockets.h</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">Generated by
+ <a href="http://www.doxygen.org/index.html">
+ <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.11 </li>
+ </ul>
+</div>
+</body>
+</html>
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.11"/>
+<title>libwebsockets: Globals</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="libwebsockets.org-logo.png"/></td>
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname">libwebsockets
+ </div>
+ <div id="projectbrief">Lightweight C library for HTML5 websockets</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.11 -->
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main Page</span></a></li>
+ <li><a href="pages.html"><span>Related Pages</span></a></li>
+ <li><a href="modules.html"><span>Modules</span></a></li>
+ <li><a href="annotated.html"><span>Data Structures</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File List</span></a></li>
+ <li class="current"><a href="globals.html"><span>Globals</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li class="current"><a href="globals.html"><span>All</span></a></li>
+ <li><a href="globals_func.html"><span>Functions</span></a></li>
+ <li><a href="globals_type.html"><span>Typedefs</span></a></li>
+ <li><a href="globals_enum.html"><span>Enumerations</span></a></li>
+ <li><a href="globals_eval.html"><span>Enumerator</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals.html#index_e"><span>e</span></a></li>
+ <li class="current"><a href="globals_l.html#index_l"><span>l</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_l.html','');});
+</script>
+<div id="doc-content">
+<div class="contents">
+<div class="textblock">Here is a list of all documented functions, variables, defines, enums, and typedefs with links to the documentation:</div>
+
+<h3><a class="anchor" id="index_l"></a>- l -</h3><ul>
+<li>LGSSMTP_CONNECTED
+: <a class="el" href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0ab61778f70ecac007b334bb14942eb41d">libwebsockets.h</a>
+</li>
+<li>LGSSMTP_CONNECTING
+: <a class="el" href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0ab89442b7a3ca2b94c3cdcf33756eb933">libwebsockets.h</a>
+</li>
+<li>LGSSMTP_IDLE
+: <a class="el" href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a29e5b0ecf75375b5a643faa3d6222b7c">libwebsockets.h</a>
+</li>
+<li>LGSSMTP_SENT_BODY
+: <a class="el" href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a38fba41f28d754e38079b31418a86a69">libwebsockets.h</a>
+</li>
+<li>LGSSMTP_SENT_DATA
+: <a class="el" href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a85e3c452950c09a79086bff4b9be5c14">libwebsockets.h</a>
+</li>
+<li>LGSSMTP_SENT_FROM
+: <a class="el" href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a929bb4623ff3f585108aba2a1b047fab">libwebsockets.h</a>
+</li>
+<li>LGSSMTP_SENT_HELO
+: <a class="el" href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a1dfec948a864205cec875f63cbe0d4ad">libwebsockets.h</a>
+</li>
+<li>LGSSMTP_SENT_QUIT
+: <a class="el" href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a2c2ed16ffc572326e3040684084b21d5">libwebsockets.h</a>
+</li>
+<li>LGSSMTP_SENT_TO
+: <a class="el" href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0aae20a0cb95b97a70f6b45d0ed2d5be83">libwebsockets.h</a>
+</li>
+<li>lws_add_http_header_by_name()
+: <a class="el" href="group__HTTP-headers-create.html#ga2b36bf44405755ff51c1939303b995a8">libwebsockets.h</a>
+</li>
+<li>lws_add_http_header_by_token()
+: <a class="el" href="group__HTTP-headers-create.html#gaf74adb761b22566ad70004882712dce1">libwebsockets.h</a>
+</li>
+<li>lws_add_http_header_content_length()
+: <a class="el" href="group__HTTP-headers-create.html#gacc76a5babcb4dce1b01b1955aa7a2faf">libwebsockets.h</a>
+</li>
+<li>lws_add_http_header_status()
+: <a class="el" href="group__HTTP-headers-create.html#ga29b7d6d2ddfdbaff3d8b607e7e3151b6">libwebsockets.h</a>
+</li>
+<li>lws_adopt_socket()
+: <a class="el" href="group__sock-adopt.html#gabe71b7462afb21c767bdc67334f305af">libwebsockets.h</a>
+</li>
+<li>lws_adopt_socket_readbuf()
+: <a class="el" href="group__sock-adopt.html#gab2d045df0f81afe00891aaed312d552b">libwebsockets.h</a>
+</li>
+<li>lws_b64_decode_string()
+: <a class="el" href="group__sha.html#ga66316e6a5a0644a09d5a10e919dfdd8d">libwebsockets.h</a>
+</li>
+<li>lws_b64_encode_string()
+: <a class="el" href="group__sha.html#gaf39765e4a3b413efb65e4698b2ec3575">libwebsockets.h</a>
+</li>
+<li>LWS_CALLBACK_ADD_POLL_FD
+: <a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ab69783a9fbf2ca71ad70706bda77b412">libwebsockets.h</a>
+</li>
+<li>lws_callback_all_protocol()
+: <a class="el" href="group__callback-when-writeable.html#gacf04bbe089f47c971c6408c5efe2ac70">libwebsockets.h</a>
+</li>
+<li>lws_callback_all_protocol_vhost()
+: <a class="el" href="group__callback-when-writeable.html#ga13c984d8c5a44a745fd02bc2fba36053">libwebsockets.h</a>
+</li>
+<li>LWS_CALLBACK_CHANGE_MODE_POLL_FD
+: <a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aa87d2e82fffa42c3680c7403ef94216e">libwebsockets.h</a>
+</li>
+<li>LWS_CALLBACK_CLIENT_APPEND_HANDSHAKE_HEADER
+: <a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a909cc2a7018864b0b71abacc4058fd8f">libwebsockets.h</a>
+</li>
+<li>LWS_CALLBACK_CLIENT_CONFIRM_EXTENSION_SUPPORTED
+: <a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a1ce5b22039ca37ee224d00047596ea46">libwebsockets.h</a>
+</li>
+<li>LWS_CALLBACK_CLIENT_CONNECTION_ERROR
+: <a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ad8c6207b0c4e732f3d507f0fb79370e8">libwebsockets.h</a>
+</li>
+<li>LWS_CALLBACK_CLIENT_ESTABLISHED
+: <a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a7e12418eec9bce85735e6460176ab604">libwebsockets.h</a>
+</li>
+<li>LWS_CALLBACK_CLIENT_FILTER_PRE_ESTABLISH
+: <a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aa536e574a642ff3ab9e12bff7ba2c6a2">libwebsockets.h</a>
+</li>
+<li>LWS_CALLBACK_CLIENT_RECEIVE
+: <a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7abbbe7a0a67c5866ca9109d46823fc5b1">libwebsockets.h</a>
+</li>
+<li>LWS_CALLBACK_CLIENT_RECEIVE_PONG
+: <a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a136a7cec11c3afd13245623bd84e76c9">libwebsockets.h</a>
+</li>
+<li>LWS_CALLBACK_CLIENT_WRITEABLE
+: <a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a8e8b2e6dbeac76d8d126947d2166a514">libwebsockets.h</a>
+</li>
+<li>LWS_CALLBACK_CLOSED
+: <a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a48a9590e5e18c7920282e094a0bfd9d8">libwebsockets.h</a>
+</li>
+<li>LWS_CALLBACK_CLOSED_HTTP
+: <a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a838b18d255c1b94a533287ba302a2eba">libwebsockets.h</a>
+</li>
+<li>LWS_CALLBACK_CONFIRM_EXTENSION_OKAY
+: <a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a390da3639296660a78cc1a5dcb19037e">libwebsockets.h</a>
+</li>
+<li>LWS_CALLBACK_DEL_POLL_FD
+: <a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a1df60f314710236f9b53efbf468da768">libwebsockets.h</a>
+</li>
+<li>LWS_CALLBACK_ESTABLISHED
+: <a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a24d39bf1cfc0bad9d92da9ac1717e439">libwebsockets.h</a>
+</li>
+<li>LWS_CALLBACK_FILTER_HTTP_CONNECTION
+: <a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a75199176c82c1a56e4a6bbf1cc30c12c">libwebsockets.h</a>
+</li>
+<li>LWS_CALLBACK_FILTER_NETWORK_CONNECTION
+: <a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a026502768778b8d79d62dd0fe4375fc6">libwebsockets.h</a>
+</li>
+<li>LWS_CALLBACK_FILTER_PROTOCOL_CONNECTION
+: <a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7accd8753672d319a30b4b4c2fb775e84d">libwebsockets.h</a>
+</li>
+<li>lws_callback_function
+: <a class="el" href="group__usercb.html#gad4fcb82e68d60ffacca61a3f783a0a2f">libwebsockets.h</a>
+</li>
+<li>LWS_CALLBACK_GET_THREAD_ID
+: <a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7adfb41c92e2522712207ef7f2462b5e34">libwebsockets.h</a>
+</li>
+<li>LWS_CALLBACK_HTTP
+: <a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ae8d1de0bb56e03aa58cb4d44b18edd2e">libwebsockets.h</a>
+</li>
+<li>LWS_CALLBACK_HTTP_BODY
+: <a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ac4c68e00efcf1ff7bda7ada462aff8ae">libwebsockets.h</a>
+</li>
+<li>LWS_CALLBACK_HTTP_BODY_COMPLETION
+: <a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a2fce9a8608220f32abbf1422a5498804">libwebsockets.h</a>
+</li>
+<li>LWS_CALLBACK_HTTP_FILE_COMPLETION
+: <a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aa627548e1296e654fcfab463ec3c9587">libwebsockets.h</a>
+</li>
+<li>LWS_CALLBACK_HTTP_WRITEABLE
+: <a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7afedadfb3cde37a8ea4c84ed535f26d09">libwebsockets.h</a>
+</li>
+<li>LWS_CALLBACK_LOCK_POLL
+: <a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a8909732521d379179003d97ab7a05428">libwebsockets.h</a>
+</li>
+<li>lws_callback_on_writable()
+: <a class="el" href="group__callback-when-writeable.html#ga941caaa468bc507b1cae52275f58800d">libwebsockets.h</a>
+</li>
+<li>lws_callback_on_writable_all_protocol()
+: <a class="el" href="group__callback-when-writeable.html#gabbe4655c7eeb3eb1671b2323ec6b3107">libwebsockets.h</a>
+</li>
+<li>lws_callback_on_writable_all_protocol_vhost()
+: <a class="el" href="group__callback-when-writeable.html#ga8570860e191b62db264f2bac67354ea8">libwebsockets.h</a>
+</li>
+<li>LWS_CALLBACK_OPENSSL_CONTEXT_REQUIRES_PRIVATE_KEY
+: <a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aa46f705dcf97502e95627ffde614f98b">libwebsockets.h</a>
+</li>
+<li>LWS_CALLBACK_OPENSSL_LOAD_EXTRA_CLIENT_VERIFY_CERTS
+: <a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ae4986291b7a810fe290851d73bebeb1c">libwebsockets.h</a>
+</li>
+<li>LWS_CALLBACK_OPENSSL_LOAD_EXTRA_SERVER_VERIFY_CERTS
+: <a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a06006e98d27e1e884364d88317f83493">libwebsockets.h</a>
+</li>
+<li>LWS_CALLBACK_OPENSSL_PERFORM_CLIENT_CERT_VERIFICATION
+: <a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ae5ad65d779b7eab32ab67ceff91a3bac">libwebsockets.h</a>
+</li>
+<li>LWS_CALLBACK_PROTOCOL_DESTROY
+: <a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a54269ca88508e6efd3afdb9d360a9caa">libwebsockets.h</a>
+</li>
+<li>LWS_CALLBACK_PROTOCOL_INIT
+: <a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ad5d34583e3556e153eda91620b48cc49">libwebsockets.h</a>
+</li>
+<li>lws_callback_reasons
+: <a class="el" href="group__usercb.html#gad62860e19975ba4c4af401c3cdb6abf7">libwebsockets.h</a>
+</li>
+<li>LWS_CALLBACK_RECEIVE
+: <a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a492c1b1c0ac0ed980042ee732fe2990c">libwebsockets.h</a>
+</li>
+<li>LWS_CALLBACK_RECEIVE_PONG
+: <a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a2db02fc6e1c17ab62b52109d1aa9d738">libwebsockets.h</a>
+</li>
+<li>LWS_CALLBACK_SERVER_NEW_CLIENT_INSTANTIATED
+: <a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ae9734e1d7af2abf291665ce9e4a728d3">libwebsockets.h</a>
+</li>
+<li>LWS_CALLBACK_SERVER_WRITEABLE
+: <a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a7ec8e2e9557ee02a4fc9f7dec7e2babc">libwebsockets.h</a>
+</li>
+<li>LWS_CALLBACK_UNLOCK_POLL
+: <a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a0e9e3dd667c0c42cdbe1a3d921f4fd79">libwebsockets.h</a>
+</li>
+<li>LWS_CALLBACK_USER
+: <a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a982579753e70e59a9ea13ce628ac891a">libwebsockets.h</a>
+</li>
+<li>lws_callback_vhost_protocols()
+: <a class="el" href="group__callback-when-writeable.html#ga60939cf0c073d933fde3d17f3591caf5">libwebsockets.h</a>
+</li>
+<li>LWS_CALLBACK_WS_PEER_INITIATED_CLOSE
+: <a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ac3fc5bbb55e69f90396526287ee84a51">libwebsockets.h</a>
+</li>
+<li>LWS_CALLBACK_WSI_CREATE
+: <a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7afd8fd77a1cc9405fcb4f26915d7f2d01">libwebsockets.h</a>
+</li>
+<li>LWS_CALLBACK_WSI_DESTROY
+: <a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aca834dc035b7f7486f9ce40fde54fe9e">libwebsockets.h</a>
+</li>
+<li>lws_cancel_service()
+: <a class="el" href="group__service.html#ga53e3d0801dfda7960a7249dd559e68a2">libwebsockets.h</a>
+</li>
+<li>lws_cancel_service_pt()
+: <a class="el" href="group__service.html#ga29c246707997ab7a466aa709aecd2d7b">libwebsockets.h</a>
+</li>
+<li>lws_canonical_hostname()
+: <a class="el" href="group__net.html#gad0df22db2be9fc65a667a1e83f9a92a4">libwebsockets.h</a>
+</li>
+<li>lws_cgi()
+: <a class="el" href="libwebsockets_8h.html#af52923473c59e643a974d65e12290831">libwebsockets.h</a>
+</li>
+<li>lws_cgi_kill()
+: <a class="el" href="libwebsockets_8h.html#a27bb0b3cdcd0af839c928c253b521ff4">libwebsockets.h</a>
+</li>
+<li>lws_cgi_write_split_stdout_headers()
+: <a class="el" href="libwebsockets_8h.html#a5326d3402af8429a166dd991dc65c4a2">libwebsockets.h</a>
+</li>
+<li>lws_chunked_html_process()
+: <a class="el" href="group__html-chunked-substitution.html#ga643073f918c0a7016b690aae9793fd60">libwebsockets.h</a>
+</li>
+<li>lws_client_connect()
+: <a class="el" href="group__client.html#ga4af0a20108a95e8b6d94dd4d80055ff3">libwebsockets.h</a>
+</li>
+<li>lws_client_connect_extended()
+: <a class="el" href="group__client.html#gac6a8558b4410961a880241c2ac1271e2">libwebsockets.h</a>
+</li>
+<li>lws_client_connect_via_info()
+: <a class="el" href="group__client.html#gac30a7be106abd0cedfbb2e8b8fe3a2f5">libwebsockets.h</a>
+</li>
+<li>lws_close_reason()
+: <a class="el" href="group__wsclose.html#gaa1c863415d1783cd8de7938aa6efa262">libwebsockets.h</a>
+</li>
+<li>lws_close_status
+: <a class="el" href="group__wsclose.html#gae399c571df32ba532c0ca67da9284985">libwebsockets.h</a>
+</li>
+<li>LWS_CLOSE_STATUS_ABNORMAL_CLOSE
+: <a class="el" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a68b3d34bebd88547dcfa5cadba0acd6c">libwebsockets.h</a>
+</li>
+<li>LWS_CLOSE_STATUS_EXTENSION_REQUIRED
+: <a class="el" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985ac6a161822783ee873be1c66f48d14e0e">libwebsockets.h</a>
+</li>
+<li>LWS_CLOSE_STATUS_GOINGAWAY
+: <a class="el" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a9737a68759e739856b150ff9dfa30218">libwebsockets.h</a>
+</li>
+<li>LWS_CLOSE_STATUS_INVALID_PAYLOAD
+: <a class="el" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a7aef2da0062da606eeb35aaca5cf9050">libwebsockets.h</a>
+</li>
+<li>LWS_CLOSE_STATUS_MESSAGE_TOO_LARGE
+: <a class="el" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a2e1f0113494a58e762eed3d22e7080d8">libwebsockets.h</a>
+</li>
+<li>LWS_CLOSE_STATUS_NO_STATUS
+: <a class="el" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a4b8a3b7ce6f731e5248e4b0fb64a5044">libwebsockets.h</a>
+</li>
+<li>LWS_CLOSE_STATUS_NORMAL
+: <a class="el" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a3ffa38d5081b85fb739e02a747ccf2c4">libwebsockets.h</a>
+</li>
+<li>LWS_CLOSE_STATUS_POLICY_VIOLATION
+: <a class="el" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985ad09e68295eabdddcba4e332fbea70ae5">libwebsockets.h</a>
+</li>
+<li>LWS_CLOSE_STATUS_PROTOCOL_ERR
+: <a class="el" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a1bb501d212fa4d57053db681b1dfab98">libwebsockets.h</a>
+</li>
+<li>LWS_CLOSE_STATUS_RESERVED
+: <a class="el" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985af90cb98d983ad3d4c79df9b6f3d4a4d2">libwebsockets.h</a>
+</li>
+<li>LWS_CLOSE_STATUS_TLS_FAILURE
+: <a class="el" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985ad2b477a91c8445bf34ecd43977f9b390">libwebsockets.h</a>
+</li>
+<li>LWS_CLOSE_STATUS_UNACCEPTABLE_OPCODE
+: <a class="el" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a462c99b05459df700919cfd3f53c8276">libwebsockets.h</a>
+</li>
+<li>LWS_CLOSE_STATUS_UNEXPECTED_CONDITION
+: <a class="el" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985ad0869604d79e13700ae5d196a431b350">libwebsockets.h</a>
+</li>
+<li>lws_context_destroy()
+: <a class="el" href="group__context-and-vhost.html#ga8ee0314028755f1ddfa9428e09b4fddb">libwebsockets.h</a>
+</li>
+<li>lws_context_options
+: <a class="el" href="group__context-and-vhost.html#ga41c2d763f78cc248df3b9f8645dbd2a5">libwebsockets.h</a>
+</li>
+<li>lws_context_user()
+: <a class="el" href="group__context-and-vhost.html#gaeb12f934bfd178bd2132a9e73fc641da">libwebsockets.h</a>
+</li>
+<li>lws_create_context()
+: <a class="el" href="group__context-and-vhost.html#gaf2fff58562caab7510c41eeac85a8648">libwebsockets.h</a>
+</li>
+<li>lws_create_vhost()
+: <a class="el" href="group__context-and-vhost.html#ga0c54c667ccd9b8b3dddcd123ca72f87c">libwebsockets.h</a>
+</li>
+<li>lws_daemonize()
+: <a class="el" href="group__misc.html#gace5171b1dbbc03ec89a98f8afdb5c9af">libwebsockets.h</a>
+</li>
+<li>lws_email_check()
+: <a class="el" href="group__smtp.html#ga5e535e346d92a9daf00be33abf79d4eb">libwebsockets.h</a>
+</li>
+<li>lws_email_destroy()
+: <a class="el" href="group__smtp.html#ga25298a5afc1074e13b2d5711a86432b2">libwebsockets.h</a>
+</li>
+<li>lws_email_init()
+: <a class="el" href="group__smtp.html#ga77fc9b56a1bb39484844981ec375fc29">libwebsockets.h</a>
+</li>
+<li>lws_ext_options_types
+: <a class="el" href="group__extensions.html#gacc9f55936dc165257a2e1f7d47bce89e">libwebsockets.h</a>
+</li>
+<li>lws_ext_parse_options()
+: <a class="el" href="group__extensions.html#ga6fb3e2c3dfb9d64dc87026a4e99c128b">libwebsockets.h</a>
+</li>
+<li>lws_extension_callback_function
+: <a class="el" href="group__extensions.html#gaae7169b2cd346b34fa33d0250db2afd0">libwebsockets.h</a>
+</li>
+<li>lws_extension_callback_pm_deflate()
+: <a class="el" href="group__extensions.html#ga4cdbe42d872e21a448a947714d6c607e">libwebsockets.h</a>
+</li>
+<li>lws_finalize_http_header()
+: <a class="el" href="group__HTTP-headers-create.html#ga4887605ff2242a54db3a7fa01f6f864b">libwebsockets.h</a>
+</li>
+<li>lws_finalize_startup()
+: <a class="el" href="group__Protocols-and-Plugins.html#ga106b37ae9c247e84d191ab09441adc43">libwebsockets.h</a>
+</li>
+<li>lws_frame_is_binary()
+: <a class="el" href="group__wsstatus.html#gaccd9c59336efad8af0554f79cc5966fd">libwebsockets.h</a>
+</li>
+<li>lws_get_child()
+: <a class="el" href="group__misc.html#gacae4d7b6a8d22e4c2d82ff8b12c1e234">libwebsockets.h</a>
+</li>
+<li>lws_get_context()
+: <a class="el" href="group__misc.html#ga0af4f7d2dd375aeedcfa7eb0e1101c4b">libwebsockets.h</a>
+</li>
+<li>lws_get_count_threads()
+: <a class="el" href="group__misc.html#ga629f48268fd1856b54b11172991b97d9">libwebsockets.h</a>
+</li>
+<li>lws_get_fops()
+: <a class="el" href="group__fops.html#gac08aef64c4c34647ed699b24759b6b0e">libwebsockets.h</a>
+</li>
+<li>lws_get_library_version()
+: <a class="el" href="group__misc.html#gac6abfc0b2bd5b2f09281a4432bb2f5f0">libwebsockets.h</a>
+</li>
+<li>lws_get_parent()
+: <a class="el" href="group__misc.html#ga8930fe36a3f3eefe4a6a4fd499d8e899">libwebsockets.h</a>
+</li>
+<li>lws_get_peer_addresses()
+: <a class="el" href="group__net.html#ga092e5f473b3347f03ffeef8a950080f3">libwebsockets.h</a>
+</li>
+<li>lws_get_peer_simple()
+: <a class="el" href="group__net.html#gad01014fed09759741b6d23afccfdaacc">libwebsockets.h</a>
+</li>
+<li>lws_get_peer_write_allowance()
+: <a class="el" href="group__callback-when-writeable.html#gac4643fe16b0940ae5b68b4ee6195cbde">libwebsockets.h</a>
+</li>
+<li>lws_get_protocol()
+: <a class="el" href="group__Protocols-and-Plugins.html#ga72ad550786ca7976463589d347e62112">libwebsockets.h</a>
+</li>
+<li>lws_get_random()
+: <a class="el" href="group__misc.html#ga58f906c6be0ca80efd813f694569dd4a">libwebsockets.h</a>
+</li>
+<li>lws_get_reserved_bits()
+: <a class="el" href="group__wsstatus.html#ga3df5045656dfb6b0e63a38de2dca79d2">libwebsockets.h</a>
+</li>
+<li>lws_get_socket_fd()
+: <a class="el" href="group__callback-when-writeable.html#gaa709e02a10558753c851e58f1e2c16ba">libwebsockets.h</a>
+</li>
+<li>lws_get_urlarg_by_name()
+: <a class="el" href="group__HTTP-headers-read.html#ga84e9ce5e71a77501a0998ac403a984c2">libwebsockets.h</a>
+</li>
+<li>lws_get_vhost()
+: <a class="el" href="group__context-and-vhost.html#ga06e77ce2916f8bc9826ef8d9d68e3932">libwebsockets.h</a>
+</li>
+<li>lws_gs_event
+: <a class="el" href="group__generic-sessions.html#gaa93946b3d921072209d5cd8cdfa5332e">libwebsockets.h</a>
+</li>
+<li>lws_hdr_copy()
+: <a class="el" href="group__HTTP-headers-read.html#ga6ce6aa1c0155ea42b7708bed271d1c77">libwebsockets.h</a>
+</li>
+<li>lws_hdr_copy_fragment()
+: <a class="el" href="group__HTTP-headers-read.html#gaa427cad61a9a5e3004afd65c4527b5e9">libwebsockets.h</a>
+</li>
+<li>lws_hdr_fragment_length()
+: <a class="el" href="group__HTTP-headers-read.html#ga594f3d0ece5b09c2ccf9f98ea533bb4e">libwebsockets.h</a>
+</li>
+<li>lws_hdr_total_length()
+: <a class="el" href="group__HTTP-headers-read.html#ga8ade0e1ffb0da7e62b989d8d867bf6c8">libwebsockets.h</a>
+</li>
+<li>lws_http_redirect()
+: <a class="el" href="group__http.html#ga8fbf01e473ac421fc33ad9f8da8b8a25">libwebsockets.h</a>
+</li>
+<li>lws_http_transaction_completed()
+: <a class="el" href="group__http.html#gad27aed6c66a41b2b89ffe4da2a309e8a">libwebsockets.h</a>
+</li>
+<li>lws_init_vhost_client_ssl()
+: <a class="el" href="group__client.html#ga4f44b8230e6732816ca5cd8d1aaaf340">libwebsockets.h</a>
+</li>
+<li>lws_interface_to_sa()
+: <a class="el" href="group__net.html#ga869d8bdffb0f2a7ce08e3ce10d6be3d8">libwebsockets.h</a>
+</li>
+<li>lws_is_cgi()
+: <a class="el" href="group__wsstatus.html#ga4ad226d5e01024b4046f4a5a37199aa1">libwebsockets.h</a>
+</li>
+<li>lws_is_final_fragment()
+: <a class="el" href="group__wsstatus.html#ga08e9ee165fca503fd9427d55cfecac37">libwebsockets.h</a>
+</li>
+<li>lws_is_ssl()
+: <a class="el" href="group__wsstatus.html#ga26a140623d202dd2bf2004deb6994baa">libwebsockets.h</a>
+</li>
+<li>lws_json_dump_context()
+: <a class="el" href="group__context-and-vhost.html#gae2134657cdd2ea7a59e13ad314e4c50d">libwebsockets.h</a>
+</li>
+<li>lws_json_dump_vhost()
+: <a class="el" href="group__context-and-vhost.html#ga94e6cc2223c4eec316b13bcebc3628b6">libwebsockets.h</a>
+</li>
+<li>lws_json_purify()
+: <a class="el" href="group__pur.html#gab15187efcfa256b7c928562c182b92a3">libwebsockets.h</a>
+</li>
+<li>lws_mount_protocols
+: <a class="el" href="group__vhost-mounts.html#ga31eca18e50cb4357480f2fcad36ff437">libwebsockets.h</a>
+</li>
+<li>lws_now_secs()
+: <a class="el" href="group__misc.html#ga33bf2635033710b25f931b57ed663e1e">libwebsockets.h</a>
+</li>
+<li>lws_parse_uri()
+: <a class="el" href="group__misc.html#ga1ec0d9faac5d3a5824d765c287c043aa">libwebsockets.h</a>
+</li>
+<li>lws_partial_buffered()
+: <a class="el" href="group__wsstatus.html#gaeca4afc94b1f026034f99cbba37e2f85">libwebsockets.h</a>
+</li>
+<li>lws_protocol_get()
+: <a class="el" href="group__Protocols-and-Plugins.html#ga8bbe5e65faca068845704bab911a5030">libwebsockets.h</a>
+</li>
+<li>lws_protocol_vh_priv_get()
+: <a class="el" href="group__Protocols-and-Plugins.html#gaf3be4243443baac0f8be1fcfb4d25129">libwebsockets.h</a>
+</li>
+<li>lws_protocol_vh_priv_zalloc()
+: <a class="el" href="group__Protocols-and-Plugins.html#gaec0c0477288ff3f83aff38d357b883d1">libwebsockets.h</a>
+</li>
+<li>lws_remaining_packet_payload()
+: <a class="el" href="libwebsockets_8h.html#a72fe65e83b8bb03f904a1a256c673536">libwebsockets.h</a>
+</li>
+<li>lws_return_http_status()
+: <a class="el" href="group__http.html#gac8a4a71240857dc6b2ed70456b6923f4">libwebsockets.h</a>
+</li>
+<li>lws_rx_flow_allow_all_protocol()
+: <a class="el" href="libwebsockets_8h.html#a5e627dbf1db48170ef486edbaf268672">libwebsockets.h</a>
+</li>
+<li>lws_rx_flow_control()
+: <a class="el" href="libwebsockets_8h.html#adf4abd01e8c43f07c6e498ce13590c3e">libwebsockets.h</a>
+</li>
+<li>lws_send_pipe_choked()
+: <a class="el" href="group__wsstatus.html#ga2bb3655329b4651cd06f79ee3a764421">libwebsockets.h</a>
+</li>
+<li>lws_serve_http_file()
+: <a class="el" href="group__httpft.html#gab393a06d3d2722af4c3f8b06842c80d7">libwebsockets.h</a>
+</li>
+<li>LWS_SERVER_OPTION_ALLOW_NON_SSL_ON_SSL_PORT
+: <a class="el" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a1cc4562d05cba52a6dfa0697a65ade0d">libwebsockets.h</a>
+</li>
+<li>LWS_SERVER_OPTION_DISABLE_IPV6
+: <a class="el" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a34ab36e68c0d593b6f19b8d5ef1240a9">libwebsockets.h</a>
+</li>
+<li>LWS_SERVER_OPTION_DISABLE_OS_CA_CERTS
+: <a class="el" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a4933347a821e73c3f1e13fb6bfc7ad93">libwebsockets.h</a>
+</li>
+<li>LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT
+: <a class="el" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a7fed6a527c8d5e0acac1b4179644583a">libwebsockets.h</a>
+</li>
+<li>LWS_SERVER_OPTION_EXPLICIT_VHOSTS
+: <a class="el" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5accc9d0d11d1124a21659586164b0962e">libwebsockets.h</a>
+</li>
+<li>LWS_SERVER_OPTION_IPV6_V6ONLY_MODIFY
+: <a class="el" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5af62887536e25e053e68741006dba46d8">libwebsockets.h</a>
+</li>
+<li>LWS_SERVER_OPTION_IPV6_V6ONLY_VALUE
+: <a class="el" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5aca5d42820b65eac5618ec3f0bd8a1160">libwebsockets.h</a>
+</li>
+<li>LWS_SERVER_OPTION_LIBEV
+: <a class="el" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a273d9975675130de0c6dc937dde7c8a6">libwebsockets.h</a>
+</li>
+<li>LWS_SERVER_OPTION_LIBUV
+: <a class="el" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5aff121db04a10cf8b2c5df9d4f2b89f1e">libwebsockets.h</a>
+</li>
+<li>LWS_SERVER_OPTION_PEER_CERT_NOT_REQUIRED
+: <a class="el" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5ac56a8a6590e74a8016d0fae09fb404fc">libwebsockets.h</a>
+</li>
+<li>LWS_SERVER_OPTION_REDIRECT_HTTP_TO_HTTPS
+: <a class="el" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a4832187186c4d130c68051214cd42ada">libwebsockets.h</a>
+</li>
+<li>LWS_SERVER_OPTION_REQUIRE_VALID_OPENSSL_CLIENT_CERT
+: <a class="el" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a274ed462a1a9239eb6ddf9007f5b7092">libwebsockets.h</a>
+</li>
+<li>LWS_SERVER_OPTION_SKIP_SERVER_CANONICAL_NAME
+: <a class="el" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a6582c985ee0ceaadc1d277030eae2d7c">libwebsockets.h</a>
+</li>
+<li>LWS_SERVER_OPTION_SSL_ECDH
+: <a class="el" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a1b2f8bde0f62adc7ebe81b2043f34c0c">libwebsockets.h</a>
+</li>
+<li>LWS_SERVER_OPTION_STS
+: <a class="el" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5ac962efd35abf6c402f9fb14aa14f5016">libwebsockets.h</a>
+</li>
+<li>LWS_SERVER_OPTION_UNIX_SOCK
+: <a class="el" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a9637e9001d8c8b2521086bcafbd8a941">libwebsockets.h</a>
+</li>
+<li>LWS_SERVER_OPTION_VALIDATE_UTF8
+: <a class="el" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5aa0158b4e85420811e6b0f1378c6ded0f">libwebsockets.h</a>
+</li>
+<li>lws_service()
+: <a class="el" href="group__service.html#gaf95bd0c663d6516a0c80047d9b1167a8">libwebsockets.h</a>
+</li>
+<li>lws_service_fd()
+: <a class="el" href="group__service.html#gad82efa5466d14a9f05aa06416375b28d">libwebsockets.h</a>
+</li>
+<li>lws_service_fd_tsi()
+: <a class="el" href="group__service.html#gaebf426eda371ba23642fc11d8e0ace6b">libwebsockets.h</a>
+</li>
+<li>lws_service_tsi()
+: <a class="el" href="group__service.html#ga9b3cc4473fd8848e5bbee7f310712939">libwebsockets.h</a>
+</li>
+<li>lws_set_allocator()
+: <a class="el" href="group__misc.html#gab321ed812f46f6dc7ef9e3ca6f00cf1b">libwebsockets.h</a>
+</li>
+<li>lws_set_extension_option()
+: <a class="el" href="group__extensions.html#gae0e24e1768f83a7fb07896ce975704b9">libwebsockets.h</a>
+</li>
+<li>lws_set_log_level()
+: <a class="el" href="group__log.html#ga244647f9e1bf0097ccdde66d74f41e26">libwebsockets.h</a>
+</li>
+<li>lws_set_proxy()
+: <a class="el" href="group__context-and-vhost.html#ga7e9d5405547a457d86e0b4f0ae2bb1c4">libwebsockets.h</a>
+</li>
+<li>lws_set_timeout()
+: <a class="el" href="group__timeout.html#gaced9f9237f6172fed9f730a2af51345a">libwebsockets.h</a>
+</li>
+<li>lws_SHA1()
+: <a class="el" href="group__sha.html#ga7b09ab74646266f0b555103b3bb8dfe5">libwebsockets.h</a>
+</li>
+<li>lws_spa_create()
+: <a class="el" href="group__form-parsing.html#ga162f86762173a2bc8c28497941d74815">libwebsockets.h</a>
+</li>
+<li>lws_spa_destroy()
+: <a class="el" href="group__form-parsing.html#gaaa482f07dad3f04b391cccf0a814e13b">libwebsockets.h</a>
+</li>
+<li>lws_spa_fileupload_cb
+: <a class="el" href="group__form-parsing.html#ga5a70527c0861c2ffa3d29333a6aa7f8e">libwebsockets.h</a>
+</li>
+<li>lws_spa_fileupload_states
+: <a class="el" href="group__form-parsing.html#ga41a74a822771d3dce89751aa3bce28ae">libwebsockets.h</a>
+</li>
+<li>lws_spa_finalize()
+: <a class="el" href="group__form-parsing.html#ga83835bf250ee3d4a60f36a182f2b8d24">libwebsockets.h</a>
+</li>
+<li>lws_spa_get_length()
+: <a class="el" href="group__form-parsing.html#ga3fbe378632f85ec9a14cc2c1687bf05f">libwebsockets.h</a>
+</li>
+<li>lws_spa_get_string()
+: <a class="el" href="group__form-parsing.html#ga2da476217166da02704b90d3a8d4f3cd">libwebsockets.h</a>
+</li>
+<li>lws_spa_process()
+: <a class="el" href="group__form-parsing.html#ga9ad9ebf5ea1a7108415ed7e04cb231d2">libwebsockets.h</a>
+</li>
+<li>lws_sql_purify()
+: <a class="el" href="group__pur.html#ga9cc82f06e5ae7e71458626d7a39a5865">libwebsockets.h</a>
+</li>
+<li>lws_token_to_string()
+: <a class="el" href="group__HTTP-headers-read.html#ga2c0597b2ef1d2cee35736c338bcbd17b">libwebsockets.h</a>
+</li>
+<li>LWS_UFS_CONTENT
+: <a class="el" href="group__form-parsing.html#gga41a74a822771d3dce89751aa3bce28aead3a958e7719ac273c3ba4f684f00c87f">libwebsockets.h</a>
+</li>
+<li>LWS_UFS_FINAL_CONTENT
+: <a class="el" href="group__form-parsing.html#gga41a74a822771d3dce89751aa3bce28aea6ce2a55a4c3695cdb640c893d95bd3a7">libwebsockets.h</a>
+</li>
+<li>LWS_UFS_OPEN
+: <a class="el" href="group__form-parsing.html#gga41a74a822771d3dce89751aa3bce28aea2d25de44865bd44e5a3903a2bab9ca83">libwebsockets.h</a>
+</li>
+<li>lws_urldecode()
+: <a class="el" href="group__urlendec.html#gaa373a9c16acdd96c395af61ab915ece3">libwebsockets.h</a>
+</li>
+<li>lws_urlencode()
+: <a class="el" href="group__urlendec.html#gabc2888476e50e001c875c1a8abf455b7">libwebsockets.h</a>
+</li>
+<li>lws_vhost_get()
+: <a class="el" href="group__context-and-vhost.html#ga8db03e19a372e34ac25cf21af894a02c">libwebsockets.h</a>
+</li>
+<li>lws_vhost_name_to_protocol()
+: <a class="el" href="group__Protocols-and-Plugins.html#ga25754726d97c5f519d313e691a9fe29d">libwebsockets.h</a>
+</li>
+<li>lws_write()
+: <a class="el" href="group__sending-data.html#gafd5fdd285a0e25ba7e3e1051deec1001">libwebsockets.h</a>
+</li>
+<li>LWS_WRITE_BINARY
+: <a class="el" href="group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193daf6486c0dba50c44198100717721d9ab2">libwebsockets.h</a>
+</li>
+<li>LWS_WRITE_CLIENT_IGNORE_XOR_MASK
+: <a class="el" href="group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193da220d8e8652d9b97fb66e476e2a60ffce">libwebsockets.h</a>
+</li>
+<li>LWS_WRITE_CONTINUATION
+: <a class="el" href="group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193da10047eb05b5e1c298151dc47a5b44826">libwebsockets.h</a>
+</li>
+<li>LWS_WRITE_HTTP
+: <a class="el" href="group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193dabb6705e1d1327cdda5025be28f07712e">libwebsockets.h</a>
+</li>
+<li>LWS_WRITE_HTTP_HEADERS
+: <a class="el" href="group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193dafe5a38e940ce56708ac814627e9c0917">libwebsockets.h</a>
+</li>
+<li>LWS_WRITE_NO_FIN
+: <a class="el" href="group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193da115440f272a5d55518adfc8099acfee3">libwebsockets.h</a>
+</li>
+<li>lws_write_protocol
+: <a class="el" href="group__sending-data.html#ga98b099cf8c1c7e38ad78501f270e193d">libwebsockets.h</a>
+</li>
+<li>LWS_WRITE_TEXT
+: <a class="el" href="group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193da80e8f169fda236c56bfb795ed62903db">libwebsockets.h</a>
+</li>
+<li>lws_wsi_user()
+: <a class="el" href="group__misc.html#gaa194584fff9698f3b280658f770ccd0f">libwebsockets.h</a>
+</li>
+<li>LWSGS_AUTH_ADMIN
+: <a class="el" href="group__generic-sessions.html#gga7c2dc7bfb4ccb91c5d771f9e9ea237e1a0657a9e846814781b128c397fe4b10bf">libwebsockets.h</a>
+</li>
+<li>lwsgs_auth_bits
+: <a class="el" href="group__generic-sessions.html#ga7c2dc7bfb4ccb91c5d771f9e9ea237e1">libwebsockets.h</a>
+</li>
+<li>LWSGS_AUTH_FORGOT_FLOW
+: <a class="el" href="group__generic-sessions.html#gga7c2dc7bfb4ccb91c5d771f9e9ea237e1a2cd8fb86e3b85c106e7711c03f0ddd0a">libwebsockets.h</a>
+</li>
+<li>LWSGS_AUTH_LOGGED_IN
+: <a class="el" href="group__generic-sessions.html#gga7c2dc7bfb4ccb91c5d771f9e9ea237e1a81e63075115dedd150265d81b8f7fa57">libwebsockets.h</a>
+</li>
+<li>LWSGS_AUTH_VERIFIED
+: <a class="el" href="group__generic-sessions.html#gga7c2dc7bfb4ccb91c5d771f9e9ea237e1a5a607e4668d20cadada62c4b8007f887">libwebsockets.h</a>
+</li>
+<li>lwsgs_smtp_states
+: <a class="el" href="group__smtp.html#ga116be79bf44f9dc2a97f46e051fe4dc0">libwebsockets.h</a>
+</li>
+<li>LWSGSE_CREATED
+: <a class="el" href="group__generic-sessions.html#ggaa93946b3d921072209d5cd8cdfa5332ea596010a165bf13473c5eea3a34cd4308">libwebsockets.h</a>
+</li>
+<li>LWSGSE_DELETED
+: <a class="el" href="group__generic-sessions.html#ggaa93946b3d921072209d5cd8cdfa5332ead908cdc5689c5d22c9d3c8934e94dcde">libwebsockets.h</a>
+</li>
+<li>lwsl_emit_syslog()
+: <a class="el" href="group__log.html#gab7c0fc936cc9f1eb58e2bb234c15147c">libwebsockets.h</a>
+</li>
+<li>lwsl_hexdump()
+: <a class="el" href="group__log.html#ga898b1f03872ad019f507d4e35bbefa90">libwebsockets.h</a>
+</li>
+<li>lwsl_timestamp()
+: <a class="el" href="group__log.html#ga42e39775c6b69b7251bdbf5a2cdd5dcd">libwebsockets.h</a>
+</li>
+<li>LWSMPRO_CALLBACK
+: <a class="el" href="group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437a946a88cf9c852eed2c0317f4115d19da">libwebsockets.h</a>
+</li>
+<li>LWSMPRO_CGI
+: <a class="el" href="group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437a13ab58b01ac6e05f595977f1e0f0db69">libwebsockets.h</a>
+</li>
+<li>LWSMPRO_FILE
+: <a class="el" href="group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437a42f2361cfe76cd287fa8fcfc502357e2">libwebsockets.h</a>
+</li>
+<li>LWSMPRO_HTTP
+: <a class="el" href="group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437a1e9f0842b0e85db50fe648ed4ba9a4b0">libwebsockets.h</a>
+</li>
+<li>LWSMPRO_HTTPS
+: <a class="el" href="group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437afbd10eb4777517ed1f6bfdcf3b9ea1d1">libwebsockets.h</a>
+</li>
+<li>LWSMPRO_REDIR_HTTP
+: <a class="el" href="group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437aec137a2434851bd856ceebfb697b9970">libwebsockets.h</a>
+</li>
+<li>LWSMPRO_REDIR_HTTPS
+: <a class="el" href="group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437a8894d16316863077dfe530963ca59f67">libwebsockets.h</a>
+</li>
+<li>lwsws_get_config_globals()
+: <a class="el" href="group__context-and-vhost.html#ga98d88c9080fd89c37114363a6474ea73">libwebsockets.h</a>
+</li>
+<li>lwsws_get_config_vhosts()
+: <a class="el" href="group__context-and-vhost.html#ga341064721add2618ae1b29717493a212">libwebsockets.h</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">Generated by
+ <a href="http://www.doxygen.org/index.html">
+ <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.11 </li>
+ </ul>
+</div>
+</body>
+</html>
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.11"/>
+<title>libwebsockets: Globals</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="libwebsockets.org-logo.png"/></td>
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname">libwebsockets
+ </div>
+ <div id="projectbrief">Lightweight C library for HTML5 websockets</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.11 -->
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main Page</span></a></li>
+ <li><a href="pages.html"><span>Related Pages</span></a></li>
+ <li><a href="modules.html"><span>Modules</span></a></li>
+ <li><a href="annotated.html"><span>Data Structures</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File List</span></a></li>
+ <li class="current"><a href="globals.html"><span>Globals</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="globals.html"><span>All</span></a></li>
+ <li><a href="globals_func.html"><span>Functions</span></a></li>
+ <li class="current"><a href="globals_type.html"><span>Typedefs</span></a></li>
+ <li><a href="globals_enum.html"><span>Enumerations</span></a></li>
+ <li><a href="globals_eval.html"><span>Enumerator</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_type.html','');});
+</script>
+<div id="doc-content">
+<div class="contents">
+ <ul>
+<li>lws_callback_function
+: <a class="el" href="group__usercb.html#gad4fcb82e68d60ffacca61a3f783a0a2f">libwebsockets.h</a>
+</li>
+<li>lws_extension_callback_function
+: <a class="el" href="group__extensions.html#gaae7169b2cd346b34fa33d0250db2afd0">libwebsockets.h</a>
+</li>
+<li>lws_spa_fileupload_cb
+: <a class="el" href="group__form-parsing.html#ga5a70527c0861c2ffa3d29333a6aa7f8e">libwebsockets.h</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">Generated by
+ <a href="http://www.doxygen.org/index.html">
+ <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.11 </li>
+ </ul>
+</div>
+</body>
+</html>
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.11"/>
+<title>libwebsockets: HTTP headers: create</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="libwebsockets.org-logo.png"/></td>
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname">libwebsockets
+ </div>
+ <div id="projectbrief">Lightweight C library for HTML5 websockets</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.11 -->
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main Page</span></a></li>
+ <li><a href="pages.html"><span>Related Pages</span></a></li>
+ <li class="current"><a href="modules.html"><span>Modules</span></a></li>
+ <li><a href="annotated.html"><span>Data Structures</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('group__HTTP-headers-create.html','');});
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">HTTP headers: create<div class="ingroups"><a class="el" href="group__http.html">HTTP</a></div></div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ga29b7d6d2ddfdbaff3d8b607e7e3151b6"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT </td><td class="memItemRight" valign="bottom"><a class="el" href="group__HTTP-headers-create.html#ga29b7d6d2ddfdbaff3d8b607e7e3151b6">lws_add_http_header_status</a> (struct lws *wsi, unsigned int code, unsigned char **p, unsigned char *end)</td></tr>
+<tr class="separator:ga29b7d6d2ddfdbaff3d8b607e7e3151b6"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga2b36bf44405755ff51c1939303b995a8"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT </td><td class="memItemRight" valign="bottom"><a class="el" href="group__HTTP-headers-create.html#ga2b36bf44405755ff51c1939303b995a8">lws_add_http_header_by_name</a> (struct lws *wsi, const unsigned char *name, const unsigned char *value, int length, unsigned char **p, unsigned char *end)</td></tr>
+<tr class="separator:ga2b36bf44405755ff51c1939303b995a8"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:gaf74adb761b22566ad70004882712dce1"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT </td><td class="memItemRight" valign="bottom"><a class="el" href="group__HTTP-headers-create.html#gaf74adb761b22566ad70004882712dce1">lws_add_http_header_by_token</a> (struct lws *wsi, enum lws_token_indexes token, const unsigned char *value, int length, unsigned char **p, unsigned char *end)</td></tr>
+<tr class="separator:gaf74adb761b22566ad70004882712dce1"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:gacc76a5babcb4dce1b01b1955aa7a2faf"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT </td><td class="memItemRight" valign="bottom"><a class="el" href="group__HTTP-headers-create.html#gacc76a5babcb4dce1b01b1955aa7a2faf">lws_add_http_header_content_length</a> (struct lws *wsi, unsigned long content_length, unsigned char **p, unsigned char *end)</td></tr>
+<tr class="separator:gacc76a5babcb4dce1b01b1955aa7a2faf"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga4887605ff2242a54db3a7fa01f6f864b"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT </td><td class="memItemRight" valign="bottom"><a class="el" href="group__HTTP-headers-create.html#ga4887605ff2242a54db3a7fa01f6f864b">lws_finalize_http_header</a> (struct lws *wsi, unsigned char **p, unsigned char *end)</td></tr>
+<tr class="separator:ga4887605ff2242a54db3a7fa01f6f864b"><td class="memSeparator" colspan="2"> </td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<h2>HTTP headers: Create</h2>
+<p>These apis allow you to create HTTP response headers in a way compatible with both HTTP/1.x and HTTP/2.</p>
+<p>They each append to a buffer taking care about the buffer end, which is passed in as a pointer. When data is written to the buffer, the current position p is updated accordingly.</p>
+<p>All of these apis are LWS_WARN_UNUSED_RESULT as they can run out of space and fail with nonzero return. </p>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="ga2b36bf44405755ff51c1939303b995a8"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT lws_add_http_header_by_name </td>
+ <td>(</td>
+ <td class="paramtype">struct lws * </td>
+ <td class="paramname"><em>wsi</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const unsigned char * </td>
+ <td class="paramname"><em>name</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const unsigned char * </td>
+ <td class="paramname"><em>value</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">int </td>
+ <td class="paramname"><em>length</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">unsigned char ** </td>
+ <td class="paramname"><em>p</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">unsigned char * </td>
+ <td class="paramname"><em>end</em> </td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h.html">lib/libwebsockets.h</a>></code></p>
+<p><a class="el" href="group__HTTP-headers-create.html#ga2b36bf44405755ff51c1939303b995a8">lws_add_http_header_by_name()</a> - append named header and value</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">wsi</td><td>the connection to check </td></tr>
+ <tr><td class="paramname">name</td><td>the hdr name, like "my-header" </td></tr>
+ <tr><td class="paramname">value</td><td>the value after the = for this header </td></tr>
+ <tr><td class="paramname">length</td><td>the length of the value </td></tr>
+ <tr><td class="paramname">p</td><td>pointer to current position in buffer pointer </td></tr>
+ <tr><td class="paramname">end</td><td>pointer to end of buffer</td></tr>
+ </table>
+ </dd>
+</dl>
+<p>Appends name: value to the headers </p>
+
+</div>
+</div>
+<a class="anchor" id="gaf74adb761b22566ad70004882712dce1"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT lws_add_http_header_by_token </td>
+ <td>(</td>
+ <td class="paramtype">struct lws * </td>
+ <td class="paramname"><em>wsi</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">enum lws_token_indexes </td>
+ <td class="paramname"><em>token</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const unsigned char * </td>
+ <td class="paramname"><em>value</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">int </td>
+ <td class="paramname"><em>length</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">unsigned char ** </td>
+ <td class="paramname"><em>p</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">unsigned char * </td>
+ <td class="paramname"><em>end</em> </td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h.html">lib/libwebsockets.h</a>></code></p>
+<p><a class="el" href="group__HTTP-headers-create.html#gaf74adb761b22566ad70004882712dce1">lws_add_http_header_by_token()</a> - append given header and value</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">wsi</td><td>the connection to check </td></tr>
+ <tr><td class="paramname">token</td><td>the token index for the hdr </td></tr>
+ <tr><td class="paramname">value</td><td>the value after the = for this header </td></tr>
+ <tr><td class="paramname">length</td><td>the length of the value </td></tr>
+ <tr><td class="paramname">p</td><td>pointer to current position in buffer pointer </td></tr>
+ <tr><td class="paramname">end</td><td>pointer to end of buffer</td></tr>
+ </table>
+ </dd>
+</dl>
+<p>Appends name=value to the headers, but is able to take advantage of better HTTP/2 coding mechanisms where possible. </p>
+
+</div>
+</div>
+<a class="anchor" id="gacc76a5babcb4dce1b01b1955aa7a2faf"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT lws_add_http_header_content_length </td>
+ <td>(</td>
+ <td class="paramtype">struct lws * </td>
+ <td class="paramname"><em>wsi</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">unsigned long </td>
+ <td class="paramname"><em>content_length</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">unsigned char ** </td>
+ <td class="paramname"><em>p</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">unsigned char * </td>
+ <td class="paramname"><em>end</em> </td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h.html">lib/libwebsockets.h</a>></code></p>
+<p><a class="el" href="group__HTTP-headers-create.html#ga2b36bf44405755ff51c1939303b995a8">lws_add_http_header_by_name()</a> - append content-length helper</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">wsi</td><td>the connection to check </td></tr>
+ <tr><td class="paramname">content_length</td><td>the content length to use </td></tr>
+ <tr><td class="paramname">p</td><td>pointer to current position in buffer pointer </td></tr>
+ <tr><td class="paramname">end</td><td>pointer to end of buffer</td></tr>
+ </table>
+ </dd>
+</dl>
+<p>Appends content-length: content_length to the headers </p>
+
+</div>
+</div>
+<a class="anchor" id="ga29b7d6d2ddfdbaff3d8b607e7e3151b6"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT lws_add_http_header_status </td>
+ <td>(</td>
+ <td class="paramtype">struct lws * </td>
+ <td class="paramname"><em>wsi</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">unsigned int </td>
+ <td class="paramname"><em>code</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">unsigned char ** </td>
+ <td class="paramname"><em>p</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">unsigned char * </td>
+ <td class="paramname"><em>end</em> </td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h.html">lib/libwebsockets.h</a>></code></p>
+<p><a class="el" href="group__HTTP-headers-create.html#ga29b7d6d2ddfdbaff3d8b607e7e3151b6">lws_add_http_header_status()</a> - add the HTTP response status code</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">wsi</td><td>the connection to check </td></tr>
+ <tr><td class="paramname">code</td><td>an HTTP code like 200, 404 etc (see enum http_status) </td></tr>
+ <tr><td class="paramname">p</td><td>pointer to current position in buffer pointer </td></tr>
+ <tr><td class="paramname">end</td><td>pointer to end of buffer</td></tr>
+ </table>
+ </dd>
+</dl>
+<p>Adds the initial response code, so should be called first </p>
+
+</div>
+</div>
+<a class="anchor" id="ga4887605ff2242a54db3a7fa01f6f864b"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT lws_finalize_http_header </td>
+ <td>(</td>
+ <td class="paramtype">struct lws * </td>
+ <td class="paramname"><em>wsi</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">unsigned char ** </td>
+ <td class="paramname"><em>p</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">unsigned char * </td>
+ <td class="paramname"><em>end</em> </td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h.html">lib/libwebsockets.h</a>></code></p>
+<p><a class="el" href="group__HTTP-headers-create.html#ga4887605ff2242a54db3a7fa01f6f864b">lws_finalize_http_header()</a> - terminate header block</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">wsi</td><td>the connection to check </td></tr>
+ <tr><td class="paramname">p</td><td>pointer to current position in buffer pointer </td></tr>
+ <tr><td class="paramname">end</td><td>pointer to end of buffer</td></tr>
+ </table>
+ </dd>
+</dl>
+<p>Indicates no more headers will be added </p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">Generated by
+ <a href="http://www.doxygen.org/index.html">
+ <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.11 </li>
+ </ul>
+</div>
+</body>
+</html>
--- /dev/null
+var group__HTTP_headers_create =
+[
+ [ "lws_add_http_header_by_name", "group__HTTP-headers-create.html#ga2b36bf44405755ff51c1939303b995a8", null ],
+ [ "lws_add_http_header_by_token", "group__HTTP-headers-create.html#gaf74adb761b22566ad70004882712dce1", null ],
+ [ "lws_add_http_header_content_length", "group__HTTP-headers-create.html#gacc76a5babcb4dce1b01b1955aa7a2faf", null ],
+ [ "lws_add_http_header_status", "group__HTTP-headers-create.html#ga29b7d6d2ddfdbaff3d8b607e7e3151b6", null ],
+ [ "lws_finalize_http_header", "group__HTTP-headers-create.html#ga4887605ff2242a54db3a7fa01f6f864b", null ]
+];
\ No newline at end of file
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.11"/>
+<title>libwebsockets: HTTP headers: read</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="libwebsockets.org-logo.png"/></td>
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname">libwebsockets
+ </div>
+ <div id="projectbrief">Lightweight C library for HTML5 websockets</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.11 -->
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main Page</span></a></li>
+ <li><a href="pages.html"><span>Related Pages</span></a></li>
+ <li class="current"><a href="modules.html"><span>Modules</span></a></li>
+ <li><a href="annotated.html"><span>Data Structures</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('group__HTTP-headers-read.html','');});
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#nested-classes">Data Structures</a> |
+<a href="#enum-members">Enumerations</a> |
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">HTTP headers: read<div class="ingroups"><a class="el" href="group__http.html">HTTP</a></div></div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
+Data Structures</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__tokens.html">lws_tokens</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__token__limits.html">lws_token_limits</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="enum-members"></a>
+Enumerations</h2></td></tr>
+<tr class="memitem:ga6e747906f9d76532ec118d6ef418b82e"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ga6e747906f9d76532ec118d6ef418b82e"></a>enum  </td><td class="memItemRight" valign="bottom"><b>lws_token_indexes</b> { <br />
+  <b>WSI_TOKEN_GET_URI</b> = 0,
+<b>WSI_TOKEN_POST_URI</b> = 1,
+<b>WSI_TOKEN_OPTIONS_URI</b> = 2,
+<b>WSI_TOKEN_HOST</b> = 3,
+<br />
+  <b>WSI_TOKEN_CONNECTION</b> = 4,
+<b>WSI_TOKEN_UPGRADE</b> = 5,
+<b>WSI_TOKEN_ORIGIN</b> = 6,
+<b>WSI_TOKEN_DRAFT</b> = 7,
+<br />
+  <b>WSI_TOKEN_CHALLENGE</b> = 8,
+<b>WSI_TOKEN_EXTENSIONS</b> = 9,
+<b>WSI_TOKEN_KEY1</b> = 10,
+<b>WSI_TOKEN_KEY2</b> = 11,
+<br />
+  <b>WSI_TOKEN_PROTOCOL</b> = 12,
+<b>WSI_TOKEN_ACCEPT</b> = 13,
+<b>WSI_TOKEN_NONCE</b> = 14,
+<b>WSI_TOKEN_HTTP</b> = 15,
+<br />
+  <b>WSI_TOKEN_HTTP2_SETTINGS</b> = 16,
+<b>WSI_TOKEN_HTTP_ACCEPT</b> = 17,
+<b>WSI_TOKEN_HTTP_AC_REQUEST_HEADERS</b> = 18,
+<b>WSI_TOKEN_HTTP_IF_MODIFIED_SINCE</b> = 19,
+<br />
+  <b>WSI_TOKEN_HTTP_IF_NONE_MATCH</b> = 20,
+<b>WSI_TOKEN_HTTP_ACCEPT_ENCODING</b> = 21,
+<b>WSI_TOKEN_HTTP_ACCEPT_LANGUAGE</b> = 22,
+<b>WSI_TOKEN_HTTP_PRAGMA</b> = 23,
+<br />
+  <b>WSI_TOKEN_HTTP_CACHE_CONTROL</b> = 24,
+<b>WSI_TOKEN_HTTP_AUTHORIZATION</b> = 25,
+<b>WSI_TOKEN_HTTP_COOKIE</b> = 26,
+<b>WSI_TOKEN_HTTP_CONTENT_LENGTH</b> = 27,
+<br />
+  <b>WSI_TOKEN_HTTP_CONTENT_TYPE</b> = 28,
+<b>WSI_TOKEN_HTTP_DATE</b> = 29,
+<b>WSI_TOKEN_HTTP_RANGE</b> = 30,
+<b>WSI_TOKEN_HTTP_REFERER</b> = 31,
+<br />
+  <b>WSI_TOKEN_KEY</b> = 32,
+<b>WSI_TOKEN_VERSION</b> = 33,
+<b>WSI_TOKEN_SWORIGIN</b> = 34,
+<b>WSI_TOKEN_HTTP_COLON_AUTHORITY</b> = 35,
+<br />
+  <b>WSI_TOKEN_HTTP_COLON_METHOD</b> = 36,
+<b>WSI_TOKEN_HTTP_COLON_PATH</b> = 37,
+<b>WSI_TOKEN_HTTP_COLON_SCHEME</b> = 38,
+<b>WSI_TOKEN_HTTP_COLON_STATUS</b> = 39,
+<br />
+  <b>WSI_TOKEN_HTTP_ACCEPT_CHARSET</b> = 40,
+<b>WSI_TOKEN_HTTP_ACCEPT_RANGES</b> = 41,
+<b>WSI_TOKEN_HTTP_ACCESS_CONTROL_ALLOW_ORIGIN</b> = 42,
+<b>WSI_TOKEN_HTTP_AGE</b> = 43,
+<br />
+  <b>WSI_TOKEN_HTTP_ALLOW</b> = 44,
+<b>WSI_TOKEN_HTTP_CONTENT_DISPOSITION</b> = 45,
+<b>WSI_TOKEN_HTTP_CONTENT_ENCODING</b> = 46,
+<b>WSI_TOKEN_HTTP_CONTENT_LANGUAGE</b> = 47,
+<br />
+  <b>WSI_TOKEN_HTTP_CONTENT_LOCATION</b> = 48,
+<b>WSI_TOKEN_HTTP_CONTENT_RANGE</b> = 49,
+<b>WSI_TOKEN_HTTP_ETAG</b> = 50,
+<b>WSI_TOKEN_HTTP_EXPECT</b> = 51,
+<br />
+  <b>WSI_TOKEN_HTTP_EXPIRES</b> = 52,
+<b>WSI_TOKEN_HTTP_FROM</b> = 53,
+<b>WSI_TOKEN_HTTP_IF_MATCH</b> = 54,
+<b>WSI_TOKEN_HTTP_IF_RANGE</b> = 55,
+<br />
+  <b>WSI_TOKEN_HTTP_IF_UNMODIFIED_SINCE</b> = 56,
+<b>WSI_TOKEN_HTTP_LAST_MODIFIED</b> = 57,
+<b>WSI_TOKEN_HTTP_LINK</b> = 58,
+<b>WSI_TOKEN_HTTP_LOCATION</b> = 59,
+<br />
+  <b>WSI_TOKEN_HTTP_MAX_FORWARDS</b> = 60,
+<b>WSI_TOKEN_HTTP_PROXY_AUTHENTICATE</b> = 61,
+<b>WSI_TOKEN_HTTP_PROXY_AUTHORIZATION</b> = 62,
+<b>WSI_TOKEN_HTTP_REFRESH</b> = 63,
+<br />
+  <b>WSI_TOKEN_HTTP_RETRY_AFTER</b> = 64,
+<b>WSI_TOKEN_HTTP_SERVER</b> = 65,
+<b>WSI_TOKEN_HTTP_SET_COOKIE</b> = 66,
+<b>WSI_TOKEN_HTTP_STRICT_TRANSPORT_SECURITY</b> = 67,
+<br />
+  <b>WSI_TOKEN_HTTP_TRANSFER_ENCODING</b> = 68,
+<b>WSI_TOKEN_HTTP_USER_AGENT</b> = 69,
+<b>WSI_TOKEN_HTTP_VARY</b> = 70,
+<b>WSI_TOKEN_HTTP_VIA</b> = 71,
+<br />
+  <b>WSI_TOKEN_HTTP_WWW_AUTHENTICATE</b> = 72,
+<b>WSI_TOKEN_PATCH_URI</b> = 73,
+<b>WSI_TOKEN_PUT_URI</b> = 74,
+<b>WSI_TOKEN_DELETE_URI</b> = 75,
+<br />
+  <b>WSI_TOKEN_HTTP_URI_ARGS</b> = 76,
+<b>WSI_TOKEN_PROXY</b> = 77,
+<b>WSI_TOKEN_HTTP_X_REAL_IP</b> = 78,
+<b>WSI_TOKEN_HTTP1_0</b> = 79,
+<br />
+  <b>_WSI_TOKEN_CLIENT_SENT_PROTOCOLS</b>,
+<b>_WSI_TOKEN_CLIENT_PEER_ADDRESS</b>,
+<b>_WSI_TOKEN_CLIENT_URI</b>,
+<b>_WSI_TOKEN_CLIENT_HOST</b>,
+<br />
+  <b>_WSI_TOKEN_CLIENT_ORIGIN</b>,
+<b>_WSI_TOKEN_CLIENT_METHOD</b>,
+<b>WSI_TOKEN_COUNT</b>,
+<b>WSI_TOKEN_NAME_PART</b>,
+<br />
+  <b>WSI_TOKEN_SKIPPING</b>,
+<b>WSI_TOKEN_SKIPPING_SAW_CR</b>,
+<b>WSI_PARSING_COMPLETE</b>,
+<b>WSI_INIT_TOKEN_MUXURL</b>
+<br />
+ }</td></tr>
+<tr class="separator:ga6e747906f9d76532ec118d6ef418b82e"><td class="memSeparator" colspan="2"> </td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ga2c0597b2ef1d2cee35736c338bcbd17b"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN const unsigned char * </td><td class="memItemRight" valign="bottom"><a class="el" href="group__HTTP-headers-read.html#ga2c0597b2ef1d2cee35736c338bcbd17b">lws_token_to_string</a> (enum lws_token_indexes token)</td></tr>
+<tr class="separator:ga2c0597b2ef1d2cee35736c338bcbd17b"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga8ade0e1ffb0da7e62b989d8d867bf6c8"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT </td><td class="memItemRight" valign="bottom"><a class="el" href="group__HTTP-headers-read.html#ga8ade0e1ffb0da7e62b989d8d867bf6c8">lws_hdr_total_length</a> (struct lws *wsi, enum lws_token_indexes h)</td></tr>
+<tr class="separator:ga8ade0e1ffb0da7e62b989d8d867bf6c8"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga594f3d0ece5b09c2ccf9f98ea533bb4e"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT </td><td class="memItemRight" valign="bottom"><a class="el" href="group__HTTP-headers-read.html#ga594f3d0ece5b09c2ccf9f98ea533bb4e">lws_hdr_fragment_length</a> (struct lws *wsi, enum lws_token_indexes h, int frag_idx)</td></tr>
+<tr class="separator:ga594f3d0ece5b09c2ccf9f98ea533bb4e"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga6ce6aa1c0155ea42b7708bed271d1c77"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN int </td><td class="memItemRight" valign="bottom"><a class="el" href="group__HTTP-headers-read.html#ga6ce6aa1c0155ea42b7708bed271d1c77">lws_hdr_copy</a> (struct lws *wsi, char *dest, int len, enum lws_token_indexes h)</td></tr>
+<tr class="separator:ga6ce6aa1c0155ea42b7708bed271d1c77"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:gaa427cad61a9a5e3004afd65c4527b5e9"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN int </td><td class="memItemRight" valign="bottom"><a class="el" href="group__HTTP-headers-read.html#gaa427cad61a9a5e3004afd65c4527b5e9">lws_hdr_copy_fragment</a> (struct lws *wsi, char *dest, int len, enum lws_token_indexes h, int frag_idx)</td></tr>
+<tr class="separator:gaa427cad61a9a5e3004afd65c4527b5e9"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga84e9ce5e71a77501a0998ac403a984c2"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN const char * </td><td class="memItemRight" valign="bottom"><a class="el" href="group__HTTP-headers-read.html#ga84e9ce5e71a77501a0998ac403a984c2">lws_get_urlarg_by_name</a> (struct lws *wsi, const char *name, char *buf, int len)</td></tr>
+<tr class="separator:ga84e9ce5e71a77501a0998ac403a984c2"><td class="memSeparator" colspan="2"> </td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<h2>HTTP header releated functions</h2>
+<p>In lws the client http headers are temporarily stored in a pool, only for the duration of the http part of the handshake. It's because in most cases, the header content is ignored for the whole rest of the connection lifetime and would then just be taking up space needlessly.</p>
+<p>During LWS_CALLBACK_HTTP when the URI path is delivered is the last time the http headers are still allocated, you can use these apis then to look at and copy out interesting header content (cookies, etc)</p>
+<p>Notice that the header total length reported does not include a terminating '\0', however you must allocate for it when using the _copy apis. So the length reported for a header containing "123" is 3, but you must provide a buffer of length 4 so that "123\0" may be copied into it, or the copy will fail with a nonzero return code.</p>
+<p>In the special case of URL arguments, like ?x=1&y=2, the arguments are stored in a token named for the method, eg, WSI_TOKEN_GET_URI if it was a GET or WSI_TOKEN_POST_URI if POST. You can check the total length to confirm the method.</p>
+<p>For URL arguments, each argument is stored urldecoded in a "fragment", so you can use the fragment-aware api <a class="el" href="group__HTTP-headers-read.html#gaa427cad61a9a5e3004afd65c4527b5e9">lws_hdr_copy_fragment()</a> to access each argument in turn: the fragments contain urldecoded strings like x=1 or y=2.</p>
+<p>As a convenience, lws has an api that will find the fragment with a given name= part, <a class="el" href="group__HTTP-headers-read.html#ga84e9ce5e71a77501a0998ac403a984c2">lws_get_urlarg_by_name()</a>. </p>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="ga84e9ce5e71a77501a0998ac403a984c2"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">LWS_VISIBLE LWS_EXTERN const char* lws_get_urlarg_by_name </td>
+ <td>(</td>
+ <td class="paramtype">struct lws * </td>
+ <td class="paramname"><em>wsi</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const char * </td>
+ <td class="paramname"><em>name</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">char * </td>
+ <td class="paramname"><em>buf</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">int </td>
+ <td class="paramname"><em>len</em> </td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h.html">lib/libwebsockets.h</a>></code></p>
+<p><a class="el" href="group__HTTP-headers-read.html#ga84e9ce5e71a77501a0998ac403a984c2">lws_get_urlarg_by_name()</a> - return pointer to arg value if present </p><dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">wsi</td><td>the connection to check </td></tr>
+ <tr><td class="paramname">name</td><td>the arg name, like "token=" </td></tr>
+ <tr><td class="paramname">buf</td><td>the buffer to receive the urlarg (including the name= part) </td></tr>
+ <tr><td class="paramname">len</td><td>the length of the buffer to receive the urlarg <pre class="fragment">Returns NULL if not found or a pointer inside buf to just after the
+name= part.</pre> </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a class="anchor" id="ga6ce6aa1c0155ea42b7708bed271d1c77"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">LWS_VISIBLE LWS_EXTERN int lws_hdr_copy </td>
+ <td>(</td>
+ <td class="paramtype">struct lws * </td>
+ <td class="paramname"><em>wsi</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">char * </td>
+ <td class="paramname"><em>dest</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">int </td>
+ <td class="paramname"><em>len</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">enum lws_token_indexes </td>
+ <td class="paramname"><em>h</em> </td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h.html">lib/libwebsockets.h</a>></code></p>
+<p><a class="el" href="group__HTTP-headers-read.html#ga6ce6aa1c0155ea42b7708bed271d1c77">lws_hdr_copy()</a> - copy a single fragment of the given header to a buffer The buffer length len must include space for an additional terminating '\0', or it will fail returning -1.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">wsi</td><td>websocket connection </td></tr>
+ <tr><td class="paramname">dest</td><td>destination buffer </td></tr>
+ <tr><td class="paramname">len</td><td>length of destination buffer </td></tr>
+ <tr><td class="paramname">h</td><td>which header index we are interested in</td></tr>
+ </table>
+ </dd>
+</dl>
+<p>copies the whole, aggregated header, even if it was delivered in several actual headers piece by piece </p>
+
+</div>
+</div>
+<a class="anchor" id="gaa427cad61a9a5e3004afd65c4527b5e9"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">LWS_VISIBLE LWS_EXTERN int lws_hdr_copy_fragment </td>
+ <td>(</td>
+ <td class="paramtype">struct lws * </td>
+ <td class="paramname"><em>wsi</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">char * </td>
+ <td class="paramname"><em>dest</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">int </td>
+ <td class="paramname"><em>len</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">enum lws_token_indexes </td>
+ <td class="paramname"><em>h</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">int </td>
+ <td class="paramname"><em>frag_idx</em> </td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h.html">lib/libwebsockets.h</a>></code></p>
+<p><a class="el" href="group__HTTP-headers-read.html#gaa427cad61a9a5e3004afd65c4527b5e9">lws_hdr_copy_fragment()</a> - copy a single fragment of the given header to a buffer The buffer length len must include space for an additional terminating '\0', or it will fail returning -1. If the requested fragment index is not present, it fails returning -1.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">wsi</td><td>websocket connection </td></tr>
+ <tr><td class="paramname">dest</td><td>destination buffer </td></tr>
+ <tr><td class="paramname">len</td><td>length of destination buffer </td></tr>
+ <tr><td class="paramname">h</td><td>which header index we are interested in </td></tr>
+ <tr><td class="paramname">frag_idx</td><td>which fragment of h we want to copy</td></tr>
+ </table>
+ </dd>
+</dl>
+<p>Normally this is only useful to parse URI arguments like ?x=1&y=2, token index WSI_TOKEN_HTTP_URI_ARGS fragment 0 will contain "x=1" and fragment 1 "y=2" </p>
+
+</div>
+</div>
+<a class="anchor" id="ga594f3d0ece5b09c2ccf9f98ea533bb4e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT lws_hdr_fragment_length </td>
+ <td>(</td>
+ <td class="paramtype">struct lws * </td>
+ <td class="paramname"><em>wsi</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">enum lws_token_indexes </td>
+ <td class="paramname"><em>h</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">int </td>
+ <td class="paramname"><em>frag_idx</em> </td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h.html">lib/libwebsockets.h</a>></code></p>
+<p>lws_hdr_fragment_length: report length of a single fragment of a header The returned length does not include the space for a terminating '\0'</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">wsi</td><td>websocket connection </td></tr>
+ <tr><td class="paramname">h</td><td>which header index we are interested in </td></tr>
+ <tr><td class="paramname">frag_idx</td><td>which fragment of h we want to get the length of </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a class="anchor" id="ga8ade0e1ffb0da7e62b989d8d867bf6c8"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT lws_hdr_total_length </td>
+ <td>(</td>
+ <td class="paramtype">struct lws * </td>
+ <td class="paramname"><em>wsi</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">enum lws_token_indexes </td>
+ <td class="paramname"><em>h</em> </td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h.html">lib/libwebsockets.h</a>></code></p>
+<p>lws_hdr_total_length: report length of all fragments of a header totalled up The returned length does not include the space for a terminating '\0'</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">wsi</td><td>websocket connection </td></tr>
+ <tr><td class="paramname">h</td><td>which header index we are interested in </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a class="anchor" id="ga2c0597b2ef1d2cee35736c338bcbd17b"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">LWS_VISIBLE LWS_EXTERN const unsigned char* lws_token_to_string </td>
+ <td>(</td>
+ <td class="paramtype">enum lws_token_indexes </td>
+ <td class="paramname"><em>token</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h.html">lib/libwebsockets.h</a>></code></p>
+<p><a class="el" href="group__HTTP-headers-read.html#ga2c0597b2ef1d2cee35736c338bcbd17b">lws_token_to_string()</a> - returns a textual representation of a hdr token index</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname"></td><td></td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">Generated by
+ <a href="http://www.doxygen.org/index.html">
+ <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.11 </li>
+ </ul>
+</div>
+</body>
+</html>
--- /dev/null
+var group__HTTP_headers_read =
+[
+ [ "lws_tokens", "structlws__tokens.html", [
+ [ "token", "structlws__tokens.html#a9f3635412bc71a5cb78e9862b55f10cd", null ],
+ [ "token_len", "structlws__tokens.html#a855b7375d1d58516c0ecd4b60e9a7766", null ]
+ ] ],
+ [ "lws_token_limits", "structlws__token__limits.html", [
+ [ "token_limit", "structlws__token__limits.html#a6ec712306cbf8585bce7a56758a3ceff", null ]
+ ] ],
+ [ "lws_get_urlarg_by_name", "group__HTTP-headers-read.html#ga84e9ce5e71a77501a0998ac403a984c2", null ],
+ [ "lws_hdr_copy", "group__HTTP-headers-read.html#ga6ce6aa1c0155ea42b7708bed271d1c77", null ],
+ [ "lws_hdr_copy_fragment", "group__HTTP-headers-read.html#gaa427cad61a9a5e3004afd65c4527b5e9", null ],
+ [ "lws_hdr_fragment_length", "group__HTTP-headers-read.html#ga594f3d0ece5b09c2ccf9f98ea533bb4e", null ],
+ [ "lws_hdr_total_length", "group__HTTP-headers-read.html#ga8ade0e1ffb0da7e62b989d8d867bf6c8", null ],
+ [ "lws_token_to_string", "group__HTTP-headers-read.html#ga2c0597b2ef1d2cee35736c338bcbd17b", null ]
+];
\ No newline at end of file
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.11"/>
+<title>libwebsockets: Protocols and Plugins</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="libwebsockets.org-logo.png"/></td>
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname">libwebsockets
+ </div>
+ <div id="projectbrief">Lightweight C library for HTML5 websockets</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.11 -->
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main Page</span></a></li>
+ <li><a href="pages.html"><span>Related Pages</span></a></li>
+ <li class="current"><a href="modules.html"><span>Modules</span></a></li>
+ <li><a href="annotated.html"><span>Data Structures</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('group__Protocols-and-Plugins.html','');});
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#groups">Modules</a> |
+<a href="#nested-classes">Data Structures</a> |
+<a href="#typedef-members">Typedefs</a> |
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">Protocols and Plugins</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="groups"></a>
+Modules</h2></td></tr>
+<tr class="memitem:group__generic-sessions"><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="group__generic-sessions.html">plugin: generic-sessions</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
+Data Structures</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__protocols.html">lws_protocols</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__plugin__capability.html">lws_plugin_capability</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__plugin.html">lws_plugin</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="typedef-members"></a>
+Typedefs</h2></td></tr>
+<tr class="memitem:ga40994491e1567f91f579d2b444775266"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ga40994491e1567f91f579d2b444775266"></a>
+typedef int(* </td><td class="memItemRight" valign="bottom"><b>lws_plugin_init_func</b>) (struct lws_context *, struct <a class="el" href="structlws__plugin__capability.html">lws_plugin_capability</a> *)</td></tr>
+<tr class="separator:ga40994491e1567f91f579d2b444775266"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga83f7a924ba790fa273476075a59f08b0"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ga83f7a924ba790fa273476075a59f08b0"></a>
+typedef int(* </td><td class="memItemRight" valign="bottom"><b>lws_plugin_destroy_func</b>) (struct lws_context *)</td></tr>
+<tr class="separator:ga83f7a924ba790fa273476075a59f08b0"><td class="memSeparator" colspan="2"> </td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ga25754726d97c5f519d313e691a9fe29d"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN const struct <a class="el" href="structlws__protocols.html">lws_protocols</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="group__Protocols-and-Plugins.html#ga25754726d97c5f519d313e691a9fe29d">lws_vhost_name_to_protocol</a> (struct lws_vhost *vh, const char *name)</td></tr>
+<tr class="separator:ga25754726d97c5f519d313e691a9fe29d"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga72ad550786ca7976463589d347e62112"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN const struct <a class="el" href="structlws__protocols.html">lws_protocols</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="group__Protocols-and-Plugins.html#ga72ad550786ca7976463589d347e62112">lws_get_protocol</a> (struct lws *wsi)</td></tr>
+<tr class="separator:ga72ad550786ca7976463589d347e62112"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga8bbe5e65faca068845704bab911a5030"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN const struct <a class="el" href="structlws__protocols.html">lws_protocols</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="group__Protocols-and-Plugins.html#ga8bbe5e65faca068845704bab911a5030">lws_protocol_get</a> (struct lws *wsi) LWS_WARN_DEPRECATED</td></tr>
+<tr class="separator:ga8bbe5e65faca068845704bab911a5030"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:gaec0c0477288ff3f83aff38d357b883d1"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN void * </td><td class="memItemRight" valign="bottom"><a class="el" href="group__Protocols-and-Plugins.html#gaec0c0477288ff3f83aff38d357b883d1">lws_protocol_vh_priv_zalloc</a> (struct lws_vhost *vhost, const struct <a class="el" href="structlws__protocols.html">lws_protocols</a> *prot, int size)</td></tr>
+<tr class="separator:gaec0c0477288ff3f83aff38d357b883d1"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:gaf3be4243443baac0f8be1fcfb4d25129"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN void * </td><td class="memItemRight" valign="bottom"><a class="el" href="group__Protocols-and-Plugins.html#gaf3be4243443baac0f8be1fcfb4d25129">lws_protocol_vh_priv_get</a> (struct lws_vhost *vhost, const struct <a class="el" href="structlws__protocols.html">lws_protocols</a> *prot)</td></tr>
+<tr class="separator:gaf3be4243443baac0f8be1fcfb4d25129"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga106b37ae9c247e84d191ab09441adc43"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN int </td><td class="memItemRight" valign="bottom"><a class="el" href="group__Protocols-and-Plugins.html#ga106b37ae9c247e84d191ab09441adc43">lws_finalize_startup</a> (struct lws_context *context)</td></tr>
+<tr class="separator:ga106b37ae9c247e84d191ab09441adc43"><td class="memSeparator" colspan="2"> </td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<h2>Protocol and protocol plugin -related apis</h2>
+<p>Protocols bind ws protocol names to a custom callback specific to that protocol implementaion.</p>
+<p>A list of protocols can be passed in at context creation time, but it is also legal to leave that NULL and add the protocols and their callback code using plugins.</p>
+<p>Plugins are much preferable compared to cut and pasting code into an application each time, since they can be used standalone. </p>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="ga106b37ae9c247e84d191ab09441adc43"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">LWS_VISIBLE LWS_EXTERN int lws_finalize_startup </td>
+ <td>(</td>
+ <td class="paramtype">struct lws_context * </td>
+ <td class="paramname"><em>context</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h.html">lib/libwebsockets.h</a>></code></p>
+<p><a class="el" href="group__Protocols-and-Plugins.html#ga106b37ae9c247e84d191ab09441adc43">lws_finalize_startup()</a> - drop initial process privileges</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">context</td><td>lws context</td></tr>
+ </table>
+ </dd>
+</dl>
+<p>This is called after the end of the vhost protocol initializations, but you may choose to call it earlier </p>
+
+</div>
+</div>
+<a class="anchor" id="ga72ad550786ca7976463589d347e62112"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">LWS_VISIBLE LWS_EXTERN const struct <a class="el" href="structlws__protocols.html">lws_protocols</a>* lws_get_protocol </td>
+ <td>(</td>
+ <td class="paramtype">struct lws * </td>
+ <td class="paramname"><em>wsi</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h.html">lib/libwebsockets.h</a>></code></p>
+<p><a class="el" href="group__Protocols-and-Plugins.html#ga72ad550786ca7976463589d347e62112">lws_get_protocol()</a> - Returns a protocol pointer from a websocket connection. </p><dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">wsi</td><td>pointer to struct websocket you want to know the protocol of</td></tr>
+ </table>
+ </dd>
+</dl>
+<pre class="fragment"> Some apis can act on all live connections of a given protocol,
+ this is how you can get a pointer to the active protocol if needed.</pre>
+</div>
+</div>
+<a class="anchor" id="ga8bbe5e65faca068845704bab911a5030"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">LWS_VISIBLE LWS_EXTERN const struct <a class="el" href="structlws__protocols.html">lws_protocols</a>* lws_protocol_get </td>
+ <td>(</td>
+ <td class="paramtype">struct lws * </td>
+ <td class="paramname"><em>wsi</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h.html">lib/libwebsockets.h</a>></code></p>
+<p><a class="el" href="group__Protocols-and-Plugins.html#ga8bbe5e65faca068845704bab911a5030">lws_protocol_get()</a> - deprecated: use lws_get_protocol </p>
+
+</div>
+</div>
+<a class="anchor" id="gaf3be4243443baac0f8be1fcfb4d25129"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">LWS_VISIBLE LWS_EXTERN void* lws_protocol_vh_priv_get </td>
+ <td>(</td>
+ <td class="paramtype">struct lws_vhost * </td>
+ <td class="paramname"><em>vhost</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const struct <a class="el" href="structlws__protocols.html">lws_protocols</a> * </td>
+ <td class="paramname"><em>prot</em> </td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h.html">lib/libwebsockets.h</a>></code></p>
+<p><a class="el" href="group__Protocols-and-Plugins.html#gaf3be4243443baac0f8be1fcfb4d25129">lws_protocol_vh_priv_get()</a> - retreive a protocol's per-vhost storage</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">vhost</td><td>vhost the instance is related to </td></tr>
+ <tr><td class="paramname">prot</td><td>protocol the instance is related to</td></tr>
+ </table>
+ </dd>
+</dl>
+<p>Recover a pointer to the allocated per-vhost storage for the protocol created by <a class="el" href="group__Protocols-and-Plugins.html#gaec0c0477288ff3f83aff38d357b883d1">lws_protocol_vh_priv_zalloc()</a> earlier </p>
+
+</div>
+</div>
+<a class="anchor" id="gaec0c0477288ff3f83aff38d357b883d1"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">LWS_VISIBLE LWS_EXTERN void* lws_protocol_vh_priv_zalloc </td>
+ <td>(</td>
+ <td class="paramtype">struct lws_vhost * </td>
+ <td class="paramname"><em>vhost</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const struct <a class="el" href="structlws__protocols.html">lws_protocols</a> * </td>
+ <td class="paramname"><em>prot</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">int </td>
+ <td class="paramname"><em>size</em> </td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h.html">lib/libwebsockets.h</a>></code></p>
+<p><a class="el" href="group__Protocols-and-Plugins.html#gaec0c0477288ff3f83aff38d357b883d1">lws_protocol_vh_priv_zalloc()</a> - Allocate and zero down a protocol's per-vhost storage </p><dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">vhost</td><td>vhost the instance is related to </td></tr>
+ <tr><td class="paramname">prot</td><td>protocol the instance is related to </td></tr>
+ <tr><td class="paramname">size</td><td>bytes to allocate</td></tr>
+ </table>
+ </dd>
+</dl>
+<p>Protocols often find it useful to allocate a per-vhost struct, this is a helper to be called in the per-vhost init LWS_CALLBACK_PROTOCOL_INIT </p>
+
+</div>
+</div>
+<a class="anchor" id="ga25754726d97c5f519d313e691a9fe29d"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">LWS_VISIBLE LWS_EXTERN const struct <a class="el" href="structlws__protocols.html">lws_protocols</a>* lws_vhost_name_to_protocol </td>
+ <td>(</td>
+ <td class="paramtype">struct lws_vhost * </td>
+ <td class="paramname"><em>vh</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const char * </td>
+ <td class="paramname"><em>name</em> </td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h.html">lib/libwebsockets.h</a>></code></p>
+<p><a class="el" href="group__Protocols-and-Plugins.html#ga25754726d97c5f519d313e691a9fe29d">lws_vhost_name_to_protocol()</a> - get vhost's protocol object from its name</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">vh</td><td>vhost to search </td></tr>
+ <tr><td class="paramname">name</td><td>protocol name</td></tr>
+ </table>
+ </dd>
+</dl>
+<p>Returns NULL or a pointer to the vhost's protocol of the requested name </p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">Generated by
+ <a href="http://www.doxygen.org/index.html">
+ <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.11 </li>
+ </ul>
+</div>
+</body>
+</html>
--- /dev/null
+var group__Protocols_and_Plugins =
+[
+ [ "plugin: generic-sessions", "group__generic-sessions.html", "group__generic-sessions" ],
+ [ "lws_protocols", "structlws__protocols.html", [
+ [ "callback", "structlws__protocols.html#acabf94c1a9bfe7be0387fbb0e0c56b2d", null ],
+ [ "id", "structlws__protocols.html#a6b632018590c2b1bbe43fbab6d5e6fac", null ],
+ [ "name", "structlws__protocols.html#a0e63edb457a613c3fa4271e0a8f19624", null ],
+ [ "per_session_data_size", "structlws__protocols.html#a9bbd85f591ffb4259711cb5acbb05bea", null ],
+ [ "rx_buffer_size", "structlws__protocols.html#a0d1d4996d81b2f5e125bcec981e461c5", null ],
+ [ "user", "structlws__protocols.html#a3cbd903ad076736ae934a54cae36580e", null ]
+ ] ],
+ [ "lws_plugin_capability", "structlws__plugin__capability.html", [
+ [ "api_magic", "structlws__plugin__capability.html#a523c7cde6f15bba345f56493dcf6b32a", null ],
+ [ "count_extensions", "structlws__plugin__capability.html#abcf51db969522fdda9aaf902e65739d3", null ],
+ [ "count_protocols", "structlws__plugin__capability.html#ae38f7cf1246b9ca3af3cbf9d46b7090f", null ],
+ [ "extensions", "structlws__plugin__capability.html#a7936f0eb93d79dea76b903d0f8a5f623", null ],
+ [ "protocols", "structlws__plugin__capability.html#a6a4d9d01e770f378ddadc77b37522033", null ]
+ ] ],
+ [ "lws_plugin", "structlws__plugin.html", [
+ [ "caps", "structlws__plugin.html#ac7f1fdfe8cf8a21f8ee9720c21934a3f", null ],
+ [ "l", "structlws__plugin.html#a4ef37a43653715b6c69cbf8a7be747f4", null ],
+ [ "lib", "structlws__plugin.html#af9e1042dc1de5b9d202c2f5fd1834330", null ],
+ [ "list", "structlws__plugin.html#a65dffd68fd267ce17b988790d1d35f22", null ],
+ [ "name", "structlws__plugin.html#af4ac8fcb79e10e0c2d960e1804d98105", null ]
+ ] ],
+ [ "lws_finalize_startup", "group__Protocols-and-Plugins.html#ga106b37ae9c247e84d191ab09441adc43", null ],
+ [ "lws_get_protocol", "group__Protocols-and-Plugins.html#ga72ad550786ca7976463589d347e62112", null ],
+ [ "lws_protocol_get", "group__Protocols-and-Plugins.html#ga8bbe5e65faca068845704bab911a5030", null ],
+ [ "lws_protocol_vh_priv_get", "group__Protocols-and-Plugins.html#gaf3be4243443baac0f8be1fcfb4d25129", null ],
+ [ "lws_protocol_vh_priv_zalloc", "group__Protocols-and-Plugins.html#gaec0c0477288ff3f83aff38d357b883d1", null ],
+ [ "lws_vhost_name_to_protocol", "group__Protocols-and-Plugins.html#ga25754726d97c5f519d313e691a9fe29d", null ]
+];
\ No newline at end of file
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.11"/>
+<title>libwebsockets: Callback when writeable</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="libwebsockets.org-logo.png"/></td>
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname">libwebsockets
+ </div>
+ <div id="projectbrief">Lightweight C library for HTML5 websockets</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.11 -->
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main Page</span></a></li>
+ <li><a href="pages.html"><span>Related Pages</span></a></li>
+ <li class="current"><a href="modules.html"><span>Modules</span></a></li>
+ <li><a href="annotated.html"><span>Data Structures</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('group__callback-when-writeable.html','');});
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">Callback when writeable</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ga941caaa468bc507b1cae52275f58800d"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN int </td><td class="memItemRight" valign="bottom"><a class="el" href="group__callback-when-writeable.html#ga941caaa468bc507b1cae52275f58800d">lws_callback_on_writable</a> (struct lws *wsi)</td></tr>
+<tr class="separator:ga941caaa468bc507b1cae52275f58800d"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:gabbe4655c7eeb3eb1671b2323ec6b3107"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN int </td><td class="memItemRight" valign="bottom"><a class="el" href="group__callback-when-writeable.html#gabbe4655c7eeb3eb1671b2323ec6b3107">lws_callback_on_writable_all_protocol</a> (const struct lws_context *context, const struct <a class="el" href="structlws__protocols.html">lws_protocols</a> *protocol)</td></tr>
+<tr class="separator:gabbe4655c7eeb3eb1671b2323ec6b3107"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga8570860e191b62db264f2bac67354ea8"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN int </td><td class="memItemRight" valign="bottom"><a class="el" href="group__callback-when-writeable.html#ga8570860e191b62db264f2bac67354ea8">lws_callback_on_writable_all_protocol_vhost</a> (const struct lws_vhost *vhost, const struct <a class="el" href="structlws__protocols.html">lws_protocols</a> *protocol)</td></tr>
+<tr class="separator:ga8570860e191b62db264f2bac67354ea8"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:gacf04bbe089f47c971c6408c5efe2ac70"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN int </td><td class="memItemRight" valign="bottom"><a class="el" href="group__callback-when-writeable.html#gacf04bbe089f47c971c6408c5efe2ac70">lws_callback_all_protocol</a> (struct lws_context *context, const struct <a class="el" href="structlws__protocols.html">lws_protocols</a> *protocol, int reason)</td></tr>
+<tr class="separator:gacf04bbe089f47c971c6408c5efe2ac70"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga13c984d8c5a44a745fd02bc2fba36053"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN int </td><td class="memItemRight" valign="bottom"><a class="el" href="group__callback-when-writeable.html#ga13c984d8c5a44a745fd02bc2fba36053">lws_callback_all_protocol_vhost</a> (struct lws_vhost *vh, const struct <a class="el" href="structlws__protocols.html">lws_protocols</a> *protocol, int reason)</td></tr>
+<tr class="separator:ga13c984d8c5a44a745fd02bc2fba36053"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga60939cf0c073d933fde3d17f3591caf5"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN int </td><td class="memItemRight" valign="bottom"><a class="el" href="group__callback-when-writeable.html#ga60939cf0c073d933fde3d17f3591caf5">lws_callback_vhost_protocols</a> (struct lws *wsi, int reason, void *in, int len)</td></tr>
+<tr class="separator:ga60939cf0c073d933fde3d17f3591caf5"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:gaa709e02a10558753c851e58f1e2c16ba"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN int </td><td class="memItemRight" valign="bottom"><a class="el" href="group__callback-when-writeable.html#gaa709e02a10558753c851e58f1e2c16ba">lws_get_socket_fd</a> (struct lws *wsi)</td></tr>
+<tr class="separator:gaa709e02a10558753c851e58f1e2c16ba"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:gac4643fe16b0940ae5b68b4ee6195cbde"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN size_t </td><td class="memItemRight" valign="bottom"><a class="el" href="group__callback-when-writeable.html#gac4643fe16b0940ae5b68b4ee6195cbde">lws_get_peer_write_allowance</a> (struct lws *wsi)</td></tr>
+<tr class="separator:gac4643fe16b0940ae5b68b4ee6195cbde"><td class="memSeparator" colspan="2"> </td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<h2>Callback When Writeable</h2>
+<p>lws can only write data on a connection when it is able to accept more data without blocking.</p>
+<p>So a basic requirement is we should only use the <a class="el" href="group__sending-data.html#gafd5fdd285a0e25ba7e3e1051deec1001">lws_write()</a> apis when the connection we want to write on says that he can accept more data.</p>
+<p>When lws cannot complete your send at the time, it will buffer the data and send it in the background, suppressing any further WRITEABLE callbacks on that connection until it completes. So it is important to write new things in a new writeable callback.</p>
+<p>These apis reflect the various ways we can indicate we would like to be called back when one or more connections is writeable. </p>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="gacf04bbe089f47c971c6408c5efe2ac70"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">LWS_VISIBLE LWS_EXTERN int lws_callback_all_protocol </td>
+ <td>(</td>
+ <td class="paramtype">struct lws_context * </td>
+ <td class="paramname"><em>context</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const struct <a class="el" href="structlws__protocols.html">lws_protocols</a> * </td>
+ <td class="paramname"><em>protocol</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">int </td>
+ <td class="paramname"><em>reason</em> </td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h.html">lib/libwebsockets.h</a>></code></p>
+<p><a class="el" href="group__callback-when-writeable.html#gacf04bbe089f47c971c6408c5efe2ac70">lws_callback_all_protocol()</a> - Callback all connections using the given protocol with the given reason</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">context</td><td>lws_context </td></tr>
+ <tr><td class="paramname">protocol</td><td>Protocol whose connections will get callbacks </td></tr>
+ <tr><td class="paramname">reason</td><td>Callback reason index</td></tr>
+ </table>
+ </dd>
+</dl>
+<ul>
+<li>Which: connections using this protocol on ALL VHOSTS</li>
+<li>When: when the individual connection becomes writeable</li>
+<li>What: reason </li>
+</ul>
+
+</div>
+</div>
+<a class="anchor" id="ga13c984d8c5a44a745fd02bc2fba36053"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">LWS_VISIBLE LWS_EXTERN int lws_callback_all_protocol_vhost </td>
+ <td>(</td>
+ <td class="paramtype">struct lws_vhost * </td>
+ <td class="paramname"><em>vh</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const struct <a class="el" href="structlws__protocols.html">lws_protocols</a> * </td>
+ <td class="paramname"><em>protocol</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">int </td>
+ <td class="paramname"><em>reason</em> </td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h.html">lib/libwebsockets.h</a>></code></p>
+<p><a class="el" href="group__callback-when-writeable.html#ga13c984d8c5a44a745fd02bc2fba36053">lws_callback_all_protocol_vhost()</a> - Callback all connections using the given protocol with the given reason</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">vh</td><td>Vhost whose connections will get callbacks </td></tr>
+ <tr><td class="paramname">protocol</td><td>Which protocol to match </td></tr>
+ <tr><td class="paramname">reason</td><td>Callback reason index</td></tr>
+ </table>
+ </dd>
+</dl>
+<ul>
+<li>Which: connections using this protocol on GIVEN VHOST ONLY</li>
+<li>When: now</li>
+<li>What: reason </li>
+</ul>
+
+</div>
+</div>
+<a class="anchor" id="ga941caaa468bc507b1cae52275f58800d"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">LWS_VISIBLE LWS_EXTERN int lws_callback_on_writable </td>
+ <td>(</td>
+ <td class="paramtype">struct lws * </td>
+ <td class="paramname"><em>wsi</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h.html">lib/libwebsockets.h</a>></code></p>
+<p><a class="el" href="group__callback-when-writeable.html#ga941caaa468bc507b1cae52275f58800d">lws_callback_on_writable()</a> - Request a callback when this socket becomes able to be written to without blocking</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">wsi</td><td>Websocket connection instance to get callback for</td></tr>
+ </table>
+ </dd>
+</dl>
+<ul>
+<li>Which: only this wsi</li>
+<li>When: when the individual connection becomes writeable</li>
+<li>What: LWS_CALLBACK_*_WRITEABLE </li>
+</ul>
+
+</div>
+</div>
+<a class="anchor" id="gabbe4655c7eeb3eb1671b2323ec6b3107"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">LWS_VISIBLE LWS_EXTERN int lws_callback_on_writable_all_protocol </td>
+ <td>(</td>
+ <td class="paramtype">const struct lws_context * </td>
+ <td class="paramname"><em>context</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const struct <a class="el" href="structlws__protocols.html">lws_protocols</a> * </td>
+ <td class="paramname"><em>protocol</em> </td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h.html">lib/libwebsockets.h</a>></code></p>
+<p><a class="el" href="group__callback-when-writeable.html#gabbe4655c7eeb3eb1671b2323ec6b3107">lws_callback_on_writable_all_protocol()</a> - Request a callback for all connections on same vhost using the given protocol when it becomes possible to write to each socket without blocking in turn.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">context</td><td>lws_context </td></tr>
+ <tr><td class="paramname">protocol</td><td>Protocol whose connections will get callbacks</td></tr>
+ </table>
+ </dd>
+</dl>
+<ul>
+<li>Which: connections using this protocol on ANY VHOST</li>
+<li>When: when the individual connection becomes writeable</li>
+<li>What: LWS_CALLBACK_*_WRITEABLE </li>
+</ul>
+
+</div>
+</div>
+<a class="anchor" id="ga8570860e191b62db264f2bac67354ea8"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">LWS_VISIBLE LWS_EXTERN int lws_callback_on_writable_all_protocol_vhost </td>
+ <td>(</td>
+ <td class="paramtype">const struct lws_vhost * </td>
+ <td class="paramname"><em>vhost</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const struct <a class="el" href="structlws__protocols.html">lws_protocols</a> * </td>
+ <td class="paramname"><em>protocol</em> </td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h.html">lib/libwebsockets.h</a>></code></p>
+<p><a class="el" href="group__callback-when-writeable.html#ga8570860e191b62db264f2bac67354ea8">lws_callback_on_writable_all_protocol_vhost()</a> - Request a callback for all connections using the given protocol when it becomes possible to write to each socket without blocking in turn.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">vhost</td><td>Only consider connections on this lws_vhost </td></tr>
+ <tr><td class="paramname">protocol</td><td>Protocol whose connections will get callbacks</td></tr>
+ </table>
+ </dd>
+</dl>
+<ul>
+<li>Which: connections using this protocol on GIVEN VHOST ONLY</li>
+<li>When: when the individual connection becomes writeable</li>
+<li>What: LWS_CALLBACK_*_WRITEABLE </li>
+</ul>
+
+</div>
+</div>
+<a class="anchor" id="ga60939cf0c073d933fde3d17f3591caf5"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">LWS_VISIBLE LWS_EXTERN int lws_callback_vhost_protocols </td>
+ <td>(</td>
+ <td class="paramtype">struct lws * </td>
+ <td class="paramname"><em>wsi</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">int </td>
+ <td class="paramname"><em>reason</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">void * </td>
+ <td class="paramname"><em>in</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">int </td>
+ <td class="paramname"><em>len</em> </td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h.html">lib/libwebsockets.h</a>></code></p>
+<p><a class="el" href="group__callback-when-writeable.html#ga60939cf0c073d933fde3d17f3591caf5">lws_callback_vhost_protocols()</a> - Callback all protocols enabled on a vhost with the given reason</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">wsi</td><td>wsi whose vhost will get callbacks </td></tr>
+ <tr><td class="paramname">reason</td><td>Callback reason index </td></tr>
+ <tr><td class="paramname">in</td><td>in argument to callback </td></tr>
+ <tr><td class="paramname">len</td><td>len argument to callback</td></tr>
+ </table>
+ </dd>
+</dl>
+<ul>
+<li>Which: connections using this protocol on same VHOST as wsi ONLY</li>
+<li>When: now</li>
+<li>What: reason </li>
+</ul>
+
+</div>
+</div>
+<a class="anchor" id="gac4643fe16b0940ae5b68b4ee6195cbde"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">LWS_VISIBLE LWS_EXTERN size_t lws_get_peer_write_allowance </td>
+ <td>(</td>
+ <td class="paramtype">struct lws * </td>
+ <td class="paramname"><em>wsi</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h.html">lib/libwebsockets.h</a>></code></p>
+<p><a class="el" href="group__callback-when-writeable.html#gac4643fe16b0940ae5b68b4ee6195cbde">lws_get_peer_write_allowance()</a> - get the amount of data writeable to peer if known</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">wsi</td><td>Websocket connection instance</td></tr>
+ </table>
+ </dd>
+</dl>
+<p>if the protocol does not have any guidance, returns -1. Currently only http2 connections get send window information from this API. But your code should use it so it can work properly with any protocol.</p>
+<p>If nonzero return is the amount of payload data the peer or intermediary has reported it has buffer space for. That has NO relationship with the amount of buffer space your OS can accept on this connection for a write action.</p>
+<p>This number represents the maximum you could send to the peer or intermediary on this connection right now without the protocol complaining.</p>
+<p>lws manages accounting for send window updates and payload writes automatically, so this number reflects the situation at the peer or intermediary dynamically. </p>
+
+</div>
+</div>
+<a class="anchor" id="gaa709e02a10558753c851e58f1e2c16ba"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">LWS_VISIBLE LWS_EXTERN int lws_get_socket_fd </td>
+ <td>(</td>
+ <td class="paramtype">struct lws * </td>
+ <td class="paramname"><em>wsi</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h.html">lib/libwebsockets.h</a>></code></p>
+<p><a class="el" href="group__callback-when-writeable.html#gaa709e02a10558753c851e58f1e2c16ba">lws_get_socket_fd()</a> - returns the socket file descriptor</p>
+<p>You will not need this unless you are doing something special</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">wsi</td><td>Websocket connection instance </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">Generated by
+ <a href="http://www.doxygen.org/index.html">
+ <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.11 </li>
+ </ul>
+</div>
+</body>
+</html>
--- /dev/null
+var group__callback_when_writeable =
+[
+ [ "lws_callback_all_protocol", "group__callback-when-writeable.html#gacf04bbe089f47c971c6408c5efe2ac70", null ],
+ [ "lws_callback_all_protocol_vhost", "group__callback-when-writeable.html#ga13c984d8c5a44a745fd02bc2fba36053", null ],
+ [ "lws_callback_on_writable", "group__callback-when-writeable.html#ga941caaa468bc507b1cae52275f58800d", null ],
+ [ "lws_callback_on_writable_all_protocol", "group__callback-when-writeable.html#gabbe4655c7eeb3eb1671b2323ec6b3107", null ],
+ [ "lws_callback_on_writable_all_protocol_vhost", "group__callback-when-writeable.html#ga8570860e191b62db264f2bac67354ea8", null ],
+ [ "lws_callback_vhost_protocols", "group__callback-when-writeable.html#ga60939cf0c073d933fde3d17f3591caf5", null ],
+ [ "lws_get_peer_write_allowance", "group__callback-when-writeable.html#gac4643fe16b0940ae5b68b4ee6195cbde", null ],
+ [ "lws_get_socket_fd", "group__callback-when-writeable.html#gaa709e02a10558753c851e58f1e2c16ba", null ]
+];
\ No newline at end of file
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.11"/>
+<title>libwebsockets: cgi handling</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="libwebsockets.org-logo.png"/></td>
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname">libwebsockets
+ </div>
+ <div id="projectbrief">Lightweight C library for HTML5 websockets</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.11 -->
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main Page</span></a></li>
+ <li><a href="pages.html"><span>Related Pages</span></a></li>
+ <li class="current"><a href="modules.html"><span>Modules</span></a></li>
+ <li><a href="annotated.html"><span>Data Structures</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('group__cgi.html','');});
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="headertitle">
+<div class="title">cgi handling</div> </div>
+</div><!--header-->
+<div class="contents">
+<h2>CGI handling</h2>
+<p>These functions allow low-level control over stdin/out/err of the cgi.</p>
+<p>However for most cases, binding the cgi to http in and out, the default lws implementation already does the right thing. </p>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">Generated by
+ <a href="http://www.doxygen.org/index.html">
+ <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.11 </li>
+ </ul>
+</div>
+</body>
+</html>
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.11"/>
+<title>libwebsockets: Client</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="libwebsockets.org-logo.png"/></td>
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname">libwebsockets
+ </div>
+ <div id="projectbrief">Lightweight C library for HTML5 websockets</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.11 -->
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main Page</span></a></li>
+ <li><a href="pages.html"><span>Related Pages</span></a></li>
+ <li class="current"><a href="modules.html"><span>Modules</span></a></li>
+ <li><a href="annotated.html"><span>Data Structures</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('group__client.html','');});
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#nested-classes">Data Structures</a> |
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">Client</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
+Data Structures</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__client__connect__info.html">lws_client_connect_info</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:gac30a7be106abd0cedfbb2e8b8fe3a2f5"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN struct lws *LWS_WARN_UNUSED_RESULT </td><td class="memItemRight" valign="bottom"><a class="el" href="group__client.html#gac30a7be106abd0cedfbb2e8b8fe3a2f5">lws_client_connect_via_info</a> (struct <a class="el" href="structlws__client__connect__info.html">lws_client_connect_info</a> *ccinfo)</td></tr>
+<tr class="separator:gac30a7be106abd0cedfbb2e8b8fe3a2f5"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga4af0a20108a95e8b6d94dd4d80055ff3"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN struct lws *LWS_WARN_UNUSED_RESULT </td><td class="memItemRight" valign="bottom"><a class="el" href="group__client.html#ga4af0a20108a95e8b6d94dd4d80055ff3">lws_client_connect</a> (struct lws_context *clients, const char *address, int port, int ssl_connection, const char *path, const char *host, const char *origin, const char *protocol, int ietf_version_or_minus_one) LWS_WARN_DEPRECATED</td></tr>
+<tr class="separator:ga4af0a20108a95e8b6d94dd4d80055ff3"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:gac6a8558b4410961a880241c2ac1271e2"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN struct lws *LWS_WARN_UNUSED_RESULT </td><td class="memItemRight" valign="bottom"><a class="el" href="group__client.html#gac6a8558b4410961a880241c2ac1271e2">lws_client_connect_extended</a> (struct lws_context *clients, const char *address, int port, int ssl_connection, const char *path, const char *host, const char *origin, const char *protocol, int ietf_version_or_minus_one, void *userdata) LWS_WARN_DEPRECATED</td></tr>
+<tr class="separator:gac6a8558b4410961a880241c2ac1271e2"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga4f44b8230e6732816ca5cd8d1aaaf340"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN int </td><td class="memItemRight" valign="bottom"><a class="el" href="group__client.html#ga4f44b8230e6732816ca5cd8d1aaaf340">lws_init_vhost_client_ssl</a> (const struct <a class="el" href="structlws__context__creation__info.html">lws_context_creation_info</a> *info, struct lws_vhost *vhost)</td></tr>
+<tr class="separator:ga4f44b8230e6732816ca5cd8d1aaaf340"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga4450c34200bf9dab3beb90ef23221870"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ga4450c34200bf9dab3beb90ef23221870"></a>
+LWS_VISIBLE LWS_EXTERN int </td><td class="memItemRight" valign="bottom"><b>lws_http_client_read</b> (struct lws *wsi, char **buf, int *len)</td></tr>
+<tr class="separator:ga4450c34200bf9dab3beb90ef23221870"><td class="memSeparator" colspan="2"> </td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<h2>Client releated functions</h2>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="ga4af0a20108a95e8b6d94dd4d80055ff3"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">LWS_VISIBLE LWS_EXTERN struct lws* LWS_WARN_UNUSED_RESULT lws_client_connect </td>
+ <td>(</td>
+ <td class="paramtype">struct lws_context * </td>
+ <td class="paramname"><em>clients</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const char * </td>
+ <td class="paramname"><em>address</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">int </td>
+ <td class="paramname"><em>port</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">int </td>
+ <td class="paramname"><em>ssl_connection</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const char * </td>
+ <td class="paramname"><em>path</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const char * </td>
+ <td class="paramname"><em>host</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const char * </td>
+ <td class="paramname"><em>origin</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const char * </td>
+ <td class="paramname"><em>protocol</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">int </td>
+ <td class="paramname"><em>ietf_version_or_minus_one</em> </td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h.html">lib/libwebsockets.h</a>></code></p>
+<p><a class="el" href="group__client.html#ga4af0a20108a95e8b6d94dd4d80055ff3">lws_client_connect()</a> - Connect to another websocket server </p><dl class="deprecated"><dt><b><a class="el" href="deprecated.html#_deprecated000002">Deprecated:</a></b></dt><dd>DEPRECATED use lws_client_connect_via_info </dd></dl>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">clients</td><td>Websocket context </td></tr>
+ <tr><td class="paramname">address</td><td>Remote server address, eg, "myserver.com" </td></tr>
+ <tr><td class="paramname">port</td><td>Port to connect to on the remote server, eg, 80 </td></tr>
+ <tr><td class="paramname">ssl_connection</td><td>0 = ws://, 1 = wss:// encrypted, 2 = wss:// allow self signed certs </td></tr>
+ <tr><td class="paramname">path</td><td>Websocket path on server </td></tr>
+ <tr><td class="paramname">host</td><td>Hostname on server </td></tr>
+ <tr><td class="paramname">origin</td><td>Socket origin name </td></tr>
+ <tr><td class="paramname">protocol</td><td>Comma-separated list of protocols being asked for from the server, or just one. The server will pick the one it likes best. If you don't want to specify a protocol, which is legal, use NULL here. </td></tr>
+ <tr><td class="paramname">ietf_version_or_minus_one</td><td>-1 to ask to connect using the default, latest protocol supported, or the specific protocol ordinal</td></tr>
+ </table>
+ </dd>
+</dl>
+<p>This function creates a connection to a remote server </p>
+
+</div>
+</div>
+<a class="anchor" id="gac6a8558b4410961a880241c2ac1271e2"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">LWS_VISIBLE LWS_EXTERN struct lws* LWS_WARN_UNUSED_RESULT lws_client_connect_extended </td>
+ <td>(</td>
+ <td class="paramtype">struct lws_context * </td>
+ <td class="paramname"><em>clients</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const char * </td>
+ <td class="paramname"><em>address</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">int </td>
+ <td class="paramname"><em>port</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">int </td>
+ <td class="paramname"><em>ssl_connection</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const char * </td>
+ <td class="paramname"><em>path</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const char * </td>
+ <td class="paramname"><em>host</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const char * </td>
+ <td class="paramname"><em>origin</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const char * </td>
+ <td class="paramname"><em>protocol</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">int </td>
+ <td class="paramname"><em>ietf_version_or_minus_one</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">void * </td>
+ <td class="paramname"><em>userdata</em> </td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h.html">lib/libwebsockets.h</a>></code></p>
+<p><a class="el" href="group__client.html#gac6a8558b4410961a880241c2ac1271e2">lws_client_connect_extended()</a> - Connect to another websocket server </p><dl class="deprecated"><dt><b><a class="el" href="deprecated.html#_deprecated000003">Deprecated:</a></b></dt><dd>DEPRECATED use lws_client_connect_via_info </dd></dl>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">clients</td><td>Websocket context </td></tr>
+ <tr><td class="paramname">address</td><td>Remote server address, eg, "myserver.com" </td></tr>
+ <tr><td class="paramname">port</td><td>Port to connect to on the remote server, eg, 80 </td></tr>
+ <tr><td class="paramname">ssl_connection</td><td>0 = ws://, 1 = wss:// encrypted, 2 = wss:// allow self signed certs </td></tr>
+ <tr><td class="paramname">path</td><td>Websocket path on server </td></tr>
+ <tr><td class="paramname">host</td><td>Hostname on server </td></tr>
+ <tr><td class="paramname">origin</td><td>Socket origin name </td></tr>
+ <tr><td class="paramname">protocol</td><td>Comma-separated list of protocols being asked for from the server, or just one. The server will pick the one it likes best. </td></tr>
+ <tr><td class="paramname">ietf_version_or_minus_one</td><td>-1 to ask to connect using the default, latest protocol supported, or the specific protocol ordinal </td></tr>
+ <tr><td class="paramname">userdata</td><td>Pre-allocated user data <pre class="fragment"> This function creates a connection to a remote server</pre> </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a class="anchor" id="gac30a7be106abd0cedfbb2e8b8fe3a2f5"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">LWS_VISIBLE LWS_EXTERN struct lws* LWS_WARN_UNUSED_RESULT lws_client_connect_via_info </td>
+ <td>(</td>
+ <td class="paramtype">struct <a class="el" href="structlws__client__connect__info.html">lws_client_connect_info</a> * </td>
+ <td class="paramname"><em>ccinfo</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h.html">lib/libwebsockets.h</a>></code></p>
+<p><a class="el" href="group__client.html#gac30a7be106abd0cedfbb2e8b8fe3a2f5">lws_client_connect_via_info()</a> - Connect to another websocket server </p><dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">ccinfo</td><td>pointer to <a class="el" href="structlws__client__connect__info.html">lws_client_connect_info</a> struct <pre class="fragment"> This function creates a connection to a remote server</pre> </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a class="anchor" id="ga4f44b8230e6732816ca5cd8d1aaaf340"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">LWS_VISIBLE LWS_EXTERN int lws_init_vhost_client_ssl </td>
+ <td>(</td>
+ <td class="paramtype">const struct <a class="el" href="structlws__context__creation__info.html">lws_context_creation_info</a> * </td>
+ <td class="paramname"><em>info</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">struct lws_vhost * </td>
+ <td class="paramname"><em>vhost</em> </td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h.html">lib/libwebsockets.h</a>></code></p>
+<p><a class="el" href="group__client.html#ga4f44b8230e6732816ca5cd8d1aaaf340">lws_init_vhost_client_ssl()</a> - also enable client SSL on an existing vhost</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">info</td><td>client ssl related info </td></tr>
+ <tr><td class="paramname">vhost</td><td>which vhost to initialize client ssl operations on</td></tr>
+ </table>
+ </dd>
+</dl>
+<p>You only need to call this if you plan on using SSL client connections on the vhost. For non-SSL client connections, it's not necessary to call this.</p>
+<p>The following members of info are used during the call </p><pre class="fragment"> - options must have LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT set,
+ otherwise the call does nothing
+ - provided_client_ssl_ctx must be NULL to get a generated client
+ ssl context, otherwise you can pass a prepared one in by setting it
+ - ssl_cipher_list may be NULL or set to the client valid cipher list
+ - ssl_ca_filepath may be NULL or client cert filepath
+ - ssl_cert_filepath may be NULL or client cert filepath
+ - ssl_private_key_filepath may be NULL or client cert private key
+</pre><p>You must create your vhost explicitly if you want to use this, so you have a pointer to the vhost. Create the context first with the option flag LWS_SERVER_OPTION_EXPLICIT_VHOSTS and then call <a class="el" href="group__context-and-vhost.html#ga0c54c667ccd9b8b3dddcd123ca72f87c">lws_create_vhost()</a> with the same info struct. </p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">Generated by
+ <a href="http://www.doxygen.org/index.html">
+ <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.11 </li>
+ </ul>
+</div>
+</body>
+</html>
--- /dev/null
+var group__client =
+[
+ [ "lws_client_connect_info", "structlws__client__connect__info.html", [
+ [ "_unused", "structlws__client__connect__info.html#ad47f50d1633dc5df74548606c9a66d73", null ],
+ [ "address", "structlws__client__connect__info.html#aa364094f94ef1bcaaabbd9161971d502", null ],
+ [ "client_exts", "structlws__client__connect__info.html#a7732b996e977393c3e1076be2a8ded6c", null ],
+ [ "context", "structlws__client__connect__info.html#afe999d133cc240a0bfd02aade0514cfd", null ],
+ [ "host", "structlws__client__connect__info.html#a9b36d47c3422329df32c21040a35ebc7", null ],
+ [ "ietf_version_or_minus_one", "structlws__client__connect__info.html#a69abb5aeed755750b9755e5c91db6895", null ],
+ [ "method", "structlws__client__connect__info.html#aa9e8e3da4e783a0651b0dea62c2dd1db", null ],
+ [ "origin", "structlws__client__connect__info.html#a8595f83e64147cb687b6418cf500dd4c", null ],
+ [ "parent_wsi", "structlws__client__connect__info.html#a6843a60e1050b10db9d98d7eeb45f587", null ],
+ [ "path", "structlws__client__connect__info.html#a76a8388733f114fb8fd3643874781185", null ],
+ [ "port", "structlws__client__connect__info.html#a1af124d81c3c22a46d39387c5bc3d6b9", null ],
+ [ "protocol", "structlws__client__connect__info.html#aba35adfb74845a5fd0c3dc141cbdddd2", null ],
+ [ "ssl_connection", "structlws__client__connect__info.html#a9862297827639238a7a0b4054c3ddf3d", null ],
+ [ "uri_replace_from", "structlws__client__connect__info.html#a03c305fdca809667b6a9a83b3edfd83a", null ],
+ [ "uri_replace_to", "structlws__client__connect__info.html#a9959ba103d3d2484e559a9f7879eebe3", null ],
+ [ "userdata", "structlws__client__connect__info.html#a9831b9f9ab54a1aec4bb15324f1c3836", null ],
+ [ "vhost", "structlws__client__connect__info.html#a3893181d728f326f9f5b47c1459cb8be", null ]
+ ] ],
+ [ "lws_client_connect", "group__client.html#ga4af0a20108a95e8b6d94dd4d80055ff3", null ],
+ [ "lws_client_connect_extended", "group__client.html#gac6a8558b4410961a880241c2ac1271e2", null ],
+ [ "lws_client_connect_via_info", "group__client.html#gac30a7be106abd0cedfbb2e8b8fe3a2f5", null ],
+ [ "lws_init_vhost_client_ssl", "group__client.html#ga4f44b8230e6732816ca5cd8d1aaaf340", null ]
+];
\ No newline at end of file
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.11"/>
+<title>libwebsockets: Context-and-vhost</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="libwebsockets.org-logo.png"/></td>
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname">libwebsockets
+ </div>
+ <div id="projectbrief">Lightweight C library for HTML5 websockets</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.11 -->
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main Page</span></a></li>
+ <li><a href="pages.html"><span>Related Pages</span></a></li>
+ <li class="current"><a href="modules.html"><span>Modules</span></a></li>
+ <li><a href="annotated.html"><span>Data Structures</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('group__context-and-vhost.html','');});
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#groups">Modules</a> |
+<a href="#nested-classes">Data Structures</a> |
+<a href="#enum-members">Enumerations</a> |
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">Context-and-vhost</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="groups"></a>
+Modules</h2></td></tr>
+<tr class="memitem:group__vhost-mounts"><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="group__vhost-mounts.html">Vhost mounts and options</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
+Data Structures</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__context__creation__info.html">lws_context_creation_info</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__protocol__vhost__options.html">lws_protocol_vhost_options</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="enum-members"></a>
+Enumerations</h2></td></tr>
+<tr class="memitem:ga41c2d763f78cc248df3b9f8645dbd2a5"><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="group__context-and-vhost.html#ga41c2d763f78cc248df3b9f8645dbd2a5">lws_context_options</a> { <br />
+  <a class="el" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a274ed462a1a9239eb6ddf9007f5b7092">LWS_SERVER_OPTION_REQUIRE_VALID_OPENSSL_CLIENT_CERT</a>,
+<a class="el" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a6582c985ee0ceaadc1d277030eae2d7c">LWS_SERVER_OPTION_SKIP_SERVER_CANONICAL_NAME</a> = (1 << 2),
+<a class="el" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a1cc4562d05cba52a6dfa0697a65ade0d">LWS_SERVER_OPTION_ALLOW_NON_SSL_ON_SSL_PORT</a>,
+<a class="el" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a273d9975675130de0c6dc937dde7c8a6">LWS_SERVER_OPTION_LIBEV</a> = (1 << 4),
+<br />
+  <a class="el" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a34ab36e68c0d593b6f19b8d5ef1240a9">LWS_SERVER_OPTION_DISABLE_IPV6</a> = (1 << 5),
+<a class="el" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a4933347a821e73c3f1e13fb6bfc7ad93">LWS_SERVER_OPTION_DISABLE_OS_CA_CERTS</a> = (1 << 6),
+<a class="el" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5ac56a8a6590e74a8016d0fae09fb404fc">LWS_SERVER_OPTION_PEER_CERT_NOT_REQUIRED</a> = (1 << 7),
+<a class="el" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5aa0158b4e85420811e6b0f1378c6ded0f">LWS_SERVER_OPTION_VALIDATE_UTF8</a> = (1 << 8),
+<br />
+  <a class="el" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a1b2f8bde0f62adc7ebe81b2043f34c0c">LWS_SERVER_OPTION_SSL_ECDH</a>,
+<a class="el" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5aff121db04a10cf8b2c5df9d4f2b89f1e">LWS_SERVER_OPTION_LIBUV</a> = (1 << 10),
+<a class="el" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a4832187186c4d130c68051214cd42ada">LWS_SERVER_OPTION_REDIRECT_HTTP_TO_HTTPS</a>,
+<a class="el" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a7fed6a527c8d5e0acac1b4179644583a">LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT</a> = (1 << 12),
+<br />
+  <a class="el" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5accc9d0d11d1124a21659586164b0962e">LWS_SERVER_OPTION_EXPLICIT_VHOSTS</a> = (1 << 13),
+<a class="el" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a9637e9001d8c8b2521086bcafbd8a941">LWS_SERVER_OPTION_UNIX_SOCK</a> = (1 << 14),
+<a class="el" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5ac962efd35abf6c402f9fb14aa14f5016">LWS_SERVER_OPTION_STS</a> = (1 << 15),
+<a class="el" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5af62887536e25e053e68741006dba46d8">LWS_SERVER_OPTION_IPV6_V6ONLY_MODIFY</a> = (1 << 16),
+<br />
+  <a class="el" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5aca5d42820b65eac5618ec3f0bd8a1160">LWS_SERVER_OPTION_IPV6_V6ONLY_VALUE</a> = (1 << 17)
+<br />
+ }</td></tr>
+<tr class="separator:ga41c2d763f78cc248df3b9f8645dbd2a5"><td class="memSeparator" colspan="2"> </td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:gaf2fff58562caab7510c41eeac85a8648"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN struct lws_context * </td><td class="memItemRight" valign="bottom"><a class="el" href="group__context-and-vhost.html#gaf2fff58562caab7510c41eeac85a8648">lws_create_context</a> (struct <a class="el" href="structlws__context__creation__info.html">lws_context_creation_info</a> *info)</td></tr>
+<tr class="separator:gaf2fff58562caab7510c41eeac85a8648"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga8ee0314028755f1ddfa9428e09b4fddb"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN void </td><td class="memItemRight" valign="bottom"><a class="el" href="group__context-and-vhost.html#ga8ee0314028755f1ddfa9428e09b4fddb">lws_context_destroy</a> (struct lws_context *context)</td></tr>
+<tr class="separator:ga8ee0314028755f1ddfa9428e09b4fddb"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga7e9d5405547a457d86e0b4f0ae2bb1c4"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN int </td><td class="memItemRight" valign="bottom"><a class="el" href="group__context-and-vhost.html#ga7e9d5405547a457d86e0b4f0ae2bb1c4">lws_set_proxy</a> (struct lws_vhost *vhost, const char *proxy)</td></tr>
+<tr class="separator:ga7e9d5405547a457d86e0b4f0ae2bb1c4"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga0c54c667ccd9b8b3dddcd123ca72f87c"><td class="memItemLeft" align="right" valign="top">LWS_EXTERN LWS_VISIBLE struct lws_vhost * </td><td class="memItemRight" valign="bottom"><a class="el" href="group__context-and-vhost.html#ga0c54c667ccd9b8b3dddcd123ca72f87c">lws_create_vhost</a> (struct lws_context *context, struct <a class="el" href="structlws__context__creation__info.html">lws_context_creation_info</a> *info)</td></tr>
+<tr class="separator:ga0c54c667ccd9b8b3dddcd123ca72f87c"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga98d88c9080fd89c37114363a6474ea73"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN int </td><td class="memItemRight" valign="bottom"><a class="el" href="group__context-and-vhost.html#ga98d88c9080fd89c37114363a6474ea73">lwsws_get_config_globals</a> (struct <a class="el" href="structlws__context__creation__info.html">lws_context_creation_info</a> *info, const char *d, char **config_strings, int *len)</td></tr>
+<tr class="separator:ga98d88c9080fd89c37114363a6474ea73"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga341064721add2618ae1b29717493a212"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN int </td><td class="memItemRight" valign="bottom"><a class="el" href="group__context-and-vhost.html#ga341064721add2618ae1b29717493a212">lwsws_get_config_vhosts</a> (struct lws_context *context, struct <a class="el" href="structlws__context__creation__info.html">lws_context_creation_info</a> *info, const char *d, char **config_strings, int *len)</td></tr>
+<tr class="separator:ga341064721add2618ae1b29717493a212"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga8db03e19a372e34ac25cf21af894a02c"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN struct lws_vhost * </td><td class="memItemRight" valign="bottom"><a class="el" href="group__context-and-vhost.html#ga8db03e19a372e34ac25cf21af894a02c">lws_vhost_get</a> (struct lws *wsi) LWS_WARN_DEPRECATED</td></tr>
+<tr class="separator:ga8db03e19a372e34ac25cf21af894a02c"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga06e77ce2916f8bc9826ef8d9d68e3932"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN struct lws_vhost * </td><td class="memItemRight" valign="bottom"><a class="el" href="group__context-and-vhost.html#ga06e77ce2916f8bc9826ef8d9d68e3932">lws_get_vhost</a> (struct lws *wsi)</td></tr>
+<tr class="separator:ga06e77ce2916f8bc9826ef8d9d68e3932"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga94e6cc2223c4eec316b13bcebc3628b6"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN int </td><td class="memItemRight" valign="bottom"><a class="el" href="group__context-and-vhost.html#ga94e6cc2223c4eec316b13bcebc3628b6">lws_json_dump_vhost</a> (const struct lws_vhost *vh, char *buf, int len)</td></tr>
+<tr class="separator:ga94e6cc2223c4eec316b13bcebc3628b6"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:gae2134657cdd2ea7a59e13ad314e4c50d"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN int </td><td class="memItemRight" valign="bottom"><a class="el" href="group__context-and-vhost.html#gae2134657cdd2ea7a59e13ad314e4c50d">lws_json_dump_context</a> (const struct lws_context *context, char *buf, int len)</td></tr>
+<tr class="separator:gae2134657cdd2ea7a59e13ad314e4c50d"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:gaeb12f934bfd178bd2132a9e73fc641da"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN void * </td><td class="memItemRight" valign="bottom"><a class="el" href="group__context-and-vhost.html#gaeb12f934bfd178bd2132a9e73fc641da">lws_context_user</a> (struct lws_context *context)</td></tr>
+<tr class="separator:gaeb12f934bfd178bd2132a9e73fc641da"><td class="memSeparator" colspan="2"> </td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<h2>Context and Vhost releated functions</h2>
+<p>LWS requires that there is one context, in which you may define multiple vhosts. Each vhost is a virtual host, with either its own listen port or sharing an existing one. Each vhost has its own SSL context that can be set up individually or left disabled.</p>
+<p>If you don't care about multiple "site" support, you can ignore it and lws will create a single default vhost at context creation time. </p>
+<h2 class="groupheader">Enumeration Type Documentation</h2>
+<a class="anchor" id="ga41c2d763f78cc248df3b9f8645dbd2a5"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">enum <a class="el" href="group__context-and-vhost.html#ga41c2d763f78cc248df3b9f8645dbd2a5">lws_context_options</a></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h.html">lib/libwebsockets.h</a>></code></p>
+<p>enum lws_context_options - context and vhost options </p>
+<table class="fieldtable">
+<tr><th colspan="2">Enumerator</th></tr><tr><td class="fieldname"><a class="anchor" id="gga41c2d763f78cc248df3b9f8645dbd2a5a274ed462a1a9239eb6ddf9007f5b7092"></a>LWS_SERVER_OPTION_REQUIRE_VALID_OPENSSL_CLIENT_CERT </td><td class="fielddoc">
+<p>(VH) Don't allow the connection unless the client has a client cert that we recognize; provides LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT </p>
+</td></tr>
+<tr><td class="fieldname"><a class="anchor" id="gga41c2d763f78cc248df3b9f8645dbd2a5a6582c985ee0ceaadc1d277030eae2d7c"></a>LWS_SERVER_OPTION_SKIP_SERVER_CANONICAL_NAME </td><td class="fielddoc">
+<p>(CTX) Don't try to get the server's hostname </p>
+</td></tr>
+<tr><td class="fieldname"><a class="anchor" id="gga41c2d763f78cc248df3b9f8645dbd2a5a1cc4562d05cba52a6dfa0697a65ade0d"></a>LWS_SERVER_OPTION_ALLOW_NON_SSL_ON_SSL_PORT </td><td class="fielddoc">
+<p>(VH) Allow non-SSL (plaintext) connections on the same port as SSL is listening... undermines the security of SSL; provides LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT </p>
+</td></tr>
+<tr><td class="fieldname"><a class="anchor" id="gga41c2d763f78cc248df3b9f8645dbd2a5a273d9975675130de0c6dc937dde7c8a6"></a>LWS_SERVER_OPTION_LIBEV </td><td class="fielddoc">
+<p>(CTX) Use libev event loop </p>
+</td></tr>
+<tr><td class="fieldname"><a class="anchor" id="gga41c2d763f78cc248df3b9f8645dbd2a5a34ab36e68c0d593b6f19b8d5ef1240a9"></a>LWS_SERVER_OPTION_DISABLE_IPV6 </td><td class="fielddoc">
+<p>(VH) Disable IPV6 support </p>
+</td></tr>
+<tr><td class="fieldname"><a class="anchor" id="gga41c2d763f78cc248df3b9f8645dbd2a5a4933347a821e73c3f1e13fb6bfc7ad93"></a>LWS_SERVER_OPTION_DISABLE_OS_CA_CERTS </td><td class="fielddoc">
+<p>(VH) Don't load OS CA certs, you will need to load your own CA cert(s) </p>
+</td></tr>
+<tr><td class="fieldname"><a class="anchor" id="gga41c2d763f78cc248df3b9f8645dbd2a5ac56a8a6590e74a8016d0fae09fb404fc"></a>LWS_SERVER_OPTION_PEER_CERT_NOT_REQUIRED </td><td class="fielddoc">
+<p>(VH) Accept connections with no valid Cert (eg, selfsigned) </p>
+</td></tr>
+<tr><td class="fieldname"><a class="anchor" id="gga41c2d763f78cc248df3b9f8645dbd2a5aa0158b4e85420811e6b0f1378c6ded0f"></a>LWS_SERVER_OPTION_VALIDATE_UTF8 </td><td class="fielddoc">
+<p>(VH) Check UT-8 correctness </p>
+</td></tr>
+<tr><td class="fieldname"><a class="anchor" id="gga41c2d763f78cc248df3b9f8645dbd2a5a1b2f8bde0f62adc7ebe81b2043f34c0c"></a>LWS_SERVER_OPTION_SSL_ECDH </td><td class="fielddoc">
+<p>(VH) initialize ECDH ciphers </p>
+</td></tr>
+<tr><td class="fieldname"><a class="anchor" id="gga41c2d763f78cc248df3b9f8645dbd2a5aff121db04a10cf8b2c5df9d4f2b89f1e"></a>LWS_SERVER_OPTION_LIBUV </td><td class="fielddoc">
+<p>(CTX) Use libuv event loop </p>
+</td></tr>
+<tr><td class="fieldname"><a class="anchor" id="gga41c2d763f78cc248df3b9f8645dbd2a5a4832187186c4d130c68051214cd42ada"></a>LWS_SERVER_OPTION_REDIRECT_HTTP_TO_HTTPS </td><td class="fielddoc">
+<p>(VH) Use http redirect to force http to https (deprecated: use mount redirection) </p>
+</td></tr>
+<tr><td class="fieldname"><a class="anchor" id="gga41c2d763f78cc248df3b9f8645dbd2a5a7fed6a527c8d5e0acac1b4179644583a"></a>LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT </td><td class="fielddoc">
+<p>(CTX) Initialize the SSL library at all </p>
+</td></tr>
+<tr><td class="fieldname"><a class="anchor" id="gga41c2d763f78cc248df3b9f8645dbd2a5accc9d0d11d1124a21659586164b0962e"></a>LWS_SERVER_OPTION_EXPLICIT_VHOSTS </td><td class="fielddoc">
+<p>(CTX) Only create the context when calling context create api, implies user code will create its own vhosts </p>
+</td></tr>
+<tr><td class="fieldname"><a class="anchor" id="gga41c2d763f78cc248df3b9f8645dbd2a5a9637e9001d8c8b2521086bcafbd8a941"></a>LWS_SERVER_OPTION_UNIX_SOCK </td><td class="fielddoc">
+<p>(VH) Use Unix socket </p>
+</td></tr>
+<tr><td class="fieldname"><a class="anchor" id="gga41c2d763f78cc248df3b9f8645dbd2a5ac962efd35abf6c402f9fb14aa14f5016"></a>LWS_SERVER_OPTION_STS </td><td class="fielddoc">
+<p>(VH) Send Strict Transport Security header, making clients subsequently go to https even if user asked for http </p>
+</td></tr>
+<tr><td class="fieldname"><a class="anchor" id="gga41c2d763f78cc248df3b9f8645dbd2a5af62887536e25e053e68741006dba46d8"></a>LWS_SERVER_OPTION_IPV6_V6ONLY_MODIFY </td><td class="fielddoc">
+<p>(VH) Enable LWS_SERVER_OPTION_IPV6_V6ONLY_VALUE to take effect </p>
+</td></tr>
+<tr><td class="fieldname"><a class="anchor" id="gga41c2d763f78cc248df3b9f8645dbd2a5aca5d42820b65eac5618ec3f0bd8a1160"></a>LWS_SERVER_OPTION_IPV6_V6ONLY_VALUE </td><td class="fielddoc">
+<p>(VH) if set, only ipv6 allowed on the vhost </p>
+</td></tr>
+</table>
+<div class="fragment"><div class="line"><a name="l01347"></a><span class="lineno"> 1347</span>  {</div><div class="line"><a name="l01348"></a><span class="lineno"> 1348</span>  <a class="code" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a274ed462a1a9239eb6ddf9007f5b7092">LWS_SERVER_OPTION_REQUIRE_VALID_OPENSSL_CLIENT_CERT</a> = (1 << 1) |</div><div class="line"><a name="l01349"></a><span class="lineno"> 1349</span>  (1 << 12),</div><div class="line"><a name="l01353"></a><span class="lineno"> 1353</span>  <a class="code" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a6582c985ee0ceaadc1d277030eae2d7c">LWS_SERVER_OPTION_SKIP_SERVER_CANONICAL_NAME</a> = (1 << 2),</div><div class="line"><a name="l01355"></a><span class="lineno"> 1355</span>  <a class="code" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a1cc4562d05cba52a6dfa0697a65ade0d">LWS_SERVER_OPTION_ALLOW_NON_SSL_ON_SSL_PORT</a> = (1 << 3) |</div><div class="line"><a name="l01356"></a><span class="lineno"> 1356</span>  (1 << 12),</div><div class="line"><a name="l01360"></a><span class="lineno"> 1360</span>  <a class="code" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a273d9975675130de0c6dc937dde7c8a6">LWS_SERVER_OPTION_LIBEV</a> = (1 << 4),</div><div class="line"><a name="l01362"></a><span class="lineno"> 1362</span>  <a class="code" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a34ab36e68c0d593b6f19b8d5ef1240a9">LWS_SERVER_OPTION_DISABLE_IPV6</a> = (1 << 5),</div><div class="line"><a name="l01364"></a><span class="lineno"> 1364</span>  <a class="code" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a4933347a821e73c3f1e13fb6bfc7ad93">LWS_SERVER_OPTION_DISABLE_OS_CA_CERTS</a> = (1 << 6),</div><div class="line"><a name="l01367"></a><span class="lineno"> 1367</span>  <a class="code" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5ac56a8a6590e74a8016d0fae09fb404fc">LWS_SERVER_OPTION_PEER_CERT_NOT_REQUIRED</a> = (1 << 7),</div><div class="line"><a name="l01369"></a><span class="lineno"> 1369</span>  <a class="code" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5aa0158b4e85420811e6b0f1378c6ded0f">LWS_SERVER_OPTION_VALIDATE_UTF8</a> = (1 << 8),</div><div class="line"><a name="l01371"></a><span class="lineno"> 1371</span>  <a class="code" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a1b2f8bde0f62adc7ebe81b2043f34c0c">LWS_SERVER_OPTION_SSL_ECDH</a> = (1 << 9) |</div><div class="line"><a name="l01372"></a><span class="lineno"> 1372</span>  (1 << 12),</div><div class="line"><a name="l01374"></a><span class="lineno"> 1374</span>  <a class="code" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5aff121db04a10cf8b2c5df9d4f2b89f1e">LWS_SERVER_OPTION_LIBUV</a> = (1 << 10),</div><div class="line"><a name="l01376"></a><span class="lineno"> 1376</span>  <a class="code" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a4832187186c4d130c68051214cd42ada">LWS_SERVER_OPTION_REDIRECT_HTTP_TO_HTTPS</a> = (1 << 11) |</div><div class="line"><a name="l01377"></a><span class="lineno"> 1377</span>  (1 << 3) |</div><div class="line"><a name="l01378"></a><span class="lineno"> 1378</span>  (1 << 12),</div><div class="line"><a name="l01381"></a><span class="lineno"> 1381</span>  <a class="code" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a7fed6a527c8d5e0acac1b4179644583a">LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT</a> = (1 << 12),</div><div class="line"><a name="l01383"></a><span class="lineno"> 1383</span>  <a class="code" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5accc9d0d11d1124a21659586164b0962e">LWS_SERVER_OPTION_EXPLICIT_VHOSTS</a> = (1 << 13),</div><div class="line"><a name="l01386"></a><span class="lineno"> 1386</span>  <a class="code" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a9637e9001d8c8b2521086bcafbd8a941">LWS_SERVER_OPTION_UNIX_SOCK</a> = (1 << 14),</div><div class="line"><a name="l01388"></a><span class="lineno"> 1388</span>  <a class="code" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5ac962efd35abf6c402f9fb14aa14f5016">LWS_SERVER_OPTION_STS</a> = (1 << 15),</div><div class="line"><a name="l01391"></a><span class="lineno"> 1391</span>  <a class="code" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5af62887536e25e053e68741006dba46d8">LWS_SERVER_OPTION_IPV6_V6ONLY_MODIFY</a> = (1 << 16),</div><div class="line"><a name="l01393"></a><span class="lineno"> 1393</span>  <a class="code" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5aca5d42820b65eac5618ec3f0bd8a1160">LWS_SERVER_OPTION_IPV6_V6ONLY_VALUE</a> = (1 << 17),</div><div class="line"><a name="l01396"></a><span class="lineno"> 1396</span>  <span class="comment">/****** add new things just above ---^ ******/</span></div><div class="line"><a name="l01397"></a><span class="lineno"> 1397</span> };</div><div class="ttc" id="group__context-and-vhost_html_gga41c2d763f78cc248df3b9f8645dbd2a5a274ed462a1a9239eb6ddf9007f5b7092"><div class="ttname"><a href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a274ed462a1a9239eb6ddf9007f5b7092">LWS_SERVER_OPTION_REQUIRE_VALID_OPENSSL_CLIENT_CERT</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1348</div></div>
+<div class="ttc" id="group__context-and-vhost_html_gga41c2d763f78cc248df3b9f8645dbd2a5a4933347a821e73c3f1e13fb6bfc7ad93"><div class="ttname"><a href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a4933347a821e73c3f1e13fb6bfc7ad93">LWS_SERVER_OPTION_DISABLE_OS_CA_CERTS</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1364</div></div>
+<div class="ttc" id="group__context-and-vhost_html_gga41c2d763f78cc248df3b9f8645dbd2a5a4832187186c4d130c68051214cd42ada"><div class="ttname"><a href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a4832187186c4d130c68051214cd42ada">LWS_SERVER_OPTION_REDIRECT_HTTP_TO_HTTPS</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1376</div></div>
+<div class="ttc" id="group__context-and-vhost_html_gga41c2d763f78cc248df3b9f8645dbd2a5accc9d0d11d1124a21659586164b0962e"><div class="ttname"><a href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5accc9d0d11d1124a21659586164b0962e">LWS_SERVER_OPTION_EXPLICIT_VHOSTS</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1383</div></div>
+<div class="ttc" id="group__context-and-vhost_html_gga41c2d763f78cc248df3b9f8645dbd2a5a6582c985ee0ceaadc1d277030eae2d7c"><div class="ttname"><a href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a6582c985ee0ceaadc1d277030eae2d7c">LWS_SERVER_OPTION_SKIP_SERVER_CANONICAL_NAME</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1353</div></div>
+<div class="ttc" id="group__context-and-vhost_html_gga41c2d763f78cc248df3b9f8645dbd2a5a1b2f8bde0f62adc7ebe81b2043f34c0c"><div class="ttname"><a href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a1b2f8bde0f62adc7ebe81b2043f34c0c">LWS_SERVER_OPTION_SSL_ECDH</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1371</div></div>
+<div class="ttc" id="group__context-and-vhost_html_gga41c2d763f78cc248df3b9f8645dbd2a5a1cc4562d05cba52a6dfa0697a65ade0d"><div class="ttname"><a href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a1cc4562d05cba52a6dfa0697a65ade0d">LWS_SERVER_OPTION_ALLOW_NON_SSL_ON_SSL_PORT</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1355</div></div>
+<div class="ttc" id="group__context-and-vhost_html_gga41c2d763f78cc248df3b9f8645dbd2a5a273d9975675130de0c6dc937dde7c8a6"><div class="ttname"><a href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a273d9975675130de0c6dc937dde7c8a6">LWS_SERVER_OPTION_LIBEV</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1360</div></div>
+<div class="ttc" id="group__context-and-vhost_html_gga41c2d763f78cc248df3b9f8645dbd2a5a7fed6a527c8d5e0acac1b4179644583a"><div class="ttname"><a href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a7fed6a527c8d5e0acac1b4179644583a">LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1381</div></div>
+<div class="ttc" id="group__context-and-vhost_html_gga41c2d763f78cc248df3b9f8645dbd2a5aca5d42820b65eac5618ec3f0bd8a1160"><div class="ttname"><a href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5aca5d42820b65eac5618ec3f0bd8a1160">LWS_SERVER_OPTION_IPV6_V6ONLY_VALUE</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1393</div></div>
+<div class="ttc" id="group__context-and-vhost_html_gga41c2d763f78cc248df3b9f8645dbd2a5a34ab36e68c0d593b6f19b8d5ef1240a9"><div class="ttname"><a href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a34ab36e68c0d593b6f19b8d5ef1240a9">LWS_SERVER_OPTION_DISABLE_IPV6</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1362</div></div>
+<div class="ttc" id="group__context-and-vhost_html_gga41c2d763f78cc248df3b9f8645dbd2a5aff121db04a10cf8b2c5df9d4f2b89f1e"><div class="ttname"><a href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5aff121db04a10cf8b2c5df9d4f2b89f1e">LWS_SERVER_OPTION_LIBUV</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1374</div></div>
+<div class="ttc" id="group__context-and-vhost_html_gga41c2d763f78cc248df3b9f8645dbd2a5a9637e9001d8c8b2521086bcafbd8a941"><div class="ttname"><a href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a9637e9001d8c8b2521086bcafbd8a941">LWS_SERVER_OPTION_UNIX_SOCK</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1386</div></div>
+<div class="ttc" id="group__context-and-vhost_html_gga41c2d763f78cc248df3b9f8645dbd2a5aa0158b4e85420811e6b0f1378c6ded0f"><div class="ttname"><a href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5aa0158b4e85420811e6b0f1378c6ded0f">LWS_SERVER_OPTION_VALIDATE_UTF8</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1369</div></div>
+<div class="ttc" id="group__context-and-vhost_html_gga41c2d763f78cc248df3b9f8645dbd2a5ac56a8a6590e74a8016d0fae09fb404fc"><div class="ttname"><a href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5ac56a8a6590e74a8016d0fae09fb404fc">LWS_SERVER_OPTION_PEER_CERT_NOT_REQUIRED</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1367</div></div>
+<div class="ttc" id="group__context-and-vhost_html_gga41c2d763f78cc248df3b9f8645dbd2a5ac962efd35abf6c402f9fb14aa14f5016"><div class="ttname"><a href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5ac962efd35abf6c402f9fb14aa14f5016">LWS_SERVER_OPTION_STS</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1388</div></div>
+<div class="ttc" id="group__context-and-vhost_html_gga41c2d763f78cc248df3b9f8645dbd2a5af62887536e25e053e68741006dba46d8"><div class="ttname"><a href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5af62887536e25e053e68741006dba46d8">LWS_SERVER_OPTION_IPV6_V6ONLY_MODIFY</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1391</div></div>
+</div><!-- fragment -->
+</div>
+</div>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="ga8ee0314028755f1ddfa9428e09b4fddb"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">LWS_VISIBLE LWS_EXTERN void lws_context_destroy </td>
+ <td>(</td>
+ <td class="paramtype">struct lws_context * </td>
+ <td class="paramname"><em>context</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h.html">lib/libwebsockets.h</a>></code></p>
+<p><a class="el" href="group__context-and-vhost.html#ga8ee0314028755f1ddfa9428e09b4fddb">lws_context_destroy()</a> - Destroy the websocket context </p><dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">context</td><td>Websocket context <pre class="fragment"> This function closes any active connections and then frees the
+ context. After calling this, any further use of the context is
+ undefined.</pre> </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a class="anchor" id="gaeb12f934bfd178bd2132a9e73fc641da"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">LWS_VISIBLE LWS_EXTERN void* lws_context_user </td>
+ <td>(</td>
+ <td class="paramtype">struct lws_context * </td>
+ <td class="paramname"><em>context</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h.html">lib/libwebsockets.h</a>></code></p>
+<p><a class="el" href="group__context-and-vhost.html#gaeb12f934bfd178bd2132a9e73fc641da">lws_context_user()</a> - get the user data associated with the context </p><dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">context</td><td>Websocket context</td></tr>
+ </table>
+ </dd>
+</dl>
+<p>This returns the optional user allocation that can be attached to the context the sockets live in at context_create time. It's a way to let all sockets serviced in the same context share data without using globals statics in the user code. </p>
+
+</div>
+</div>
+<a class="anchor" id="gaf2fff58562caab7510c41eeac85a8648"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">LWS_VISIBLE LWS_EXTERN struct lws_context* lws_create_context </td>
+ <td>(</td>
+ <td class="paramtype">struct <a class="el" href="structlws__context__creation__info.html">lws_context_creation_info</a> * </td>
+ <td class="paramname"><em>info</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h.html">lib/libwebsockets.h</a>></code></p>
+<p><a class="el" href="group__context-and-vhost.html#gaf2fff58562caab7510c41eeac85a8648">lws_create_context()</a> - Create the websocket handler </p><dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">info</td><td>pointer to struct with parameters <pre class="fragment"> This function creates the listening socket (if serving) and takes care
+ of all initialization in one step.
+
+ If option LWS_SERVER_OPTION_EXPLICIT_VHOSTS is given, no vhost is
+ created; you're expected to create your own vhosts afterwards using
+ lws_create_vhost(). Otherwise a vhost named "default" is also created
+ using the information in the vhost-related members, for compatibility.
+
+ After initialization, it returns a struct lws_context * that
+ represents this server. After calling, user code needs to take care
+ of calling lws_service() with the context pointer to get the
+ server's sockets serviced. This must be done in the same process
+ context as the initialization call.
+
+ The protocol callback functions are called for a handful of events
+ including http requests coming in, websocket connections becoming
+ established, and data arriving; it's also called periodically to allow
+ async transmission.
+
+ HTTP requests are sent always to the FIRST protocol in protocol, since
+ at that time websocket protocol has not been negotiated. Other
+ protocols after the first one never see any HTTP callack activity.
+
+ The server created is a simple http server by default; part of the
+ websocket standard is upgrading this http connection to a websocket one.
+
+ This allows the same server to provide files like scripts and favicon /
+ images or whatever over http and dynamic data over websockets all in
+ one place; they're all handled in the user callback.</pre> </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a class="anchor" id="ga0c54c667ccd9b8b3dddcd123ca72f87c"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">LWS_EXTERN LWS_VISIBLE struct lws_vhost* lws_create_vhost </td>
+ <td>(</td>
+ <td class="paramtype">struct lws_context * </td>
+ <td class="paramname"><em>context</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">struct <a class="el" href="structlws__context__creation__info.html">lws_context_creation_info</a> * </td>
+ <td class="paramname"><em>info</em> </td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h.html">lib/libwebsockets.h</a>></code></p>
+<p><a class="el" href="group__context-and-vhost.html#ga0c54c667ccd9b8b3dddcd123ca72f87c">lws_create_vhost()</a> - Create a vhost (virtual server context) </p><dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">context</td><td>pointer to result of <a class="el" href="group__context-and-vhost.html#gaf2fff58562caab7510c41eeac85a8648">lws_create_context()</a> </td></tr>
+ <tr><td class="paramname">info</td><td>pointer to struct with parameters</td></tr>
+ </table>
+ </dd>
+</dl>
+<p>This function creates a virtual server (vhost) using the vhost-related members of the info struct. You can create many vhosts inside one context if you created the context with the option LWS_SERVER_OPTION_EXPLICIT_VHOSTS </p>
+
+</div>
+</div>
+<a class="anchor" id="ga06e77ce2916f8bc9826ef8d9d68e3932"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">LWS_VISIBLE LWS_EXTERN struct lws_vhost* lws_get_vhost </td>
+ <td>(</td>
+ <td class="paramtype">struct lws * </td>
+ <td class="paramname"><em>wsi</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h.html">lib/libwebsockets.h</a>></code></p>
+<p><a class="el" href="group__context-and-vhost.html#ga06e77ce2916f8bc9826ef8d9d68e3932">lws_get_vhost()</a> - return the vhost a wsi belongs to</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">wsi</td><td>which connection </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a class="anchor" id="gae2134657cdd2ea7a59e13ad314e4c50d"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">LWS_VISIBLE LWS_EXTERN int lws_json_dump_context </td>
+ <td>(</td>
+ <td class="paramtype">const struct lws_context * </td>
+ <td class="paramname"><em>context</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">char * </td>
+ <td class="paramname"><em>buf</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">int </td>
+ <td class="paramname"><em>len</em> </td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h.html">lib/libwebsockets.h</a>></code></p>
+<p><a class="el" href="group__context-and-vhost.html#gae2134657cdd2ea7a59e13ad314e4c50d">lws_json_dump_context()</a> - describe context state and stats in JSON</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">context</td><td>the context </td></tr>
+ <tr><td class="paramname">buf</td><td>buffer to fill with JSON </td></tr>
+ <tr><td class="paramname">len</td><td>max length of buf </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a class="anchor" id="ga94e6cc2223c4eec316b13bcebc3628b6"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">LWS_VISIBLE LWS_EXTERN int lws_json_dump_vhost </td>
+ <td>(</td>
+ <td class="paramtype">const struct lws_vhost * </td>
+ <td class="paramname"><em>vh</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">char * </td>
+ <td class="paramname"><em>buf</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">int </td>
+ <td class="paramname"><em>len</em> </td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h.html">lib/libwebsockets.h</a>></code></p>
+<p><a class="el" href="group__context-and-vhost.html#ga94e6cc2223c4eec316b13bcebc3628b6">lws_json_dump_vhost()</a> - describe vhost state and stats in JSON</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">vh</td><td>the vhost </td></tr>
+ <tr><td class="paramname">buf</td><td>buffer to fill with JSON </td></tr>
+ <tr><td class="paramname">len</td><td>max length of buf </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a class="anchor" id="ga7e9d5405547a457d86e0b4f0ae2bb1c4"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">LWS_VISIBLE LWS_EXTERN int lws_set_proxy </td>
+ <td>(</td>
+ <td class="paramtype">struct lws_vhost * </td>
+ <td class="paramname"><em>vhost</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const char * </td>
+ <td class="paramname"><em>proxy</em> </td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h.html">lib/libwebsockets.h</a>></code></p>
+<p><a class="el" href="group__context-and-vhost.html#ga7e9d5405547a457d86e0b4f0ae2bb1c4">lws_set_proxy()</a> - Setups proxy to lws_context. </p><dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">vhost</td><td>pointer to struct lws_vhost you want set proxy for </td></tr>
+ <tr><td class="paramname">proxy</td><td>pointer to c string containing proxy in format address:port</td></tr>
+ </table>
+ </dd>
+</dl>
+<p>Returns 0 if proxy string was parsed and proxy was setup. Returns -1 if proxy is NULL or has incorrect format.</p>
+<p>This is only required if your OS does not provide the http_proxy environment variable (eg, OSX)</p>
+<p>IMPORTANT! You should call this function right after creation of the lws_context and before call to connect. If you call this function after connect behavior is undefined. This function will override proxy settings made on lws_context creation with genenv() call. </p>
+
+</div>
+</div>
+<a class="anchor" id="ga8db03e19a372e34ac25cf21af894a02c"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">LWS_VISIBLE LWS_EXTERN struct lws_vhost* lws_vhost_get </td>
+ <td>(</td>
+ <td class="paramtype">struct lws * </td>
+ <td class="paramname"><em>wsi</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h.html">lib/libwebsockets.h</a>></code></p>
+<p><a class="el" href="group__context-and-vhost.html#ga8db03e19a372e34ac25cf21af894a02c">lws_vhost_get()</a> -</p><dl class="deprecated"><dt><b><a class="el" href="deprecated.html#_deprecated000001">Deprecated:</a></b></dt><dd>deprecated: use <a class="el" href="group__context-and-vhost.html#ga06e77ce2916f8bc9826ef8d9d68e3932">lws_get_vhost()</a> </dd></dl>
+
+</div>
+</div>
+<a class="anchor" id="ga98d88c9080fd89c37114363a6474ea73"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">LWS_VISIBLE LWS_EXTERN int lwsws_get_config_globals </td>
+ <td>(</td>
+ <td class="paramtype">struct <a class="el" href="structlws__context__creation__info.html">lws_context_creation_info</a> * </td>
+ <td class="paramname"><em>info</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const char * </td>
+ <td class="paramname"><em>d</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">char ** </td>
+ <td class="paramname"><em>config_strings</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">int * </td>
+ <td class="paramname"><em>len</em> </td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h.html">lib/libwebsockets.h</a>></code></p>
+<p><a class="el" href="group__context-and-vhost.html#ga98d88c9080fd89c37114363a6474ea73">lwsws_get_config_globals()</a> - Parse a JSON server config file </p><dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">info</td><td>pointer to struct with parameters </td></tr>
+ <tr><td class="paramname">d</td><td>filepath of the config file </td></tr>
+ <tr><td class="paramname">config_strings</td><td>storage for the config strings extracted from JSON, the pointer is incremented as strings are stored </td></tr>
+ <tr><td class="paramname">len</td><td>pointer to the remaining length left in config_strings the value is decremented as strings are stored</td></tr>
+ </table>
+ </dd>
+</dl>
+<p>This function prepares a n <a class="el" href="structlws__context__creation__info.html">lws_context_creation_info</a> struct with global settings from a file d.</p>
+<p>Requires CMake option LWS_WITH_LEJP_CONF to have been enabled </p>
+
+</div>
+</div>
+<a class="anchor" id="ga341064721add2618ae1b29717493a212"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">LWS_VISIBLE LWS_EXTERN int lwsws_get_config_vhosts </td>
+ <td>(</td>
+ <td class="paramtype">struct lws_context * </td>
+ <td class="paramname"><em>context</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">struct <a class="el" href="structlws__context__creation__info.html">lws_context_creation_info</a> * </td>
+ <td class="paramname"><em>info</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const char * </td>
+ <td class="paramname"><em>d</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">char ** </td>
+ <td class="paramname"><em>config_strings</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">int * </td>
+ <td class="paramname"><em>len</em> </td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h.html">lib/libwebsockets.h</a>></code></p>
+<p><a class="el" href="group__context-and-vhost.html#ga341064721add2618ae1b29717493a212">lwsws_get_config_vhosts()</a> - Create vhosts from a JSON server config file </p><dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">context</td><td>pointer to result of <a class="el" href="group__context-and-vhost.html#gaf2fff58562caab7510c41eeac85a8648">lws_create_context()</a> </td></tr>
+ <tr><td class="paramname">info</td><td>pointer to struct with parameters </td></tr>
+ <tr><td class="paramname">d</td><td>filepath of the config file </td></tr>
+ <tr><td class="paramname">config_strings</td><td>storage for the config strings extracted from JSON, the pointer is incremented as strings are stored </td></tr>
+ <tr><td class="paramname">len</td><td>pointer to the remaining length left in config_strings the value is decremented as strings are stored</td></tr>
+ </table>
+ </dd>
+</dl>
+<p>This function creates vhosts into a context according to the settings in JSON files found in directory d.</p>
+<p>Requires CMake option LWS_WITH_LEJP_CONF to have been enabled </p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">Generated by
+ <a href="http://www.doxygen.org/index.html">
+ <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.11 </li>
+ </ul>
+</div>
+</body>
+</html>
--- /dev/null
+var group__context_and_vhost =
+[
+ [ "Vhost mounts and options", "group__vhost-mounts.html", "group__vhost-mounts" ],
+ [ "lws_context_creation_info", "structlws__context__creation__info.html", [
+ [ "_unused", "structlws__context__creation__info.html#afce3b59950eca3203faa07381bbed5d7", null ],
+ [ "count_threads", "structlws__context__creation__info.html#ae52f3237e144e9ddcab5e2cf91d1e419", null ],
+ [ "ecdh_curve", "structlws__context__creation__info.html#afa5d4e7d9f86b58a1c6fac14f0a5f5f9", null ],
+ [ "extensions", "structlws__context__creation__info.html#a4a3d1155fc52f5048b481884f6fb947c", null ],
+ [ "fd_limit_per_thread", "structlws__context__creation__info.html#a45e63e24c88289e0c8352377ef4d3646", null ],
+ [ "gid", "structlws__context__creation__info.html#a9c9d22437de92c197f3cee52912b2c03", null ],
+ [ "http_proxy_address", "structlws__context__creation__info.html#aef917c0b23976a264d2474901b4f5aa3", null ],
+ [ "http_proxy_port", "structlws__context__creation__info.html#a7b59f2bdc869871e7bde232db94f5ca6", null ],
+ [ "iface", "structlws__context__creation__info.html#a75434932bb5df54665ea678eb8ac104a", null ],
+ [ "ka_interval", "structlws__context__creation__info.html#a381342a398883d6204955ff3c1849ddd", null ],
+ [ "ka_probes", "structlws__context__creation__info.html#a3baab4285c679fbe027c2504621d7410", null ],
+ [ "ka_time", "structlws__context__creation__info.html#ac583ce92b8e1c949cb6fef6bfe713d56", null ],
+ [ "keepalive_timeout", "structlws__context__creation__info.html#a81697c6b763b5ef3ee52862bc70b07d6", null ],
+ [ "log_filepath", "structlws__context__creation__info.html#ad0e95ba721f7bd2b676719f8093c23a2", null ],
+ [ "max_http_header_data", "structlws__context__creation__info.html#a0cdfd3c484689ba6f0f2cc91b38ce948", null ],
+ [ "max_http_header_data2", "structlws__context__creation__info.html#aa8d9e85e137f35fb006f2e4a53f0887a", null ],
+ [ "max_http_header_pool", "structlws__context__creation__info.html#a0b154e79abc1167ba4ac3539f4af6720", null ],
+ [ "mounts", "structlws__context__creation__info.html#a13ffbb0d010309669611f8c4eda7d7f8", null ],
+ [ "options", "structlws__context__creation__info.html#a9d3b17a25e1fbc772f21eb4959a82724", null ],
+ [ "plugin_dirs", "structlws__context__creation__info.html#a8122cfc0810bafe51edb3ba6bf9a1251", null ],
+ [ "port", "structlws__context__creation__info.html#a424a5ce268d6903e42243be94487ab85", null ],
+ [ "protocols", "structlws__context__creation__info.html#abb90ffb3e6d6db2db20f529d61bd9122", null ],
+ [ "provided_client_ssl_ctx", "structlws__context__creation__info.html#a1654d41bea6fb2f619b57e6a264b26a4", null ],
+ [ "provided_client_ssl_ctx", "structlws__context__creation__info.html#a0e790dda6202604f73a03b6149bc12bb", null ],
+ [ "pt_serv_buf_size", "structlws__context__creation__info.html#a57f88c0745adbd1d6b9b619b8de30209", null ],
+ [ "pvo", "structlws__context__creation__info.html#a999866fcd15dbd621773436f97190458", null ],
+ [ "server_string", "structlws__context__creation__info.html#a137a9b9de4f6a7993fed8746d551e616", null ],
+ [ "ssl_ca_filepath", "structlws__context__creation__info.html#a4f8e65c3a059d3b586fafa9ef3282c29", null ],
+ [ "ssl_cert_filepath", "structlws__context__creation__info.html#ac62b0f0e8e402412ba5011d15c244103", null ],
+ [ "ssl_cipher_list", "structlws__context__creation__info.html#a3e1516fd7fed26bfa77c0246ed26c2eb", null ],
+ [ "ssl_options_clear", "structlws__context__creation__info.html#adb0bc0b28cd7d90ab306723d8ffa96fa", null ],
+ [ "ssl_options_set", "structlws__context__creation__info.html#a704940261951ced6b5d8191bd8b9bb2d", null ],
+ [ "ssl_private_key_filepath", "structlws__context__creation__info.html#ab9ec8893e0f7843cf5d783d2f350ef14", null ],
+ [ "ssl_private_key_password", "structlws__context__creation__info.html#af3fb447be15c4fcb01d3285a6678ab54", null ],
+ [ "timeout_secs", "structlws__context__creation__info.html#a6cfa3d51df2def3349a5cbf0d712822d", null ],
+ [ "token_limits", "structlws__context__creation__info.html#ac8a75b7b259a3c3a5fbb4219a3f06c29", null ],
+ [ "uid", "structlws__context__creation__info.html#ac105b4180008cb3e672d57beead8382e", null ],
+ [ "user", "structlws__context__creation__info.html#a0e9d94cdfb893d777b4a4db81e7b5ac0", null ],
+ [ "vhost_name", "structlws__context__creation__info.html#ad50db098a208f045f7811207d2bee4b9", null ]
+ ] ],
+ [ "lws_protocol_vhost_options", "structlws__protocol__vhost__options.html", [
+ [ "name", "structlws__protocol__vhost__options.html#acf9db77f8eb64cd4e314be9b43d8a8b9", null ],
+ [ "next", "structlws__protocol__vhost__options.html#abc714ddb4171756fc8196e9823a1e21c", null ],
+ [ "options", "structlws__protocol__vhost__options.html#afd99fbc90be51ea2465b550c2ec47822", null ],
+ [ "value", "structlws__protocol__vhost__options.html#a0640a92513c70ee6b9b295a9ad1658e7", null ]
+ ] ],
+ [ "lws_context_options", "group__context-and-vhost.html#ga41c2d763f78cc248df3b9f8645dbd2a5", [
+ [ "LWS_SERVER_OPTION_REQUIRE_VALID_OPENSSL_CLIENT_CERT", "group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a274ed462a1a9239eb6ddf9007f5b7092", null ],
+ [ "LWS_SERVER_OPTION_SKIP_SERVER_CANONICAL_NAME", "group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a6582c985ee0ceaadc1d277030eae2d7c", null ],
+ [ "LWS_SERVER_OPTION_ALLOW_NON_SSL_ON_SSL_PORT", "group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a1cc4562d05cba52a6dfa0697a65ade0d", null ],
+ [ "LWS_SERVER_OPTION_LIBEV", "group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a273d9975675130de0c6dc937dde7c8a6", null ],
+ [ "LWS_SERVER_OPTION_DISABLE_IPV6", "group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a34ab36e68c0d593b6f19b8d5ef1240a9", null ],
+ [ "LWS_SERVER_OPTION_DISABLE_OS_CA_CERTS", "group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a4933347a821e73c3f1e13fb6bfc7ad93", null ],
+ [ "LWS_SERVER_OPTION_PEER_CERT_NOT_REQUIRED", "group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5ac56a8a6590e74a8016d0fae09fb404fc", null ],
+ [ "LWS_SERVER_OPTION_VALIDATE_UTF8", "group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5aa0158b4e85420811e6b0f1378c6ded0f", null ],
+ [ "LWS_SERVER_OPTION_SSL_ECDH", "group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a1b2f8bde0f62adc7ebe81b2043f34c0c", null ],
+ [ "LWS_SERVER_OPTION_LIBUV", "group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5aff121db04a10cf8b2c5df9d4f2b89f1e", null ],
+ [ "LWS_SERVER_OPTION_REDIRECT_HTTP_TO_HTTPS", "group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a4832187186c4d130c68051214cd42ada", null ],
+ [ "LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT", "group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a7fed6a527c8d5e0acac1b4179644583a", null ],
+ [ "LWS_SERVER_OPTION_EXPLICIT_VHOSTS", "group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5accc9d0d11d1124a21659586164b0962e", null ],
+ [ "LWS_SERVER_OPTION_UNIX_SOCK", "group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a9637e9001d8c8b2521086bcafbd8a941", null ],
+ [ "LWS_SERVER_OPTION_STS", "group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5ac962efd35abf6c402f9fb14aa14f5016", null ],
+ [ "LWS_SERVER_OPTION_IPV6_V6ONLY_MODIFY", "group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5af62887536e25e053e68741006dba46d8", null ],
+ [ "LWS_SERVER_OPTION_IPV6_V6ONLY_VALUE", "group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5aca5d42820b65eac5618ec3f0bd8a1160", null ]
+ ] ],
+ [ "lws_context_destroy", "group__context-and-vhost.html#ga8ee0314028755f1ddfa9428e09b4fddb", null ],
+ [ "lws_context_user", "group__context-and-vhost.html#gaeb12f934bfd178bd2132a9e73fc641da", null ],
+ [ "lws_create_context", "group__context-and-vhost.html#gaf2fff58562caab7510c41eeac85a8648", null ],
+ [ "lws_create_vhost", "group__context-and-vhost.html#ga0c54c667ccd9b8b3dddcd123ca72f87c", null ],
+ [ "lws_get_vhost", "group__context-and-vhost.html#ga06e77ce2916f8bc9826ef8d9d68e3932", null ],
+ [ "lws_json_dump_context", "group__context-and-vhost.html#gae2134657cdd2ea7a59e13ad314e4c50d", null ],
+ [ "lws_json_dump_vhost", "group__context-and-vhost.html#ga94e6cc2223c4eec316b13bcebc3628b6", null ],
+ [ "lws_set_proxy", "group__context-and-vhost.html#ga7e9d5405547a457d86e0b4f0ae2bb1c4", null ],
+ [ "lws_vhost_get", "group__context-and-vhost.html#ga8db03e19a372e34ac25cf21af894a02c", null ],
+ [ "lwsws_get_config_globals", "group__context-and-vhost.html#ga98d88c9080fd89c37114363a6474ea73", null ],
+ [ "lwsws_get_config_vhosts", "group__context-and-vhost.html#ga341064721add2618ae1b29717493a212", null ]
+];
\ No newline at end of file
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.11"/>
+<title>libwebsockets: libev helpers</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="libwebsockets.org-logo.png"/></td>
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname">libwebsockets
+ </div>
+ <div id="projectbrief">Lightweight C library for HTML5 websockets</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.11 -->
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main Page</span></a></li>
+ <li><a href="pages.html"><span>Related Pages</span></a></li>
+ <li class="current"><a href="modules.html"><span>Modules</span></a></li>
+ <li><a href="annotated.html"><span>Data Structures</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('group__ev.html','');});
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#typedef-members">Typedefs</a> |
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">libev helpers</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="typedef-members"></a>
+Typedefs</h2></td></tr>
+<tr class="memitem:ga3b0ffd4d2b4fa791c0fd75353a330208"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ga3b0ffd4d2b4fa791c0fd75353a330208"></a>
+typedef void( </td><td class="memItemRight" valign="bottom"><b>lws_ev_signal_cb_t</b>) (EV_P_ struct ev_signal *w, int revents)</td></tr>
+<tr class="separator:ga3b0ffd4d2b4fa791c0fd75353a330208"><td class="memSeparator" colspan="2"> </td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ga5caf14a420a2a0bd687a1fc952f8d64e"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ga5caf14a420a2a0bd687a1fc952f8d64e"></a>
+LWS_VISIBLE LWS_EXTERN int </td><td class="memItemRight" valign="bottom"><b>lws_ev_sigint_cfg</b> (struct lws_context *context, int use_ev_sigint, lws_ev_signal_cb_t *cb)</td></tr>
+<tr class="separator:ga5caf14a420a2a0bd687a1fc952f8d64e"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga3fdd23ded693b21853356dc9eaef5ccc"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ga3fdd23ded693b21853356dc9eaef5ccc"></a>
+LWS_VISIBLE LWS_EXTERN int </td><td class="memItemRight" valign="bottom"><b>lws_ev_initloop</b> (struct lws_context *context, struct ev_loop *loop, int tsi)</td></tr>
+<tr class="separator:ga3fdd23ded693b21853356dc9eaef5ccc"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:gaabfc0880d6a98133550c61aa01ef3563"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="gaabfc0880d6a98133550c61aa01ef3563"></a>
+LWS_VISIBLE LWS_EXTERN void </td><td class="memItemRight" valign="bottom"><b>lws_ev_sigint_cb</b> (struct ev_loop *loop, struct ev_signal *watcher, int revents)</td></tr>
+<tr class="separator:gaabfc0880d6a98133550c61aa01ef3563"><td class="memSeparator" colspan="2"> </td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<h2>libev helpers</h2>
+<p>APIs specific to libev event loop itegration </p>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">Generated by
+ <a href="http://www.doxygen.org/index.html">
+ <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.11 </li>
+ </ul>
+</div>
+</body>
+</html>
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.11"/>
+<title>libwebsockets: Extensions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="libwebsockets.org-logo.png"/></td>
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname">libwebsockets
+ </div>
+ <div id="projectbrief">Lightweight C library for HTML5 websockets</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.11 -->
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main Page</span></a></li>
+ <li><a href="pages.html"><span>Related Pages</span></a></li>
+ <li class="current"><a href="modules.html"><span>Modules</span></a></li>
+ <li><a href="annotated.html"><span>Data Structures</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('group__extensions.html','');});
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#nested-classes">Data Structures</a> |
+<a href="#typedef-members">Typedefs</a> |
+<a href="#enum-members">Enumerations</a> |
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">Extensions</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
+Data Structures</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__ext__options.html">lws_ext_options</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__ext__option__arg.html">lws_ext_option_arg</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__extension.html">lws_extension</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="typedef-members"></a>
+Typedefs</h2></td></tr>
+<tr class="memitem:gaae7169b2cd346b34fa33d0250db2afd0"><td class="memItemLeft" align="right" valign="top">typedef int </td><td class="memItemRight" valign="bottom"><a class="el" href="group__extensions.html#gaae7169b2cd346b34fa33d0250db2afd0">lws_extension_callback_function</a>(struct lws_context *context, const struct <a class="el" href="structlws__extension.html">lws_extension</a> *ext, struct lws *wsi, enum lws_extension_callback_reasons reason, void *user, void *in, size_t len)</td></tr>
+<tr class="separator:gaae7169b2cd346b34fa33d0250db2afd0"><td class="memSeparator" colspan="2"> </td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="enum-members"></a>
+Enumerations</h2></td></tr>
+<tr class="memitem:gae9993815eee72c6070300a0ae2f022d7"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="gae9993815eee72c6070300a0ae2f022d7"></a>enum  </td><td class="memItemRight" valign="bottom"><b>lws_extension_callback_reasons</b> { <br />
+  <b>LWS_EXT_CB_SERVER_CONTEXT_CONSTRUCT</b> = 0,
+<b>LWS_EXT_CB_CLIENT_CONTEXT_CONSTRUCT</b> = 1,
+<b>LWS_EXT_CB_SERVER_CONTEXT_DESTRUCT</b> = 2,
+<b>LWS_EXT_CB_CLIENT_CONTEXT_DESTRUCT</b> = 3,
+<br />
+  <b>LWS_EXT_CB_CONSTRUCT</b> = 4,
+<b>LWS_EXT_CB_CLIENT_CONSTRUCT</b> = 5,
+<b>LWS_EXT_CB_CHECK_OK_TO_REALLY_CLOSE</b> = 6,
+<b>LWS_EXT_CB_CHECK_OK_TO_PROPOSE_EXTENSION</b> = 7,
+<br />
+  <b>LWS_EXT_CB_DESTROY</b> = 8,
+<b>LWS_EXT_CB_DESTROY_ANY_WSI_CLOSING</b> = 9,
+<b>LWS_EXT_CB_ANY_WSI_ESTABLISHED</b> = 10,
+<b>LWS_EXT_CB_PACKET_RX_PREPARSE</b> = 11,
+<br />
+  <b>LWS_EXT_CB_PACKET_TX_PRESEND</b> = 12,
+<b>LWS_EXT_CB_PACKET_TX_DO_SEND</b> = 13,
+<b>LWS_EXT_CB_HANDSHAKE_REPLY_TX</b> = 14,
+<b>LWS_EXT_CB_FLUSH_PENDING_TX</b> = 15,
+<br />
+  <b>LWS_EXT_CB_EXTENDED_PAYLOAD_RX</b> = 16,
+<b>LWS_EXT_CB_CAN_PROXY_CLIENT_CONNECTION</b> = 17,
+<b>LWS_EXT_CB_1HZ</b> = 18,
+<b>LWS_EXT_CB_REQUEST_ON_WRITEABLE</b> = 19,
+<br />
+  <b>LWS_EXT_CB_IS_WRITEABLE</b> = 20,
+<b>LWS_EXT_CB_PAYLOAD_TX</b> = 21,
+<b>LWS_EXT_CB_PAYLOAD_RX</b> = 22,
+<b>LWS_EXT_CB_OPTION_DEFAULT</b> = 23,
+<br />
+  <b>LWS_EXT_CB_OPTION_SET</b> = 24,
+<b>LWS_EXT_CB_OPTION_CONFIRM</b> = 25,
+<b>LWS_EXT_CB_NAMED_OPTION_SET</b> = 26
+<br />
+ }</td></tr>
+<tr class="separator:gae9993815eee72c6070300a0ae2f022d7"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:gacc9f55936dc165257a2e1f7d47bce89e"><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="group__extensions.html#gacc9f55936dc165257a2e1f7d47bce89e">lws_ext_options_types</a> { <a class="el" href="group__extensions.html#ggacc9f55936dc165257a2e1f7d47bce89eaabcf56c456c1ff6e81dc82586a16f14c">EXTARG_NONE</a>,
+<a class="el" href="group__extensions.html#ggacc9f55936dc165257a2e1f7d47bce89ea1c86adf924c8786a12bee9687094673e">EXTARG_DEC</a>,
+<a class="el" href="group__extensions.html#ggacc9f55936dc165257a2e1f7d47bce89ea5265abe3e1c3f64412f2affe7bffd880">EXTARG_OPT_DEC</a>
+ }</td></tr>
+<tr class="separator:gacc9f55936dc165257a2e1f7d47bce89e"><td class="memSeparator" colspan="2"> </td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:gae0e24e1768f83a7fb07896ce975704b9"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN int </td><td class="memItemRight" valign="bottom"><a class="el" href="group__extensions.html#gae0e24e1768f83a7fb07896ce975704b9">lws_set_extension_option</a> (struct lws *wsi, const char *ext_name, const char *opt_name, const char *opt_val)</td></tr>
+<tr class="separator:gae0e24e1768f83a7fb07896ce975704b9"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga6fb3e2c3dfb9d64dc87026a4e99c128b"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT </td><td class="memItemRight" valign="bottom"><a class="el" href="group__extensions.html#ga6fb3e2c3dfb9d64dc87026a4e99c128b">lws_ext_parse_options</a> (const struct <a class="el" href="structlws__extension.html">lws_extension</a> *ext, struct lws *wsi, void *ext_user, const struct <a class="el" href="structlws__ext__options.html">lws_ext_options</a> *opts, const char *o, int len)</td></tr>
+<tr class="separator:ga6fb3e2c3dfb9d64dc87026a4e99c128b"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga4cdbe42d872e21a448a947714d6c607e"><td class="memItemLeft" align="right" valign="top">LWS_EXTERN int </td><td class="memItemRight" valign="bottom"><a class="el" href="group__extensions.html#ga4cdbe42d872e21a448a947714d6c607e">lws_extension_callback_pm_deflate</a> (struct lws_context *context, const struct <a class="el" href="structlws__extension.html">lws_extension</a> *ext, struct lws *wsi, enum lws_extension_callback_reasons reason, void *user, void *in, size_t len)</td></tr>
+<tr class="separator:ga4cdbe42d872e21a448a947714d6c607e"><td class="memSeparator" colspan="2"> </td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<h2>Extension releated functions</h2>
+<p>Ws defines optional extensions, lws provides the ability to implement these in user code if so desired.</p>
+<p>We provide one extensions permessage-deflate. </p>
+<h2 class="groupheader">Typedef Documentation</h2>
+<a class="anchor" id="gaae7169b2cd346b34fa33d0250db2afd0"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">typedef int lws_extension_callback_function(struct lws_context *context, const struct <a class="el" href="structlws__extension.html">lws_extension</a> *ext, struct lws *wsi, enum lws_extension_callback_reasons reason, void *user, void *in, size_t len)</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h.html">lib/libwebsockets.h</a>></code></p>
+<p>typedef <a class="el" href="group__extensions.html#gaae7169b2cd346b34fa33d0250db2afd0">lws_extension_callback_function()</a> - Hooks to allow extensions to operate </p><dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">context</td><td>Websockets context </td></tr>
+ <tr><td class="paramname">ext</td><td>This extension </td></tr>
+ <tr><td class="paramname">wsi</td><td>Opaque websocket instance pointer </td></tr>
+ <tr><td class="paramname">reason</td><td>The reason for the call </td></tr>
+ <tr><td class="paramname">user</td><td>Pointer to ptr to per-session user data allocated by library </td></tr>
+ <tr><td class="paramname">in</td><td>Pointer used for some callback reasons </td></tr>
+ <tr><td class="paramname">len</td><td>Length set for some callback reasons <pre class="fragment"> Each extension that is active on a particular connection receives
+ callbacks during the connection lifetime to allow the extension to
+ operate on websocket data and manage itself.
+
+ Libwebsockets takes care of allocating and freeing "user" memory for
+ each active extension on each connection. That is what is pointed to
+ by the user parameter.
+
+ LWS_EXT_CB_CONSTRUCT: called when the server has decided to
+ select this extension from the list provided by the client,
+ just before the server will send back the handshake accepting
+ the connection with this extension active. This gives the
+ extension a chance to initialize its connection context found
+ in user.
+
+ LWS_EXT_CB_CLIENT_CONSTRUCT: same as LWS_EXT_CB_CONSTRUCT
+ but called when client is instantiating this extension. Some
+ extensions will work the same on client and server side and then
+ you can just merge handlers for both CONSTRUCTS.
+
+ LWS_EXT_CB_DESTROY: called when the connection the extension was
+ being used on is about to be closed and deallocated. It's the
+ last chance for the extension to deallocate anything it has
+ allocated in the user data (pointed to by user) before the
+ user data is deleted. This same callback is used whether you
+ are in client or server instantiation context.
+
+ LWS_EXT_CB_PACKET_RX_PREPARSE: when this extension was active on
+ a connection, and a packet of data arrived at the connection,
+ it is passed to this callback to give the extension a chance to
+ change the data, eg, decompress it. user is pointing to the
+ extension's private connection context data, in is pointing
+ to an lws_tokens struct, it consists of a char * pointer called
+ token, and an int called token_len. At entry, these are
+ set to point to the received buffer and set to the content
+ length. If the extension will grow the content, it should use
+ a new buffer allocated in its private user context data and
+ set the pointed-to lws_tokens members to point to its buffer.
+
+ LWS_EXT_CB_PACKET_TX_PRESEND: this works the same way as
+ LWS_EXT_CB_PACKET_RX_PREPARSE above, except it gives the
+ extension a chance to change websocket data just before it will
+ be sent out. Using the same lws_token pointer scheme in in,
+ the extension can change the buffer and the length to be
+ transmitted how it likes. Again if it wants to grow the
+ buffer safely, it should copy the data into its own buffer and
+ set the lws_tokens token pointer to it.
+
+ LWS_EXT_CB_ARGS_VALIDATE:</pre> </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<h2 class="groupheader">Enumeration Type Documentation</h2>
+<a class="anchor" id="gacc9f55936dc165257a2e1f7d47bce89e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">enum <a class="el" href="group__extensions.html#gacc9f55936dc165257a2e1f7d47bce89e">lws_ext_options_types</a></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h.html">lib/libwebsockets.h</a>></code></p>
+<p>enum lws_ext_options_types </p>
+<table class="fieldtable">
+<tr><th colspan="2">Enumerator</th></tr><tr><td class="fieldname"><a class="anchor" id="ggacc9f55936dc165257a2e1f7d47bce89eaabcf56c456c1ff6e81dc82586a16f14c"></a>EXTARG_NONE </td><td class="fielddoc">
+<p>does not take an argument </p>
+</td></tr>
+<tr><td class="fieldname"><a class="anchor" id="ggacc9f55936dc165257a2e1f7d47bce89ea1c86adf924c8786a12bee9687094673e"></a>EXTARG_DEC </td><td class="fielddoc">
+<p>requires a decimal argument </p>
+</td></tr>
+<tr><td class="fieldname"><a class="anchor" id="ggacc9f55936dc165257a2e1f7d47bce89ea5265abe3e1c3f64412f2affe7bffd880"></a>EXTARG_OPT_DEC </td><td class="fielddoc">
+<p>may have an optional decimal argument </p>
+</td></tr>
+</table>
+<div class="fragment"><div class="line"><a name="l00949"></a><span class="lineno"> 949</span>  {</div><div class="line"><a name="l00950"></a><span class="lineno"> 950</span>  <a class="code" href="group__extensions.html#ggacc9f55936dc165257a2e1f7d47bce89eaabcf56c456c1ff6e81dc82586a16f14c">EXTARG_NONE</a>, </div><div class="line"><a name="l00951"></a><span class="lineno"> 951</span>  <a class="code" href="group__extensions.html#ggacc9f55936dc165257a2e1f7d47bce89ea1c86adf924c8786a12bee9687094673e">EXTARG_DEC</a>, </div><div class="line"><a name="l00952"></a><span class="lineno"> 952</span>  <a class="code" href="group__extensions.html#ggacc9f55936dc165257a2e1f7d47bce89ea5265abe3e1c3f64412f2affe7bffd880">EXTARG_OPT_DEC</a> </div><div class="line"><a name="l00954"></a><span class="lineno"> 954</span>  <span class="comment">/* Add new things just above here ---^</span></div><div class="line"><a name="l00955"></a><span class="lineno"> 955</span> <span class="comment"> * This is part of the ABI, don't needlessly break compatibility */</span></div><div class="line"><a name="l00956"></a><span class="lineno"> 956</span> };</div><div class="ttc" id="group__extensions_html_ggacc9f55936dc165257a2e1f7d47bce89ea5265abe3e1c3f64412f2affe7bffd880"><div class="ttname"><a href="group__extensions.html#ggacc9f55936dc165257a2e1f7d47bce89ea5265abe3e1c3f64412f2affe7bffd880">EXTARG_OPT_DEC</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:952</div></div>
+<div class="ttc" id="group__extensions_html_ggacc9f55936dc165257a2e1f7d47bce89eaabcf56c456c1ff6e81dc82586a16f14c"><div class="ttname"><a href="group__extensions.html#ggacc9f55936dc165257a2e1f7d47bce89eaabcf56c456c1ff6e81dc82586a16f14c">EXTARG_NONE</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:950</div></div>
+<div class="ttc" id="group__extensions_html_ggacc9f55936dc165257a2e1f7d47bce89ea1c86adf924c8786a12bee9687094673e"><div class="ttname"><a href="group__extensions.html#ggacc9f55936dc165257a2e1f7d47bce89ea1c86adf924c8786a12bee9687094673e">EXTARG_DEC</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:951</div></div>
+</div><!-- fragment -->
+</div>
+</div>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="ga6fb3e2c3dfb9d64dc87026a4e99c128b"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT lws_ext_parse_options </td>
+ <td>(</td>
+ <td class="paramtype">const struct <a class="el" href="structlws__extension.html">lws_extension</a> * </td>
+ <td class="paramname"><em>ext</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">struct lws * </td>
+ <td class="paramname"><em>wsi</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">void * </td>
+ <td class="paramname"><em>ext_user</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const struct <a class="el" href="structlws__ext__options.html">lws_ext_options</a> * </td>
+ <td class="paramname"><em>opts</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const char * </td>
+ <td class="paramname"><em>o</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">int </td>
+ <td class="paramname"><em>len</em> </td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h.html">lib/libwebsockets.h</a>></code></p>
+<p><a class="el" href="group__extensions.html#ga6fb3e2c3dfb9d64dc87026a4e99c128b">lws_ext_parse_options()</a> - deal with parsing negotiated extension options</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">ext</td><td>related extension struct </td></tr>
+ <tr><td class="paramname">wsi</td><td>websocket connection </td></tr>
+ <tr><td class="paramname">ext_user</td><td>per-connection extension private data </td></tr>
+ <tr><td class="paramname">opts</td><td>list of supported options </td></tr>
+ <tr><td class="paramname">o</td><td>option string to parse </td></tr>
+ <tr><td class="paramname">len</td><td>length </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a class="anchor" id="ga4cdbe42d872e21a448a947714d6c607e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">LWS_EXTERN int lws_extension_callback_pm_deflate </td>
+ <td>(</td>
+ <td class="paramtype">struct lws_context * </td>
+ <td class="paramname"><em>context</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const struct <a class="el" href="structlws__extension.html">lws_extension</a> * </td>
+ <td class="paramname"><em>ext</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">struct lws * </td>
+ <td class="paramname"><em>wsi</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">enum lws_extension_callback_reasons </td>
+ <td class="paramname"><em>reason</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">void * </td>
+ <td class="paramname"><em>user</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">void * </td>
+ <td class="paramname"><em>in</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">size_t </td>
+ <td class="paramname"><em>len</em> </td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h.html">lib/libwebsockets.h</a>></code></p>
+<p><a class="el" href="group__extensions.html#ga4cdbe42d872e21a448a947714d6c607e">lws_extension_callback_pm_deflate()</a> - extension for RFC7692</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">context</td><td>lws context </td></tr>
+ <tr><td class="paramname">ext</td><td>related <a class="el" href="structlws__extension.html">lws_extension</a> struct </td></tr>
+ <tr><td class="paramname">wsi</td><td>websocket connection </td></tr>
+ <tr><td class="paramname">reason</td><td>incoming callback reason </td></tr>
+ <tr><td class="paramname">user</td><td>per-connection extension private data </td></tr>
+ <tr><td class="paramname">in</td><td>pointer parameter </td></tr>
+ <tr><td class="paramname">len</td><td>length parameter</td></tr>
+ </table>
+ </dd>
+</dl>
+<p>Built-in callback implementing RFC7692 permessage-deflate </p>
+
+</div>
+</div>
+<a class="anchor" id="gae0e24e1768f83a7fb07896ce975704b9"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">LWS_VISIBLE LWS_EXTERN int lws_set_extension_option </td>
+ <td>(</td>
+ <td class="paramtype">struct lws * </td>
+ <td class="paramname"><em>wsi</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const char * </td>
+ <td class="paramname"><em>ext_name</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const char * </td>
+ <td class="paramname"><em>opt_name</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const char * </td>
+ <td class="paramname"><em>opt_val</em> </td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h.html">lib/libwebsockets.h</a>></code></p>
+<p><a class="el" href="group__extensions.html#gae0e24e1768f83a7fb07896ce975704b9">lws_set_extension_option()</a>: set extension option if possible</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">wsi</td><td>websocket connection </td></tr>
+ <tr><td class="paramname">ext_name</td><td>name of ext, like "permessage-deflate" </td></tr>
+ <tr><td class="paramname">opt_name</td><td>name of option, like "rx_buf_size" </td></tr>
+ <tr><td class="paramname">opt_val</td><td>value to set option to </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">Generated by
+ <a href="http://www.doxygen.org/index.html">
+ <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.11 </li>
+ </ul>
+</div>
+</body>
+</html>
--- /dev/null
+var group__extensions =
+[
+ [ "lws_ext_options", "structlws__ext__options.html", [
+ [ "name", "structlws__ext__options.html#a1769e4a9805bbdda227821e9578ddc7e", null ],
+ [ "type", "structlws__ext__options.html#a7c4dbd62dbeba63a9d50d2306bd1cc61", null ]
+ ] ],
+ [ "lws_ext_option_arg", "structlws__ext__option__arg.html", [
+ [ "len", "structlws__ext__option__arg.html#af37f0b6caa7735af51a1ac12b68d5bc5", null ],
+ [ "option_index", "structlws__ext__option__arg.html#af57fffcfa253dfa8d98681ac1fb1785f", null ],
+ [ "option_name", "structlws__ext__option__arg.html#a0a320c56b79271b8f059eeaad9423ac9", null ],
+ [ "start", "structlws__ext__option__arg.html#a0b1f7b30c3ceaf5f1bf9d105c24568d1", null ]
+ ] ],
+ [ "lws_extension", "structlws__extension.html", [
+ [ "callback", "structlws__extension.html#afa21f3b3c8c2c9212a276c52b680c3af", null ],
+ [ "client_offer", "structlws__extension.html#a36b06c213aedb02bf9a402651751855b", null ],
+ [ "name", "structlws__extension.html#a1e5018c883d85176f5c2152176843f9e", null ]
+ ] ],
+ [ "lws_extension_callback_function", "group__extensions.html#gaae7169b2cd346b34fa33d0250db2afd0", null ],
+ [ "lws_ext_options_types", "group__extensions.html#gacc9f55936dc165257a2e1f7d47bce89e", [
+ [ "EXTARG_NONE", "group__extensions.html#ggacc9f55936dc165257a2e1f7d47bce89eaabcf56c456c1ff6e81dc82586a16f14c", null ],
+ [ "EXTARG_DEC", "group__extensions.html#ggacc9f55936dc165257a2e1f7d47bce89ea1c86adf924c8786a12bee9687094673e", null ],
+ [ "EXTARG_OPT_DEC", "group__extensions.html#ggacc9f55936dc165257a2e1f7d47bce89ea5265abe3e1c3f64412f2affe7bffd880", null ]
+ ] ],
+ [ "lws_ext_parse_options", "group__extensions.html#ga6fb3e2c3dfb9d64dc87026a4e99c128b", null ],
+ [ "lws_extension_callback_pm_deflate", "group__extensions.html#ga4cdbe42d872e21a448a947714d6c607e", null ],
+ [ "lws_set_extension_option", "group__extensions.html#gae0e24e1768f83a7fb07896ce975704b9", null ]
+];
\ No newline at end of file
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.11"/>
+<title>libwebsockets: file operation wrapping</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="libwebsockets.org-logo.png"/></td>
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname">libwebsockets
+ </div>
+ <div id="projectbrief">Lightweight C library for HTML5 websockets</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.11 -->
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main Page</span></a></li>
+ <li><a href="pages.html"><span>Related Pages</span></a></li>
+ <li class="current"><a href="modules.html"><span>Modules</span></a></li>
+ <li><a href="annotated.html"><span>Data Structures</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('group__fops.html','');});
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#nested-classes">Data Structures</a> |
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">file operation wrapping</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
+Data Structures</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__plat__file__ops.html">lws_plat_file_ops</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:gac08aef64c4c34647ed699b24759b6b0e"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN struct <a class="el" href="structlws__plat__file__ops.html">lws_plat_file_ops</a> *LWS_WARN_UNUSED_RESULT </td><td class="memItemRight" valign="bottom"><a class="el" href="group__fops.html#gac08aef64c4c34647ed699b24759b6b0e">lws_get_fops</a> (struct lws_context *context)</td></tr>
+<tr class="separator:gac08aef64c4c34647ed699b24759b6b0e"><td class="memSeparator" colspan="2"> </td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<h2>File operation wrapping</h2>
+<p>Use these helper functions if you want to access a file from the perspective of a specific wsi, which is usually the case. If you just want contextless file access, use the fops callbacks directly with NULL wsi instead of these helpers.</p>
+<p>If so, then it calls the platform handler or user overrides where present (as defined in info->fops)</p>
+<p>The advantage from all this is user code can be portable for file operations without having to deal with differences between platforms. </p>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="gac08aef64c4c34647ed699b24759b6b0e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">LWS_VISIBLE LWS_EXTERN struct <a class="el" href="structlws__plat__file__ops.html">lws_plat_file_ops</a>* LWS_WARN_UNUSED_RESULT lws_get_fops </td>
+ <td>(</td>
+ <td class="paramtype">struct lws_context * </td>
+ <td class="paramname"><em>context</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h.html">lib/libwebsockets.h</a>></code></p>
+<p><a class="el" href="group__fops.html#gac08aef64c4c34647ed699b24759b6b0e">lws_get_fops()</a> - get current file ops</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">context</td><td>context </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">Generated by
+ <a href="http://www.doxygen.org/index.html">
+ <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.11 </li>
+ </ul>
+</div>
+</body>
+</html>
--- /dev/null
+var group__fops =
+[
+ [ "lws_plat_file_ops", "structlws__plat__file__ops.html", [
+ [ "close", "structlws__plat__file__ops.html#a034ec96f2fbaf52b4aa3e82d20795f7b", null ],
+ [ "open", "structlws__plat__file__ops.html#ad37a97abc68d0af967cef874f4d8df32", null ],
+ [ "read", "structlws__plat__file__ops.html#a01f483807a9862736b17ba9ed5110c40", null ],
+ [ "seek_cur", "structlws__plat__file__ops.html#abfcda19b003dcc13c61ff9e2bb4ff869", null ],
+ [ "write", "structlws__plat__file__ops.html#a1fae8330ee94649a3551e31a30809793", null ]
+ ] ],
+ [ "lws_get_fops", "group__fops.html#gac08aef64c4c34647ed699b24759b6b0e", null ]
+];
\ No newline at end of file
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.11"/>
+<title>libwebsockets: Form Parsing</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="libwebsockets.org-logo.png"/></td>
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname">libwebsockets
+ </div>
+ <div id="projectbrief">Lightweight C library for HTML5 websockets</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.11 -->
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main Page</span></a></li>
+ <li><a href="pages.html"><span>Related Pages</span></a></li>
+ <li class="current"><a href="modules.html"><span>Modules</span></a></li>
+ <li><a href="annotated.html"><span>Data Structures</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('group__form-parsing.html','');});
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#typedef-members">Typedefs</a> |
+<a href="#enum-members">Enumerations</a> |
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">Form Parsing<div class="ingroups"><a class="el" href="group__http.html">HTTP</a></div></div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="typedef-members"></a>
+Typedefs</h2></td></tr>
+<tr class="memitem:ga5a70527c0861c2ffa3d29333a6aa7f8e"><td class="memItemLeft" align="right" valign="top">typedef int(* </td><td class="memItemRight" valign="bottom"><a class="el" href="group__form-parsing.html#ga5a70527c0861c2ffa3d29333a6aa7f8e">lws_spa_fileupload_cb</a>) (void *data, const char *name, const char *filename, char *buf, int len, enum <a class="el" href="group__form-parsing.html#ga41a74a822771d3dce89751aa3bce28ae">lws_spa_fileupload_states</a> state)</td></tr>
+<tr class="separator:ga5a70527c0861c2ffa3d29333a6aa7f8e"><td class="memSeparator" colspan="2"> </td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="enum-members"></a>
+Enumerations</h2></td></tr>
+<tr class="memitem:ga41a74a822771d3dce89751aa3bce28ae"><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="group__form-parsing.html#ga41a74a822771d3dce89751aa3bce28ae">lws_spa_fileupload_states</a> { <a class="el" href="group__form-parsing.html#gga41a74a822771d3dce89751aa3bce28aead3a958e7719ac273c3ba4f684f00c87f">LWS_UFS_CONTENT</a>,
+<a class="el" href="group__form-parsing.html#gga41a74a822771d3dce89751aa3bce28aea6ce2a55a4c3695cdb640c893d95bd3a7">LWS_UFS_FINAL_CONTENT</a>,
+<a class="el" href="group__form-parsing.html#gga41a74a822771d3dce89751aa3bce28aea2d25de44865bd44e5a3903a2bab9ca83">LWS_UFS_OPEN</a>
+ }</td></tr>
+<tr class="separator:ga41a74a822771d3dce89751aa3bce28ae"><td class="memSeparator" colspan="2"> </td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ga162f86762173a2bc8c28497941d74815"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN struct lws_spa * </td><td class="memItemRight" valign="bottom"><a class="el" href="group__form-parsing.html#ga162f86762173a2bc8c28497941d74815">lws_spa_create</a> (struct lws *wsi, const char *const *param_names, int count_params, int max_storage, <a class="el" href="group__form-parsing.html#ga5a70527c0861c2ffa3d29333a6aa7f8e">lws_spa_fileupload_cb</a> opt_cb, void *opt_data)</td></tr>
+<tr class="separator:ga162f86762173a2bc8c28497941d74815"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga9ad9ebf5ea1a7108415ed7e04cb231d2"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN int </td><td class="memItemRight" valign="bottom"><a class="el" href="group__form-parsing.html#ga9ad9ebf5ea1a7108415ed7e04cb231d2">lws_spa_process</a> (struct lws_spa *spa, const char *in, int len)</td></tr>
+<tr class="separator:ga9ad9ebf5ea1a7108415ed7e04cb231d2"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga83835bf250ee3d4a60f36a182f2b8d24"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN int </td><td class="memItemRight" valign="bottom"><a class="el" href="group__form-parsing.html#ga83835bf250ee3d4a60f36a182f2b8d24">lws_spa_finalize</a> (struct lws_spa *spa)</td></tr>
+<tr class="separator:ga83835bf250ee3d4a60f36a182f2b8d24"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga3fbe378632f85ec9a14cc2c1687bf05f"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN int </td><td class="memItemRight" valign="bottom"><a class="el" href="group__form-parsing.html#ga3fbe378632f85ec9a14cc2c1687bf05f">lws_spa_get_length</a> (struct lws_spa *spa, int n)</td></tr>
+<tr class="separator:ga3fbe378632f85ec9a14cc2c1687bf05f"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga2da476217166da02704b90d3a8d4f3cd"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN const char * </td><td class="memItemRight" valign="bottom"><a class="el" href="group__form-parsing.html#ga2da476217166da02704b90d3a8d4f3cd">lws_spa_get_string</a> (struct lws_spa *spa, int n)</td></tr>
+<tr class="separator:ga2da476217166da02704b90d3a8d4f3cd"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:gaaa482f07dad3f04b391cccf0a814e13b"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN int </td><td class="memItemRight" valign="bottom"><a class="el" href="group__form-parsing.html#gaaa482f07dad3f04b391cccf0a814e13b">lws_spa_destroy</a> (struct lws_spa *spa)</td></tr>
+<tr class="separator:gaaa482f07dad3f04b391cccf0a814e13b"><td class="memSeparator" colspan="2"> </td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<h2>POSTed form parsing functions</h2>
+<p>These lws_spa (stateful post arguments) apis let you parse and urldecode POSTed form arguments, both using simple urlencoded and multipart transfer encoding.</p>
+<p>It's capable of handling file uploads as well a named input parsing, and the apis are the same for both form upload styles.</p>
+<p>You feed it a list of parameter names and it creates pointers to the urldecoded arguments: file upload parameters pass the file data in chunks to a user-supplied callback as they come.</p>
+<p>Since it's stateful, it handles the incoming data needing more than one POST_BODY callback and has no limit on uploaded file size. </p>
+<h2 class="groupheader">Typedef Documentation</h2>
+<a class="anchor" id="ga5a70527c0861c2ffa3d29333a6aa7f8e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">typedef int(* lws_spa_fileupload_cb) (void *data, const char *name, const char *filename, char *buf, int len, enum <a class="el" href="group__form-parsing.html#ga41a74a822771d3dce89751aa3bce28ae">lws_spa_fileupload_states</a> state)</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h.html">lib/libwebsockets.h</a>></code></p>
+<p><a class="el" href="group__form-parsing.html#ga5a70527c0861c2ffa3d29333a6aa7f8e">lws_spa_fileupload_cb()</a> - callback to receive file upload data</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">data</td><td>opt_data pointer set in lws_spa_create </td></tr>
+ <tr><td class="paramname">name</td><td>name of the form field being uploaded </td></tr>
+ <tr><td class="paramname">filename</td><td>original filename from client </td></tr>
+ <tr><td class="paramname">buf</td><td>start of data to receive </td></tr>
+ <tr><td class="paramname">len</td><td>length of data to receive </td></tr>
+ <tr><td class="paramname">state</td><td>information about how this call relates to file</td></tr>
+ </table>
+ </dd>
+</dl>
+<p>Notice name and filename shouldn't be trusted, as they are passed from HTTP provided by the client. </p>
+
+</div>
+</div>
+<h2 class="groupheader">Enumeration Type Documentation</h2>
+<a class="anchor" id="ga41a74a822771d3dce89751aa3bce28ae"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">enum <a class="el" href="group__form-parsing.html#ga41a74a822771d3dce89751aa3bce28ae">lws_spa_fileupload_states</a></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h.html">lib/libwebsockets.h</a>></code></p>
+<p>enum lws_spa_fileupload_states </p>
+<table class="fieldtable">
+<tr><th colspan="2">Enumerator</th></tr><tr><td class="fieldname"><a class="anchor" id="gga41a74a822771d3dce89751aa3bce28aead3a958e7719ac273c3ba4f684f00c87f"></a>LWS_UFS_CONTENT </td><td class="fielddoc">
+<p>a chunk of file content has arrived </p>
+</td></tr>
+<tr><td class="fieldname"><a class="anchor" id="gga41a74a822771d3dce89751aa3bce28aea6ce2a55a4c3695cdb640c893d95bd3a7"></a>LWS_UFS_FINAL_CONTENT </td><td class="fielddoc">
+<p>the last chunk (possibly zero length) of file content has arrived </p>
+</td></tr>
+<tr><td class="fieldname"><a class="anchor" id="gga41a74a822771d3dce89751aa3bce28aea2d25de44865bd44e5a3903a2bab9ca83"></a>LWS_UFS_OPEN </td><td class="fielddoc">
+<p>a new file is starting to arrive </p>
+</td></tr>
+</table>
+<div class="fragment"><div class="line"><a name="l02552"></a><span class="lineno"> 2552</span>  {</div><div class="line"><a name="l02553"></a><span class="lineno"> 2553</span>  <a class="code" href="group__form-parsing.html#gga41a74a822771d3dce89751aa3bce28aead3a958e7719ac273c3ba4f684f00c87f">LWS_UFS_CONTENT</a>,</div><div class="line"><a name="l02555"></a><span class="lineno"> 2555</span>  <a class="code" href="group__form-parsing.html#gga41a74a822771d3dce89751aa3bce28aea6ce2a55a4c3695cdb640c893d95bd3a7">LWS_UFS_FINAL_CONTENT</a>,</div><div class="line"><a name="l02557"></a><span class="lineno"> 2557</span>  <a class="code" href="group__form-parsing.html#gga41a74a822771d3dce89751aa3bce28aea2d25de44865bd44e5a3903a2bab9ca83">LWS_UFS_OPEN</a></div><div class="line"><a name="l02559"></a><span class="lineno"> 2559</span> };</div><div class="ttc" id="group__form-parsing_html_gga41a74a822771d3dce89751aa3bce28aea6ce2a55a4c3695cdb640c893d95bd3a7"><div class="ttname"><a href="group__form-parsing.html#gga41a74a822771d3dce89751aa3bce28aea6ce2a55a4c3695cdb640c893d95bd3a7">LWS_UFS_FINAL_CONTENT</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:2555</div></div>
+<div class="ttc" id="group__form-parsing_html_gga41a74a822771d3dce89751aa3bce28aea2d25de44865bd44e5a3903a2bab9ca83"><div class="ttname"><a href="group__form-parsing.html#gga41a74a822771d3dce89751aa3bce28aea2d25de44865bd44e5a3903a2bab9ca83">LWS_UFS_OPEN</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:2557</div></div>
+<div class="ttc" id="group__form-parsing_html_gga41a74a822771d3dce89751aa3bce28aead3a958e7719ac273c3ba4f684f00c87f"><div class="ttname"><a href="group__form-parsing.html#gga41a74a822771d3dce89751aa3bce28aead3a958e7719ac273c3ba4f684f00c87f">LWS_UFS_CONTENT</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:2553</div></div>
+</div><!-- fragment -->
+</div>
+</div>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="ga162f86762173a2bc8c28497941d74815"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">LWS_VISIBLE LWS_EXTERN struct lws_spa* lws_spa_create </td>
+ <td>(</td>
+ <td class="paramtype">struct lws * </td>
+ <td class="paramname"><em>wsi</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const char *const * </td>
+ <td class="paramname"><em>param_names</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">int </td>
+ <td class="paramname"><em>count_params</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">int </td>
+ <td class="paramname"><em>max_storage</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="group__form-parsing.html#ga5a70527c0861c2ffa3d29333a6aa7f8e">lws_spa_fileupload_cb</a> </td>
+ <td class="paramname"><em>opt_cb</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">void * </td>
+ <td class="paramname"><em>opt_data</em> </td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h.html">lib/libwebsockets.h</a>></code></p>
+<p><a class="el" href="group__form-parsing.html#ga162f86762173a2bc8c28497941d74815">lws_spa_create()</a> - create urldecode parser</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">wsi</td><td>lws connection (used to find Content Type) </td></tr>
+ <tr><td class="paramname">param_names</td><td>array of form parameter names, like "username" </td></tr>
+ <tr><td class="paramname">count_params</td><td>count of param_names </td></tr>
+ <tr><td class="paramname">max_storage</td><td>total amount of form parameter values we can store </td></tr>
+ <tr><td class="paramname">opt_cb</td><td>NULL, or callback to receive file upload data. </td></tr>
+ <tr><td class="paramname">opt_data</td><td>NULL, or user pointer provided to opt_cb.</td></tr>
+ </table>
+ </dd>
+</dl>
+<p>Creates a urldecode parser and initializes it.</p>
+<p>opt_cb can be NULL if you just want normal name=value parsing, however if one or more entries in your form are bulk data (file transfer), you can provide this callback and filter on the name callback parameter to treat that urldecoded data separately. The callback should return -1 in case of fatal error, and 0 if OK. </p>
+
+</div>
+</div>
+<a class="anchor" id="gaaa482f07dad3f04b391cccf0a814e13b"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">LWS_VISIBLE LWS_EXTERN int lws_spa_destroy </td>
+ <td>(</td>
+ <td class="paramtype">struct lws_spa * </td>
+ <td class="paramname"><em>spa</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h.html">lib/libwebsockets.h</a>></code></p>
+<p><a class="el" href="group__form-parsing.html#gaaa482f07dad3f04b391cccf0a814e13b">lws_spa_destroy()</a> - destroy parser object</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">spa</td><td>the parser object previously created </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a class="anchor" id="ga83835bf250ee3d4a60f36a182f2b8d24"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">LWS_VISIBLE LWS_EXTERN int lws_spa_finalize </td>
+ <td>(</td>
+ <td class="paramtype">struct lws_spa * </td>
+ <td class="paramname"><em>spa</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h.html">lib/libwebsockets.h</a>></code></p>
+<p><a class="el" href="group__form-parsing.html#ga83835bf250ee3d4a60f36a182f2b8d24">lws_spa_finalize()</a> - indicate incoming data completed</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">spa</td><td>the parser object previously created </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a class="anchor" id="ga3fbe378632f85ec9a14cc2c1687bf05f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">LWS_VISIBLE LWS_EXTERN int lws_spa_get_length </td>
+ <td>(</td>
+ <td class="paramtype">struct lws_spa * </td>
+ <td class="paramname"><em>spa</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">int </td>
+ <td class="paramname"><em>n</em> </td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h.html">lib/libwebsockets.h</a>></code></p>
+<p><a class="el" href="group__form-parsing.html#ga3fbe378632f85ec9a14cc2c1687bf05f">lws_spa_get_length()</a> - return length of parameter value</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">spa</td><td>the parser object previously created </td></tr>
+ <tr><td class="paramname">n</td><td>parameter ordinal to return length of value for </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a class="anchor" id="ga2da476217166da02704b90d3a8d4f3cd"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">LWS_VISIBLE LWS_EXTERN const char* lws_spa_get_string </td>
+ <td>(</td>
+ <td class="paramtype">struct lws_spa * </td>
+ <td class="paramname"><em>spa</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">int </td>
+ <td class="paramname"><em>n</em> </td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h.html">lib/libwebsockets.h</a>></code></p>
+<p><a class="el" href="group__form-parsing.html#ga2da476217166da02704b90d3a8d4f3cd">lws_spa_get_string()</a> - return pointer to parameter value </p><dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">spa</td><td>the parser object previously created </td></tr>
+ <tr><td class="paramname">n</td><td>parameter ordinal to return pointer to value for </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a class="anchor" id="ga9ad9ebf5ea1a7108415ed7e04cb231d2"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">LWS_VISIBLE LWS_EXTERN int lws_spa_process </td>
+ <td>(</td>
+ <td class="paramtype">struct lws_spa * </td>
+ <td class="paramname"><em>spa</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const char * </td>
+ <td class="paramname"><em>in</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">int </td>
+ <td class="paramname"><em>len</em> </td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h.html">lib/libwebsockets.h</a>></code></p>
+<p><a class="el" href="group__form-parsing.html#ga9ad9ebf5ea1a7108415ed7e04cb231d2">lws_spa_process()</a> - parses a chunk of input data</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">spa</td><td>the parser object previously created </td></tr>
+ <tr><td class="paramname">in</td><td>incoming, urlencoded data </td></tr>
+ <tr><td class="paramname">len</td><td>count of bytes valid at </td></tr>
+ <tr><td class="paramname">in</td><td></td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">Generated by
+ <a href="http://www.doxygen.org/index.html">
+ <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.11 </li>
+ </ul>
+</div>
+</body>
+</html>
--- /dev/null
+var group__form_parsing =
+[
+ [ "lws_spa_fileupload_cb", "group__form-parsing.html#ga5a70527c0861c2ffa3d29333a6aa7f8e", null ],
+ [ "lws_spa_fileupload_states", "group__form-parsing.html#ga41a74a822771d3dce89751aa3bce28ae", [
+ [ "LWS_UFS_CONTENT", "group__form-parsing.html#gga41a74a822771d3dce89751aa3bce28aead3a958e7719ac273c3ba4f684f00c87f", null ],
+ [ "LWS_UFS_FINAL_CONTENT", "group__form-parsing.html#gga41a74a822771d3dce89751aa3bce28aea6ce2a55a4c3695cdb640c893d95bd3a7", null ],
+ [ "LWS_UFS_OPEN", "group__form-parsing.html#gga41a74a822771d3dce89751aa3bce28aea2d25de44865bd44e5a3903a2bab9ca83", null ]
+ ] ],
+ [ "lws_spa_create", "group__form-parsing.html#ga162f86762173a2bc8c28497941d74815", null ],
+ [ "lws_spa_destroy", "group__form-parsing.html#gaaa482f07dad3f04b391cccf0a814e13b", null ],
+ [ "lws_spa_finalize", "group__form-parsing.html#ga83835bf250ee3d4a60f36a182f2b8d24", null ],
+ [ "lws_spa_get_length", "group__form-parsing.html#ga3fbe378632f85ec9a14cc2c1687bf05f", null ],
+ [ "lws_spa_get_string", "group__form-parsing.html#ga2da476217166da02704b90d3a8d4f3cd", null ],
+ [ "lws_spa_process", "group__form-parsing.html#ga9ad9ebf5ea1a7108415ed7e04cb231d2", null ]
+];
\ No newline at end of file
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.11"/>
+<title>libwebsockets: plugin: generic-sessions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="libwebsockets.org-logo.png"/></td>
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname">libwebsockets
+ </div>
+ <div id="projectbrief">Lightweight C library for HTML5 websockets</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.11 -->
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main Page</span></a></li>
+ <li><a href="pages.html"><span>Related Pages</span></a></li>
+ <li class="current"><a href="modules.html"><span>Modules</span></a></li>
+ <li><a href="annotated.html"><span>Data Structures</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('group__generic-sessions.html','');});
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#nested-classes">Data Structures</a> |
+<a href="#enum-members">Enumerations</a> </div>
+ <div class="headertitle">
+<div class="title">plugin: generic-sessions<div class="ingroups"><a class="el" href="group__Protocols-and-Plugins.html">Protocols and Plugins</a></div></div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
+Data Structures</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="structlwsgw__hash__bin.html">lwsgw_hash_bin</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="structlwsgw__hash.html">lwsgw_hash</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__session__info.html">lws_session_info</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__gs__event__args.html">lws_gs_event_args</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="enum-members"></a>
+Enumerations</h2></td></tr>
+<tr class="memitem:ga7c2dc7bfb4ccb91c5d771f9e9ea237e1"><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="group__generic-sessions.html#ga7c2dc7bfb4ccb91c5d771f9e9ea237e1">lwsgs_auth_bits</a> { <a class="el" href="group__generic-sessions.html#gga7c2dc7bfb4ccb91c5d771f9e9ea237e1a81e63075115dedd150265d81b8f7fa57">LWSGS_AUTH_LOGGED_IN</a> = 1,
+<a class="el" href="group__generic-sessions.html#gga7c2dc7bfb4ccb91c5d771f9e9ea237e1a0657a9e846814781b128c397fe4b10bf">LWSGS_AUTH_ADMIN</a> = 2,
+<a class="el" href="group__generic-sessions.html#gga7c2dc7bfb4ccb91c5d771f9e9ea237e1a5a607e4668d20cadada62c4b8007f887">LWSGS_AUTH_VERIFIED</a> = 4,
+<a class="el" href="group__generic-sessions.html#gga7c2dc7bfb4ccb91c5d771f9e9ea237e1a2cd8fb86e3b85c106e7711c03f0ddd0a">LWSGS_AUTH_FORGOT_FLOW</a> = 8
+ }</td></tr>
+<tr class="separator:ga7c2dc7bfb4ccb91c5d771f9e9ea237e1"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:gaa93946b3d921072209d5cd8cdfa5332e"><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="group__generic-sessions.html#gaa93946b3d921072209d5cd8cdfa5332e">lws_gs_event</a> { <a class="el" href="group__generic-sessions.html#ggaa93946b3d921072209d5cd8cdfa5332ea596010a165bf13473c5eea3a34cd4308">LWSGSE_CREATED</a>,
+<a class="el" href="group__generic-sessions.html#ggaa93946b3d921072209d5cd8cdfa5332ead908cdc5689c5d22c9d3c8934e94dcde">LWSGSE_DELETED</a>
+ }</td></tr>
+<tr class="separator:gaa93946b3d921072209d5cd8cdfa5332e"><td class="memSeparator" colspan="2"> </td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<h2>Plugin Generic-sessions related</h2>
+<p>generic-sessions plugin provides a reusable, generic session and login / register / forgot password framework including email verification. </p>
+<h2 class="groupheader">Enumeration Type Documentation</h2>
+<a class="anchor" id="gaa93946b3d921072209d5cd8cdfa5332e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">enum <a class="el" href="group__generic-sessions.html#gaa93946b3d921072209d5cd8cdfa5332e">lws_gs_event</a></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h.html">lib/libwebsockets.h</a>></code></p>
+<p>enum lws_gs_event </p>
+<table class="fieldtable">
+<tr><th colspan="2">Enumerator</th></tr><tr><td class="fieldname"><a class="anchor" id="ggaa93946b3d921072209d5cd8cdfa5332ea596010a165bf13473c5eea3a34cd4308"></a>LWSGSE_CREATED </td><td class="fielddoc">
+<p>a new user was created </p>
+</td></tr>
+<tr><td class="fieldname"><a class="anchor" id="ggaa93946b3d921072209d5cd8cdfa5332ead908cdc5689c5d22c9d3c8934e94dcde"></a>LWSGSE_DELETED </td><td class="fielddoc">
+<p>an existing user was deleted </p>
+</td></tr>
+</table>
+<div class="fragment"><div class="line"><a name="l01311"></a><span class="lineno"> 1311</span>  {</div><div class="line"><a name="l01312"></a><span class="lineno"> 1312</span>  <a class="code" href="group__generic-sessions.html#ggaa93946b3d921072209d5cd8cdfa5332ea596010a165bf13473c5eea3a34cd4308">LWSGSE_CREATED</a>, </div><div class="line"><a name="l01313"></a><span class="lineno"> 1313</span>  <a class="code" href="group__generic-sessions.html#ggaa93946b3d921072209d5cd8cdfa5332ead908cdc5689c5d22c9d3c8934e94dcde">LWSGSE_DELETED</a> </div><div class="line"><a name="l01314"></a><span class="lineno"> 1314</span> };</div><div class="ttc" id="group__generic-sessions_html_ggaa93946b3d921072209d5cd8cdfa5332ead908cdc5689c5d22c9d3c8934e94dcde"><div class="ttname"><a href="group__generic-sessions.html#ggaa93946b3d921072209d5cd8cdfa5332ead908cdc5689c5d22c9d3c8934e94dcde">LWSGSE_DELETED</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1313</div></div>
+<div class="ttc" id="group__generic-sessions_html_ggaa93946b3d921072209d5cd8cdfa5332ea596010a165bf13473c5eea3a34cd4308"><div class="ttname"><a href="group__generic-sessions.html#ggaa93946b3d921072209d5cd8cdfa5332ea596010a165bf13473c5eea3a34cd4308">LWSGSE_CREATED</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1312</div></div>
+</div><!-- fragment -->
+</div>
+</div>
+<a class="anchor" id="ga7c2dc7bfb4ccb91c5d771f9e9ea237e1"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">enum <a class="el" href="group__generic-sessions.html#ga7c2dc7bfb4ccb91c5d771f9e9ea237e1">lwsgs_auth_bits</a></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h.html">lib/libwebsockets.h</a>></code></p>
+<p>enum lwsgs_auth_bits </p>
+<table class="fieldtable">
+<tr><th colspan="2">Enumerator</th></tr><tr><td class="fieldname"><a class="anchor" id="gga7c2dc7bfb4ccb91c5d771f9e9ea237e1a81e63075115dedd150265d81b8f7fa57"></a>LWSGS_AUTH_LOGGED_IN </td><td class="fielddoc">
+<p>user is logged in as somebody </p>
+</td></tr>
+<tr><td class="fieldname"><a class="anchor" id="gga7c2dc7bfb4ccb91c5d771f9e9ea237e1a0657a9e846814781b128c397fe4b10bf"></a>LWSGS_AUTH_ADMIN </td><td class="fielddoc">
+<p>logged in as the admin user </p>
+</td></tr>
+<tr><td class="fieldname"><a class="anchor" id="gga7c2dc7bfb4ccb91c5d771f9e9ea237e1a5a607e4668d20cadada62c4b8007f887"></a>LWSGS_AUTH_VERIFIED </td><td class="fielddoc">
+<p>user has verified his email </p>
+</td></tr>
+<tr><td class="fieldname"><a class="anchor" id="gga7c2dc7bfb4ccb91c5d771f9e9ea237e1a2cd8fb86e3b85c106e7711c03f0ddd0a"></a>LWSGS_AUTH_FORGOT_FLOW </td><td class="fielddoc">
+<p>he just completed "forgot password" flow </p>
+</td></tr>
+</table>
+<div class="fragment"><div class="line"><a name="l01293"></a><span class="lineno"> 1293</span>  {</div><div class="line"><a name="l01294"></a><span class="lineno"> 1294</span>  <a class="code" href="group__generic-sessions.html#gga7c2dc7bfb4ccb91c5d771f9e9ea237e1a81e63075115dedd150265d81b8f7fa57">LWSGS_AUTH_LOGGED_IN</a> = 1, </div><div class="line"><a name="l01295"></a><span class="lineno"> 1295</span>  <a class="code" href="group__generic-sessions.html#gga7c2dc7bfb4ccb91c5d771f9e9ea237e1a0657a9e846814781b128c397fe4b10bf">LWSGS_AUTH_ADMIN</a> = 2, </div><div class="line"><a name="l01296"></a><span class="lineno"> 1296</span>  <a class="code" href="group__generic-sessions.html#gga7c2dc7bfb4ccb91c5d771f9e9ea237e1a5a607e4668d20cadada62c4b8007f887">LWSGS_AUTH_VERIFIED</a> = 4, </div><div class="line"><a name="l01297"></a><span class="lineno"> 1297</span>  <a class="code" href="group__generic-sessions.html#gga7c2dc7bfb4ccb91c5d771f9e9ea237e1a2cd8fb86e3b85c106e7711c03f0ddd0a">LWSGS_AUTH_FORGOT_FLOW</a> = 8, </div><div class="line"><a name="l01298"></a><span class="lineno"> 1298</span> };</div><div class="ttc" id="group__generic-sessions_html_gga7c2dc7bfb4ccb91c5d771f9e9ea237e1a5a607e4668d20cadada62c4b8007f887"><div class="ttname"><a href="group__generic-sessions.html#gga7c2dc7bfb4ccb91c5d771f9e9ea237e1a5a607e4668d20cadada62c4b8007f887">LWSGS_AUTH_VERIFIED</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1296</div></div>
+<div class="ttc" id="group__generic-sessions_html_gga7c2dc7bfb4ccb91c5d771f9e9ea237e1a2cd8fb86e3b85c106e7711c03f0ddd0a"><div class="ttname"><a href="group__generic-sessions.html#gga7c2dc7bfb4ccb91c5d771f9e9ea237e1a2cd8fb86e3b85c106e7711c03f0ddd0a">LWSGS_AUTH_FORGOT_FLOW</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1297</div></div>
+<div class="ttc" id="group__generic-sessions_html_gga7c2dc7bfb4ccb91c5d771f9e9ea237e1a0657a9e846814781b128c397fe4b10bf"><div class="ttname"><a href="group__generic-sessions.html#gga7c2dc7bfb4ccb91c5d771f9e9ea237e1a0657a9e846814781b128c397fe4b10bf">LWSGS_AUTH_ADMIN</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1295</div></div>
+<div class="ttc" id="group__generic-sessions_html_gga7c2dc7bfb4ccb91c5d771f9e9ea237e1a81e63075115dedd150265d81b8f7fa57"><div class="ttname"><a href="group__generic-sessions.html#gga7c2dc7bfb4ccb91c5d771f9e9ea237e1a81e63075115dedd150265d81b8f7fa57">LWSGS_AUTH_LOGGED_IN</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1294</div></div>
+</div><!-- fragment -->
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">Generated by
+ <a href="http://www.doxygen.org/index.html">
+ <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.11 </li>
+ </ul>
+</div>
+</body>
+</html>
--- /dev/null
+var group__generic_sessions =
+[
+ [ "lwsgw_hash_bin", "structlwsgw__hash__bin.html", [
+ [ "bin", "structlwsgw__hash__bin.html#ac92f50d9471058525d110597a4e0de6b", null ]
+ ] ],
+ [ "lwsgw_hash", "structlwsgw__hash.html", [
+ [ "id", "structlwsgw__hash.html#a29435f5cf78747d4257695b0f141d164", null ]
+ ] ],
+ [ "lws_session_info", "structlws__session__info.html", [
+ [ "email", "structlws__session__info.html#a94b813cfc6b0da4b182659de30038ad3", null ],
+ [ "ip", "structlws__session__info.html#a53eed02325e8717a53297391e3e98fac", null ],
+ [ "mask", "structlws__session__info.html#afb924864b70f40372920688a5c1c895e", null ],
+ [ "session", "structlws__session__info.html#a4353b5dd19400b2b15edfd7cee1e4cd5", null ],
+ [ "username", "structlws__session__info.html#a3d57a70b6e7181d95a8bec429b1a7697", null ]
+ ] ],
+ [ "lws_gs_event_args", "structlws__gs__event__args.html", [
+ [ "email", "structlws__gs__event__args.html#acd17e4f9f91f7f9a8f0fbf0744a3a463", null ],
+ [ "event", "structlws__gs__event__args.html#a477274f8ca22ba7411b9285b9dc8dd06", null ],
+ [ "username", "structlws__gs__event__args.html#a2bec693d8a43730d487004a44326178b", null ]
+ ] ],
+ [ "lws_gs_event", "group__generic-sessions.html#gaa93946b3d921072209d5cd8cdfa5332e", [
+ [ "LWSGSE_CREATED", "group__generic-sessions.html#ggaa93946b3d921072209d5cd8cdfa5332ea596010a165bf13473c5eea3a34cd4308", null ],
+ [ "LWSGSE_DELETED", "group__generic-sessions.html#ggaa93946b3d921072209d5cd8cdfa5332ead908cdc5689c5d22c9d3c8934e94dcde", null ]
+ ] ],
+ [ "lwsgs_auth_bits", "group__generic-sessions.html#ga7c2dc7bfb4ccb91c5d771f9e9ea237e1", [
+ [ "LWSGS_AUTH_LOGGED_IN", "group__generic-sessions.html#gga7c2dc7bfb4ccb91c5d771f9e9ea237e1a81e63075115dedd150265d81b8f7fa57", null ],
+ [ "LWSGS_AUTH_ADMIN", "group__generic-sessions.html#gga7c2dc7bfb4ccb91c5d771f9e9ea237e1a0657a9e846814781b128c397fe4b10bf", null ],
+ [ "LWSGS_AUTH_VERIFIED", "group__generic-sessions.html#gga7c2dc7bfb4ccb91c5d771f9e9ea237e1a5a607e4668d20cadada62c4b8007f887", null ],
+ [ "LWSGS_AUTH_FORGOT_FLOW", "group__generic-sessions.html#gga7c2dc7bfb4ccb91c5d771f9e9ea237e1a2cd8fb86e3b85c106e7711c03f0ddd0a", null ]
+ ] ]
+];
\ No newline at end of file
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.11"/>
+<title>libwebsockets: HTML Chunked Substitution</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="libwebsockets.org-logo.png"/></td>
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname">libwebsockets
+ </div>
+ <div id="projectbrief">Lightweight C library for HTML5 websockets</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.11 -->
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main Page</span></a></li>
+ <li><a href="pages.html"><span>Related Pages</span></a></li>
+ <li class="current"><a href="modules.html"><span>Modules</span></a></li>
+ <li><a href="annotated.html"><span>Data Structures</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('group__html-chunked-substitution.html','');});
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#nested-classes">Data Structures</a> |
+<a href="#typedef-members">Typedefs</a> |
+<a href="#enum-members">Enumerations</a> |
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">HTML Chunked Substitution<div class="ingroups"><a class="el" href="group__http.html">HTTP</a></div></div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
+Data Structures</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__process__html__args.html">lws_process_html_args</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__process__html__state.html">lws_process_html_state</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="typedef-members"></a>
+Typedefs</h2></td></tr>
+<tr class="memitem:ga669d3d7ce2d5f193473f649a89b3e7ac"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ga669d3d7ce2d5f193473f649a89b3e7ac"></a>
+typedef const char *(* </td><td class="memItemRight" valign="bottom"><b>lws_process_html_state_cb</b>) (void *data, int index)</td></tr>
+<tr class="separator:ga669d3d7ce2d5f193473f649a89b3e7ac"><td class="memSeparator" colspan="2"> </td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="enum-members"></a>
+Enumerations</h2></td></tr>
+<tr class="memitem:gabc3b93f68c8bdd857ad32913628dfa8d"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="gabc3b93f68c8bdd857ad32913628dfa8d"></a>enum  </td><td class="memItemRight" valign="bottom"><b>http_status</b> { <br />
+  <b>HTTP_STATUS_OK</b> = 200,
+<b>HTTP_STATUS_NO_CONTENT</b> = 204,
+<b>HTTP_STATUS_MOVED_PERMANENTLY</b> = 301,
+<b>HTTP_STATUS_FOUND</b> = 302,
+<br />
+  <b>HTTP_STATUS_SEE_OTHER</b> = 303,
+<b>HTTP_STATUS_BAD_REQUEST</b> = 400,
+<b>HTTP_STATUS_UNAUTHORIZED</b>,
+<b>HTTP_STATUS_PAYMENT_REQUIRED</b>,
+<br />
+  <b>HTTP_STATUS_FORBIDDEN</b>,
+<b>HTTP_STATUS_NOT_FOUND</b>,
+<b>HTTP_STATUS_METHOD_NOT_ALLOWED</b>,
+<b>HTTP_STATUS_NOT_ACCEPTABLE</b>,
+<br />
+  <b>HTTP_STATUS_PROXY_AUTH_REQUIRED</b>,
+<b>HTTP_STATUS_REQUEST_TIMEOUT</b>,
+<b>HTTP_STATUS_CONFLICT</b>,
+<b>HTTP_STATUS_GONE</b>,
+<br />
+  <b>HTTP_STATUS_LENGTH_REQUIRED</b>,
+<b>HTTP_STATUS_PRECONDITION_FAILED</b>,
+<b>HTTP_STATUS_REQ_ENTITY_TOO_LARGE</b>,
+<b>HTTP_STATUS_REQ_URI_TOO_LONG</b>,
+<br />
+  <b>HTTP_STATUS_UNSUPPORTED_MEDIA_TYPE</b>,
+<b>HTTP_STATUS_REQ_RANGE_NOT_SATISFIABLE</b>,
+<b>HTTP_STATUS_EXPECTATION_FAILED</b>,
+<b>HTTP_STATUS_INTERNAL_SERVER_ERROR</b> = 500,
+<br />
+  <b>HTTP_STATUS_NOT_IMPLEMENTED</b>,
+<b>HTTP_STATUS_BAD_GATEWAY</b>,
+<b>HTTP_STATUS_SERVICE_UNAVAILABLE</b>,
+<b>HTTP_STATUS_GATEWAY_TIMEOUT</b>,
+<br />
+  <b>HTTP_STATUS_HTTP_VERSION_NOT_SUPPORTED</b>
+<br />
+ }</td></tr>
+<tr class="separator:gabc3b93f68c8bdd857ad32913628dfa8d"><td class="memSeparator" colspan="2"> </td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ga643073f918c0a7016b690aae9793fd60"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN int </td><td class="memItemRight" valign="bottom"><a class="el" href="group__html-chunked-substitution.html#ga643073f918c0a7016b690aae9793fd60">lws_chunked_html_process</a> (struct <a class="el" href="structlws__process__html__args.html">lws_process_html_args</a> *args, struct <a class="el" href="structlws__process__html__state.html">lws_process_html_state</a> *s)</td></tr>
+<tr class="separator:ga643073f918c0a7016b690aae9793fd60"><td class="memSeparator" colspan="2"> </td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<h2>HTML chunked Substitution</h2>
+<p>APIs for receiving chunks of text, replacing a set of variable names via a callback, and then prepending and appending HTML chunked encoding headers. </p>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="ga643073f918c0a7016b690aae9793fd60"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">LWS_VISIBLE LWS_EXTERN int lws_chunked_html_process </td>
+ <td>(</td>
+ <td class="paramtype">struct <a class="el" href="structlws__process__html__args.html">lws_process_html_args</a> * </td>
+ <td class="paramname"><em>args</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">struct <a class="el" href="structlws__process__html__state.html">lws_process_html_state</a> * </td>
+ <td class="paramname"><em>s</em> </td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h.html">lib/libwebsockets.h</a>></code></p>
+<p><a class="el" href="group__html-chunked-substitution.html#ga643073f918c0a7016b690aae9793fd60">lws_chunked_html_process()</a> - generic chunked substitution </p><dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">args</td><td>buffer to process using chunked encoding </td></tr>
+ <tr><td class="paramname">s</td><td>current processing state </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">Generated by
+ <a href="http://www.doxygen.org/index.html">
+ <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.11 </li>
+ </ul>
+</div>
+</body>
+</html>
--- /dev/null
+var group__html_chunked_substitution =
+[
+ [ "lws_process_html_args", "structlws__process__html__args.html", [
+ [ "final", "structlws__process__html__args.html#a362547891ee0d693f3900a1f807ea475", null ],
+ [ "len", "structlws__process__html__args.html#a754513f2311241cabb0cd1c90d7307ef", null ],
+ [ "max_len", "structlws__process__html__args.html#a8be7fd396a1942ea2449a2fda990ff99", null ],
+ [ "p", "structlws__process__html__args.html#a11859d8bedd379fbf64543b25c65fe14", null ]
+ ] ],
+ [ "lws_process_html_state", "structlws__process__html__state.html", [
+ [ "count_vars", "structlws__process__html__state.html#adcafd17704775b4bbeea9561fb340968", null ],
+ [ "data", "structlws__process__html__state.html#af21119890fdfebe28fb5c4dabfc1bdf5", null ],
+ [ "pos", "structlws__process__html__state.html#a53234f2948812c7208a256f9f5b23c20", null ],
+ [ "replace", "structlws__process__html__state.html#a693d2fb45378afee5da29b539c1ea644", null ],
+ [ "start", "structlws__process__html__state.html#af0732884ef891e24fe5fa237ebaa21a3", null ],
+ [ "swallow", "structlws__process__html__state.html#a71982bc1cbd8cf876ca0f545144404eb", null ],
+ [ "vars", "structlws__process__html__state.html#a3b113e00c03a2fded51b1c85ff5bf077", null ]
+ ] ],
+ [ "lws_chunked_html_process", "group__html-chunked-substitution.html#ga643073f918c0a7016b690aae9793fd60", null ]
+];
\ No newline at end of file
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.11"/>
+<title>libwebsockets: HTTP</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="libwebsockets.org-logo.png"/></td>
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname">libwebsockets
+ </div>
+ <div id="projectbrief">Lightweight C library for HTML5 websockets</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.11 -->
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main Page</span></a></li>
+ <li><a href="pages.html"><span>Related Pages</span></a></li>
+ <li class="current"><a href="modules.html"><span>Modules</span></a></li>
+ <li><a href="annotated.html"><span>Data Structures</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('group__http.html','');});
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#groups">Modules</a> |
+<a href="#nested-classes">Data Structures</a> |
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">HTTP</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="groups"></a>
+Modules</h2></td></tr>
+<tr class="memitem:group__form-parsing"><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="group__form-parsing.html">Form Parsing</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:group__html-chunked-substitution"><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="group__html-chunked-substitution.html">HTML Chunked Substitution</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:group__httpft"><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="group__httpft.html">HTTP File transfer</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:group__HTTP-headers-create"><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="group__HTTP-headers-create.html">HTTP headers: create</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:group__HTTP-headers-read"><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="group__HTTP-headers-read.html">HTTP headers: read</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:group__urlendec"><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="group__urlendec.html">Urlencode and Urldecode</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
+Data Structures</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__tokens.html">lws_tokens</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:gac8a4a71240857dc6b2ed70456b6923f4"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN int </td><td class="memItemRight" valign="bottom"><a class="el" href="group__http.html#gac8a4a71240857dc6b2ed70456b6923f4">lws_return_http_status</a> (struct lws *wsi, unsigned int code, const char *html_body)</td></tr>
+<tr class="separator:gac8a4a71240857dc6b2ed70456b6923f4"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga8fbf01e473ac421fc33ad9f8da8b8a25"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT </td><td class="memItemRight" valign="bottom"><a class="el" href="group__http.html#ga8fbf01e473ac421fc33ad9f8da8b8a25">lws_http_redirect</a> (struct lws *wsi, int code, const unsigned char *loc, int len, unsigned char **p, unsigned char *end)</td></tr>
+<tr class="separator:ga8fbf01e473ac421fc33ad9f8da8b8a25"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:gad27aed6c66a41b2b89ffe4da2a309e8a"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT </td><td class="memItemRight" valign="bottom"><a class="el" href="group__http.html#gad27aed6c66a41b2b89ffe4da2a309e8a">lws_http_transaction_completed</a> (struct lws *wsi)</td></tr>
+<tr class="separator:gad27aed6c66a41b2b89ffe4da2a309e8a"><td class="memSeparator" colspan="2"> </td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<p>Modules related to handling HTTP </p>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="ga8fbf01e473ac421fc33ad9f8da8b8a25"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT lws_http_redirect </td>
+ <td>(</td>
+ <td class="paramtype">struct lws * </td>
+ <td class="paramname"><em>wsi</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">int </td>
+ <td class="paramname"><em>code</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const unsigned char * </td>
+ <td class="paramname"><em>loc</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">int </td>
+ <td class="paramname"><em>len</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">unsigned char ** </td>
+ <td class="paramname"><em>p</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">unsigned char * </td>
+ <td class="paramname"><em>end</em> </td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h.html">lib/libwebsockets.h</a>></code></p>
+<p><a class="el" href="group__http.html#ga8fbf01e473ac421fc33ad9f8da8b8a25">lws_http_redirect()</a> - write http redirect into buffer</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">wsi</td><td>websocket connection </td></tr>
+ <tr><td class="paramname">code</td><td>HTTP response code (eg, 301) </td></tr>
+ <tr><td class="paramname">loc</td><td>where to redirect to </td></tr>
+ <tr><td class="paramname">len</td><td>length of loc </td></tr>
+ <tr><td class="paramname">p</td><td>pointer current position in buffer (updated as we write) </td></tr>
+ <tr><td class="paramname">end</td><td>pointer to end of buffer </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a class="anchor" id="gad27aed6c66a41b2b89ffe4da2a309e8a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT lws_http_transaction_completed </td>
+ <td>(</td>
+ <td class="paramtype">struct lws * </td>
+ <td class="paramname"><em>wsi</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h.html">lib/libwebsockets.h</a>></code></p>
+<p><a class="el" href="group__http.html#gad27aed6c66a41b2b89ffe4da2a309e8a">lws_http_transaction_completed()</a> - wait for new http transaction or close </p><dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">wsi</td><td>websocket connection <pre class="fragment"> Returns 1 if the HTTP connection must close now
+ Returns 0 and resets connection to wait for new HTTP header /
+ transaction if possible</pre> </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a class="anchor" id="gac8a4a71240857dc6b2ed70456b6923f4"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">LWS_VISIBLE LWS_EXTERN int lws_return_http_status </td>
+ <td>(</td>
+ <td class="paramtype">struct lws * </td>
+ <td class="paramname"><em>wsi</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">unsigned int </td>
+ <td class="paramname"><em>code</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const char * </td>
+ <td class="paramname"><em>html_body</em> </td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h.html">lib/libwebsockets.h</a>></code></p>
+<p><a class="el" href="group__http.html#gac8a4a71240857dc6b2ed70456b6923f4">lws_return_http_status()</a> - Return simple http status </p><dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">wsi</td><td>Websocket instance (available from user callback) </td></tr>
+ <tr><td class="paramname">code</td><td>Status index, eg, 404 </td></tr>
+ <tr><td class="paramname">html_body</td><td>User-readable HTML description < 1KB, or NULL <pre class="fragment"> Helper to report HTTP errors back to the client cleanly and
+ consistently</pre> </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">Generated by
+ <a href="http://www.doxygen.org/index.html">
+ <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.11 </li>
+ </ul>
+</div>
+</body>
+</html>
--- /dev/null
+var group__http =
+[
+ [ "Form Parsing", "group__form-parsing.html", "group__form-parsing" ],
+ [ "HTML Chunked Substitution", "group__html-chunked-substitution.html", "group__html-chunked-substitution" ],
+ [ "HTTP File transfer", "group__httpft.html", "group__httpft" ],
+ [ "HTTP headers: create", "group__HTTP-headers-create.html", "group__HTTP-headers-create" ],
+ [ "HTTP headers: read", "group__HTTP-headers-read.html", "group__HTTP-headers-read" ],
+ [ "Urlencode and Urldecode", "group__urlendec.html", "group__urlendec" ],
+ [ "lws_tokens", "structlws__tokens.html", [
+ [ "token", "structlws__tokens.html#a9f3635412bc71a5cb78e9862b55f10cd", null ],
+ [ "token_len", "structlws__tokens.html#a855b7375d1d58516c0ecd4b60e9a7766", null ]
+ ] ],
+ [ "lws_http_redirect", "group__http.html#ga8fbf01e473ac421fc33ad9f8da8b8a25", null ],
+ [ "lws_http_transaction_completed", "group__http.html#gad27aed6c66a41b2b89ffe4da2a309e8a", null ],
+ [ "lws_return_http_status", "group__http.html#gac8a4a71240857dc6b2ed70456b6923f4", null ]
+];
\ No newline at end of file
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.11"/>
+<title>libwebsockets: HTTP File transfer</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="libwebsockets.org-logo.png"/></td>
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname">libwebsockets
+ </div>
+ <div id="projectbrief">Lightweight C library for HTML5 websockets</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.11 -->
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main Page</span></a></li>
+ <li><a href="pages.html"><span>Related Pages</span></a></li>
+ <li class="current"><a href="modules.html"><span>Modules</span></a></li>
+ <li><a href="annotated.html"><span>Data Structures</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('group__httpft.html','');});
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">HTTP File transfer<div class="ingroups"><a class="el" href="group__http.html">HTTP</a></div></div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:gab393a06d3d2722af4c3f8b06842c80d7"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN int </td><td class="memItemRight" valign="bottom"><a class="el" href="group__httpft.html#gab393a06d3d2722af4c3f8b06842c80d7">lws_serve_http_file</a> (struct lws *wsi, const char *file, const char *content_type, const char *other_headers, int other_headers_len)</td></tr>
+<tr class="separator:gab393a06d3d2722af4c3f8b06842c80d7"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga29e1123f6d56cd777b3e5bf9ca40f9e5"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ga29e1123f6d56cd777b3e5bf9ca40f9e5"></a>
+LWS_VISIBLE LWS_EXTERN int </td><td class="memItemRight" valign="bottom"><b>lws_serve_http_file_fragment</b> (struct lws *wsi)</td></tr>
+<tr class="separator:ga29e1123f6d56cd777b3e5bf9ca40f9e5"><td class="memSeparator" colspan="2"> </td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<p>APIs for sending local files in response to HTTP requests </p>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="gab393a06d3d2722af4c3f8b06842c80d7"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">LWS_VISIBLE LWS_EXTERN int lws_serve_http_file </td>
+ <td>(</td>
+ <td class="paramtype">struct lws * </td>
+ <td class="paramname"><em>wsi</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const char * </td>
+ <td class="paramname"><em>file</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const char * </td>
+ <td class="paramname"><em>content_type</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const char * </td>
+ <td class="paramname"><em>other_headers</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">int </td>
+ <td class="paramname"><em>other_headers_len</em> </td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h.html">lib/libwebsockets.h</a>></code></p>
+<p><a class="el" href="group__httpft.html#gab393a06d3d2722af4c3f8b06842c80d7">lws_serve_http_file()</a> - Send a file back to the client using http </p><dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">wsi</td><td>Websocket instance (available from user callback) </td></tr>
+ <tr><td class="paramname">file</td><td>The file to issue over http </td></tr>
+ <tr><td class="paramname">content_type</td><td>The http content type, eg, text/html </td></tr>
+ <tr><td class="paramname">other_headers</td><td>NULL or pointer to header string </td></tr>
+ <tr><td class="paramname">other_headers_len</td><td>length of the other headers if non-NULL <pre class="fragment"> This function is intended to be called from the callback in response
+ to http requests from the client. It allows the callback to issue
+ local files down the http link in a single step.
+
+ Returning <0 indicates error and the wsi should be closed. Returning
+ >0 indicates the file was completely sent and
+ lws_http_transaction_completed() called on the wsi (and close if != 0)
+ ==0 indicates the file transfer is started and needs more service later,
+ the wsi should be left alone.</pre> </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">Generated by
+ <a href="http://www.doxygen.org/index.html">
+ <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.11 </li>
+ </ul>
+</div>
+</body>
+</html>
--- /dev/null
+var group__httpft =
+[
+ [ "lws_serve_http_file", "group__httpft.html#gab393a06d3d2722af4c3f8b06842c80d7", null ]
+];
\ No newline at end of file
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.11"/>
+<title>libwebsockets: Logging</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="libwebsockets.org-logo.png"/></td>
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname">libwebsockets
+ </div>
+ <div id="projectbrief">Lightweight C library for HTML5 websockets</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.11 -->
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main Page</span></a></li>
+ <li><a href="pages.html"><span>Related Pages</span></a></li>
+ <li class="current"><a href="modules.html"><span>Modules</span></a></li>
+ <li><a href="annotated.html"><span>Data Structures</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('group__log.html','');});
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#enum-members">Enumerations</a> |
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">Logging</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="enum-members"></a>
+Enumerations</h2></td></tr>
+<tr class="memitem:ga14542b84d2c76efa7814124bb10f9c5f"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ga14542b84d2c76efa7814124bb10f9c5f"></a>enum  </td><td class="memItemRight" valign="bottom"><b>lws_log_levels</b> { <br />
+  <b>LLL_ERR</b> = 1 << 0,
+<b>LLL_WARN</b> = 1 << 1,
+<b>LLL_NOTICE</b> = 1 << 2,
+<b>LLL_INFO</b> = 1 << 3,
+<br />
+  <b>LLL_DEBUG</b> = 1 << 4,
+<b>LLL_PARSER</b> = 1 << 5,
+<b>LLL_HEADER</b> = 1 << 6,
+<b>LLL_EXT</b> = 1 << 7,
+<br />
+  <b>LLL_CLIENT</b> = 1 << 8,
+<b>LLL_LATENCY</b> = 1 << 9,
+<b>LLL_COUNT</b> = 10
+<br />
+ }</td></tr>
+<tr class="separator:ga14542b84d2c76efa7814124bb10f9c5f"><td class="memSeparator" colspan="2"> </td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:gaf5f07837692b2f231a79da8a058288aa"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="gaf5f07837692b2f231a79da8a058288aa"></a>
+LWS_VISIBLE LWS_EXTERN void </td><td class="memItemRight" valign="bottom"><b>_lws_log</b> (int filter, const char *format,...)</td></tr>
+<tr class="separator:gaf5f07837692b2f231a79da8a058288aa"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga74eb146969f0595e12ea835851b4588e"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ga74eb146969f0595e12ea835851b4588e"></a>
+LWS_VISIBLE LWS_EXTERN void </td><td class="memItemRight" valign="bottom"><b>_lws_logv</b> (int filter, const char *format, va_list vl)</td></tr>
+<tr class="separator:ga74eb146969f0595e12ea835851b4588e"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga42e39775c6b69b7251bdbf5a2cdd5dcd"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN int </td><td class="memItemRight" valign="bottom"><a class="el" href="group__log.html#ga42e39775c6b69b7251bdbf5a2cdd5dcd">lwsl_timestamp</a> (int level, char *p, int len)</td></tr>
+<tr class="separator:ga42e39775c6b69b7251bdbf5a2cdd5dcd"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga898b1f03872ad019f507d4e35bbefa90"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN void </td><td class="memItemRight" valign="bottom"><a class="el" href="group__log.html#ga898b1f03872ad019f507d4e35bbefa90">lwsl_hexdump</a> (void *buf, size_t len)</td></tr>
+<tr class="separator:ga898b1f03872ad019f507d4e35bbefa90"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga244647f9e1bf0097ccdde66d74f41e26"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN void </td><td class="memItemRight" valign="bottom"><a class="el" href="group__log.html#ga244647f9e1bf0097ccdde66d74f41e26">lws_set_log_level</a> (int level, void(*log_emit_function)(int level, const char *line))</td></tr>
+<tr class="separator:ga244647f9e1bf0097ccdde66d74f41e26"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:gab7c0fc936cc9f1eb58e2bb234c15147c"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN void </td><td class="memItemRight" valign="bottom"><a class="el" href="group__log.html#gab7c0fc936cc9f1eb58e2bb234c15147c">lwsl_emit_syslog</a> (int level, const char *line)</td></tr>
+<tr class="separator:gab7c0fc936cc9f1eb58e2bb234c15147c"><td class="memSeparator" colspan="2"> </td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<h2>Logging</h2>
+<p>Lws provides flexible and filterable logging facilities, which can be used inside lws and in user code.</p>
+<p>Log categories may be individually filtered bitwise, and directed to built-in sinks for syslog-compatible logging, or a user-defined function. </p>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="ga244647f9e1bf0097ccdde66d74f41e26"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">LWS_VISIBLE LWS_EXTERN void lws_set_log_level </td>
+ <td>(</td>
+ <td class="paramtype">int </td>
+ <td class="paramname"><em>level</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">void(*)(int level, const char *line) </td>
+ <td class="paramname"><em>log_emit_function</em> </td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h.html">lib/libwebsockets.h</a>></code></p>
+<p><a class="el" href="group__log.html#ga244647f9e1bf0097ccdde66d74f41e26">lws_set_log_level()</a> - Set the logging bitfield </p><dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">level</td><td>OR together the LLL_ debug contexts you want output from </td></tr>
+ <tr><td class="paramname">log_emit_function</td><td>NULL to leave it as it is, or a user-supplied function to perform log string emission instead of the default stderr one.</td></tr>
+ </table>
+ </dd>
+</dl>
+<p>log level defaults to "err", "warn" and "notice" contexts enabled and emission on stderr. </p>
+
+</div>
+</div>
+<a class="anchor" id="gab7c0fc936cc9f1eb58e2bb234c15147c"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">LWS_VISIBLE LWS_EXTERN void lwsl_emit_syslog </td>
+ <td>(</td>
+ <td class="paramtype">int </td>
+ <td class="paramname"><em>level</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const char * </td>
+ <td class="paramname"><em>line</em> </td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h.html">lib/libwebsockets.h</a>></code></p>
+<p><a class="el" href="group__log.html#gab7c0fc936cc9f1eb58e2bb234c15147c">lwsl_emit_syslog()</a> - helper log emit function writes to system log</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">level</td><td>one of LLL_ log level indexes </td></tr>
+ <tr><td class="paramname">line</td><td>log string</td></tr>
+ </table>
+ </dd>
+</dl>
+<p>You use this by passing the function pointer to <a class="el" href="group__log.html#ga244647f9e1bf0097ccdde66d74f41e26">lws_set_log_level()</a>, to set it as the log emit function, it is not called directly. </p>
+
+</div>
+</div>
+<a class="anchor" id="ga898b1f03872ad019f507d4e35bbefa90"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">LWS_VISIBLE LWS_EXTERN void lwsl_hexdump </td>
+ <td>(</td>
+ <td class="paramtype">void * </td>
+ <td class="paramname"><em>buf</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">size_t </td>
+ <td class="paramname"><em>len</em> </td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h.html">lib/libwebsockets.h</a>></code></p>
+<p><a class="el" href="group__log.html#ga898b1f03872ad019f507d4e35bbefa90">lwsl_hexdump()</a> - helper to hexdump a buffer (DEBUG builds only)</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">buf</td><td>buffer start to dump </td></tr>
+ <tr><td class="paramname">len</td><td>length of buffer to dump </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a class="anchor" id="ga42e39775c6b69b7251bdbf5a2cdd5dcd"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">LWS_VISIBLE LWS_EXTERN int lwsl_timestamp </td>
+ <td>(</td>
+ <td class="paramtype">int </td>
+ <td class="paramname"><em>level</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">char * </td>
+ <td class="paramname"><em>p</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">int </td>
+ <td class="paramname"><em>len</em> </td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h.html">lib/libwebsockets.h</a>></code></p>
+<p>lwsl_timestamp: generate logging timestamp string</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">level</td><td>logging level </td></tr>
+ <tr><td class="paramname">p</td><td>char * buffer to take timestamp </td></tr>
+ <tr><td class="paramname">len</td><td>length of p</td></tr>
+ </table>
+ </dd>
+</dl>
+<p>returns length written in p </p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">Generated by
+ <a href="http://www.doxygen.org/index.html">
+ <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.11 </li>
+ </ul>
+</div>
+</body>
+</html>
--- /dev/null
+var group__log =
+[
+ [ "lws_set_log_level", "group__log.html#ga244647f9e1bf0097ccdde66d74f41e26", null ],
+ [ "lwsl_emit_syslog", "group__log.html#gab7c0fc936cc9f1eb58e2bb234c15147c", null ],
+ [ "lwsl_hexdump", "group__log.html#ga898b1f03872ad019f507d4e35bbefa90", null ],
+ [ "lwsl_timestamp", "group__log.html#ga42e39775c6b69b7251bdbf5a2cdd5dcd", null ]
+];
\ No newline at end of file
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.11"/>
+<title>libwebsockets: Miscellaneous APIs</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="libwebsockets.org-logo.png"/></td>
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname">libwebsockets
+ </div>
+ <div id="projectbrief">Lightweight C library for HTML5 websockets</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.11 -->
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main Page</span></a></li>
+ <li><a href="pages.html"><span>Related Pages</span></a></li>
+ <li class="current"><a href="modules.html"><span>Modules</span></a></li>
+ <li><a href="annotated.html"><span>Data Structures</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('group__misc.html','');});
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">Miscellaneous APIs</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ga58f906c6be0ca80efd813f694569dd4a"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN int </td><td class="memItemRight" valign="bottom"><a class="el" href="group__misc.html#ga58f906c6be0ca80efd813f694569dd4a">lws_get_random</a> (struct lws_context *context, void *buf, int len)</td></tr>
+<tr class="separator:ga58f906c6be0ca80efd813f694569dd4a"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:gace5171b1dbbc03ec89a98f8afdb5c9af"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT </td><td class="memItemRight" valign="bottom"><a class="el" href="group__misc.html#gace5171b1dbbc03ec89a98f8afdb5c9af">lws_daemonize</a> (const char *_lock_path)</td></tr>
+<tr class="separator:gace5171b1dbbc03ec89a98f8afdb5c9af"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:gac6abfc0b2bd5b2f09281a4432bb2f5f0"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN const char *LWS_WARN_UNUSED_RESULT </td><td class="memItemRight" valign="bottom"><a class="el" href="group__misc.html#gac6abfc0b2bd5b2f09281a4432bb2f5f0">lws_get_library_version</a> (void)</td></tr>
+<tr class="separator:gac6abfc0b2bd5b2f09281a4432bb2f5f0"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:gaa194584fff9698f3b280658f770ccd0f"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN void * </td><td class="memItemRight" valign="bottom"><a class="el" href="group__misc.html#gaa194584fff9698f3b280658f770ccd0f">lws_wsi_user</a> (struct lws *wsi)</td></tr>
+<tr class="separator:gaa194584fff9698f3b280658f770ccd0f"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga1ec0d9faac5d3a5824d765c287c043aa"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT </td><td class="memItemRight" valign="bottom"><a class="el" href="group__misc.html#ga1ec0d9faac5d3a5824d765c287c043aa">lws_parse_uri</a> (char *p, const char **prot, const char **ads, int *port, const char **path)</td></tr>
+<tr class="separator:ga1ec0d9faac5d3a5824d765c287c043aa"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga33bf2635033710b25f931b57ed663e1e"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN unsigned long </td><td class="memItemRight" valign="bottom"><a class="el" href="group__misc.html#ga33bf2635033710b25f931b57ed663e1e">lws_now_secs</a> (void)</td></tr>
+<tr class="separator:ga33bf2635033710b25f931b57ed663e1e"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga0af4f7d2dd375aeedcfa7eb0e1101c4b"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN struct lws_context *LWS_WARN_UNUSED_RESULT </td><td class="memItemRight" valign="bottom"><a class="el" href="group__misc.html#ga0af4f7d2dd375aeedcfa7eb0e1101c4b">lws_get_context</a> (const struct lws *wsi)</td></tr>
+<tr class="separator:ga0af4f7d2dd375aeedcfa7eb0e1101c4b"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga629f48268fd1856b54b11172991b97d9"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT </td><td class="memItemRight" valign="bottom"><a class="el" href="group__misc.html#ga629f48268fd1856b54b11172991b97d9">lws_get_count_threads</a> (struct lws_context *context)</td></tr>
+<tr class="separator:ga629f48268fd1856b54b11172991b97d9"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga8930fe36a3f3eefe4a6a4fd499d8e899"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN struct lws *LWS_WARN_UNUSED_RESULT </td><td class="memItemRight" valign="bottom"><a class="el" href="group__misc.html#ga8930fe36a3f3eefe4a6a4fd499d8e899">lws_get_parent</a> (const struct lws *wsi)</td></tr>
+<tr class="separator:ga8930fe36a3f3eefe4a6a4fd499d8e899"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:gacae4d7b6a8d22e4c2d82ff8b12c1e234"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN struct lws *LWS_WARN_UNUSED_RESULT </td><td class="memItemRight" valign="bottom"><a class="el" href="group__misc.html#gacae4d7b6a8d22e4c2d82ff8b12c1e234">lws_get_child</a> (const struct lws *wsi)</td></tr>
+<tr class="separator:gacae4d7b6a8d22e4c2d82ff8b12c1e234"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga0e705d498e8c8500649a26ba30a1e106"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ga0e705d498e8c8500649a26ba30a1e106"></a>
+LWS_VISIBLE LWS_EXTERN int </td><td class="memItemRight" valign="bottom"><b>lws_read</b> (struct lws *wsi, unsigned char *buf, size_t len)</td></tr>
+<tr class="separator:ga0e705d498e8c8500649a26ba30a1e106"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:gab321ed812f46f6dc7ef9e3ca6f00cf1b"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN void </td><td class="memItemRight" valign="bottom"><a class="el" href="group__misc.html#gab321ed812f46f6dc7ef9e3ca6f00cf1b">lws_set_allocator</a> (void *(*realloc)(void *ptr, size_t size))</td></tr>
+<tr class="separator:gab321ed812f46f6dc7ef9e3ca6f00cf1b"><td class="memSeparator" colspan="2"> </td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<h2>Miscellaneous APIs</h2>
+<p>Various APIs outside of other categories </p>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="gace5171b1dbbc03ec89a98f8afdb5c9af"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT lws_daemonize </td>
+ <td>(</td>
+ <td class="paramtype">const char * </td>
+ <td class="paramname"><em>_lock_path</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h.html">lib/libwebsockets.h</a>></code></p>
+<p><a class="el" href="group__misc.html#gace5171b1dbbc03ec89a98f8afdb5c9af">lws_daemonize()</a>: fill a buffer with platform random data</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">_lock_path</td><td>the filepath to write the lock file</td></tr>
+ </table>
+ </dd>
+</dl>
+<p>Spawn lws as a background process, taking care of various things </p>
+
+</div>
+</div>
+<a class="anchor" id="gacae4d7b6a8d22e4c2d82ff8b12c1e234"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">LWS_VISIBLE LWS_EXTERN struct lws* LWS_WARN_UNUSED_RESULT lws_get_child </td>
+ <td>(</td>
+ <td class="paramtype">const struct lws * </td>
+ <td class="paramname"><em>wsi</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h.html">lib/libwebsockets.h</a>></code></p>
+<p><a class="el" href="group__misc.html#gacae4d7b6a8d22e4c2d82ff8b12c1e234">lws_get_child()</a> - get child wsi or NULL </p><dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">wsi</td><td>lws connection</td></tr>
+ </table>
+ </dd>
+</dl>
+<p>Allows you to find a related wsi from the parent wsi. </p>
+
+</div>
+</div>
+<a class="anchor" id="ga0af4f7d2dd375aeedcfa7eb0e1101c4b"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">LWS_VISIBLE LWS_EXTERN struct lws_context* LWS_WARN_UNUSED_RESULT lws_get_context </td>
+ <td>(</td>
+ <td class="paramtype">const struct lws * </td>
+ <td class="paramname"><em>wsi</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h.html">lib/libwebsockets.h</a>></code></p>
+<p>lws_get_context - Allow geting lws_context from a Websocket connection instance</p>
+<p>With this function, users can access context in the callback function. Otherwise users may have to declare context as a global variable.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">wsi</td><td>Websocket connection instance </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a class="anchor" id="ga629f48268fd1856b54b11172991b97d9"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT lws_get_count_threads </td>
+ <td>(</td>
+ <td class="paramtype">struct lws_context * </td>
+ <td class="paramname"><em>context</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h.html">lib/libwebsockets.h</a>></code></p>
+<p><a class="el" href="group__misc.html#ga629f48268fd1856b54b11172991b97d9">lws_get_count_threads()</a>: how many service threads the context uses</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">context</td><td>the lws context</td></tr>
+ </table>
+ </dd>
+</dl>
+<p>By default this is always 1, if you asked for more than lws can handle it will clip the number of threads. So you can use this to find out how many threads are actually in use. </p>
+
+</div>
+</div>
+<a class="anchor" id="gac6abfc0b2bd5b2f09281a4432bb2f5f0"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">LWS_VISIBLE LWS_EXTERN const char* LWS_WARN_UNUSED_RESULT lws_get_library_version </td>
+ <td>(</td>
+ <td class="paramtype">void </td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h.html">lib/libwebsockets.h</a>></code></p>
+<p><a class="el" href="group__misc.html#gac6abfc0b2bd5b2f09281a4432bb2f5f0">lws_get_library_version()</a>: return string describing the version of lws</p>
+<p>On unix, also includes the git describe </p>
+
+</div>
+</div>
+<a class="anchor" id="ga8930fe36a3f3eefe4a6a4fd499d8e899"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">LWS_VISIBLE LWS_EXTERN struct lws* LWS_WARN_UNUSED_RESULT lws_get_parent </td>
+ <td>(</td>
+ <td class="paramtype">const struct lws * </td>
+ <td class="paramname"><em>wsi</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h.html">lib/libwebsockets.h</a>></code></p>
+<p><a class="el" href="group__misc.html#ga8930fe36a3f3eefe4a6a4fd499d8e899">lws_get_parent()</a> - get parent wsi or NULL </p><dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">wsi</td><td>lws connection</td></tr>
+ </table>
+ </dd>
+</dl>
+<p>Specialized wsi like cgi stdin/out/err are associated to a parent wsi, this allows you to get their parent. </p>
+
+</div>
+</div>
+<a class="anchor" id="ga58f906c6be0ca80efd813f694569dd4a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">LWS_VISIBLE LWS_EXTERN int lws_get_random </td>
+ <td>(</td>
+ <td class="paramtype">struct lws_context * </td>
+ <td class="paramname"><em>context</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">void * </td>
+ <td class="paramname"><em>buf</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">int </td>
+ <td class="paramname"><em>len</em> </td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h.html">lib/libwebsockets.h</a>></code></p>
+<p><a class="el" href="group__misc.html#ga58f906c6be0ca80efd813f694569dd4a">lws_get_random()</a>: fill a buffer with platform random data</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">context</td><td>the lws context </td></tr>
+ <tr><td class="paramname">buf</td><td>buffer to fill </td></tr>
+ <tr><td class="paramname">len</td><td>how much to fill</td></tr>
+ </table>
+ </dd>
+</dl>
+<p>This is intended to be called from the LWS_CALLBACK_RECEIVE callback if it's interested to see if the frame it's dealing with was sent in binary mode. </p>
+
+</div>
+</div>
+<a class="anchor" id="ga33bf2635033710b25f931b57ed663e1e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">LWS_VISIBLE LWS_EXTERN unsigned long lws_now_secs </td>
+ <td>(</td>
+ <td class="paramtype">void </td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h.html">lib/libwebsockets.h</a>></code></p>
+<p><a class="el" href="group__misc.html#ga33bf2635033710b25f931b57ed663e1e">lws_now_secs()</a>: return seconds since 1970-1-1 </p>
+
+</div>
+</div>
+<a class="anchor" id="ga1ec0d9faac5d3a5824d765c287c043aa"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT lws_parse_uri </td>
+ <td>(</td>
+ <td class="paramtype">char * </td>
+ <td class="paramname"><em>p</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const char ** </td>
+ <td class="paramname"><em>prot</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const char ** </td>
+ <td class="paramname"><em>ads</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">int * </td>
+ <td class="paramname"><em>port</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const char ** </td>
+ <td class="paramname"><em>path</em> </td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h.html">lib/libwebsockets.h</a>></code></p>
+<p>lws_parse_uri: cut up prot:/ads:port/path into pieces Notice it does so by dropping '\0' into input string and the leading / on the path is consequently lost</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">p</td><td>incoming uri string.. will get written to </td></tr>
+ <tr><td class="paramname">prot</td><td>result pointer for protocol part (<a href="https://">https://</a>) </td></tr>
+ <tr><td class="paramname">ads</td><td>result pointer for address part </td></tr>
+ <tr><td class="paramname">port</td><td>result pointer for port part </td></tr>
+ <tr><td class="paramname">path</td><td>result pointer for path part </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a class="anchor" id="gab321ed812f46f6dc7ef9e3ca6f00cf1b"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">LWS_VISIBLE LWS_EXTERN void lws_set_allocator </td>
+ <td>(</td>
+ <td class="paramtype">void *(*)(void *ptr, size_t size) </td>
+ <td class="paramname"><em>realloc</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h.html">lib/libwebsockets.h</a>></code></p>
+<p><a class="el" href="group__misc.html#gab321ed812f46f6dc7ef9e3ca6f00cf1b">lws_set_allocator()</a> - custom allocator support</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">realloc</td><td>Allows you to replace the allocator (and deallocator) used by lws </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a class="anchor" id="gaa194584fff9698f3b280658f770ccd0f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">LWS_VISIBLE LWS_EXTERN void* lws_wsi_user </td>
+ <td>(</td>
+ <td class="paramtype">struct lws * </td>
+ <td class="paramname"><em>wsi</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h.html">lib/libwebsockets.h</a>></code></p>
+<p><a class="el" href="group__misc.html#gaa194584fff9698f3b280658f770ccd0f">lws_wsi_user()</a> - get the user data associated with the connection </p><dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">wsi</td><td>lws connection</td></tr>
+ </table>
+ </dd>
+</dl>
+<p>Not normally needed since it's passed into the callback </p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">Generated by
+ <a href="http://www.doxygen.org/index.html">
+ <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.11 </li>
+ </ul>
+</div>
+</body>
+</html>
--- /dev/null
+var group__misc =
+[
+ [ "lws_daemonize", "group__misc.html#gace5171b1dbbc03ec89a98f8afdb5c9af", null ],
+ [ "lws_get_child", "group__misc.html#gacae4d7b6a8d22e4c2d82ff8b12c1e234", null ],
+ [ "lws_get_context", "group__misc.html#ga0af4f7d2dd375aeedcfa7eb0e1101c4b", null ],
+ [ "lws_get_count_threads", "group__misc.html#ga629f48268fd1856b54b11172991b97d9", null ],
+ [ "lws_get_library_version", "group__misc.html#gac6abfc0b2bd5b2f09281a4432bb2f5f0", null ],
+ [ "lws_get_parent", "group__misc.html#ga8930fe36a3f3eefe4a6a4fd499d8e899", null ],
+ [ "lws_get_random", "group__misc.html#ga58f906c6be0ca80efd813f694569dd4a", null ],
+ [ "lws_now_secs", "group__misc.html#ga33bf2635033710b25f931b57ed663e1e", null ],
+ [ "lws_parse_uri", "group__misc.html#ga1ec0d9faac5d3a5824d765c287c043aa", null ],
+ [ "lws_set_allocator", "group__misc.html#gab321ed812f46f6dc7ef9e3ca6f00cf1b", null ],
+ [ "lws_wsi_user", "group__misc.html#gaa194584fff9698f3b280658f770ccd0f", null ]
+];
\ No newline at end of file
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.11"/>
+<title>libwebsockets: Network related helper APIs</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="libwebsockets.org-logo.png"/></td>
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname">libwebsockets
+ </div>
+ <div id="projectbrief">Lightweight C library for HTML5 websockets</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.11 -->
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main Page</span></a></li>
+ <li><a href="pages.html"><span>Related Pages</span></a></li>
+ <li class="current"><a href="modules.html"><span>Modules</span></a></li>
+ <li><a href="annotated.html"><span>Data Structures</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('group__net.html','');});
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">Network related helper APIs</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:gad0df22db2be9fc65a667a1e83f9a92a4"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN const char *LWS_WARN_UNUSED_RESULT </td><td class="memItemRight" valign="bottom"><a class="el" href="group__net.html#gad0df22db2be9fc65a667a1e83f9a92a4">lws_canonical_hostname</a> (struct lws_context *context)</td></tr>
+<tr class="separator:gad0df22db2be9fc65a667a1e83f9a92a4"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga092e5f473b3347f03ffeef8a950080f3"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN void </td><td class="memItemRight" valign="bottom"><a class="el" href="group__net.html#ga092e5f473b3347f03ffeef8a950080f3">lws_get_peer_addresses</a> (struct lws *wsi, lws_sockfd_type fd, char *name, int name_len, char *rip, int rip_len)</td></tr>
+<tr class="separator:ga092e5f473b3347f03ffeef8a950080f3"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:gad01014fed09759741b6d23afccfdaacc"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN const char * </td><td class="memItemRight" valign="bottom"><a class="el" href="group__net.html#gad01014fed09759741b6d23afccfdaacc">lws_get_peer_simple</a> (struct lws *wsi, char *name, int namelen)</td></tr>
+<tr class="separator:gad01014fed09759741b6d23afccfdaacc"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga869d8bdffb0f2a7ce08e3ce10d6be3d8"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN int </td><td class="memItemRight" valign="bottom"><a class="el" href="group__net.html#ga869d8bdffb0f2a7ce08e3ce10d6be3d8">lws_interface_to_sa</a> (int ipv6, const char *ifname, struct sockaddr_in *addr, size_t addrlen)</td></tr>
+<tr class="separator:ga869d8bdffb0f2a7ce08e3ce10d6be3d8"><td class="memSeparator" colspan="2"> </td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<h2>Network related helper APIs</h2>
+<p>These wrap miscellaneous useful network-related functions </p>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="gad0df22db2be9fc65a667a1e83f9a92a4"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">LWS_VISIBLE LWS_EXTERN const char* LWS_WARN_UNUSED_RESULT lws_canonical_hostname </td>
+ <td>(</td>
+ <td class="paramtype">struct lws_context * </td>
+ <td class="paramname"><em>context</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h.html">lib/libwebsockets.h</a>></code></p>
+<p><a class="el" href="group__net.html#gad0df22db2be9fc65a667a1e83f9a92a4">lws_canonical_hostname()</a> - returns this host's hostname</p>
+<p>This is typically used by client code to fill in the host parameter when making a client connection. You can only call it after the context has been created.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">context</td><td>Websocket context </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a class="anchor" id="ga092e5f473b3347f03ffeef8a950080f3"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">LWS_VISIBLE LWS_EXTERN void lws_get_peer_addresses </td>
+ <td>(</td>
+ <td class="paramtype">struct lws * </td>
+ <td class="paramname"><em>wsi</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">lws_sockfd_type </td>
+ <td class="paramname"><em>fd</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">char * </td>
+ <td class="paramname"><em>name</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">int </td>
+ <td class="paramname"><em>name_len</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">char * </td>
+ <td class="paramname"><em>rip</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">int </td>
+ <td class="paramname"><em>rip_len</em> </td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h.html">lib/libwebsockets.h</a>></code></p>
+<p><a class="el" href="group__net.html#ga092e5f473b3347f03ffeef8a950080f3">lws_get_peer_addresses()</a> - Get client address information </p><dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">wsi</td><td>Local struct lws associated with </td></tr>
+ <tr><td class="paramname">fd</td><td>Connection socket descriptor </td></tr>
+ <tr><td class="paramname">name</td><td>Buffer to take client address name </td></tr>
+ <tr><td class="paramname">name_len</td><td>Length of client address name buffer </td></tr>
+ <tr><td class="paramname">rip</td><td>Buffer to take client address IP dotted quad </td></tr>
+ <tr><td class="paramname">rip_len</td><td>Length of client address IP buffer <pre class="fragment"> This function fills in name and rip with the name and IP of
+ the client connected with socket descriptor fd. Names may be
+ truncated if there is not enough room. If either cannot be
+ determined, they will be returned as valid zero-length strings.</pre> </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a class="anchor" id="gad01014fed09759741b6d23afccfdaacc"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">LWS_VISIBLE LWS_EXTERN const char* lws_get_peer_simple </td>
+ <td>(</td>
+ <td class="paramtype">struct lws * </td>
+ <td class="paramname"><em>wsi</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">char * </td>
+ <td class="paramname"><em>name</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">int </td>
+ <td class="paramname"><em>namelen</em> </td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h.html">lib/libwebsockets.h</a>></code></p>
+<p><a class="el" href="group__net.html#gad01014fed09759741b6d23afccfdaacc">lws_get_peer_simple()</a> - Get client address information without RDNS</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">wsi</td><td>Local struct lws associated with </td></tr>
+ <tr><td class="paramname">name</td><td>Buffer to take client address name </td></tr>
+ <tr><td class="paramname">namelen</td><td>Length of client address name buffer</td></tr>
+ </table>
+ </dd>
+</dl>
+<p>This provides a 123.123.123.123 type IP address in name from the peer that has connected to wsi </p>
+
+</div>
+</div>
+<a class="anchor" id="ga869d8bdffb0f2a7ce08e3ce10d6be3d8"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">LWS_VISIBLE LWS_EXTERN int lws_interface_to_sa </td>
+ <td>(</td>
+ <td class="paramtype">int </td>
+ <td class="paramname"><em>ipv6</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const char * </td>
+ <td class="paramname"><em>ifname</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">struct sockaddr_in * </td>
+ <td class="paramname"><em>addr</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">size_t </td>
+ <td class="paramname"><em>addrlen</em> </td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h.html">lib/libwebsockets.h</a>></code></p>
+<p><a class="el" href="group__net.html#ga869d8bdffb0f2a7ce08e3ce10d6be3d8">lws_interface_to_sa()</a> - Convert interface name or IP to sockaddr struct</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">ipv6</td><td>Allow IPV6 addresses </td></tr>
+ <tr><td class="paramname">ifname</td><td>Interface name or IP </td></tr>
+ <tr><td class="paramname">addr</td><td>struct sockaddr_in * to be written </td></tr>
+ <tr><td class="paramname">addrlen</td><td>Length of addr</td></tr>
+ </table>
+ </dd>
+</dl>
+<p>This converts a textual network interface name to a sockaddr usable by other network functions </p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">Generated by
+ <a href="http://www.doxygen.org/index.html">
+ <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.11 </li>
+ </ul>
+</div>
+</body>
+</html>
--- /dev/null
+var group__net =
+[
+ [ "lws_canonical_hostname", "group__net.html#gad0df22db2be9fc65a667a1e83f9a92a4", null ],
+ [ "lws_get_peer_addresses", "group__net.html#ga092e5f473b3347f03ffeef8a950080f3", null ],
+ [ "lws_get_peer_simple", "group__net.html#gad01014fed09759741b6d23afccfdaacc", null ],
+ [ "lws_interface_to_sa", "group__net.html#ga869d8bdffb0f2a7ce08e3ce10d6be3d8", null ]
+];
\ No newline at end of file
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.11"/>
+<title>libwebsockets: Sanitize / purify SQL and JSON helpers</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="libwebsockets.org-logo.png"/></td>
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname">libwebsockets
+ </div>
+ <div id="projectbrief">Lightweight C library for HTML5 websockets</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.11 -->
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main Page</span></a></li>
+ <li><a href="pages.html"><span>Related Pages</span></a></li>
+ <li class="current"><a href="modules.html"><span>Modules</span></a></li>
+ <li><a href="annotated.html"><span>Data Structures</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('group__pur.html','');});
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">Sanitize / purify SQL and JSON helpers</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ga9cc82f06e5ae7e71458626d7a39a5865"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN const char * </td><td class="memItemRight" valign="bottom"><a class="el" href="group__pur.html#ga9cc82f06e5ae7e71458626d7a39a5865">lws_sql_purify</a> (char *escaped, const char *string, int len)</td></tr>
+<tr class="separator:ga9cc82f06e5ae7e71458626d7a39a5865"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:gab15187efcfa256b7c928562c182b92a3"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN const char * </td><td class="memItemRight" valign="bottom"><a class="el" href="group__pur.html#gab15187efcfa256b7c928562c182b92a3">lws_json_purify</a> (char *escaped, const char *string, int len)</td></tr>
+<tr class="separator:gab15187efcfa256b7c928562c182b92a3"><td class="memSeparator" colspan="2"> </td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<h2>Sanitize / purify SQL and JSON helpers</h2>
+<p>APIs for escaping untrusted JSON and SQL safely before use </p>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="gab15187efcfa256b7c928562c182b92a3"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">LWS_VISIBLE LWS_EXTERN const char* lws_json_purify </td>
+ <td>(</td>
+ <td class="paramtype">char * </td>
+ <td class="paramname"><em>escaped</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const char * </td>
+ <td class="paramname"><em>string</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">int </td>
+ <td class="paramname"><em>len</em> </td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h.html">lib/libwebsockets.h</a>></code></p>
+<p><a class="el" href="group__pur.html#gab15187efcfa256b7c928562c182b92a3">lws_json_purify()</a> - like strncpy but with escaping for json chars</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">escaped</td><td>output buffer </td></tr>
+ <tr><td class="paramname">string</td><td>input buffer ('/0' terminated) </td></tr>
+ <tr><td class="paramname">len</td><td>output buffer max length</td></tr>
+ </table>
+ </dd>
+</dl>
+<p>Because escaping expands the output string, it's not possible to do it in-place, ie, with escaped == string </p>
+
+</div>
+</div>
+<a class="anchor" id="ga9cc82f06e5ae7e71458626d7a39a5865"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">LWS_VISIBLE LWS_EXTERN const char* lws_sql_purify </td>
+ <td>(</td>
+ <td class="paramtype">char * </td>
+ <td class="paramname"><em>escaped</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const char * </td>
+ <td class="paramname"><em>string</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">int </td>
+ <td class="paramname"><em>len</em> </td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h.html">lib/libwebsockets.h</a>></code></p>
+<p><a class="el" href="group__pur.html#ga9cc82f06e5ae7e71458626d7a39a5865">lws_sql_purify()</a> - like strncpy but with escaping for sql quotes</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">escaped</td><td>output buffer </td></tr>
+ <tr><td class="paramname">string</td><td>input buffer ('/0' terminated) </td></tr>
+ <tr><td class="paramname">len</td><td>output buffer max length</td></tr>
+ </table>
+ </dd>
+</dl>
+<p>Because escaping expands the output string, it's not possible to do it in-place, ie, with escaped == string </p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">Generated by
+ <a href="http://www.doxygen.org/index.html">
+ <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.11 </li>
+ </ul>
+</div>
+</body>
+</html>
--- /dev/null
+var group__pur =
+[
+ [ "lws_json_purify", "group__pur.html#gab15187efcfa256b7c928562c182b92a3", null ],
+ [ "lws_sql_purify", "group__pur.html#ga9cc82f06e5ae7e71458626d7a39a5865", null ]
+];
\ No newline at end of file
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.11"/>
+<title>libwebsockets: Sending data</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="libwebsockets.org-logo.png"/></td>
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname">libwebsockets
+ </div>
+ <div id="projectbrief">Lightweight C library for HTML5 websockets</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.11 -->
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main Page</span></a></li>
+ <li><a href="pages.html"><span>Related Pages</span></a></li>
+ <li class="current"><a href="modules.html"><span>Modules</span></a></li>
+ <li><a href="annotated.html"><span>Data Structures</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('group__sending-data.html','');});
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#enum-members">Enumerations</a> |
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">Sending data</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="enum-members"></a>
+Enumerations</h2></td></tr>
+<tr class="memitem:ga98b099cf8c1c7e38ad78501f270e193d"><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="group__sending-data.html#ga98b099cf8c1c7e38ad78501f270e193d">lws_write_protocol</a> { <br />
+  <a class="el" href="group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193da80e8f169fda236c56bfb795ed62903db">LWS_WRITE_TEXT</a> = 0,
+<a class="el" href="group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193daf6486c0dba50c44198100717721d9ab2">LWS_WRITE_BINARY</a> = 1,
+<a class="el" href="group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193da10047eb05b5e1c298151dc47a5b44826">LWS_WRITE_CONTINUATION</a> = 2,
+<a class="el" href="group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193dabb6705e1d1327cdda5025be28f07712e">LWS_WRITE_HTTP</a> = 3,
+<br />
+  <b>LWS_WRITE_PING</b> = 5,
+<b>LWS_WRITE_PONG</b> = 6,
+<b>LWS_WRITE_HTTP_FINAL</b> = 7,
+<a class="el" href="group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193dafe5a38e940ce56708ac814627e9c0917">LWS_WRITE_HTTP_HEADERS</a> = 8,
+<br />
+  <a class="el" href="group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193da115440f272a5d55518adfc8099acfee3">LWS_WRITE_NO_FIN</a> = 0x40,
+<a class="el" href="group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193da220d8e8652d9b97fb66e476e2a60ffce">LWS_WRITE_CLIENT_IGNORE_XOR_MASK</a> = 0x80
+<br />
+ }</td></tr>
+<tr class="separator:ga98b099cf8c1c7e38ad78501f270e193d"><td class="memSeparator" colspan="2"> </td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:gafd5fdd285a0e25ba7e3e1051deec1001"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN int </td><td class="memItemRight" valign="bottom"><a class="el" href="group__sending-data.html#gafd5fdd285a0e25ba7e3e1051deec1001">lws_write</a> (struct lws *wsi, unsigned char *buf, size_t len, enum <a class="el" href="group__sending-data.html#ga98b099cf8c1c7e38ad78501f270e193d">lws_write_protocol</a> protocol)</td></tr>
+<tr class="separator:gafd5fdd285a0e25ba7e3e1051deec1001"><td class="memSeparator" colspan="2"> </td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<p>APIs related to writing data on a connection </p>
+<h2 class="groupheader">Enumeration Type Documentation</h2>
+<a class="anchor" id="ga98b099cf8c1c7e38ad78501f270e193d"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">enum <a class="el" href="group__sending-data.html#ga98b099cf8c1c7e38ad78501f270e193d">lws_write_protocol</a></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h.html">lib/libwebsockets.h</a>></code></p>
+<table class="fieldtable">
+<tr><th colspan="2">Enumerator</th></tr><tr><td class="fieldname"><a class="anchor" id="gga98b099cf8c1c7e38ad78501f270e193da80e8f169fda236c56bfb795ed62903db"></a>LWS_WRITE_TEXT </td><td class="fielddoc">
+<p>Send a ws TEXT message,the pointer must have LWS_PRE valid memory behind it. The receiver expects only valid utf-8 in the payload </p>
+</td></tr>
+<tr><td class="fieldname"><a class="anchor" id="gga98b099cf8c1c7e38ad78501f270e193daf6486c0dba50c44198100717721d9ab2"></a>LWS_WRITE_BINARY </td><td class="fielddoc">
+<p>Send a ws BINARY message, the pointer must have LWS_PRE valid memory behind it. Any sequence of bytes is valid </p>
+</td></tr>
+<tr><td class="fieldname"><a class="anchor" id="gga98b099cf8c1c7e38ad78501f270e193da10047eb05b5e1c298151dc47a5b44826"></a>LWS_WRITE_CONTINUATION </td><td class="fielddoc">
+<p>Continue a previous ws message, the pointer must have LWS_PRE valid memory behind it </p>
+</td></tr>
+<tr><td class="fieldname"><a class="anchor" id="gga98b099cf8c1c7e38ad78501f270e193dabb6705e1d1327cdda5025be28f07712e"></a>LWS_WRITE_HTTP </td><td class="fielddoc">
+<p>Send HTTP content </p>
+</td></tr>
+<tr><td class="fieldname"><a class="anchor" id="gga98b099cf8c1c7e38ad78501f270e193dafe5a38e940ce56708ac814627e9c0917"></a>LWS_WRITE_HTTP_HEADERS </td><td class="fielddoc">
+<p>Send http headers (http2 encodes this payload and LWS_WRITE_HTTP payload differently, http 1.x links also handle this correctly. so to be compatible with both in the future,header response part should be sent using this regardless of http version expected) </p>
+</td></tr>
+<tr><td class="fieldname"><a class="anchor" id="gga98b099cf8c1c7e38ad78501f270e193da115440f272a5d55518adfc8099acfee3"></a>LWS_WRITE_NO_FIN </td><td class="fielddoc">
+<p>This part of the message is not the end of the message </p>
+</td></tr>
+<tr><td class="fieldname"><a class="anchor" id="gga98b099cf8c1c7e38ad78501f270e193da220d8e8652d9b97fb66e476e2a60ffce"></a>LWS_WRITE_CLIENT_IGNORE_XOR_MASK </td><td class="fielddoc">
+<p>client packet payload goes out on wire unmunged only useful for security tests since normal servers cannot decode the content if used </p>
+</td></tr>
+</table>
+<div class="fragment"><div class="line"><a name="l02893"></a><span class="lineno"> 2893</span>  {</div><div class="line"><a name="l02894"></a><span class="lineno"> 2894</span>  <a class="code" href="group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193da80e8f169fda236c56bfb795ed62903db">LWS_WRITE_TEXT</a> = 0,</div><div class="line"><a name="l02898"></a><span class="lineno"> 2898</span>  <a class="code" href="group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193daf6486c0dba50c44198100717721d9ab2">LWS_WRITE_BINARY</a> = 1,</div><div class="line"><a name="l02901"></a><span class="lineno"> 2901</span>  <a class="code" href="group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193da10047eb05b5e1c298151dc47a5b44826">LWS_WRITE_CONTINUATION</a> = 2,</div><div class="line"><a name="l02904"></a><span class="lineno"> 2904</span>  <a class="code" href="group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193dabb6705e1d1327cdda5025be28f07712e">LWS_WRITE_HTTP</a> = 3,</div><div class="line"><a name="l02907"></a><span class="lineno"> 2907</span>  <span class="comment">/* LWS_WRITE_CLOSE is handled by lws_close_reason() */</span></div><div class="line"><a name="l02908"></a><span class="lineno"> 2908</span>  LWS_WRITE_PING = 5,</div><div class="line"><a name="l02909"></a><span class="lineno"> 2909</span>  LWS_WRITE_PONG = 6,</div><div class="line"><a name="l02910"></a><span class="lineno"> 2910</span> </div><div class="line"><a name="l02911"></a><span class="lineno"> 2911</span>  <span class="comment">/* Same as write_http but we know this write ends the transaction */</span></div><div class="line"><a name="l02912"></a><span class="lineno"> 2912</span>  LWS_WRITE_HTTP_FINAL = 7,</div><div class="line"><a name="l02913"></a><span class="lineno"> 2913</span> </div><div class="line"><a name="l02914"></a><span class="lineno"> 2914</span>  <span class="comment">/* HTTP2 */</span></div><div class="line"><a name="l02915"></a><span class="lineno"> 2915</span> </div><div class="line"><a name="l02916"></a><span class="lineno"> 2916</span>  <a class="code" href="group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193dafe5a38e940ce56708ac814627e9c0917">LWS_WRITE_HTTP_HEADERS</a> = 8,</div><div class="line"><a name="l02923"></a><span class="lineno"> 2923</span>  <span class="comment">/****** add new things just above ---^ ******/</span></div><div class="line"><a name="l02924"></a><span class="lineno"> 2924</span> </div><div class="line"><a name="l02925"></a><span class="lineno"> 2925</span>  <span class="comment">/* flags */</span></div><div class="line"><a name="l02926"></a><span class="lineno"> 2926</span> </div><div class="line"><a name="l02927"></a><span class="lineno"> 2927</span>  <a class="code" href="group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193da115440f272a5d55518adfc8099acfee3">LWS_WRITE_NO_FIN</a> = 0x40,</div><div class="line"><a name="l02930"></a><span class="lineno"> 2930</span>  <a class="code" href="group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193da220d8e8652d9b97fb66e476e2a60ffce">LWS_WRITE_CLIENT_IGNORE_XOR_MASK</a> = 0x80</div><div class="line"><a name="l02934"></a><span class="lineno"> 2934</span> };</div><div class="ttc" id="group__sending-data_html_gga98b099cf8c1c7e38ad78501f270e193dabb6705e1d1327cdda5025be28f07712e"><div class="ttname"><a href="group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193dabb6705e1d1327cdda5025be28f07712e">LWS_WRITE_HTTP</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:2904</div></div>
+<div class="ttc" id="group__sending-data_html_gga98b099cf8c1c7e38ad78501f270e193da115440f272a5d55518adfc8099acfee3"><div class="ttname"><a href="group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193da115440f272a5d55518adfc8099acfee3">LWS_WRITE_NO_FIN</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:2927</div></div>
+<div class="ttc" id="group__sending-data_html_gga98b099cf8c1c7e38ad78501f270e193da80e8f169fda236c56bfb795ed62903db"><div class="ttname"><a href="group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193da80e8f169fda236c56bfb795ed62903db">LWS_WRITE_TEXT</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:2894</div></div>
+<div class="ttc" id="group__sending-data_html_gga98b099cf8c1c7e38ad78501f270e193daf6486c0dba50c44198100717721d9ab2"><div class="ttname"><a href="group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193daf6486c0dba50c44198100717721d9ab2">LWS_WRITE_BINARY</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:2898</div></div>
+<div class="ttc" id="group__sending-data_html_gga98b099cf8c1c7e38ad78501f270e193da220d8e8652d9b97fb66e476e2a60ffce"><div class="ttname"><a href="group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193da220d8e8652d9b97fb66e476e2a60ffce">LWS_WRITE_CLIENT_IGNORE_XOR_MASK</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:2930</div></div>
+<div class="ttc" id="group__sending-data_html_gga98b099cf8c1c7e38ad78501f270e193da10047eb05b5e1c298151dc47a5b44826"><div class="ttname"><a href="group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193da10047eb05b5e1c298151dc47a5b44826">LWS_WRITE_CONTINUATION</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:2901</div></div>
+<div class="ttc" id="group__sending-data_html_gga98b099cf8c1c7e38ad78501f270e193dafe5a38e940ce56708ac814627e9c0917"><div class="ttname"><a href="group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193dafe5a38e940ce56708ac814627e9c0917">LWS_WRITE_HTTP_HEADERS</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:2916</div></div>
+</div><!-- fragment -->
+</div>
+</div>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="gafd5fdd285a0e25ba7e3e1051deec1001"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">LWS_VISIBLE LWS_EXTERN int lws_write </td>
+ <td>(</td>
+ <td class="paramtype">struct lws * </td>
+ <td class="paramname"><em>wsi</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">unsigned char * </td>
+ <td class="paramname"><em>buf</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">size_t </td>
+ <td class="paramname"><em>len</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">enum <a class="el" href="group__sending-data.html#ga98b099cf8c1c7e38ad78501f270e193d">lws_write_protocol</a> </td>
+ <td class="paramname"><em>protocol</em> </td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h.html">lib/libwebsockets.h</a>></code></p>
+<p><a class="el" href="group__sending-data.html#gafd5fdd285a0e25ba7e3e1051deec1001">lws_write()</a> - Apply protocol then write data to client </p><dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">wsi</td><td>Websocket instance (available from user callback) </td></tr>
+ <tr><td class="paramname">buf</td><td>The data to send. For data being sent on a websocket connection (ie, not default http), this buffer MUST have LWS_PRE bytes valid BEFORE the pointer. This is so the protocol header data can be added in-situ. </td></tr>
+ <tr><td class="paramname">len</td><td>Count of the data bytes in the payload starting from buf </td></tr>
+ <tr><td class="paramname">protocol</td><td>Use LWS_WRITE_HTTP to reply to an http connection, and one of LWS_WRITE_BINARY or LWS_WRITE_TEXT to send appropriate data on a websockets connection. Remember to allow the extra bytes before and after buf if LWS_WRITE_BINARY or LWS_WRITE_TEXT are used.</td></tr>
+ </table>
+ </dd>
+</dl>
+<p>This function provides the way to issue data back to the client for both http and websocket protocols.</p>
+<p>IMPORTANT NOTICE!</p>
+<p>When sending with websocket protocol</p>
+<p>LWS_WRITE_TEXT, LWS_WRITE_BINARY, LWS_WRITE_CONTINUATION, LWS_WRITE_PING, LWS_WRITE_PONG</p>
+<p>the send buffer has to have LWS_PRE bytes valid BEFORE the buffer pointer you pass to <a class="el" href="group__sending-data.html#gafd5fdd285a0e25ba7e3e1051deec1001">lws_write()</a>.</p>
+<p>This allows us to add protocol info before and after the data, and send as one packet on the network without payload copying, for maximum efficiency.</p>
+<p>So for example you need this kind of code to use lws_write with a 128-byte payload</p>
+<p>char buf[LWS_PRE + 128];</p>
+<p>// fill your part of the buffer... for example here it's all zeros memset(&buf[LWS_PRE], 0, 128);</p>
+<p>lws_write(wsi, &buf[LWS_PRE], 128, LWS_WRITE_TEXT);</p>
+<p>When sending HTTP, with</p>
+<p>LWS_WRITE_HTTP, LWS_WRITE_HTTP_HEADERS LWS_WRITE_HTTP_FINAL</p>
+<p>there is no protocol data prepended, and don't need to take care about the LWS_PRE bytes valid before the buffer pointer.</p>
+<p>LWS_PRE is at least the frame nonce + 2 header + 8 length LWS_SEND_BUFFER_POST_PADDING is deprecated, it's now 0 and can be left off. The example apps no longer use it.</p>
+<p>Pad LWS_PRE to the CPU word size, so that word references to the address immediately after the padding won't cause an unaligned access error. Sometimes for performance reasons the recommended padding is even larger than sizeof(void *). </p><pre class="fragment"> In the case of sending using websocket protocol, be sure to allocate
+ valid storage before and after buf as explained above. This scheme
+ allows maximum efficiency of sending data and protocol in a single
+ packet while not burdening the user code with any protocol knowledge.
+
+ Return may be -1 for a fatal error needing connection close, or a
+ positive number reflecting the amount of bytes actually sent. This
+ can be less than the requested number of bytes due to OS memory
+ pressure at any given time.</pre>
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">Generated by
+ <a href="http://www.doxygen.org/index.html">
+ <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.11 </li>
+ </ul>
+</div>
+</body>
+</html>
--- /dev/null
+var group__sending_data =
+[
+ [ "lws_write_protocol", "group__sending-data.html#ga98b099cf8c1c7e38ad78501f270e193d", [
+ [ "LWS_WRITE_TEXT", "group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193da80e8f169fda236c56bfb795ed62903db", null ],
+ [ "LWS_WRITE_BINARY", "group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193daf6486c0dba50c44198100717721d9ab2", null ],
+ [ "LWS_WRITE_CONTINUATION", "group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193da10047eb05b5e1c298151dc47a5b44826", null ],
+ [ "LWS_WRITE_HTTP", "group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193dabb6705e1d1327cdda5025be28f07712e", null ],
+ [ "LWS_WRITE_HTTP_HEADERS", "group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193dafe5a38e940ce56708ac814627e9c0917", null ],
+ [ "LWS_WRITE_NO_FIN", "group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193da115440f272a5d55518adfc8099acfee3", null ],
+ [ "LWS_WRITE_CLIENT_IGNORE_XOR_MASK", "group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193da220d8e8652d9b97fb66e476e2a60ffce", null ]
+ ] ],
+ [ "lws_write", "group__sending-data.html#gafd5fdd285a0e25ba7e3e1051deec1001", null ]
+];
\ No newline at end of file
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.11"/>
+<title>libwebsockets: Built-in service loop entry</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="libwebsockets.org-logo.png"/></td>
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname">libwebsockets
+ </div>
+ <div id="projectbrief">Lightweight C library for HTML5 websockets</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.11 -->
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main Page</span></a></li>
+ <li><a href="pages.html"><span>Related Pages</span></a></li>
+ <li class="current"><a href="modules.html"><span>Modules</span></a></li>
+ <li><a href="annotated.html"><span>Data Structures</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('group__service.html','');});
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">Built-in service loop entry</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:gaf95bd0c663d6516a0c80047d9b1167a8"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN int </td><td class="memItemRight" valign="bottom"><a class="el" href="group__service.html#gaf95bd0c663d6516a0c80047d9b1167a8">lws_service</a> (struct lws_context *context, int timeout_ms)</td></tr>
+<tr class="separator:gaf95bd0c663d6516a0c80047d9b1167a8"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga9b3cc4473fd8848e5bbee7f310712939"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN int </td><td class="memItemRight" valign="bottom"><a class="el" href="group__service.html#ga9b3cc4473fd8848e5bbee7f310712939">lws_service_tsi</a> (struct lws_context *context, int timeout_ms, int tsi)</td></tr>
+<tr class="separator:ga9b3cc4473fd8848e5bbee7f310712939"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga29c246707997ab7a466aa709aecd2d7b"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN void </td><td class="memItemRight" valign="bottom"><a class="el" href="group__service.html#ga29c246707997ab7a466aa709aecd2d7b">lws_cancel_service_pt</a> (struct lws *wsi)</td></tr>
+<tr class="separator:ga29c246707997ab7a466aa709aecd2d7b"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga53e3d0801dfda7960a7249dd559e68a2"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN void </td><td class="memItemRight" valign="bottom"><a class="el" href="group__service.html#ga53e3d0801dfda7960a7249dd559e68a2">lws_cancel_service</a> (struct lws_context *context)</td></tr>
+<tr class="separator:ga53e3d0801dfda7960a7249dd559e68a2"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:gad82efa5466d14a9f05aa06416375b28d"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN int </td><td class="memItemRight" valign="bottom"><a class="el" href="group__service.html#gad82efa5466d14a9f05aa06416375b28d">lws_service_fd</a> (struct lws_context *context, struct <a class="el" href="structlws__pollfd.html">lws_pollfd</a> *<a class="el" href="structpollfd.html">pollfd</a>)</td></tr>
+<tr class="separator:gad82efa5466d14a9f05aa06416375b28d"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:gaebf426eda371ba23642fc11d8e0ace6b"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN int </td><td class="memItemRight" valign="bottom"><a class="el" href="group__service.html#gaebf426eda371ba23642fc11d8e0ace6b">lws_service_fd_tsi</a> (struct lws_context *context, struct <a class="el" href="structlws__pollfd.html">lws_pollfd</a> *<a class="el" href="structpollfd.html">pollfd</a>, int tsi)</td></tr>
+<tr class="separator:gaebf426eda371ba23642fc11d8e0ace6b"><td class="memSeparator" colspan="2"> </td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<h2>Built-in service loop entry</h2>
+<p>If you're not using libev / libuv, these apis are needed to enter the poll() wait in lws and service any connections with pending events. </p>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="ga53e3d0801dfda7960a7249dd559e68a2"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">LWS_VISIBLE LWS_EXTERN void lws_cancel_service </td>
+ <td>(</td>
+ <td class="paramtype">struct lws_context * </td>
+ <td class="paramname"><em>context</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h.html">lib/libwebsockets.h</a>></code></p>
+<p><a class="el" href="group__service.html#ga53e3d0801dfda7960a7249dd559e68a2">lws_cancel_service()</a> - Cancel wait for new pending socket activity </p><dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">context</td><td>Websocket context <pre class="fragment"> This function let a call to lws_service() waiting for a timeout
+ immediately return.
+
+ What it basically does is provide a fake event that will be swallowed,
+ so the wait in poll() is ended. That's useful because poll() doesn't
+ attend to changes in POLLIN/OUT/ERR until it re-enters the wait.</pre> </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a class="anchor" id="ga29c246707997ab7a466aa709aecd2d7b"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">LWS_VISIBLE LWS_EXTERN void lws_cancel_service_pt </td>
+ <td>(</td>
+ <td class="paramtype">struct lws * </td>
+ <td class="paramname"><em>wsi</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h.html">lib/libwebsockets.h</a>></code></p>
+<p><a class="el" href="group__service.html#ga29c246707997ab7a466aa709aecd2d7b">lws_cancel_service_pt()</a> - Cancel servicing of pending socket activity on one thread </p><dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">wsi</td><td>Cancel service on the thread this wsi is serviced by <pre class="fragment"> This function lets a call to lws_service() waiting for a timeout
+ immediately return.
+
+ It works by creating a phony event and then swallowing it silently.
+
+ The reason it may be needed is when waiting in poll(), changes to
+ the event masks are ignored by the OS until poll() is reentered. This
+ lets you halt the poll() wait and make the reentry happen immediately
+ instead of having the wait out the rest of the poll timeout.</pre> </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a class="anchor" id="gaf95bd0c663d6516a0c80047d9b1167a8"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">LWS_VISIBLE LWS_EXTERN int lws_service </td>
+ <td>(</td>
+ <td class="paramtype">struct lws_context * </td>
+ <td class="paramname"><em>context</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">int </td>
+ <td class="paramname"><em>timeout_ms</em> </td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h.html">lib/libwebsockets.h</a>></code></p>
+<p><a class="el" href="group__service.html#gaf95bd0c663d6516a0c80047d9b1167a8">lws_service()</a> - Service any pending websocket activity </p><dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">context</td><td>Websocket context </td></tr>
+ <tr><td class="paramname">timeout_ms</td><td>Timeout for poll; 0 means return immediately if nothing needed service otherwise block and service immediately, returning after the timeout if nothing needed service.</td></tr>
+ </table>
+ </dd>
+</dl>
+<p>This function deals with any pending websocket traffic, for three kinds of event. It handles these events on both server and client types of connection the same.</p>
+<p>1) Accept new connections to our context's server</p>
+<p>2) Call the receive callback for incoming frame data received by server or client connections.</p>
+<p>You need to call this service function periodically to all the above functions to happen; if your application is single-threaded you can just call it in your main event loop.</p>
+<p>Alternatively you can fork a new process that asynchronously handles calling this service in a loop. In that case you are happy if this call blocks your thread until it needs to take care of something and would call it with a large nonzero timeout. Your loop then takes no CPU while there is nothing happening.</p>
+<p>If you are calling it in a single-threaded app, you don't want it to wait around blocking other things in your loop from happening, so you would call it with a timeout_ms of 0, so it returns immediately if nothing is pending, or as soon as it services whatever was pending. </p>
+
+</div>
+</div>
+<a class="anchor" id="gad82efa5466d14a9f05aa06416375b28d"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">LWS_VISIBLE LWS_EXTERN int lws_service_fd </td>
+ <td>(</td>
+ <td class="paramtype">struct lws_context * </td>
+ <td class="paramname"><em>context</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">struct <a class="el" href="structlws__pollfd.html">lws_pollfd</a> * </td>
+ <td class="paramname"><em>pollfd</em> </td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h.html">lib/libwebsockets.h</a>></code></p>
+<p><a class="el" href="group__service.html#gad82efa5466d14a9f05aa06416375b28d">lws_service_fd()</a> - Service polled socket with something waiting </p><dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">context</td><td>Websocket context </td></tr>
+ <tr><td class="paramname">pollfd</td><td>The pollfd entry describing the socket fd and which events happened.</td></tr>
+ </table>
+ </dd>
+</dl>
+<p>This function takes a pollfd that has POLLIN or POLLOUT activity and services it according to the state of the associated struct lws.</p>
+<p>The one call deals with all "service" that might happen on a socket including listen accepts, http files as well as websocket protocol.</p>
+<p>If a pollfd says it has something, you can just pass it to <a class="el" href="group__service.html#gad82efa5466d14a9f05aa06416375b28d">lws_service_fd()</a> whether it is a socket handled by lws or not. If it sees it is a lws socket, the traffic will be handled and pollfd->revents will be zeroed now.</p>
+<p>If the socket is foreign to lws, it leaves revents alone. So you can see if you should service yourself by checking the pollfd revents after letting lws try to service it. </p>
+
+</div>
+</div>
+<a class="anchor" id="gaebf426eda371ba23642fc11d8e0ace6b"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">LWS_VISIBLE LWS_EXTERN int lws_service_fd_tsi </td>
+ <td>(</td>
+ <td class="paramtype">struct lws_context * </td>
+ <td class="paramname"><em>context</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">struct <a class="el" href="structlws__pollfd.html">lws_pollfd</a> * </td>
+ <td class="paramname"><em>pollfd</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">int </td>
+ <td class="paramname"><em>tsi</em> </td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h.html">lib/libwebsockets.h</a>></code></p>
+<p><a class="el" href="group__service.html#gaebf426eda371ba23642fc11d8e0ace6b">lws_service_fd_tsi()</a> - Service polled socket in specific service thread </p><dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">context</td><td>Websocket context </td></tr>
+ <tr><td class="paramname">pollfd</td><td>The pollfd entry describing the socket fd and which events happened. </td></tr>
+ <tr><td class="paramname">tsi</td><td>thread service index</td></tr>
+ </table>
+ </dd>
+</dl>
+<p>Same as <a class="el" href="group__service.html#gad82efa5466d14a9f05aa06416375b28d">lws_service_fd()</a> but used with multiple service threads </p>
+
+</div>
+</div>
+<a class="anchor" id="ga9b3cc4473fd8848e5bbee7f310712939"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">LWS_VISIBLE LWS_EXTERN int lws_service_tsi </td>
+ <td>(</td>
+ <td class="paramtype">struct lws_context * </td>
+ <td class="paramname"><em>context</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">int </td>
+ <td class="paramname"><em>timeout_ms</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">int </td>
+ <td class="paramname"><em>tsi</em> </td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h.html">lib/libwebsockets.h</a>></code></p>
+<p><a class="el" href="group__service.html#gaf95bd0c663d6516a0c80047d9b1167a8">lws_service()</a> - Service any pending websocket activity</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">context</td><td>Websocket context </td></tr>
+ <tr><td class="paramname">timeout_ms</td><td>Timeout for poll; 0 means return immediately if nothing needed service otherwise block and service immediately, returning after the timeout if nothing needed service.</td></tr>
+ </table>
+ </dd>
+</dl>
+<p>Same as <a class="el" href="group__service.html#gaf95bd0c663d6516a0c80047d9b1167a8">lws_service()</a>, but for a specific thread service index. Only needed if you are spawning multiple service threads. </p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">Generated by
+ <a href="http://www.doxygen.org/index.html">
+ <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.11 </li>
+ </ul>
+</div>
+</body>
+</html>
--- /dev/null
+var group__service =
+[
+ [ "lws_cancel_service", "group__service.html#ga53e3d0801dfda7960a7249dd559e68a2", null ],
+ [ "lws_cancel_service_pt", "group__service.html#ga29c246707997ab7a466aa709aecd2d7b", null ],
+ [ "lws_service", "group__service.html#gaf95bd0c663d6516a0c80047d9b1167a8", null ],
+ [ "lws_service_fd", "group__service.html#gad82efa5466d14a9f05aa06416375b28d", null ],
+ [ "lws_service_fd_tsi", "group__service.html#gaebf426eda371ba23642fc11d8e0ace6b", null ],
+ [ "lws_service_tsi", "group__service.html#ga9b3cc4473fd8848e5bbee7f310712939", null ]
+];
\ No newline at end of file
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.11"/>
+<title>libwebsockets: SHA and B64 helpers</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="libwebsockets.org-logo.png"/></td>
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname">libwebsockets
+ </div>
+ <div id="projectbrief">Lightweight C library for HTML5 websockets</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.11 -->
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main Page</span></a></li>
+ <li><a href="pages.html"><span>Related Pages</span></a></li>
+ <li class="current"><a href="modules.html"><span>Modules</span></a></li>
+ <li><a href="annotated.html"><span>Data Structures</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('group__sha.html','');});
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">SHA and B64 helpers</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ga7b09ab74646266f0b555103b3bb8dfe5"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN unsigned char * </td><td class="memItemRight" valign="bottom"><a class="el" href="group__sha.html#ga7b09ab74646266f0b555103b3bb8dfe5">lws_SHA1</a> (const unsigned char *d, size_t n, unsigned char *md)</td></tr>
+<tr class="separator:ga7b09ab74646266f0b555103b3bb8dfe5"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:gaf39765e4a3b413efb65e4698b2ec3575"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN int </td><td class="memItemRight" valign="bottom"><a class="el" href="group__sha.html#gaf39765e4a3b413efb65e4698b2ec3575">lws_b64_encode_string</a> (const char *in, int in_len, char *out, int out_size)</td></tr>
+<tr class="separator:gaf39765e4a3b413efb65e4698b2ec3575"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga66316e6a5a0644a09d5a10e919dfdd8d"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN int </td><td class="memItemRight" valign="bottom"><a class="el" href="group__sha.html#ga66316e6a5a0644a09d5a10e919dfdd8d">lws_b64_decode_string</a> (const char *in, char *out, int out_size)</td></tr>
+<tr class="separator:ga66316e6a5a0644a09d5a10e919dfdd8d"><td class="memSeparator" colspan="2"> </td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<h2>SHA and B64 helpers</h2>
+<p>These provide SHA-1 and B64 helper apis </p>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="ga66316e6a5a0644a09d5a10e919dfdd8d"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">LWS_VISIBLE LWS_EXTERN int lws_b64_decode_string </td>
+ <td>(</td>
+ <td class="paramtype">const char * </td>
+ <td class="paramname"><em>in</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">char * </td>
+ <td class="paramname"><em>out</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">int </td>
+ <td class="paramname"><em>out_size</em> </td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h.html">lib/libwebsockets.h</a>></code></p>
+<p><a class="el" href="group__sha.html#ga66316e6a5a0644a09d5a10e919dfdd8d">lws_b64_decode_string()</a>: decode a string from base 64</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">in</td><td>incoming buffer </td></tr>
+ <tr><td class="paramname">out</td><td>result buffer </td></tr>
+ <tr><td class="paramname">out_size</td><td>length of result buffer</td></tr>
+ </table>
+ </dd>
+</dl>
+<p>Decodes a string using b64 </p>
+
+</div>
+</div>
+<a class="anchor" id="gaf39765e4a3b413efb65e4698b2ec3575"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">LWS_VISIBLE LWS_EXTERN int lws_b64_encode_string </td>
+ <td>(</td>
+ <td class="paramtype">const char * </td>
+ <td class="paramname"><em>in</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">int </td>
+ <td class="paramname"><em>in_len</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">char * </td>
+ <td class="paramname"><em>out</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">int </td>
+ <td class="paramname"><em>out_size</em> </td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h.html">lib/libwebsockets.h</a>></code></p>
+<p><a class="el" href="group__sha.html#gaf39765e4a3b413efb65e4698b2ec3575">lws_b64_encode_string()</a>: encode a string into base 64</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">in</td><td>incoming buffer </td></tr>
+ <tr><td class="paramname">in_len</td><td>length of incoming buffer </td></tr>
+ <tr><td class="paramname">out</td><td>result buffer </td></tr>
+ <tr><td class="paramname">out_size</td><td>length of result buffer</td></tr>
+ </table>
+ </dd>
+</dl>
+<p>Encodes a string using b64 </p>
+
+</div>
+</div>
+<a class="anchor" id="ga7b09ab74646266f0b555103b3bb8dfe5"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">LWS_VISIBLE LWS_EXTERN unsigned char* lws_SHA1 </td>
+ <td>(</td>
+ <td class="paramtype">const unsigned char * </td>
+ <td class="paramname"><em>d</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">size_t </td>
+ <td class="paramname"><em>n</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">unsigned char * </td>
+ <td class="paramname"><em>md</em> </td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h.html">lib/libwebsockets.h</a>></code></p>
+<p><a class="el" href="group__sha.html#ga7b09ab74646266f0b555103b3bb8dfe5">lws_SHA1()</a>: make a SHA-1 digest of a buffer</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">d</td><td>incoming buffer </td></tr>
+ <tr><td class="paramname">n</td><td>length of incoming buffer </td></tr>
+ <tr><td class="paramname">md</td><td>buffer for message digest (must be >= 20 bytes)</td></tr>
+ </table>
+ </dd>
+</dl>
+<p>Reduces any size buffer into a 20-byte SHA-1 hash. </p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">Generated by
+ <a href="http://www.doxygen.org/index.html">
+ <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.11 </li>
+ </ul>
+</div>
+</body>
+</html>
--- /dev/null
+var group__sha =
+[
+ [ "lws_b64_decode_string", "group__sha.html#ga66316e6a5a0644a09d5a10e919dfdd8d", null ],
+ [ "lws_b64_encode_string", "group__sha.html#gaf39765e4a3b413efb65e4698b2ec3575", null ],
+ [ "lws_SHA1", "group__sha.html#ga7b09ab74646266f0b555103b3bb8dfe5", null ]
+];
\ No newline at end of file
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.11"/>
+<title>libwebsockets: Smtp</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="libwebsockets.org-logo.png"/></td>
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname">libwebsockets
+ </div>
+ <div id="projectbrief">Lightweight C library for HTML5 websockets</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.11 -->
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main Page</span></a></li>
+ <li><a href="pages.html"><span>Related Pages</span></a></li>
+ <li class="current"><a href="modules.html"><span>Modules</span></a></li>
+ <li><a href="annotated.html"><span>Data Structures</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('group__smtp.html','');});
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#nested-classes">Data Structures</a> |
+<a href="#enum-members">Enumerations</a> |
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">Smtp</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
+Data Structures</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__email.html">lws_email</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="enum-members"></a>
+Enumerations</h2></td></tr>
+<tr class="memitem:ga116be79bf44f9dc2a97f46e051fe4dc0"><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="group__smtp.html#ga116be79bf44f9dc2a97f46e051fe4dc0">lwsgs_smtp_states</a> { <br />
+  <a class="el" href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a29e5b0ecf75375b5a643faa3d6222b7c">LGSSMTP_IDLE</a>,
+<a class="el" href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0ab89442b7a3ca2b94c3cdcf33756eb933">LGSSMTP_CONNECTING</a>,
+<a class="el" href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0ab61778f70ecac007b334bb14942eb41d">LGSSMTP_CONNECTED</a>,
+<a class="el" href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a1dfec948a864205cec875f63cbe0d4ad">LGSSMTP_SENT_HELO</a>,
+<br />
+  <a class="el" href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a929bb4623ff3f585108aba2a1b047fab">LGSSMTP_SENT_FROM</a>,
+<a class="el" href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0aae20a0cb95b97a70f6b45d0ed2d5be83">LGSSMTP_SENT_TO</a>,
+<a class="el" href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a85e3c452950c09a79086bff4b9be5c14">LGSSMTP_SENT_DATA</a>,
+<a class="el" href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a38fba41f28d754e38079b31418a86a69">LGSSMTP_SENT_BODY</a>,
+<br />
+  <a class="el" href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a2c2ed16ffc572326e3040684084b21d5">LGSSMTP_SENT_QUIT</a>
+<br />
+ }</td></tr>
+<tr class="separator:ga116be79bf44f9dc2a97f46e051fe4dc0"><td class="memSeparator" colspan="2"> </td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ga77fc9b56a1bb39484844981ec375fc29"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN int </td><td class="memItemRight" valign="bottom"><a class="el" href="group__smtp.html#ga77fc9b56a1bb39484844981ec375fc29">lws_email_init</a> (struct <a class="el" href="structlws__email.html">lws_email</a> *email, uv_loop_t *loop, int max_content)</td></tr>
+<tr class="separator:ga77fc9b56a1bb39484844981ec375fc29"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga5e535e346d92a9daf00be33abf79d4eb"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN void </td><td class="memItemRight" valign="bottom"><a class="el" href="group__smtp.html#ga5e535e346d92a9daf00be33abf79d4eb">lws_email_check</a> (struct <a class="el" href="structlws__email.html">lws_email</a> *email)</td></tr>
+<tr class="separator:ga5e535e346d92a9daf00be33abf79d4eb"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga25298a5afc1074e13b2d5711a86432b2"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN void </td><td class="memItemRight" valign="bottom"><a class="el" href="group__smtp.html#ga25298a5afc1074e13b2d5711a86432b2">lws_email_destroy</a> (struct <a class="el" href="structlws__email.html">lws_email</a> *email)</td></tr>
+<tr class="separator:ga25298a5afc1074e13b2d5711a86432b2"><td class="memSeparator" colspan="2"> </td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<h2>SMTP related functions</h2>
+<p>These apis let you communicate with a local SMTP server to send email from lws. It handles all the SMTP sequencing and protocol actions.</p>
+<p>Your system should have postfix, sendmail or another MTA listening on port 25 and able to send email using the "mail" commandline app. Usually distro MTAs are configured for this by default.</p>
+<p>It runs via its own libuv events if initialized (which requires giving it a libuv loop to attach to).</p>
+<p>It operates using three callbacks, on_next() queries if there is a new email to send, on_get_body() asks for the body of the email, and on_sent() is called after the email is successfully sent.</p>
+<p>To use it</p>
+<ul>
+<li>create an <a class="el" href="structlws__email.html">lws_email</a> struct</li>
+<li>initialize data, loop, the email_* strings, max_content_size and the callbacks</li>
+<li>call <a class="el" href="group__smtp.html#ga77fc9b56a1bb39484844981ec375fc29">lws_email_init()</a></li>
+</ul>
+<p>When you have at least one email to send, call <a class="el" href="group__smtp.html#ga5e535e346d92a9daf00be33abf79d4eb">lws_email_check()</a> to schedule starting to send it. </p>
+<h2 class="groupheader">Enumeration Type Documentation</h2>
+<a class="anchor" id="ga116be79bf44f9dc2a97f46e051fe4dc0"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">enum <a class="el" href="group__smtp.html#ga116be79bf44f9dc2a97f46e051fe4dc0">lwsgs_smtp_states</a></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h.html">lib/libwebsockets.h</a>></code></p>
+<p>enum lwsgs_smtp_states - where we are in SMTP protocol sequence </p>
+<table class="fieldtable">
+<tr><th colspan="2">Enumerator</th></tr><tr><td class="fieldname"><a class="anchor" id="gga116be79bf44f9dc2a97f46e051fe4dc0a29e5b0ecf75375b5a643faa3d6222b7c"></a>LGSSMTP_IDLE </td><td class="fielddoc">
+<p>awaiting new email </p>
+</td></tr>
+<tr><td class="fieldname"><a class="anchor" id="gga116be79bf44f9dc2a97f46e051fe4dc0ab89442b7a3ca2b94c3cdcf33756eb933"></a>LGSSMTP_CONNECTING </td><td class="fielddoc">
+<p>opening tcp connection to MTA </p>
+</td></tr>
+<tr><td class="fieldname"><a class="anchor" id="gga116be79bf44f9dc2a97f46e051fe4dc0ab61778f70ecac007b334bb14942eb41d"></a>LGSSMTP_CONNECTED </td><td class="fielddoc">
+<p>tcp connection to MTA is connected </p>
+</td></tr>
+<tr><td class="fieldname"><a class="anchor" id="gga116be79bf44f9dc2a97f46e051fe4dc0a1dfec948a864205cec875f63cbe0d4ad"></a>LGSSMTP_SENT_HELO </td><td class="fielddoc">
+<p>sent the HELO </p>
+</td></tr>
+<tr><td class="fieldname"><a class="anchor" id="gga116be79bf44f9dc2a97f46e051fe4dc0a929bb4623ff3f585108aba2a1b047fab"></a>LGSSMTP_SENT_FROM </td><td class="fielddoc">
+<p>sent FROM </p>
+</td></tr>
+<tr><td class="fieldname"><a class="anchor" id="gga116be79bf44f9dc2a97f46e051fe4dc0aae20a0cb95b97a70f6b45d0ed2d5be83"></a>LGSSMTP_SENT_TO </td><td class="fielddoc">
+<p>sent TO </p>
+</td></tr>
+<tr><td class="fieldname"><a class="anchor" id="gga116be79bf44f9dc2a97f46e051fe4dc0a85e3c452950c09a79086bff4b9be5c14"></a>LGSSMTP_SENT_DATA </td><td class="fielddoc">
+<p>sent DATA request </p>
+</td></tr>
+<tr><td class="fieldname"><a class="anchor" id="gga116be79bf44f9dc2a97f46e051fe4dc0a38fba41f28d754e38079b31418a86a69"></a>LGSSMTP_SENT_BODY </td><td class="fielddoc">
+<p>sent the email body </p>
+</td></tr>
+<tr><td class="fieldname"><a class="anchor" id="gga116be79bf44f9dc2a97f46e051fe4dc0a2c2ed16ffc572326e3040684084b21d5"></a>LGSSMTP_SENT_QUIT </td><td class="fielddoc">
+<p>sent the session quit </p>
+</td></tr>
+</table>
+<div class="fragment"><div class="line"><a name="l03815"></a><span class="lineno"> 3815</span>  {</div><div class="line"><a name="l03816"></a><span class="lineno"> 3816</span>  <a class="code" href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a29e5b0ecf75375b5a643faa3d6222b7c">LGSSMTP_IDLE</a>, </div><div class="line"><a name="l03817"></a><span class="lineno"> 3817</span>  <a class="code" href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0ab89442b7a3ca2b94c3cdcf33756eb933">LGSSMTP_CONNECTING</a>, </div><div class="line"><a name="l03818"></a><span class="lineno"> 3818</span>  <a class="code" href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0ab61778f70ecac007b334bb14942eb41d">LGSSMTP_CONNECTED</a>, </div><div class="line"><a name="l03819"></a><span class="lineno"> 3819</span>  <a class="code" href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a1dfec948a864205cec875f63cbe0d4ad">LGSSMTP_SENT_HELO</a>, </div><div class="line"><a name="l03820"></a><span class="lineno"> 3820</span>  <a class="code" href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a929bb4623ff3f585108aba2a1b047fab">LGSSMTP_SENT_FROM</a>, </div><div class="line"><a name="l03821"></a><span class="lineno"> 3821</span>  <a class="code" href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0aae20a0cb95b97a70f6b45d0ed2d5be83">LGSSMTP_SENT_TO</a>, </div><div class="line"><a name="l03822"></a><span class="lineno"> 3822</span>  <a class="code" href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a85e3c452950c09a79086bff4b9be5c14">LGSSMTP_SENT_DATA</a>, </div><div class="line"><a name="l03823"></a><span class="lineno"> 3823</span>  <a class="code" href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a38fba41f28d754e38079b31418a86a69">LGSSMTP_SENT_BODY</a>, </div><div class="line"><a name="l03824"></a><span class="lineno"> 3824</span>  <a class="code" href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a2c2ed16ffc572326e3040684084b21d5">LGSSMTP_SENT_QUIT</a>, </div><div class="line"><a name="l03825"></a><span class="lineno"> 3825</span> };</div><div class="ttc" id="group__smtp_html_gga116be79bf44f9dc2a97f46e051fe4dc0ab61778f70ecac007b334bb14942eb41d"><div class="ttname"><a href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0ab61778f70ecac007b334bb14942eb41d">LGSSMTP_CONNECTED</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:3818</div></div>
+<div class="ttc" id="group__smtp_html_gga116be79bf44f9dc2a97f46e051fe4dc0a38fba41f28d754e38079b31418a86a69"><div class="ttname"><a href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a38fba41f28d754e38079b31418a86a69">LGSSMTP_SENT_BODY</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:3823</div></div>
+<div class="ttc" id="group__smtp_html_gga116be79bf44f9dc2a97f46e051fe4dc0a29e5b0ecf75375b5a643faa3d6222b7c"><div class="ttname"><a href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a29e5b0ecf75375b5a643faa3d6222b7c">LGSSMTP_IDLE</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:3816</div></div>
+<div class="ttc" id="group__smtp_html_gga116be79bf44f9dc2a97f46e051fe4dc0ab89442b7a3ca2b94c3cdcf33756eb933"><div class="ttname"><a href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0ab89442b7a3ca2b94c3cdcf33756eb933">LGSSMTP_CONNECTING</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:3817</div></div>
+<div class="ttc" id="group__smtp_html_gga116be79bf44f9dc2a97f46e051fe4dc0aae20a0cb95b97a70f6b45d0ed2d5be83"><div class="ttname"><a href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0aae20a0cb95b97a70f6b45d0ed2d5be83">LGSSMTP_SENT_TO</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:3821</div></div>
+<div class="ttc" id="group__smtp_html_gga116be79bf44f9dc2a97f46e051fe4dc0a929bb4623ff3f585108aba2a1b047fab"><div class="ttname"><a href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a929bb4623ff3f585108aba2a1b047fab">LGSSMTP_SENT_FROM</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:3820</div></div>
+<div class="ttc" id="group__smtp_html_gga116be79bf44f9dc2a97f46e051fe4dc0a2c2ed16ffc572326e3040684084b21d5"><div class="ttname"><a href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a2c2ed16ffc572326e3040684084b21d5">LGSSMTP_SENT_QUIT</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:3824</div></div>
+<div class="ttc" id="group__smtp_html_gga116be79bf44f9dc2a97f46e051fe4dc0a1dfec948a864205cec875f63cbe0d4ad"><div class="ttname"><a href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a1dfec948a864205cec875f63cbe0d4ad">LGSSMTP_SENT_HELO</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:3819</div></div>
+<div class="ttc" id="group__smtp_html_gga116be79bf44f9dc2a97f46e051fe4dc0a85e3c452950c09a79086bff4b9be5c14"><div class="ttname"><a href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a85e3c452950c09a79086bff4b9be5c14">LGSSMTP_SENT_DATA</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:3822</div></div>
+</div><!-- fragment -->
+</div>
+</div>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="ga5e535e346d92a9daf00be33abf79d4eb"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">LWS_VISIBLE LWS_EXTERN void lws_email_check </td>
+ <td>(</td>
+ <td class="paramtype">struct <a class="el" href="structlws__email.html">lws_email</a> * </td>
+ <td class="paramname"><em>email</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h.html">lib/libwebsockets.h</a>></code></p>
+<p><a class="el" href="group__smtp.html#ga5e535e346d92a9daf00be33abf79d4eb">lws_email_check()</a> - Request check for new email</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">email</td><td>struct <a class="el" href="structlws__email.html">lws_email</a> context to check</td></tr>
+ </table>
+ </dd>
+</dl>
+<p>Schedules a check for new emails in 1s... call this when you have queued an email for send. </p>
+
+</div>
+</div>
+<a class="anchor" id="ga25298a5afc1074e13b2d5711a86432b2"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">LWS_VISIBLE LWS_EXTERN void lws_email_destroy </td>
+ <td>(</td>
+ <td class="paramtype">struct <a class="el" href="structlws__email.html">lws_email</a> * </td>
+ <td class="paramname"><em>email</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h.html">lib/libwebsockets.h</a>></code></p>
+<p><a class="el" href="group__smtp.html#ga25298a5afc1074e13b2d5711a86432b2">lws_email_destroy()</a> - stop using the struct <a class="el" href="structlws__email.html">lws_email</a></p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">email</td><td>the struct <a class="el" href="structlws__email.html">lws_email</a> context</td></tr>
+ </table>
+ </dd>
+</dl>
+<p>Stop sending email using email and free allocations </p>
+
+</div>
+</div>
+<a class="anchor" id="ga77fc9b56a1bb39484844981ec375fc29"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">LWS_VISIBLE LWS_EXTERN int lws_email_init </td>
+ <td>(</td>
+ <td class="paramtype">struct <a class="el" href="structlws__email.html">lws_email</a> * </td>
+ <td class="paramname"><em>email</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">uv_loop_t * </td>
+ <td class="paramname"><em>loop</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">int </td>
+ <td class="paramname"><em>max_content</em> </td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h.html">lib/libwebsockets.h</a>></code></p>
+<p><a class="el" href="group__smtp.html#ga77fc9b56a1bb39484844981ec375fc29">lws_email_init()</a> - Initialize a struct <a class="el" href="structlws__email.html">lws_email</a></p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">email</td><td>struct <a class="el" href="structlws__email.html">lws_email</a> to init </td></tr>
+ <tr><td class="paramname">loop</td><td>libuv loop to use </td></tr>
+ <tr><td class="paramname">max_content</td><td>max email content size</td></tr>
+ </table>
+ </dd>
+</dl>
+<p>Prepares a struct <a class="el" href="structlws__email.html">lws_email</a> for use ending SMTP </p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">Generated by
+ <a href="http://www.doxygen.org/index.html">
+ <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.11 </li>
+ </ul>
+</div>
+</body>
+</html>
--- /dev/null
+var group__smtp =
+[
+ [ "lws_email", "structlws__email.html", [
+ [ "content", "structlws__email.html#a6fff03c5a5d369a2aa3cab0c897b1bed", null ],
+ [ "data", "structlws__email.html#add1341456045382c183f4c763bdea6bc", null ],
+ [ "email_buf", "structlws__email.html#a8f34ec0643a817be67ef4276aeb7fb82", null ],
+ [ "email_client", "structlws__email.html#a01f31934166dc6d01e8a375012f8ad1e", null ],
+ [ "email_connect_req", "structlws__email.html#a5f53d4c5a1e34b0dcaa8787e2eabb1b3", null ],
+ [ "email_connect_started", "structlws__email.html#a9747ca85597788c2d118d287df47b7c1", null ],
+ [ "email_from", "structlws__email.html#af7f0ae934347d81071f63a963301f9e2", null ],
+ [ "email_helo", "structlws__email.html#a939e5d7ee0339a16de73bde71ab4d4d9", null ],
+ [ "email_smtp_ip", "structlws__email.html#a472ae23fc9fca6599e5c512bc21458d2", null ],
+ [ "email_to", "structlws__email.html#a6453a8b92b3de6d2c2101af3edce685e", null ],
+ [ "estate", "structlws__email.html#ac6115d3cbef2e8bac62cc00895bf5fd3", null ],
+ [ "loop", "structlws__email.html#ab5fbf121195a8e67509c78a42cfbe168", null ],
+ [ "max_content_size", "structlws__email.html#a7bbc1964889c984b3da723c86a210e05", null ],
+ [ "on_get_body", "structlws__email.html#a2aff78c8e04db243052aa91b4d87e987", null ],
+ [ "on_next", "structlws__email.html#ad8dc60353ee246d84dd59ec0591e9719", null ],
+ [ "on_sent", "structlws__email.html#a39ef6263d58eb40cca417c8697b227d8", null ],
+ [ "timeout_email", "structlws__email.html#a77723e2f2b940b1c879ef5e1cd88c2be", null ]
+ ] ],
+ [ "lwsgs_smtp_states", "group__smtp.html#ga116be79bf44f9dc2a97f46e051fe4dc0", [
+ [ "LGSSMTP_IDLE", "group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a29e5b0ecf75375b5a643faa3d6222b7c", null ],
+ [ "LGSSMTP_CONNECTING", "group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0ab89442b7a3ca2b94c3cdcf33756eb933", null ],
+ [ "LGSSMTP_CONNECTED", "group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0ab61778f70ecac007b334bb14942eb41d", null ],
+ [ "LGSSMTP_SENT_HELO", "group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a1dfec948a864205cec875f63cbe0d4ad", null ],
+ [ "LGSSMTP_SENT_FROM", "group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a929bb4623ff3f585108aba2a1b047fab", null ],
+ [ "LGSSMTP_SENT_TO", "group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0aae20a0cb95b97a70f6b45d0ed2d5be83", null ],
+ [ "LGSSMTP_SENT_DATA", "group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a85e3c452950c09a79086bff4b9be5c14", null ],
+ [ "LGSSMTP_SENT_BODY", "group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a38fba41f28d754e38079b31418a86a69", null ],
+ [ "LGSSMTP_SENT_QUIT", "group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a2c2ed16ffc572326e3040684084b21d5", null ]
+ ] ],
+ [ "lws_email_check", "group__smtp.html#ga5e535e346d92a9daf00be33abf79d4eb", null ],
+ [ "lws_email_destroy", "group__smtp.html#ga25298a5afc1074e13b2d5711a86432b2", null ],
+ [ "lws_email_init", "group__smtp.html#ga77fc9b56a1bb39484844981ec375fc29", null ]
+];
\ No newline at end of file
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.11"/>
+<title>libwebsockets: Socket adoption helpers</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="libwebsockets.org-logo.png"/></td>
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname">libwebsockets
+ </div>
+ <div id="projectbrief">Lightweight C library for HTML5 websockets</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.11 -->
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main Page</span></a></li>
+ <li><a href="pages.html"><span>Related Pages</span></a></li>
+ <li class="current"><a href="modules.html"><span>Modules</span></a></li>
+ <li><a href="annotated.html"><span>Data Structures</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('group__sock-adopt.html','');});
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">Socket adoption helpers</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:gabe71b7462afb21c767bdc67334f305af"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN struct lws * </td><td class="memItemRight" valign="bottom"><a class="el" href="group__sock-adopt.html#gabe71b7462afb21c767bdc67334f305af">lws_adopt_socket</a> (struct lws_context *context, lws_sockfd_type accept_fd)</td></tr>
+<tr class="separator:gabe71b7462afb21c767bdc67334f305af"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:gab2d045df0f81afe00891aaed312d552b"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN struct lws * </td><td class="memItemRight" valign="bottom"><a class="el" href="group__sock-adopt.html#gab2d045df0f81afe00891aaed312d552b">lws_adopt_socket_readbuf</a> (struct lws_context *context, lws_sockfd_type accept_fd, const char *readbuf, size_t len)</td></tr>
+<tr class="separator:gab2d045df0f81afe00891aaed312d552b"><td class="memSeparator" colspan="2"> </td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<h2>Socket adoption helpers</h2>
+<p>When integrating with an external app with its own event loop, these can be used to accept connections from someone else's listening socket.</p>
+<p>When using lws own event loop, these are not needed. </p>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="gabe71b7462afb21c767bdc67334f305af"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">LWS_VISIBLE LWS_EXTERN struct lws* lws_adopt_socket </td>
+ <td>(</td>
+ <td class="paramtype">struct lws_context * </td>
+ <td class="paramname"><em>context</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">lws_sockfd_type </td>
+ <td class="paramname"><em>accept_fd</em> </td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h.html">lib/libwebsockets.h</a>></code></p>
+<p><a class="el" href="group__sock-adopt.html#gabe71b7462afb21c767bdc67334f305af">lws_adopt_socket()</a> - adopt foreign socket as if listen socket accepted it </p><dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">context</td><td>lws context </td></tr>
+ <tr><td class="paramname">accept_fd</td><td>fd of already-accepted socket to adopt</td></tr>
+ </table>
+ </dd>
+</dl>
+<p>Either returns new wsi bound to accept_fd, or closes accept_fd and returns NULL, having cleaned up any new wsi pieces.</p>
+<p>LWS adopts the socket in http serving mode, it's ready to accept an upgrade to ws or just serve http. </p>
+
+</div>
+</div>
+<a class="anchor" id="gab2d045df0f81afe00891aaed312d552b"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">LWS_VISIBLE LWS_EXTERN struct lws* lws_adopt_socket_readbuf </td>
+ <td>(</td>
+ <td class="paramtype">struct lws_context * </td>
+ <td class="paramname"><em>context</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">lws_sockfd_type </td>
+ <td class="paramname"><em>accept_fd</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const char * </td>
+ <td class="paramname"><em>readbuf</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">size_t </td>
+ <td class="paramname"><em>len</em> </td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h.html">lib/libwebsockets.h</a>></code></p>
+<p><a class="el" href="group__sock-adopt.html#gab2d045df0f81afe00891aaed312d552b">lws_adopt_socket_readbuf()</a> - adopt foreign socket and first rx as if listen socket accepted it </p><dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">context</td><td>lws context </td></tr>
+ <tr><td class="paramname">accept_fd</td><td>fd of already-accepted socket to adopt </td></tr>
+ <tr><td class="paramname">readbuf</td><td>NULL or pointer to data that must be drained before reading from accept_fd </td></tr>
+ <tr><td class="paramname">len</td><td>The length of the data held at </td></tr>
+ <tr><td class="paramname">readbuf</td><td>Either returns new wsi bound to accept_fd, or closes accept_fd and returns NULL, having cleaned up any new wsi pieces.</td></tr>
+ </table>
+ </dd>
+</dl>
+<p>LWS adopts the socket in http serving mode, it's ready to accept an upgrade to ws or just serve http.</p>
+<p>If your external code did not already read from the socket, you can use <a class="el" href="group__sock-adopt.html#gabe71b7462afb21c767bdc67334f305af">lws_adopt_socket()</a> instead.</p>
+<p>This api is guaranteed to use the data at </p><dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">readbuf</td><td>first, before reading from the socket.</td></tr>
+ </table>
+ </dd>
+</dl>
+<p>readbuf is limited to the size of the ah rx buf, currently 2048 bytes. </p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">Generated by
+ <a href="http://www.doxygen.org/index.html">
+ <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.11 </li>
+ </ul>
+</div>
+</body>
+</html>
--- /dev/null
+var group__sock_adopt =
+[
+ [ "lws_adopt_socket", "group__sock-adopt.html#gabe71b7462afb21c767bdc67334f305af", null ],
+ [ "lws_adopt_socket_readbuf", "group__sock-adopt.html#gab2d045df0f81afe00891aaed312d552b", null ]
+];
\ No newline at end of file
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.11"/>
+<title>libwebsockets: Connection timeouts</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="libwebsockets.org-logo.png"/></td>
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname">libwebsockets
+ </div>
+ <div id="projectbrief">Lightweight C library for HTML5 websockets</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.11 -->
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main Page</span></a></li>
+ <li><a href="pages.html"><span>Related Pages</span></a></li>
+ <li class="current"><a href="modules.html"><span>Modules</span></a></li>
+ <li><a href="annotated.html"><span>Data Structures</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('group__timeout.html','');});
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#enum-members">Enumerations</a> |
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">Connection timeouts</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="enum-members"></a>
+Enumerations</h2></td></tr>
+<tr class="memitem:ga2c0aa4b9c3c55bae7b35cbfac3246c87"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ga2c0aa4b9c3c55bae7b35cbfac3246c87"></a>enum  </td><td class="memItemRight" valign="bottom"><b>pending_timeout</b> { <br />
+  <b>NO_PENDING_TIMEOUT</b> = 0,
+<b>PENDING_TIMEOUT_AWAITING_PROXY_RESPONSE</b> = 1,
+<b>PENDING_TIMEOUT_AWAITING_CONNECT_RESPONSE</b> = 2,
+<b>PENDING_TIMEOUT_ESTABLISH_WITH_SERVER</b> = 3,
+<br />
+  <b>PENDING_TIMEOUT_AWAITING_SERVER_RESPONSE</b> = 4,
+<b>PENDING_TIMEOUT_AWAITING_PING</b> = 5,
+<b>PENDING_TIMEOUT_CLOSE_ACK</b> = 6,
+<b>PENDING_TIMEOUT_AWAITING_EXTENSION_CONNECT_RESPONSE</b> = 7,
+<br />
+  <b>PENDING_TIMEOUT_SENT_CLIENT_HANDSHAKE</b> = 8,
+<b>PENDING_TIMEOUT_SSL_ACCEPT</b> = 9,
+<b>PENDING_TIMEOUT_HTTP_CONTENT</b> = 10,
+<b>PENDING_TIMEOUT_AWAITING_CLIENT_HS_SEND</b> = 11,
+<br />
+  <b>PENDING_FLUSH_STORED_SEND_BEFORE_CLOSE</b> = 12,
+<b>PENDING_TIMEOUT_SHUTDOWN_FLUSH</b> = 13,
+<b>PENDING_TIMEOUT_CGI</b> = 14,
+<b>PENDING_TIMEOUT_HTTP_KEEPALIVE_IDLE</b> = 15
+<br />
+ }</td></tr>
+<tr class="separator:ga2c0aa4b9c3c55bae7b35cbfac3246c87"><td class="memSeparator" colspan="2"> </td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:gaced9f9237f6172fed9f730a2af51345a"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN void </td><td class="memItemRight" valign="bottom"><a class="el" href="group__timeout.html#gaced9f9237f6172fed9f730a2af51345a">lws_set_timeout</a> (struct lws *wsi, enum pending_timeout reason, int secs)</td></tr>
+<tr class="separator:gaced9f9237f6172fed9f730a2af51345a"><td class="memSeparator" colspan="2"> </td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<p>APIs related to setting connection timeouts </p>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="gaced9f9237f6172fed9f730a2af51345a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">LWS_VISIBLE LWS_EXTERN void lws_set_timeout </td>
+ <td>(</td>
+ <td class="paramtype">struct lws * </td>
+ <td class="paramname"><em>wsi</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">enum pending_timeout </td>
+ <td class="paramname"><em>reason</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">int </td>
+ <td class="paramname"><em>secs</em> </td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h.html">lib/libwebsockets.h</a>></code></p>
+<p><a class="el" href="group__timeout.html#gaced9f9237f6172fed9f730a2af51345a">lws_set_timeout()</a> - marks the wsi as subject to a timeout</p>
+<p>You will not need this unless you are doing something special</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">wsi</td><td>Websocket connection instance </td></tr>
+ <tr><td class="paramname">reason</td><td>timeout reason </td></tr>
+ <tr><td class="paramname">secs</td><td>how many seconds </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">Generated by
+ <a href="http://www.doxygen.org/index.html">
+ <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.11 </li>
+ </ul>
+</div>
+</body>
+</html>
--- /dev/null
+var group__timeout =
+[
+ [ "lws_set_timeout", "group__timeout.html#gaced9f9237f6172fed9f730a2af51345a", null ]
+];
\ No newline at end of file
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.11"/>
+<title>libwebsockets: Urlencode and Urldecode</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="libwebsockets.org-logo.png"/></td>
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname">libwebsockets
+ </div>
+ <div id="projectbrief">Lightweight C library for HTML5 websockets</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.11 -->
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main Page</span></a></li>
+ <li><a href="pages.html"><span>Related Pages</span></a></li>
+ <li class="current"><a href="modules.html"><span>Modules</span></a></li>
+ <li><a href="annotated.html"><span>Data Structures</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('group__urlendec.html','');});
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">Urlencode and Urldecode<div class="ingroups"><a class="el" href="group__http.html">HTTP</a></div></div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:gabc2888476e50e001c875c1a8abf455b7"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN const char * </td><td class="memItemRight" valign="bottom"><a class="el" href="group__urlendec.html#gabc2888476e50e001c875c1a8abf455b7">lws_urlencode</a> (char *escaped, const char *string, int len)</td></tr>
+<tr class="separator:gabc2888476e50e001c875c1a8abf455b7"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:gaa373a9c16acdd96c395af61ab915ece3"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN int </td><td class="memItemRight" valign="bottom"><a class="el" href="group__urlendec.html#gaa373a9c16acdd96c395af61ab915ece3">lws_urldecode</a> (char *string, const char *escaped, int len)</td></tr>
+<tr class="separator:gaa373a9c16acdd96c395af61ab915ece3"><td class="memSeparator" colspan="2"> </td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<h2>HTML chunked Substitution</h2>
+<p>APIs for receiving chunks of text, replacing a set of variable names via a callback, and then prepending and appending HTML chunked encoding headers. </p>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="gaa373a9c16acdd96c395af61ab915ece3"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">LWS_VISIBLE LWS_EXTERN int lws_urldecode </td>
+ <td>(</td>
+ <td class="paramtype">char * </td>
+ <td class="paramname"><em>string</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const char * </td>
+ <td class="paramname"><em>escaped</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">int </td>
+ <td class="paramname"><em>len</em> </td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h.html">lib/libwebsockets.h</a>></code></p>
+<p><a class="el" href="group__urlendec.html#gaa373a9c16acdd96c395af61ab915ece3">lws_urldecode()</a> - like strncpy but with urldecoding</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">string</td><td>output buffer </td></tr>
+ <tr><td class="paramname">escaped</td><td>input buffer ('\0' terminated) </td></tr>
+ <tr><td class="paramname">len</td><td>output buffer max length</td></tr>
+ </table>
+ </dd>
+</dl>
+<p>This is only useful for '\0' terminated strings</p>
+<p>Since urldecoding only shrinks the output string, it is possible to do it in-place, ie, string == escaped </p>
+
+</div>
+</div>
+<a class="anchor" id="gabc2888476e50e001c875c1a8abf455b7"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">LWS_VISIBLE LWS_EXTERN const char* lws_urlencode </td>
+ <td>(</td>
+ <td class="paramtype">char * </td>
+ <td class="paramname"><em>escaped</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const char * </td>
+ <td class="paramname"><em>string</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">int </td>
+ <td class="paramname"><em>len</em> </td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h.html">lib/libwebsockets.h</a>></code></p>
+<p><a class="el" href="group__urlendec.html#gabc2888476e50e001c875c1a8abf455b7">lws_urlencode()</a> - like strncpy but with urlencoding</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">escaped</td><td>output buffer </td></tr>
+ <tr><td class="paramname">string</td><td>input buffer ('/0' terminated) </td></tr>
+ <tr><td class="paramname">len</td><td>output buffer max length</td></tr>
+ </table>
+ </dd>
+</dl>
+<p>Because urlencoding expands the output string, it's not possible to do it in-place, ie, with escaped == string </p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">Generated by
+ <a href="http://www.doxygen.org/index.html">
+ <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.11 </li>
+ </ul>
+</div>
+</body>
+</html>
--- /dev/null
+var group__urlendec =
+[
+ [ "lws_urldecode", "group__urlendec.html#gaa373a9c16acdd96c395af61ab915ece3", null ],
+ [ "lws_urlencode", "group__urlendec.html#gabc2888476e50e001c875c1a8abf455b7", null ]
+];
\ No newline at end of file
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.11"/>
+<title>libwebsockets: User Callback</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="libwebsockets.org-logo.png"/></td>
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname">libwebsockets
+ </div>
+ <div id="projectbrief">Lightweight C library for HTML5 websockets</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.11 -->
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main Page</span></a></li>
+ <li><a href="pages.html"><span>Related Pages</span></a></li>
+ <li class="current"><a href="modules.html"><span>Modules</span></a></li>
+ <li><a href="annotated.html"><span>Data Structures</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('group__usercb.html','');});
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#typedef-members">Typedefs</a> |
+<a href="#enum-members">Enumerations</a> </div>
+ <div class="headertitle">
+<div class="title">User Callback</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="typedef-members"></a>
+Typedefs</h2></td></tr>
+<tr class="memitem:gad4fcb82e68d60ffacca61a3f783a0a2f"><td class="memItemLeft" align="right" valign="top">typedef int </td><td class="memItemRight" valign="bottom"><a class="el" href="group__usercb.html#gad4fcb82e68d60ffacca61a3f783a0a2f">lws_callback_function</a>(struct lws *wsi, enum <a class="el" href="group__usercb.html#gad62860e19975ba4c4af401c3cdb6abf7">lws_callback_reasons</a> reason, void *user, void *in, size_t len)</td></tr>
+<tr class="separator:gad4fcb82e68d60ffacca61a3f783a0a2f"><td class="memSeparator" colspan="2"> </td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="enum-members"></a>
+Enumerations</h2></td></tr>
+<tr class="memitem:gad62860e19975ba4c4af401c3cdb6abf7"><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="group__usercb.html#gad62860e19975ba4c4af401c3cdb6abf7">lws_callback_reasons</a> { <br />
+  <a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a24d39bf1cfc0bad9d92da9ac1717e439">LWS_CALLBACK_ESTABLISHED</a> = 0,
+<a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ad8c6207b0c4e732f3d507f0fb79370e8">LWS_CALLBACK_CLIENT_CONNECTION_ERROR</a> = 1,
+<a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aa536e574a642ff3ab9e12bff7ba2c6a2">LWS_CALLBACK_CLIENT_FILTER_PRE_ESTABLISH</a> = 2,
+<a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a7e12418eec9bce85735e6460176ab604">LWS_CALLBACK_CLIENT_ESTABLISHED</a> = 3,
+<br />
+  <a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a48a9590e5e18c7920282e094a0bfd9d8">LWS_CALLBACK_CLOSED</a> = 4,
+<a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a838b18d255c1b94a533287ba302a2eba">LWS_CALLBACK_CLOSED_HTTP</a> = 5,
+<a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a492c1b1c0ac0ed980042ee732fe2990c">LWS_CALLBACK_RECEIVE</a> = 6,
+<a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a2db02fc6e1c17ab62b52109d1aa9d738">LWS_CALLBACK_RECEIVE_PONG</a> = 7,
+<br />
+  <a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7abbbe7a0a67c5866ca9109d46823fc5b1">LWS_CALLBACK_CLIENT_RECEIVE</a> = 8,
+<a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a136a7cec11c3afd13245623bd84e76c9">LWS_CALLBACK_CLIENT_RECEIVE_PONG</a> = 9,
+<a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a8e8b2e6dbeac76d8d126947d2166a514">LWS_CALLBACK_CLIENT_WRITEABLE</a> = 10,
+<a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a7ec8e2e9557ee02a4fc9f7dec7e2babc">LWS_CALLBACK_SERVER_WRITEABLE</a> = 11,
+<br />
+  <a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ae8d1de0bb56e03aa58cb4d44b18edd2e">LWS_CALLBACK_HTTP</a> = 12,
+<a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ac4c68e00efcf1ff7bda7ada462aff8ae">LWS_CALLBACK_HTTP_BODY</a> = 13,
+<a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a2fce9a8608220f32abbf1422a5498804">LWS_CALLBACK_HTTP_BODY_COMPLETION</a> = 14,
+<a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aa627548e1296e654fcfab463ec3c9587">LWS_CALLBACK_HTTP_FILE_COMPLETION</a> = 15,
+<br />
+  <a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7afedadfb3cde37a8ea4c84ed535f26d09">LWS_CALLBACK_HTTP_WRITEABLE</a> = 16,
+<a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a026502768778b8d79d62dd0fe4375fc6">LWS_CALLBACK_FILTER_NETWORK_CONNECTION</a> = 17,
+<a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a75199176c82c1a56e4a6bbf1cc30c12c">LWS_CALLBACK_FILTER_HTTP_CONNECTION</a> = 18,
+<a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ae9734e1d7af2abf291665ce9e4a728d3">LWS_CALLBACK_SERVER_NEW_CLIENT_INSTANTIATED</a> = 19,
+<br />
+  <a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7accd8753672d319a30b4b4c2fb775e84d">LWS_CALLBACK_FILTER_PROTOCOL_CONNECTION</a> = 20,
+<a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ae4986291b7a810fe290851d73bebeb1c">LWS_CALLBACK_OPENSSL_LOAD_EXTRA_CLIENT_VERIFY_CERTS</a> = 21,
+<a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a06006e98d27e1e884364d88317f83493">LWS_CALLBACK_OPENSSL_LOAD_EXTRA_SERVER_VERIFY_CERTS</a> = 22,
+<a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ae5ad65d779b7eab32ab67ceff91a3bac">LWS_CALLBACK_OPENSSL_PERFORM_CLIENT_CERT_VERIFICATION</a> = 23,
+<br />
+  <a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a909cc2a7018864b0b71abacc4058fd8f">LWS_CALLBACK_CLIENT_APPEND_HANDSHAKE_HEADER</a> = 24,
+<a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a390da3639296660a78cc1a5dcb19037e">LWS_CALLBACK_CONFIRM_EXTENSION_OKAY</a> = 25,
+<a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a1ce5b22039ca37ee224d00047596ea46">LWS_CALLBACK_CLIENT_CONFIRM_EXTENSION_SUPPORTED</a> = 26,
+<a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ad5d34583e3556e153eda91620b48cc49">LWS_CALLBACK_PROTOCOL_INIT</a> = 27,
+<br />
+  <a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a54269ca88508e6efd3afdb9d360a9caa">LWS_CALLBACK_PROTOCOL_DESTROY</a> = 28,
+<a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7afd8fd77a1cc9405fcb4f26915d7f2d01">LWS_CALLBACK_WSI_CREATE</a> = 29,
+<a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aca834dc035b7f7486f9ce40fde54fe9e">LWS_CALLBACK_WSI_DESTROY</a> = 30,
+<a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7adfb41c92e2522712207ef7f2462b5e34">LWS_CALLBACK_GET_THREAD_ID</a> = 31,
+<br />
+  <a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ab69783a9fbf2ca71ad70706bda77b412">LWS_CALLBACK_ADD_POLL_FD</a> = 32,
+<a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a1df60f314710236f9b53efbf468da768">LWS_CALLBACK_DEL_POLL_FD</a> = 33,
+<a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aa87d2e82fffa42c3680c7403ef94216e">LWS_CALLBACK_CHANGE_MODE_POLL_FD</a> = 34,
+<a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a8909732521d379179003d97ab7a05428">LWS_CALLBACK_LOCK_POLL</a> = 35,
+<br />
+  <a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a0e9e3dd667c0c42cdbe1a3d921f4fd79">LWS_CALLBACK_UNLOCK_POLL</a> = 36,
+<a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aa46f705dcf97502e95627ffde614f98b">LWS_CALLBACK_OPENSSL_CONTEXT_REQUIRES_PRIVATE_KEY</a> = 37,
+<a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ac3fc5bbb55e69f90396526287ee84a51">LWS_CALLBACK_WS_PEER_INITIATED_CLOSE</a> = 38,
+<b>LWS_CALLBACK_WS_EXT_DEFAULTS</b> = 39,
+<br />
+  <b>LWS_CALLBACK_CGI</b> = 40,
+<b>LWS_CALLBACK_CGI_TERMINATED</b> = 41,
+<b>LWS_CALLBACK_CGI_STDIN_DATA</b> = 42,
+<b>LWS_CALLBACK_CGI_STDIN_COMPLETED</b> = 43,
+<br />
+  <b>LWS_CALLBACK_ESTABLISHED_CLIENT_HTTP</b> = 44,
+<b>LWS_CALLBACK_CLOSED_CLIENT_HTTP</b> = 45,
+<b>LWS_CALLBACK_RECEIVE_CLIENT_HTTP</b> = 46,
+<b>LWS_CALLBACK_COMPLETED_CLIENT_HTTP</b> = 47,
+<br />
+  <b>LWS_CALLBACK_RECEIVE_CLIENT_HTTP_READ</b> = 48,
+<b>LWS_CALLBACK_HTTP_BIND_PROTOCOL</b> = 49,
+<b>LWS_CALLBACK_HTTP_DROP_PROTOCOL</b> = 50,
+<b>LWS_CALLBACK_CHECK_ACCESS_RIGHTS</b> = 51,
+<br />
+  <b>LWS_CALLBACK_PROCESS_HTML</b> = 52,
+<b>LWS_CALLBACK_ADD_HEADERS</b> = 53,
+<b>LWS_CALLBACK_SESSION_INFO</b> = 54,
+<b>LWS_CALLBACK_GS_EVENT</b> = 55,
+<br />
+  <a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a982579753e70e59a9ea13ce628ac891a">LWS_CALLBACK_USER</a> = 1000
+<br />
+ }</td></tr>
+<tr class="separator:gad62860e19975ba4c4af401c3cdb6abf7"><td class="memSeparator" colspan="2"> </td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<h2>User protocol callback</h2>
+<p>The protocol callback is the primary way lws interacts with user code. For one of a list of a few dozen reasons the callback gets called at some event to be handled.</p>
+<p>All of the events can be ignored, returning 0 is taken as "OK" and returning nonzero in most cases indicates that the connection should be closed. </p>
+<h2 class="groupheader">Typedef Documentation</h2>
+<a class="anchor" id="gad4fcb82e68d60ffacca61a3f783a0a2f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">typedef int lws_callback_function(struct lws *wsi, enum <a class="el" href="group__usercb.html#gad62860e19975ba4c4af401c3cdb6abf7">lws_callback_reasons</a> reason, void *user, void *in, size_t len)</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h.html">lib/libwebsockets.h</a>></code></p>
+<p>typedef <a class="el" href="group__usercb.html#gad4fcb82e68d60ffacca61a3f783a0a2f">lws_callback_function()</a> - User server actions </p><dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">wsi</td><td>Opaque websocket instance pointer </td></tr>
+ <tr><td class="paramname">reason</td><td>The reason for the call </td></tr>
+ <tr><td class="paramname">user</td><td>Pointer to per-session user data allocated by library </td></tr>
+ <tr><td class="paramname">in</td><td>Pointer used for some callback reasons </td></tr>
+ <tr><td class="paramname">len</td><td>Length set for some callback reasons <pre class="fragment"> This callback is the way the user controls what is served. All the
+ protocol detail is hidden and handled by the library.
+
+ For each connection / session there is user data allocated that is
+ pointed to by "user". You set the size of this user data area when
+ the library is initialized with lws_create_server.</pre> </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<h2 class="groupheader">Enumeration Type Documentation</h2>
+<a class="anchor" id="gad62860e19975ba4c4af401c3cdb6abf7"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">enum <a class="el" href="group__usercb.html#gad62860e19975ba4c4af401c3cdb6abf7">lws_callback_reasons</a></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h.html">lib/libwebsockets.h</a>></code></p>
+<p>enum lws_callback_reasons - reason you're getting a protocol callback </p>
+<table class="fieldtable">
+<tr><th colspan="2">Enumerator</th></tr><tr><td class="fieldname"><a class="anchor" id="ggad62860e19975ba4c4af401c3cdb6abf7a24d39bf1cfc0bad9d92da9ac1717e439"></a>LWS_CALLBACK_ESTABLISHED </td><td class="fielddoc">
+<p>(VH) after the server completes a handshake with an incoming client. If you built the library with ssl support, in is a pointer to the ssl struct associated with the connection or NULL. </p>
+</td></tr>
+<tr><td class="fieldname"><a class="anchor" id="ggad62860e19975ba4c4af401c3cdb6abf7ad8c6207b0c4e732f3d507f0fb79370e8"></a>LWS_CALLBACK_CLIENT_CONNECTION_ERROR </td><td class="fielddoc">
+<p>the request client connection has been unable to complete a handshake with the remote server. If in is non-NULL, you can find an error string of length len where it points to. </p>
+</td></tr>
+<tr><td class="fieldname"><a class="anchor" id="ggad62860e19975ba4c4af401c3cdb6abf7aa536e574a642ff3ab9e12bff7ba2c6a2"></a>LWS_CALLBACK_CLIENT_FILTER_PRE_ESTABLISH </td><td class="fielddoc">
+<p>this is the last chance for the client user code to examine the http headers and decide to reject the connection. If the content in the headers is interesting to the client (url, etc) it needs to copy it out at this point since it will be destroyed before the CLIENT_ESTABLISHED call </p>
+</td></tr>
+<tr><td class="fieldname"><a class="anchor" id="ggad62860e19975ba4c4af401c3cdb6abf7a7e12418eec9bce85735e6460176ab604"></a>LWS_CALLBACK_CLIENT_ESTABLISHED </td><td class="fielddoc">
+<p>after your client connection completed a handshake with the remote server </p>
+</td></tr>
+<tr><td class="fieldname"><a class="anchor" id="ggad62860e19975ba4c4af401c3cdb6abf7a48a9590e5e18c7920282e094a0bfd9d8"></a>LWS_CALLBACK_CLOSED </td><td class="fielddoc">
+<p>when the websocket session ends </p>
+</td></tr>
+<tr><td class="fieldname"><a class="anchor" id="ggad62860e19975ba4c4af401c3cdb6abf7a838b18d255c1b94a533287ba302a2eba"></a>LWS_CALLBACK_CLOSED_HTTP </td><td class="fielddoc">
+<p>when a HTTP (non-websocket) session ends </p>
+</td></tr>
+<tr><td class="fieldname"><a class="anchor" id="ggad62860e19975ba4c4af401c3cdb6abf7a492c1b1c0ac0ed980042ee732fe2990c"></a>LWS_CALLBACK_RECEIVE </td><td class="fielddoc">
+<p>data has appeared for this server endpoint from a remote client, it can be found at *in and is len bytes long </p>
+</td></tr>
+<tr><td class="fieldname"><a class="anchor" id="ggad62860e19975ba4c4af401c3cdb6abf7a2db02fc6e1c17ab62b52109d1aa9d738"></a>LWS_CALLBACK_RECEIVE_PONG </td><td class="fielddoc">
+<p>servers receive PONG packets with this callback reason </p>
+</td></tr>
+<tr><td class="fieldname"><a class="anchor" id="ggad62860e19975ba4c4af401c3cdb6abf7abbbe7a0a67c5866ca9109d46823fc5b1"></a>LWS_CALLBACK_CLIENT_RECEIVE </td><td class="fielddoc">
+<p>data has appeared from the server for the client connection, it can be found at *in and is len bytes long </p>
+</td></tr>
+<tr><td class="fieldname"><a class="anchor" id="ggad62860e19975ba4c4af401c3cdb6abf7a136a7cec11c3afd13245623bd84e76c9"></a>LWS_CALLBACK_CLIENT_RECEIVE_PONG </td><td class="fielddoc">
+<p>clients receive PONG packets with this callback reason </p>
+</td></tr>
+<tr><td class="fieldname"><a class="anchor" id="ggad62860e19975ba4c4af401c3cdb6abf7a8e8b2e6dbeac76d8d126947d2166a514"></a>LWS_CALLBACK_CLIENT_WRITEABLE </td><td class="fielddoc">
+<p>If you call <a class="el" href="group__callback-when-writeable.html#ga941caaa468bc507b1cae52275f58800d">lws_callback_on_writable()</a> on a connection, you will get one of these callbacks coming when the connection socket is able to accept another write packet without blocking. If it already was able to take another packet without blocking, you'll get this callback at the next call to the service loop function. Notice that CLIENTs get LWS_CALLBACK_CLIENT_WRITEABLE and servers get LWS_CALLBACK_SERVER_WRITEABLE. </p>
+</td></tr>
+<tr><td class="fieldname"><a class="anchor" id="ggad62860e19975ba4c4af401c3cdb6abf7a7ec8e2e9557ee02a4fc9f7dec7e2babc"></a>LWS_CALLBACK_SERVER_WRITEABLE </td><td class="fielddoc">
+<p>See LWS_CALLBACK_CLIENT_WRITEABLE </p>
+</td></tr>
+<tr><td class="fieldname"><a class="anchor" id="ggad62860e19975ba4c4af401c3cdb6abf7ae8d1de0bb56e03aa58cb4d44b18edd2e"></a>LWS_CALLBACK_HTTP </td><td class="fielddoc">
+<p>an http request has come from a client that is not asking to upgrade the connection to a websocket one. This is a chance to serve http content, for example, to send a script to the client which will then open the websockets connection. in points to the URI path requested and <a class="el" href="group__httpft.html#gab393a06d3d2722af4c3f8b06842c80d7">lws_serve_http_file()</a> makes it very simple to send back a file to the client. Normally after sending the file you are done with the http connection, since the rest of the activity will come by websockets from the script that was delivered by http, so you will want to return 1; to close and free up the connection. </p>
+</td></tr>
+<tr><td class="fieldname"><a class="anchor" id="ggad62860e19975ba4c4af401c3cdb6abf7ac4c68e00efcf1ff7bda7ada462aff8ae"></a>LWS_CALLBACK_HTTP_BODY </td><td class="fielddoc">
+<p>the next len bytes data from the http request body HTTP connection is now available in in. </p>
+</td></tr>
+<tr><td class="fieldname"><a class="anchor" id="ggad62860e19975ba4c4af401c3cdb6abf7a2fce9a8608220f32abbf1422a5498804"></a>LWS_CALLBACK_HTTP_BODY_COMPLETION </td><td class="fielddoc">
+<p>the expected amount of http request body has been delivered </p>
+</td></tr>
+<tr><td class="fieldname"><a class="anchor" id="ggad62860e19975ba4c4af401c3cdb6abf7aa627548e1296e654fcfab463ec3c9587"></a>LWS_CALLBACK_HTTP_FILE_COMPLETION </td><td class="fielddoc">
+<p>a file requested to be sent down http link has completed. </p>
+</td></tr>
+<tr><td class="fieldname"><a class="anchor" id="ggad62860e19975ba4c4af401c3cdb6abf7afedadfb3cde37a8ea4c84ed535f26d09"></a>LWS_CALLBACK_HTTP_WRITEABLE </td><td class="fielddoc">
+<p>you can write more down the http protocol link now. </p>
+</td></tr>
+<tr><td class="fieldname"><a class="anchor" id="ggad62860e19975ba4c4af401c3cdb6abf7a026502768778b8d79d62dd0fe4375fc6"></a>LWS_CALLBACK_FILTER_NETWORK_CONNECTION </td><td class="fielddoc">
+<p>called when a client connects to the server at network level; the connection is accepted but then passed to this callback to decide whether to hang up immediately or not, based on the client IP. in contains the connection socket's descriptor. Since the client connection information is not available yet, wsi still pointing to the main server socket. Return non-zero to terminate the connection before sending or receiving anything. Because this happens immediately after the network connection from the client, there's no websocket protocol selected yet so this callback is issued only to protocol 0. </p>
+</td></tr>
+<tr><td class="fieldname"><a class="anchor" id="ggad62860e19975ba4c4af401c3cdb6abf7a75199176c82c1a56e4a6bbf1cc30c12c"></a>LWS_CALLBACK_FILTER_HTTP_CONNECTION </td><td class="fielddoc">
+<p>called when the request has been received and parsed from the client, but the response is not sent yet. Return non-zero to disallow the connection. user is a pointer to the connection user space allocation, in is the URI, eg, "/" In your handler you can use the public APIs <a class="el" href="group__HTTP-headers-read.html#ga8ade0e1ffb0da7e62b989d8d867bf6c8">lws_hdr_total_length()</a> / <a class="el" href="group__HTTP-headers-read.html#ga6ce6aa1c0155ea42b7708bed271d1c77">lws_hdr_copy()</a> to access all of the headers using the header enums lws_token_indexes from <a class="el" href="libwebsockets_8h.html">libwebsockets.h</a> to check for and read the supported header presence and content before deciding to allow the http connection to proceed or to kill the connection. </p>
+</td></tr>
+<tr><td class="fieldname"><a class="anchor" id="ggad62860e19975ba4c4af401c3cdb6abf7ae9734e1d7af2abf291665ce9e4a728d3"></a>LWS_CALLBACK_SERVER_NEW_CLIENT_INSTANTIATED </td><td class="fielddoc">
+<p>A new client just had been connected, accepted, and instantiated into the pool. This callback allows setting any relevant property to it. Because this happens immediately after the instantiation of a new client, there's no websocket protocol selected yet so this callback is issued only to protocol 0. Only wsi is defined, pointing to the new client, and the return value is ignored. </p>
+</td></tr>
+<tr><td class="fieldname"><a class="anchor" id="ggad62860e19975ba4c4af401c3cdb6abf7accd8753672d319a30b4b4c2fb775e84d"></a>LWS_CALLBACK_FILTER_PROTOCOL_CONNECTION </td><td class="fielddoc">
+<p>called when the handshake has been received and parsed from the client, but the response is not sent yet. Return non-zero to disallow the connection. user is a pointer to the connection user space allocation, in is the requested protocol name In your handler you can use the public APIs <a class="el" href="group__HTTP-headers-read.html#ga8ade0e1ffb0da7e62b989d8d867bf6c8">lws_hdr_total_length()</a> / <a class="el" href="group__HTTP-headers-read.html#ga6ce6aa1c0155ea42b7708bed271d1c77">lws_hdr_copy()</a> to access all of the headers using the header enums lws_token_indexes from <a class="el" href="libwebsockets_8h.html">libwebsockets.h</a> to check for and read the supported header presence and content before deciding to allow the handshake to proceed or to kill the connection. </p>
+</td></tr>
+<tr><td class="fieldname"><a class="anchor" id="ggad62860e19975ba4c4af401c3cdb6abf7ae4986291b7a810fe290851d73bebeb1c"></a>LWS_CALLBACK_OPENSSL_LOAD_EXTRA_CLIENT_VERIFY_CERTS </td><td class="fielddoc">
+<p>if configured for including OpenSSL support, this callback allows your user code to perform extra SSL_CTX_load_verify_locations() or similar calls to direct OpenSSL where to find certificates the client can use to confirm the remote server identity. user is the OpenSSL SSL_CTX* </p>
+</td></tr>
+<tr><td class="fieldname"><a class="anchor" id="ggad62860e19975ba4c4af401c3cdb6abf7a06006e98d27e1e884364d88317f83493"></a>LWS_CALLBACK_OPENSSL_LOAD_EXTRA_SERVER_VERIFY_CERTS </td><td class="fielddoc">
+<p>if configured for including OpenSSL support, this callback allows your user code to load extra certifcates into the server which allow it to verify the validity of certificates returned by clients. user is the server's OpenSSL SSL_CTX* </p>
+</td></tr>
+<tr><td class="fieldname"><a class="anchor" id="ggad62860e19975ba4c4af401c3cdb6abf7ae5ad65d779b7eab32ab67ceff91a3bac"></a>LWS_CALLBACK_OPENSSL_PERFORM_CLIENT_CERT_VERIFICATION </td><td class="fielddoc">
+<p>if the libwebsockets vhost was created with the option LWS_SERVER_OPTION_REQUIRE_VALID_OPENSSL_CLIENT_CERT, then this callback is generated during OpenSSL verification of the cert sent from the client. It is sent to protocol[0] callback as no protocol has been negotiated on the connection yet. Notice that the libwebsockets context and wsi are both NULL during this callback. See <a href="http://www.openssl.org/docs/ssl/SSL_CTX_set_verify.html">http://www.openssl.org/docs/ssl/SSL_CTX_set_verify.html</a> to understand more detail about the OpenSSL callback that generates this libwebsockets callback and the meanings of the arguments passed. In this callback, user is the x509_ctx, in is the ssl pointer and len is preverify_ok Notice that this callback maintains libwebsocket return conventions, return 0 to mean the cert is OK or 1 to fail it. This also means that if you don't handle this callback then the default callback action of returning 0 allows the client certificates. </p>
+</td></tr>
+<tr><td class="fieldname"><a class="anchor" id="ggad62860e19975ba4c4af401c3cdb6abf7a909cc2a7018864b0b71abacc4058fd8f"></a>LWS_CALLBACK_CLIENT_APPEND_HANDSHAKE_HEADER </td><td class="fielddoc">
+<p>this callback happens when a client handshake is being compiled. user is NULL, in is a char **, it's pointing to a char * which holds the next location in the header buffer where you can add headers, and len is the remaining space in the header buffer, which is typically some hundreds of bytes. So, to add a canned cookie, your handler code might look similar to: </p><pre class="fragment"> char **p = (char **)in;
+
+ if (len < 100)
+ return 1;
+
+ *p += sprintf(*p, "Cookie: a=b\x0d\x0a");
+
+ return 0;
+</pre><p>Notice if you add anything, you just have to take care about the CRLF on the line you added. Obviously this callback is optional, if you don't handle it everything is fine.</p>
+<p>Notice the callback is coming to protocols[0] all the time, because there is no specific protocol negotiated yet. </p>
+</td></tr>
+<tr><td class="fieldname"><a class="anchor" id="ggad62860e19975ba4c4af401c3cdb6abf7a390da3639296660a78cc1a5dcb19037e"></a>LWS_CALLBACK_CONFIRM_EXTENSION_OKAY </td><td class="fielddoc">
+<p>When the server handshake code sees that it does support a requested extension, before accepting the extension by additing to the list sent back to the client it gives this callback just to check that it's okay to use that extension. It calls back to the requested protocol and with in being the extension name, len is 0 and user is valid. Note though at this time the ESTABLISHED callback hasn't happened yet so if you initialize user content there, user content during this callback might not be useful for anything. Notice this callback comes to protocols[0]. </p>
+</td></tr>
+<tr><td class="fieldname"><a class="anchor" id="ggad62860e19975ba4c4af401c3cdb6abf7a1ce5b22039ca37ee224d00047596ea46"></a>LWS_CALLBACK_CLIENT_CONFIRM_EXTENSION_SUPPORTED </td><td class="fielddoc">
+<p>When a client connection is being prepared to start a handshake to a server, each supported extension is checked with protocols[0] callback with this reason, giving the user code a chance to suppress the claim to support that extension by returning non-zero. If unhandled, by default 0 will be returned and the extension support included in the header to the server. Notice this callback comes to protocols[0]. </p>
+</td></tr>
+<tr><td class="fieldname"><a class="anchor" id="ggad62860e19975ba4c4af401c3cdb6abf7ad5d34583e3556e153eda91620b48cc49"></a>LWS_CALLBACK_PROTOCOL_INIT </td><td class="fielddoc">
+<p>One-time call per protocol, per-vhost using it, so it can do initial setup / allocations etc </p>
+</td></tr>
+<tr><td class="fieldname"><a class="anchor" id="ggad62860e19975ba4c4af401c3cdb6abf7a54269ca88508e6efd3afdb9d360a9caa"></a>LWS_CALLBACK_PROTOCOL_DESTROY </td><td class="fielddoc">
+<p>One-time call per protocol, per-vhost using it, indicating this protocol won't get used at all after this callback, the vhost is getting destroyed. Take the opportunity to deallocate everything that was allocated by the protocol. </p>
+</td></tr>
+<tr><td class="fieldname"><a class="anchor" id="ggad62860e19975ba4c4af401c3cdb6abf7afd8fd77a1cc9405fcb4f26915d7f2d01"></a>LWS_CALLBACK_WSI_CREATE </td><td class="fielddoc">
+<p>outermost (earliest) wsi create notification to protocols[0] </p>
+</td></tr>
+<tr><td class="fieldname"><a class="anchor" id="ggad62860e19975ba4c4af401c3cdb6abf7aca834dc035b7f7486f9ce40fde54fe9e"></a>LWS_CALLBACK_WSI_DESTROY </td><td class="fielddoc">
+<p>outermost (latest) wsi destroy notification to protocols[0] </p>
+</td></tr>
+<tr><td class="fieldname"><a class="anchor" id="ggad62860e19975ba4c4af401c3cdb6abf7adfb41c92e2522712207ef7f2462b5e34"></a>LWS_CALLBACK_GET_THREAD_ID </td><td class="fielddoc">
+<p>lws can accept callback when writable requests from other threads, if you implement this callback and return an opaque current thread ID integer. </p>
+</td></tr>
+<tr><td class="fieldname"><a class="anchor" id="ggad62860e19975ba4c4af401c3cdb6abf7ab69783a9fbf2ca71ad70706bda77b412"></a>LWS_CALLBACK_ADD_POLL_FD </td><td class="fielddoc">
+<p>lws normally deals with its poll() or other event loop internally, but in the case you are integrating with another server you will need to have lws sockets share a polling array with the other server. This and the other POLL_FD related callbacks let you put your specialized poll array interface code in the callback for protocol 0, the first protocol you support, usually the HTTP protocol in the serving case. This callback happens when a socket needs to be added to the polling loop: in points to a struct <a class="el" href="structlws__pollargs.html">lws_pollargs</a>; the fd member of the struct is the file descriptor, and events contains the active events</p>
+<p>If you are using the internal lws polling / event loop you can just ignore these callbacks. </p>
+</td></tr>
+<tr><td class="fieldname"><a class="anchor" id="ggad62860e19975ba4c4af401c3cdb6abf7a1df60f314710236f9b53efbf468da768"></a>LWS_CALLBACK_DEL_POLL_FD </td><td class="fielddoc">
+<p>This callback happens when a socket descriptor needs to be removed from an external polling array. in is again the struct <a class="el" href="structlws__pollargs.html">lws_pollargs</a> containing the fd member to be removed. If you are using the internal polling loop, you can just ignore it. </p>
+</td></tr>
+<tr><td class="fieldname"><a class="anchor" id="ggad62860e19975ba4c4af401c3cdb6abf7aa87d2e82fffa42c3680c7403ef94216e"></a>LWS_CALLBACK_CHANGE_MODE_POLL_FD </td><td class="fielddoc">
+<p>This callback happens when lws wants to modify the events for a connection. in is the struct <a class="el" href="structlws__pollargs.html">lws_pollargs</a> with the fd to change. The new event mask is in events member and the old mask is in the prev_events member. If you are using the internal polling loop, you can just ignore it. </p>
+</td></tr>
+<tr><td class="fieldname"><a class="anchor" id="ggad62860e19975ba4c4af401c3cdb6abf7a8909732521d379179003d97ab7a05428"></a>LWS_CALLBACK_LOCK_POLL </td><td class="fielddoc">
+<p>These allow the external poll changes driven by lws to participate in an external thread locking scheme around the changes, so the whole thing is threadsafe. These are called around three activities in the library,</p><ul>
+<li>inserting a new wsi in the wsi / fd table (len=1)</li>
+<li>deleting a wsi from the wsi / fd table (len=1)</li>
+<li>changing a wsi's POLLIN/OUT state (len=0) Locking and unlocking external synchronization objects when len == 1 allows external threads to be synchronized against wsi lifecycle changes if it acquires the same lock for the duration of wsi dereference from the other thread context. </li>
+</ul>
+</td></tr>
+<tr><td class="fieldname"><a class="anchor" id="ggad62860e19975ba4c4af401c3cdb6abf7a0e9e3dd667c0c42cdbe1a3d921f4fd79"></a>LWS_CALLBACK_UNLOCK_POLL </td><td class="fielddoc">
+<p>See LWS_CALLBACK_LOCK_POLL, ignore if using lws internal poll </p>
+</td></tr>
+<tr><td class="fieldname"><a class="anchor" id="ggad62860e19975ba4c4af401c3cdb6abf7aa46f705dcf97502e95627ffde614f98b"></a>LWS_CALLBACK_OPENSSL_CONTEXT_REQUIRES_PRIVATE_KEY </td><td class="fielddoc">
+<p>if configured for including OpenSSL support but no private key file has been specified (ssl_private_key_filepath is NULL), this is called to allow the user to set the private key directly via libopenssl and perform further operations if required; this might be useful in situations where the private key is not directly accessible by the OS, for example if it is stored on a smartcard. user is the server's OpenSSL SSL_CTX* </p>
+</td></tr>
+<tr><td class="fieldname"><a class="anchor" id="ggad62860e19975ba4c4af401c3cdb6abf7ac3fc5bbb55e69f90396526287ee84a51"></a>LWS_CALLBACK_WS_PEER_INITIATED_CLOSE </td><td class="fielddoc">
+<p>The peer has sent an unsolicited Close WS packet. in and len are the optional close code (first 2 bytes, network order) and the optional additional information which is not defined in the standard, and may be a string or non-human- readable data. If you return 0 lws will echo the close and then close the connection. If you return nonzero lws will just close the connection. </p>
+</td></tr>
+<tr><td class="fieldname"><a class="anchor" id="ggad62860e19975ba4c4af401c3cdb6abf7a982579753e70e59a9ea13ce628ac891a"></a>LWS_CALLBACK_USER </td><td class="fielddoc">
+<p>user code can use any including / above without fear of clashes </p>
+</td></tr>
+</table>
+<div class="fragment"><div class="line"><a name="l00571"></a><span class="lineno"> 571</span>  {</div><div class="line"><a name="l00572"></a><span class="lineno"> 572</span>  <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a24d39bf1cfc0bad9d92da9ac1717e439">LWS_CALLBACK_ESTABLISHED</a> = 0,</div><div class="line"><a name="l00576"></a><span class="lineno"> 576</span>  <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ad8c6207b0c4e732f3d507f0fb79370e8">LWS_CALLBACK_CLIENT_CONNECTION_ERROR</a> = 1,</div><div class="line"><a name="l00580"></a><span class="lineno"> 580</span>  <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aa536e574a642ff3ab9e12bff7ba2c6a2">LWS_CALLBACK_CLIENT_FILTER_PRE_ESTABLISH</a> = 2,</div><div class="line"><a name="l00587"></a><span class="lineno"> 587</span>  <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a7e12418eec9bce85735e6460176ab604">LWS_CALLBACK_CLIENT_ESTABLISHED</a> = 3,</div><div class="line"><a name="l00590"></a><span class="lineno"> 590</span>  <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a48a9590e5e18c7920282e094a0bfd9d8">LWS_CALLBACK_CLOSED</a> = 4,</div><div class="line"><a name="l00592"></a><span class="lineno"> 592</span>  <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a838b18d255c1b94a533287ba302a2eba">LWS_CALLBACK_CLOSED_HTTP</a> = 5,</div><div class="line"><a name="l00594"></a><span class="lineno"> 594</span>  <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a492c1b1c0ac0ed980042ee732fe2990c">LWS_CALLBACK_RECEIVE</a> = 6,</div><div class="line"><a name="l00598"></a><span class="lineno"> 598</span>  <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a2db02fc6e1c17ab62b52109d1aa9d738">LWS_CALLBACK_RECEIVE_PONG</a> = 7,</div><div class="line"><a name="l00600"></a><span class="lineno"> 600</span>  <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7abbbe7a0a67c5866ca9109d46823fc5b1">LWS_CALLBACK_CLIENT_RECEIVE</a> = 8,</div><div class="line"><a name="l00603"></a><span class="lineno"> 603</span>  <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a136a7cec11c3afd13245623bd84e76c9">LWS_CALLBACK_CLIENT_RECEIVE_PONG</a> = 9,</div><div class="line"><a name="l00605"></a><span class="lineno"> 605</span>  <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a8e8b2e6dbeac76d8d126947d2166a514">LWS_CALLBACK_CLIENT_WRITEABLE</a> = 10,</div><div class="line"><a name="l00613"></a><span class="lineno"> 613</span>  <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a7ec8e2e9557ee02a4fc9f7dec7e2babc">LWS_CALLBACK_SERVER_WRITEABLE</a> = 11,</div><div class="line"><a name="l00615"></a><span class="lineno"> 615</span>  <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ae8d1de0bb56e03aa58cb4d44b18edd2e">LWS_CALLBACK_HTTP</a> = 12,</div><div class="line"><a name="l00629"></a><span class="lineno"> 629</span>  <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ac4c68e00efcf1ff7bda7ada462aff8ae">LWS_CALLBACK_HTTP_BODY</a> = 13,</div><div class="line"><a name="l00632"></a><span class="lineno"> 632</span>  <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a2fce9a8608220f32abbf1422a5498804">LWS_CALLBACK_HTTP_BODY_COMPLETION</a> = 14,</div><div class="line"><a name="l00634"></a><span class="lineno"> 634</span>  <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aa627548e1296e654fcfab463ec3c9587">LWS_CALLBACK_HTTP_FILE_COMPLETION</a> = 15,</div><div class="line"><a name="l00636"></a><span class="lineno"> 636</span>  <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7afedadfb3cde37a8ea4c84ed535f26d09">LWS_CALLBACK_HTTP_WRITEABLE</a> = 16,</div><div class="line"><a name="l00638"></a><span class="lineno"> 638</span>  <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a026502768778b8d79d62dd0fe4375fc6">LWS_CALLBACK_FILTER_NETWORK_CONNECTION</a> = 17,</div><div class="line"><a name="l00649"></a><span class="lineno"> 649</span>  <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a75199176c82c1a56e4a6bbf1cc30c12c">LWS_CALLBACK_FILTER_HTTP_CONNECTION</a> = 18,</div><div class="line"><a name="l00661"></a><span class="lineno"> 661</span>  <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ae9734e1d7af2abf291665ce9e4a728d3">LWS_CALLBACK_SERVER_NEW_CLIENT_INSTANTIATED</a> = 19,</div><div class="line"><a name="l00669"></a><span class="lineno"> 669</span>  <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7accd8753672d319a30b4b4c2fb775e84d">LWS_CALLBACK_FILTER_PROTOCOL_CONNECTION</a> = 20,</div><div class="line"><a name="l00681"></a><span class="lineno"> 681</span>  <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ae4986291b7a810fe290851d73bebeb1c">LWS_CALLBACK_OPENSSL_LOAD_EXTRA_CLIENT_VERIFY_CERTS</a> = 21,</div><div class="line"><a name="l00688"></a><span class="lineno"> 688</span>  <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a06006e98d27e1e884364d88317f83493">LWS_CALLBACK_OPENSSL_LOAD_EXTRA_SERVER_VERIFY_CERTS</a> = 22,</div><div class="line"><a name="l00694"></a><span class="lineno"> 694</span>  <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ae5ad65d779b7eab32ab67ceff91a3bac">LWS_CALLBACK_OPENSSL_PERFORM_CLIENT_CERT_VERIFICATION</a> = 23,</div><div class="line"><a name="l00712"></a><span class="lineno"> 712</span>  <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a909cc2a7018864b0b71abacc4058fd8f">LWS_CALLBACK_CLIENT_APPEND_HANDSHAKE_HEADER</a> = 24,</div><div class="line"><a name="l00736"></a><span class="lineno"> 736</span>  <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a390da3639296660a78cc1a5dcb19037e">LWS_CALLBACK_CONFIRM_EXTENSION_OKAY</a> = 25,</div><div class="line"><a name="l00747"></a><span class="lineno"> 747</span>  <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a1ce5b22039ca37ee224d00047596ea46">LWS_CALLBACK_CLIENT_CONFIRM_EXTENSION_SUPPORTED</a> = 26,</div><div class="line"><a name="l00756"></a><span class="lineno"> 756</span>  <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ad5d34583e3556e153eda91620b48cc49">LWS_CALLBACK_PROTOCOL_INIT</a> = 27,</div><div class="line"><a name="l00759"></a><span class="lineno"> 759</span>  <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a54269ca88508e6efd3afdb9d360a9caa">LWS_CALLBACK_PROTOCOL_DESTROY</a> = 28,</div><div class="line"><a name="l00764"></a><span class="lineno"> 764</span>  <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7afd8fd77a1cc9405fcb4f26915d7f2d01">LWS_CALLBACK_WSI_CREATE</a> = 29,</div><div class="line"><a name="l00766"></a><span class="lineno"> 766</span>  <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aca834dc035b7f7486f9ce40fde54fe9e">LWS_CALLBACK_WSI_DESTROY</a> = 30,</div><div class="line"><a name="l00768"></a><span class="lineno"> 768</span>  <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7adfb41c92e2522712207ef7f2462b5e34">LWS_CALLBACK_GET_THREAD_ID</a> = 31,</div><div class="line"><a name="l00773"></a><span class="lineno"> 773</span>  <span class="comment">/* external poll() management support */</span></div><div class="line"><a name="l00774"></a><span class="lineno"> 774</span>  <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ab69783a9fbf2ca71ad70706bda77b412">LWS_CALLBACK_ADD_POLL_FD</a> = 32,</div><div class="line"><a name="l00790"></a><span class="lineno"> 790</span>  <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a1df60f314710236f9b53efbf468da768">LWS_CALLBACK_DEL_POLL_FD</a> = 33,</div><div class="line"><a name="l00796"></a><span class="lineno"> 796</span>  <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aa87d2e82fffa42c3680c7403ef94216e">LWS_CALLBACK_CHANGE_MODE_POLL_FD</a> = 34,</div><div class="line"><a name="l00804"></a><span class="lineno"> 804</span>  <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a8909732521d379179003d97ab7a05428">LWS_CALLBACK_LOCK_POLL</a> = 35,</div><div class="line"><a name="l00816"></a><span class="lineno"> 816</span>  <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a0e9e3dd667c0c42cdbe1a3d921f4fd79">LWS_CALLBACK_UNLOCK_POLL</a> = 36,</div><div class="line"><a name="l00819"></a><span class="lineno"> 819</span>  <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aa46f705dcf97502e95627ffde614f98b">LWS_CALLBACK_OPENSSL_CONTEXT_REQUIRES_PRIVATE_KEY</a> = 37,</div><div class="line"><a name="l00827"></a><span class="lineno"> 827</span>  <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ac3fc5bbb55e69f90396526287ee84a51">LWS_CALLBACK_WS_PEER_INITIATED_CLOSE</a> = 38,</div><div class="line"><a name="l00836"></a><span class="lineno"> 836</span>  LWS_CALLBACK_WS_EXT_DEFAULTS = 39,</div><div class="line"><a name="l00839"></a><span class="lineno"> 839</span>  LWS_CALLBACK_CGI = 40,</div><div class="line"><a name="l00841"></a><span class="lineno"> 841</span>  LWS_CALLBACK_CGI_TERMINATED = 41,</div><div class="line"><a name="l00843"></a><span class="lineno"> 843</span>  LWS_CALLBACK_CGI_STDIN_DATA = 42,</div><div class="line"><a name="l00845"></a><span class="lineno"> 845</span>  LWS_CALLBACK_CGI_STDIN_COMPLETED = 43,</div><div class="line"><a name="l00847"></a><span class="lineno"> 847</span>  LWS_CALLBACK_ESTABLISHED_CLIENT_HTTP = 44,</div><div class="line"><a name="l00849"></a><span class="lineno"> 849</span>  LWS_CALLBACK_CLOSED_CLIENT_HTTP = 45,</div><div class="line"><a name="l00851"></a><span class="lineno"> 851</span>  LWS_CALLBACK_RECEIVE_CLIENT_HTTP = 46,</div><div class="line"><a name="l00853"></a><span class="lineno"> 853</span>  LWS_CALLBACK_COMPLETED_CLIENT_HTTP = 47,</div><div class="line"><a name="l00855"></a><span class="lineno"> 855</span>  LWS_CALLBACK_RECEIVE_CLIENT_HTTP_READ = 48,</div><div class="line"><a name="l00857"></a><span class="lineno"> 857</span>  LWS_CALLBACK_HTTP_BIND_PROTOCOL = 49,</div><div class="line"><a name="l00859"></a><span class="lineno"> 859</span>  LWS_CALLBACK_HTTP_DROP_PROTOCOL = 50,</div><div class="line"><a name="l00861"></a><span class="lineno"> 861</span>  LWS_CALLBACK_CHECK_ACCESS_RIGHTS = 51,</div><div class="line"><a name="l00863"></a><span class="lineno"> 863</span>  LWS_CALLBACK_PROCESS_HTML = 52,</div><div class="line"><a name="l00865"></a><span class="lineno"> 865</span>  LWS_CALLBACK_ADD_HEADERS = 53,</div><div class="line"><a name="l00867"></a><span class="lineno"> 867</span>  LWS_CALLBACK_SESSION_INFO = 54,</div><div class="line"><a name="l00870"></a><span class="lineno"> 870</span>  LWS_CALLBACK_GS_EVENT = 55,</div><div class="line"><a name="l00873"></a><span class="lineno"> 873</span>  <span class="comment">/****** add new things just above ---^ ******/</span></div><div class="line"><a name="l00874"></a><span class="lineno"> 874</span> </div><div class="line"><a name="l00875"></a><span class="lineno"> 875</span>  <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a982579753e70e59a9ea13ce628ac891a">LWS_CALLBACK_USER</a> = 1000,</div><div class="line"><a name="l00877"></a><span class="lineno"> 877</span> };</div><div class="ttc" id="group__usercb_html_ggad62860e19975ba4c4af401c3cdb6abf7a026502768778b8d79d62dd0fe4375fc6"><div class="ttname"><a href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a026502768778b8d79d62dd0fe4375fc6">LWS_CALLBACK_FILTER_NETWORK_CONNECTION</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:638</div></div>
+<div class="ttc" id="group__usercb_html_ggad62860e19975ba4c4af401c3cdb6abf7aca834dc035b7f7486f9ce40fde54fe9e"><div class="ttname"><a href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aca834dc035b7f7486f9ce40fde54fe9e">LWS_CALLBACK_WSI_DESTROY</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:766</div></div>
+<div class="ttc" id="group__usercb_html_ggad62860e19975ba4c4af401c3cdb6abf7ae4986291b7a810fe290851d73bebeb1c"><div class="ttname"><a href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ae4986291b7a810fe290851d73bebeb1c">LWS_CALLBACK_OPENSSL_LOAD_EXTRA_CLIENT_VERIFY_CERTS</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:681</div></div>
+<div class="ttc" id="group__usercb_html_ggad62860e19975ba4c4af401c3cdb6abf7afd8fd77a1cc9405fcb4f26915d7f2d01"><div class="ttname"><a href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7afd8fd77a1cc9405fcb4f26915d7f2d01">LWS_CALLBACK_WSI_CREATE</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:764</div></div>
+<div class="ttc" id="group__usercb_html_ggad62860e19975ba4c4af401c3cdb6abf7accd8753672d319a30b4b4c2fb775e84d"><div class="ttname"><a href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7accd8753672d319a30b4b4c2fb775e84d">LWS_CALLBACK_FILTER_PROTOCOL_CONNECTION</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:669</div></div>
+<div class="ttc" id="group__usercb_html_ggad62860e19975ba4c4af401c3cdb6abf7ae8d1de0bb56e03aa58cb4d44b18edd2e"><div class="ttname"><a href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ae8d1de0bb56e03aa58cb4d44b18edd2e">LWS_CALLBACK_HTTP</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:615</div></div>
+<div class="ttc" id="group__usercb_html_ggad62860e19975ba4c4af401c3cdb6abf7a75199176c82c1a56e4a6bbf1cc30c12c"><div class="ttname"><a href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a75199176c82c1a56e4a6bbf1cc30c12c">LWS_CALLBACK_FILTER_HTTP_CONNECTION</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:649</div></div>
+<div class="ttc" id="group__usercb_html_ggad62860e19975ba4c4af401c3cdb6abf7a1df60f314710236f9b53efbf468da768"><div class="ttname"><a href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a1df60f314710236f9b53efbf468da768">LWS_CALLBACK_DEL_POLL_FD</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:790</div></div>
+<div class="ttc" id="group__usercb_html_ggad62860e19975ba4c4af401c3cdb6abf7a390da3639296660a78cc1a5dcb19037e"><div class="ttname"><a href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a390da3639296660a78cc1a5dcb19037e">LWS_CALLBACK_CONFIRM_EXTENSION_OKAY</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:736</div></div>
+<div class="ttc" id="group__usercb_html_ggad62860e19975ba4c4af401c3cdb6abf7ac4c68e00efcf1ff7bda7ada462aff8ae"><div class="ttname"><a href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ac4c68e00efcf1ff7bda7ada462aff8ae">LWS_CALLBACK_HTTP_BODY</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:629</div></div>
+<div class="ttc" id="group__usercb_html_ggad62860e19975ba4c4af401c3cdb6abf7ac3fc5bbb55e69f90396526287ee84a51"><div class="ttname"><a href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ac3fc5bbb55e69f90396526287ee84a51">LWS_CALLBACK_WS_PEER_INITIATED_CLOSE</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:827</div></div>
+<div class="ttc" id="group__usercb_html_ggad62860e19975ba4c4af401c3cdb6abf7aa46f705dcf97502e95627ffde614f98b"><div class="ttname"><a href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aa46f705dcf97502e95627ffde614f98b">LWS_CALLBACK_OPENSSL_CONTEXT_REQUIRES_PRIVATE_KEY</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:819</div></div>
+<div class="ttc" id="group__usercb_html_ggad62860e19975ba4c4af401c3cdb6abf7a0e9e3dd667c0c42cdbe1a3d921f4fd79"><div class="ttname"><a href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a0e9e3dd667c0c42cdbe1a3d921f4fd79">LWS_CALLBACK_UNLOCK_POLL</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:816</div></div>
+<div class="ttc" id="group__usercb_html_ggad62860e19975ba4c4af401c3cdb6abf7a1ce5b22039ca37ee224d00047596ea46"><div class="ttname"><a href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a1ce5b22039ca37ee224d00047596ea46">LWS_CALLBACK_CLIENT_CONFIRM_EXTENSION_SUPPORTED</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:747</div></div>
+<div class="ttc" id="group__usercb_html_ggad62860e19975ba4c4af401c3cdb6abf7a48a9590e5e18c7920282e094a0bfd9d8"><div class="ttname"><a href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a48a9590e5e18c7920282e094a0bfd9d8">LWS_CALLBACK_CLOSED</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:590</div></div>
+<div class="ttc" id="group__usercb_html_ggad62860e19975ba4c4af401c3cdb6abf7adfb41c92e2522712207ef7f2462b5e34"><div class="ttname"><a href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7adfb41c92e2522712207ef7f2462b5e34">LWS_CALLBACK_GET_THREAD_ID</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:768</div></div>
+<div class="ttc" id="group__usercb_html_ggad62860e19975ba4c4af401c3cdb6abf7ad5d34583e3556e153eda91620b48cc49"><div class="ttname"><a href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ad5d34583e3556e153eda91620b48cc49">LWS_CALLBACK_PROTOCOL_INIT</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:756</div></div>
+<div class="ttc" id="group__usercb_html_ggad62860e19975ba4c4af401c3cdb6abf7a7e12418eec9bce85735e6460176ab604"><div class="ttname"><a href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a7e12418eec9bce85735e6460176ab604">LWS_CALLBACK_CLIENT_ESTABLISHED</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:587</div></div>
+<div class="ttc" id="group__usercb_html_ggad62860e19975ba4c4af401c3cdb6abf7ab69783a9fbf2ca71ad70706bda77b412"><div class="ttname"><a href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ab69783a9fbf2ca71ad70706bda77b412">LWS_CALLBACK_ADD_POLL_FD</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:774</div></div>
+<div class="ttc" id="group__usercb_html_ggad62860e19975ba4c4af401c3cdb6abf7aa536e574a642ff3ab9e12bff7ba2c6a2"><div class="ttname"><a href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aa536e574a642ff3ab9e12bff7ba2c6a2">LWS_CALLBACK_CLIENT_FILTER_PRE_ESTABLISH</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:580</div></div>
+<div class="ttc" id="group__usercb_html_ggad62860e19975ba4c4af401c3cdb6abf7ae9734e1d7af2abf291665ce9e4a728d3"><div class="ttname"><a href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ae9734e1d7af2abf291665ce9e4a728d3">LWS_CALLBACK_SERVER_NEW_CLIENT_INSTANTIATED</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:661</div></div>
+<div class="ttc" id="group__usercb_html_ggad62860e19975ba4c4af401c3cdb6abf7a54269ca88508e6efd3afdb9d360a9caa"><div class="ttname"><a href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a54269ca88508e6efd3afdb9d360a9caa">LWS_CALLBACK_PROTOCOL_DESTROY</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:759</div></div>
+<div class="ttc" id="group__usercb_html_ggad62860e19975ba4c4af401c3cdb6abf7aa87d2e82fffa42c3680c7403ef94216e"><div class="ttname"><a href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aa87d2e82fffa42c3680c7403ef94216e">LWS_CALLBACK_CHANGE_MODE_POLL_FD</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:796</div></div>
+<div class="ttc" id="group__usercb_html_ggad62860e19975ba4c4af401c3cdb6abf7afedadfb3cde37a8ea4c84ed535f26d09"><div class="ttname"><a href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7afedadfb3cde37a8ea4c84ed535f26d09">LWS_CALLBACK_HTTP_WRITEABLE</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:636</div></div>
+<div class="ttc" id="group__usercb_html_ggad62860e19975ba4c4af401c3cdb6abf7a2fce9a8608220f32abbf1422a5498804"><div class="ttname"><a href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a2fce9a8608220f32abbf1422a5498804">LWS_CALLBACK_HTTP_BODY_COMPLETION</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:632</div></div>
+<div class="ttc" id="group__usercb_html_ggad62860e19975ba4c4af401c3cdb6abf7a24d39bf1cfc0bad9d92da9ac1717e439"><div class="ttname"><a href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a24d39bf1cfc0bad9d92da9ac1717e439">LWS_CALLBACK_ESTABLISHED</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:572</div></div>
+<div class="ttc" id="group__usercb_html_ggad62860e19975ba4c4af401c3cdb6abf7ae5ad65d779b7eab32ab67ceff91a3bac"><div class="ttname"><a href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ae5ad65d779b7eab32ab67ceff91a3bac">LWS_CALLBACK_OPENSSL_PERFORM_CLIENT_CERT_VERIFICATION</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:694</div></div>
+<div class="ttc" id="group__usercb_html_ggad62860e19975ba4c4af401c3cdb6abf7abbbe7a0a67c5866ca9109d46823fc5b1"><div class="ttname"><a href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7abbbe7a0a67c5866ca9109d46823fc5b1">LWS_CALLBACK_CLIENT_RECEIVE</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:600</div></div>
+<div class="ttc" id="group__usercb_html_ggad62860e19975ba4c4af401c3cdb6abf7aa627548e1296e654fcfab463ec3c9587"><div class="ttname"><a href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aa627548e1296e654fcfab463ec3c9587">LWS_CALLBACK_HTTP_FILE_COMPLETION</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:634</div></div>
+<div class="ttc" id="group__usercb_html_ggad62860e19975ba4c4af401c3cdb6abf7a909cc2a7018864b0b71abacc4058fd8f"><div class="ttname"><a href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a909cc2a7018864b0b71abacc4058fd8f">LWS_CALLBACK_CLIENT_APPEND_HANDSHAKE_HEADER</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:712</div></div>
+<div class="ttc" id="group__usercb_html_ggad62860e19975ba4c4af401c3cdb6abf7a2db02fc6e1c17ab62b52109d1aa9d738"><div class="ttname"><a href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a2db02fc6e1c17ab62b52109d1aa9d738">LWS_CALLBACK_RECEIVE_PONG</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:598</div></div>
+<div class="ttc" id="group__usercb_html_ggad62860e19975ba4c4af401c3cdb6abf7a136a7cec11c3afd13245623bd84e76c9"><div class="ttname"><a href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a136a7cec11c3afd13245623bd84e76c9">LWS_CALLBACK_CLIENT_RECEIVE_PONG</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:603</div></div>
+<div class="ttc" id="group__usercb_html_ggad62860e19975ba4c4af401c3cdb6abf7a06006e98d27e1e884364d88317f83493"><div class="ttname"><a href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a06006e98d27e1e884364d88317f83493">LWS_CALLBACK_OPENSSL_LOAD_EXTRA_SERVER_VERIFY_CERTS</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:688</div></div>
+<div class="ttc" id="group__usercb_html_ggad62860e19975ba4c4af401c3cdb6abf7ad8c6207b0c4e732f3d507f0fb79370e8"><div class="ttname"><a href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ad8c6207b0c4e732f3d507f0fb79370e8">LWS_CALLBACK_CLIENT_CONNECTION_ERROR</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:576</div></div>
+<div class="ttc" id="group__usercb_html_ggad62860e19975ba4c4af401c3cdb6abf7a7ec8e2e9557ee02a4fc9f7dec7e2babc"><div class="ttname"><a href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a7ec8e2e9557ee02a4fc9f7dec7e2babc">LWS_CALLBACK_SERVER_WRITEABLE</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:613</div></div>
+<div class="ttc" id="group__usercb_html_ggad62860e19975ba4c4af401c3cdb6abf7a982579753e70e59a9ea13ce628ac891a"><div class="ttname"><a href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a982579753e70e59a9ea13ce628ac891a">LWS_CALLBACK_USER</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:875</div></div>
+<div class="ttc" id="group__usercb_html_ggad62860e19975ba4c4af401c3cdb6abf7a838b18d255c1b94a533287ba302a2eba"><div class="ttname"><a href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a838b18d255c1b94a533287ba302a2eba">LWS_CALLBACK_CLOSED_HTTP</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:592</div></div>
+<div class="ttc" id="group__usercb_html_ggad62860e19975ba4c4af401c3cdb6abf7a492c1b1c0ac0ed980042ee732fe2990c"><div class="ttname"><a href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a492c1b1c0ac0ed980042ee732fe2990c">LWS_CALLBACK_RECEIVE</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:594</div></div>
+<div class="ttc" id="group__usercb_html_ggad62860e19975ba4c4af401c3cdb6abf7a8e8b2e6dbeac76d8d126947d2166a514"><div class="ttname"><a href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a8e8b2e6dbeac76d8d126947d2166a514">LWS_CALLBACK_CLIENT_WRITEABLE</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:605</div></div>
+<div class="ttc" id="group__usercb_html_ggad62860e19975ba4c4af401c3cdb6abf7a8909732521d379179003d97ab7a05428"><div class="ttname"><a href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a8909732521d379179003d97ab7a05428">LWS_CALLBACK_LOCK_POLL</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:804</div></div>
+</div><!-- fragment -->
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">Generated by
+ <a href="http://www.doxygen.org/index.html">
+ <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.11 </li>
+ </ul>
+</div>
+</body>
+</html>
--- /dev/null
+var group__usercb =
+[
+ [ "lws_callback_function", "group__usercb.html#gad4fcb82e68d60ffacca61a3f783a0a2f", null ],
+ [ "lws_callback_reasons", "group__usercb.html#gad62860e19975ba4c4af401c3cdb6abf7", [
+ [ "LWS_CALLBACK_ESTABLISHED", "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a24d39bf1cfc0bad9d92da9ac1717e439", null ],
+ [ "LWS_CALLBACK_CLIENT_CONNECTION_ERROR", "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ad8c6207b0c4e732f3d507f0fb79370e8", null ],
+ [ "LWS_CALLBACK_CLIENT_FILTER_PRE_ESTABLISH", "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aa536e574a642ff3ab9e12bff7ba2c6a2", null ],
+ [ "LWS_CALLBACK_CLIENT_ESTABLISHED", "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a7e12418eec9bce85735e6460176ab604", null ],
+ [ "LWS_CALLBACK_CLOSED", "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a48a9590e5e18c7920282e094a0bfd9d8", null ],
+ [ "LWS_CALLBACK_CLOSED_HTTP", "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a838b18d255c1b94a533287ba302a2eba", null ],
+ [ "LWS_CALLBACK_RECEIVE", "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a492c1b1c0ac0ed980042ee732fe2990c", null ],
+ [ "LWS_CALLBACK_RECEIVE_PONG", "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a2db02fc6e1c17ab62b52109d1aa9d738", null ],
+ [ "LWS_CALLBACK_CLIENT_RECEIVE", "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7abbbe7a0a67c5866ca9109d46823fc5b1", null ],
+ [ "LWS_CALLBACK_CLIENT_RECEIVE_PONG", "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a136a7cec11c3afd13245623bd84e76c9", null ],
+ [ "LWS_CALLBACK_CLIENT_WRITEABLE", "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a8e8b2e6dbeac76d8d126947d2166a514", null ],
+ [ "LWS_CALLBACK_SERVER_WRITEABLE", "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a7ec8e2e9557ee02a4fc9f7dec7e2babc", null ],
+ [ "LWS_CALLBACK_HTTP", "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ae8d1de0bb56e03aa58cb4d44b18edd2e", null ],
+ [ "LWS_CALLBACK_HTTP_BODY", "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ac4c68e00efcf1ff7bda7ada462aff8ae", null ],
+ [ "LWS_CALLBACK_HTTP_BODY_COMPLETION", "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a2fce9a8608220f32abbf1422a5498804", null ],
+ [ "LWS_CALLBACK_HTTP_FILE_COMPLETION", "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aa627548e1296e654fcfab463ec3c9587", null ],
+ [ "LWS_CALLBACK_HTTP_WRITEABLE", "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7afedadfb3cde37a8ea4c84ed535f26d09", null ],
+ [ "LWS_CALLBACK_FILTER_NETWORK_CONNECTION", "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a026502768778b8d79d62dd0fe4375fc6", null ],
+ [ "LWS_CALLBACK_FILTER_HTTP_CONNECTION", "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a75199176c82c1a56e4a6bbf1cc30c12c", null ],
+ [ "LWS_CALLBACK_SERVER_NEW_CLIENT_INSTANTIATED", "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ae9734e1d7af2abf291665ce9e4a728d3", null ],
+ [ "LWS_CALLBACK_FILTER_PROTOCOL_CONNECTION", "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7accd8753672d319a30b4b4c2fb775e84d", null ],
+ [ "LWS_CALLBACK_OPENSSL_LOAD_EXTRA_CLIENT_VERIFY_CERTS", "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ae4986291b7a810fe290851d73bebeb1c", null ],
+ [ "LWS_CALLBACK_OPENSSL_LOAD_EXTRA_SERVER_VERIFY_CERTS", "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a06006e98d27e1e884364d88317f83493", null ],
+ [ "LWS_CALLBACK_OPENSSL_PERFORM_CLIENT_CERT_VERIFICATION", "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ae5ad65d779b7eab32ab67ceff91a3bac", null ],
+ [ "LWS_CALLBACK_CLIENT_APPEND_HANDSHAKE_HEADER", "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a909cc2a7018864b0b71abacc4058fd8f", null ],
+ [ "LWS_CALLBACK_CONFIRM_EXTENSION_OKAY", "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a390da3639296660a78cc1a5dcb19037e", null ],
+ [ "LWS_CALLBACK_CLIENT_CONFIRM_EXTENSION_SUPPORTED", "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a1ce5b22039ca37ee224d00047596ea46", null ],
+ [ "LWS_CALLBACK_PROTOCOL_INIT", "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ad5d34583e3556e153eda91620b48cc49", null ],
+ [ "LWS_CALLBACK_PROTOCOL_DESTROY", "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a54269ca88508e6efd3afdb9d360a9caa", null ],
+ [ "LWS_CALLBACK_WSI_CREATE", "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7afd8fd77a1cc9405fcb4f26915d7f2d01", null ],
+ [ "LWS_CALLBACK_WSI_DESTROY", "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aca834dc035b7f7486f9ce40fde54fe9e", null ],
+ [ "LWS_CALLBACK_GET_THREAD_ID", "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7adfb41c92e2522712207ef7f2462b5e34", null ],
+ [ "LWS_CALLBACK_ADD_POLL_FD", "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ab69783a9fbf2ca71ad70706bda77b412", null ],
+ [ "LWS_CALLBACK_DEL_POLL_FD", "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a1df60f314710236f9b53efbf468da768", null ],
+ [ "LWS_CALLBACK_CHANGE_MODE_POLL_FD", "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aa87d2e82fffa42c3680c7403ef94216e", null ],
+ [ "LWS_CALLBACK_LOCK_POLL", "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a8909732521d379179003d97ab7a05428", null ],
+ [ "LWS_CALLBACK_UNLOCK_POLL", "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a0e9e3dd667c0c42cdbe1a3d921f4fd79", null ],
+ [ "LWS_CALLBACK_OPENSSL_CONTEXT_REQUIRES_PRIVATE_KEY", "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aa46f705dcf97502e95627ffde614f98b", null ],
+ [ "LWS_CALLBACK_WS_PEER_INITIATED_CLOSE", "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ac3fc5bbb55e69f90396526287ee84a51", null ],
+ [ "LWS_CALLBACK_USER", "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a982579753e70e59a9ea13ce628ac891a", null ]
+ ] ]
+];
\ No newline at end of file
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.11"/>
+<title>libwebsockets: libuv helpers</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="libwebsockets.org-logo.png"/></td>
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname">libwebsockets
+ </div>
+ <div id="projectbrief">Lightweight C library for HTML5 websockets</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.11 -->
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main Page</span></a></li>
+ <li><a href="pages.html"><span>Related Pages</span></a></li>
+ <li class="current"><a href="modules.html"><span>Modules</span></a></li>
+ <li><a href="annotated.html"><span>Data Structures</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('group__uv.html','');});
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">libuv helpers</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ga99099e045993383f251a8026e1e40414"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ga99099e045993383f251a8026e1e40414"></a>
+LWS_VISIBLE LWS_EXTERN int </td><td class="memItemRight" valign="bottom"><b>lws_uv_sigint_cfg</b> (struct lws_context *context, int use_uv_sigint, uv_signal_cb cb)</td></tr>
+<tr class="separator:ga99099e045993383f251a8026e1e40414"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga097c89497824d4de225a85a00661fc89"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ga097c89497824d4de225a85a00661fc89"></a>
+LWS_VISIBLE LWS_EXTERN void </td><td class="memItemRight" valign="bottom"><b>lws_libuv_run</b> (const struct lws_context *context, int tsi)</td></tr>
+<tr class="separator:ga097c89497824d4de225a85a00661fc89"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga3c75cd6ec3f80fc0a0c8ead4c4e71a15"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ga3c75cd6ec3f80fc0a0c8ead4c4e71a15"></a>
+LWS_VISIBLE LWS_EXTERN void </td><td class="memItemRight" valign="bottom"><b>lws_libuv_stop</b> (struct lws_context *context)</td></tr>
+<tr class="separator:ga3c75cd6ec3f80fc0a0c8ead4c4e71a15"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:gad85ce3bfc53ff754988d36bf5de39e21"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="gad85ce3bfc53ff754988d36bf5de39e21"></a>
+LWS_VISIBLE LWS_EXTERN int </td><td class="memItemRight" valign="bottom"><b>lws_uv_initloop</b> (struct lws_context *context, uv_loop_t *loop, int tsi)</td></tr>
+<tr class="separator:gad85ce3bfc53ff754988d36bf5de39e21"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:gaa5e3593c94f91910d9d928dfa0c18f6c"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="gaa5e3593c94f91910d9d928dfa0c18f6c"></a>
+LWS_VISIBLE LWS_EXTERN uv_loop_t * </td><td class="memItemRight" valign="bottom"><b>lws_uv_getloop</b> (struct lws_context *context, int tsi)</td></tr>
+<tr class="separator:gaa5e3593c94f91910d9d928dfa0c18f6c"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:gac5f60dba13a45e5d554b4fb7df7b9610"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="gac5f60dba13a45e5d554b4fb7df7b9610"></a>
+LWS_VISIBLE LWS_EXTERN void </td><td class="memItemRight" valign="bottom"><b>lws_uv_sigint_cb</b> (uv_signal_t *watcher, int signum)</td></tr>
+<tr class="separator:gac5f60dba13a45e5d554b4fb7df7b9610"><td class="memSeparator" colspan="2"> </td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<h2>libuv helpers</h2>
+<p>APIs specific to libuv event loop itegration </p>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">Generated by
+ <a href="http://www.doxygen.org/index.html">
+ <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.11 </li>
+ </ul>
+</div>
+</body>
+</html>
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.11"/>
+<title>libwebsockets: Vhost mounts and options</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="libwebsockets.org-logo.png"/></td>
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname">libwebsockets
+ </div>
+ <div id="projectbrief">Lightweight C library for HTML5 websockets</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.11 -->
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main Page</span></a></li>
+ <li><a href="pages.html"><span>Related Pages</span></a></li>
+ <li class="current"><a href="modules.html"><span>Modules</span></a></li>
+ <li><a href="annotated.html"><span>Data Structures</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('group__vhost-mounts.html','');});
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#nested-classes">Data Structures</a> |
+<a href="#enum-members">Enumerations</a> </div>
+ <div class="headertitle">
+<div class="title">Vhost mounts and options<div class="ingroups"><a class="el" href="group__context-and-vhost.html">Context-and-vhost</a></div></div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
+Data Structures</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__protocol__vhost__options.html">lws_protocol_vhost_options</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__http__mount.html">lws_http_mount</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="enum-members"></a>
+Enumerations</h2></td></tr>
+<tr class="memitem:ga31eca18e50cb4357480f2fcad36ff437"><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="group__vhost-mounts.html#ga31eca18e50cb4357480f2fcad36ff437">lws_mount_protocols</a> { <br />
+  <a class="el" href="group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437a1e9f0842b0e85db50fe648ed4ba9a4b0">LWSMPRO_HTTP</a> = 0,
+<a class="el" href="group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437afbd10eb4777517ed1f6bfdcf3b9ea1d1">LWSMPRO_HTTPS</a> = 1,
+<a class="el" href="group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437a42f2361cfe76cd287fa8fcfc502357e2">LWSMPRO_FILE</a> = 2,
+<a class="el" href="group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437a13ab58b01ac6e05f595977f1e0f0db69">LWSMPRO_CGI</a> = 3,
+<br />
+  <a class="el" href="group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437aec137a2434851bd856ceebfb697b9970">LWSMPRO_REDIR_HTTP</a> = 4,
+<a class="el" href="group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437a8894d16316863077dfe530963ca59f67">LWSMPRO_REDIR_HTTPS</a> = 5,
+<a class="el" href="group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437a946a88cf9c852eed2c0317f4115d19da">LWSMPRO_CALLBACK</a> = 6
+<br />
+ }</td></tr>
+<tr class="separator:ga31eca18e50cb4357480f2fcad36ff437"><td class="memSeparator" colspan="2"> </td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<h2>Vhost mounts and options</h2>
+<h2 class="groupheader">Enumeration Type Documentation</h2>
+<a class="anchor" id="ga31eca18e50cb4357480f2fcad36ff437"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">enum <a class="el" href="group__vhost-mounts.html#ga31eca18e50cb4357480f2fcad36ff437">lws_mount_protocols</a></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h.html">lib/libwebsockets.h</a>></code></p>
+<p>enum lws_mount_protocols This specifies the mount protocol for a mountpoint, whether it is to be served from a filesystem, or it is a cgi etc. </p>
+<table class="fieldtable">
+<tr><th colspan="2">Enumerator</th></tr><tr><td class="fieldname"><a class="anchor" id="gga31eca18e50cb4357480f2fcad36ff437a1e9f0842b0e85db50fe648ed4ba9a4b0"></a>LWSMPRO_HTTP </td><td class="fielddoc">
+<p>not supported yet </p>
+</td></tr>
+<tr><td class="fieldname"><a class="anchor" id="gga31eca18e50cb4357480f2fcad36ff437afbd10eb4777517ed1f6bfdcf3b9ea1d1"></a>LWSMPRO_HTTPS </td><td class="fielddoc">
+<p>not supported yet </p>
+</td></tr>
+<tr><td class="fieldname"><a class="anchor" id="gga31eca18e50cb4357480f2fcad36ff437a42f2361cfe76cd287fa8fcfc502357e2"></a>LWSMPRO_FILE </td><td class="fielddoc">
+<p>serve from filesystem directory </p>
+</td></tr>
+<tr><td class="fieldname"><a class="anchor" id="gga31eca18e50cb4357480f2fcad36ff437a13ab58b01ac6e05f595977f1e0f0db69"></a>LWSMPRO_CGI </td><td class="fielddoc">
+<p>pass to CGI to handle </p>
+</td></tr>
+<tr><td class="fieldname"><a class="anchor" id="gga31eca18e50cb4357480f2fcad36ff437aec137a2434851bd856ceebfb697b9970"></a>LWSMPRO_REDIR_HTTP </td><td class="fielddoc">
+<p>redirect to <a href="http://">http://</a> url </p>
+</td></tr>
+<tr><td class="fieldname"><a class="anchor" id="gga31eca18e50cb4357480f2fcad36ff437a8894d16316863077dfe530963ca59f67"></a>LWSMPRO_REDIR_HTTPS </td><td class="fielddoc">
+<p>redirect to <a href="https://">https://</a> url </p>
+</td></tr>
+<tr><td class="fieldname"><a class="anchor" id="gga31eca18e50cb4357480f2fcad36ff437a946a88cf9c852eed2c0317f4115d19da"></a>LWSMPRO_CALLBACK </td><td class="fielddoc">
+<p>hand by named protocol's callback </p>
+</td></tr>
+</table>
+<div class="fragment"><div class="line"><a name="l01745"></a><span class="lineno"> 1745</span>  {</div><div class="line"><a name="l01746"></a><span class="lineno"> 1746</span>  <a class="code" href="group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437a1e9f0842b0e85db50fe648ed4ba9a4b0">LWSMPRO_HTTP</a> = 0, </div><div class="line"><a name="l01747"></a><span class="lineno"> 1747</span>  <a class="code" href="group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437afbd10eb4777517ed1f6bfdcf3b9ea1d1">LWSMPRO_HTTPS</a> = 1, </div><div class="line"><a name="l01748"></a><span class="lineno"> 1748</span>  <a class="code" href="group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437a42f2361cfe76cd287fa8fcfc502357e2">LWSMPRO_FILE</a> = 2, </div><div class="line"><a name="l01749"></a><span class="lineno"> 1749</span>  <a class="code" href="group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437a13ab58b01ac6e05f595977f1e0f0db69">LWSMPRO_CGI</a> = 3, </div><div class="line"><a name="l01750"></a><span class="lineno"> 1750</span>  <a class="code" href="group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437aec137a2434851bd856ceebfb697b9970">LWSMPRO_REDIR_HTTP</a> = 4, </div><div class="line"><a name="l01751"></a><span class="lineno"> 1751</span>  <a class="code" href="group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437a8894d16316863077dfe530963ca59f67">LWSMPRO_REDIR_HTTPS</a> = 5, </div><div class="line"><a name="l01752"></a><span class="lineno"> 1752</span>  <a class="code" href="group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437a946a88cf9c852eed2c0317f4115d19da">LWSMPRO_CALLBACK</a> = 6, </div><div class="line"><a name="l01753"></a><span class="lineno"> 1753</span> };</div><div class="ttc" id="group__vhost-mounts_html_gga31eca18e50cb4357480f2fcad36ff437a13ab58b01ac6e05f595977f1e0f0db69"><div class="ttname"><a href="group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437a13ab58b01ac6e05f595977f1e0f0db69">LWSMPRO_CGI</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1749</div></div>
+<div class="ttc" id="group__vhost-mounts_html_gga31eca18e50cb4357480f2fcad36ff437afbd10eb4777517ed1f6bfdcf3b9ea1d1"><div class="ttname"><a href="group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437afbd10eb4777517ed1f6bfdcf3b9ea1d1">LWSMPRO_HTTPS</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1747</div></div>
+<div class="ttc" id="group__vhost-mounts_html_gga31eca18e50cb4357480f2fcad36ff437a42f2361cfe76cd287fa8fcfc502357e2"><div class="ttname"><a href="group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437a42f2361cfe76cd287fa8fcfc502357e2">LWSMPRO_FILE</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1748</div></div>
+<div class="ttc" id="group__vhost-mounts_html_gga31eca18e50cb4357480f2fcad36ff437aec137a2434851bd856ceebfb697b9970"><div class="ttname"><a href="group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437aec137a2434851bd856ceebfb697b9970">LWSMPRO_REDIR_HTTP</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1750</div></div>
+<div class="ttc" id="group__vhost-mounts_html_gga31eca18e50cb4357480f2fcad36ff437a8894d16316863077dfe530963ca59f67"><div class="ttname"><a href="group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437a8894d16316863077dfe530963ca59f67">LWSMPRO_REDIR_HTTPS</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1751</div></div>
+<div class="ttc" id="group__vhost-mounts_html_gga31eca18e50cb4357480f2fcad36ff437a1e9f0842b0e85db50fe648ed4ba9a4b0"><div class="ttname"><a href="group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437a1e9f0842b0e85db50fe648ed4ba9a4b0">LWSMPRO_HTTP</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1746</div></div>
+<div class="ttc" id="group__vhost-mounts_html_gga31eca18e50cb4357480f2fcad36ff437a946a88cf9c852eed2c0317f4115d19da"><div class="ttname"><a href="group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437a946a88cf9c852eed2c0317f4115d19da">LWSMPRO_CALLBACK</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1752</div></div>
+</div><!-- fragment -->
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">Generated by
+ <a href="http://www.doxygen.org/index.html">
+ <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.11 </li>
+ </ul>
+</div>
+</body>
+</html>
--- /dev/null
+var group__vhost_mounts =
+[
+ [ "lws_protocol_vhost_options", "structlws__protocol__vhost__options.html", [
+ [ "name", "structlws__protocol__vhost__options.html#acf9db77f8eb64cd4e314be9b43d8a8b9", null ],
+ [ "next", "structlws__protocol__vhost__options.html#abc714ddb4171756fc8196e9823a1e21c", null ],
+ [ "options", "structlws__protocol__vhost__options.html#afd99fbc90be51ea2465b550c2ec47822", null ],
+ [ "value", "structlws__protocol__vhost__options.html#a0640a92513c70ee6b9b295a9ad1658e7", null ]
+ ] ],
+ [ "lws_http_mount", "structlws__http__mount.html", [
+ [ "auth_mask", "structlws__http__mount.html#a614364c770b0bd4db464ad65cddab477", null ],
+ [ "cache_intermediaries", "structlws__http__mount.html#aabec1a326780aafe11b977000983be0c", null ],
+ [ "cache_max_age", "structlws__http__mount.html#a4283e30ea89d27ae7d061ad760d1d146", null ],
+ [ "cache_reusable", "structlws__http__mount.html#a8316dd183ffbef50419a5a4968d35d84", null ],
+ [ "cache_revalidate", "structlws__http__mount.html#ae137203040c6153694bd88a708da5395", null ],
+ [ "cgi_timeout", "structlws__http__mount.html#a4a7239d6d4c03986e6e1a72abb6c83aa", null ],
+ [ "cgienv", "structlws__http__mount.html#ae7b5c0f4c5408061e6ea3a8d281f45af", null ],
+ [ "def", "structlws__http__mount.html#ae90d1efe7178199fad39de2926902ee4", null ],
+ [ "extra_mimetypes", "structlws__http__mount.html#a4437423df85ee3dbcae0e15974c89ec7", null ],
+ [ "interpret", "structlws__http__mount.html#a11ea62b952710d59733dbcf9794a5773", null ],
+ [ "mount_next", "structlws__http__mount.html#ad878546ae1c399bbca7d7f8a0baf973d", null ],
+ [ "mountpoint", "structlws__http__mount.html#aa2391bfcada0b7a290b3c6651f64586c", null ],
+ [ "mountpoint_len", "structlws__http__mount.html#ac8489b60b8f969eb19c9abbdeac90743", null ],
+ [ "origin", "structlws__http__mount.html#a21d86fd6043ec00e121ababbc29af39a", null ],
+ [ "origin_protocol", "structlws__http__mount.html#a6a9b1492a0b9749e39bd19932717a0b7", null ],
+ [ "protocol", "structlws__http__mount.html#a05347d92c3d379809564bd4f3eab259b", null ]
+ ] ],
+ [ "lws_mount_protocols", "group__vhost-mounts.html#ga31eca18e50cb4357480f2fcad36ff437", [
+ [ "LWSMPRO_HTTP", "group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437a1e9f0842b0e85db50fe648ed4ba9a4b0", null ],
+ [ "LWSMPRO_HTTPS", "group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437afbd10eb4777517ed1f6bfdcf3b9ea1d1", null ],
+ [ "LWSMPRO_FILE", "group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437a42f2361cfe76cd287fa8fcfc502357e2", null ],
+ [ "LWSMPRO_CGI", "group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437a13ab58b01ac6e05f595977f1e0f0db69", null ],
+ [ "LWSMPRO_REDIR_HTTP", "group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437aec137a2434851bd856ceebfb697b9970", null ],
+ [ "LWSMPRO_REDIR_HTTPS", "group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437a8894d16316863077dfe530963ca59f67", null ],
+ [ "LWSMPRO_CALLBACK", "group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437a946a88cf9c852eed2c0317f4115d19da", null ]
+ ] ]
+];
\ No newline at end of file
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.11"/>
+<title>libwebsockets: Websocket Close</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="libwebsockets.org-logo.png"/></td>
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname">libwebsockets
+ </div>
+ <div id="projectbrief">Lightweight C library for HTML5 websockets</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.11 -->
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main Page</span></a></li>
+ <li><a href="pages.html"><span>Related Pages</span></a></li>
+ <li class="current"><a href="modules.html"><span>Modules</span></a></li>
+ <li><a href="annotated.html"><span>Data Structures</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('group__wsclose.html','');});
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#enum-members">Enumerations</a> |
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">Websocket Close</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="enum-members"></a>
+Enumerations</h2></td></tr>
+<tr class="memitem:gae399c571df32ba532c0ca67da9284985"><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="group__wsclose.html#gae399c571df32ba532c0ca67da9284985">lws_close_status</a> { <br />
+  <b>LWS_CLOSE_STATUS_NOSTATUS</b> = 0,
+<a class="el" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a3ffa38d5081b85fb739e02a747ccf2c4">LWS_CLOSE_STATUS_NORMAL</a> = 1000,
+<a class="el" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a9737a68759e739856b150ff9dfa30218">LWS_CLOSE_STATUS_GOINGAWAY</a> = 1001,
+<a class="el" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a1bb501d212fa4d57053db681b1dfab98">LWS_CLOSE_STATUS_PROTOCOL_ERR</a> = 1002,
+<br />
+  <a class="el" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a462c99b05459df700919cfd3f53c8276">LWS_CLOSE_STATUS_UNACCEPTABLE_OPCODE</a> = 1003,
+<a class="el" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985af90cb98d983ad3d4c79df9b6f3d4a4d2">LWS_CLOSE_STATUS_RESERVED</a> = 1004,
+<a class="el" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a4b8a3b7ce6f731e5248e4b0fb64a5044">LWS_CLOSE_STATUS_NO_STATUS</a> = 1005,
+<a class="el" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a68b3d34bebd88547dcfa5cadba0acd6c">LWS_CLOSE_STATUS_ABNORMAL_CLOSE</a> = 1006,
+<br />
+  <a class="el" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a7aef2da0062da606eeb35aaca5cf9050">LWS_CLOSE_STATUS_INVALID_PAYLOAD</a> = 1007,
+<a class="el" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985ad09e68295eabdddcba4e332fbea70ae5">LWS_CLOSE_STATUS_POLICY_VIOLATION</a> = 1008,
+<a class="el" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a2e1f0113494a58e762eed3d22e7080d8">LWS_CLOSE_STATUS_MESSAGE_TOO_LARGE</a> = 1009,
+<a class="el" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985ac6a161822783ee873be1c66f48d14e0e">LWS_CLOSE_STATUS_EXTENSION_REQUIRED</a> = 1010,
+<br />
+  <a class="el" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985ad0869604d79e13700ae5d196a431b350">LWS_CLOSE_STATUS_UNEXPECTED_CONDITION</a> = 1011,
+<a class="el" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985ad2b477a91c8445bf34ecd43977f9b390">LWS_CLOSE_STATUS_TLS_FAILURE</a> = 1015,
+<b>LWS_CLOSE_STATUS_NOSTATUS_CONTEXT_DESTROY</b> = 9999
+<br />
+ }</td></tr>
+<tr class="separator:gae399c571df32ba532c0ca67da9284985"><td class="memSeparator" colspan="2"> </td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:gaa1c863415d1783cd8de7938aa6efa262"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN void </td><td class="memItemRight" valign="bottom"><a class="el" href="group__wsclose.html#gaa1c863415d1783cd8de7938aa6efa262">lws_close_reason</a> (struct lws *wsi, enum <a class="el" href="group__wsclose.html#gae399c571df32ba532c0ca67da9284985">lws_close_status</a> status, unsigned char *buf, size_t len)</td></tr>
+<tr class="separator:gaa1c863415d1783cd8de7938aa6efa262"><td class="memSeparator" colspan="2"> </td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<h2>Websocket close frame control</h2>
+<p>When we close a ws connection, we can send a reason code and a short UTF-8 description back with the close packet. </p>
+<h2 class="groupheader">Enumeration Type Documentation</h2>
+<a class="anchor" id="gae399c571df32ba532c0ca67da9284985"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">enum <a class="el" href="group__wsclose.html#gae399c571df32ba532c0ca67da9284985">lws_close_status</a></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h.html">lib/libwebsockets.h</a>></code></p>
+<p>enum lws_close_status - RFC6455 close status codes </p>
+<table class="fieldtable">
+<tr><th colspan="2">Enumerator</th></tr><tr><td class="fieldname"><a class="anchor" id="ggae399c571df32ba532c0ca67da9284985a3ffa38d5081b85fb739e02a747ccf2c4"></a>LWS_CLOSE_STATUS_NORMAL </td><td class="fielddoc">
+<p>1000 indicates a normal closure, meaning that the purpose for which the connection was established has been fulfilled. </p>
+</td></tr>
+<tr><td class="fieldname"><a class="anchor" id="ggae399c571df32ba532c0ca67da9284985a9737a68759e739856b150ff9dfa30218"></a>LWS_CLOSE_STATUS_GOINGAWAY </td><td class="fielddoc">
+<p>1001 indicates that an endpoint is "going away", such as a server going down or a browser having navigated away from a page. </p>
+</td></tr>
+<tr><td class="fieldname"><a class="anchor" id="ggae399c571df32ba532c0ca67da9284985a1bb501d212fa4d57053db681b1dfab98"></a>LWS_CLOSE_STATUS_PROTOCOL_ERR </td><td class="fielddoc">
+<p>1002 indicates that an endpoint is terminating the connection due to a protocol error. </p>
+</td></tr>
+<tr><td class="fieldname"><a class="anchor" id="ggae399c571df32ba532c0ca67da9284985a462c99b05459df700919cfd3f53c8276"></a>LWS_CLOSE_STATUS_UNACCEPTABLE_OPCODE </td><td class="fielddoc">
+<p>1003 indicates that an endpoint is terminating the connection because it has received a type of data it cannot accept (e.g., an endpoint that understands only text data MAY send this if it receives a binary message). </p>
+</td></tr>
+<tr><td class="fieldname"><a class="anchor" id="ggae399c571df32ba532c0ca67da9284985af90cb98d983ad3d4c79df9b6f3d4a4d2"></a>LWS_CLOSE_STATUS_RESERVED </td><td class="fielddoc">
+<p>Reserved. The specific meaning might be defined in the future. </p>
+</td></tr>
+<tr><td class="fieldname"><a class="anchor" id="ggae399c571df32ba532c0ca67da9284985a4b8a3b7ce6f731e5248e4b0fb64a5044"></a>LWS_CLOSE_STATUS_NO_STATUS </td><td class="fielddoc">
+<p>1005 is a reserved value and MUST NOT be set as a status code in a Close control frame by an endpoint. It is designated for use in applications expecting a status code to indicate that no status code was actually present. </p>
+</td></tr>
+<tr><td class="fieldname"><a class="anchor" id="ggae399c571df32ba532c0ca67da9284985a68b3d34bebd88547dcfa5cadba0acd6c"></a>LWS_CLOSE_STATUS_ABNORMAL_CLOSE </td><td class="fielddoc">
+<p>1006 is a reserved value and MUST NOT be set as a status code in a Close control frame by an endpoint. It is designated for use in applications expecting a status code to indicate that the connection was closed abnormally, e.g., without sending or receiving a Close control frame. </p>
+</td></tr>
+<tr><td class="fieldname"><a class="anchor" id="ggae399c571df32ba532c0ca67da9284985a7aef2da0062da606eeb35aaca5cf9050"></a>LWS_CLOSE_STATUS_INVALID_PAYLOAD </td><td class="fielddoc">
+<p>1007 indicates that an endpoint is terminating the connection because it has received data within a message that was not consistent with the type of the message (e.g., non-UTF-8 [RFC3629] data within a text message). </p>
+</td></tr>
+<tr><td class="fieldname"><a class="anchor" id="ggae399c571df32ba532c0ca67da9284985ad09e68295eabdddcba4e332fbea70ae5"></a>LWS_CLOSE_STATUS_POLICY_VIOLATION </td><td class="fielddoc">
+<p>1008 indicates that an endpoint is terminating the connection because it has received a message that violates its policy. This is a generic status code that can be returned when there is no other more suitable status code (e.g., 1003 or 1009) or if there is a need to hide specific details about the policy. </p>
+</td></tr>
+<tr><td class="fieldname"><a class="anchor" id="ggae399c571df32ba532c0ca67da9284985a2e1f0113494a58e762eed3d22e7080d8"></a>LWS_CLOSE_STATUS_MESSAGE_TOO_LARGE </td><td class="fielddoc">
+<p>1009 indicates that an endpoint is terminating the connection because it has received a message that is too big for it to process. </p>
+</td></tr>
+<tr><td class="fieldname"><a class="anchor" id="ggae399c571df32ba532c0ca67da9284985ac6a161822783ee873be1c66f48d14e0e"></a>LWS_CLOSE_STATUS_EXTENSION_REQUIRED </td><td class="fielddoc">
+<p>1010 indicates that an endpoint (client) is terminating the connection because it has expected the server to negotiate one or more extension, but the server didn't return them in the response message of the WebSocket handshake. The list of extensions that are needed SHOULD appear in the /reason/ part of the Close frame. Note that this status code is not used by the server, because it can fail the WebSocket handshake instead </p>
+</td></tr>
+<tr><td class="fieldname"><a class="anchor" id="ggae399c571df32ba532c0ca67da9284985ad0869604d79e13700ae5d196a431b350"></a>LWS_CLOSE_STATUS_UNEXPECTED_CONDITION </td><td class="fielddoc">
+<p>1011 indicates that a server is terminating the connection because it encountered an unexpected condition that prevented it from fulfilling the request. </p>
+</td></tr>
+<tr><td class="fieldname"><a class="anchor" id="ggae399c571df32ba532c0ca67da9284985ad2b477a91c8445bf34ecd43977f9b390"></a>LWS_CLOSE_STATUS_TLS_FAILURE </td><td class="fielddoc">
+<p>1015 is a reserved value and MUST NOT be set as a status code in a Close control frame by an endpoint. It is designated for use in applications expecting a status code to indicate that the connection was closed due to a failure to perform a TLS handshake (e.g., the server certificate can't be verified). </p>
+</td></tr>
+</table>
+<div class="fragment"><div class="line"><a name="l00461"></a><span class="lineno"> 461</span>  {</div><div class="line"><a name="l00462"></a><span class="lineno"> 462</span>  LWS_CLOSE_STATUS_NOSTATUS = 0,</div><div class="line"><a name="l00463"></a><span class="lineno"> 463</span>  <a class="code" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a3ffa38d5081b85fb739e02a747ccf2c4">LWS_CLOSE_STATUS_NORMAL</a> = 1000,</div><div class="line"><a name="l00466"></a><span class="lineno"> 466</span>  <a class="code" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a9737a68759e739856b150ff9dfa30218">LWS_CLOSE_STATUS_GOINGAWAY</a> = 1001,</div><div class="line"><a name="l00469"></a><span class="lineno"> 469</span>  <a class="code" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a1bb501d212fa4d57053db681b1dfab98">LWS_CLOSE_STATUS_PROTOCOL_ERR</a> = 1002,</div><div class="line"><a name="l00472"></a><span class="lineno"> 472</span>  <a class="code" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a462c99b05459df700919cfd3f53c8276">LWS_CLOSE_STATUS_UNACCEPTABLE_OPCODE</a> = 1003,</div><div class="line"><a name="l00477"></a><span class="lineno"> 477</span>  <a class="code" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985af90cb98d983ad3d4c79df9b6f3d4a4d2">LWS_CLOSE_STATUS_RESERVED</a> = 1004,</div><div class="line"><a name="l00479"></a><span class="lineno"> 479</span>  <a class="code" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a4b8a3b7ce6f731e5248e4b0fb64a5044">LWS_CLOSE_STATUS_NO_STATUS</a> = 1005,</div><div class="line"><a name="l00484"></a><span class="lineno"> 484</span>  <a class="code" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a68b3d34bebd88547dcfa5cadba0acd6c">LWS_CLOSE_STATUS_ABNORMAL_CLOSE</a> = 1006,</div><div class="line"><a name="l00490"></a><span class="lineno"> 490</span>  <a class="code" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a7aef2da0062da606eeb35aaca5cf9050">LWS_CLOSE_STATUS_INVALID_PAYLOAD</a> = 1007,</div><div class="line"><a name="l00495"></a><span class="lineno"> 495</span>  <a class="code" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985ad09e68295eabdddcba4e332fbea70ae5">LWS_CLOSE_STATUS_POLICY_VIOLATION</a> = 1008,</div><div class="line"><a name="l00501"></a><span class="lineno"> 501</span>  <a class="code" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a2e1f0113494a58e762eed3d22e7080d8">LWS_CLOSE_STATUS_MESSAGE_TOO_LARGE</a> = 1009,</div><div class="line"><a name="l00505"></a><span class="lineno"> 505</span>  <a class="code" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985ac6a161822783ee873be1c66f48d14e0e">LWS_CLOSE_STATUS_EXTENSION_REQUIRED</a> = 1010,</div><div class="line"><a name="l00513"></a><span class="lineno"> 513</span>  <a class="code" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985ad0869604d79e13700ae5d196a431b350">LWS_CLOSE_STATUS_UNEXPECTED_CONDITION</a> = 1011,</div><div class="line"><a name="l00517"></a><span class="lineno"> 517</span>  <a class="code" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985ad2b477a91c8445bf34ecd43977f9b390">LWS_CLOSE_STATUS_TLS_FAILURE</a> = 1015,</div><div class="line"><a name="l00524"></a><span class="lineno"> 524</span>  <span class="comment">/****** add new things just above ---^ ******/</span></div><div class="line"><a name="l00525"></a><span class="lineno"> 525</span> </div><div class="line"><a name="l00526"></a><span class="lineno"> 526</span>  LWS_CLOSE_STATUS_NOSTATUS_CONTEXT_DESTROY = 9999,</div><div class="line"><a name="l00527"></a><span class="lineno"> 527</span> };</div><div class="ttc" id="group__wsclose_html_ggae399c571df32ba532c0ca67da9284985a7aef2da0062da606eeb35aaca5cf9050"><div class="ttname"><a href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a7aef2da0062da606eeb35aaca5cf9050">LWS_CLOSE_STATUS_INVALID_PAYLOAD</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:490</div></div>
+<div class="ttc" id="group__wsclose_html_ggae399c571df32ba532c0ca67da9284985a2e1f0113494a58e762eed3d22e7080d8"><div class="ttname"><a href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a2e1f0113494a58e762eed3d22e7080d8">LWS_CLOSE_STATUS_MESSAGE_TOO_LARGE</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:501</div></div>
+<div class="ttc" id="group__wsclose_html_ggae399c571df32ba532c0ca67da9284985ad2b477a91c8445bf34ecd43977f9b390"><div class="ttname"><a href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985ad2b477a91c8445bf34ecd43977f9b390">LWS_CLOSE_STATUS_TLS_FAILURE</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:517</div></div>
+<div class="ttc" id="group__wsclose_html_ggae399c571df32ba532c0ca67da9284985a1bb501d212fa4d57053db681b1dfab98"><div class="ttname"><a href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a1bb501d212fa4d57053db681b1dfab98">LWS_CLOSE_STATUS_PROTOCOL_ERR</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:469</div></div>
+<div class="ttc" id="group__wsclose_html_ggae399c571df32ba532c0ca67da9284985ad09e68295eabdddcba4e332fbea70ae5"><div class="ttname"><a href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985ad09e68295eabdddcba4e332fbea70ae5">LWS_CLOSE_STATUS_POLICY_VIOLATION</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:495</div></div>
+<div class="ttc" id="group__wsclose_html_ggae399c571df32ba532c0ca67da9284985a4b8a3b7ce6f731e5248e4b0fb64a5044"><div class="ttname"><a href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a4b8a3b7ce6f731e5248e4b0fb64a5044">LWS_CLOSE_STATUS_NO_STATUS</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:479</div></div>
+<div class="ttc" id="group__wsclose_html_ggae399c571df32ba532c0ca67da9284985a68b3d34bebd88547dcfa5cadba0acd6c"><div class="ttname"><a href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a68b3d34bebd88547dcfa5cadba0acd6c">LWS_CLOSE_STATUS_ABNORMAL_CLOSE</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:484</div></div>
+<div class="ttc" id="group__wsclose_html_ggae399c571df32ba532c0ca67da9284985a9737a68759e739856b150ff9dfa30218"><div class="ttname"><a href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a9737a68759e739856b150ff9dfa30218">LWS_CLOSE_STATUS_GOINGAWAY</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:466</div></div>
+<div class="ttc" id="group__wsclose_html_ggae399c571df32ba532c0ca67da9284985ac6a161822783ee873be1c66f48d14e0e"><div class="ttname"><a href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985ac6a161822783ee873be1c66f48d14e0e">LWS_CLOSE_STATUS_EXTENSION_REQUIRED</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:505</div></div>
+<div class="ttc" id="group__wsclose_html_ggae399c571df32ba532c0ca67da9284985a3ffa38d5081b85fb739e02a747ccf2c4"><div class="ttname"><a href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a3ffa38d5081b85fb739e02a747ccf2c4">LWS_CLOSE_STATUS_NORMAL</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:463</div></div>
+<div class="ttc" id="group__wsclose_html_ggae399c571df32ba532c0ca67da9284985a462c99b05459df700919cfd3f53c8276"><div class="ttname"><a href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a462c99b05459df700919cfd3f53c8276">LWS_CLOSE_STATUS_UNACCEPTABLE_OPCODE</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:472</div></div>
+<div class="ttc" id="group__wsclose_html_ggae399c571df32ba532c0ca67da9284985af90cb98d983ad3d4c79df9b6f3d4a4d2"><div class="ttname"><a href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985af90cb98d983ad3d4c79df9b6f3d4a4d2">LWS_CLOSE_STATUS_RESERVED</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:477</div></div>
+<div class="ttc" id="group__wsclose_html_ggae399c571df32ba532c0ca67da9284985ad0869604d79e13700ae5d196a431b350"><div class="ttname"><a href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985ad0869604d79e13700ae5d196a431b350">LWS_CLOSE_STATUS_UNEXPECTED_CONDITION</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:513</div></div>
+</div><!-- fragment -->
+</div>
+</div>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="gaa1c863415d1783cd8de7938aa6efa262"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">LWS_VISIBLE LWS_EXTERN void lws_close_reason </td>
+ <td>(</td>
+ <td class="paramtype">struct lws * </td>
+ <td class="paramname"><em>wsi</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">enum <a class="el" href="group__wsclose.html#gae399c571df32ba532c0ca67da9284985">lws_close_status</a> </td>
+ <td class="paramname"><em>status</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">unsigned char * </td>
+ <td class="paramname"><em>buf</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">size_t </td>
+ <td class="paramname"><em>len</em> </td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h.html">lib/libwebsockets.h</a>></code></p>
+<p>lws_close_reason - Set reason and aux data to send with Close packet If you are going to return nonzero from the callback requesting the connection to close, you can optionally call this to set the reason the peer will be told if possible.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">wsi</td><td>The websocket connection to set the close reason on </td></tr>
+ <tr><td class="paramname">status</td><td>A valid close status from websocket standard </td></tr>
+ <tr><td class="paramname">buf</td><td>NULL or buffer containing up to 124 bytes of auxiliary data </td></tr>
+ <tr><td class="paramname">len</td><td>Length of data in </td></tr>
+ <tr><td class="paramname">buf</td><td>to send </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">Generated by
+ <a href="http://www.doxygen.org/index.html">
+ <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.11 </li>
+ </ul>
+</div>
+</body>
+</html>
--- /dev/null
+var group__wsclose =
+[
+ [ "lws_close_status", "group__wsclose.html#gae399c571df32ba532c0ca67da9284985", [
+ [ "LWS_CLOSE_STATUS_NORMAL", "group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a3ffa38d5081b85fb739e02a747ccf2c4", null ],
+ [ "LWS_CLOSE_STATUS_GOINGAWAY", "group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a9737a68759e739856b150ff9dfa30218", null ],
+ [ "LWS_CLOSE_STATUS_PROTOCOL_ERR", "group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a1bb501d212fa4d57053db681b1dfab98", null ],
+ [ "LWS_CLOSE_STATUS_UNACCEPTABLE_OPCODE", "group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a462c99b05459df700919cfd3f53c8276", null ],
+ [ "LWS_CLOSE_STATUS_RESERVED", "group__wsclose.html#ggae399c571df32ba532c0ca67da9284985af90cb98d983ad3d4c79df9b6f3d4a4d2", null ],
+ [ "LWS_CLOSE_STATUS_NO_STATUS", "group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a4b8a3b7ce6f731e5248e4b0fb64a5044", null ],
+ [ "LWS_CLOSE_STATUS_ABNORMAL_CLOSE", "group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a68b3d34bebd88547dcfa5cadba0acd6c", null ],
+ [ "LWS_CLOSE_STATUS_INVALID_PAYLOAD", "group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a7aef2da0062da606eeb35aaca5cf9050", null ],
+ [ "LWS_CLOSE_STATUS_POLICY_VIOLATION", "group__wsclose.html#ggae399c571df32ba532c0ca67da9284985ad09e68295eabdddcba4e332fbea70ae5", null ],
+ [ "LWS_CLOSE_STATUS_MESSAGE_TOO_LARGE", "group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a2e1f0113494a58e762eed3d22e7080d8", null ],
+ [ "LWS_CLOSE_STATUS_EXTENSION_REQUIRED", "group__wsclose.html#ggae399c571df32ba532c0ca67da9284985ac6a161822783ee873be1c66f48d14e0e", null ],
+ [ "LWS_CLOSE_STATUS_UNEXPECTED_CONDITION", "group__wsclose.html#ggae399c571df32ba532c0ca67da9284985ad0869604d79e13700ae5d196a431b350", null ],
+ [ "LWS_CLOSE_STATUS_TLS_FAILURE", "group__wsclose.html#ggae399c571df32ba532c0ca67da9284985ad2b477a91c8445bf34ecd43977f9b390", null ]
+ ] ],
+ [ "lws_close_reason", "group__wsclose.html#gaa1c863415d1783cd8de7938aa6efa262", null ]
+];
\ No newline at end of file
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.11"/>
+<title>libwebsockets: Websocket status APIs</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="libwebsockets.org-logo.png"/></td>
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname">libwebsockets
+ </div>
+ <div id="projectbrief">Lightweight C library for HTML5 websockets</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.11 -->
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main Page</span></a></li>
+ <li><a href="pages.html"><span>Related Pages</span></a></li>
+ <li class="current"><a href="modules.html"><span>Modules</span></a></li>
+ <li><a href="annotated.html"><span>Data Structures</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('group__wsstatus.html','');});
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">Websocket status APIs</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ga2bb3655329b4651cd06f79ee3a764421"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT </td><td class="memItemRight" valign="bottom"><a class="el" href="group__wsstatus.html#ga2bb3655329b4651cd06f79ee3a764421">lws_send_pipe_choked</a> (struct lws *wsi)</td></tr>
+<tr class="separator:ga2bb3655329b4651cd06f79ee3a764421"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga08e9ee165fca503fd9427d55cfecac37"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN int </td><td class="memItemRight" valign="bottom"><a class="el" href="group__wsstatus.html#ga08e9ee165fca503fd9427d55cfecac37">lws_is_final_fragment</a> (struct lws *wsi)</td></tr>
+<tr class="separator:ga08e9ee165fca503fd9427d55cfecac37"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga3df5045656dfb6b0e63a38de2dca79d2"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN unsigned char </td><td class="memItemRight" valign="bottom"><a class="el" href="group__wsstatus.html#ga3df5045656dfb6b0e63a38de2dca79d2">lws_get_reserved_bits</a> (struct lws *wsi)</td></tr>
+<tr class="separator:ga3df5045656dfb6b0e63a38de2dca79d2"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:gaeca4afc94b1f026034f99cbba37e2f85"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT </td><td class="memItemRight" valign="bottom"><a class="el" href="group__wsstatus.html#gaeca4afc94b1f026034f99cbba37e2f85">lws_partial_buffered</a> (struct lws *wsi)</td></tr>
+<tr class="separator:gaeca4afc94b1f026034f99cbba37e2f85"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:gaccd9c59336efad8af0554f79cc5966fd"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT </td><td class="memItemRight" valign="bottom"><a class="el" href="group__wsstatus.html#gaccd9c59336efad8af0554f79cc5966fd">lws_frame_is_binary</a> (struct lws *wsi)</td></tr>
+<tr class="separator:gaccd9c59336efad8af0554f79cc5966fd"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga26a140623d202dd2bf2004deb6994baa"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN int </td><td class="memItemRight" valign="bottom"><a class="el" href="group__wsstatus.html#ga26a140623d202dd2bf2004deb6994baa">lws_is_ssl</a> (struct lws *wsi)</td></tr>
+<tr class="separator:ga26a140623d202dd2bf2004deb6994baa"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga4ad226d5e01024b4046f4a5a37199aa1"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN int </td><td class="memItemRight" valign="bottom"><a class="el" href="group__wsstatus.html#ga4ad226d5e01024b4046f4a5a37199aa1">lws_is_cgi</a> (struct lws *wsi)</td></tr>
+<tr class="separator:ga4ad226d5e01024b4046f4a5a37199aa1"><td class="memSeparator" colspan="2"> </td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<h2>Websocket connection status APIs</h2>
+<p>These provide information about ws connection or message status </p>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="gaccd9c59336efad8af0554f79cc5966fd"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT lws_frame_is_binary </td>
+ <td>(</td>
+ <td class="paramtype">struct lws * </td>
+ <td class="paramname"><em>wsi</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h.html">lib/libwebsockets.h</a>></code></p>
+<p><a class="el" href="group__wsstatus.html#gaccd9c59336efad8af0554f79cc5966fd">lws_frame_is_binary()</a>: true if the current frame was sent in binary mode</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">wsi</td><td>the connection we are inquiring about</td></tr>
+ </table>
+ </dd>
+</dl>
+<p>This is intended to be called from the LWS_CALLBACK_RECEIVE callback if it's interested to see if the frame it's dealing with was sent in binary mode. </p>
+
+</div>
+</div>
+<a class="anchor" id="ga3df5045656dfb6b0e63a38de2dca79d2"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">LWS_VISIBLE LWS_EXTERN unsigned char lws_get_reserved_bits </td>
+ <td>(</td>
+ <td class="paramtype">struct lws * </td>
+ <td class="paramname"><em>wsi</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h.html">lib/libwebsockets.h</a>></code></p>
+<p><a class="el" href="group__wsstatus.html#ga3df5045656dfb6b0e63a38de2dca79d2">lws_get_reserved_bits()</a> - access reserved bits of ws frame </p><dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">wsi</td><td>lws connection </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a class="anchor" id="ga4ad226d5e01024b4046f4a5a37199aa1"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">LWS_VISIBLE LWS_EXTERN int lws_is_cgi </td>
+ <td>(</td>
+ <td class="paramtype">struct lws * </td>
+ <td class="paramname"><em>wsi</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h.html">lib/libwebsockets.h</a>></code></p>
+<p><a class="el" href="group__wsstatus.html#ga4ad226d5e01024b4046f4a5a37199aa1">lws_is_cgi()</a> - find out if this wsi is running a cgi process </p><dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">wsi</td><td>lws connection </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a class="anchor" id="ga08e9ee165fca503fd9427d55cfecac37"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">LWS_VISIBLE LWS_EXTERN int lws_is_final_fragment </td>
+ <td>(</td>
+ <td class="paramtype">struct lws * </td>
+ <td class="paramname"><em>wsi</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h.html">lib/libwebsockets.h</a>></code></p>
+<p><a class="el" href="group__wsstatus.html#ga08e9ee165fca503fd9427d55cfecac37">lws_is_final_fragment()</a> - tests if last part of ws message </p><dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">wsi</td><td>lws connection </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a class="anchor" id="ga26a140623d202dd2bf2004deb6994baa"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">LWS_VISIBLE LWS_EXTERN int lws_is_ssl </td>
+ <td>(</td>
+ <td class="paramtype">struct lws * </td>
+ <td class="paramname"><em>wsi</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h.html">lib/libwebsockets.h</a>></code></p>
+<p><a class="el" href="group__wsstatus.html#ga26a140623d202dd2bf2004deb6994baa">lws_is_ssl()</a> - Find out if connection is using SSL </p><dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">wsi</td><td>websocket connection to check <pre class="fragment"> Returns 0 if the connection is not using SSL, 1 if using SSL and
+ using verified cert, and 2 if using SSL but the cert was not
+ checked (appears for client wsi told to skip check on connection)</pre> </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a class="anchor" id="gaeca4afc94b1f026034f99cbba37e2f85"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT lws_partial_buffered </td>
+ <td>(</td>
+ <td class="paramtype">struct lws * </td>
+ <td class="paramname"><em>wsi</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h.html">lib/libwebsockets.h</a>></code></p>
+<p><a class="el" href="group__wsstatus.html#gaeca4afc94b1f026034f99cbba37e2f85">lws_partial_buffered()</a> - find out if lws buffered the last write </p><dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">wsi</td><td>websocket connection to check</td></tr>
+ </table>
+ </dd>
+</dl>
+<p>Returns 1 if you cannot use lws_write because the last write on this connection is still buffered, and can't be cleared without returning to the service loop and waiting for the connection to be writeable again.</p>
+<p>If you will try to do >1 lws_write call inside a single WRITEABLE callback, you must check this after every write and bail if set, ask for a new writeable callback and continue writing from there.</p>
+<p>This is never set at the start of a writeable callback, but any write may set it. </p>
+
+</div>
+</div>
+<a class="anchor" id="ga2bb3655329b4651cd06f79ee3a764421"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT lws_send_pipe_choked </td>
+ <td>(</td>
+ <td class="paramtype">struct lws * </td>
+ <td class="paramname"><em>wsi</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h.html">lib/libwebsockets.h</a>></code></p>
+<p><a class="el" href="group__wsstatus.html#ga2bb3655329b4651cd06f79ee3a764421">lws_send_pipe_choked()</a> - tests if socket is writable or not </p><dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">wsi</td><td>lws connection</td></tr>
+ </table>
+ </dd>
+</dl>
+<p>Allows you to check if you can write more on the socket </p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">Generated by
+ <a href="http://www.doxygen.org/index.html">
+ <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.11 </li>
+ </ul>
+</div>
+</body>
+</html>
--- /dev/null
+var group__wsstatus =
+[
+ [ "lws_frame_is_binary", "group__wsstatus.html#gaccd9c59336efad8af0554f79cc5966fd", null ],
+ [ "lws_get_reserved_bits", "group__wsstatus.html#ga3df5045656dfb6b0e63a38de2dca79d2", null ],
+ [ "lws_is_cgi", "group__wsstatus.html#ga4ad226d5e01024b4046f4a5a37199aa1", null ],
+ [ "lws_is_final_fragment", "group__wsstatus.html#ga08e9ee165fca503fd9427d55cfecac37", null ],
+ [ "lws_is_ssl", "group__wsstatus.html#ga26a140623d202dd2bf2004deb6994baa", null ],
+ [ "lws_partial_buffered", "group__wsstatus.html#gaeca4afc94b1f026034f99cbba37e2f85", null ],
+ [ "lws_send_pipe_choked", "group__wsstatus.html#ga2bb3655329b4651cd06f79ee3a764421", null ]
+];
\ No newline at end of file
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.11"/>
+<title>libwebsockets: Class Hierarchy</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="libwebsockets.org-logo.png"/></td>
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname">libwebsockets
+ </div>
+ <div id="projectbrief">Lightweight C library for HTML5 websockets</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.11 -->
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main Page</span></a></li>
+ <li><a href="pages.html"><span>Related Pages</span></a></li>
+ <li><a href="modules.html"><span>Modules</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Data Structures</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Data Structures</span></a></li>
+ <li><a href="classes.html"><span>Data Structure Index</span></a></li>
+ <li class="current"><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Data Fields</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('hierarchy.html','');});
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="headertitle">
+<div class="title">Class Hierarchy</div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock">This inheritance list is sorted roughly, but not completely, alphabetically:</div><div class="directory">
+<div class="levels">[detail level <span onclick="javascript:toggleLevel(1);">1</span><span onclick="javascript:toggleLevel(2);">2</span>]</div><table class="directory">
+<tr id="row_0_" class="even"><td class="entry"><span style="width:16px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="structlws__cgi__args.html" target="_self">lws_cgi_args</a></td><td class="desc"></td></tr>
+<tr id="row_1_"><td class="entry"><span style="width:16px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="structlws__client__connect__info.html" target="_self">lws_client_connect_info</a></td><td class="desc"></td></tr>
+<tr id="row_2_" class="even"><td class="entry"><span style="width:0px;display:inline-block;"> </span><span id="arr_2_" class="arrow" onclick="toggleFolder('2_')">▼</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classlws__conn.html" target="_self">lws_conn</a></td><td class="desc"></td></tr>
+<tr id="row_2_0_"><td class="entry"><span style="width:32px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="classlws__conn__listener.html" target="_self">lws_conn_listener</a></td><td class="desc"></td></tr>
+<tr id="row_3_" class="even"><td class="entry"><span style="width:16px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="structlws__context__creation__info.html" target="_self">lws_context_creation_info</a></td><td class="desc"></td></tr>
+<tr id="row_4_"><td class="entry"><span style="width:16px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="structlws__email.html" target="_self">lws_email</a></td><td class="desc"></td></tr>
+<tr id="row_5_" class="even"><td class="entry"><span style="width:16px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="structlws__ext__option__arg.html" target="_self">lws_ext_option_arg</a></td><td class="desc"></td></tr>
+<tr id="row_6_"><td class="entry"><span style="width:16px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="structlws__ext__options.html" target="_self">lws_ext_options</a></td><td class="desc"></td></tr>
+<tr id="row_7_" class="even"><td class="entry"><span style="width:16px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="structlws__extension.html" target="_self">lws_extension</a></td><td class="desc"></td></tr>
+<tr id="row_8_"><td class="entry"><span style="width:16px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="structlws__gs__event__args.html" target="_self">lws_gs_event_args</a></td><td class="desc"></td></tr>
+<tr id="row_9_" class="even"><td class="entry"><span style="width:16px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="structlws__http__mount.html" target="_self">lws_http_mount</a></td><td class="desc"></td></tr>
+<tr id="row_10_"><td class="entry"><span style="width:16px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="structlws__plat__file__ops.html" target="_self">lws_plat_file_ops</a></td><td class="desc"></td></tr>
+<tr id="row_11_" class="even"><td class="entry"><span style="width:16px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="structlws__plugin.html" target="_self">lws_plugin</a></td><td class="desc"></td></tr>
+<tr id="row_12_"><td class="entry"><span style="width:16px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="structlws__plugin__capability.html" target="_self">lws_plugin_capability</a></td><td class="desc"></td></tr>
+<tr id="row_13_" class="even"><td class="entry"><span style="width:16px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="structlws__polarssl__context.html" target="_self">lws_polarssl_context</a></td><td class="desc"></td></tr>
+<tr id="row_14_"><td class="entry"><span style="width:16px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="structlws__pollargs.html" target="_self">lws_pollargs</a></td><td class="desc"></td></tr>
+<tr id="row_15_" class="even"><td class="entry"><span style="width:16px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="structlws__pollfd.html" target="_self">lws_pollfd</a></td><td class="desc"></td></tr>
+<tr id="row_16_"><td class="entry"><span style="width:16px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="structlws__process__html__args.html" target="_self">lws_process_html_args</a></td><td class="desc"></td></tr>
+<tr id="row_17_" class="even"><td class="entry"><span style="width:16px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="structlws__process__html__state.html" target="_self">lws_process_html_state</a></td><td class="desc"></td></tr>
+<tr id="row_18_"><td class="entry"><span style="width:16px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="structlws__protocol__vhost__options.html" target="_self">lws_protocol_vhost_options</a></td><td class="desc"></td></tr>
+<tr id="row_19_" class="even"><td class="entry"><span style="width:16px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="structlws__protocols.html" target="_self">lws_protocols</a></td><td class="desc"></td></tr>
+<tr id="row_20_"><td class="entry"><span style="width:16px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="structlws__session__info.html" target="_self">lws_session_info</a></td><td class="desc"></td></tr>
+<tr id="row_21_" class="even"><td class="entry"><span style="width:16px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="structlws__token__limits.html" target="_self">lws_token_limits</a></td><td class="desc"></td></tr>
+<tr id="row_22_"><td class="entry"><span style="width:16px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="structlws__tokens.html" target="_self">lws_tokens</a></td><td class="desc"></td></tr>
+<tr id="row_23_" class="even"><td class="entry"><span style="width:16px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="structlwsgw__hash.html" target="_self">lwsgw_hash</a></td><td class="desc"></td></tr>
+<tr id="row_24_"><td class="entry"><span style="width:16px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="structlwsgw__hash__bin.html" target="_self">lwsgw_hash_bin</a></td><td class="desc"></td></tr>
+<tr id="row_25_" class="even"><td class="entry"><span style="width:16px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="structpollfd.html" target="_self">pollfd</a></td><td class="desc"></td></tr>
+</table>
+</div><!-- directory -->
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">Generated by
+ <a href="http://www.doxygen.org/index.html">
+ <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.11 </li>
+ </ul>
+</div>
+</body>
+</html>
--- /dev/null
+var hierarchy =
+[
+ [ "lws_cgi_args", "structlws__cgi__args.html", null ],
+ [ "lws_client_connect_info", "structlws__client__connect__info.html", null ],
+ [ "lws_conn", "classlws__conn.html", [
+ [ "lws_conn_listener", "classlws__conn__listener.html", null ]
+ ] ],
+ [ "lws_context_creation_info", "structlws__context__creation__info.html", null ],
+ [ "lws_email", "structlws__email.html", null ],
+ [ "lws_ext_option_arg", "structlws__ext__option__arg.html", null ],
+ [ "lws_ext_options", "structlws__ext__options.html", null ],
+ [ "lws_extension", "structlws__extension.html", null ],
+ [ "lws_gs_event_args", "structlws__gs__event__args.html", null ],
+ [ "lws_http_mount", "structlws__http__mount.html", null ],
+ [ "lws_plat_file_ops", "structlws__plat__file__ops.html", null ],
+ [ "lws_plugin", "structlws__plugin.html", null ],
+ [ "lws_plugin_capability", "structlws__plugin__capability.html", null ],
+ [ "lws_polarssl_context", "structlws__polarssl__context.html", null ],
+ [ "lws_pollargs", "structlws__pollargs.html", null ],
+ [ "lws_pollfd", "structlws__pollfd.html", null ],
+ [ "lws_process_html_args", "structlws__process__html__args.html", null ],
+ [ "lws_process_html_state", "structlws__process__html__state.html", null ],
+ [ "lws_protocol_vhost_options", "structlws__protocol__vhost__options.html", null ],
+ [ "lws_protocols", "structlws__protocols.html", null ],
+ [ "lws_session_info", "structlws__session__info.html", null ],
+ [ "lws_token_limits", "structlws__token__limits.html", null ],
+ [ "lws_tokens", "structlws__tokens.html", null ],
+ [ "lwsgw_hash", "structlwsgw__hash.html", null ],
+ [ "lwsgw_hash_bin", "structlwsgw__hash__bin.html", null ],
+ [ "pollfd", "structpollfd.html", null ]
+];
\ No newline at end of file
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.11"/>
+<title>libwebsockets: Libwebsockets API introduction</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="libwebsockets.org-logo.png"/></td>
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname">libwebsockets
+ </div>
+ <div id="projectbrief">Lightweight C library for HTML5 websockets</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.11 -->
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li class="current"><a href="index.html"><span>Main Page</span></a></li>
+ <li><a href="pages.html"><span>Related Pages</span></a></li>
+ <li><a href="modules.html"><span>Modules</span></a></li>
+ <li><a href="annotated.html"><span>Data Structures</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('index.html','');});
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="headertitle">
+<div class="title">Libwebsockets API introduction </div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><p>Libwebsockets covers a lot of interesting features for people making embedded servers or clients</p>
+<ul>
+<li>http(s) serving and client operation</li>
+<li>ws(s) serving and client operation</li>
+<li>http(s) apis for file transfer and upload</li>
+<li>http POST form handling (including multipart)</li>
+<li>cookie-based sessions</li>
+<li>account management (including registration, email verification, lost pw etc)</li>
+<li>strong ssl PFS support (A+ on SSLlabs test)</li>
+</ul>
+<p>You can browse by api category <a href="modules.html">here</a>. </p>
+</div></div><!-- contents -->
+</div><!-- doc-content -->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">Generated by
+ <a href="http://www.doxygen.org/index.html">
+ <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.11 </li>
+ </ul>
+</div>
+</body>
+</html>
--- /dev/null
+/*!
+ * jQuery JavaScript Library v1.7.1
+ * http://jquery.com/
+ *
+ * Copyright 2011, John Resig
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * Includes Sizzle.js
+ * http://sizzlejs.com/
+ * Copyright 2011, The Dojo Foundation
+ * Released under the MIT, BSD, and GPL Licenses.
+ *
+ * Date: Mon Nov 21 21:11:03 2011 -0500
+ */
+(function(bb,L){var av=bb.document,bu=bb.navigator,bl=bb.location;var b=(function(){var bF=function(b0,b1){return new bF.fn.init(b0,b1,bD)},bU=bb.jQuery,bH=bb.$,bD,bY=/^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,bM=/\S/,bI=/^\s+/,bE=/\s+$/,bA=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,bN=/^[\],:{}\s]*$/,bW=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,bP=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,bJ=/(?:^|:|,)(?:\s*\[)+/g,by=/(webkit)[ \/]([\w.]+)/,bR=/(opera)(?:.*version)?[ \/]([\w.]+)/,bQ=/(msie) ([\w.]+)/,bS=/(mozilla)(?:.*? rv:([\w.]+))?/,bB=/-([a-z]|[0-9])/ig,bZ=/^-ms-/,bT=function(b0,b1){return(b1+"").toUpperCase()},bX=bu.userAgent,bV,bC,e,bL=Object.prototype.toString,bG=Object.prototype.hasOwnProperty,bz=Array.prototype.push,bK=Array.prototype.slice,bO=String.prototype.trim,bv=Array.prototype.indexOf,bx={};bF.fn=bF.prototype={constructor:bF,init:function(b0,b4,b3){var b2,b5,b1,b6;if(!b0){return this}if(b0.nodeType){this.context=this[0]=b0;this.length=1;return this}if(b0==="body"&&!b4&&av.body){this.context=av;this[0]=av.body;this.selector=b0;this.length=1;return this}if(typeof b0==="string"){if(b0.charAt(0)==="<"&&b0.charAt(b0.length-1)===">"&&b0.length>=3){b2=[null,b0,null]}else{b2=bY.exec(b0)}if(b2&&(b2[1]||!b4)){if(b2[1]){b4=b4 instanceof bF?b4[0]:b4;b6=(b4?b4.ownerDocument||b4:av);b1=bA.exec(b0);if(b1){if(bF.isPlainObject(b4)){b0=[av.createElement(b1[1])];bF.fn.attr.call(b0,b4,true)}else{b0=[b6.createElement(b1[1])]}}else{b1=bF.buildFragment([b2[1]],[b6]);b0=(b1.cacheable?bF.clone(b1.fragment):b1.fragment).childNodes}return bF.merge(this,b0)}else{b5=av.getElementById(b2[2]);if(b5&&b5.parentNode){if(b5.id!==b2[2]){return b3.find(b0)}this.length=1;this[0]=b5}this.context=av;this.selector=b0;return this}}else{if(!b4||b4.jquery){return(b4||b3).find(b0)}else{return this.constructor(b4).find(b0)}}}else{if(bF.isFunction(b0)){return b3.ready(b0)}}if(b0.selector!==L){this.selector=b0.selector;this.context=b0.context}return bF.makeArray(b0,this)},selector:"",jquery:"1.7.1",length:0,size:function(){return this.length},toArray:function(){return bK.call(this,0)},get:function(b0){return b0==null?this.toArray():(b0<0?this[this.length+b0]:this[b0])},pushStack:function(b1,b3,b0){var b2=this.constructor();if(bF.isArray(b1)){bz.apply(b2,b1)}else{bF.merge(b2,b1)}b2.prevObject=this;b2.context=this.context;if(b3==="find"){b2.selector=this.selector+(this.selector?" ":"")+b0}else{if(b3){b2.selector=this.selector+"."+b3+"("+b0+")"}}return b2},each:function(b1,b0){return bF.each(this,b1,b0)},ready:function(b0){bF.bindReady();bC.add(b0);return this},eq:function(b0){b0=+b0;return b0===-1?this.slice(b0):this.slice(b0,b0+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(bK.apply(this,arguments),"slice",bK.call(arguments).join(","))},map:function(b0){return this.pushStack(bF.map(this,function(b2,b1){return b0.call(b2,b1,b2)}))},end:function(){return this.prevObject||this.constructor(null)},push:bz,sort:[].sort,splice:[].splice};bF.fn.init.prototype=bF.fn;bF.extend=bF.fn.extend=function(){var b9,b2,b0,b1,b6,b7,b5=arguments[0]||{},b4=1,b3=arguments.length,b8=false;if(typeof b5==="boolean"){b8=b5;b5=arguments[1]||{};b4=2}if(typeof b5!=="object"&&!bF.isFunction(b5)){b5={}}if(b3===b4){b5=this;--b4}for(;b4<b3;b4++){if((b9=arguments[b4])!=null){for(b2 in b9){b0=b5[b2];b1=b9[b2];if(b5===b1){continue}if(b8&&b1&&(bF.isPlainObject(b1)||(b6=bF.isArray(b1)))){if(b6){b6=false;b7=b0&&bF.isArray(b0)?b0:[]}else{b7=b0&&bF.isPlainObject(b0)?b0:{}}b5[b2]=bF.extend(b8,b7,b1)}else{if(b1!==L){b5[b2]=b1}}}}}return b5};bF.extend({noConflict:function(b0){if(bb.$===bF){bb.$=bH}if(b0&&bb.jQuery===bF){bb.jQuery=bU}return bF},isReady:false,readyWait:1,holdReady:function(b0){if(b0){bF.readyWait++}else{bF.ready(true)}},ready:function(b0){if((b0===true&&!--bF.readyWait)||(b0!==true&&!bF.isReady)){if(!av.body){return setTimeout(bF.ready,1)}bF.isReady=true;if(b0!==true&&--bF.readyWait>0){return}bC.fireWith(av,[bF]);if(bF.fn.trigger){bF(av).trigger("ready").off("ready")}}},bindReady:function(){if(bC){return}bC=bF.Callbacks("once memory");if(av.readyState==="complete"){return setTimeout(bF.ready,1)}if(av.addEventListener){av.addEventListener("DOMContentLoaded",e,false);bb.addEventListener("load",bF.ready,false)}else{if(av.attachEvent){av.attachEvent("onreadystatechange",e);bb.attachEvent("onload",bF.ready);var b0=false;try{b0=bb.frameElement==null}catch(b1){}if(av.documentElement.doScroll&&b0){bw()}}}},isFunction:function(b0){return bF.type(b0)==="function"},isArray:Array.isArray||function(b0){return bF.type(b0)==="array"},isWindow:function(b0){return b0&&typeof b0==="object"&&"setInterval" in b0},isNumeric:function(b0){return !isNaN(parseFloat(b0))&&isFinite(b0)},type:function(b0){return b0==null?String(b0):bx[bL.call(b0)]||"object"},isPlainObject:function(b2){if(!b2||bF.type(b2)!=="object"||b2.nodeType||bF.isWindow(b2)){return false}try{if(b2.constructor&&!bG.call(b2,"constructor")&&!bG.call(b2.constructor.prototype,"isPrototypeOf")){return false}}catch(b1){return false}var b0;for(b0 in b2){}return b0===L||bG.call(b2,b0)},isEmptyObject:function(b1){for(var b0 in b1){return false}return true},error:function(b0){throw new Error(b0)},parseJSON:function(b0){if(typeof b0!=="string"||!b0){return null}b0=bF.trim(b0);if(bb.JSON&&bb.JSON.parse){return bb.JSON.parse(b0)}if(bN.test(b0.replace(bW,"@").replace(bP,"]").replace(bJ,""))){return(new Function("return "+b0))()}bF.error("Invalid JSON: "+b0)},parseXML:function(b2){var b0,b1;try{if(bb.DOMParser){b1=new DOMParser();b0=b1.parseFromString(b2,"text/xml")}else{b0=new ActiveXObject("Microsoft.XMLDOM");b0.async="false";b0.loadXML(b2)}}catch(b3){b0=L}if(!b0||!b0.documentElement||b0.getElementsByTagName("parsererror").length){bF.error("Invalid XML: "+b2)}return b0},noop:function(){},globalEval:function(b0){if(b0&&bM.test(b0)){(bb.execScript||function(b1){bb["eval"].call(bb,b1)})(b0)}},camelCase:function(b0){return b0.replace(bZ,"ms-").replace(bB,bT)},nodeName:function(b1,b0){return b1.nodeName&&b1.nodeName.toUpperCase()===b0.toUpperCase()},each:function(b3,b6,b2){var b1,b4=0,b5=b3.length,b0=b5===L||bF.isFunction(b3);if(b2){if(b0){for(b1 in b3){if(b6.apply(b3[b1],b2)===false){break}}}else{for(;b4<b5;){if(b6.apply(b3[b4++],b2)===false){break}}}}else{if(b0){for(b1 in b3){if(b6.call(b3[b1],b1,b3[b1])===false){break}}}else{for(;b4<b5;){if(b6.call(b3[b4],b4,b3[b4++])===false){break}}}}return b3},trim:bO?function(b0){return b0==null?"":bO.call(b0)}:function(b0){return b0==null?"":b0.toString().replace(bI,"").replace(bE,"")},makeArray:function(b3,b1){var b0=b1||[];if(b3!=null){var b2=bF.type(b3);if(b3.length==null||b2==="string"||b2==="function"||b2==="regexp"||bF.isWindow(b3)){bz.call(b0,b3)}else{bF.merge(b0,b3)}}return b0},inArray:function(b2,b3,b1){var b0;if(b3){if(bv){return bv.call(b3,b2,b1)}b0=b3.length;b1=b1?b1<0?Math.max(0,b0+b1):b1:0;for(;b1<b0;b1++){if(b1 in b3&&b3[b1]===b2){return b1}}}return -1},merge:function(b4,b2){var b3=b4.length,b1=0;if(typeof b2.length==="number"){for(var b0=b2.length;b1<b0;b1++){b4[b3++]=b2[b1]}}else{while(b2[b1]!==L){b4[b3++]=b2[b1++]}}b4.length=b3;return b4},grep:function(b1,b6,b0){var b2=[],b5;b0=!!b0;for(var b3=0,b4=b1.length;b3<b4;b3++){b5=!!b6(b1[b3],b3);if(b0!==b5){b2.push(b1[b3])}}return b2},map:function(b0,b7,b8){var b5,b6,b4=[],b2=0,b1=b0.length,b3=b0 instanceof bF||b1!==L&&typeof b1==="number"&&((b1>0&&b0[0]&&b0[b1-1])||b1===0||bF.isArray(b0));if(b3){for(;b2<b1;b2++){b5=b7(b0[b2],b2,b8);if(b5!=null){b4[b4.length]=b5}}}else{for(b6 in b0){b5=b7(b0[b6],b6,b8);if(b5!=null){b4[b4.length]=b5}}}return b4.concat.apply([],b4)},guid:1,proxy:function(b4,b3){if(typeof b3==="string"){var b2=b4[b3];b3=b4;b4=b2}if(!bF.isFunction(b4)){return L}var b0=bK.call(arguments,2),b1=function(){return b4.apply(b3,b0.concat(bK.call(arguments)))};b1.guid=b4.guid=b4.guid||b1.guid||bF.guid++;return b1},access:function(b0,b8,b6,b2,b5,b7){var b1=b0.length;if(typeof b8==="object"){for(var b3 in b8){bF.access(b0,b3,b8[b3],b2,b5,b6)}return b0}if(b6!==L){b2=!b7&&b2&&bF.isFunction(b6);for(var b4=0;b4<b1;b4++){b5(b0[b4],b8,b2?b6.call(b0[b4],b4,b5(b0[b4],b8)):b6,b7)}return b0}return b1?b5(b0[0],b8):L},now:function(){return(new Date()).getTime()},uaMatch:function(b1){b1=b1.toLowerCase();var b0=by.exec(b1)||bR.exec(b1)||bQ.exec(b1)||b1.indexOf("compatible")<0&&bS.exec(b1)||[];return{browser:b0[1]||"",version:b0[2]||"0"}},sub:function(){function b0(b3,b4){return new b0.fn.init(b3,b4)}bF.extend(true,b0,this);b0.superclass=this;b0.fn=b0.prototype=this();b0.fn.constructor=b0;b0.sub=this.sub;b0.fn.init=function b2(b3,b4){if(b4&&b4 instanceof bF&&!(b4 instanceof b0)){b4=b0(b4)}return bF.fn.init.call(this,b3,b4,b1)};b0.fn.init.prototype=b0.fn;var b1=b0(av);return b0},browser:{}});bF.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(b1,b0){bx["[object "+b0+"]"]=b0.toLowerCase()});bV=bF.uaMatch(bX);if(bV.browser){bF.browser[bV.browser]=true;bF.browser.version=bV.version}if(bF.browser.webkit){bF.browser.safari=true}if(bM.test("\xA0")){bI=/^[\s\xA0]+/;bE=/[\s\xA0]+$/}bD=bF(av);if(av.addEventListener){e=function(){av.removeEventListener("DOMContentLoaded",e,false);bF.ready()}}else{if(av.attachEvent){e=function(){if(av.readyState==="complete"){av.detachEvent("onreadystatechange",e);bF.ready()}}}}function bw(){if(bF.isReady){return}try{av.documentElement.doScroll("left")}catch(b0){setTimeout(bw,1);return}bF.ready()}return bF})();var a2={};function X(e){var bv=a2[e]={},bw,bx;e=e.split(/\s+/);for(bw=0,bx=e.length;bw<bx;bw++){bv[e[bw]]=true}return bv}b.Callbacks=function(bw){bw=bw?(a2[bw]||X(bw)):{};var bB=[],bC=[],bx,by,bv,bz,bA,bE=function(bF){var bG,bJ,bI,bH,bK;for(bG=0,bJ=bF.length;bG<bJ;bG++){bI=bF[bG];bH=b.type(bI);if(bH==="array"){bE(bI)}else{if(bH==="function"){if(!bw.unique||!bD.has(bI)){bB.push(bI)}}}}},e=function(bG,bF){bF=bF||[];bx=!bw.memory||[bG,bF];by=true;bA=bv||0;bv=0;bz=bB.length;for(;bB&&bA<bz;bA++){if(bB[bA].apply(bG,bF)===false&&bw.stopOnFalse){bx=true;break}}by=false;if(bB){if(!bw.once){if(bC&&bC.length){bx=bC.shift();bD.fireWith(bx[0],bx[1])}}else{if(bx===true){bD.disable()}else{bB=[]}}}},bD={add:function(){if(bB){var bF=bB.length;bE(arguments);if(by){bz=bB.length}else{if(bx&&bx!==true){bv=bF;e(bx[0],bx[1])}}}return this},remove:function(){if(bB){var bF=arguments,bH=0,bI=bF.length;for(;bH<bI;bH++){for(var bG=0;bG<bB.length;bG++){if(bF[bH]===bB[bG]){if(by){if(bG<=bz){bz--;if(bG<=bA){bA--}}}bB.splice(bG--,1);if(bw.unique){break}}}}}return this},has:function(bG){if(bB){var bF=0,bH=bB.length;for(;bF<bH;bF++){if(bG===bB[bF]){return true}}}return false},empty:function(){bB=[];return this},disable:function(){bB=bC=bx=L;return this},disabled:function(){return !bB},lock:function(){bC=L;if(!bx||bx===true){bD.disable()}return this},locked:function(){return !bC},fireWith:function(bG,bF){if(bC){if(by){if(!bw.once){bC.push([bG,bF])}}else{if(!(bw.once&&bx)){e(bG,bF)}}}return this},fire:function(){bD.fireWith(this,arguments);return this},fired:function(){return !!bx}};return bD};var aJ=[].slice;b.extend({Deferred:function(by){var bx=b.Callbacks("once memory"),bw=b.Callbacks("once memory"),bv=b.Callbacks("memory"),e="pending",bA={resolve:bx,reject:bw,notify:bv},bC={done:bx.add,fail:bw.add,progress:bv.add,state:function(){return e},isResolved:bx.fired,isRejected:bw.fired,then:function(bE,bD,bF){bB.done(bE).fail(bD).progress(bF);return this},always:function(){bB.done.apply(bB,arguments).fail.apply(bB,arguments);return this},pipe:function(bF,bE,bD){return b.Deferred(function(bG){b.each({done:[bF,"resolve"],fail:[bE,"reject"],progress:[bD,"notify"]},function(bI,bL){var bH=bL[0],bK=bL[1],bJ;if(b.isFunction(bH)){bB[bI](function(){bJ=bH.apply(this,arguments);if(bJ&&b.isFunction(bJ.promise)){bJ.promise().then(bG.resolve,bG.reject,bG.notify)}else{bG[bK+"With"](this===bB?bG:this,[bJ])}})}else{bB[bI](bG[bK])}})}).promise()},promise:function(bE){if(bE==null){bE=bC}else{for(var bD in bC){bE[bD]=bC[bD]}}return bE}},bB=bC.promise({}),bz;for(bz in bA){bB[bz]=bA[bz].fire;bB[bz+"With"]=bA[bz].fireWith}bB.done(function(){e="resolved"},bw.disable,bv.lock).fail(function(){e="rejected"},bx.disable,bv.lock);if(by){by.call(bB,bB)}return bB},when:function(bA){var bx=aJ.call(arguments,0),bv=0,e=bx.length,bB=new Array(e),bw=e,by=e,bC=e<=1&&bA&&b.isFunction(bA.promise)?bA:b.Deferred(),bE=bC.promise();function bD(bF){return function(bG){bx[bF]=arguments.length>1?aJ.call(arguments,0):bG;if(!(--bw)){bC.resolveWith(bC,bx)}}}function bz(bF){return function(bG){bB[bF]=arguments.length>1?aJ.call(arguments,0):bG;bC.notifyWith(bE,bB)}}if(e>1){for(;bv<e;bv++){if(bx[bv]&&bx[bv].promise&&b.isFunction(bx[bv].promise)){bx[bv].promise().then(bD(bv),bC.reject,bz(bv))}else{--bw}}if(!bw){bC.resolveWith(bC,bx)}}else{if(bC!==bA){bC.resolveWith(bC,e?[bA]:[])}}return bE}});b.support=(function(){var bJ,bI,bF,bG,bx,bE,bA,bD,bz,bK,bB,by,bw,bv=av.createElement("div"),bH=av.documentElement;bv.setAttribute("className","t");bv.innerHTML=" <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>";bI=bv.getElementsByTagName("*");bF=bv.getElementsByTagName("a")[0];if(!bI||!bI.length||!bF){return{}}bG=av.createElement("select");bx=bG.appendChild(av.createElement("option"));bE=bv.getElementsByTagName("input")[0];bJ={leadingWhitespace:(bv.firstChild.nodeType===3),tbody:!bv.getElementsByTagName("tbody").length,htmlSerialize:!!bv.getElementsByTagName("link").length,style:/top/.test(bF.getAttribute("style")),hrefNormalized:(bF.getAttribute("href")==="/a"),opacity:/^0.55/.test(bF.style.opacity),cssFloat:!!bF.style.cssFloat,checkOn:(bE.value==="on"),optSelected:bx.selected,getSetAttribute:bv.className!=="t",enctype:!!av.createElement("form").enctype,html5Clone:av.createElement("nav").cloneNode(true).outerHTML!=="<:nav></:nav>",submitBubbles:true,changeBubbles:true,focusinBubbles:false,deleteExpando:true,noCloneEvent:true,inlineBlockNeedsLayout:false,shrinkWrapBlocks:false,reliableMarginRight:true};bE.checked=true;bJ.noCloneChecked=bE.cloneNode(true).checked;bG.disabled=true;bJ.optDisabled=!bx.disabled;try{delete bv.test}catch(bC){bJ.deleteExpando=false}if(!bv.addEventListener&&bv.attachEvent&&bv.fireEvent){bv.attachEvent("onclick",function(){bJ.noCloneEvent=false});bv.cloneNode(true).fireEvent("onclick")}bE=av.createElement("input");bE.value="t";bE.setAttribute("type","radio");bJ.radioValue=bE.value==="t";bE.setAttribute("checked","checked");bv.appendChild(bE);bD=av.createDocumentFragment();bD.appendChild(bv.lastChild);bJ.checkClone=bD.cloneNode(true).cloneNode(true).lastChild.checked;bJ.appendChecked=bE.checked;bD.removeChild(bE);bD.appendChild(bv);bv.innerHTML="";if(bb.getComputedStyle){bA=av.createElement("div");bA.style.width="0";bA.style.marginRight="0";bv.style.width="2px";bv.appendChild(bA);bJ.reliableMarginRight=(parseInt((bb.getComputedStyle(bA,null)||{marginRight:0}).marginRight,10)||0)===0}if(bv.attachEvent){for(by in {submit:1,change:1,focusin:1}){bB="on"+by;bw=(bB in bv);if(!bw){bv.setAttribute(bB,"return;");bw=(typeof bv[bB]==="function")}bJ[by+"Bubbles"]=bw}}bD.removeChild(bv);bD=bG=bx=bA=bv=bE=null;b(function(){var bM,bU,bV,bT,bN,bO,bL,bS,bR,e,bP,bQ=av.getElementsByTagName("body")[0];if(!bQ){return}bL=1;bS="position:absolute;top:0;left:0;width:1px;height:1px;margin:0;";bR="visibility:hidden;border:0;";e="style='"+bS+"border:5px solid #000;padding:0;'";bP="<div "+e+"><div></div></div><table "+e+" cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";bM=av.createElement("div");bM.style.cssText=bR+"width:0;height:0;position:static;top:0;margin-top:"+bL+"px";bQ.insertBefore(bM,bQ.firstChild);bv=av.createElement("div");bM.appendChild(bv);bv.innerHTML="<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>";bz=bv.getElementsByTagName("td");bw=(bz[0].offsetHeight===0);bz[0].style.display="";bz[1].style.display="none";bJ.reliableHiddenOffsets=bw&&(bz[0].offsetHeight===0);bv.innerHTML="";bv.style.width=bv.style.paddingLeft="1px";b.boxModel=bJ.boxModel=bv.offsetWidth===2;if(typeof bv.style.zoom!=="undefined"){bv.style.display="inline";bv.style.zoom=1;bJ.inlineBlockNeedsLayout=(bv.offsetWidth===2);bv.style.display="";bv.innerHTML="<div style='width:4px;'></div>";bJ.shrinkWrapBlocks=(bv.offsetWidth!==2)}bv.style.cssText=bS+bR;bv.innerHTML=bP;bU=bv.firstChild;bV=bU.firstChild;bN=bU.nextSibling.firstChild.firstChild;bO={doesNotAddBorder:(bV.offsetTop!==5),doesAddBorderForTableAndCells:(bN.offsetTop===5)};bV.style.position="fixed";bV.style.top="20px";bO.fixedPosition=(bV.offsetTop===20||bV.offsetTop===15);bV.style.position=bV.style.top="";bU.style.overflow="hidden";bU.style.position="relative";bO.subtractsBorderForOverflowNotVisible=(bV.offsetTop===-5);bO.doesNotIncludeMarginInBodyOffset=(bQ.offsetTop!==bL);bQ.removeChild(bM);bv=bM=null;b.extend(bJ,bO)});return bJ})();var aS=/^(?:\{.*\}|\[.*\])$/,aA=/([A-Z])/g;b.extend({cache:{},uuid:0,expando:"jQuery"+(b.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:true,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:true},hasData:function(e){e=e.nodeType?b.cache[e[b.expando]]:e[b.expando];return !!e&&!S(e)},data:function(bx,bv,bz,by){if(!b.acceptData(bx)){return}var bG,bA,bD,bE=b.expando,bC=typeof bv==="string",bF=bx.nodeType,e=bF?b.cache:bx,bw=bF?bx[bE]:bx[bE]&&bE,bB=bv==="events";if((!bw||!e[bw]||(!bB&&!by&&!e[bw].data))&&bC&&bz===L){return}if(!bw){if(bF){bx[bE]=bw=++b.uuid}else{bw=bE}}if(!e[bw]){e[bw]={};if(!bF){e[bw].toJSON=b.noop}}if(typeof bv==="object"||typeof bv==="function"){if(by){e[bw]=b.extend(e[bw],bv)}else{e[bw].data=b.extend(e[bw].data,bv)}}bG=bA=e[bw];if(!by){if(!bA.data){bA.data={}}bA=bA.data}if(bz!==L){bA[b.camelCase(bv)]=bz}if(bB&&!bA[bv]){return bG.events}if(bC){bD=bA[bv];if(bD==null){bD=bA[b.camelCase(bv)]}}else{bD=bA}return bD},removeData:function(bx,bv,by){if(!b.acceptData(bx)){return}var bB,bA,bz,bC=b.expando,bD=bx.nodeType,e=bD?b.cache:bx,bw=bD?bx[bC]:bC;if(!e[bw]){return}if(bv){bB=by?e[bw]:e[bw].data;if(bB){if(!b.isArray(bv)){if(bv in bB){bv=[bv]}else{bv=b.camelCase(bv);if(bv in bB){bv=[bv]}else{bv=bv.split(" ")}}}for(bA=0,bz=bv.length;bA<bz;bA++){delete bB[bv[bA]]}if(!(by?S:b.isEmptyObject)(bB)){return}}}if(!by){delete e[bw].data;if(!S(e[bw])){return}}if(b.support.deleteExpando||!e.setInterval){delete e[bw]}else{e[bw]=null}if(bD){if(b.support.deleteExpando){delete bx[bC]}else{if(bx.removeAttribute){bx.removeAttribute(bC)}else{bx[bC]=null}}}},_data:function(bv,e,bw){return b.data(bv,e,bw,true)},acceptData:function(bv){if(bv.nodeName){var e=b.noData[bv.nodeName.toLowerCase()];if(e){return !(e===true||bv.getAttribute("classid")!==e)}}return true}});b.fn.extend({data:function(by,bA){var bB,e,bw,bz=null;if(typeof by==="undefined"){if(this.length){bz=b.data(this[0]);if(this[0].nodeType===1&&!b._data(this[0],"parsedAttrs")){e=this[0].attributes;for(var bx=0,bv=e.length;bx<bv;bx++){bw=e[bx].name;if(bw.indexOf("data-")===0){bw=b.camelCase(bw.substring(5));a5(this[0],bw,bz[bw])}}b._data(this[0],"parsedAttrs",true)}}return bz}else{if(typeof by==="object"){return this.each(function(){b.data(this,by)})}}bB=by.split(".");bB[1]=bB[1]?"."+bB[1]:"";if(bA===L){bz=this.triggerHandler("getData"+bB[1]+"!",[bB[0]]);if(bz===L&&this.length){bz=b.data(this[0],by);bz=a5(this[0],by,bz)}return bz===L&&bB[1]?this.data(bB[0]):bz}else{return this.each(function(){var bC=b(this),bD=[bB[0],bA];bC.triggerHandler("setData"+bB[1]+"!",bD);b.data(this,by,bA);bC.triggerHandler("changeData"+bB[1]+"!",bD)})}},removeData:function(e){return this.each(function(){b.removeData(this,e)})}});function a5(bx,bw,by){if(by===L&&bx.nodeType===1){var bv="data-"+bw.replace(aA,"-$1").toLowerCase();by=bx.getAttribute(bv);if(typeof by==="string"){try{by=by==="true"?true:by==="false"?false:by==="null"?null:b.isNumeric(by)?parseFloat(by):aS.test(by)?b.parseJSON(by):by}catch(bz){}b.data(bx,bw,by)}else{by=L}}return by}function S(bv){for(var e in bv){if(e==="data"&&b.isEmptyObject(bv[e])){continue}if(e!=="toJSON"){return false}}return true}function bi(by,bx,bA){var bw=bx+"defer",bv=bx+"queue",e=bx+"mark",bz=b._data(by,bw);if(bz&&(bA==="queue"||!b._data(by,bv))&&(bA==="mark"||!b._data(by,e))){setTimeout(function(){if(!b._data(by,bv)&&!b._data(by,e)){b.removeData(by,bw,true);bz.fire()}},0)}}b.extend({_mark:function(bv,e){if(bv){e=(e||"fx")+"mark";b._data(bv,e,(b._data(bv,e)||0)+1)}},_unmark:function(by,bx,bv){if(by!==true){bv=bx;bx=by;by=false}if(bx){bv=bv||"fx";var e=bv+"mark",bw=by?0:((b._data(bx,e)||1)-1);if(bw){b._data(bx,e,bw)}else{b.removeData(bx,e,true);bi(bx,bv,"mark")}}},queue:function(bv,e,bx){var bw;if(bv){e=(e||"fx")+"queue";bw=b._data(bv,e);if(bx){if(!bw||b.isArray(bx)){bw=b._data(bv,e,b.makeArray(bx))}else{bw.push(bx)}}return bw||[]}},dequeue:function(by,bx){bx=bx||"fx";var bv=b.queue(by,bx),bw=bv.shift(),e={};if(bw==="inprogress"){bw=bv.shift()}if(bw){if(bx==="fx"){bv.unshift("inprogress")}b._data(by,bx+".run",e);bw.call(by,function(){b.dequeue(by,bx)},e)}if(!bv.length){b.removeData(by,bx+"queue "+bx+".run",true);bi(by,bx,"queue")}}});b.fn.extend({queue:function(e,bv){if(typeof e!=="string"){bv=e;e="fx"}if(bv===L){return b.queue(this[0],e)}return this.each(function(){var bw=b.queue(this,e,bv);if(e==="fx"&&bw[0]!=="inprogress"){b.dequeue(this,e)}})},dequeue:function(e){return this.each(function(){b.dequeue(this,e)})},delay:function(bv,e){bv=b.fx?b.fx.speeds[bv]||bv:bv;e=e||"fx";return this.queue(e,function(bx,bw){var by=setTimeout(bx,bv);bw.stop=function(){clearTimeout(by)}})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(bD,bw){if(typeof bD!=="string"){bw=bD;bD=L}bD=bD||"fx";var e=b.Deferred(),bv=this,by=bv.length,bB=1,bz=bD+"defer",bA=bD+"queue",bC=bD+"mark",bx;function bE(){if(!(--bB)){e.resolveWith(bv,[bv])}}while(by--){if((bx=b.data(bv[by],bz,L,true)||(b.data(bv[by],bA,L,true)||b.data(bv[by],bC,L,true))&&b.data(bv[by],bz,b.Callbacks("once memory"),true))){bB++;bx.add(bE)}}bE();return e.promise()}});var aP=/[\n\t\r]/g,af=/\s+/,aU=/\r/g,g=/^(?:button|input)$/i,D=/^(?:button|input|object|select|textarea)$/i,l=/^a(?:rea)?$/i,ao=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,F=b.support.getSetAttribute,be,aY,aF;b.fn.extend({attr:function(e,bv){return b.access(this,e,bv,true,b.attr)},removeAttr:function(e){return this.each(function(){b.removeAttr(this,e)})},prop:function(e,bv){return b.access(this,e,bv,true,b.prop)},removeProp:function(e){e=b.propFix[e]||e;return this.each(function(){try{this[e]=L;delete this[e]}catch(bv){}})},addClass:function(by){var bA,bw,bv,bx,bz,bB,e;if(b.isFunction(by)){return this.each(function(bC){b(this).addClass(by.call(this,bC,this.className))})}if(by&&typeof by==="string"){bA=by.split(af);for(bw=0,bv=this.length;bw<bv;bw++){bx=this[bw];if(bx.nodeType===1){if(!bx.className&&bA.length===1){bx.className=by}else{bz=" "+bx.className+" ";for(bB=0,e=bA.length;bB<e;bB++){if(!~bz.indexOf(" "+bA[bB]+" ")){bz+=bA[bB]+" "}}bx.className=b.trim(bz)}}}}return this},removeClass:function(bz){var bA,bw,bv,by,bx,bB,e;if(b.isFunction(bz)){return this.each(function(bC){b(this).removeClass(bz.call(this,bC,this.className))})}if((bz&&typeof bz==="string")||bz===L){bA=(bz||"").split(af);for(bw=0,bv=this.length;bw<bv;bw++){by=this[bw];if(by.nodeType===1&&by.className){if(bz){bx=(" "+by.className+" ").replace(aP," ");for(bB=0,e=bA.length;bB<e;bB++){bx=bx.replace(" "+bA[bB]+" "," ")}by.className=b.trim(bx)}else{by.className=""}}}}return this},toggleClass:function(bx,bv){var bw=typeof bx,e=typeof bv==="boolean";if(b.isFunction(bx)){return this.each(function(by){b(this).toggleClass(bx.call(this,by,this.className,bv),bv)})}return this.each(function(){if(bw==="string"){var bA,bz=0,by=b(this),bB=bv,bC=bx.split(af);while((bA=bC[bz++])){bB=e?bB:!by.hasClass(bA);by[bB?"addClass":"removeClass"](bA)}}else{if(bw==="undefined"||bw==="boolean"){if(this.className){b._data(this,"__className__",this.className)}this.className=this.className||bx===false?"":b._data(this,"__className__")||""}}})},hasClass:function(e){var bx=" "+e+" ",bw=0,bv=this.length;for(;bw<bv;bw++){if(this[bw].nodeType===1&&(" "+this[bw].className+" ").replace(aP," ").indexOf(bx)>-1){return true}}return false},val:function(bx){var e,bv,by,bw=this[0];if(!arguments.length){if(bw){e=b.valHooks[bw.nodeName.toLowerCase()]||b.valHooks[bw.type];if(e&&"get" in e&&(bv=e.get(bw,"value"))!==L){return bv}bv=bw.value;return typeof bv==="string"?bv.replace(aU,""):bv==null?"":bv}return}by=b.isFunction(bx);return this.each(function(bA){var bz=b(this),bB;if(this.nodeType!==1){return}if(by){bB=bx.call(this,bA,bz.val())}else{bB=bx}if(bB==null){bB=""}else{if(typeof bB==="number"){bB+=""}else{if(b.isArray(bB)){bB=b.map(bB,function(bC){return bC==null?"":bC+""})}}}e=b.valHooks[this.nodeName.toLowerCase()]||b.valHooks[this.type];if(!e||!("set" in e)||e.set(this,bB,"value")===L){this.value=bB}})}});b.extend({valHooks:{option:{get:function(e){var bv=e.attributes.value;return !bv||bv.specified?e.value:e.text}},select:{get:function(e){var bA,bv,bz,bx,by=e.selectedIndex,bB=[],bC=e.options,bw=e.type==="select-one";if(by<0){return null}bv=bw?by:0;bz=bw?by+1:bC.length;for(;bv<bz;bv++){bx=bC[bv];if(bx.selected&&(b.support.optDisabled?!bx.disabled:bx.getAttribute("disabled")===null)&&(!bx.parentNode.disabled||!b.nodeName(bx.parentNode,"optgroup"))){bA=b(bx).val();if(bw){return bA}bB.push(bA)}}if(bw&&!bB.length&&bC.length){return b(bC[by]).val()}return bB},set:function(bv,bw){var e=b.makeArray(bw);b(bv).find("option").each(function(){this.selected=b.inArray(b(this).val(),e)>=0});if(!e.length){bv.selectedIndex=-1}return e}}},attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true},attr:function(bA,bx,bB,bz){var bw,e,by,bv=bA.nodeType;if(!bA||bv===3||bv===8||bv===2){return}if(bz&&bx in b.attrFn){return b(bA)[bx](bB)}if(typeof bA.getAttribute==="undefined"){return b.prop(bA,bx,bB)}by=bv!==1||!b.isXMLDoc(bA);if(by){bx=bx.toLowerCase();e=b.attrHooks[bx]||(ao.test(bx)?aY:be)}if(bB!==L){if(bB===null){b.removeAttr(bA,bx);return}else{if(e&&"set" in e&&by&&(bw=e.set(bA,bB,bx))!==L){return bw}else{bA.setAttribute(bx,""+bB);return bB}}}else{if(e&&"get" in e&&by&&(bw=e.get(bA,bx))!==null){return bw}else{bw=bA.getAttribute(bx);return bw===null?L:bw}}},removeAttr:function(bx,bz){var by,bA,bv,e,bw=0;if(bz&&bx.nodeType===1){bA=bz.toLowerCase().split(af);e=bA.length;for(;bw<e;bw++){bv=bA[bw];if(bv){by=b.propFix[bv]||bv;b.attr(bx,bv,"");bx.removeAttribute(F?bv:by);if(ao.test(bv)&&by in bx){bx[by]=false}}}}},attrHooks:{type:{set:function(e,bv){if(g.test(e.nodeName)&&e.parentNode){b.error("type property can't be changed")}else{if(!b.support.radioValue&&bv==="radio"&&b.nodeName(e,"input")){var bw=e.value;e.setAttribute("type",bv);if(bw){e.value=bw}return bv}}}},value:{get:function(bv,e){if(be&&b.nodeName(bv,"button")){return be.get(bv,e)}return e in bv?bv.value:null},set:function(bv,bw,e){if(be&&b.nodeName(bv,"button")){return be.set(bv,bw,e)}bv.value=bw}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(bz,bx,bA){var bw,e,by,bv=bz.nodeType;if(!bz||bv===3||bv===8||bv===2){return}by=bv!==1||!b.isXMLDoc(bz);if(by){bx=b.propFix[bx]||bx;e=b.propHooks[bx]}if(bA!==L){if(e&&"set" in e&&(bw=e.set(bz,bA,bx))!==L){return bw}else{return(bz[bx]=bA)}}else{if(e&&"get" in e&&(bw=e.get(bz,bx))!==null){return bw}else{return bz[bx]}}},propHooks:{tabIndex:{get:function(bv){var e=bv.getAttributeNode("tabindex");return e&&e.specified?parseInt(e.value,10):D.test(bv.nodeName)||l.test(bv.nodeName)&&bv.href?0:L}}}});b.attrHooks.tabindex=b.propHooks.tabIndex;aY={get:function(bv,e){var bx,bw=b.prop(bv,e);return bw===true||typeof bw!=="boolean"&&(bx=bv.getAttributeNode(e))&&bx.nodeValue!==false?e.toLowerCase():L},set:function(bv,bx,e){var bw;if(bx===false){b.removeAttr(bv,e)}else{bw=b.propFix[e]||e;if(bw in bv){bv[bw]=true}bv.setAttribute(e,e.toLowerCase())}return e}};if(!F){aF={name:true,id:true};be=b.valHooks.button={get:function(bw,bv){var e;e=bw.getAttributeNode(bv);return e&&(aF[bv]?e.nodeValue!=="":e.specified)?e.nodeValue:L},set:function(bw,bx,bv){var e=bw.getAttributeNode(bv);if(!e){e=av.createAttribute(bv);bw.setAttributeNode(e)}return(e.nodeValue=bx+"")}};b.attrHooks.tabindex.set=be.set;b.each(["width","height"],function(bv,e){b.attrHooks[e]=b.extend(b.attrHooks[e],{set:function(bw,bx){if(bx===""){bw.setAttribute(e,"auto");return bx}}})});b.attrHooks.contenteditable={get:be.get,set:function(bv,bw,e){if(bw===""){bw="false"}be.set(bv,bw,e)}}}if(!b.support.hrefNormalized){b.each(["href","src","width","height"],function(bv,e){b.attrHooks[e]=b.extend(b.attrHooks[e],{get:function(bx){var bw=bx.getAttribute(e,2);return bw===null?L:bw}})})}if(!b.support.style){b.attrHooks.style={get:function(e){return e.style.cssText.toLowerCase()||L},set:function(e,bv){return(e.style.cssText=""+bv)}}}if(!b.support.optSelected){b.propHooks.selected=b.extend(b.propHooks.selected,{get:function(bv){var e=bv.parentNode;if(e){e.selectedIndex;if(e.parentNode){e.parentNode.selectedIndex}}return null}})}if(!b.support.enctype){b.propFix.enctype="encoding"}if(!b.support.checkOn){b.each(["radio","checkbox"],function(){b.valHooks[this]={get:function(e){return e.getAttribute("value")===null?"on":e.value}}})}b.each(["radio","checkbox"],function(){b.valHooks[this]=b.extend(b.valHooks[this],{set:function(e,bv){if(b.isArray(bv)){return(e.checked=b.inArray(b(e).val(),bv)>=0)}}})});var bd=/^(?:textarea|input|select)$/i,n=/^([^\.]*)?(?:\.(.+))?$/,J=/\bhover(\.\S+)?\b/,aO=/^key/,bf=/^(?:mouse|contextmenu)|click/,T=/^(?:focusinfocus|focusoutblur)$/,U=/^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,Y=function(e){var bv=U.exec(e);if(bv){bv[1]=(bv[1]||"").toLowerCase();bv[3]=bv[3]&&new RegExp("(?:^|\\s)"+bv[3]+"(?:\\s|$)")}return bv},j=function(bw,e){var bv=bw.attributes||{};return((!e[1]||bw.nodeName.toLowerCase()===e[1])&&(!e[2]||(bv.id||{}).value===e[2])&&(!e[3]||e[3].test((bv["class"]||{}).value)))},bt=function(e){return b.event.special.hover?e:e.replace(J,"mouseenter$1 mouseleave$1")};b.event={add:function(bx,bC,bJ,bA,by){var bD,bB,bK,bI,bH,bF,e,bG,bv,bz,bw,bE;if(bx.nodeType===3||bx.nodeType===8||!bC||!bJ||!(bD=b._data(bx))){return}if(bJ.handler){bv=bJ;bJ=bv.handler}if(!bJ.guid){bJ.guid=b.guid++}bK=bD.events;if(!bK){bD.events=bK={}}bB=bD.handle;if(!bB){bD.handle=bB=function(bL){return typeof b!=="undefined"&&(!bL||b.event.triggered!==bL.type)?b.event.dispatch.apply(bB.elem,arguments):L};bB.elem=bx}bC=b.trim(bt(bC)).split(" ");for(bI=0;bI<bC.length;bI++){bH=n.exec(bC[bI])||[];bF=bH[1];e=(bH[2]||"").split(".").sort();bE=b.event.special[bF]||{};bF=(by?bE.delegateType:bE.bindType)||bF;bE=b.event.special[bF]||{};bG=b.extend({type:bF,origType:bH[1],data:bA,handler:bJ,guid:bJ.guid,selector:by,quick:Y(by),namespace:e.join(".")},bv);bw=bK[bF];if(!bw){bw=bK[bF]=[];bw.delegateCount=0;if(!bE.setup||bE.setup.call(bx,bA,e,bB)===false){if(bx.addEventListener){bx.addEventListener(bF,bB,false)}else{if(bx.attachEvent){bx.attachEvent("on"+bF,bB)}}}}if(bE.add){bE.add.call(bx,bG);if(!bG.handler.guid){bG.handler.guid=bJ.guid}}if(by){bw.splice(bw.delegateCount++,0,bG)}else{bw.push(bG)}b.event.global[bF]=true}bx=null},global:{},remove:function(bJ,bE,bv,bH,bB){var bI=b.hasData(bJ)&&b._data(bJ),bF,bx,bz,bL,bC,bA,bG,bw,by,bK,bD,e;if(!bI||!(bw=bI.events)){return}bE=b.trim(bt(bE||"")).split(" ");for(bF=0;bF<bE.length;bF++){bx=n.exec(bE[bF])||[];bz=bL=bx[1];bC=bx[2];if(!bz){for(bz in bw){b.event.remove(bJ,bz+bE[bF],bv,bH,true)}continue}by=b.event.special[bz]||{};bz=(bH?by.delegateType:by.bindType)||bz;bD=bw[bz]||[];bA=bD.length;bC=bC?new RegExp("(^|\\.)"+bC.split(".").sort().join("\\.(?:.*\\.)?")+"(\\.|$)"):null;for(bG=0;bG<bD.length;bG++){e=bD[bG];if((bB||bL===e.origType)&&(!bv||bv.guid===e.guid)&&(!bC||bC.test(e.namespace))&&(!bH||bH===e.selector||bH==="**"&&e.selector)){bD.splice(bG--,1);if(e.selector){bD.delegateCount--}if(by.remove){by.remove.call(bJ,e)}}}if(bD.length===0&&bA!==bD.length){if(!by.teardown||by.teardown.call(bJ,bC)===false){b.removeEvent(bJ,bz,bI.handle)}delete bw[bz]}}if(b.isEmptyObject(bw)){bK=bI.handle;if(bK){bK.elem=null}b.removeData(bJ,["events","handle"],true)}},customEvent:{getData:true,setData:true,changeData:true},trigger:function(bv,bD,bA,bJ){if(bA&&(bA.nodeType===3||bA.nodeType===8)){return}var bG=bv.type||bv,bx=[],e,bw,bC,bH,bz,by,bF,bE,bB,bI;if(T.test(bG+b.event.triggered)){return}if(bG.indexOf("!")>=0){bG=bG.slice(0,-1);bw=true}if(bG.indexOf(".")>=0){bx=bG.split(".");bG=bx.shift();bx.sort()}if((!bA||b.event.customEvent[bG])&&!b.event.global[bG]){return}bv=typeof bv==="object"?bv[b.expando]?bv:new b.Event(bG,bv):new b.Event(bG);bv.type=bG;bv.isTrigger=true;bv.exclusive=bw;bv.namespace=bx.join(".");bv.namespace_re=bv.namespace?new RegExp("(^|\\.)"+bx.join("\\.(?:.*\\.)?")+"(\\.|$)"):null;by=bG.indexOf(":")<0?"on"+bG:"";if(!bA){e=b.cache;for(bC in e){if(e[bC].events&&e[bC].events[bG]){b.event.trigger(bv,bD,e[bC].handle.elem,true)}}return}bv.result=L;if(!bv.target){bv.target=bA}bD=bD!=null?b.makeArray(bD):[];bD.unshift(bv);bF=b.event.special[bG]||{};if(bF.trigger&&bF.trigger.apply(bA,bD)===false){return}bB=[[bA,bF.bindType||bG]];if(!bJ&&!bF.noBubble&&!b.isWindow(bA)){bI=bF.delegateType||bG;bH=T.test(bI+bG)?bA:bA.parentNode;bz=null;for(;bH;bH=bH.parentNode){bB.push([bH,bI]);bz=bH}if(bz&&bz===bA.ownerDocument){bB.push([bz.defaultView||bz.parentWindow||bb,bI])}}for(bC=0;bC<bB.length&&!bv.isPropagationStopped();bC++){bH=bB[bC][0];bv.type=bB[bC][1];bE=(b._data(bH,"events")||{})[bv.type]&&b._data(bH,"handle");if(bE){bE.apply(bH,bD)}bE=by&&bH[by];if(bE&&b.acceptData(bH)&&bE.apply(bH,bD)===false){bv.preventDefault()}}bv.type=bG;if(!bJ&&!bv.isDefaultPrevented()){if((!bF._default||bF._default.apply(bA.ownerDocument,bD)===false)&&!(bG==="click"&&b.nodeName(bA,"a"))&&b.acceptData(bA)){if(by&&bA[bG]&&((bG!=="focus"&&bG!=="blur")||bv.target.offsetWidth!==0)&&!b.isWindow(bA)){bz=bA[by];if(bz){bA[by]=null}b.event.triggered=bG;bA[bG]();b.event.triggered=L;if(bz){bA[by]=bz}}}}return bv.result},dispatch:function(e){e=b.event.fix(e||bb.event);var bz=((b._data(this,"events")||{})[e.type]||[]),bA=bz.delegateCount,bG=[].slice.call(arguments,0),by=!e.exclusive&&!e.namespace,bH=[],bC,bB,bK,bx,bF,bE,bv,bD,bI,bw,bJ;bG[0]=e;e.delegateTarget=this;if(bA&&!e.target.disabled&&!(e.button&&e.type==="click")){bx=b(this);bx.context=this.ownerDocument||this;for(bK=e.target;bK!=this;bK=bK.parentNode||this){bE={};bD=[];bx[0]=bK;for(bC=0;bC<bA;bC++){bI=bz[bC];bw=bI.selector;if(bE[bw]===L){bE[bw]=(bI.quick?j(bK,bI.quick):bx.is(bw))}if(bE[bw]){bD.push(bI)}}if(bD.length){bH.push({elem:bK,matches:bD})}}}if(bz.length>bA){bH.push({elem:this,matches:bz.slice(bA)})}for(bC=0;bC<bH.length&&!e.isPropagationStopped();bC++){bv=bH[bC];e.currentTarget=bv.elem;for(bB=0;bB<bv.matches.length&&!e.isImmediatePropagationStopped();bB++){bI=bv.matches[bB];if(by||(!e.namespace&&!bI.namespace)||e.namespace_re&&e.namespace_re.test(bI.namespace)){e.data=bI.data;e.handleObj=bI;bF=((b.event.special[bI.origType]||{}).handle||bI.handler).apply(bv.elem,bG);if(bF!==L){e.result=bF;if(bF===false){e.preventDefault();e.stopPropagation()}}}}}return e.result},props:"attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(bv,e){if(bv.which==null){bv.which=e.charCode!=null?e.charCode:e.keyCode}return bv}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(bx,bw){var by,bz,e,bv=bw.button,bA=bw.fromElement;if(bx.pageX==null&&bw.clientX!=null){by=bx.target.ownerDocument||av;bz=by.documentElement;e=by.body;bx.pageX=bw.clientX+(bz&&bz.scrollLeft||e&&e.scrollLeft||0)-(bz&&bz.clientLeft||e&&e.clientLeft||0);bx.pageY=bw.clientY+(bz&&bz.scrollTop||e&&e.scrollTop||0)-(bz&&bz.clientTop||e&&e.clientTop||0)}if(!bx.relatedTarget&&bA){bx.relatedTarget=bA===bx.target?bw.toElement:bA}if(!bx.which&&bv!==L){bx.which=(bv&1?1:(bv&2?3:(bv&4?2:0)))}return bx}},fix:function(bw){if(bw[b.expando]){return bw}var bv,bz,e=bw,bx=b.event.fixHooks[bw.type]||{},by=bx.props?this.props.concat(bx.props):this.props;bw=b.Event(e);for(bv=by.length;bv;){bz=by[--bv];bw[bz]=e[bz]}if(!bw.target){bw.target=e.srcElement||av}if(bw.target.nodeType===3){bw.target=bw.target.parentNode}if(bw.metaKey===L){bw.metaKey=bw.ctrlKey}return bx.filter?bx.filter(bw,e):bw},special:{ready:{setup:b.bindReady},load:{noBubble:true},focus:{delegateType:"focusin"},blur:{delegateType:"focusout"},beforeunload:{setup:function(bw,bv,e){if(b.isWindow(this)){this.onbeforeunload=e}},teardown:function(bv,e){if(this.onbeforeunload===e){this.onbeforeunload=null}}}},simulate:function(bw,by,bx,bv){var bz=b.extend(new b.Event(),bx,{type:bw,isSimulated:true,originalEvent:{}});if(bv){b.event.trigger(bz,null,by)}else{b.event.dispatch.call(by,bz)}if(bz.isDefaultPrevented()){bx.preventDefault()}}};b.event.handle=b.event.dispatch;b.removeEvent=av.removeEventListener?function(bv,e,bw){if(bv.removeEventListener){bv.removeEventListener(e,bw,false)}}:function(bv,e,bw){if(bv.detachEvent){bv.detachEvent("on"+e,bw)}};b.Event=function(bv,e){if(!(this instanceof b.Event)){return new b.Event(bv,e)}if(bv&&bv.type){this.originalEvent=bv;this.type=bv.type;this.isDefaultPrevented=(bv.defaultPrevented||bv.returnValue===false||bv.getPreventDefault&&bv.getPreventDefault())?i:bk}else{this.type=bv}if(e){b.extend(this,e)}this.timeStamp=bv&&bv.timeStamp||b.now();this[b.expando]=true};function bk(){return false}function i(){return true}b.Event.prototype={preventDefault:function(){this.isDefaultPrevented=i;var bv=this.originalEvent;if(!bv){return}if(bv.preventDefault){bv.preventDefault()}else{bv.returnValue=false}},stopPropagation:function(){this.isPropagationStopped=i;var bv=this.originalEvent;if(!bv){return}if(bv.stopPropagation){bv.stopPropagation()}bv.cancelBubble=true},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=i;this.stopPropagation()},isDefaultPrevented:bk,isPropagationStopped:bk,isImmediatePropagationStopped:bk};b.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(bv,e){b.event.special[bv]={delegateType:e,bindType:e,handle:function(bz){var bB=this,bA=bz.relatedTarget,by=bz.handleObj,bw=by.selector,bx;if(!bA||(bA!==bB&&!b.contains(bB,bA))){bz.type=by.origType;bx=by.handler.apply(this,arguments);bz.type=e}return bx}}});if(!b.support.submitBubbles){b.event.special.submit={setup:function(){if(b.nodeName(this,"form")){return false}b.event.add(this,"click._submit keypress._submit",function(bx){var bw=bx.target,bv=b.nodeName(bw,"input")||b.nodeName(bw,"button")?bw.form:L;if(bv&&!bv._submit_attached){b.event.add(bv,"submit._submit",function(e){if(this.parentNode&&!e.isTrigger){b.event.simulate("submit",this.parentNode,e,true)}});bv._submit_attached=true}})},teardown:function(){if(b.nodeName(this,"form")){return false}b.event.remove(this,"._submit")}}}if(!b.support.changeBubbles){b.event.special.change={setup:function(){if(bd.test(this.nodeName)){if(this.type==="checkbox"||this.type==="radio"){b.event.add(this,"propertychange._change",function(e){if(e.originalEvent.propertyName==="checked"){this._just_changed=true}});b.event.add(this,"click._change",function(e){if(this._just_changed&&!e.isTrigger){this._just_changed=false;b.event.simulate("change",this,e,true)}})}return false}b.event.add(this,"beforeactivate._change",function(bw){var bv=bw.target;if(bd.test(bv.nodeName)&&!bv._change_attached){b.event.add(bv,"change._change",function(e){if(this.parentNode&&!e.isSimulated&&!e.isTrigger){b.event.simulate("change",this.parentNode,e,true)}});bv._change_attached=true}})},handle:function(bv){var e=bv.target;if(this!==e||bv.isSimulated||bv.isTrigger||(e.type!=="radio"&&e.type!=="checkbox")){return bv.handleObj.handler.apply(this,arguments)}},teardown:function(){b.event.remove(this,"._change");return bd.test(this.nodeName)}}}if(!b.support.focusinBubbles){b.each({focus:"focusin",blur:"focusout"},function(bx,e){var bv=0,bw=function(by){b.event.simulate(e,by.target,b.event.fix(by),true)};b.event.special[e]={setup:function(){if(bv++===0){av.addEventListener(bx,bw,true)}},teardown:function(){if(--bv===0){av.removeEventListener(bx,bw,true)}}}})}b.fn.extend({on:function(bw,e,bz,by,bv){var bA,bx;if(typeof bw==="object"){if(typeof e!=="string"){bz=e;e=L}for(bx in bw){this.on(bx,e,bz,bw[bx],bv)}return this}if(bz==null&&by==null){by=e;bz=e=L}else{if(by==null){if(typeof e==="string"){by=bz;bz=L}else{by=bz;bz=e;e=L}}}if(by===false){by=bk}else{if(!by){return this}}if(bv===1){bA=by;by=function(bB){b().off(bB);return bA.apply(this,arguments)};by.guid=bA.guid||(bA.guid=b.guid++)}return this.each(function(){b.event.add(this,bw,by,bz,e)})},one:function(bv,e,bx,bw){return this.on.call(this,bv,e,bx,bw,1)},off:function(bw,e,by){if(bw&&bw.preventDefault&&bw.handleObj){var bv=bw.handleObj;b(bw.delegateTarget).off(bv.namespace?bv.type+"."+bv.namespace:bv.type,bv.selector,bv.handler);return this}if(typeof bw==="object"){for(var bx in bw){this.off(bx,e,bw[bx])}return this}if(e===false||typeof e==="function"){by=e;e=L}if(by===false){by=bk}return this.each(function(){b.event.remove(this,bw,by,e)})},bind:function(e,bw,bv){return this.on(e,null,bw,bv)},unbind:function(e,bv){return this.off(e,null,bv)},live:function(e,bw,bv){b(this.context).on(e,this.selector,bw,bv);return this},die:function(e,bv){b(this.context).off(e,this.selector||"**",bv);return this},delegate:function(e,bv,bx,bw){return this.on(bv,e,bx,bw)},undelegate:function(e,bv,bw){return arguments.length==1?this.off(e,"**"):this.off(bv,e,bw)},trigger:function(e,bv){return this.each(function(){b.event.trigger(e,bv,this)})},triggerHandler:function(e,bv){if(this[0]){return b.event.trigger(e,bv,this[0],true)}},toggle:function(bx){var bv=arguments,e=bx.guid||b.guid++,bw=0,by=function(bz){var bA=(b._data(this,"lastToggle"+bx.guid)||0)%bw;b._data(this,"lastToggle"+bx.guid,bA+1);bz.preventDefault();return bv[bA].apply(this,arguments)||false};by.guid=e;while(bw<bv.length){bv[bw++].guid=e}return this.click(by)},hover:function(e,bv){return this.mouseenter(e).mouseleave(bv||e)}});b.each(("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu").split(" "),function(bv,e){b.fn[e]=function(bx,bw){if(bw==null){bw=bx;bx=null}return arguments.length>0?this.on(e,null,bx,bw):this.trigger(e)};if(b.attrFn){b.attrFn[e]=true}if(aO.test(e)){b.event.fixHooks[e]=b.event.keyHooks}if(bf.test(e)){b.event.fixHooks[e]=b.event.mouseHooks}});
+/*!
+ * Sizzle CSS Selector Engine
+ * Copyright 2011, The Dojo Foundation
+ * Released under the MIT, BSD, and GPL Licenses.
+ * More information: http://sizzlejs.com/
+ */
+(function(){var bH=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,bC="sizcache"+(Math.random()+"").replace(".",""),bI=0,bL=Object.prototype.toString,bB=false,bA=true,bK=/\\/g,bO=/\r\n/g,bQ=/\W/;[0,0].sort(function(){bA=false;return 0});var by=function(bV,e,bY,bZ){bY=bY||[];e=e||av;var b1=e;if(e.nodeType!==1&&e.nodeType!==9){return[]}if(!bV||typeof bV!=="string"){return bY}var bS,b3,b6,bR,b2,b5,b4,bX,bU=true,bT=by.isXML(e),bW=[],b0=bV;do{bH.exec("");bS=bH.exec(b0);if(bS){b0=bS[3];bW.push(bS[1]);if(bS[2]){bR=bS[3];break}}}while(bS);if(bW.length>1&&bD.exec(bV)){if(bW.length===2&&bE.relative[bW[0]]){b3=bM(bW[0]+bW[1],e,bZ)}else{b3=bE.relative[bW[0]]?[e]:by(bW.shift(),e);while(bW.length){bV=bW.shift();if(bE.relative[bV]){bV+=bW.shift()}b3=bM(bV,b3,bZ)}}}else{if(!bZ&&bW.length>1&&e.nodeType===9&&!bT&&bE.match.ID.test(bW[0])&&!bE.match.ID.test(bW[bW.length-1])){b2=by.find(bW.shift(),e,bT);e=b2.expr?by.filter(b2.expr,b2.set)[0]:b2.set[0]}if(e){b2=bZ?{expr:bW.pop(),set:bF(bZ)}:by.find(bW.pop(),bW.length===1&&(bW[0]==="~"||bW[0]==="+")&&e.parentNode?e.parentNode:e,bT);b3=b2.expr?by.filter(b2.expr,b2.set):b2.set;if(bW.length>0){b6=bF(b3)}else{bU=false}while(bW.length){b5=bW.pop();b4=b5;if(!bE.relative[b5]){b5=""}else{b4=bW.pop()}if(b4==null){b4=e}bE.relative[b5](b6,b4,bT)}}else{b6=bW=[]}}if(!b6){b6=b3}if(!b6){by.error(b5||bV)}if(bL.call(b6)==="[object Array]"){if(!bU){bY.push.apply(bY,b6)}else{if(e&&e.nodeType===1){for(bX=0;b6[bX]!=null;bX++){if(b6[bX]&&(b6[bX]===true||b6[bX].nodeType===1&&by.contains(e,b6[bX]))){bY.push(b3[bX])}}}else{for(bX=0;b6[bX]!=null;bX++){if(b6[bX]&&b6[bX].nodeType===1){bY.push(b3[bX])}}}}}else{bF(b6,bY)}if(bR){by(bR,b1,bY,bZ);by.uniqueSort(bY)}return bY};by.uniqueSort=function(bR){if(bJ){bB=bA;bR.sort(bJ);if(bB){for(var e=1;e<bR.length;e++){if(bR[e]===bR[e-1]){bR.splice(e--,1)}}}}return bR};by.matches=function(e,bR){return by(e,null,null,bR)};by.matchesSelector=function(e,bR){return by(bR,null,null,[e]).length>0};by.find=function(bX,e,bY){var bW,bS,bU,bT,bV,bR;if(!bX){return[]}for(bS=0,bU=bE.order.length;bS<bU;bS++){bV=bE.order[bS];if((bT=bE.leftMatch[bV].exec(bX))){bR=bT[1];bT.splice(1,1);if(bR.substr(bR.length-1)!=="\\"){bT[1]=(bT[1]||"").replace(bK,"");bW=bE.find[bV](bT,e,bY);if(bW!=null){bX=bX.replace(bE.match[bV],"");break}}}}if(!bW){bW=typeof e.getElementsByTagName!=="undefined"?e.getElementsByTagName("*"):[]}return{set:bW,expr:bX}};by.filter=function(b1,b0,b4,bU){var bW,e,bZ,b6,b3,bR,bT,bV,b2,bS=b1,b5=[],bY=b0,bX=b0&&b0[0]&&by.isXML(b0[0]);while(b1&&b0.length){for(bZ in bE.filter){if((bW=bE.leftMatch[bZ].exec(b1))!=null&&bW[2]){bR=bE.filter[bZ];bT=bW[1];e=false;bW.splice(1,1);if(bT.substr(bT.length-1)==="\\"){continue}if(bY===b5){b5=[]}if(bE.preFilter[bZ]){bW=bE.preFilter[bZ](bW,bY,b4,b5,bU,bX);if(!bW){e=b6=true}else{if(bW===true){continue}}}if(bW){for(bV=0;(b3=bY[bV])!=null;bV++){if(b3){b6=bR(b3,bW,bV,bY);b2=bU^b6;if(b4&&b6!=null){if(b2){e=true}else{bY[bV]=false}}else{if(b2){b5.push(b3);e=true}}}}}if(b6!==L){if(!b4){bY=b5}b1=b1.replace(bE.match[bZ],"");if(!e){return[]}break}}}if(b1===bS){if(e==null){by.error(b1)}else{break}}bS=b1}return bY};by.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)};var bw=by.getText=function(bU){var bS,bT,e=bU.nodeType,bR="";if(e){if(e===1||e===9){if(typeof bU.textContent==="string"){return bU.textContent}else{if(typeof bU.innerText==="string"){return bU.innerText.replace(bO,"")}else{for(bU=bU.firstChild;bU;bU=bU.nextSibling){bR+=bw(bU)}}}}else{if(e===3||e===4){return bU.nodeValue}}}else{for(bS=0;(bT=bU[bS]);bS++){if(bT.nodeType!==8){bR+=bw(bT)}}}return bR};var bE=by.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(e){return e.getAttribute("href")},type:function(e){return e.getAttribute("type")}},relative:{"+":function(bW,bR){var bT=typeof bR==="string",bV=bT&&!bQ.test(bR),bX=bT&&!bV;if(bV){bR=bR.toLowerCase()}for(var bS=0,e=bW.length,bU;bS<e;bS++){if((bU=bW[bS])){while((bU=bU.previousSibling)&&bU.nodeType!==1){}bW[bS]=bX||bU&&bU.nodeName.toLowerCase()===bR?bU||false:bU===bR}}if(bX){by.filter(bR,bW,true)}},">":function(bW,bR){var bV,bU=typeof bR==="string",bS=0,e=bW.length;if(bU&&!bQ.test(bR)){bR=bR.toLowerCase();for(;bS<e;bS++){bV=bW[bS];if(bV){var bT=bV.parentNode;bW[bS]=bT.nodeName.toLowerCase()===bR?bT:false}}}else{for(;bS<e;bS++){bV=bW[bS];if(bV){bW[bS]=bU?bV.parentNode:bV.parentNode===bR}}if(bU){by.filter(bR,bW,true)}}},"":function(bT,bR,bV){var bU,bS=bI++,e=bN;if(typeof bR==="string"&&!bQ.test(bR)){bR=bR.toLowerCase();bU=bR;e=bv}e("parentNode",bR,bS,bT,bU,bV)},"~":function(bT,bR,bV){var bU,bS=bI++,e=bN;if(typeof bR==="string"&&!bQ.test(bR)){bR=bR.toLowerCase();bU=bR;e=bv}e("previousSibling",bR,bS,bT,bU,bV)}},find:{ID:function(bR,bS,bT){if(typeof bS.getElementById!=="undefined"&&!bT){var e=bS.getElementById(bR[1]);return e&&e.parentNode?[e]:[]}},NAME:function(bS,bV){if(typeof bV.getElementsByName!=="undefined"){var bR=[],bU=bV.getElementsByName(bS[1]);for(var bT=0,e=bU.length;bT<e;bT++){if(bU[bT].getAttribute("name")===bS[1]){bR.push(bU[bT])}}return bR.length===0?null:bR}},TAG:function(e,bR){if(typeof bR.getElementsByTagName!=="undefined"){return bR.getElementsByTagName(e[1])}}},preFilter:{CLASS:function(bT,bR,bS,e,bW,bX){bT=" "+bT[1].replace(bK,"")+" ";if(bX){return bT}for(var bU=0,bV;(bV=bR[bU])!=null;bU++){if(bV){if(bW^(bV.className&&(" "+bV.className+" ").replace(/[\t\n\r]/g," ").indexOf(bT)>=0)){if(!bS){e.push(bV)}}else{if(bS){bR[bU]=false}}}}return false},ID:function(e){return e[1].replace(bK,"")},TAG:function(bR,e){return bR[1].replace(bK,"").toLowerCase()},CHILD:function(e){if(e[1]==="nth"){if(!e[2]){by.error(e[0])}e[2]=e[2].replace(/^\+|\s*/g,"");var bR=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(e[2]==="even"&&"2n"||e[2]==="odd"&&"2n+1"||!/\D/.test(e[2])&&"0n+"+e[2]||e[2]);e[2]=(bR[1]+(bR[2]||1))-0;e[3]=bR[3]-0}else{if(e[2]){by.error(e[0])}}e[0]=bI++;return e},ATTR:function(bU,bR,bS,e,bV,bW){var bT=bU[1]=bU[1].replace(bK,"");if(!bW&&bE.attrMap[bT]){bU[1]=bE.attrMap[bT]}bU[4]=(bU[4]||bU[5]||"").replace(bK,"");if(bU[2]==="~="){bU[4]=" "+bU[4]+" "}return bU},PSEUDO:function(bU,bR,bS,e,bV){if(bU[1]==="not"){if((bH.exec(bU[3])||"").length>1||/^\w/.test(bU[3])){bU[3]=by(bU[3],null,null,bR)}else{var bT=by.filter(bU[3],bR,bS,true^bV);if(!bS){e.push.apply(e,bT)}return false}}else{if(bE.match.POS.test(bU[0])||bE.match.CHILD.test(bU[0])){return true}}return bU},POS:function(e){e.unshift(true);return e}},filters:{enabled:function(e){return e.disabled===false&&e.type!=="hidden"},disabled:function(e){return e.disabled===true},checked:function(e){return e.checked===true},selected:function(e){if(e.parentNode){e.parentNode.selectedIndex}return e.selected===true},parent:function(e){return !!e.firstChild},empty:function(e){return !e.firstChild},has:function(bS,bR,e){return !!by(e[3],bS).length},header:function(e){return(/h\d/i).test(e.nodeName)},text:function(bS){var e=bS.getAttribute("type"),bR=bS.type;return bS.nodeName.toLowerCase()==="input"&&"text"===bR&&(e===bR||e===null)},radio:function(e){return e.nodeName.toLowerCase()==="input"&&"radio"===e.type},checkbox:function(e){return e.nodeName.toLowerCase()==="input"&&"checkbox"===e.type},file:function(e){return e.nodeName.toLowerCase()==="input"&&"file"===e.type},password:function(e){return e.nodeName.toLowerCase()==="input"&&"password"===e.type},submit:function(bR){var e=bR.nodeName.toLowerCase();return(e==="input"||e==="button")&&"submit"===bR.type},image:function(e){return e.nodeName.toLowerCase()==="input"&&"image"===e.type},reset:function(bR){var e=bR.nodeName.toLowerCase();return(e==="input"||e==="button")&&"reset"===bR.type},button:function(bR){var e=bR.nodeName.toLowerCase();return e==="input"&&"button"===bR.type||e==="button"},input:function(e){return(/input|select|textarea|button/i).test(e.nodeName)},focus:function(e){return e===e.ownerDocument.activeElement}},setFilters:{first:function(bR,e){return e===0},last:function(bS,bR,e,bT){return bR===bT.length-1},even:function(bR,e){return e%2===0},odd:function(bR,e){return e%2===1},lt:function(bS,bR,e){return bR<e[3]-0},gt:function(bS,bR,e){return bR>e[3]-0},nth:function(bS,bR,e){return e[3]-0===bR},eq:function(bS,bR,e){return e[3]-0===bR}},filter:{PSEUDO:function(bS,bX,bW,bY){var e=bX[1],bR=bE.filters[e];if(bR){return bR(bS,bW,bX,bY)}else{if(e==="contains"){return(bS.textContent||bS.innerText||bw([bS])||"").indexOf(bX[3])>=0}else{if(e==="not"){var bT=bX[3];for(var bV=0,bU=bT.length;bV<bU;bV++){if(bT[bV]===bS){return false}}return true}else{by.error(e)}}}},CHILD:function(bS,bU){var bT,b0,bW,bZ,e,bV,bY,bX=bU[1],bR=bS;switch(bX){case"only":case"first":while((bR=bR.previousSibling)){if(bR.nodeType===1){return false}}if(bX==="first"){return true}bR=bS;case"last":while((bR=bR.nextSibling)){if(bR.nodeType===1){return false}}return true;case"nth":bT=bU[2];b0=bU[3];if(bT===1&&b0===0){return true}bW=bU[0];bZ=bS.parentNode;if(bZ&&(bZ[bC]!==bW||!bS.nodeIndex)){bV=0;for(bR=bZ.firstChild;bR;bR=bR.nextSibling){if(bR.nodeType===1){bR.nodeIndex=++bV}}bZ[bC]=bW}bY=bS.nodeIndex-b0;if(bT===0){return bY===0}else{return(bY%bT===0&&bY/bT>=0)}}},ID:function(bR,e){return bR.nodeType===1&&bR.getAttribute("id")===e},TAG:function(bR,e){return(e==="*"&&bR.nodeType===1)||!!bR.nodeName&&bR.nodeName.toLowerCase()===e},CLASS:function(bR,e){return(" "+(bR.className||bR.getAttribute("class"))+" ").indexOf(e)>-1},ATTR:function(bV,bT){var bS=bT[1],e=by.attr?by.attr(bV,bS):bE.attrHandle[bS]?bE.attrHandle[bS](bV):bV[bS]!=null?bV[bS]:bV.getAttribute(bS),bW=e+"",bU=bT[2],bR=bT[4];return e==null?bU==="!=":!bU&&by.attr?e!=null:bU==="="?bW===bR:bU==="*="?bW.indexOf(bR)>=0:bU==="~="?(" "+bW+" ").indexOf(bR)>=0:!bR?bW&&e!==false:bU==="!="?bW!==bR:bU==="^="?bW.indexOf(bR)===0:bU==="$="?bW.substr(bW.length-bR.length)===bR:bU==="|="?bW===bR||bW.substr(0,bR.length+1)===bR+"-":false},POS:function(bU,bR,bS,bV){var e=bR[2],bT=bE.setFilters[e];if(bT){return bT(bU,bS,bR,bV)}}}};var bD=bE.match.POS,bx=function(bR,e){return"\\"+(e-0+1)};for(var bz in bE.match){bE.match[bz]=new RegExp(bE.match[bz].source+(/(?![^\[]*\])(?![^\(]*\))/.source));bE.leftMatch[bz]=new RegExp(/(^(?:.|\r|\n)*?)/.source+bE.match[bz].source.replace(/\\(\d+)/g,bx))}var bF=function(bR,e){bR=Array.prototype.slice.call(bR,0);if(e){e.push.apply(e,bR);return e}return bR};try{Array.prototype.slice.call(av.documentElement.childNodes,0)[0].nodeType}catch(bP){bF=function(bU,bT){var bS=0,bR=bT||[];if(bL.call(bU)==="[object Array]"){Array.prototype.push.apply(bR,bU)}else{if(typeof bU.length==="number"){for(var e=bU.length;bS<e;bS++){bR.push(bU[bS])}}else{for(;bU[bS];bS++){bR.push(bU[bS])}}}return bR}}var bJ,bG;if(av.documentElement.compareDocumentPosition){bJ=function(bR,e){if(bR===e){bB=true;return 0}if(!bR.compareDocumentPosition||!e.compareDocumentPosition){return bR.compareDocumentPosition?-1:1}return bR.compareDocumentPosition(e)&4?-1:1}}else{bJ=function(bY,bX){if(bY===bX){bB=true;return 0}else{if(bY.sourceIndex&&bX.sourceIndex){return bY.sourceIndex-bX.sourceIndex}}var bV,bR,bS=[],e=[],bU=bY.parentNode,bW=bX.parentNode,bZ=bU;if(bU===bW){return bG(bY,bX)}else{if(!bU){return -1}else{if(!bW){return 1}}}while(bZ){bS.unshift(bZ);bZ=bZ.parentNode}bZ=bW;while(bZ){e.unshift(bZ);bZ=bZ.parentNode}bV=bS.length;bR=e.length;for(var bT=0;bT<bV&&bT<bR;bT++){if(bS[bT]!==e[bT]){return bG(bS[bT],e[bT])}}return bT===bV?bG(bY,e[bT],-1):bG(bS[bT],bX,1)};bG=function(bR,e,bS){if(bR===e){return bS}var bT=bR.nextSibling;while(bT){if(bT===e){return -1}bT=bT.nextSibling}return 1}}(function(){var bR=av.createElement("div"),bS="script"+(new Date()).getTime(),e=av.documentElement;bR.innerHTML="<a name='"+bS+"'/>";e.insertBefore(bR,e.firstChild);if(av.getElementById(bS)){bE.find.ID=function(bU,bV,bW){if(typeof bV.getElementById!=="undefined"&&!bW){var bT=bV.getElementById(bU[1]);return bT?bT.id===bU[1]||typeof bT.getAttributeNode!=="undefined"&&bT.getAttributeNode("id").nodeValue===bU[1]?[bT]:L:[]}};bE.filter.ID=function(bV,bT){var bU=typeof bV.getAttributeNode!=="undefined"&&bV.getAttributeNode("id");return bV.nodeType===1&&bU&&bU.nodeValue===bT}}e.removeChild(bR);e=bR=null})();(function(){var e=av.createElement("div");e.appendChild(av.createComment(""));if(e.getElementsByTagName("*").length>0){bE.find.TAG=function(bR,bV){var bU=bV.getElementsByTagName(bR[1]);if(bR[1]==="*"){var bT=[];for(var bS=0;bU[bS];bS++){if(bU[bS].nodeType===1){bT.push(bU[bS])}}bU=bT}return bU}}e.innerHTML="<a href='#'></a>";if(e.firstChild&&typeof e.firstChild.getAttribute!=="undefined"&&e.firstChild.getAttribute("href")!=="#"){bE.attrHandle.href=function(bR){return bR.getAttribute("href",2)}}e=null})();if(av.querySelectorAll){(function(){var e=by,bT=av.createElement("div"),bS="__sizzle__";bT.innerHTML="<p class='TEST'></p>";if(bT.querySelectorAll&&bT.querySelectorAll(".TEST").length===0){return}by=function(b4,bV,bZ,b3){bV=bV||av;if(!b3&&!by.isXML(bV)){var b2=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b4);if(b2&&(bV.nodeType===1||bV.nodeType===9)){if(b2[1]){return bF(bV.getElementsByTagName(b4),bZ)}else{if(b2[2]&&bE.find.CLASS&&bV.getElementsByClassName){return bF(bV.getElementsByClassName(b2[2]),bZ)}}}if(bV.nodeType===9){if(b4==="body"&&bV.body){return bF([bV.body],bZ)}else{if(b2&&b2[3]){var bY=bV.getElementById(b2[3]);if(bY&&bY.parentNode){if(bY.id===b2[3]){return bF([bY],bZ)}}else{return bF([],bZ)}}}try{return bF(bV.querySelectorAll(b4),bZ)}catch(b0){}}else{if(bV.nodeType===1&&bV.nodeName.toLowerCase()!=="object"){var bW=bV,bX=bV.getAttribute("id"),bU=bX||bS,b6=bV.parentNode,b5=/^\s*[+~]/.test(b4);if(!bX){bV.setAttribute("id",bU)}else{bU=bU.replace(/'/g,"\\$&")}if(b5&&b6){bV=bV.parentNode}try{if(!b5||b6){return bF(bV.querySelectorAll("[id='"+bU+"'] "+b4),bZ)}}catch(b1){}finally{if(!bX){bW.removeAttribute("id")}}}}}return e(b4,bV,bZ,b3)};for(var bR in e){by[bR]=e[bR]}bT=null})()}(function(){var e=av.documentElement,bS=e.matchesSelector||e.mozMatchesSelector||e.webkitMatchesSelector||e.msMatchesSelector;if(bS){var bU=!bS.call(av.createElement("div"),"div"),bR=false;try{bS.call(av.documentElement,"[test!='']:sizzle")}catch(bT){bR=true}by.matchesSelector=function(bW,bY){bY=bY.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!by.isXML(bW)){try{if(bR||!bE.match.PSEUDO.test(bY)&&!/!=/.test(bY)){var bV=bS.call(bW,bY);if(bV||!bU||bW.document&&bW.document.nodeType!==11){return bV}}}catch(bX){}}return by(bY,null,null,[bW]).length>0}}})();(function(){var e=av.createElement("div");e.innerHTML="<div class='test e'></div><div class='test'></div>";if(!e.getElementsByClassName||e.getElementsByClassName("e").length===0){return}e.lastChild.className="e";if(e.getElementsByClassName("e").length===1){return}bE.order.splice(1,0,"CLASS");bE.find.CLASS=function(bR,bS,bT){if(typeof bS.getElementsByClassName!=="undefined"&&!bT){return bS.getElementsByClassName(bR[1])}};e=null})();function bv(bR,bW,bV,bZ,bX,bY){for(var bT=0,bS=bZ.length;bT<bS;bT++){var e=bZ[bT];if(e){var bU=false;e=e[bR];while(e){if(e[bC]===bV){bU=bZ[e.sizset];break}if(e.nodeType===1&&!bY){e[bC]=bV;e.sizset=bT}if(e.nodeName.toLowerCase()===bW){bU=e;break}e=e[bR]}bZ[bT]=bU}}}function bN(bR,bW,bV,bZ,bX,bY){for(var bT=0,bS=bZ.length;bT<bS;bT++){var e=bZ[bT];if(e){var bU=false;e=e[bR];while(e){if(e[bC]===bV){bU=bZ[e.sizset];break}if(e.nodeType===1){if(!bY){e[bC]=bV;e.sizset=bT}if(typeof bW!=="string"){if(e===bW){bU=true;break}}else{if(by.filter(bW,[e]).length>0){bU=e;break}}}e=e[bR]}bZ[bT]=bU}}}if(av.documentElement.contains){by.contains=function(bR,e){return bR!==e&&(bR.contains?bR.contains(e):true)}}else{if(av.documentElement.compareDocumentPosition){by.contains=function(bR,e){return !!(bR.compareDocumentPosition(e)&16)}}else{by.contains=function(){return false}}}by.isXML=function(e){var bR=(e?e.ownerDocument||e:0).documentElement;return bR?bR.nodeName!=="HTML":false};var bM=function(bS,e,bW){var bV,bX=[],bU="",bY=e.nodeType?[e]:e;while((bV=bE.match.PSEUDO.exec(bS))){bU+=bV[0];bS=bS.replace(bE.match.PSEUDO,"")}bS=bE.relative[bS]?bS+"*":bS;for(var bT=0,bR=bY.length;bT<bR;bT++){by(bS,bY[bT],bX,bW)}return by.filter(bU,bX)};by.attr=b.attr;by.selectors.attrMap={};b.find=by;b.expr=by.selectors;b.expr[":"]=b.expr.filters;b.unique=by.uniqueSort;b.text=by.getText;b.isXMLDoc=by.isXML;b.contains=by.contains})();var ab=/Until$/,aq=/^(?:parents|prevUntil|prevAll)/,a9=/,/,bp=/^.[^:#\[\.,]*$/,P=Array.prototype.slice,H=b.expr.match.POS,ay={children:true,contents:true,next:true,prev:true};b.fn.extend({find:function(e){var bw=this,by,bv;if(typeof e!=="string"){return b(e).filter(function(){for(by=0,bv=bw.length;by<bv;by++){if(b.contains(bw[by],this)){return true}}})}var bx=this.pushStack("","find",e),bA,bB,bz;for(by=0,bv=this.length;by<bv;by++){bA=bx.length;b.find(e,this[by],bx);if(by>0){for(bB=bA;bB<bx.length;bB++){for(bz=0;bz<bA;bz++){if(bx[bz]===bx[bB]){bx.splice(bB--,1);break}}}}}return bx},has:function(bv){var e=b(bv);return this.filter(function(){for(var bx=0,bw=e.length;bx<bw;bx++){if(b.contains(this,e[bx])){return true}}})},not:function(e){return this.pushStack(aG(this,e,false),"not",e)},filter:function(e){return this.pushStack(aG(this,e,true),"filter",e)},is:function(e){return !!e&&(typeof e==="string"?H.test(e)?b(e,this.context).index(this[0])>=0:b.filter(e,this).length>0:this.filter(e).length>0)},closest:function(by,bx){var bv=[],bw,e,bz=this[0];if(b.isArray(by)){var bB=1;while(bz&&bz.ownerDocument&&bz!==bx){for(bw=0;bw<by.length;bw++){if(b(bz).is(by[bw])){bv.push({selector:by[bw],elem:bz,level:bB})}}bz=bz.parentNode;bB++}return bv}var bA=H.test(by)||typeof by!=="string"?b(by,bx||this.context):0;for(bw=0,e=this.length;bw<e;bw++){bz=this[bw];while(bz){if(bA?bA.index(bz)>-1:b.find.matchesSelector(bz,by)){bv.push(bz);break}else{bz=bz.parentNode;if(!bz||!bz.ownerDocument||bz===bx||bz.nodeType===11){break}}}}bv=bv.length>1?b.unique(bv):bv;return this.pushStack(bv,"closest",by)},index:function(e){if(!e){return(this[0]&&this[0].parentNode)?this.prevAll().length:-1}if(typeof e==="string"){return b.inArray(this[0],b(e))}return b.inArray(e.jquery?e[0]:e,this)},add:function(e,bv){var bx=typeof e==="string"?b(e,bv):b.makeArray(e&&e.nodeType?[e]:e),bw=b.merge(this.get(),bx);return this.pushStack(C(bx[0])||C(bw[0])?bw:b.unique(bw))},andSelf:function(){return this.add(this.prevObject)}});function C(e){return !e||!e.parentNode||e.parentNode.nodeType===11}b.each({parent:function(bv){var e=bv.parentNode;return e&&e.nodeType!==11?e:null},parents:function(e){return b.dir(e,"parentNode")},parentsUntil:function(bv,e,bw){return b.dir(bv,"parentNode",bw)},next:function(e){return b.nth(e,2,"nextSibling")},prev:function(e){return b.nth(e,2,"previousSibling")},nextAll:function(e){return b.dir(e,"nextSibling")},prevAll:function(e){return b.dir(e,"previousSibling")},nextUntil:function(bv,e,bw){return b.dir(bv,"nextSibling",bw)},prevUntil:function(bv,e,bw){return b.dir(bv,"previousSibling",bw)},siblings:function(e){return b.sibling(e.parentNode.firstChild,e)},children:function(e){return b.sibling(e.firstChild)},contents:function(e){return b.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:b.makeArray(e.childNodes)}},function(e,bv){b.fn[e]=function(by,bw){var bx=b.map(this,bv,by);if(!ab.test(e)){bw=by}if(bw&&typeof bw==="string"){bx=b.filter(bw,bx)}bx=this.length>1&&!ay[e]?b.unique(bx):bx;if((this.length>1||a9.test(bw))&&aq.test(e)){bx=bx.reverse()}return this.pushStack(bx,e,P.call(arguments).join(","))}});b.extend({filter:function(bw,e,bv){if(bv){bw=":not("+bw+")"}return e.length===1?b.find.matchesSelector(e[0],bw)?[e[0]]:[]:b.find.matches(bw,e)},dir:function(bw,bv,by){var e=[],bx=bw[bv];while(bx&&bx.nodeType!==9&&(by===L||bx.nodeType!==1||!b(bx).is(by))){if(bx.nodeType===1){e.push(bx)}bx=bx[bv]}return e},nth:function(by,e,bw,bx){e=e||1;var bv=0;for(;by;by=by[bw]){if(by.nodeType===1&&++bv===e){break}}return by},sibling:function(bw,bv){var e=[];for(;bw;bw=bw.nextSibling){if(bw.nodeType===1&&bw!==bv){e.push(bw)}}return e}});function aG(bx,bw,e){bw=bw||0;if(b.isFunction(bw)){return b.grep(bx,function(bz,by){var bA=!!bw.call(bz,by,bz);return bA===e})}else{if(bw.nodeType){return b.grep(bx,function(bz,by){return(bz===bw)===e})}else{if(typeof bw==="string"){var bv=b.grep(bx,function(by){return by.nodeType===1});if(bp.test(bw)){return b.filter(bw,bv,!e)}else{bw=b.filter(bw,bv)}}}}return b.grep(bx,function(bz,by){return(b.inArray(bz,bw)>=0)===e})}function a(e){var bw=aR.split("|"),bv=e.createDocumentFragment();if(bv.createElement){while(bw.length){bv.createElement(bw.pop())}}return bv}var aR="abbr|article|aside|audio|canvas|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",ag=/ jQuery\d+="(?:\d+|null)"/g,ar=/^\s+/,R=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,d=/<([\w:]+)/,w=/<tbody/i,W=/<|&#?\w+;/,ae=/<(?:script|style)/i,O=/<(?:script|object|embed|option|style)/i,ah=new RegExp("<(?:"+aR+")","i"),o=/checked\s*(?:[^=]|=\s*.checked.)/i,bm=/\/(java|ecma)script/i,aN=/^\s*<!(?:\[CDATA\[|\-\-)/,ax={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]},ac=a(av);ax.optgroup=ax.option;ax.tbody=ax.tfoot=ax.colgroup=ax.caption=ax.thead;ax.th=ax.td;if(!b.support.htmlSerialize){ax._default=[1,"div<div>","</div>"]}b.fn.extend({text:function(e){if(b.isFunction(e)){return this.each(function(bw){var bv=b(this);bv.text(e.call(this,bw,bv.text()))})}if(typeof e!=="object"&&e!==L){return this.empty().append((this[0]&&this[0].ownerDocument||av).createTextNode(e))}return b.text(this)},wrapAll:function(e){if(b.isFunction(e)){return this.each(function(bw){b(this).wrapAll(e.call(this,bw))})}if(this[0]){var bv=b(e,this[0].ownerDocument).eq(0).clone(true);if(this[0].parentNode){bv.insertBefore(this[0])}bv.map(function(){var bw=this;while(bw.firstChild&&bw.firstChild.nodeType===1){bw=bw.firstChild}return bw}).append(this)}return this},wrapInner:function(e){if(b.isFunction(e)){return this.each(function(bv){b(this).wrapInner(e.call(this,bv))})}return this.each(function(){var bv=b(this),bw=bv.contents();if(bw.length){bw.wrapAll(e)}else{bv.append(e)}})},wrap:function(e){var bv=b.isFunction(e);return this.each(function(bw){b(this).wrapAll(bv?e.call(this,bw):e)})},unwrap:function(){return this.parent().each(function(){if(!b.nodeName(this,"body")){b(this).replaceWith(this.childNodes)}}).end()},append:function(){return this.domManip(arguments,true,function(e){if(this.nodeType===1){this.appendChild(e)}})},prepend:function(){return this.domManip(arguments,true,function(e){if(this.nodeType===1){this.insertBefore(e,this.firstChild)}})},before:function(){if(this[0]&&this[0].parentNode){return this.domManip(arguments,false,function(bv){this.parentNode.insertBefore(bv,this)})}else{if(arguments.length){var e=b.clean(arguments);e.push.apply(e,this.toArray());return this.pushStack(e,"before",arguments)}}},after:function(){if(this[0]&&this[0].parentNode){return this.domManip(arguments,false,function(bv){this.parentNode.insertBefore(bv,this.nextSibling)})}else{if(arguments.length){var e=this.pushStack(this,"after",arguments);e.push.apply(e,b.clean(arguments));return e}}},remove:function(e,bx){for(var bv=0,bw;(bw=this[bv])!=null;bv++){if(!e||b.filter(e,[bw]).length){if(!bx&&bw.nodeType===1){b.cleanData(bw.getElementsByTagName("*"));b.cleanData([bw])}if(bw.parentNode){bw.parentNode.removeChild(bw)}}}return this},empty:function(){for(var e=0,bv;(bv=this[e])!=null;e++){if(bv.nodeType===1){b.cleanData(bv.getElementsByTagName("*"))}while(bv.firstChild){bv.removeChild(bv.firstChild)}}return this},clone:function(bv,e){bv=bv==null?false:bv;e=e==null?bv:e;return this.map(function(){return b.clone(this,bv,e)})},html:function(bx){if(bx===L){return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(ag,""):null}else{if(typeof bx==="string"&&!ae.test(bx)&&(b.support.leadingWhitespace||!ar.test(bx))&&!ax[(d.exec(bx)||["",""])[1].toLowerCase()]){bx=bx.replace(R,"<$1></$2>");try{for(var bw=0,bv=this.length;bw<bv;bw++){if(this[bw].nodeType===1){b.cleanData(this[bw].getElementsByTagName("*"));this[bw].innerHTML=bx}}}catch(by){this.empty().append(bx)}}else{if(b.isFunction(bx)){this.each(function(bz){var e=b(this);e.html(bx.call(this,bz,e.html()))})}else{this.empty().append(bx)}}}return this},replaceWith:function(e){if(this[0]&&this[0].parentNode){if(b.isFunction(e)){return this.each(function(bx){var bw=b(this),bv=bw.html();bw.replaceWith(e.call(this,bx,bv))})}if(typeof e!=="string"){e=b(e).detach()}return this.each(function(){var bw=this.nextSibling,bv=this.parentNode;b(this).remove();if(bw){b(bw).before(e)}else{b(bv).append(e)}})}else{return this.length?this.pushStack(b(b.isFunction(e)?e():e),"replaceWith",e):this}},detach:function(e){return this.remove(e,true)},domManip:function(bB,bF,bE){var bx,by,bA,bD,bC=bB[0],bv=[];if(!b.support.checkClone&&arguments.length===3&&typeof bC==="string"&&o.test(bC)){return this.each(function(){b(this).domManip(bB,bF,bE,true)})}if(b.isFunction(bC)){return this.each(function(bH){var bG=b(this);bB[0]=bC.call(this,bH,bF?bG.html():L);bG.domManip(bB,bF,bE)})}if(this[0]){bD=bC&&bC.parentNode;if(b.support.parentNode&&bD&&bD.nodeType===11&&bD.childNodes.length===this.length){bx={fragment:bD}}else{bx=b.buildFragment(bB,this,bv)}bA=bx.fragment;if(bA.childNodes.length===1){by=bA=bA.firstChild}else{by=bA.firstChild}if(by){bF=bF&&b.nodeName(by,"tr");for(var bw=0,e=this.length,bz=e-1;bw<e;bw++){bE.call(bF?ba(this[bw],by):this[bw],bx.cacheable||(e>1&&bw<bz)?b.clone(bA,true,true):bA)}}if(bv.length){b.each(bv,bo)}}return this}});function ba(e,bv){return b.nodeName(e,"table")?(e.getElementsByTagName("tbody")[0]||e.appendChild(e.ownerDocument.createElement("tbody"))):e}function t(bB,bv){if(bv.nodeType!==1||!b.hasData(bB)){return}var by,bx,e,bA=b._data(bB),bz=b._data(bv,bA),bw=bA.events;if(bw){delete bz.handle;bz.events={};for(by in bw){for(bx=0,e=bw[by].length;bx<e;bx++){b.event.add(bv,by+(bw[by][bx].namespace?".":"")+bw[by][bx].namespace,bw[by][bx],bw[by][bx].data)}}}if(bz.data){bz.data=b.extend({},bz.data)}}function ai(bv,e){var bw;if(e.nodeType!==1){return}if(e.clearAttributes){e.clearAttributes()}if(e.mergeAttributes){e.mergeAttributes(bv)}bw=e.nodeName.toLowerCase();if(bw==="object"){e.outerHTML=bv.outerHTML}else{if(bw==="input"&&(bv.type==="checkbox"||bv.type==="radio")){if(bv.checked){e.defaultChecked=e.checked=bv.checked}if(e.value!==bv.value){e.value=bv.value}}else{if(bw==="option"){e.selected=bv.defaultSelected}else{if(bw==="input"||bw==="textarea"){e.defaultValue=bv.defaultValue}}}}e.removeAttribute(b.expando)}b.buildFragment=function(bz,bx,bv){var by,e,bw,bA,bB=bz[0];if(bx&&bx[0]){bA=bx[0].ownerDocument||bx[0]}if(!bA.createDocumentFragment){bA=av}if(bz.length===1&&typeof bB==="string"&&bB.length<512&&bA===av&&bB.charAt(0)==="<"&&!O.test(bB)&&(b.support.checkClone||!o.test(bB))&&(b.support.html5Clone||!ah.test(bB))){e=true;bw=b.fragments[bB];if(bw&&bw!==1){by=bw}}if(!by){by=bA.createDocumentFragment();b.clean(bz,bA,by,bv)}if(e){b.fragments[bB]=bw?by:1}return{fragment:by,cacheable:e}};b.fragments={};b.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,bv){b.fn[e]=function(bw){var bz=[],bC=b(bw),bB=this.length===1&&this[0].parentNode;if(bB&&bB.nodeType===11&&bB.childNodes.length===1&&bC.length===1){bC[bv](this[0]);return this}else{for(var bA=0,bx=bC.length;bA<bx;bA++){var by=(bA>0?this.clone(true):this).get();b(bC[bA])[bv](by);bz=bz.concat(by)}return this.pushStack(bz,e,bC.selector)}}});function bg(e){if(typeof e.getElementsByTagName!=="undefined"){return e.getElementsByTagName("*")}else{if(typeof e.querySelectorAll!=="undefined"){return e.querySelectorAll("*")}else{return[]}}}function az(e){if(e.type==="checkbox"||e.type==="radio"){e.defaultChecked=e.checked}}function E(e){var bv=(e.nodeName||"").toLowerCase();if(bv==="input"){az(e)}else{if(bv!=="script"&&typeof e.getElementsByTagName!=="undefined"){b.grep(e.getElementsByTagName("input"),az)}}}function al(e){var bv=av.createElement("div");ac.appendChild(bv);bv.innerHTML=e.outerHTML;return bv.firstChild}b.extend({clone:function(by,bA,bw){var e,bv,bx,bz=b.support.html5Clone||!ah.test("<"+by.nodeName)?by.cloneNode(true):al(by);if((!b.support.noCloneEvent||!b.support.noCloneChecked)&&(by.nodeType===1||by.nodeType===11)&&!b.isXMLDoc(by)){ai(by,bz);e=bg(by);bv=bg(bz);for(bx=0;e[bx];++bx){if(bv[bx]){ai(e[bx],bv[bx])}}}if(bA){t(by,bz);if(bw){e=bg(by);bv=bg(bz);for(bx=0;e[bx];++bx){t(e[bx],bv[bx])}}}e=bv=null;return bz},clean:function(bw,by,bH,bA){var bF;by=by||av;if(typeof by.createElement==="undefined"){by=by.ownerDocument||by[0]&&by[0].ownerDocument||av}var bI=[],bB;for(var bE=0,bz;(bz=bw[bE])!=null;bE++){if(typeof bz==="number"){bz+=""}if(!bz){continue}if(typeof bz==="string"){if(!W.test(bz)){bz=by.createTextNode(bz)}else{bz=bz.replace(R,"<$1></$2>");var bK=(d.exec(bz)||["",""])[1].toLowerCase(),bx=ax[bK]||ax._default,bD=bx[0],bv=by.createElement("div");if(by===av){ac.appendChild(bv)}else{a(by).appendChild(bv)}bv.innerHTML=bx[1]+bz+bx[2];while(bD--){bv=bv.lastChild}if(!b.support.tbody){var e=w.test(bz),bC=bK==="table"&&!e?bv.firstChild&&bv.firstChild.childNodes:bx[1]==="<table>"&&!e?bv.childNodes:[];for(bB=bC.length-1;bB>=0;--bB){if(b.nodeName(bC[bB],"tbody")&&!bC[bB].childNodes.length){bC[bB].parentNode.removeChild(bC[bB])}}}if(!b.support.leadingWhitespace&&ar.test(bz)){bv.insertBefore(by.createTextNode(ar.exec(bz)[0]),bv.firstChild)}bz=bv.childNodes}}var bG;if(!b.support.appendChecked){if(bz[0]&&typeof(bG=bz.length)==="number"){for(bB=0;bB<bG;bB++){E(bz[bB])}}else{E(bz)}}if(bz.nodeType){bI.push(bz)}else{bI=b.merge(bI,bz)}}if(bH){bF=function(bL){return !bL.type||bm.test(bL.type)};for(bE=0;bI[bE];bE++){if(bA&&b.nodeName(bI[bE],"script")&&(!bI[bE].type||bI[bE].type.toLowerCase()==="text/javascript")){bA.push(bI[bE].parentNode?bI[bE].parentNode.removeChild(bI[bE]):bI[bE])}else{if(bI[bE].nodeType===1){var bJ=b.grep(bI[bE].getElementsByTagName("script"),bF);bI.splice.apply(bI,[bE+1,0].concat(bJ))}bH.appendChild(bI[bE])}}}return bI},cleanData:function(bv){var by,bw,e=b.cache,bB=b.event.special,bA=b.support.deleteExpando;for(var bz=0,bx;(bx=bv[bz])!=null;bz++){if(bx.nodeName&&b.noData[bx.nodeName.toLowerCase()]){continue}bw=bx[b.expando];if(bw){by=e[bw];if(by&&by.events){for(var bC in by.events){if(bB[bC]){b.event.remove(bx,bC)}else{b.removeEvent(bx,bC,by.handle)}}if(by.handle){by.handle.elem=null}}if(bA){delete bx[b.expando]}else{if(bx.removeAttribute){bx.removeAttribute(b.expando)}}delete e[bw]}}}});function bo(e,bv){if(bv.src){b.ajax({url:bv.src,async:false,dataType:"script"})}else{b.globalEval((bv.text||bv.textContent||bv.innerHTML||"").replace(aN,"/*$0*/"))}if(bv.parentNode){bv.parentNode.removeChild(bv)}}var ak=/alpha\([^)]*\)/i,au=/opacity=([^)]*)/,z=/([A-Z]|^ms)/g,bc=/^-?\d+(?:px)?$/i,bn=/^-?\d/,I=/^([\-+])=([\-+.\de]+)/,a7={position:"absolute",visibility:"hidden",display:"block"},an=["Left","Right"],a1=["Top","Bottom"],Z,aI,aX;b.fn.css=function(e,bv){if(arguments.length===2&&bv===L){return this}return b.access(this,e,bv,true,function(bx,bw,by){return by!==L?b.style(bx,bw,by):b.css(bx,bw)})};b.extend({cssHooks:{opacity:{get:function(bw,bv){if(bv){var e=Z(bw,"opacity","opacity");return e===""?"1":e}else{return bw.style.opacity}}}},cssNumber:{fillOpacity:true,fontWeight:true,lineHeight:true,opacity:true,orphans:true,widows:true,zIndex:true,zoom:true},cssProps:{"float":b.support.cssFloat?"cssFloat":"styleFloat"},style:function(bx,bw,bD,by){if(!bx||bx.nodeType===3||bx.nodeType===8||!bx.style){return}var bB,bC,bz=b.camelCase(bw),bv=bx.style,bE=b.cssHooks[bz];bw=b.cssProps[bz]||bz;if(bD!==L){bC=typeof bD;if(bC==="string"&&(bB=I.exec(bD))){bD=(+(bB[1]+1)*+bB[2])+parseFloat(b.css(bx,bw));bC="number"}if(bD==null||bC==="number"&&isNaN(bD)){return}if(bC==="number"&&!b.cssNumber[bz]){bD+="px"}if(!bE||!("set" in bE)||(bD=bE.set(bx,bD))!==L){try{bv[bw]=bD}catch(bA){}}}else{if(bE&&"get" in bE&&(bB=bE.get(bx,false,by))!==L){return bB}return bv[bw]}},css:function(by,bx,bv){var bw,e;bx=b.camelCase(bx);e=b.cssHooks[bx];bx=b.cssProps[bx]||bx;if(bx==="cssFloat"){bx="float"}if(e&&"get" in e&&(bw=e.get(by,true,bv))!==L){return bw}else{if(Z){return Z(by,bx)}}},swap:function(bx,bw,by){var e={};for(var bv in bw){e[bv]=bx.style[bv];bx.style[bv]=bw[bv]}by.call(bx);for(bv in bw){bx.style[bv]=e[bv]}}});b.curCSS=b.css;b.each(["height","width"],function(bv,e){b.cssHooks[e]={get:function(by,bx,bw){var bz;if(bx){if(by.offsetWidth!==0){return p(by,e,bw)}else{b.swap(by,a7,function(){bz=p(by,e,bw)})}return bz}},set:function(bw,bx){if(bc.test(bx)){bx=parseFloat(bx);if(bx>=0){return bx+"px"}}else{return bx}}}});if(!b.support.opacity){b.cssHooks.opacity={get:function(bv,e){return au.test((e&&bv.currentStyle?bv.currentStyle.filter:bv.style.filter)||"")?(parseFloat(RegExp.$1)/100)+"":e?"1":""},set:function(by,bz){var bx=by.style,bv=by.currentStyle,e=b.isNumeric(bz)?"alpha(opacity="+bz*100+")":"",bw=bv&&bv.filter||bx.filter||"";bx.zoom=1;if(bz>=1&&b.trim(bw.replace(ak,""))===""){bx.removeAttribute("filter");if(bv&&!bv.filter){return}}bx.filter=ak.test(bw)?bw.replace(ak,e):bw+" "+e}}}b(function(){if(!b.support.reliableMarginRight){b.cssHooks.marginRight={get:function(bw,bv){var e;b.swap(bw,{display:"inline-block"},function(){if(bv){e=Z(bw,"margin-right","marginRight")}else{e=bw.style.marginRight}});return e}}}});if(av.defaultView&&av.defaultView.getComputedStyle){aI=function(by,bw){var bv,bx,e;bw=bw.replace(z,"-$1").toLowerCase();if((bx=by.ownerDocument.defaultView)&&(e=bx.getComputedStyle(by,null))){bv=e.getPropertyValue(bw);if(bv===""&&!b.contains(by.ownerDocument.documentElement,by)){bv=b.style(by,bw)}}return bv}}if(av.documentElement.currentStyle){aX=function(bz,bw){var bA,e,by,bv=bz.currentStyle&&bz.currentStyle[bw],bx=bz.style;if(bv===null&&bx&&(by=bx[bw])){bv=by}if(!bc.test(bv)&&bn.test(bv)){bA=bx.left;e=bz.runtimeStyle&&bz.runtimeStyle.left;if(e){bz.runtimeStyle.left=bz.currentStyle.left}bx.left=bw==="fontSize"?"1em":(bv||0);bv=bx.pixelLeft+"px";bx.left=bA;if(e){bz.runtimeStyle.left=e}}return bv===""?"auto":bv}}Z=aI||aX;function p(by,bw,bv){var bA=bw==="width"?by.offsetWidth:by.offsetHeight,bz=bw==="width"?an:a1,bx=0,e=bz.length;if(bA>0){if(bv!=="border"){for(;bx<e;bx++){if(!bv){bA-=parseFloat(b.css(by,"padding"+bz[bx]))||0}if(bv==="margin"){bA+=parseFloat(b.css(by,bv+bz[bx]))||0}else{bA-=parseFloat(b.css(by,"border"+bz[bx]+"Width"))||0}}}return bA+"px"}bA=Z(by,bw,bw);if(bA<0||bA==null){bA=by.style[bw]||0}bA=parseFloat(bA)||0;if(bv){for(;bx<e;bx++){bA+=parseFloat(b.css(by,"padding"+bz[bx]))||0;if(bv!=="padding"){bA+=parseFloat(b.css(by,"border"+bz[bx]+"Width"))||0}if(bv==="margin"){bA+=parseFloat(b.css(by,bv+bz[bx]))||0}}}return bA+"px"}if(b.expr&&b.expr.filters){b.expr.filters.hidden=function(bw){var bv=bw.offsetWidth,e=bw.offsetHeight;return(bv===0&&e===0)||(!b.support.reliableHiddenOffsets&&((bw.style&&bw.style.display)||b.css(bw,"display"))==="none")};b.expr.filters.visible=function(e){return !b.expr.filters.hidden(e)}}var k=/%20/g,ap=/\[\]$/,bs=/\r?\n/g,bq=/#.*$/,aD=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,aZ=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,aM=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,aQ=/^(?:GET|HEAD)$/,c=/^\/\//,M=/\?/,a6=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,q=/^(?:select|textarea)/i,h=/\s+/,br=/([?&])_=[^&]*/,K=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,A=b.fn.load,aa={},r={},aE,s,aV=["*/"]+["*"];try{aE=bl.href}catch(aw){aE=av.createElement("a");aE.href="";aE=aE.href}s=K.exec(aE.toLowerCase())||[];function f(e){return function(by,bA){if(typeof by!=="string"){bA=by;by="*"}if(b.isFunction(bA)){var bx=by.toLowerCase().split(h),bw=0,bz=bx.length,bv,bB,bC;for(;bw<bz;bw++){bv=bx[bw];bC=/^\+/.test(bv);if(bC){bv=bv.substr(1)||"*"}bB=e[bv]=e[bv]||[];bB[bC?"unshift":"push"](bA)}}}}function aW(bv,bE,bz,bD,bB,bx){bB=bB||bE.dataTypes[0];bx=bx||{};bx[bB]=true;var bA=bv[bB],bw=0,e=bA?bA.length:0,by=(bv===aa),bC;for(;bw<e&&(by||!bC);bw++){bC=bA[bw](bE,bz,bD);if(typeof bC==="string"){if(!by||bx[bC]){bC=L}else{bE.dataTypes.unshift(bC);bC=aW(bv,bE,bz,bD,bC,bx)}}}if((by||!bC)&&!bx["*"]){bC=aW(bv,bE,bz,bD,"*",bx)}return bC}function am(bw,bx){var bv,e,by=b.ajaxSettings.flatOptions||{};for(bv in bx){if(bx[bv]!==L){(by[bv]?bw:(e||(e={})))[bv]=bx[bv]}}if(e){b.extend(true,bw,e)}}b.fn.extend({load:function(bw,bz,bA){if(typeof bw!=="string"&&A){return A.apply(this,arguments)}else{if(!this.length){return this}}var by=bw.indexOf(" ");if(by>=0){var e=bw.slice(by,bw.length);bw=bw.slice(0,by)}var bx="GET";if(bz){if(b.isFunction(bz)){bA=bz;bz=L}else{if(typeof bz==="object"){bz=b.param(bz,b.ajaxSettings.traditional);bx="POST"}}}var bv=this;b.ajax({url:bw,type:bx,dataType:"html",data:bz,complete:function(bC,bB,bD){bD=bC.responseText;if(bC.isResolved()){bC.done(function(bE){bD=bE});bv.html(e?b("<div>").append(bD.replace(a6,"")).find(e):bD)}if(bA){bv.each(bA,[bD,bB,bC])}}});return this},serialize:function(){return b.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?b.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||q.test(this.nodeName)||aZ.test(this.type))}).map(function(e,bv){var bw=b(this).val();return bw==null?null:b.isArray(bw)?b.map(bw,function(by,bx){return{name:bv.name,value:by.replace(bs,"\r\n")}}):{name:bv.name,value:bw.replace(bs,"\r\n")}}).get()}});b.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(e,bv){b.fn[bv]=function(bw){return this.on(bv,bw)}});b.each(["get","post"],function(e,bv){b[bv]=function(bw,by,bz,bx){if(b.isFunction(by)){bx=bx||bz;bz=by;by=L}return b.ajax({type:bv,url:bw,data:by,success:bz,dataType:bx})}});b.extend({getScript:function(e,bv){return b.get(e,L,bv,"script")},getJSON:function(e,bv,bw){return b.get(e,bv,bw,"json")},ajaxSetup:function(bv,e){if(e){am(bv,b.ajaxSettings)}else{e=bv;bv=b.ajaxSettings}am(bv,e);return bv},ajaxSettings:{url:aE,isLocal:aM.test(s[1]),global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":aV},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":bb.String,"text html":true,"text json":b.parseJSON,"text xml":b.parseXML},flatOptions:{context:true,url:true}},ajaxPrefilter:f(aa),ajaxTransport:f(r),ajax:function(bz,bx){if(typeof bz==="object"){bx=bz;bz=L}bx=bx||{};var bD=b.ajaxSetup({},bx),bS=bD.context||bD,bG=bS!==bD&&(bS.nodeType||bS instanceof b)?b(bS):b.event,bR=b.Deferred(),bN=b.Callbacks("once memory"),bB=bD.statusCode||{},bC,bH={},bO={},bQ,by,bL,bE,bI,bA=0,bw,bK,bJ={readyState:0,setRequestHeader:function(bT,bU){if(!bA){var e=bT.toLowerCase();bT=bO[e]=bO[e]||bT;bH[bT]=bU}return this},getAllResponseHeaders:function(){return bA===2?bQ:null},getResponseHeader:function(bT){var e;if(bA===2){if(!by){by={};while((e=aD.exec(bQ))){by[e[1].toLowerCase()]=e[2]}}e=by[bT.toLowerCase()]}return e===L?null:e},overrideMimeType:function(e){if(!bA){bD.mimeType=e}return this},abort:function(e){e=e||"abort";if(bL){bL.abort(e)}bF(0,e);return this}};function bF(bZ,bU,b0,bW){if(bA===2){return}bA=2;if(bE){clearTimeout(bE)}bL=L;bQ=bW||"";bJ.readyState=bZ>0?4:0;var bT,b4,b3,bX=bU,bY=b0?bj(bD,bJ,b0):L,bV,b2;if(bZ>=200&&bZ<300||bZ===304){if(bD.ifModified){if((bV=bJ.getResponseHeader("Last-Modified"))){b.lastModified[bC]=bV}if((b2=bJ.getResponseHeader("Etag"))){b.etag[bC]=b2}}if(bZ===304){bX="notmodified";bT=true}else{try{b4=G(bD,bY);bX="success";bT=true}catch(b1){bX="parsererror";b3=b1}}}else{b3=bX;if(!bX||bZ){bX="error";if(bZ<0){bZ=0}}}bJ.status=bZ;bJ.statusText=""+(bU||bX);if(bT){bR.resolveWith(bS,[b4,bX,bJ])}else{bR.rejectWith(bS,[bJ,bX,b3])}bJ.statusCode(bB);bB=L;if(bw){bG.trigger("ajax"+(bT?"Success":"Error"),[bJ,bD,bT?b4:b3])}bN.fireWith(bS,[bJ,bX]);if(bw){bG.trigger("ajaxComplete",[bJ,bD]);if(!(--b.active)){b.event.trigger("ajaxStop")}}}bR.promise(bJ);bJ.success=bJ.done;bJ.error=bJ.fail;bJ.complete=bN.add;bJ.statusCode=function(bT){if(bT){var e;if(bA<2){for(e in bT){bB[e]=[bB[e],bT[e]]}}else{e=bT[bJ.status];bJ.then(e,e)}}return this};bD.url=((bz||bD.url)+"").replace(bq,"").replace(c,s[1]+"//");bD.dataTypes=b.trim(bD.dataType||"*").toLowerCase().split(h);if(bD.crossDomain==null){bI=K.exec(bD.url.toLowerCase());bD.crossDomain=!!(bI&&(bI[1]!=s[1]||bI[2]!=s[2]||(bI[3]||(bI[1]==="http:"?80:443))!=(s[3]||(s[1]==="http:"?80:443))))}if(bD.data&&bD.processData&&typeof bD.data!=="string"){bD.data=b.param(bD.data,bD.traditional)}aW(aa,bD,bx,bJ);if(bA===2){return false}bw=bD.global;bD.type=bD.type.toUpperCase();bD.hasContent=!aQ.test(bD.type);if(bw&&b.active++===0){b.event.trigger("ajaxStart")}if(!bD.hasContent){if(bD.data){bD.url+=(M.test(bD.url)?"&":"?")+bD.data;delete bD.data}bC=bD.url;if(bD.cache===false){var bv=b.now(),bP=bD.url.replace(br,"$1_="+bv);bD.url=bP+((bP===bD.url)?(M.test(bD.url)?"&":"?")+"_="+bv:"")}}if(bD.data&&bD.hasContent&&bD.contentType!==false||bx.contentType){bJ.setRequestHeader("Content-Type",bD.contentType)}if(bD.ifModified){bC=bC||bD.url;if(b.lastModified[bC]){bJ.setRequestHeader("If-Modified-Since",b.lastModified[bC])}if(b.etag[bC]){bJ.setRequestHeader("If-None-Match",b.etag[bC])}}bJ.setRequestHeader("Accept",bD.dataTypes[0]&&bD.accepts[bD.dataTypes[0]]?bD.accepts[bD.dataTypes[0]]+(bD.dataTypes[0]!=="*"?", "+aV+"; q=0.01":""):bD.accepts["*"]);for(bK in bD.headers){bJ.setRequestHeader(bK,bD.headers[bK])}if(bD.beforeSend&&(bD.beforeSend.call(bS,bJ,bD)===false||bA===2)){bJ.abort();return false}for(bK in {success:1,error:1,complete:1}){bJ[bK](bD[bK])}bL=aW(r,bD,bx,bJ);if(!bL){bF(-1,"No Transport")}else{bJ.readyState=1;if(bw){bG.trigger("ajaxSend",[bJ,bD])}if(bD.async&&bD.timeout>0){bE=setTimeout(function(){bJ.abort("timeout")},bD.timeout)}try{bA=1;bL.send(bH,bF)}catch(bM){if(bA<2){bF(-1,bM)}else{throw bM}}}return bJ},param:function(e,bw){var bv=[],by=function(bz,bA){bA=b.isFunction(bA)?bA():bA;bv[bv.length]=encodeURIComponent(bz)+"="+encodeURIComponent(bA)};if(bw===L){bw=b.ajaxSettings.traditional}if(b.isArray(e)||(e.jquery&&!b.isPlainObject(e))){b.each(e,function(){by(this.name,this.value)})}else{for(var bx in e){v(bx,e[bx],bw,by)}}return bv.join("&").replace(k,"+")}});function v(bw,by,bv,bx){if(b.isArray(by)){b.each(by,function(bA,bz){if(bv||ap.test(bw)){bx(bw,bz)}else{v(bw+"["+(typeof bz==="object"||b.isArray(bz)?bA:"")+"]",bz,bv,bx)}})}else{if(!bv&&by!=null&&typeof by==="object"){for(var e in by){v(bw+"["+e+"]",by[e],bv,bx)}}else{bx(bw,by)}}}b.extend({active:0,lastModified:{},etag:{}});function bj(bD,bC,bz){var bv=bD.contents,bB=bD.dataTypes,bw=bD.responseFields,by,bA,bx,e;for(bA in bw){if(bA in bz){bC[bw[bA]]=bz[bA]}}while(bB[0]==="*"){bB.shift();if(by===L){by=bD.mimeType||bC.getResponseHeader("content-type")}}if(by){for(bA in bv){if(bv[bA]&&bv[bA].test(by)){bB.unshift(bA);break}}}if(bB[0] in bz){bx=bB[0]}else{for(bA in bz){if(!bB[0]||bD.converters[bA+" "+bB[0]]){bx=bA;break}if(!e){e=bA}}bx=bx||e}if(bx){if(bx!==bB[0]){bB.unshift(bx)}return bz[bx]}}function G(bH,bz){if(bH.dataFilter){bz=bH.dataFilter(bz,bH.dataType)}var bD=bH.dataTypes,bG={},bA,bE,bw=bD.length,bB,bC=bD[0],bx,by,bF,bv,e;for(bA=1;bA<bw;bA++){if(bA===1){for(bE in bH.converters){if(typeof bE==="string"){bG[bE.toLowerCase()]=bH.converters[bE]}}}bx=bC;bC=bD[bA];if(bC==="*"){bC=bx}else{if(bx!=="*"&&bx!==bC){by=bx+" "+bC;bF=bG[by]||bG["* "+bC];if(!bF){e=L;for(bv in bG){bB=bv.split(" ");if(bB[0]===bx||bB[0]==="*"){e=bG[bB[1]+" "+bC];if(e){bv=bG[bv];if(bv===true){bF=e}else{if(e===true){bF=bv}}break}}}}if(!(bF||e)){b.error("No conversion from "+by.replace(" "," to "))}if(bF!==true){bz=bF?bF(bz):e(bv(bz))}}}}return bz}var aC=b.now(),u=/(\=)\?(&|$)|\?\?/i;b.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return b.expando+"_"+(aC++)}});b.ajaxPrefilter("json jsonp",function(bD,bA,bC){var bx=bD.contentType==="application/x-www-form-urlencoded"&&(typeof bD.data==="string");if(bD.dataTypes[0]==="jsonp"||bD.jsonp!==false&&(u.test(bD.url)||bx&&u.test(bD.data))){var bB,bw=bD.jsonpCallback=b.isFunction(bD.jsonpCallback)?bD.jsonpCallback():bD.jsonpCallback,bz=bb[bw],e=bD.url,by=bD.data,bv="$1"+bw+"$2";if(bD.jsonp!==false){e=e.replace(u,bv);if(bD.url===e){if(bx){by=by.replace(u,bv)}if(bD.data===by){e+=(/\?/.test(e)?"&":"?")+bD.jsonp+"="+bw}}}bD.url=e;bD.data=by;bb[bw]=function(bE){bB=[bE]};bC.always(function(){bb[bw]=bz;if(bB&&b.isFunction(bz)){bb[bw](bB[0])}});bD.converters["script json"]=function(){if(!bB){b.error(bw+" was not called")}return bB[0]};bD.dataTypes[0]="json";return"script"}});b.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(e){b.globalEval(e);return e}}});b.ajaxPrefilter("script",function(e){if(e.cache===L){e.cache=false}if(e.crossDomain){e.type="GET";e.global=false}});b.ajaxTransport("script",function(bw){if(bw.crossDomain){var e,bv=av.head||av.getElementsByTagName("head")[0]||av.documentElement;return{send:function(bx,by){e=av.createElement("script");e.async="async";if(bw.scriptCharset){e.charset=bw.scriptCharset}e.src=bw.url;e.onload=e.onreadystatechange=function(bA,bz){if(bz||!e.readyState||/loaded|complete/.test(e.readyState)){e.onload=e.onreadystatechange=null;if(bv&&e.parentNode){bv.removeChild(e)}e=L;if(!bz){by(200,"success")}}};bv.insertBefore(e,bv.firstChild)},abort:function(){if(e){e.onload(0,1)}}}}});var B=bb.ActiveXObject?function(){for(var e in N){N[e](0,1)}}:false,y=0,N;function aL(){try{return new bb.XMLHttpRequest()}catch(bv){}}function aj(){try{return new bb.ActiveXObject("Microsoft.XMLHTTP")}catch(bv){}}b.ajaxSettings.xhr=bb.ActiveXObject?function(){return !this.isLocal&&aL()||aj()}:aL;(function(e){b.extend(b.support,{ajax:!!e,cors:!!e&&("withCredentials" in e)})})(b.ajaxSettings.xhr());if(b.support.ajax){b.ajaxTransport(function(e){if(!e.crossDomain||b.support.cors){var bv;return{send:function(bB,bw){var bA=e.xhr(),bz,by;if(e.username){bA.open(e.type,e.url,e.async,e.username,e.password)}else{bA.open(e.type,e.url,e.async)}if(e.xhrFields){for(by in e.xhrFields){bA[by]=e.xhrFields[by]}}if(e.mimeType&&bA.overrideMimeType){bA.overrideMimeType(e.mimeType)}if(!e.crossDomain&&!bB["X-Requested-With"]){bB["X-Requested-With"]="XMLHttpRequest"}try{for(by in bB){bA.setRequestHeader(by,bB[by])}}catch(bx){}bA.send((e.hasContent&&e.data)||null);bv=function(bK,bE){var bF,bD,bC,bI,bH;try{if(bv&&(bE||bA.readyState===4)){bv=L;if(bz){bA.onreadystatechange=b.noop;if(B){delete N[bz]}}if(bE){if(bA.readyState!==4){bA.abort()}}else{bF=bA.status;bC=bA.getAllResponseHeaders();bI={};bH=bA.responseXML;if(bH&&bH.documentElement){bI.xml=bH}bI.text=bA.responseText;try{bD=bA.statusText}catch(bJ){bD=""}if(!bF&&e.isLocal&&!e.crossDomain){bF=bI.text?200:404}else{if(bF===1223){bF=204}}}}}catch(bG){if(!bE){bw(-1,bG)}}if(bI){bw(bF,bD,bI,bC)}};if(!e.async||bA.readyState===4){bv()}else{bz=++y;if(B){if(!N){N={};b(bb).unload(B)}N[bz]=bv}bA.onreadystatechange=bv}},abort:function(){if(bv){bv(0,1)}}}}})}var Q={},a8,m,aB=/^(?:toggle|show|hide)$/,aT=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,a3,aH=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],a4;b.fn.extend({show:function(bx,bA,bz){var bw,by;if(bx||bx===0){return this.animate(a0("show",3),bx,bA,bz)}else{for(var bv=0,e=this.length;bv<e;bv++){bw=this[bv];if(bw.style){by=bw.style.display;if(!b._data(bw,"olddisplay")&&by==="none"){by=bw.style.display=""}if(by===""&&b.css(bw,"display")==="none"){b._data(bw,"olddisplay",x(bw.nodeName))}}}for(bv=0;bv<e;bv++){bw=this[bv];if(bw.style){by=bw.style.display;if(by===""||by==="none"){bw.style.display=b._data(bw,"olddisplay")||""}}}return this}},hide:function(bx,bA,bz){if(bx||bx===0){return this.animate(a0("hide",3),bx,bA,bz)}else{var bw,by,bv=0,e=this.length;for(;bv<e;bv++){bw=this[bv];if(bw.style){by=b.css(bw,"display");if(by!=="none"&&!b._data(bw,"olddisplay")){b._data(bw,"olddisplay",by)}}}for(bv=0;bv<e;bv++){if(this[bv].style){this[bv].style.display="none"}}return this}},_toggle:b.fn.toggle,toggle:function(bw,bv,bx){var e=typeof bw==="boolean";if(b.isFunction(bw)&&b.isFunction(bv)){this._toggle.apply(this,arguments)}else{if(bw==null||e){this.each(function(){var by=e?bw:b(this).is(":hidden");b(this)[by?"show":"hide"]()})}else{this.animate(a0("toggle",3),bw,bv,bx)}}return this},fadeTo:function(e,bx,bw,bv){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:bx},e,bw,bv)},animate:function(bz,bw,by,bx){var e=b.speed(bw,by,bx);if(b.isEmptyObject(bz)){return this.each(e.complete,[false])}bz=b.extend({},bz);function bv(){if(e.queue===false){b._mark(this)}var bE=b.extend({},e),bK=this.nodeType===1,bI=bK&&b(this).is(":hidden"),bB,bF,bD,bJ,bH,bC,bG,bL,bA;bE.animatedProperties={};for(bD in bz){bB=b.camelCase(bD);if(bD!==bB){bz[bB]=bz[bD];delete bz[bD]}bF=bz[bB];if(b.isArray(bF)){bE.animatedProperties[bB]=bF[1];bF=bz[bB]=bF[0]}else{bE.animatedProperties[bB]=bE.specialEasing&&bE.specialEasing[bB]||bE.easing||"swing"}if(bF==="hide"&&bI||bF==="show"&&!bI){return bE.complete.call(this)}if(bK&&(bB==="height"||bB==="width")){bE.overflow=[this.style.overflow,this.style.overflowX,this.style.overflowY];if(b.css(this,"display")==="inline"&&b.css(this,"float")==="none"){if(!b.support.inlineBlockNeedsLayout||x(this.nodeName)==="inline"){this.style.display="inline-block"}else{this.style.zoom=1}}}}if(bE.overflow!=null){this.style.overflow="hidden"}for(bD in bz){bJ=new b.fx(this,bE,bD);bF=bz[bD];if(aB.test(bF)){bA=b._data(this,"toggle"+bD)||(bF==="toggle"?bI?"show":"hide":0);if(bA){b._data(this,"toggle"+bD,bA==="show"?"hide":"show");bJ[bA]()}else{bJ[bF]()}}else{bH=aT.exec(bF);bC=bJ.cur();if(bH){bG=parseFloat(bH[2]);bL=bH[3]||(b.cssNumber[bD]?"":"px");if(bL!=="px"){b.style(this,bD,(bG||1)+bL);bC=((bG||1)/bJ.cur())*bC;b.style(this,bD,bC+bL)}if(bH[1]){bG=((bH[1]==="-="?-1:1)*bG)+bC}bJ.custom(bC,bG,bL)}else{bJ.custom(bC,bF,"")}}}return true}return e.queue===false?this.each(bv):this.queue(e.queue,bv)},stop:function(bw,bv,e){if(typeof bw!=="string"){e=bv;bv=bw;bw=L}if(bv&&bw!==false){this.queue(bw||"fx",[])}return this.each(function(){var bx,by=false,bA=b.timers,bz=b._data(this);if(!e){b._unmark(true,this)}function bB(bE,bF,bD){var bC=bF[bD];b.removeData(bE,bD,true);bC.stop(e)}if(bw==null){for(bx in bz){if(bz[bx]&&bz[bx].stop&&bx.indexOf(".run")===bx.length-4){bB(this,bz,bx)}}}else{if(bz[bx=bw+".run"]&&bz[bx].stop){bB(this,bz,bx)}}for(bx=bA.length;bx--;){if(bA[bx].elem===this&&(bw==null||bA[bx].queue===bw)){if(e){bA[bx](true)}else{bA[bx].saveState()}by=true;bA.splice(bx,1)}}if(!(e&&by)){b.dequeue(this,bw)}})}});function bh(){setTimeout(at,0);return(a4=b.now())}function at(){a4=L}function a0(bv,e){var bw={};b.each(aH.concat.apply([],aH.slice(0,e)),function(){bw[this]=bv});return bw}b.each({slideDown:a0("show",1),slideUp:a0("hide",1),slideToggle:a0("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,bv){b.fn[e]=function(bw,by,bx){return this.animate(bv,bw,by,bx)}});b.extend({speed:function(bw,bx,bv){var e=bw&&typeof bw==="object"?b.extend({},bw):{complete:bv||!bv&&bx||b.isFunction(bw)&&bw,duration:bw,easing:bv&&bx||bx&&!b.isFunction(bx)&&bx};e.duration=b.fx.off?0:typeof e.duration==="number"?e.duration:e.duration in b.fx.speeds?b.fx.speeds[e.duration]:b.fx.speeds._default;if(e.queue==null||e.queue===true){e.queue="fx"}e.old=e.complete;e.complete=function(by){if(b.isFunction(e.old)){e.old.call(this)}if(e.queue){b.dequeue(this,e.queue)}else{if(by!==false){b._unmark(this)}}};return e},easing:{linear:function(bw,bx,e,bv){return e+bv*bw},swing:function(bw,bx,e,bv){return((-Math.cos(bw*Math.PI)/2)+0.5)*bv+e}},timers:[],fx:function(bv,e,bw){this.options=e;this.elem=bv;this.prop=bw;e.orig=e.orig||{}}});b.fx.prototype={update:function(){if(this.options.step){this.options.step.call(this.elem,this.now,this)}(b.fx.step[this.prop]||b.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null)){return this.elem[this.prop]}var e,bv=b.css(this.elem,this.prop);return isNaN(e=parseFloat(bv))?!bv||bv==="auto"?0:bv:e},custom:function(bz,by,bx){var e=this,bw=b.fx;this.startTime=a4||bh();this.end=by;this.now=this.start=bz;this.pos=this.state=0;this.unit=bx||this.unit||(b.cssNumber[this.prop]?"":"px");function bv(bA){return e.step(bA)}bv.queue=this.options.queue;bv.elem=this.elem;bv.saveState=function(){if(e.options.hide&&b._data(e.elem,"fxshow"+e.prop)===L){b._data(e.elem,"fxshow"+e.prop,e.start)}};if(bv()&&b.timers.push(bv)&&!a3){a3=setInterval(bw.tick,bw.interval)}},show:function(){var e=b._data(this.elem,"fxshow"+this.prop);this.options.orig[this.prop]=e||b.style(this.elem,this.prop);this.options.show=true;if(e!==L){this.custom(this.cur(),e)}else{this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur())}b(this.elem).show()},hide:function(){this.options.orig[this.prop]=b._data(this.elem,"fxshow"+this.prop)||b.style(this.elem,this.prop);this.options.hide=true;this.custom(this.cur(),0)},step:function(by){var bA,bB,bv,bx=a4||bh(),e=true,bz=this.elem,bw=this.options;if(by||bx>=bw.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();bw.animatedProperties[this.prop]=true;for(bA in bw.animatedProperties){if(bw.animatedProperties[bA]!==true){e=false}}if(e){if(bw.overflow!=null&&!b.support.shrinkWrapBlocks){b.each(["","X","Y"],function(bC,bD){bz.style["overflow"+bD]=bw.overflow[bC]})}if(bw.hide){b(bz).hide()}if(bw.hide||bw.show){for(bA in bw.animatedProperties){b.style(bz,bA,bw.orig[bA]);b.removeData(bz,"fxshow"+bA,true);b.removeData(bz,"toggle"+bA,true)}}bv=bw.complete;if(bv){bw.complete=false;bv.call(bz)}}return false}else{if(bw.duration==Infinity){this.now=bx}else{bB=bx-this.startTime;this.state=bB/bw.duration;this.pos=b.easing[bw.animatedProperties[this.prop]](this.state,bB,0,1,bw.duration);this.now=this.start+((this.end-this.start)*this.pos)}this.update()}return true}};b.extend(b.fx,{tick:function(){var bw,bv=b.timers,e=0;for(;e<bv.length;e++){bw=bv[e];if(!bw()&&bv[e]===bw){bv.splice(e--,1)}}if(!bv.length){b.fx.stop()}},interval:13,stop:function(){clearInterval(a3);a3=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(e){b.style(e.elem,"opacity",e.now)},_default:function(e){if(e.elem.style&&e.elem.style[e.prop]!=null){e.elem.style[e.prop]=e.now+e.unit}else{e.elem[e.prop]=e.now}}}});b.each(["width","height"],function(e,bv){b.fx.step[bv]=function(bw){b.style(bw.elem,bv,Math.max(0,bw.now)+bw.unit)}});if(b.expr&&b.expr.filters){b.expr.filters.animated=function(e){return b.grep(b.timers,function(bv){return e===bv.elem}).length}}function x(bx){if(!Q[bx]){var e=av.body,bv=b("<"+bx+">").appendTo(e),bw=bv.css("display");bv.remove();if(bw==="none"||bw===""){if(!a8){a8=av.createElement("iframe");a8.frameBorder=a8.width=a8.height=0}e.appendChild(a8);if(!m||!a8.createElement){m=(a8.contentWindow||a8.contentDocument).document;m.write((av.compatMode==="CSS1Compat"?"<!doctype html>":"")+"<html><body>");m.close()}bv=m.createElement(bx);m.body.appendChild(bv);bw=b.css(bv,"display");e.removeChild(a8)}Q[bx]=bw}return Q[bx]}var V=/^t(?:able|d|h)$/i,ad=/^(?:body|html)$/i;if("getBoundingClientRect" in av.documentElement){b.fn.offset=function(bI){var by=this[0],bB;if(bI){return this.each(function(e){b.offset.setOffset(this,bI,e)})}if(!by||!by.ownerDocument){return null}if(by===by.ownerDocument.body){return b.offset.bodyOffset(by)}try{bB=by.getBoundingClientRect()}catch(bF){}var bH=by.ownerDocument,bw=bH.documentElement;if(!bB||!b.contains(bw,by)){return bB?{top:bB.top,left:bB.left}:{top:0,left:0}}var bC=bH.body,bD=aK(bH),bA=bw.clientTop||bC.clientTop||0,bE=bw.clientLeft||bC.clientLeft||0,bv=bD.pageYOffset||b.support.boxModel&&bw.scrollTop||bC.scrollTop,bz=bD.pageXOffset||b.support.boxModel&&bw.scrollLeft||bC.scrollLeft,bG=bB.top+bv-bA,bx=bB.left+bz-bE;return{top:bG,left:bx}}}else{b.fn.offset=function(bF){var bz=this[0];if(bF){return this.each(function(bG){b.offset.setOffset(this,bF,bG)})}if(!bz||!bz.ownerDocument){return null}if(bz===bz.ownerDocument.body){return b.offset.bodyOffset(bz)}var bC,bw=bz.offsetParent,bv=bz,bE=bz.ownerDocument,bx=bE.documentElement,bA=bE.body,bB=bE.defaultView,e=bB?bB.getComputedStyle(bz,null):bz.currentStyle,bD=bz.offsetTop,by=bz.offsetLeft;while((bz=bz.parentNode)&&bz!==bA&&bz!==bx){if(b.support.fixedPosition&&e.position==="fixed"){break}bC=bB?bB.getComputedStyle(bz,null):bz.currentStyle;bD-=bz.scrollTop;by-=bz.scrollLeft;if(bz===bw){bD+=bz.offsetTop;by+=bz.offsetLeft;if(b.support.doesNotAddBorder&&!(b.support.doesAddBorderForTableAndCells&&V.test(bz.nodeName))){bD+=parseFloat(bC.borderTopWidth)||0;by+=parseFloat(bC.borderLeftWidth)||0}bv=bw;bw=bz.offsetParent}if(b.support.subtractsBorderForOverflowNotVisible&&bC.overflow!=="visible"){bD+=parseFloat(bC.borderTopWidth)||0;by+=parseFloat(bC.borderLeftWidth)||0}e=bC}if(e.position==="relative"||e.position==="static"){bD+=bA.offsetTop;by+=bA.offsetLeft}if(b.support.fixedPosition&&e.position==="fixed"){bD+=Math.max(bx.scrollTop,bA.scrollTop);by+=Math.max(bx.scrollLeft,bA.scrollLeft)}return{top:bD,left:by}}}b.offset={bodyOffset:function(e){var bw=e.offsetTop,bv=e.offsetLeft;if(b.support.doesNotIncludeMarginInBodyOffset){bw+=parseFloat(b.css(e,"marginTop"))||0;bv+=parseFloat(b.css(e,"marginLeft"))||0}return{top:bw,left:bv}},setOffset:function(bx,bG,bA){var bB=b.css(bx,"position");if(bB==="static"){bx.style.position="relative"}var bz=b(bx),bv=bz.offset(),e=b.css(bx,"top"),bE=b.css(bx,"left"),bF=(bB==="absolute"||bB==="fixed")&&b.inArray("auto",[e,bE])>-1,bD={},bC={},bw,by;if(bF){bC=bz.position();bw=bC.top;by=bC.left}else{bw=parseFloat(e)||0;by=parseFloat(bE)||0}if(b.isFunction(bG)){bG=bG.call(bx,bA,bv)}if(bG.top!=null){bD.top=(bG.top-bv.top)+bw}if(bG.left!=null){bD.left=(bG.left-bv.left)+by}if("using" in bG){bG.using.call(bx,bD)}else{bz.css(bD)}}};b.fn.extend({position:function(){if(!this[0]){return null}var bw=this[0],bv=this.offsetParent(),bx=this.offset(),e=ad.test(bv[0].nodeName)?{top:0,left:0}:bv.offset();bx.top-=parseFloat(b.css(bw,"marginTop"))||0;bx.left-=parseFloat(b.css(bw,"marginLeft"))||0;e.top+=parseFloat(b.css(bv[0],"borderTopWidth"))||0;e.left+=parseFloat(b.css(bv[0],"borderLeftWidth"))||0;return{top:bx.top-e.top,left:bx.left-e.left}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||av.body;while(e&&(!ad.test(e.nodeName)&&b.css(e,"position")==="static")){e=e.offsetParent}return e})}});b.each(["Left","Top"],function(bv,e){var bw="scroll"+e;b.fn[bw]=function(bz){var bx,by;if(bz===L){bx=this[0];if(!bx){return null}by=aK(bx);return by?("pageXOffset" in by)?by[bv?"pageYOffset":"pageXOffset"]:b.support.boxModel&&by.document.documentElement[bw]||by.document.body[bw]:bx[bw]}return this.each(function(){by=aK(this);if(by){by.scrollTo(!bv?bz:b(by).scrollLeft(),bv?bz:b(by).scrollTop())}else{this[bw]=bz}})}});function aK(e){return b.isWindow(e)?e:e.nodeType===9?e.defaultView||e.parentWindow:false}b.each(["Height","Width"],function(bv,e){var bw=e.toLowerCase();b.fn["inner"+e]=function(){var bx=this[0];return bx?bx.style?parseFloat(b.css(bx,bw,"padding")):this[bw]():null};b.fn["outer"+e]=function(by){var bx=this[0];return bx?bx.style?parseFloat(b.css(bx,bw,by?"margin":"border")):this[bw]():null};b.fn[bw]=function(bz){var bA=this[0];if(!bA){return bz==null?null:this}if(b.isFunction(bz)){return this.each(function(bE){var bD=b(this);bD[bw](bz.call(this,bE,bD[bw]()))})}if(b.isWindow(bA)){var bB=bA.document.documentElement["client"+e],bx=bA.document.body;return bA.document.compatMode==="CSS1Compat"&&bB||bx&&bx["client"+e]||bB}else{if(bA.nodeType===9){return Math.max(bA.documentElement["client"+e],bA.body["scroll"+e],bA.documentElement["scroll"+e],bA.body["offset"+e],bA.documentElement["offset"+e])}else{if(bz===L){var bC=b.css(bA,bw),by=parseFloat(bC);return b.isNumeric(by)?by:bC}else{return this.css(bw,typeof bz==="string"?bz:bz+"px")}}}}});bb.jQuery=bb.$=b;if(typeof define==="function"&&define.amd&&define.amd.jQuery){define("jquery",[],function(){return b})}})(window);/*!
+ * jQuery UI 1.8.18
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI
+ */
+(function(a,d){a.ui=a.ui||{};if(a.ui.version){return}a.extend(a.ui,{version:"1.8.18",keyCode:{ALT:18,BACKSPACE:8,CAPS_LOCK:20,COMMA:188,COMMAND:91,COMMAND_LEFT:91,COMMAND_RIGHT:93,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,MENU:93,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38,WINDOWS:91}});a.fn.extend({propAttr:a.fn.prop||a.fn.attr,_focus:a.fn.focus,focus:function(e,f){return typeof e==="number"?this.each(function(){var g=this;setTimeout(function(){a(g).focus();if(f){f.call(g)}},e)}):this._focus.apply(this,arguments)},scrollParent:function(){var e;if((a.browser.msie&&(/(static|relative)/).test(this.css("position")))||(/absolute/).test(this.css("position"))){e=this.parents().filter(function(){return(/(relative|absolute|fixed)/).test(a.curCSS(this,"position",1))&&(/(auto|scroll)/).test(a.curCSS(this,"overflow",1)+a.curCSS(this,"overflow-y",1)+a.curCSS(this,"overflow-x",1))}).eq(0)}else{e=this.parents().filter(function(){return(/(auto|scroll)/).test(a.curCSS(this,"overflow",1)+a.curCSS(this,"overflow-y",1)+a.curCSS(this,"overflow-x",1))}).eq(0)}return(/fixed/).test(this.css("position"))||!e.length?a(document):e},zIndex:function(h){if(h!==d){return this.css("zIndex",h)}if(this.length){var f=a(this[0]),e,g;while(f.length&&f[0]!==document){e=f.css("position");if(e==="absolute"||e==="relative"||e==="fixed"){g=parseInt(f.css("zIndex"),10);if(!isNaN(g)&&g!==0){return g}}f=f.parent()}}return 0},disableSelection:function(){return this.bind((a.support.selectstart?"selectstart":"mousedown")+".ui-disableSelection",function(e){e.preventDefault()})},enableSelection:function(){return this.unbind(".ui-disableSelection")}});a.each(["Width","Height"],function(g,e){var f=e==="Width"?["Left","Right"]:["Top","Bottom"],h=e.toLowerCase(),k={innerWidth:a.fn.innerWidth,innerHeight:a.fn.innerHeight,outerWidth:a.fn.outerWidth,outerHeight:a.fn.outerHeight};function j(m,l,i,n){a.each(f,function(){l-=parseFloat(a.curCSS(m,"padding"+this,true))||0;if(i){l-=parseFloat(a.curCSS(m,"border"+this+"Width",true))||0}if(n){l-=parseFloat(a.curCSS(m,"margin"+this,true))||0}});return l}a.fn["inner"+e]=function(i){if(i===d){return k["inner"+e].call(this)}return this.each(function(){a(this).css(h,j(this,i)+"px")})};a.fn["outer"+e]=function(i,l){if(typeof i!=="number"){return k["outer"+e].call(this,i)}return this.each(function(){a(this).css(h,j(this,i,true,l)+"px")})}});function c(g,e){var j=g.nodeName.toLowerCase();if("area"===j){var i=g.parentNode,h=i.name,f;if(!g.href||!h||i.nodeName.toLowerCase()!=="map"){return false}f=a("img[usemap=#"+h+"]")[0];return !!f&&b(f)}return(/input|select|textarea|button|object/.test(j)?!g.disabled:"a"==j?g.href||e:e)&&b(g)}function b(e){return !a(e).parents().andSelf().filter(function(){return a.curCSS(this,"visibility")==="hidden"||a.expr.filters.hidden(this)}).length}a.extend(a.expr[":"],{data:function(g,f,e){return !!a.data(g,e[3])},focusable:function(e){return c(e,!isNaN(a.attr(e,"tabindex")))},tabbable:function(g){var e=a.attr(g,"tabindex"),f=isNaN(e);return(f||e>=0)&&c(g,!f)}});a(function(){var e=document.body,f=e.appendChild(f=document.createElement("div"));f.offsetHeight;a.extend(f.style,{minHeight:"100px",height:"auto",padding:0,borderWidth:0});a.support.minHeight=f.offsetHeight===100;a.support.selectstart="onselectstart" in f;e.removeChild(f).style.display="none"});a.extend(a.ui,{plugin:{add:function(f,g,j){var h=a.ui[f].prototype;for(var e in j){h.plugins[e]=h.plugins[e]||[];h.plugins[e].push([g,j[e]])}},call:function(e,g,f){var j=e.plugins[g];if(!j||!e.element[0].parentNode){return}for(var h=0;h<j.length;h++){if(e.options[j[h][0]]){j[h][1].apply(e.element,f)}}}},contains:function(f,e){return document.compareDocumentPosition?f.compareDocumentPosition(e)&16:f!==e&&f.contains(e)},hasScroll:function(h,f){if(a(h).css("overflow")==="hidden"){return false}var e=(f&&f==="left")?"scrollLeft":"scrollTop",g=false;if(h[e]>0){return true}h[e]=1;g=(h[e]>0);h[e]=0;return g},isOverAxis:function(f,e,g){return(f>e)&&(f<(e+g))},isOver:function(j,f,i,h,e,g){return a.ui.isOverAxis(j,i,e)&&a.ui.isOverAxis(f,h,g)}})})(jQuery);/*!
+ * jQuery UI Widget 1.8.18
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Widget
+ */
+(function(b,d){if(b.cleanData){var c=b.cleanData;b.cleanData=function(f){for(var g=0,h;(h=f[g])!=null;g++){try{b(h).triggerHandler("remove")}catch(j){}}c(f)}}else{var a=b.fn.remove;b.fn.remove=function(e,f){return this.each(function(){if(!f){if(!e||b.filter(e,[this]).length){b("*",this).add([this]).each(function(){try{b(this).triggerHandler("remove")}catch(g){}})}}return a.call(b(this),e,f)})}}b.widget=function(f,h,e){var g=f.split(".")[0],j;f=f.split(".")[1];j=g+"-"+f;if(!e){e=h;h=b.Widget}b.expr[":"][j]=function(k){return !!b.data(k,f)};b[g]=b[g]||{};b[g][f]=function(k,l){if(arguments.length){this._createWidget(k,l)}};var i=new h();i.options=b.extend(true,{},i.options);b[g][f].prototype=b.extend(true,i,{namespace:g,widgetName:f,widgetEventPrefix:b[g][f].prototype.widgetEventPrefix||f,widgetBaseClass:j},e);b.widget.bridge(f,b[g][f])};b.widget.bridge=function(f,e){b.fn[f]=function(i){var g=typeof i==="string",h=Array.prototype.slice.call(arguments,1),j=this;i=!g&&h.length?b.extend.apply(null,[true,i].concat(h)):i;if(g&&i.charAt(0)==="_"){return j}if(g){this.each(function(){var k=b.data(this,f),l=k&&b.isFunction(k[i])?k[i].apply(k,h):k;if(l!==k&&l!==d){j=l;return false}})}else{this.each(function(){var k=b.data(this,f);if(k){k.option(i||{})._init()}else{b.data(this,f,new e(i,this))}})}return j}};b.Widget=function(e,f){if(arguments.length){this._createWidget(e,f)}};b.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",options:{disabled:false},_createWidget:function(f,g){b.data(g,this.widgetName,this);this.element=b(g);this.options=b.extend(true,{},this.options,this._getCreateOptions(),f);var e=this;this.element.bind("remove."+this.widgetName,function(){e.destroy()});this._create();this._trigger("create");this._init()},_getCreateOptions:function(){return b.metadata&&b.metadata.get(this.element[0])[this.widgetName]},_create:function(){},_init:function(){},destroy:function(){this.element.unbind("."+this.widgetName).removeData(this.widgetName);this.widget().unbind("."+this.widgetName).removeAttr("aria-disabled").removeClass(this.widgetBaseClass+"-disabled ui-state-disabled")},widget:function(){return this.element},option:function(f,g){var e=f;if(arguments.length===0){return b.extend({},this.options)}if(typeof f==="string"){if(g===d){return this.options[f]}e={};e[f]=g}this._setOptions(e);return this},_setOptions:function(f){var e=this;b.each(f,function(g,h){e._setOption(g,h)});return this},_setOption:function(e,f){this.options[e]=f;if(e==="disabled"){this.widget()[f?"addClass":"removeClass"](this.widgetBaseClass+"-disabled ui-state-disabled").attr("aria-disabled",f)}return this},enable:function(){return this._setOption("disabled",false)},disable:function(){return this._setOption("disabled",true)},_trigger:function(e,f,g){var j,i,h=this.options[e];g=g||{};f=b.Event(f);f.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase();f.target=this.element[0];i=f.originalEvent;if(i){for(j in i){if(!(j in f)){f[j]=i[j]}}}this.element.trigger(f,g);return !(b.isFunction(h)&&h.call(this.element[0],f,g)===false||f.isDefaultPrevented())}}})(jQuery);/*!
+ * jQuery UI Mouse 1.8.18
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Mouse
+ *
+ * Depends:
+ * jquery.ui.widget.js
+ */
+(function(b,c){var a=false;b(document).mouseup(function(d){a=false});b.widget("ui.mouse",{options:{cancel:":input,option",distance:1,delay:0},_mouseInit:function(){var d=this;this.element.bind("mousedown."+this.widgetName,function(e){return d._mouseDown(e)}).bind("click."+this.widgetName,function(e){if(true===b.data(e.target,d.widgetName+".preventClickEvent")){b.removeData(e.target,d.widgetName+".preventClickEvent");e.stopImmediatePropagation();return false}});this.started=false},_mouseDestroy:function(){this.element.unbind("."+this.widgetName)},_mouseDown:function(f){if(a){return}(this._mouseStarted&&this._mouseUp(f));this._mouseDownEvent=f;var e=this,g=(f.which==1),d=(typeof this.options.cancel=="string"&&f.target.nodeName?b(f.target).closest(this.options.cancel).length:false);if(!g||d||!this._mouseCapture(f)){return true}this.mouseDelayMet=!this.options.delay;if(!this.mouseDelayMet){this._mouseDelayTimer=setTimeout(function(){e.mouseDelayMet=true},this.options.delay)}if(this._mouseDistanceMet(f)&&this._mouseDelayMet(f)){this._mouseStarted=(this._mouseStart(f)!==false);if(!this._mouseStarted){f.preventDefault();return true}}if(true===b.data(f.target,this.widgetName+".preventClickEvent")){b.removeData(f.target,this.widgetName+".preventClickEvent")}this._mouseMoveDelegate=function(h){return e._mouseMove(h)};this._mouseUpDelegate=function(h){return e._mouseUp(h)};b(document).bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate);f.preventDefault();a=true;return true},_mouseMove:function(d){if(b.browser.msie&&!(document.documentMode>=9)&&!d.button){return this._mouseUp(d)}if(this._mouseStarted){this._mouseDrag(d);return d.preventDefault()}if(this._mouseDistanceMet(d)&&this._mouseDelayMet(d)){this._mouseStarted=(this._mouseStart(this._mouseDownEvent,d)!==false);(this._mouseStarted?this._mouseDrag(d):this._mouseUp(d))}return !this._mouseStarted},_mouseUp:function(d){b(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate);if(this._mouseStarted){this._mouseStarted=false;if(d.target==this._mouseDownEvent.target){b.data(d.target,this.widgetName+".preventClickEvent",true)}this._mouseStop(d)}return false},_mouseDistanceMet:function(d){return(Math.max(Math.abs(this._mouseDownEvent.pageX-d.pageX),Math.abs(this._mouseDownEvent.pageY-d.pageY))>=this.options.distance)},_mouseDelayMet:function(d){return this.mouseDelayMet},_mouseStart:function(d){},_mouseDrag:function(d){},_mouseStop:function(d){},_mouseCapture:function(d){return true}})})(jQuery);(function(c,d){c.widget("ui.resizable",c.ui.mouse,{widgetEventPrefix:"resize",options:{alsoResize:false,animate:false,animateDuration:"slow",animateEasing:"swing",aspectRatio:false,autoHide:false,containment:false,ghost:false,grid:false,handles:"e,s,se",helper:false,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:1000},_create:function(){var f=this,k=this.options;this.element.addClass("ui-resizable");c.extend(this,{_aspectRatio:!!(k.aspectRatio),aspectRatio:k.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:k.helper||k.ghost||k.animate?k.helper||"ui-resizable-helper":null});if(this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)){this.element.wrap(c('<div class="ui-wrapper" style="overflow: hidden;"></div>').css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")}));this.element=this.element.parent().data("resizable",this.element.data("resizable"));this.elementIsWrapper=true;this.element.css({marginLeft:this.originalElement.css("marginLeft"),marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom")});this.originalElement.css({marginLeft:0,marginTop:0,marginRight:0,marginBottom:0});this.originalResizeStyle=this.originalElement.css("resize");this.originalElement.css("resize","none");this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"}));this.originalElement.css({margin:this.originalElement.css("margin")});this._proportionallyResize()}this.handles=k.handles||(!c(".ui-resizable-handle",this.element).length?"e,s,se":{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"});if(this.handles.constructor==String){if(this.handles=="all"){this.handles="n,e,s,w,se,sw,ne,nw"}var l=this.handles.split(",");this.handles={};for(var g=0;g<l.length;g++){var j=c.trim(l[g]),e="ui-resizable-"+j;var h=c('<div class="ui-resizable-handle '+e+'"></div>');if(/sw|se|ne|nw/.test(j)){h.css({zIndex:++k.zIndex})}if("se"==j){h.addClass("ui-icon ui-icon-gripsmall-diagonal-se")}this.handles[j]=".ui-resizable-"+j;this.element.append(h)}}this._renderAxis=function(q){q=q||this.element;for(var n in this.handles){if(this.handles[n].constructor==String){this.handles[n]=c(this.handles[n],this.element).show()}if(this.elementIsWrapper&&this.originalElement[0].nodeName.match(/textarea|input|select|button/i)){var o=c(this.handles[n],this.element),p=0;p=/sw|ne|nw|se|n|s/.test(n)?o.outerHeight():o.outerWidth();var m=["padding",/ne|nw|n/.test(n)?"Top":/se|sw|s/.test(n)?"Bottom":/^e$/.test(n)?"Right":"Left"].join("");q.css(m,p);this._proportionallyResize()}if(!c(this.handles[n]).length){continue}}};this._renderAxis(this.element);this._handles=c(".ui-resizable-handle",this.element).disableSelection();this._handles.mouseover(function(){if(!f.resizing){if(this.className){var i=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)}f.axis=i&&i[1]?i[1]:"se"}});if(k.autoHide){this._handles.hide();c(this.element).addClass("ui-resizable-autohide").hover(function(){if(k.disabled){return}c(this).removeClass("ui-resizable-autohide");f._handles.show()},function(){if(k.disabled){return}if(!f.resizing){c(this).addClass("ui-resizable-autohide");f._handles.hide()}})}this._mouseInit()},destroy:function(){this._mouseDestroy();var e=function(g){c(g).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing").removeData("resizable").unbind(".resizable").find(".ui-resizable-handle").remove()};if(this.elementIsWrapper){e(this.element);var f=this.element;f.after(this.originalElement.css({position:f.css("position"),width:f.outerWidth(),height:f.outerHeight(),top:f.css("top"),left:f.css("left")})).remove()}this.originalElement.css("resize",this.originalResizeStyle);e(this.originalElement);return this},_mouseCapture:function(f){var g=false;for(var e in this.handles){if(c(this.handles[e])[0]==f.target){g=true}}return !this.options.disabled&&g},_mouseStart:function(g){var j=this.options,f=this.element.position(),e=this.element;this.resizing=true;this.documentScroll={top:c(document).scrollTop(),left:c(document).scrollLeft()};if(e.is(".ui-draggable")||(/absolute/).test(e.css("position"))){e.css({position:"absolute",top:f.top,left:f.left})}this._renderProxy();var k=b(this.helper.css("left")),h=b(this.helper.css("top"));if(j.containment){k+=c(j.containment).scrollLeft()||0;h+=c(j.containment).scrollTop()||0}this.offset=this.helper.offset();this.position={left:k,top:h};this.size=this._helper?{width:e.outerWidth(),height:e.outerHeight()}:{width:e.width(),height:e.height()};this.originalSize=this._helper?{width:e.outerWidth(),height:e.outerHeight()}:{width:e.width(),height:e.height()};this.originalPosition={left:k,top:h};this.sizeDiff={width:e.outerWidth()-e.width(),height:e.outerHeight()-e.height()};this.originalMousePosition={left:g.pageX,top:g.pageY};this.aspectRatio=(typeof j.aspectRatio=="number")?j.aspectRatio:((this.originalSize.width/this.originalSize.height)||1);var i=c(".ui-resizable-"+this.axis).css("cursor");c("body").css("cursor",i=="auto"?this.axis+"-resize":i);e.addClass("ui-resizable-resizing");this._propagate("start",g);return true},_mouseDrag:function(e){var h=this.helper,g=this.options,m={},q=this,j=this.originalMousePosition,n=this.axis;var r=(e.pageX-j.left)||0,p=(e.pageY-j.top)||0;var i=this._change[n];if(!i){return false}var l=i.apply(this,[e,r,p]),k=c.browser.msie&&c.browser.version<7,f=this.sizeDiff;this._updateVirtualBoundaries(e.shiftKey);if(this._aspectRatio||e.shiftKey){l=this._updateRatio(l,e)}l=this._respectSize(l,e);this._propagate("resize",e);h.css({top:this.position.top+"px",left:this.position.left+"px",width:this.size.width+"px",height:this.size.height+"px"});if(!this._helper&&this._proportionallyResizeElements.length){this._proportionallyResize()}this._updateCache(l);this._trigger("resize",e,this.ui());return false},_mouseStop:function(h){this.resizing=false;var i=this.options,m=this;if(this._helper){var g=this._proportionallyResizeElements,e=g.length&&(/textarea/i).test(g[0].nodeName),f=e&&c.ui.hasScroll(g[0],"left")?0:m.sizeDiff.height,k=e?0:m.sizeDiff.width;var n={width:(m.helper.width()-k),height:(m.helper.height()-f)},j=(parseInt(m.element.css("left"),10)+(m.position.left-m.originalPosition.left))||null,l=(parseInt(m.element.css("top"),10)+(m.position.top-m.originalPosition.top))||null;if(!i.animate){this.element.css(c.extend(n,{top:l,left:j}))}m.helper.height(m.size.height);m.helper.width(m.size.width);if(this._helper&&!i.animate){this._proportionallyResize()}}c("body").css("cursor","auto");this.element.removeClass("ui-resizable-resizing");this._propagate("stop",h);if(this._helper){this.helper.remove()}return false},_updateVirtualBoundaries:function(g){var j=this.options,i,h,f,k,e;e={minWidth:a(j.minWidth)?j.minWidth:0,maxWidth:a(j.maxWidth)?j.maxWidth:Infinity,minHeight:a(j.minHeight)?j.minHeight:0,maxHeight:a(j.maxHeight)?j.maxHeight:Infinity};if(this._aspectRatio||g){i=e.minHeight*this.aspectRatio;f=e.minWidth/this.aspectRatio;h=e.maxHeight*this.aspectRatio;k=e.maxWidth/this.aspectRatio;if(i>e.minWidth){e.minWidth=i}if(f>e.minHeight){e.minHeight=f}if(h<e.maxWidth){e.maxWidth=h}if(k<e.maxHeight){e.maxHeight=k}}this._vBoundaries=e},_updateCache:function(e){var f=this.options;this.offset=this.helper.offset();if(a(e.left)){this.position.left=e.left}if(a(e.top)){this.position.top=e.top}if(a(e.height)){this.size.height=e.height}if(a(e.width)){this.size.width=e.width}},_updateRatio:function(h,g){var i=this.options,j=this.position,f=this.size,e=this.axis;if(a(h.height)){h.width=(h.height*this.aspectRatio)}else{if(a(h.width)){h.height=(h.width/this.aspectRatio)}}if(e=="sw"){h.left=j.left+(f.width-h.width);h.top=null}if(e=="nw"){h.top=j.top+(f.height-h.height);h.left=j.left+(f.width-h.width)}return h},_respectSize:function(l,g){var j=this.helper,i=this._vBoundaries,r=this._aspectRatio||g.shiftKey,q=this.axis,t=a(l.width)&&i.maxWidth&&(i.maxWidth<l.width),m=a(l.height)&&i.maxHeight&&(i.maxHeight<l.height),h=a(l.width)&&i.minWidth&&(i.minWidth>l.width),s=a(l.height)&&i.minHeight&&(i.minHeight>l.height);if(h){l.width=i.minWidth}if(s){l.height=i.minHeight}if(t){l.width=i.maxWidth}if(m){l.height=i.maxHeight}var f=this.originalPosition.left+this.originalSize.width,p=this.position.top+this.size.height;var k=/sw|nw|w/.test(q),e=/nw|ne|n/.test(q);if(h&&k){l.left=f-i.minWidth}if(t&&k){l.left=f-i.maxWidth}if(s&&e){l.top=p-i.minHeight}if(m&&e){l.top=p-i.maxHeight}var n=!l.width&&!l.height;if(n&&!l.left&&l.top){l.top=null}else{if(n&&!l.top&&l.left){l.left=null}}return l},_proportionallyResize:function(){var k=this.options;if(!this._proportionallyResizeElements.length){return}var g=this.helper||this.element;for(var f=0;f<this._proportionallyResizeElements.length;f++){var h=this._proportionallyResizeElements[f];if(!this.borderDif){var e=[h.css("borderTopWidth"),h.css("borderRightWidth"),h.css("borderBottomWidth"),h.css("borderLeftWidth")],j=[h.css("paddingTop"),h.css("paddingRight"),h.css("paddingBottom"),h.css("paddingLeft")];this.borderDif=c.map(e,function(l,n){var m=parseInt(l,10)||0,o=parseInt(j[n],10)||0;return m+o})}if(c.browser.msie&&!(!(c(g).is(":hidden")||c(g).parents(":hidden").length))){continue}h.css({height:(g.height()-this.borderDif[0]-this.borderDif[2])||0,width:(g.width()-this.borderDif[1]-this.borderDif[3])||0})}},_renderProxy:function(){var f=this.element,i=this.options;this.elementOffset=f.offset();if(this._helper){this.helper=this.helper||c('<div style="overflow:hidden;"></div>');var e=c.browser.msie&&c.browser.version<7,g=(e?1:0),h=(e?2:-1);this.helper.addClass(this._helper).css({width:this.element.outerWidth()+h,height:this.element.outerHeight()+h,position:"absolute",left:this.elementOffset.left-g+"px",top:this.elementOffset.top-g+"px",zIndex:++i.zIndex});this.helper.appendTo("body").disableSelection()}else{this.helper=this.element}},_change:{e:function(g,f,e){return{width:this.originalSize.width+f}},w:function(h,f,e){var j=this.options,g=this.originalSize,i=this.originalPosition;return{left:i.left+f,width:g.width-f}},n:function(h,f,e){var j=this.options,g=this.originalSize,i=this.originalPosition;return{top:i.top+e,height:g.height-e}},s:function(g,f,e){return{height:this.originalSize.height+e}},se:function(g,f,e){return c.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[g,f,e]))},sw:function(g,f,e){return c.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[g,f,e]))},ne:function(g,f,e){return c.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[g,f,e]))},nw:function(g,f,e){return c.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[g,f,e]))}},_propagate:function(f,e){c.ui.plugin.call(this,f,[e,this.ui()]);(f!="resize"&&this._trigger(f,e,this.ui()))},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}});c.extend(c.ui.resizable,{version:"1.8.18"});c.ui.plugin.add("resizable","alsoResize",{start:function(f,g){var e=c(this).data("resizable"),i=e.options;var h=function(j){c(j).each(function(){var k=c(this);k.data("resizable-alsoresize",{width:parseInt(k.width(),10),height:parseInt(k.height(),10),left:parseInt(k.css("left"),10),top:parseInt(k.css("top"),10)})})};if(typeof(i.alsoResize)=="object"&&!i.alsoResize.parentNode){if(i.alsoResize.length){i.alsoResize=i.alsoResize[0];h(i.alsoResize)}else{c.each(i.alsoResize,function(j){h(j)})}}else{h(i.alsoResize)}},resize:function(g,i){var f=c(this).data("resizable"),j=f.options,h=f.originalSize,l=f.originalPosition;var k={height:(f.size.height-h.height)||0,width:(f.size.width-h.width)||0,top:(f.position.top-l.top)||0,left:(f.position.left-l.left)||0},e=function(m,n){c(m).each(function(){var q=c(this),r=c(this).data("resizable-alsoresize"),p={},o=n&&n.length?n:q.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];c.each(o,function(s,u){var t=(r[u]||0)+(k[u]||0);if(t&&t>=0){p[u]=t||null}});q.css(p)})};if(typeof(j.alsoResize)=="object"&&!j.alsoResize.nodeType){c.each(j.alsoResize,function(m,n){e(m,n)})}else{e(j.alsoResize)}},stop:function(e,f){c(this).removeData("resizable-alsoresize")}});c.ui.plugin.add("resizable","animate",{stop:function(i,n){var p=c(this).data("resizable"),j=p.options;var h=p._proportionallyResizeElements,e=h.length&&(/textarea/i).test(h[0].nodeName),f=e&&c.ui.hasScroll(h[0],"left")?0:p.sizeDiff.height,l=e?0:p.sizeDiff.width;var g={width:(p.size.width-l),height:(p.size.height-f)},k=(parseInt(p.element.css("left"),10)+(p.position.left-p.originalPosition.left))||null,m=(parseInt(p.element.css("top"),10)+(p.position.top-p.originalPosition.top))||null;p.element.animate(c.extend(g,m&&k?{top:m,left:k}:{}),{duration:j.animateDuration,easing:j.animateEasing,step:function(){var o={width:parseInt(p.element.css("width"),10),height:parseInt(p.element.css("height"),10),top:parseInt(p.element.css("top"),10),left:parseInt(p.element.css("left"),10)};if(h&&h.length){c(h[0]).css({width:o.width,height:o.height})}p._updateCache(o);p._propagate("resize",i)}})}});c.ui.plugin.add("resizable","containment",{start:function(f,r){var t=c(this).data("resizable"),j=t.options,l=t.element;var g=j.containment,k=(g instanceof c)?g.get(0):(/parent/.test(g))?l.parent().get(0):g;if(!k){return}t.containerElement=c(k);if(/document/.test(g)||g==document){t.containerOffset={left:0,top:0};t.containerPosition={left:0,top:0};t.parentData={element:c(document),left:0,top:0,width:c(document).width(),height:c(document).height()||document.body.parentNode.scrollHeight}}else{var n=c(k),i=[];c(["Top","Right","Left","Bottom"]).each(function(p,o){i[p]=b(n.css("padding"+o))});t.containerOffset=n.offset();t.containerPosition=n.position();t.containerSize={height:(n.innerHeight()-i[3]),width:(n.innerWidth()-i[1])};var q=t.containerOffset,e=t.containerSize.height,m=t.containerSize.width,h=(c.ui.hasScroll(k,"left")?k.scrollWidth:m),s=(c.ui.hasScroll(k)?k.scrollHeight:e);t.parentData={element:k,left:q.left,top:q.top,width:h,height:s}}},resize:function(g,q){var t=c(this).data("resizable"),i=t.options,f=t.containerSize,p=t.containerOffset,m=t.size,n=t.position,r=t._aspectRatio||g.shiftKey,e={top:0,left:0},h=t.containerElement;if(h[0]!=document&&(/static/).test(h.css("position"))){e=p}if(n.left<(t._helper?p.left:0)){t.size.width=t.size.width+(t._helper?(t.position.left-p.left):(t.position.left-e.left));if(r){t.size.height=t.size.width/i.aspectRatio}t.position.left=i.helper?p.left:0}if(n.top<(t._helper?p.top:0)){t.size.height=t.size.height+(t._helper?(t.position.top-p.top):t.position.top);if(r){t.size.width=t.size.height*i.aspectRatio}t.position.top=t._helper?p.top:0}t.offset.left=t.parentData.left+t.position.left;t.offset.top=t.parentData.top+t.position.top;var l=Math.abs((t._helper?t.offset.left-e.left:(t.offset.left-e.left))+t.sizeDiff.width),s=Math.abs((t._helper?t.offset.top-e.top:(t.offset.top-p.top))+t.sizeDiff.height);var k=t.containerElement.get(0)==t.element.parent().get(0),j=/relative|absolute/.test(t.containerElement.css("position"));if(k&&j){l-=t.parentData.left}if(l+t.size.width>=t.parentData.width){t.size.width=t.parentData.width-l;if(r){t.size.height=t.size.width/t.aspectRatio}}if(s+t.size.height>=t.parentData.height){t.size.height=t.parentData.height-s;if(r){t.size.width=t.size.height*t.aspectRatio}}},stop:function(f,n){var q=c(this).data("resizable"),g=q.options,l=q.position,m=q.containerOffset,e=q.containerPosition,i=q.containerElement;var j=c(q.helper),r=j.offset(),p=j.outerWidth()-q.sizeDiff.width,k=j.outerHeight()-q.sizeDiff.height;if(q._helper&&!g.animate&&(/relative/).test(i.css("position"))){c(this).css({left:r.left-e.left-m.left,width:p,height:k})}if(q._helper&&!g.animate&&(/static/).test(i.css("position"))){c(this).css({left:r.left-e.left-m.left,width:p,height:k})}}});c.ui.plugin.add("resizable","ghost",{start:function(g,h){var e=c(this).data("resizable"),i=e.options,f=e.size;e.ghost=e.originalElement.clone();e.ghost.css({opacity:0.25,display:"block",position:"relative",height:f.height,width:f.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass(typeof i.ghost=="string"?i.ghost:"");e.ghost.appendTo(e.helper)},resize:function(f,g){var e=c(this).data("resizable"),h=e.options;if(e.ghost){e.ghost.css({position:"relative",height:e.size.height,width:e.size.width})}},stop:function(f,g){var e=c(this).data("resizable"),h=e.options;if(e.ghost&&e.helper){e.helper.get(0).removeChild(e.ghost.get(0))}}});c.ui.plugin.add("resizable","grid",{resize:function(e,m){var p=c(this).data("resizable"),h=p.options,k=p.size,i=p.originalSize,j=p.originalPosition,n=p.axis,l=h._aspectRatio||e.shiftKey;h.grid=typeof h.grid=="number"?[h.grid,h.grid]:h.grid;var g=Math.round((k.width-i.width)/(h.grid[0]||1))*(h.grid[0]||1),f=Math.round((k.height-i.height)/(h.grid[1]||1))*(h.grid[1]||1);if(/^(se|s|e)$/.test(n)){p.size.width=i.width+g;p.size.height=i.height+f}else{if(/^(ne)$/.test(n)){p.size.width=i.width+g;p.size.height=i.height+f;p.position.top=j.top-f}else{if(/^(sw)$/.test(n)){p.size.width=i.width+g;p.size.height=i.height+f;p.position.left=j.left-g}else{p.size.width=i.width+g;p.size.height=i.height+f;p.position.top=j.top-f;p.position.left=j.left-g}}}}});var b=function(e){return parseInt(e,10)||0};var a=function(e){return !isNaN(parseInt(e,10))}})(jQuery);/*!
+ * jQuery hashchange event - v1.3 - 7/21/2010
+ * http://benalman.com/projects/jquery-hashchange-plugin/
+ *
+ * Copyright (c) 2010 "Cowboy" Ben Alman
+ * Dual licensed under the MIT and GPL licenses.
+ * http://benalman.com/about/license/
+ */
+(function($,e,b){var c="hashchange",h=document,f,g=$.event.special,i=h.documentMode,d="on"+c in e&&(i===b||i>7);function a(j){j=j||location.href;return"#"+j.replace(/^[^#]*#?(.*)$/,"$1")}$.fn[c]=function(j){return j?this.bind(c,j):this.trigger(c)};$.fn[c].delay=50;g[c]=$.extend(g[c],{setup:function(){if(d){return false}$(f.start)},teardown:function(){if(d){return false}$(f.stop)}});f=(function(){var j={},p,m=a(),k=function(q){return q},l=k,o=k;j.start=function(){p||n()};j.stop=function(){p&&clearTimeout(p);p=b};function n(){var r=a(),q=o(m);if(r!==m){l(m=r,q);$(e).trigger(c)}else{if(q!==m){location.href=location.href.replace(/#.*/,"")+q}}p=setTimeout(n,$.fn[c].delay)}$.browser.msie&&!d&&(function(){var q,r;j.start=function(){if(!q){r=$.fn[c].src;r=r&&r+a();q=$('<iframe tabindex="-1" title="empty"/>').hide().one("load",function(){r||l(a());n()}).attr("src",r||"javascript:0").insertAfter("body")[0].contentWindow;h.onpropertychange=function(){try{if(event.propertyName==="title"){q.document.title=h.title}}catch(s){}}}};j.stop=k;o=function(){return a(q.location.href)};l=function(v,s){var u=q.document,t=$.fn[c].domain;if(v!==s){u.title=h.title;u.open();t&&u.write('<script>document.domain="'+t+'"<\/script>');u.close();q.location.hash=v}}})();return j})()})(jQuery,this);(function(c){var a=c.scrollTo=function(f,e,d){c(window).scrollTo(f,e,d)};a.defaults={axis:"xy",duration:parseFloat(c.fn.jquery)>=1.3?0:1};a.window=function(d){return c(window)._scrollable()};c.fn._scrollable=function(){return this.map(function(){var e=this,d=!e.nodeName||c.inArray(e.nodeName.toLowerCase(),["iframe","#document","html","body"])!=-1;if(!d){return e}var f=(e.contentWindow||e).document||e.ownerDocument||e;return c.browser.safari||f.compatMode=="BackCompat"?f.body:f.documentElement})};c.fn.scrollTo=function(f,e,d){if(typeof e=="object"){d=e;e=0}if(typeof d=="function"){d={onAfter:d}}if(f=="max"){f=9000000000}d=c.extend({},a.defaults,d);e=e||d.speed||d.duration;d.queue=d.queue&&d.axis.length>1;if(d.queue){e/=2}d.offset=b(d.offset);d.over=b(d.over);return this._scrollable().each(function(){var l=this,j=c(l),k=f,i,g={},m=j.is("html,body");switch(typeof k){case"number":case"string":if(/^([+-]=)?\d+(\.\d+)?(px|%)?$/.test(k)){k=b(k);break}k=c(k,this);case"object":if(k.is||k.style){i=(k=c(k)).offset()}}c.each(d.axis.split(""),function(q,r){var s=r=="x"?"Left":"Top",u=s.toLowerCase(),p="scroll"+s,o=l[p],n=a.max(l,r);if(i){g[p]=i[u]+(m?0:o-j.offset()[u]);if(d.margin){g[p]-=parseInt(k.css("margin"+s))||0;g[p]-=parseInt(k.css("border"+s+"Width"))||0}g[p]+=d.offset[u]||0;if(d.over[u]){g[p]+=k[r=="x"?"width":"height"]()*d.over[u]}}else{var t=k[u];g[p]=t.slice&&t.slice(-1)=="%"?parseFloat(t)/100*n:t}if(/^\d+$/.test(g[p])){g[p]=g[p]<=0?0:Math.min(g[p],n)}if(!q&&d.queue){if(o!=g[p]){h(d.onAfterFirst)}delete g[p]}});h(d.onAfter);function h(n){j.animate(g,e,d.easing,n&&function(){n.call(this,f,d)})}}).end()};a.max=function(j,i){var h=i=="x"?"Width":"Height",e="scroll"+h;if(!c(j).is("html,body")){return j[e]-c(j)[h.toLowerCase()]()}var g="client"+h,f=j.ownerDocument.documentElement,d=j.ownerDocument.body;return Math.max(f[e],d[e])-Math.min(f[g],d[g])};function b(d){return typeof d=="object"?d:{top:d,left:d}}})(jQuery);/*!
+ PowerTip - v1.2.0 - 2013-04-03
+ http://stevenbenner.github.com/jquery-powertip/
+ Copyright (c) 2013 Steven Benner (http://stevenbenner.com/).
+ Released under MIT license.
+ https://raw.github.com/stevenbenner/jquery-powertip/master/LICENSE.txt
+*/
+(function(a){if(typeof define==="function"&&define.amd){define(["jquery"],a)}else{a(jQuery)}}(function(k){var A=k(document),s=k(window),w=k("body");var n="displayController",e="hasActiveHover",d="forcedOpen",u="hasMouseMove",f="mouseOnToPopup",g="originalTitle",y="powertip",o="powertipjq",l="powertiptarget",E=180/Math.PI;var c={isTipOpen:false,isFixedTipOpen:false,isClosing:false,tipOpenImminent:false,activeHover:null,currentX:0,currentY:0,previousX:0,previousY:0,desyncTimeout:null,mouseTrackingActive:false,delayInProgress:false,windowWidth:0,windowHeight:0,scrollTop:0,scrollLeft:0};var p={none:0,top:1,bottom:2,left:4,right:8};k.fn.powerTip=function(F,N){if(!this.length){return this}if(k.type(F)==="string"&&k.powerTip[F]){return k.powerTip[F].call(this,this,N)}var O=k.extend({},k.fn.powerTip.defaults,F),G=new x(O);h();this.each(function M(){var R=k(this),Q=R.data(y),P=R.data(o),T=R.data(l),S;if(R.data(n)){k.powerTip.destroy(R)}S=R.attr("title");if(!Q&&!T&&!P&&S){R.data(y,S);R.data(g,S);R.removeAttr("title")}R.data(n,new t(R,O,G))});if(!O.manual){this.on({"mouseenter.powertip":function J(P){k.powerTip.show(this,P)},"mouseleave.powertip":function L(){k.powerTip.hide(this)},"focus.powertip":function K(){k.powerTip.show(this)},"blur.powertip":function H(){k.powerTip.hide(this,true)},"keydown.powertip":function I(P){if(P.keyCode===27){k.powerTip.hide(this,true)}}})}return this};k.fn.powerTip.defaults={fadeInTime:200,fadeOutTime:100,followMouse:false,popupId:"powerTip",intentSensitivity:7,intentPollInterval:100,closeDelay:100,placement:"n",smartPlacement:false,offset:10,mouseOnToPopup:false,manual:false};k.fn.powerTip.smartPlacementLists={n:["n","ne","nw","s"],e:["e","ne","se","w","nw","sw","n","s","e"],s:["s","se","sw","n"],w:["w","nw","sw","e","ne","se","n","s","w"],nw:["nw","w","sw","n","s","se","nw"],ne:["ne","e","se","n","s","sw","ne"],sw:["sw","w","nw","s","n","ne","sw"],se:["se","e","ne","s","n","nw","se"],"nw-alt":["nw-alt","n","ne-alt","sw-alt","s","se-alt","w","e"],"ne-alt":["ne-alt","n","nw-alt","se-alt","s","sw-alt","e","w"],"sw-alt":["sw-alt","s","se-alt","nw-alt","n","ne-alt","w","e"],"se-alt":["se-alt","s","sw-alt","ne-alt","n","nw-alt","e","w"]};k.powerTip={show:function z(F,G){if(G){i(G);c.previousX=G.pageX;c.previousY=G.pageY;k(F).data(n).show()}else{k(F).first().data(n).show(true,true)}return F},reposition:function r(F){k(F).first().data(n).resetPosition();return F},hide:function D(G,F){if(G){k(G).first().data(n).hide(F)}else{if(c.activeHover){c.activeHover.data(n).hide(true)}}return G},destroy:function C(G){k(G).off(".powertip").each(function F(){var I=k(this),H=[g,n,e,d];if(I.data(g)){I.attr("title",I.data(g));H.push(y)}I.removeData(H)});return G}};k.powerTip.showTip=k.powerTip.show;k.powerTip.closeTip=k.powerTip.hide;function b(){var F=this;F.top="auto";F.left="auto";F.right="auto";F.bottom="auto";F.set=function(H,G){if(k.isNumeric(G)){F[H]=Math.round(G)}}}function t(K,N,F){var J=null;function L(P,Q){M();if(!K.data(e)){if(!P){c.tipOpenImminent=true;J=setTimeout(function O(){J=null;I()},N.intentPollInterval)}else{if(Q){K.data(d,true)}F.showTip(K)}}}function G(P){M();c.tipOpenImminent=false;if(K.data(e)){K.data(d,false);if(!P){c.delayInProgress=true;J=setTimeout(function O(){J=null;F.hideTip(K);c.delayInProgress=false},N.closeDelay)}else{F.hideTip(K)}}}function I(){var Q=Math.abs(c.previousX-c.currentX),O=Math.abs(c.previousY-c.currentY),P=Q+O;if(P<N.intentSensitivity){F.showTip(K)}else{c.previousX=c.currentX;c.previousY=c.currentY;L()}}function M(){J=clearTimeout(J);c.delayInProgress=false}function H(){F.resetPosition(K)}this.show=L;this.hide=G;this.cancel=M;this.resetPosition=H}function j(){function G(M,L,J,O,P){var K=L.split("-")[0],N=new b(),I;if(q(M)){I=H(M,K)}else{I=F(M,K)}switch(L){case"n":N.set("left",I.left-(J/2));N.set("bottom",c.windowHeight-I.top+P);break;case"e":N.set("left",I.left+P);N.set("top",I.top-(O/2));break;case"s":N.set("left",I.left-(J/2));N.set("top",I.top+P);break;case"w":N.set("top",I.top-(O/2));N.set("right",c.windowWidth-I.left+P);break;case"nw":N.set("bottom",c.windowHeight-I.top+P);N.set("right",c.windowWidth-I.left-20);break;case"nw-alt":N.set("left",I.left);N.set("bottom",c.windowHeight-I.top+P);break;case"ne":N.set("left",I.left-20);N.set("bottom",c.windowHeight-I.top+P);break;case"ne-alt":N.set("bottom",c.windowHeight-I.top+P);N.set("right",c.windowWidth-I.left);break;case"sw":N.set("top",I.top+P);N.set("right",c.windowWidth-I.left-20);break;case"sw-alt":N.set("left",I.left);N.set("top",I.top+P);break;case"se":N.set("left",I.left-20);N.set("top",I.top+P);break;case"se-alt":N.set("top",I.top+P);N.set("right",c.windowWidth-I.left);break}return N}function F(K,J){var O=K.offset(),N=K.outerWidth(),I=K.outerHeight(),M,L;switch(J){case"n":M=O.left+N/2;L=O.top;break;case"e":M=O.left+N;L=O.top+I/2;break;case"s":M=O.left+N/2;L=O.top+I;break;case"w":M=O.left;L=O.top+I/2;break;case"nw":M=O.left;L=O.top;break;case"ne":M=O.left+N;L=O.top;break;case"sw":M=O.left;L=O.top+I;break;case"se":M=O.left+N;L=O.top+I;break}return{top:L,left:M}}function H(O,K){var S=O.closest("svg")[0],N=O[0],W=S.createSVGPoint(),L=N.getBBox(),V=N.getScreenCTM(),M=L.width/2,Q=L.height/2,P=[],I=["nw","n","ne","e","se","s","sw","w"],U,X,R,T;function J(){P.push(W.matrixTransform(V))}W.x=L.x;W.y=L.y;J();W.x+=M;J();W.x+=M;J();W.y+=Q;J();W.y+=Q;J();W.x-=M;J();W.x-=M;J();W.y-=Q;J();if(P[0].y!==P[1].y||P[0].x!==P[7].x){X=Math.atan2(V.b,V.a)*E;R=Math.ceil(((X%360)-22.5)/45);if(R<1){R+=8}while(R--){I.push(I.shift())}}for(T=0;T<P.length;T++){if(I[T]===K){U=P[T];break}}return{top:U.y+c.scrollTop,left:U.x+c.scrollLeft}}this.compute=G}function x(Q){var P=new j(),O=k("#"+Q.popupId);if(O.length===0){O=k("<div/>",{id:Q.popupId});if(w.length===0){w=k("body")}w.append(O)}if(Q.followMouse){if(!O.data(u)){A.on("mousemove",M);s.on("scroll",M);O.data(u,true)}}if(Q.mouseOnToPopup){O.on({mouseenter:function L(){if(O.data(f)){if(c.activeHover){c.activeHover.data(n).cancel()}}},mouseleave:function N(){if(c.activeHover){c.activeHover.data(n).hide()}}})}function I(S){S.data(e,true);O.queue(function R(T){H(S);T()})}function H(S){var U;if(!S.data(e)){return}if(c.isTipOpen){if(!c.isClosing){K(c.activeHover)}O.delay(100).queue(function R(V){H(S);V()});return}S.trigger("powerTipPreRender");U=B(S);if(U){O.empty().append(U)}else{return}S.trigger("powerTipRender");c.activeHover=S;c.isTipOpen=true;O.data(f,Q.mouseOnToPopup);if(!Q.followMouse){G(S);c.isFixedTipOpen=true}else{M()}O.fadeIn(Q.fadeInTime,function T(){if(!c.desyncTimeout){c.desyncTimeout=setInterval(J,500)}S.trigger("powerTipOpen")})}function K(R){c.isClosing=true;c.activeHover=null;c.isTipOpen=false;c.desyncTimeout=clearInterval(c.desyncTimeout);R.data(e,false);R.data(d,false);O.fadeOut(Q.fadeOutTime,function S(){var T=new b();c.isClosing=false;c.isFixedTipOpen=false;O.removeClass();T.set("top",c.currentY+Q.offset);T.set("left",c.currentX+Q.offset);O.css(T);R.trigger("powerTipClose")})}function M(){if(!c.isFixedTipOpen&&(c.isTipOpen||(c.tipOpenImminent&&O.data(u)))){var R=O.outerWidth(),V=O.outerHeight(),U=new b(),S,T;U.set("top",c.currentY+Q.offset);U.set("left",c.currentX+Q.offset);S=m(U,R,V);if(S!==p.none){T=a(S);if(T===1){if(S===p.right){U.set("left",c.windowWidth-R)}else{if(S===p.bottom){U.set("top",c.scrollTop+c.windowHeight-V)}}}else{U.set("left",c.currentX-R-Q.offset);U.set("top",c.currentY-V-Q.offset)}}O.css(U)}}function G(S){var R,T;if(Q.smartPlacement){R=k.fn.powerTip.smartPlacementLists[Q.placement];k.each(R,function(U,W){var V=m(F(S,W),O.outerWidth(),O.outerHeight());T=W;if(V===p.none){return false}})}else{F(S,Q.placement);T=Q.placement}O.addClass(T)}function F(U,T){var R=0,S,W,V=new b();V.set("top",0);V.set("left",0);O.css(V);do{S=O.outerWidth();W=O.outerHeight();V=P.compute(U,T,S,W,Q.offset);O.css(V)}while(++R<=5&&(S!==O.outerWidth()||W!==O.outerHeight()));return V}function J(){var R=false;if(c.isTipOpen&&!c.isClosing&&!c.delayInProgress){if(c.activeHover.data(e)===false||c.activeHover.is(":disabled")){R=true}else{if(!v(c.activeHover)&&!c.activeHover.is(":focus")&&!c.activeHover.data(d)){if(O.data(f)){if(!v(O)){R=true}}else{R=true}}}if(R){K(c.activeHover)}}}this.showTip=I;this.hideTip=K;this.resetPosition=G}function q(F){return window.SVGElement&&F[0] instanceof SVGElement}function h(){if(!c.mouseTrackingActive){c.mouseTrackingActive=true;k(function H(){c.scrollLeft=s.scrollLeft();c.scrollTop=s.scrollTop();c.windowWidth=s.width();c.windowHeight=s.height()});A.on("mousemove",i);s.on({resize:function G(){c.windowWidth=s.width();c.windowHeight=s.height()},scroll:function F(){var I=s.scrollLeft(),J=s.scrollTop();if(I!==c.scrollLeft){c.currentX+=I-c.scrollLeft;c.scrollLeft=I}if(J!==c.scrollTop){c.currentY+=J-c.scrollTop;c.scrollTop=J}}})}}function i(F){c.currentX=F.pageX;c.currentY=F.pageY}function v(F){var H=F.offset(),J=F[0].getBoundingClientRect(),I=J.right-J.left,G=J.bottom-J.top;return c.currentX>=H.left&&c.currentX<=H.left+I&&c.currentY>=H.top&&c.currentY<=H.top+G}function B(I){var G=I.data(y),F=I.data(o),K=I.data(l),H,J;if(G){if(k.isFunction(G)){G=G.call(I[0])}J=G}else{if(F){if(k.isFunction(F)){F=F.call(I[0])}if(F.length>0){J=F.clone(true,true)}}else{if(K){H=k("#"+K);if(H.length>0){J=H.html()}}}}return J}function m(M,L,K){var G=c.scrollTop,J=c.scrollLeft,I=G+c.windowHeight,F=J+c.windowWidth,H=p.none;if(M.top<G||Math.abs(M.bottom-c.windowHeight)-K<G){H|=p.top}if(M.top+K>I||Math.abs(M.bottom-c.windowHeight)>I){H|=p.bottom}if(M.left<J||M.right+L>F){H|=p.left}if(M.left+L>F||M.right<J){H|=p.right}return H}function a(G){var F=0;while(G){G&=G-1;F++}return F}}));
\ No newline at end of file
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.11"/>
+<title>libwebsockets: lib/libwebsockets.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="libwebsockets.org-logo.png"/></td>
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname">libwebsockets
+ </div>
+ <div id="projectbrief">Lightweight C library for HTML5 websockets</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.11 -->
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main Page</span></a></li>
+ <li><a href="pages.html"><span>Related Pages</span></a></li>
+ <li><a href="modules.html"><span>Modules</span></a></li>
+ <li><a href="annotated.html"><span>Data Structures</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File List</span></a></li>
+ <li><a href="globals.html"><span>Globals</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('libwebsockets_8h.html','');});
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#nested-classes">Data Structures</a> |
+<a href="#typedef-members">Typedefs</a> |
+<a href="#enum-members">Enumerations</a> |
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">libwebsockets.h File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p><a href="libwebsockets_8h_source.html">Go to the source code of this file.</a></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
+Data Structures</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="classlws__conn.html">lws_conn</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="classlws__conn__listener.html">lws_conn_listener</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__polarssl__context.html">lws_polarssl_context</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__pollfd.html">lws_pollfd</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="structpollfd.html">pollfd</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__pollargs.html">lws_pollargs</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__ext__options.html">lws_ext_options</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__ext__option__arg.html">lws_ext_option_arg</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__extension.html">lws_extension</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__protocols.html">lws_protocols</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__plugin__capability.html">lws_plugin_capability</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__plugin.html">lws_plugin</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="structlwsgw__hash__bin.html">lwsgw_hash_bin</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="structlwsgw__hash.html">lwsgw_hash</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__session__info.html">lws_session_info</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__gs__event__args.html">lws_gs_event_args</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__context__creation__info.html">lws_context_creation_info</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__protocol__vhost__options.html">lws_protocol_vhost_options</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__http__mount.html">lws_http_mount</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__client__connect__info.html">lws_client_connect_info</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__process__html__args.html">lws_process_html_args</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__process__html__state.html">lws_process_html_state</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__tokens.html">lws_tokens</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__token__limits.html">lws_token_limits</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__cgi__args.html">lws_cgi_args</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__plat__file__ops.html">lws_plat_file_ops</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__email.html">lws_email</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="typedef-members"></a>
+Typedefs</h2></td></tr>
+<tr class="memitem:abddb8d337fb2692586d892b494739003"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="abddb8d337fb2692586d892b494739003"></a>
+typedef struct <a class="el" href="structlws__polarssl__context.html">lws_polarssl_context</a> </td><td class="memItemRight" valign="bottom"><b>SSL_CTX</b></td></tr>
+<tr class="separator:abddb8d337fb2692586d892b494739003"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ac3abb8b7e6d29a0292797230e4031681"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ac3abb8b7e6d29a0292797230e4031681"></a>
+typedef ssl_context </td><td class="memItemRight" valign="bottom"><b>SSL</b></td></tr>
+<tr class="separator:ac3abb8b7e6d29a0292797230e4031681"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:adedbc79528b71a5c7f27cde87100c9aa"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="adedbc79528b71a5c7f27cde87100c9aa"></a>
+typedef SOCKET </td><td class="memItemRight" valign="bottom"><b>lws_sockfd_type</b></td></tr>
+<tr class="separator:adedbc79528b71a5c7f27cde87100c9aa"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:aff42d53861afdc1a6edfb999ba688ecb"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="aff42d53861afdc1a6edfb999ba688ecb"></a>
+typedef HANDLE </td><td class="memItemRight" valign="bottom"><b>lws_filefd_type</b></td></tr>
+<tr class="separator:aff42d53861afdc1a6edfb999ba688ecb"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:gad4fcb82e68d60ffacca61a3f783a0a2f"><td class="memItemLeft" align="right" valign="top">typedef int </td><td class="memItemRight" valign="bottom"><a class="el" href="group__usercb.html#gad4fcb82e68d60ffacca61a3f783a0a2f">lws_callback_function</a>(struct lws *wsi, enum <a class="el" href="group__usercb.html#gad62860e19975ba4c4af401c3cdb6abf7">lws_callback_reasons</a> reason, void *user, void *in, size_t len)</td></tr>
+<tr class="separator:gad4fcb82e68d60ffacca61a3f783a0a2f"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:gaae7169b2cd346b34fa33d0250db2afd0"><td class="memItemLeft" align="right" valign="top">typedef int </td><td class="memItemRight" valign="bottom"><a class="el" href="group__extensions.html#gaae7169b2cd346b34fa33d0250db2afd0">lws_extension_callback_function</a>(struct lws_context *context, const struct <a class="el" href="structlws__extension.html">lws_extension</a> *ext, struct lws *wsi, enum lws_extension_callback_reasons reason, void *user, void *in, size_t len)</td></tr>
+<tr class="separator:gaae7169b2cd346b34fa33d0250db2afd0"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga40994491e1567f91f579d2b444775266"><td class="memItemLeft" align="right" valign="top">
+typedef int(* </td><td class="memItemRight" valign="bottom"><b>lws_plugin_init_func</b>) (struct lws_context *, struct <a class="el" href="structlws__plugin__capability.html">lws_plugin_capability</a> *)</td></tr>
+<tr class="separator:ga40994491e1567f91f579d2b444775266"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga83f7a924ba790fa273476075a59f08b0"><td class="memItemLeft" align="right" valign="top">
+typedef int(* </td><td class="memItemRight" valign="bottom"><b>lws_plugin_destroy_func</b>) (struct lws_context *)</td></tr>
+<tr class="separator:ga83f7a924ba790fa273476075a59f08b0"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga669d3d7ce2d5f193473f649a89b3e7ac"><td class="memItemLeft" align="right" valign="top">
+typedef const char *(* </td><td class="memItemRight" valign="bottom"><b>lws_process_html_state_cb</b>) (void *data, int index)</td></tr>
+<tr class="separator:ga669d3d7ce2d5f193473f649a89b3e7ac"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga5a70527c0861c2ffa3d29333a6aa7f8e"><td class="memItemLeft" align="right" valign="top">typedef int(* </td><td class="memItemRight" valign="bottom"><a class="el" href="group__form-parsing.html#ga5a70527c0861c2ffa3d29333a6aa7f8e">lws_spa_fileupload_cb</a>) (void *data, const char *name, const char *filename, char *buf, int len, enum <a class="el" href="group__form-parsing.html#ga41a74a822771d3dce89751aa3bce28ae">lws_spa_fileupload_states</a> state)</td></tr>
+<tr class="separator:ga5a70527c0861c2ffa3d29333a6aa7f8e"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga3b0ffd4d2b4fa791c0fd75353a330208"><td class="memItemLeft" align="right" valign="top">
+typedef void( </td><td class="memItemRight" valign="bottom"><b>lws_ev_signal_cb_t</b>) (EV_P_ struct ev_signal *w, int revents)</td></tr>
+<tr class="separator:ga3b0ffd4d2b4fa791c0fd75353a330208"><td class="memSeparator" colspan="2"> </td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="enum-members"></a>
+Enumerations</h2></td></tr>
+<tr class="memitem:ga14542b84d2c76efa7814124bb10f9c5f"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ga14542b84d2c76efa7814124bb10f9c5f"></a>enum  </td><td class="memItemRight" valign="bottom"><b>lws_log_levels</b> { <br />
+  <b>LLL_ERR</b> = 1 << 0,
+<b>LLL_WARN</b> = 1 << 1,
+<b>LLL_NOTICE</b> = 1 << 2,
+<b>LLL_INFO</b> = 1 << 3,
+<br />
+  <b>LLL_DEBUG</b> = 1 << 4,
+<b>LLL_PARSER</b> = 1 << 5,
+<b>LLL_HEADER</b> = 1 << 6,
+<b>LLL_EXT</b> = 1 << 7,
+<br />
+  <b>LLL_CLIENT</b> = 1 << 8,
+<b>LLL_LATENCY</b> = 1 << 9,
+<b>LLL_COUNT</b> = 10
+<br />
+ }</td></tr>
+<tr class="separator:ga14542b84d2c76efa7814124bb10f9c5f"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:gae399c571df32ba532c0ca67da9284985"><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="group__wsclose.html#gae399c571df32ba532c0ca67da9284985">lws_close_status</a> { <br />
+  <b>LWS_CLOSE_STATUS_NOSTATUS</b> = 0,
+<a class="el" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a3ffa38d5081b85fb739e02a747ccf2c4">LWS_CLOSE_STATUS_NORMAL</a> = 1000,
+<a class="el" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a9737a68759e739856b150ff9dfa30218">LWS_CLOSE_STATUS_GOINGAWAY</a> = 1001,
+<a class="el" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a1bb501d212fa4d57053db681b1dfab98">LWS_CLOSE_STATUS_PROTOCOL_ERR</a> = 1002,
+<br />
+  <a class="el" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a462c99b05459df700919cfd3f53c8276">LWS_CLOSE_STATUS_UNACCEPTABLE_OPCODE</a> = 1003,
+<a class="el" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985af90cb98d983ad3d4c79df9b6f3d4a4d2">LWS_CLOSE_STATUS_RESERVED</a> = 1004,
+<a class="el" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a4b8a3b7ce6f731e5248e4b0fb64a5044">LWS_CLOSE_STATUS_NO_STATUS</a> = 1005,
+<a class="el" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a68b3d34bebd88547dcfa5cadba0acd6c">LWS_CLOSE_STATUS_ABNORMAL_CLOSE</a> = 1006,
+<br />
+  <a class="el" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a7aef2da0062da606eeb35aaca5cf9050">LWS_CLOSE_STATUS_INVALID_PAYLOAD</a> = 1007,
+<a class="el" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985ad09e68295eabdddcba4e332fbea70ae5">LWS_CLOSE_STATUS_POLICY_VIOLATION</a> = 1008,
+<a class="el" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a2e1f0113494a58e762eed3d22e7080d8">LWS_CLOSE_STATUS_MESSAGE_TOO_LARGE</a> = 1009,
+<a class="el" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985ac6a161822783ee873be1c66f48d14e0e">LWS_CLOSE_STATUS_EXTENSION_REQUIRED</a> = 1010,
+<br />
+  <a class="el" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985ad0869604d79e13700ae5d196a431b350">LWS_CLOSE_STATUS_UNEXPECTED_CONDITION</a> = 1011,
+<a class="el" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985ad2b477a91c8445bf34ecd43977f9b390">LWS_CLOSE_STATUS_TLS_FAILURE</a> = 1015,
+<b>LWS_CLOSE_STATUS_NOSTATUS_CONTEXT_DESTROY</b> = 9999
+<br />
+ }</td></tr>
+<tr class="separator:gae399c571df32ba532c0ca67da9284985"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:gad62860e19975ba4c4af401c3cdb6abf7"><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="group__usercb.html#gad62860e19975ba4c4af401c3cdb6abf7">lws_callback_reasons</a> { <br />
+  <a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a24d39bf1cfc0bad9d92da9ac1717e439">LWS_CALLBACK_ESTABLISHED</a> = 0,
+<a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ad8c6207b0c4e732f3d507f0fb79370e8">LWS_CALLBACK_CLIENT_CONNECTION_ERROR</a> = 1,
+<a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aa536e574a642ff3ab9e12bff7ba2c6a2">LWS_CALLBACK_CLIENT_FILTER_PRE_ESTABLISH</a> = 2,
+<a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a7e12418eec9bce85735e6460176ab604">LWS_CALLBACK_CLIENT_ESTABLISHED</a> = 3,
+<br />
+  <a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a48a9590e5e18c7920282e094a0bfd9d8">LWS_CALLBACK_CLOSED</a> = 4,
+<a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a838b18d255c1b94a533287ba302a2eba">LWS_CALLBACK_CLOSED_HTTP</a> = 5,
+<a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a492c1b1c0ac0ed980042ee732fe2990c">LWS_CALLBACK_RECEIVE</a> = 6,
+<a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a2db02fc6e1c17ab62b52109d1aa9d738">LWS_CALLBACK_RECEIVE_PONG</a> = 7,
+<br />
+  <a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7abbbe7a0a67c5866ca9109d46823fc5b1">LWS_CALLBACK_CLIENT_RECEIVE</a> = 8,
+<a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a136a7cec11c3afd13245623bd84e76c9">LWS_CALLBACK_CLIENT_RECEIVE_PONG</a> = 9,
+<a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a8e8b2e6dbeac76d8d126947d2166a514">LWS_CALLBACK_CLIENT_WRITEABLE</a> = 10,
+<a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a7ec8e2e9557ee02a4fc9f7dec7e2babc">LWS_CALLBACK_SERVER_WRITEABLE</a> = 11,
+<br />
+  <a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ae8d1de0bb56e03aa58cb4d44b18edd2e">LWS_CALLBACK_HTTP</a> = 12,
+<a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ac4c68e00efcf1ff7bda7ada462aff8ae">LWS_CALLBACK_HTTP_BODY</a> = 13,
+<a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a2fce9a8608220f32abbf1422a5498804">LWS_CALLBACK_HTTP_BODY_COMPLETION</a> = 14,
+<a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aa627548e1296e654fcfab463ec3c9587">LWS_CALLBACK_HTTP_FILE_COMPLETION</a> = 15,
+<br />
+  <a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7afedadfb3cde37a8ea4c84ed535f26d09">LWS_CALLBACK_HTTP_WRITEABLE</a> = 16,
+<a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a026502768778b8d79d62dd0fe4375fc6">LWS_CALLBACK_FILTER_NETWORK_CONNECTION</a> = 17,
+<a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a75199176c82c1a56e4a6bbf1cc30c12c">LWS_CALLBACK_FILTER_HTTP_CONNECTION</a> = 18,
+<a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ae9734e1d7af2abf291665ce9e4a728d3">LWS_CALLBACK_SERVER_NEW_CLIENT_INSTANTIATED</a> = 19,
+<br />
+  <a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7accd8753672d319a30b4b4c2fb775e84d">LWS_CALLBACK_FILTER_PROTOCOL_CONNECTION</a> = 20,
+<a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ae4986291b7a810fe290851d73bebeb1c">LWS_CALLBACK_OPENSSL_LOAD_EXTRA_CLIENT_VERIFY_CERTS</a> = 21,
+<a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a06006e98d27e1e884364d88317f83493">LWS_CALLBACK_OPENSSL_LOAD_EXTRA_SERVER_VERIFY_CERTS</a> = 22,
+<a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ae5ad65d779b7eab32ab67ceff91a3bac">LWS_CALLBACK_OPENSSL_PERFORM_CLIENT_CERT_VERIFICATION</a> = 23,
+<br />
+  <a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a909cc2a7018864b0b71abacc4058fd8f">LWS_CALLBACK_CLIENT_APPEND_HANDSHAKE_HEADER</a> = 24,
+<a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a390da3639296660a78cc1a5dcb19037e">LWS_CALLBACK_CONFIRM_EXTENSION_OKAY</a> = 25,
+<a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a1ce5b22039ca37ee224d00047596ea46">LWS_CALLBACK_CLIENT_CONFIRM_EXTENSION_SUPPORTED</a> = 26,
+<a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ad5d34583e3556e153eda91620b48cc49">LWS_CALLBACK_PROTOCOL_INIT</a> = 27,
+<br />
+  <a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a54269ca88508e6efd3afdb9d360a9caa">LWS_CALLBACK_PROTOCOL_DESTROY</a> = 28,
+<a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7afd8fd77a1cc9405fcb4f26915d7f2d01">LWS_CALLBACK_WSI_CREATE</a> = 29,
+<a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aca834dc035b7f7486f9ce40fde54fe9e">LWS_CALLBACK_WSI_DESTROY</a> = 30,
+<a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7adfb41c92e2522712207ef7f2462b5e34">LWS_CALLBACK_GET_THREAD_ID</a> = 31,
+<br />
+  <a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ab69783a9fbf2ca71ad70706bda77b412">LWS_CALLBACK_ADD_POLL_FD</a> = 32,
+<a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a1df60f314710236f9b53efbf468da768">LWS_CALLBACK_DEL_POLL_FD</a> = 33,
+<a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aa87d2e82fffa42c3680c7403ef94216e">LWS_CALLBACK_CHANGE_MODE_POLL_FD</a> = 34,
+<a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a8909732521d379179003d97ab7a05428">LWS_CALLBACK_LOCK_POLL</a> = 35,
+<br />
+  <a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a0e9e3dd667c0c42cdbe1a3d921f4fd79">LWS_CALLBACK_UNLOCK_POLL</a> = 36,
+<a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aa46f705dcf97502e95627ffde614f98b">LWS_CALLBACK_OPENSSL_CONTEXT_REQUIRES_PRIVATE_KEY</a> = 37,
+<a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ac3fc5bbb55e69f90396526287ee84a51">LWS_CALLBACK_WS_PEER_INITIATED_CLOSE</a> = 38,
+<b>LWS_CALLBACK_WS_EXT_DEFAULTS</b> = 39,
+<br />
+  <b>LWS_CALLBACK_CGI</b> = 40,
+<b>LWS_CALLBACK_CGI_TERMINATED</b> = 41,
+<b>LWS_CALLBACK_CGI_STDIN_DATA</b> = 42,
+<b>LWS_CALLBACK_CGI_STDIN_COMPLETED</b> = 43,
+<br />
+  <b>LWS_CALLBACK_ESTABLISHED_CLIENT_HTTP</b> = 44,
+<b>LWS_CALLBACK_CLOSED_CLIENT_HTTP</b> = 45,
+<b>LWS_CALLBACK_RECEIVE_CLIENT_HTTP</b> = 46,
+<b>LWS_CALLBACK_COMPLETED_CLIENT_HTTP</b> = 47,
+<br />
+  <b>LWS_CALLBACK_RECEIVE_CLIENT_HTTP_READ</b> = 48,
+<b>LWS_CALLBACK_HTTP_BIND_PROTOCOL</b> = 49,
+<b>LWS_CALLBACK_HTTP_DROP_PROTOCOL</b> = 50,
+<b>LWS_CALLBACK_CHECK_ACCESS_RIGHTS</b> = 51,
+<br />
+  <b>LWS_CALLBACK_PROCESS_HTML</b> = 52,
+<b>LWS_CALLBACK_ADD_HEADERS</b> = 53,
+<b>LWS_CALLBACK_SESSION_INFO</b> = 54,
+<b>LWS_CALLBACK_GS_EVENT</b> = 55,
+<br />
+  <a class="el" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a982579753e70e59a9ea13ce628ac891a">LWS_CALLBACK_USER</a> = 1000
+<br />
+ }</td></tr>
+<tr class="separator:gad62860e19975ba4c4af401c3cdb6abf7"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:gae9993815eee72c6070300a0ae2f022d7"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="gae9993815eee72c6070300a0ae2f022d7"></a>enum  </td><td class="memItemRight" valign="bottom"><b>lws_extension_callback_reasons</b> { <br />
+  <b>LWS_EXT_CB_SERVER_CONTEXT_CONSTRUCT</b> = 0,
+<b>LWS_EXT_CB_CLIENT_CONTEXT_CONSTRUCT</b> = 1,
+<b>LWS_EXT_CB_SERVER_CONTEXT_DESTRUCT</b> = 2,
+<b>LWS_EXT_CB_CLIENT_CONTEXT_DESTRUCT</b> = 3,
+<br />
+  <b>LWS_EXT_CB_CONSTRUCT</b> = 4,
+<b>LWS_EXT_CB_CLIENT_CONSTRUCT</b> = 5,
+<b>LWS_EXT_CB_CHECK_OK_TO_REALLY_CLOSE</b> = 6,
+<b>LWS_EXT_CB_CHECK_OK_TO_PROPOSE_EXTENSION</b> = 7,
+<br />
+  <b>LWS_EXT_CB_DESTROY</b> = 8,
+<b>LWS_EXT_CB_DESTROY_ANY_WSI_CLOSING</b> = 9,
+<b>LWS_EXT_CB_ANY_WSI_ESTABLISHED</b> = 10,
+<b>LWS_EXT_CB_PACKET_RX_PREPARSE</b> = 11,
+<br />
+  <b>LWS_EXT_CB_PACKET_TX_PRESEND</b> = 12,
+<b>LWS_EXT_CB_PACKET_TX_DO_SEND</b> = 13,
+<b>LWS_EXT_CB_HANDSHAKE_REPLY_TX</b> = 14,
+<b>LWS_EXT_CB_FLUSH_PENDING_TX</b> = 15,
+<br />
+  <b>LWS_EXT_CB_EXTENDED_PAYLOAD_RX</b> = 16,
+<b>LWS_EXT_CB_CAN_PROXY_CLIENT_CONNECTION</b> = 17,
+<b>LWS_EXT_CB_1HZ</b> = 18,
+<b>LWS_EXT_CB_REQUEST_ON_WRITEABLE</b> = 19,
+<br />
+  <b>LWS_EXT_CB_IS_WRITEABLE</b> = 20,
+<b>LWS_EXT_CB_PAYLOAD_TX</b> = 21,
+<b>LWS_EXT_CB_PAYLOAD_RX</b> = 22,
+<b>LWS_EXT_CB_OPTION_DEFAULT</b> = 23,
+<br />
+  <b>LWS_EXT_CB_OPTION_SET</b> = 24,
+<b>LWS_EXT_CB_OPTION_CONFIRM</b> = 25,
+<b>LWS_EXT_CB_NAMED_OPTION_SET</b> = 26
+<br />
+ }</td></tr>
+<tr class="separator:gae9993815eee72c6070300a0ae2f022d7"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:gacc9f55936dc165257a2e1f7d47bce89e"><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="group__extensions.html#gacc9f55936dc165257a2e1f7d47bce89e">lws_ext_options_types</a> { <a class="el" href="group__extensions.html#ggacc9f55936dc165257a2e1f7d47bce89eaabcf56c456c1ff6e81dc82586a16f14c">EXTARG_NONE</a>,
+<a class="el" href="group__extensions.html#ggacc9f55936dc165257a2e1f7d47bce89ea1c86adf924c8786a12bee9687094673e">EXTARG_DEC</a>,
+<a class="el" href="group__extensions.html#ggacc9f55936dc165257a2e1f7d47bce89ea5265abe3e1c3f64412f2affe7bffd880">EXTARG_OPT_DEC</a>
+ }</td></tr>
+<tr class="separator:gacc9f55936dc165257a2e1f7d47bce89e"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga7c2dc7bfb4ccb91c5d771f9e9ea237e1"><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="group__generic-sessions.html#ga7c2dc7bfb4ccb91c5d771f9e9ea237e1">lwsgs_auth_bits</a> { <a class="el" href="group__generic-sessions.html#gga7c2dc7bfb4ccb91c5d771f9e9ea237e1a81e63075115dedd150265d81b8f7fa57">LWSGS_AUTH_LOGGED_IN</a> = 1,
+<a class="el" href="group__generic-sessions.html#gga7c2dc7bfb4ccb91c5d771f9e9ea237e1a0657a9e846814781b128c397fe4b10bf">LWSGS_AUTH_ADMIN</a> = 2,
+<a class="el" href="group__generic-sessions.html#gga7c2dc7bfb4ccb91c5d771f9e9ea237e1a5a607e4668d20cadada62c4b8007f887">LWSGS_AUTH_VERIFIED</a> = 4,
+<a class="el" href="group__generic-sessions.html#gga7c2dc7bfb4ccb91c5d771f9e9ea237e1a2cd8fb86e3b85c106e7711c03f0ddd0a">LWSGS_AUTH_FORGOT_FLOW</a> = 8
+ }</td></tr>
+<tr class="separator:ga7c2dc7bfb4ccb91c5d771f9e9ea237e1"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:gaa93946b3d921072209d5cd8cdfa5332e"><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="group__generic-sessions.html#gaa93946b3d921072209d5cd8cdfa5332e">lws_gs_event</a> { <a class="el" href="group__generic-sessions.html#ggaa93946b3d921072209d5cd8cdfa5332ea596010a165bf13473c5eea3a34cd4308">LWSGSE_CREATED</a>,
+<a class="el" href="group__generic-sessions.html#ggaa93946b3d921072209d5cd8cdfa5332ead908cdc5689c5d22c9d3c8934e94dcde">LWSGSE_DELETED</a>
+ }</td></tr>
+<tr class="separator:gaa93946b3d921072209d5cd8cdfa5332e"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga41c2d763f78cc248df3b9f8645dbd2a5"><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="group__context-and-vhost.html#ga41c2d763f78cc248df3b9f8645dbd2a5">lws_context_options</a> { <br />
+  <a class="el" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a274ed462a1a9239eb6ddf9007f5b7092">LWS_SERVER_OPTION_REQUIRE_VALID_OPENSSL_CLIENT_CERT</a>,
+<a class="el" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a6582c985ee0ceaadc1d277030eae2d7c">LWS_SERVER_OPTION_SKIP_SERVER_CANONICAL_NAME</a> = (1 << 2),
+<a class="el" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a1cc4562d05cba52a6dfa0697a65ade0d">LWS_SERVER_OPTION_ALLOW_NON_SSL_ON_SSL_PORT</a>,
+<a class="el" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a273d9975675130de0c6dc937dde7c8a6">LWS_SERVER_OPTION_LIBEV</a> = (1 << 4),
+<br />
+  <a class="el" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a34ab36e68c0d593b6f19b8d5ef1240a9">LWS_SERVER_OPTION_DISABLE_IPV6</a> = (1 << 5),
+<a class="el" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a4933347a821e73c3f1e13fb6bfc7ad93">LWS_SERVER_OPTION_DISABLE_OS_CA_CERTS</a> = (1 << 6),
+<a class="el" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5ac56a8a6590e74a8016d0fae09fb404fc">LWS_SERVER_OPTION_PEER_CERT_NOT_REQUIRED</a> = (1 << 7),
+<a class="el" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5aa0158b4e85420811e6b0f1378c6ded0f">LWS_SERVER_OPTION_VALIDATE_UTF8</a> = (1 << 8),
+<br />
+  <a class="el" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a1b2f8bde0f62adc7ebe81b2043f34c0c">LWS_SERVER_OPTION_SSL_ECDH</a>,
+<a class="el" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5aff121db04a10cf8b2c5df9d4f2b89f1e">LWS_SERVER_OPTION_LIBUV</a> = (1 << 10),
+<a class="el" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a4832187186c4d130c68051214cd42ada">LWS_SERVER_OPTION_REDIRECT_HTTP_TO_HTTPS</a>,
+<a class="el" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a7fed6a527c8d5e0acac1b4179644583a">LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT</a> = (1 << 12),
+<br />
+  <a class="el" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5accc9d0d11d1124a21659586164b0962e">LWS_SERVER_OPTION_EXPLICIT_VHOSTS</a> = (1 << 13),
+<a class="el" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a9637e9001d8c8b2521086bcafbd8a941">LWS_SERVER_OPTION_UNIX_SOCK</a> = (1 << 14),
+<a class="el" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5ac962efd35abf6c402f9fb14aa14f5016">LWS_SERVER_OPTION_STS</a> = (1 << 15),
+<a class="el" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5af62887536e25e053e68741006dba46d8">LWS_SERVER_OPTION_IPV6_V6ONLY_MODIFY</a> = (1 << 16),
+<br />
+  <a class="el" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5aca5d42820b65eac5618ec3f0bd8a1160">LWS_SERVER_OPTION_IPV6_V6ONLY_VALUE</a> = (1 << 17)
+<br />
+ }</td></tr>
+<tr class="separator:ga41c2d763f78cc248df3b9f8645dbd2a5"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga31eca18e50cb4357480f2fcad36ff437"><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="group__vhost-mounts.html#ga31eca18e50cb4357480f2fcad36ff437">lws_mount_protocols</a> { <br />
+  <a class="el" href="group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437a1e9f0842b0e85db50fe648ed4ba9a4b0">LWSMPRO_HTTP</a> = 0,
+<a class="el" href="group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437afbd10eb4777517ed1f6bfdcf3b9ea1d1">LWSMPRO_HTTPS</a> = 1,
+<a class="el" href="group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437a42f2361cfe76cd287fa8fcfc502357e2">LWSMPRO_FILE</a> = 2,
+<a class="el" href="group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437a13ab58b01ac6e05f595977f1e0f0db69">LWSMPRO_CGI</a> = 3,
+<br />
+  <a class="el" href="group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437aec137a2434851bd856ceebfb697b9970">LWSMPRO_REDIR_HTTP</a> = 4,
+<a class="el" href="group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437a8894d16316863077dfe530963ca59f67">LWSMPRO_REDIR_HTTPS</a> = 5,
+<a class="el" href="group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437a946a88cf9c852eed2c0317f4115d19da">LWSMPRO_CALLBACK</a> = 6
+<br />
+ }</td></tr>
+<tr class="separator:ga31eca18e50cb4357480f2fcad36ff437"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:gabc3b93f68c8bdd857ad32913628dfa8d"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="gabc3b93f68c8bdd857ad32913628dfa8d"></a>enum  </td><td class="memItemRight" valign="bottom"><b>http_status</b> { <br />
+  <b>HTTP_STATUS_OK</b> = 200,
+<b>HTTP_STATUS_NO_CONTENT</b> = 204,
+<b>HTTP_STATUS_MOVED_PERMANENTLY</b> = 301,
+<b>HTTP_STATUS_FOUND</b> = 302,
+<br />
+  <b>HTTP_STATUS_SEE_OTHER</b> = 303,
+<b>HTTP_STATUS_BAD_REQUEST</b> = 400,
+<b>HTTP_STATUS_UNAUTHORIZED</b>,
+<b>HTTP_STATUS_PAYMENT_REQUIRED</b>,
+<br />
+  <b>HTTP_STATUS_FORBIDDEN</b>,
+<b>HTTP_STATUS_NOT_FOUND</b>,
+<b>HTTP_STATUS_METHOD_NOT_ALLOWED</b>,
+<b>HTTP_STATUS_NOT_ACCEPTABLE</b>,
+<br />
+  <b>HTTP_STATUS_PROXY_AUTH_REQUIRED</b>,
+<b>HTTP_STATUS_REQUEST_TIMEOUT</b>,
+<b>HTTP_STATUS_CONFLICT</b>,
+<b>HTTP_STATUS_GONE</b>,
+<br />
+  <b>HTTP_STATUS_LENGTH_REQUIRED</b>,
+<b>HTTP_STATUS_PRECONDITION_FAILED</b>,
+<b>HTTP_STATUS_REQ_ENTITY_TOO_LARGE</b>,
+<b>HTTP_STATUS_REQ_URI_TOO_LONG</b>,
+<br />
+  <b>HTTP_STATUS_UNSUPPORTED_MEDIA_TYPE</b>,
+<b>HTTP_STATUS_REQ_RANGE_NOT_SATISFIABLE</b>,
+<b>HTTP_STATUS_EXPECTATION_FAILED</b>,
+<b>HTTP_STATUS_INTERNAL_SERVER_ERROR</b> = 500,
+<br />
+  <b>HTTP_STATUS_NOT_IMPLEMENTED</b>,
+<b>HTTP_STATUS_BAD_GATEWAY</b>,
+<b>HTTP_STATUS_SERVICE_UNAVAILABLE</b>,
+<b>HTTP_STATUS_GATEWAY_TIMEOUT</b>,
+<br />
+  <b>HTTP_STATUS_HTTP_VERSION_NOT_SUPPORTED</b>
+<br />
+ }</td></tr>
+<tr class="separator:gabc3b93f68c8bdd857ad32913628dfa8d"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga6e747906f9d76532ec118d6ef418b82e"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ga6e747906f9d76532ec118d6ef418b82e"></a>enum  </td><td class="memItemRight" valign="bottom"><b>lws_token_indexes</b> { <br />
+  <b>WSI_TOKEN_GET_URI</b> = 0,
+<b>WSI_TOKEN_POST_URI</b> = 1,
+<b>WSI_TOKEN_OPTIONS_URI</b> = 2,
+<b>WSI_TOKEN_HOST</b> = 3,
+<br />
+  <b>WSI_TOKEN_CONNECTION</b> = 4,
+<b>WSI_TOKEN_UPGRADE</b> = 5,
+<b>WSI_TOKEN_ORIGIN</b> = 6,
+<b>WSI_TOKEN_DRAFT</b> = 7,
+<br />
+  <b>WSI_TOKEN_CHALLENGE</b> = 8,
+<b>WSI_TOKEN_EXTENSIONS</b> = 9,
+<b>WSI_TOKEN_KEY1</b> = 10,
+<b>WSI_TOKEN_KEY2</b> = 11,
+<br />
+  <b>WSI_TOKEN_PROTOCOL</b> = 12,
+<b>WSI_TOKEN_ACCEPT</b> = 13,
+<b>WSI_TOKEN_NONCE</b> = 14,
+<b>WSI_TOKEN_HTTP</b> = 15,
+<br />
+  <b>WSI_TOKEN_HTTP2_SETTINGS</b> = 16,
+<b>WSI_TOKEN_HTTP_ACCEPT</b> = 17,
+<b>WSI_TOKEN_HTTP_AC_REQUEST_HEADERS</b> = 18,
+<b>WSI_TOKEN_HTTP_IF_MODIFIED_SINCE</b> = 19,
+<br />
+  <b>WSI_TOKEN_HTTP_IF_NONE_MATCH</b> = 20,
+<b>WSI_TOKEN_HTTP_ACCEPT_ENCODING</b> = 21,
+<b>WSI_TOKEN_HTTP_ACCEPT_LANGUAGE</b> = 22,
+<b>WSI_TOKEN_HTTP_PRAGMA</b> = 23,
+<br />
+  <b>WSI_TOKEN_HTTP_CACHE_CONTROL</b> = 24,
+<b>WSI_TOKEN_HTTP_AUTHORIZATION</b> = 25,
+<b>WSI_TOKEN_HTTP_COOKIE</b> = 26,
+<b>WSI_TOKEN_HTTP_CONTENT_LENGTH</b> = 27,
+<br />
+  <b>WSI_TOKEN_HTTP_CONTENT_TYPE</b> = 28,
+<b>WSI_TOKEN_HTTP_DATE</b> = 29,
+<b>WSI_TOKEN_HTTP_RANGE</b> = 30,
+<b>WSI_TOKEN_HTTP_REFERER</b> = 31,
+<br />
+  <b>WSI_TOKEN_KEY</b> = 32,
+<b>WSI_TOKEN_VERSION</b> = 33,
+<b>WSI_TOKEN_SWORIGIN</b> = 34,
+<b>WSI_TOKEN_HTTP_COLON_AUTHORITY</b> = 35,
+<br />
+  <b>WSI_TOKEN_HTTP_COLON_METHOD</b> = 36,
+<b>WSI_TOKEN_HTTP_COLON_PATH</b> = 37,
+<b>WSI_TOKEN_HTTP_COLON_SCHEME</b> = 38,
+<b>WSI_TOKEN_HTTP_COLON_STATUS</b> = 39,
+<br />
+  <b>WSI_TOKEN_HTTP_ACCEPT_CHARSET</b> = 40,
+<b>WSI_TOKEN_HTTP_ACCEPT_RANGES</b> = 41,
+<b>WSI_TOKEN_HTTP_ACCESS_CONTROL_ALLOW_ORIGIN</b> = 42,
+<b>WSI_TOKEN_HTTP_AGE</b> = 43,
+<br />
+  <b>WSI_TOKEN_HTTP_ALLOW</b> = 44,
+<b>WSI_TOKEN_HTTP_CONTENT_DISPOSITION</b> = 45,
+<b>WSI_TOKEN_HTTP_CONTENT_ENCODING</b> = 46,
+<b>WSI_TOKEN_HTTP_CONTENT_LANGUAGE</b> = 47,
+<br />
+  <b>WSI_TOKEN_HTTP_CONTENT_LOCATION</b> = 48,
+<b>WSI_TOKEN_HTTP_CONTENT_RANGE</b> = 49,
+<b>WSI_TOKEN_HTTP_ETAG</b> = 50,
+<b>WSI_TOKEN_HTTP_EXPECT</b> = 51,
+<br />
+  <b>WSI_TOKEN_HTTP_EXPIRES</b> = 52,
+<b>WSI_TOKEN_HTTP_FROM</b> = 53,
+<b>WSI_TOKEN_HTTP_IF_MATCH</b> = 54,
+<b>WSI_TOKEN_HTTP_IF_RANGE</b> = 55,
+<br />
+  <b>WSI_TOKEN_HTTP_IF_UNMODIFIED_SINCE</b> = 56,
+<b>WSI_TOKEN_HTTP_LAST_MODIFIED</b> = 57,
+<b>WSI_TOKEN_HTTP_LINK</b> = 58,
+<b>WSI_TOKEN_HTTP_LOCATION</b> = 59,
+<br />
+  <b>WSI_TOKEN_HTTP_MAX_FORWARDS</b> = 60,
+<b>WSI_TOKEN_HTTP_PROXY_AUTHENTICATE</b> = 61,
+<b>WSI_TOKEN_HTTP_PROXY_AUTHORIZATION</b> = 62,
+<b>WSI_TOKEN_HTTP_REFRESH</b> = 63,
+<br />
+  <b>WSI_TOKEN_HTTP_RETRY_AFTER</b> = 64,
+<b>WSI_TOKEN_HTTP_SERVER</b> = 65,
+<b>WSI_TOKEN_HTTP_SET_COOKIE</b> = 66,
+<b>WSI_TOKEN_HTTP_STRICT_TRANSPORT_SECURITY</b> = 67,
+<br />
+  <b>WSI_TOKEN_HTTP_TRANSFER_ENCODING</b> = 68,
+<b>WSI_TOKEN_HTTP_USER_AGENT</b> = 69,
+<b>WSI_TOKEN_HTTP_VARY</b> = 70,
+<b>WSI_TOKEN_HTTP_VIA</b> = 71,
+<br />
+  <b>WSI_TOKEN_HTTP_WWW_AUTHENTICATE</b> = 72,
+<b>WSI_TOKEN_PATCH_URI</b> = 73,
+<b>WSI_TOKEN_PUT_URI</b> = 74,
+<b>WSI_TOKEN_DELETE_URI</b> = 75,
+<br />
+  <b>WSI_TOKEN_HTTP_URI_ARGS</b> = 76,
+<b>WSI_TOKEN_PROXY</b> = 77,
+<b>WSI_TOKEN_HTTP_X_REAL_IP</b> = 78,
+<b>WSI_TOKEN_HTTP1_0</b> = 79,
+<br />
+  <b>_WSI_TOKEN_CLIENT_SENT_PROTOCOLS</b>,
+<b>_WSI_TOKEN_CLIENT_PEER_ADDRESS</b>,
+<b>_WSI_TOKEN_CLIENT_URI</b>,
+<b>_WSI_TOKEN_CLIENT_HOST</b>,
+<br />
+  <b>_WSI_TOKEN_CLIENT_ORIGIN</b>,
+<b>_WSI_TOKEN_CLIENT_METHOD</b>,
+<b>WSI_TOKEN_COUNT</b>,
+<b>WSI_TOKEN_NAME_PART</b>,
+<br />
+  <b>WSI_TOKEN_SKIPPING</b>,
+<b>WSI_TOKEN_SKIPPING_SAW_CR</b>,
+<b>WSI_PARSING_COMPLETE</b>,
+<b>WSI_INIT_TOKEN_MUXURL</b>
+<br />
+ }</td></tr>
+<tr class="separator:ga6e747906f9d76532ec118d6ef418b82e"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga41a74a822771d3dce89751aa3bce28ae"><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="group__form-parsing.html#ga41a74a822771d3dce89751aa3bce28ae">lws_spa_fileupload_states</a> { <a class="el" href="group__form-parsing.html#gga41a74a822771d3dce89751aa3bce28aead3a958e7719ac273c3ba4f684f00c87f">LWS_UFS_CONTENT</a>,
+<a class="el" href="group__form-parsing.html#gga41a74a822771d3dce89751aa3bce28aea6ce2a55a4c3695cdb640c893d95bd3a7">LWS_UFS_FINAL_CONTENT</a>,
+<a class="el" href="group__form-parsing.html#gga41a74a822771d3dce89751aa3bce28aea2d25de44865bd44e5a3903a2bab9ca83">LWS_UFS_OPEN</a>
+ }</td></tr>
+<tr class="separator:ga41a74a822771d3dce89751aa3bce28ae"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga2c0aa4b9c3c55bae7b35cbfac3246c87"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ga2c0aa4b9c3c55bae7b35cbfac3246c87"></a>enum  </td><td class="memItemRight" valign="bottom"><b>pending_timeout</b> { <br />
+  <b>NO_PENDING_TIMEOUT</b> = 0,
+<b>PENDING_TIMEOUT_AWAITING_PROXY_RESPONSE</b> = 1,
+<b>PENDING_TIMEOUT_AWAITING_CONNECT_RESPONSE</b> = 2,
+<b>PENDING_TIMEOUT_ESTABLISH_WITH_SERVER</b> = 3,
+<br />
+  <b>PENDING_TIMEOUT_AWAITING_SERVER_RESPONSE</b> = 4,
+<b>PENDING_TIMEOUT_AWAITING_PING</b> = 5,
+<b>PENDING_TIMEOUT_CLOSE_ACK</b> = 6,
+<b>PENDING_TIMEOUT_AWAITING_EXTENSION_CONNECT_RESPONSE</b> = 7,
+<br />
+  <b>PENDING_TIMEOUT_SENT_CLIENT_HANDSHAKE</b> = 8,
+<b>PENDING_TIMEOUT_SSL_ACCEPT</b> = 9,
+<b>PENDING_TIMEOUT_HTTP_CONTENT</b> = 10,
+<b>PENDING_TIMEOUT_AWAITING_CLIENT_HS_SEND</b> = 11,
+<br />
+  <b>PENDING_FLUSH_STORED_SEND_BEFORE_CLOSE</b> = 12,
+<b>PENDING_TIMEOUT_SHUTDOWN_FLUSH</b> = 13,
+<b>PENDING_TIMEOUT_CGI</b> = 14,
+<b>PENDING_TIMEOUT_HTTP_KEEPALIVE_IDLE</b> = 15
+<br />
+ }</td></tr>
+<tr class="separator:ga2c0aa4b9c3c55bae7b35cbfac3246c87"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga98b099cf8c1c7e38ad78501f270e193d"><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="group__sending-data.html#ga98b099cf8c1c7e38ad78501f270e193d">lws_write_protocol</a> { <br />
+  <a class="el" href="group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193da80e8f169fda236c56bfb795ed62903db">LWS_WRITE_TEXT</a> = 0,
+<a class="el" href="group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193daf6486c0dba50c44198100717721d9ab2">LWS_WRITE_BINARY</a> = 1,
+<a class="el" href="group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193da10047eb05b5e1c298151dc47a5b44826">LWS_WRITE_CONTINUATION</a> = 2,
+<a class="el" href="group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193dabb6705e1d1327cdda5025be28f07712e">LWS_WRITE_HTTP</a> = 3,
+<br />
+  <b>LWS_WRITE_PING</b> = 5,
+<b>LWS_WRITE_PONG</b> = 6,
+<b>LWS_WRITE_HTTP_FINAL</b> = 7,
+<a class="el" href="group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193dafe5a38e940ce56708ac814627e9c0917">LWS_WRITE_HTTP_HEADERS</a> = 8,
+<br />
+  <a class="el" href="group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193da115440f272a5d55518adfc8099acfee3">LWS_WRITE_NO_FIN</a> = 0x40,
+<a class="el" href="group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193da220d8e8652d9b97fb66e476e2a60ffce">LWS_WRITE_CLIENT_IGNORE_XOR_MASK</a> = 0x80
+<br />
+ }</td></tr>
+<tr class="separator:ga98b099cf8c1c7e38ad78501f270e193d"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a2271141d8be8d72b47ba327130b4905f"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a2271141d8be8d72b47ba327130b4905f"></a>enum  </td><td class="memItemRight" valign="bottom"><b>lws_enum_stdinouterr</b> { <b>LWS_STDIN</b> = 0,
+<b>LWS_STDOUT</b> = 1,
+<b>LWS_STDERR</b> = 2
+ }</td></tr>
+<tr class="separator:a2271141d8be8d72b47ba327130b4905f"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a42394a38f08a97420c98127358cfeedb"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a42394a38f08a97420c98127358cfeedb"></a>enum  </td><td class="memItemRight" valign="bottom"><b>lws_cgi_hdr_state</b> { <br />
+  <b>LCHS_HEADER</b>,
+<b>LCHS_CR1</b>,
+<b>LCHS_LF1</b>,
+<b>LCHS_CR2</b>,
+<br />
+  <b>LCHS_LF2</b>,
+<b>LHCS_PAYLOAD</b>,
+<b>LCHS_SINGLE_0A</b>
+<br />
+ }</td></tr>
+<tr class="separator:a42394a38f08a97420c98127358cfeedb"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga116be79bf44f9dc2a97f46e051fe4dc0"><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="group__smtp.html#ga116be79bf44f9dc2a97f46e051fe4dc0">lwsgs_smtp_states</a> { <br />
+  <a class="el" href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a29e5b0ecf75375b5a643faa3d6222b7c">LGSSMTP_IDLE</a>,
+<a class="el" href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0ab89442b7a3ca2b94c3cdcf33756eb933">LGSSMTP_CONNECTING</a>,
+<a class="el" href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0ab61778f70ecac007b334bb14942eb41d">LGSSMTP_CONNECTED</a>,
+<a class="el" href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a1dfec948a864205cec875f63cbe0d4ad">LGSSMTP_SENT_HELO</a>,
+<br />
+  <a class="el" href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a929bb4623ff3f585108aba2a1b047fab">LGSSMTP_SENT_FROM</a>,
+<a class="el" href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0aae20a0cb95b97a70f6b45d0ed2d5be83">LGSSMTP_SENT_TO</a>,
+<a class="el" href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a85e3c452950c09a79086bff4b9be5c14">LGSSMTP_SENT_DATA</a>,
+<a class="el" href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a38fba41f28d754e38079b31418a86a69">LGSSMTP_SENT_BODY</a>,
+<br />
+  <a class="el" href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a2c2ed16ffc572326e3040684084b21d5">LGSSMTP_SENT_QUIT</a>
+<br />
+ }</td></tr>
+<tr class="separator:ga116be79bf44f9dc2a97f46e051fe4dc0"><td class="memSeparator" colspan="2"> </td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:gaf5f07837692b2f231a79da8a058288aa"><td class="memItemLeft" align="right" valign="top">
+LWS_VISIBLE LWS_EXTERN void </td><td class="memItemRight" valign="bottom"><b>_lws_log</b> (int filter, const char *format,...)</td></tr>
+<tr class="separator:gaf5f07837692b2f231a79da8a058288aa"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga74eb146969f0595e12ea835851b4588e"><td class="memItemLeft" align="right" valign="top">
+LWS_VISIBLE LWS_EXTERN void </td><td class="memItemRight" valign="bottom"><b>_lws_logv</b> (int filter, const char *format, va_list vl)</td></tr>
+<tr class="separator:ga74eb146969f0595e12ea835851b4588e"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga42e39775c6b69b7251bdbf5a2cdd5dcd"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN int </td><td class="memItemRight" valign="bottom"><a class="el" href="group__log.html#ga42e39775c6b69b7251bdbf5a2cdd5dcd">lwsl_timestamp</a> (int level, char *p, int len)</td></tr>
+<tr class="separator:ga42e39775c6b69b7251bdbf5a2cdd5dcd"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga898b1f03872ad019f507d4e35bbefa90"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN void </td><td class="memItemRight" valign="bottom"><a class="el" href="group__log.html#ga898b1f03872ad019f507d4e35bbefa90">lwsl_hexdump</a> (void *buf, size_t len)</td></tr>
+<tr class="separator:ga898b1f03872ad019f507d4e35bbefa90"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga244647f9e1bf0097ccdde66d74f41e26"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN void </td><td class="memItemRight" valign="bottom"><a class="el" href="group__log.html#ga244647f9e1bf0097ccdde66d74f41e26">lws_set_log_level</a> (int level, void(*log_emit_function)(int level, const char *line))</td></tr>
+<tr class="separator:ga244647f9e1bf0097ccdde66d74f41e26"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:gab7c0fc936cc9f1eb58e2bb234c15147c"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN void </td><td class="memItemRight" valign="bottom"><a class="el" href="group__log.html#gab7c0fc936cc9f1eb58e2bb234c15147c">lwsl_emit_syslog</a> (int level, const char *line)</td></tr>
+<tr class="separator:gab7c0fc936cc9f1eb58e2bb234c15147c"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a0b056fdcf949a838ff82209b4a627dd9"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a0b056fdcf949a838ff82209b4a627dd9"></a>
+void * </td><td class="memItemRight" valign="bottom"><b>mbed3_create_tcp_stream_socket</b> (void)</td></tr>
+<tr class="separator:a0b056fdcf949a838ff82209b4a627dd9"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:aefb2f20fe5bb29d79701a399838ef4ce"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="aefb2f20fe5bb29d79701a399838ef4ce"></a>
+void </td><td class="memItemRight" valign="bottom"><b>mbed3_delete_tcp_stream_socket</b> (void *sockfd)</td></tr>
+<tr class="separator:aefb2f20fe5bb29d79701a399838ef4ce"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a9f2a8506fd963db95a5103823c60fb0a"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a9f2a8506fd963db95a5103823c60fb0a"></a>
+void </td><td class="memItemRight" valign="bottom"><b>mbed3_tcp_stream_bind</b> (void *sock, int port, struct lws *)</td></tr>
+<tr class="separator:a9f2a8506fd963db95a5103823c60fb0a"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a9032a3062641d334161c29adcc4fa15d"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a9032a3062641d334161c29adcc4fa15d"></a>
+void </td><td class="memItemRight" valign="bottom"><b>mbed3_tcp_stream_accept</b> (void *sock, struct lws *)</td></tr>
+<tr class="separator:a9032a3062641d334161c29adcc4fa15d"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:gaa1c863415d1783cd8de7938aa6efa262"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN void </td><td class="memItemRight" valign="bottom"><a class="el" href="group__wsclose.html#gaa1c863415d1783cd8de7938aa6efa262">lws_close_reason</a> (struct lws *wsi, enum <a class="el" href="group__wsclose.html#gae399c571df32ba532c0ca67da9284985">lws_close_status</a> status, unsigned char *buf, size_t len)</td></tr>
+<tr class="separator:gaa1c863415d1783cd8de7938aa6efa262"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:gae0e24e1768f83a7fb07896ce975704b9"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN int </td><td class="memItemRight" valign="bottom"><a class="el" href="group__extensions.html#gae0e24e1768f83a7fb07896ce975704b9">lws_set_extension_option</a> (struct lws *wsi, const char *ext_name, const char *opt_name, const char *opt_val)</td></tr>
+<tr class="separator:gae0e24e1768f83a7fb07896ce975704b9"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga6fb3e2c3dfb9d64dc87026a4e99c128b"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT </td><td class="memItemRight" valign="bottom"><a class="el" href="group__extensions.html#ga6fb3e2c3dfb9d64dc87026a4e99c128b">lws_ext_parse_options</a> (const struct <a class="el" href="structlws__extension.html">lws_extension</a> *ext, struct lws *wsi, void *ext_user, const struct <a class="el" href="structlws__ext__options.html">lws_ext_options</a> *opts, const char *o, int len)</td></tr>
+<tr class="separator:ga6fb3e2c3dfb9d64dc87026a4e99c128b"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga4cdbe42d872e21a448a947714d6c607e"><td class="memItemLeft" align="right" valign="top">LWS_EXTERN int </td><td class="memItemRight" valign="bottom"><a class="el" href="group__extensions.html#ga4cdbe42d872e21a448a947714d6c607e">lws_extension_callback_pm_deflate</a> (struct lws_context *context, const struct <a class="el" href="structlws__extension.html">lws_extension</a> *ext, struct lws *wsi, enum lws_extension_callback_reasons reason, void *user, void *in, size_t len)</td></tr>
+<tr class="separator:ga4cdbe42d872e21a448a947714d6c607e"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga25754726d97c5f519d313e691a9fe29d"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN const struct <a class="el" href="structlws__protocols.html">lws_protocols</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="group__Protocols-and-Plugins.html#ga25754726d97c5f519d313e691a9fe29d">lws_vhost_name_to_protocol</a> (struct lws_vhost *vh, const char *name)</td></tr>
+<tr class="separator:ga25754726d97c5f519d313e691a9fe29d"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga72ad550786ca7976463589d347e62112"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN const struct <a class="el" href="structlws__protocols.html">lws_protocols</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="group__Protocols-and-Plugins.html#ga72ad550786ca7976463589d347e62112">lws_get_protocol</a> (struct lws *wsi)</td></tr>
+<tr class="separator:ga72ad550786ca7976463589d347e62112"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga8bbe5e65faca068845704bab911a5030"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN const struct <a class="el" href="structlws__protocols.html">lws_protocols</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="group__Protocols-and-Plugins.html#ga8bbe5e65faca068845704bab911a5030">lws_protocol_get</a> (struct lws *wsi) LWS_WARN_DEPRECATED</td></tr>
+<tr class="separator:ga8bbe5e65faca068845704bab911a5030"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:gaec0c0477288ff3f83aff38d357b883d1"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN void * </td><td class="memItemRight" valign="bottom"><a class="el" href="group__Protocols-and-Plugins.html#gaec0c0477288ff3f83aff38d357b883d1">lws_protocol_vh_priv_zalloc</a> (struct lws_vhost *vhost, const struct <a class="el" href="structlws__protocols.html">lws_protocols</a> *prot, int size)</td></tr>
+<tr class="separator:gaec0c0477288ff3f83aff38d357b883d1"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:gaf3be4243443baac0f8be1fcfb4d25129"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN void * </td><td class="memItemRight" valign="bottom"><a class="el" href="group__Protocols-and-Plugins.html#gaf3be4243443baac0f8be1fcfb4d25129">lws_protocol_vh_priv_get</a> (struct lws_vhost *vhost, const struct <a class="el" href="structlws__protocols.html">lws_protocols</a> *prot)</td></tr>
+<tr class="separator:gaf3be4243443baac0f8be1fcfb4d25129"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga106b37ae9c247e84d191ab09441adc43"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN int </td><td class="memItemRight" valign="bottom"><a class="el" href="group__Protocols-and-Plugins.html#ga106b37ae9c247e84d191ab09441adc43">lws_finalize_startup</a> (struct lws_context *context)</td></tr>
+<tr class="separator:ga106b37ae9c247e84d191ab09441adc43"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:gaf2fff58562caab7510c41eeac85a8648"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN struct lws_context * </td><td class="memItemRight" valign="bottom"><a class="el" href="group__context-and-vhost.html#gaf2fff58562caab7510c41eeac85a8648">lws_create_context</a> (struct <a class="el" href="structlws__context__creation__info.html">lws_context_creation_info</a> *info)</td></tr>
+<tr class="separator:gaf2fff58562caab7510c41eeac85a8648"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga8ee0314028755f1ddfa9428e09b4fddb"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN void </td><td class="memItemRight" valign="bottom"><a class="el" href="group__context-and-vhost.html#ga8ee0314028755f1ddfa9428e09b4fddb">lws_context_destroy</a> (struct lws_context *context)</td></tr>
+<tr class="separator:ga8ee0314028755f1ddfa9428e09b4fddb"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga7e9d5405547a457d86e0b4f0ae2bb1c4"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN int </td><td class="memItemRight" valign="bottom"><a class="el" href="group__context-and-vhost.html#ga7e9d5405547a457d86e0b4f0ae2bb1c4">lws_set_proxy</a> (struct lws_vhost *vhost, const char *proxy)</td></tr>
+<tr class="separator:ga7e9d5405547a457d86e0b4f0ae2bb1c4"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga0c54c667ccd9b8b3dddcd123ca72f87c"><td class="memItemLeft" align="right" valign="top">LWS_EXTERN LWS_VISIBLE struct lws_vhost * </td><td class="memItemRight" valign="bottom"><a class="el" href="group__context-and-vhost.html#ga0c54c667ccd9b8b3dddcd123ca72f87c">lws_create_vhost</a> (struct lws_context *context, struct <a class="el" href="structlws__context__creation__info.html">lws_context_creation_info</a> *info)</td></tr>
+<tr class="separator:ga0c54c667ccd9b8b3dddcd123ca72f87c"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga98d88c9080fd89c37114363a6474ea73"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN int </td><td class="memItemRight" valign="bottom"><a class="el" href="group__context-and-vhost.html#ga98d88c9080fd89c37114363a6474ea73">lwsws_get_config_globals</a> (struct <a class="el" href="structlws__context__creation__info.html">lws_context_creation_info</a> *info, const char *d, char **config_strings, int *len)</td></tr>
+<tr class="separator:ga98d88c9080fd89c37114363a6474ea73"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga341064721add2618ae1b29717493a212"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN int </td><td class="memItemRight" valign="bottom"><a class="el" href="group__context-and-vhost.html#ga341064721add2618ae1b29717493a212">lwsws_get_config_vhosts</a> (struct lws_context *context, struct <a class="el" href="structlws__context__creation__info.html">lws_context_creation_info</a> *info, const char *d, char **config_strings, int *len)</td></tr>
+<tr class="separator:ga341064721add2618ae1b29717493a212"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga8db03e19a372e34ac25cf21af894a02c"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN struct lws_vhost * </td><td class="memItemRight" valign="bottom"><a class="el" href="group__context-and-vhost.html#ga8db03e19a372e34ac25cf21af894a02c">lws_vhost_get</a> (struct lws *wsi) LWS_WARN_DEPRECATED</td></tr>
+<tr class="separator:ga8db03e19a372e34ac25cf21af894a02c"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga06e77ce2916f8bc9826ef8d9d68e3932"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN struct lws_vhost * </td><td class="memItemRight" valign="bottom"><a class="el" href="group__context-and-vhost.html#ga06e77ce2916f8bc9826ef8d9d68e3932">lws_get_vhost</a> (struct lws *wsi)</td></tr>
+<tr class="separator:ga06e77ce2916f8bc9826ef8d9d68e3932"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga94e6cc2223c4eec316b13bcebc3628b6"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN int </td><td class="memItemRight" valign="bottom"><a class="el" href="group__context-and-vhost.html#ga94e6cc2223c4eec316b13bcebc3628b6">lws_json_dump_vhost</a> (const struct lws_vhost *vh, char *buf, int len)</td></tr>
+<tr class="separator:ga94e6cc2223c4eec316b13bcebc3628b6"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:gae2134657cdd2ea7a59e13ad314e4c50d"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN int </td><td class="memItemRight" valign="bottom"><a class="el" href="group__context-and-vhost.html#gae2134657cdd2ea7a59e13ad314e4c50d">lws_json_dump_context</a> (const struct lws_context *context, char *buf, int len)</td></tr>
+<tr class="separator:gae2134657cdd2ea7a59e13ad314e4c50d"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:gaeb12f934bfd178bd2132a9e73fc641da"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN void * </td><td class="memItemRight" valign="bottom"><a class="el" href="group__context-and-vhost.html#gaeb12f934bfd178bd2132a9e73fc641da">lws_context_user</a> (struct lws_context *context)</td></tr>
+<tr class="separator:gaeb12f934bfd178bd2132a9e73fc641da"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:gac30a7be106abd0cedfbb2e8b8fe3a2f5"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN struct lws *LWS_WARN_UNUSED_RESULT </td><td class="memItemRight" valign="bottom"><a class="el" href="group__client.html#gac30a7be106abd0cedfbb2e8b8fe3a2f5">lws_client_connect_via_info</a> (struct <a class="el" href="structlws__client__connect__info.html">lws_client_connect_info</a> *ccinfo)</td></tr>
+<tr class="separator:gac30a7be106abd0cedfbb2e8b8fe3a2f5"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga4af0a20108a95e8b6d94dd4d80055ff3"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN struct lws *LWS_WARN_UNUSED_RESULT </td><td class="memItemRight" valign="bottom"><a class="el" href="group__client.html#ga4af0a20108a95e8b6d94dd4d80055ff3">lws_client_connect</a> (struct lws_context *clients, const char *address, int port, int ssl_connection, const char *path, const char *host, const char *origin, const char *protocol, int ietf_version_or_minus_one) LWS_WARN_DEPRECATED</td></tr>
+<tr class="separator:ga4af0a20108a95e8b6d94dd4d80055ff3"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:gac6a8558b4410961a880241c2ac1271e2"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN struct lws *LWS_WARN_UNUSED_RESULT </td><td class="memItemRight" valign="bottom"><a class="el" href="group__client.html#gac6a8558b4410961a880241c2ac1271e2">lws_client_connect_extended</a> (struct lws_context *clients, const char *address, int port, int ssl_connection, const char *path, const char *host, const char *origin, const char *protocol, int ietf_version_or_minus_one, void *userdata) LWS_WARN_DEPRECATED</td></tr>
+<tr class="separator:gac6a8558b4410961a880241c2ac1271e2"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga4f44b8230e6732816ca5cd8d1aaaf340"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN int </td><td class="memItemRight" valign="bottom"><a class="el" href="group__client.html#ga4f44b8230e6732816ca5cd8d1aaaf340">lws_init_vhost_client_ssl</a> (const struct <a class="el" href="structlws__context__creation__info.html">lws_context_creation_info</a> *info, struct lws_vhost *vhost)</td></tr>
+<tr class="separator:ga4f44b8230e6732816ca5cd8d1aaaf340"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga4450c34200bf9dab3beb90ef23221870"><td class="memItemLeft" align="right" valign="top">
+LWS_VISIBLE LWS_EXTERN int </td><td class="memItemRight" valign="bottom"><b>lws_http_client_read</b> (struct lws *wsi, char **buf, int *len)</td></tr>
+<tr class="separator:ga4450c34200bf9dab3beb90ef23221870"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:gaf95bd0c663d6516a0c80047d9b1167a8"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN int </td><td class="memItemRight" valign="bottom"><a class="el" href="group__service.html#gaf95bd0c663d6516a0c80047d9b1167a8">lws_service</a> (struct lws_context *context, int timeout_ms)</td></tr>
+<tr class="separator:gaf95bd0c663d6516a0c80047d9b1167a8"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga9b3cc4473fd8848e5bbee7f310712939"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN int </td><td class="memItemRight" valign="bottom"><a class="el" href="group__service.html#ga9b3cc4473fd8848e5bbee7f310712939">lws_service_tsi</a> (struct lws_context *context, int timeout_ms, int tsi)</td></tr>
+<tr class="separator:ga9b3cc4473fd8848e5bbee7f310712939"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga29c246707997ab7a466aa709aecd2d7b"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN void </td><td class="memItemRight" valign="bottom"><a class="el" href="group__service.html#ga29c246707997ab7a466aa709aecd2d7b">lws_cancel_service_pt</a> (struct lws *wsi)</td></tr>
+<tr class="separator:ga29c246707997ab7a466aa709aecd2d7b"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga53e3d0801dfda7960a7249dd559e68a2"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN void </td><td class="memItemRight" valign="bottom"><a class="el" href="group__service.html#ga53e3d0801dfda7960a7249dd559e68a2">lws_cancel_service</a> (struct lws_context *context)</td></tr>
+<tr class="separator:ga53e3d0801dfda7960a7249dd559e68a2"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:gad82efa5466d14a9f05aa06416375b28d"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN int </td><td class="memItemRight" valign="bottom"><a class="el" href="group__service.html#gad82efa5466d14a9f05aa06416375b28d">lws_service_fd</a> (struct lws_context *context, struct <a class="el" href="structlws__pollfd.html">lws_pollfd</a> *<a class="el" href="structpollfd.html">pollfd</a>)</td></tr>
+<tr class="separator:gad82efa5466d14a9f05aa06416375b28d"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:gaebf426eda371ba23642fc11d8e0ace6b"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN int </td><td class="memItemRight" valign="bottom"><a class="el" href="group__service.html#gaebf426eda371ba23642fc11d8e0ace6b">lws_service_fd_tsi</a> (struct lws_context *context, struct <a class="el" href="structlws__pollfd.html">lws_pollfd</a> *<a class="el" href="structpollfd.html">pollfd</a>, int tsi)</td></tr>
+<tr class="separator:gaebf426eda371ba23642fc11d8e0ace6b"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:gab393a06d3d2722af4c3f8b06842c80d7"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN int </td><td class="memItemRight" valign="bottom"><a class="el" href="group__httpft.html#gab393a06d3d2722af4c3f8b06842c80d7">lws_serve_http_file</a> (struct lws *wsi, const char *file, const char *content_type, const char *other_headers, int other_headers_len)</td></tr>
+<tr class="separator:gab393a06d3d2722af4c3f8b06842c80d7"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga29e1123f6d56cd777b3e5bf9ca40f9e5"><td class="memItemLeft" align="right" valign="top">
+LWS_VISIBLE LWS_EXTERN int </td><td class="memItemRight" valign="bottom"><b>lws_serve_http_file_fragment</b> (struct lws *wsi)</td></tr>
+<tr class="separator:ga29e1123f6d56cd777b3e5bf9ca40f9e5"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga643073f918c0a7016b690aae9793fd60"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN int </td><td class="memItemRight" valign="bottom"><a class="el" href="group__html-chunked-substitution.html#ga643073f918c0a7016b690aae9793fd60">lws_chunked_html_process</a> (struct <a class="el" href="structlws__process__html__args.html">lws_process_html_args</a> *args, struct <a class="el" href="structlws__process__html__state.html">lws_process_html_state</a> *s)</td></tr>
+<tr class="separator:ga643073f918c0a7016b690aae9793fd60"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga2c0597b2ef1d2cee35736c338bcbd17b"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN const unsigned char * </td><td class="memItemRight" valign="bottom"><a class="el" href="group__HTTP-headers-read.html#ga2c0597b2ef1d2cee35736c338bcbd17b">lws_token_to_string</a> (enum lws_token_indexes token)</td></tr>
+<tr class="separator:ga2c0597b2ef1d2cee35736c338bcbd17b"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga8ade0e1ffb0da7e62b989d8d867bf6c8"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT </td><td class="memItemRight" valign="bottom"><a class="el" href="group__HTTP-headers-read.html#ga8ade0e1ffb0da7e62b989d8d867bf6c8">lws_hdr_total_length</a> (struct lws *wsi, enum lws_token_indexes h)</td></tr>
+<tr class="separator:ga8ade0e1ffb0da7e62b989d8d867bf6c8"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga594f3d0ece5b09c2ccf9f98ea533bb4e"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT </td><td class="memItemRight" valign="bottom"><a class="el" href="group__HTTP-headers-read.html#ga594f3d0ece5b09c2ccf9f98ea533bb4e">lws_hdr_fragment_length</a> (struct lws *wsi, enum lws_token_indexes h, int frag_idx)</td></tr>
+<tr class="separator:ga594f3d0ece5b09c2ccf9f98ea533bb4e"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga6ce6aa1c0155ea42b7708bed271d1c77"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN int </td><td class="memItemRight" valign="bottom"><a class="el" href="group__HTTP-headers-read.html#ga6ce6aa1c0155ea42b7708bed271d1c77">lws_hdr_copy</a> (struct lws *wsi, char *dest, int len, enum lws_token_indexes h)</td></tr>
+<tr class="separator:ga6ce6aa1c0155ea42b7708bed271d1c77"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:gaa427cad61a9a5e3004afd65c4527b5e9"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN int </td><td class="memItemRight" valign="bottom"><a class="el" href="group__HTTP-headers-read.html#gaa427cad61a9a5e3004afd65c4527b5e9">lws_hdr_copy_fragment</a> (struct lws *wsi, char *dest, int len, enum lws_token_indexes h, int frag_idx)</td></tr>
+<tr class="separator:gaa427cad61a9a5e3004afd65c4527b5e9"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga84e9ce5e71a77501a0998ac403a984c2"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN const char * </td><td class="memItemRight" valign="bottom"><a class="el" href="group__HTTP-headers-read.html#ga84e9ce5e71a77501a0998ac403a984c2">lws_get_urlarg_by_name</a> (struct lws *wsi, const char *name, char *buf, int len)</td></tr>
+<tr class="separator:ga84e9ce5e71a77501a0998ac403a984c2"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga29b7d6d2ddfdbaff3d8b607e7e3151b6"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT </td><td class="memItemRight" valign="bottom"><a class="el" href="group__HTTP-headers-create.html#ga29b7d6d2ddfdbaff3d8b607e7e3151b6">lws_add_http_header_status</a> (struct lws *wsi, unsigned int code, unsigned char **p, unsigned char *end)</td></tr>
+<tr class="separator:ga29b7d6d2ddfdbaff3d8b607e7e3151b6"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga2b36bf44405755ff51c1939303b995a8"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT </td><td class="memItemRight" valign="bottom"><a class="el" href="group__HTTP-headers-create.html#ga2b36bf44405755ff51c1939303b995a8">lws_add_http_header_by_name</a> (struct lws *wsi, const unsigned char *name, const unsigned char *value, int length, unsigned char **p, unsigned char *end)</td></tr>
+<tr class="separator:ga2b36bf44405755ff51c1939303b995a8"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:gaf74adb761b22566ad70004882712dce1"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT </td><td class="memItemRight" valign="bottom"><a class="el" href="group__HTTP-headers-create.html#gaf74adb761b22566ad70004882712dce1">lws_add_http_header_by_token</a> (struct lws *wsi, enum lws_token_indexes token, const unsigned char *value, int length, unsigned char **p, unsigned char *end)</td></tr>
+<tr class="separator:gaf74adb761b22566ad70004882712dce1"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:gacc76a5babcb4dce1b01b1955aa7a2faf"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT </td><td class="memItemRight" valign="bottom"><a class="el" href="group__HTTP-headers-create.html#gacc76a5babcb4dce1b01b1955aa7a2faf">lws_add_http_header_content_length</a> (struct lws *wsi, unsigned long content_length, unsigned char **p, unsigned char *end)</td></tr>
+<tr class="separator:gacc76a5babcb4dce1b01b1955aa7a2faf"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga4887605ff2242a54db3a7fa01f6f864b"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT </td><td class="memItemRight" valign="bottom"><a class="el" href="group__HTTP-headers-create.html#ga4887605ff2242a54db3a7fa01f6f864b">lws_finalize_http_header</a> (struct lws *wsi, unsigned char **p, unsigned char *end)</td></tr>
+<tr class="separator:ga4887605ff2242a54db3a7fa01f6f864b"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga162f86762173a2bc8c28497941d74815"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN struct lws_spa * </td><td class="memItemRight" valign="bottom"><a class="el" href="group__form-parsing.html#ga162f86762173a2bc8c28497941d74815">lws_spa_create</a> (struct lws *wsi, const char *const *param_names, int count_params, int max_storage, <a class="el" href="group__form-parsing.html#ga5a70527c0861c2ffa3d29333a6aa7f8e">lws_spa_fileupload_cb</a> opt_cb, void *opt_data)</td></tr>
+<tr class="separator:ga162f86762173a2bc8c28497941d74815"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga9ad9ebf5ea1a7108415ed7e04cb231d2"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN int </td><td class="memItemRight" valign="bottom"><a class="el" href="group__form-parsing.html#ga9ad9ebf5ea1a7108415ed7e04cb231d2">lws_spa_process</a> (struct lws_spa *spa, const char *in, int len)</td></tr>
+<tr class="separator:ga9ad9ebf5ea1a7108415ed7e04cb231d2"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga83835bf250ee3d4a60f36a182f2b8d24"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN int </td><td class="memItemRight" valign="bottom"><a class="el" href="group__form-parsing.html#ga83835bf250ee3d4a60f36a182f2b8d24">lws_spa_finalize</a> (struct lws_spa *spa)</td></tr>
+<tr class="separator:ga83835bf250ee3d4a60f36a182f2b8d24"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga3fbe378632f85ec9a14cc2c1687bf05f"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN int </td><td class="memItemRight" valign="bottom"><a class="el" href="group__form-parsing.html#ga3fbe378632f85ec9a14cc2c1687bf05f">lws_spa_get_length</a> (struct lws_spa *spa, int n)</td></tr>
+<tr class="separator:ga3fbe378632f85ec9a14cc2c1687bf05f"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga2da476217166da02704b90d3a8d4f3cd"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN const char * </td><td class="memItemRight" valign="bottom"><a class="el" href="group__form-parsing.html#ga2da476217166da02704b90d3a8d4f3cd">lws_spa_get_string</a> (struct lws_spa *spa, int n)</td></tr>
+<tr class="separator:ga2da476217166da02704b90d3a8d4f3cd"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:gaaa482f07dad3f04b391cccf0a814e13b"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN int </td><td class="memItemRight" valign="bottom"><a class="el" href="group__form-parsing.html#gaaa482f07dad3f04b391cccf0a814e13b">lws_spa_destroy</a> (struct lws_spa *spa)</td></tr>
+<tr class="separator:gaaa482f07dad3f04b391cccf0a814e13b"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:gabc2888476e50e001c875c1a8abf455b7"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN const char * </td><td class="memItemRight" valign="bottom"><a class="el" href="group__urlendec.html#gabc2888476e50e001c875c1a8abf455b7">lws_urlencode</a> (char *escaped, const char *string, int len)</td></tr>
+<tr class="separator:gabc2888476e50e001c875c1a8abf455b7"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:gaa373a9c16acdd96c395af61ab915ece3"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN int </td><td class="memItemRight" valign="bottom"><a class="el" href="group__urlendec.html#gaa373a9c16acdd96c395af61ab915ece3">lws_urldecode</a> (char *string, const char *escaped, int len)</td></tr>
+<tr class="separator:gaa373a9c16acdd96c395af61ab915ece3"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:gac8a4a71240857dc6b2ed70456b6923f4"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN int </td><td class="memItemRight" valign="bottom"><a class="el" href="group__http.html#gac8a4a71240857dc6b2ed70456b6923f4">lws_return_http_status</a> (struct lws *wsi, unsigned int code, const char *html_body)</td></tr>
+<tr class="separator:gac8a4a71240857dc6b2ed70456b6923f4"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga8fbf01e473ac421fc33ad9f8da8b8a25"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT </td><td class="memItemRight" valign="bottom"><a class="el" href="group__http.html#ga8fbf01e473ac421fc33ad9f8da8b8a25">lws_http_redirect</a> (struct lws *wsi, int code, const unsigned char *loc, int len, unsigned char **p, unsigned char *end)</td></tr>
+<tr class="separator:ga8fbf01e473ac421fc33ad9f8da8b8a25"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:gad27aed6c66a41b2b89ffe4da2a309e8a"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT </td><td class="memItemRight" valign="bottom"><a class="el" href="group__http.html#gad27aed6c66a41b2b89ffe4da2a309e8a">lws_http_transaction_completed</a> (struct lws *wsi)</td></tr>
+<tr class="separator:gad27aed6c66a41b2b89ffe4da2a309e8a"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga9cc82f06e5ae7e71458626d7a39a5865"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN const char * </td><td class="memItemRight" valign="bottom"><a class="el" href="group__pur.html#ga9cc82f06e5ae7e71458626d7a39a5865">lws_sql_purify</a> (char *escaped, const char *string, int len)</td></tr>
+<tr class="separator:ga9cc82f06e5ae7e71458626d7a39a5865"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:gab15187efcfa256b7c928562c182b92a3"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN const char * </td><td class="memItemRight" valign="bottom"><a class="el" href="group__pur.html#gab15187efcfa256b7c928562c182b92a3">lws_json_purify</a> (char *escaped, const char *string, int len)</td></tr>
+<tr class="separator:gab15187efcfa256b7c928562c182b92a3"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga5caf14a420a2a0bd687a1fc952f8d64e"><td class="memItemLeft" align="right" valign="top">
+LWS_VISIBLE LWS_EXTERN int </td><td class="memItemRight" valign="bottom"><b>lws_ev_sigint_cfg</b> (struct lws_context *context, int use_ev_sigint, lws_ev_signal_cb_t *cb)</td></tr>
+<tr class="separator:ga5caf14a420a2a0bd687a1fc952f8d64e"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga3fdd23ded693b21853356dc9eaef5ccc"><td class="memItemLeft" align="right" valign="top">
+LWS_VISIBLE LWS_EXTERN int </td><td class="memItemRight" valign="bottom"><b>lws_ev_initloop</b> (struct lws_context *context, struct ev_loop *loop, int tsi)</td></tr>
+<tr class="separator:ga3fdd23ded693b21853356dc9eaef5ccc"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:gaabfc0880d6a98133550c61aa01ef3563"><td class="memItemLeft" align="right" valign="top">
+LWS_VISIBLE LWS_EXTERN void </td><td class="memItemRight" valign="bottom"><b>lws_ev_sigint_cb</b> (struct ev_loop *loop, struct ev_signal *watcher, int revents)</td></tr>
+<tr class="separator:gaabfc0880d6a98133550c61aa01ef3563"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga99099e045993383f251a8026e1e40414"><td class="memItemLeft" align="right" valign="top">
+LWS_VISIBLE LWS_EXTERN int </td><td class="memItemRight" valign="bottom"><b>lws_uv_sigint_cfg</b> (struct lws_context *context, int use_uv_sigint, uv_signal_cb cb)</td></tr>
+<tr class="separator:ga99099e045993383f251a8026e1e40414"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga097c89497824d4de225a85a00661fc89"><td class="memItemLeft" align="right" valign="top">
+LWS_VISIBLE LWS_EXTERN void </td><td class="memItemRight" valign="bottom"><b>lws_libuv_run</b> (const struct lws_context *context, int tsi)</td></tr>
+<tr class="separator:ga097c89497824d4de225a85a00661fc89"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga3c75cd6ec3f80fc0a0c8ead4c4e71a15"><td class="memItemLeft" align="right" valign="top">
+LWS_VISIBLE LWS_EXTERN void </td><td class="memItemRight" valign="bottom"><b>lws_libuv_stop</b> (struct lws_context *context)</td></tr>
+<tr class="separator:ga3c75cd6ec3f80fc0a0c8ead4c4e71a15"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:gad85ce3bfc53ff754988d36bf5de39e21"><td class="memItemLeft" align="right" valign="top">
+LWS_VISIBLE LWS_EXTERN int </td><td class="memItemRight" valign="bottom"><b>lws_uv_initloop</b> (struct lws_context *context, uv_loop_t *loop, int tsi)</td></tr>
+<tr class="separator:gad85ce3bfc53ff754988d36bf5de39e21"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:gaa5e3593c94f91910d9d928dfa0c18f6c"><td class="memItemLeft" align="right" valign="top">
+LWS_VISIBLE LWS_EXTERN uv_loop_t * </td><td class="memItemRight" valign="bottom"><b>lws_uv_getloop</b> (struct lws_context *context, int tsi)</td></tr>
+<tr class="separator:gaa5e3593c94f91910d9d928dfa0c18f6c"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:gac5f60dba13a45e5d554b4fb7df7b9610"><td class="memItemLeft" align="right" valign="top">
+LWS_VISIBLE LWS_EXTERN void </td><td class="memItemRight" valign="bottom"><b>lws_uv_sigint_cb</b> (uv_signal_t *watcher, int signum)</td></tr>
+<tr class="separator:gac5f60dba13a45e5d554b4fb7df7b9610"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:gaced9f9237f6172fed9f730a2af51345a"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN void </td><td class="memItemRight" valign="bottom"><a class="el" href="group__timeout.html#gaced9f9237f6172fed9f730a2af51345a">lws_set_timeout</a> (struct lws *wsi, enum pending_timeout reason, int secs)</td></tr>
+<tr class="separator:gaced9f9237f6172fed9f730a2af51345a"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:gafd5fdd285a0e25ba7e3e1051deec1001"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN int </td><td class="memItemRight" valign="bottom"><a class="el" href="group__sending-data.html#gafd5fdd285a0e25ba7e3e1051deec1001">lws_write</a> (struct lws *wsi, unsigned char *buf, size_t len, enum <a class="el" href="group__sending-data.html#ga98b099cf8c1c7e38ad78501f270e193d">lws_write_protocol</a> protocol)</td></tr>
+<tr class="separator:gafd5fdd285a0e25ba7e3e1051deec1001"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga941caaa468bc507b1cae52275f58800d"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN int </td><td class="memItemRight" valign="bottom"><a class="el" href="group__callback-when-writeable.html#ga941caaa468bc507b1cae52275f58800d">lws_callback_on_writable</a> (struct lws *wsi)</td></tr>
+<tr class="separator:ga941caaa468bc507b1cae52275f58800d"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:gabbe4655c7eeb3eb1671b2323ec6b3107"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN int </td><td class="memItemRight" valign="bottom"><a class="el" href="group__callback-when-writeable.html#gabbe4655c7eeb3eb1671b2323ec6b3107">lws_callback_on_writable_all_protocol</a> (const struct lws_context *context, const struct <a class="el" href="structlws__protocols.html">lws_protocols</a> *protocol)</td></tr>
+<tr class="separator:gabbe4655c7eeb3eb1671b2323ec6b3107"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga8570860e191b62db264f2bac67354ea8"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN int </td><td class="memItemRight" valign="bottom"><a class="el" href="group__callback-when-writeable.html#ga8570860e191b62db264f2bac67354ea8">lws_callback_on_writable_all_protocol_vhost</a> (const struct lws_vhost *vhost, const struct <a class="el" href="structlws__protocols.html">lws_protocols</a> *protocol)</td></tr>
+<tr class="separator:ga8570860e191b62db264f2bac67354ea8"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:gacf04bbe089f47c971c6408c5efe2ac70"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN int </td><td class="memItemRight" valign="bottom"><a class="el" href="group__callback-when-writeable.html#gacf04bbe089f47c971c6408c5efe2ac70">lws_callback_all_protocol</a> (struct lws_context *context, const struct <a class="el" href="structlws__protocols.html">lws_protocols</a> *protocol, int reason)</td></tr>
+<tr class="separator:gacf04bbe089f47c971c6408c5efe2ac70"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga13c984d8c5a44a745fd02bc2fba36053"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN int </td><td class="memItemRight" valign="bottom"><a class="el" href="group__callback-when-writeable.html#ga13c984d8c5a44a745fd02bc2fba36053">lws_callback_all_protocol_vhost</a> (struct lws_vhost *vh, const struct <a class="el" href="structlws__protocols.html">lws_protocols</a> *protocol, int reason)</td></tr>
+<tr class="separator:ga13c984d8c5a44a745fd02bc2fba36053"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga60939cf0c073d933fde3d17f3591caf5"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN int </td><td class="memItemRight" valign="bottom"><a class="el" href="group__callback-when-writeable.html#ga60939cf0c073d933fde3d17f3591caf5">lws_callback_vhost_protocols</a> (struct lws *wsi, int reason, void *in, int len)</td></tr>
+<tr class="separator:ga60939cf0c073d933fde3d17f3591caf5"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:gaa709e02a10558753c851e58f1e2c16ba"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN int </td><td class="memItemRight" valign="bottom"><a class="el" href="group__callback-when-writeable.html#gaa709e02a10558753c851e58f1e2c16ba">lws_get_socket_fd</a> (struct lws *wsi)</td></tr>
+<tr class="separator:gaa709e02a10558753c851e58f1e2c16ba"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:gac4643fe16b0940ae5b68b4ee6195cbde"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN size_t </td><td class="memItemRight" valign="bottom"><a class="el" href="group__callback-when-writeable.html#gac4643fe16b0940ae5b68b4ee6195cbde">lws_get_peer_write_allowance</a> (struct lws *wsi)</td></tr>
+<tr class="separator:gac4643fe16b0940ae5b68b4ee6195cbde"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:adf4abd01e8c43f07c6e498ce13590c3e"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN int </td><td class="memItemRight" valign="bottom"><a class="el" href="libwebsockets_8h.html#adf4abd01e8c43f07c6e498ce13590c3e">lws_rx_flow_control</a> (struct lws *wsi, int enable)</td></tr>
+<tr class="separator:adf4abd01e8c43f07c6e498ce13590c3e"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a5e627dbf1db48170ef486edbaf268672"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN void </td><td class="memItemRight" valign="bottom"><a class="el" href="libwebsockets_8h.html#a5e627dbf1db48170ef486edbaf268672">lws_rx_flow_allow_all_protocol</a> (const struct lws_context *context, const struct <a class="el" href="structlws__protocols.html">lws_protocols</a> *protocol)</td></tr>
+<tr class="separator:a5e627dbf1db48170ef486edbaf268672"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a72fe65e83b8bb03f904a1a256c673536"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN size_t </td><td class="memItemRight" valign="bottom"><a class="el" href="libwebsockets_8h.html#a72fe65e83b8bb03f904a1a256c673536">lws_remaining_packet_payload</a> (struct lws *wsi)</td></tr>
+<tr class="separator:a72fe65e83b8bb03f904a1a256c673536"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:gabe71b7462afb21c767bdc67334f305af"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN struct lws * </td><td class="memItemRight" valign="bottom"><a class="el" href="group__sock-adopt.html#gabe71b7462afb21c767bdc67334f305af">lws_adopt_socket</a> (struct lws_context *context, lws_sockfd_type accept_fd)</td></tr>
+<tr class="separator:gabe71b7462afb21c767bdc67334f305af"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:gab2d045df0f81afe00891aaed312d552b"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN struct lws * </td><td class="memItemRight" valign="bottom"><a class="el" href="group__sock-adopt.html#gab2d045df0f81afe00891aaed312d552b">lws_adopt_socket_readbuf</a> (struct lws_context *context, lws_sockfd_type accept_fd, const char *readbuf, size_t len)</td></tr>
+<tr class="separator:gab2d045df0f81afe00891aaed312d552b"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:gad0df22db2be9fc65a667a1e83f9a92a4"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN const char *LWS_WARN_UNUSED_RESULT </td><td class="memItemRight" valign="bottom"><a class="el" href="group__net.html#gad0df22db2be9fc65a667a1e83f9a92a4">lws_canonical_hostname</a> (struct lws_context *context)</td></tr>
+<tr class="separator:gad0df22db2be9fc65a667a1e83f9a92a4"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga092e5f473b3347f03ffeef8a950080f3"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN void </td><td class="memItemRight" valign="bottom"><a class="el" href="group__net.html#ga092e5f473b3347f03ffeef8a950080f3">lws_get_peer_addresses</a> (struct lws *wsi, lws_sockfd_type fd, char *name, int name_len, char *rip, int rip_len)</td></tr>
+<tr class="separator:ga092e5f473b3347f03ffeef8a950080f3"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:gad01014fed09759741b6d23afccfdaacc"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN const char * </td><td class="memItemRight" valign="bottom"><a class="el" href="group__net.html#gad01014fed09759741b6d23afccfdaacc">lws_get_peer_simple</a> (struct lws *wsi, char *name, int namelen)</td></tr>
+<tr class="separator:gad01014fed09759741b6d23afccfdaacc"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga869d8bdffb0f2a7ce08e3ce10d6be3d8"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN int </td><td class="memItemRight" valign="bottom"><a class="el" href="group__net.html#ga869d8bdffb0f2a7ce08e3ce10d6be3d8">lws_interface_to_sa</a> (int ipv6, const char *ifname, struct sockaddr_in *addr, size_t addrlen)</td></tr>
+<tr class="separator:ga869d8bdffb0f2a7ce08e3ce10d6be3d8"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga58f906c6be0ca80efd813f694569dd4a"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN int </td><td class="memItemRight" valign="bottom"><a class="el" href="group__misc.html#ga58f906c6be0ca80efd813f694569dd4a">lws_get_random</a> (struct lws_context *context, void *buf, int len)</td></tr>
+<tr class="separator:ga58f906c6be0ca80efd813f694569dd4a"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:gace5171b1dbbc03ec89a98f8afdb5c9af"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT </td><td class="memItemRight" valign="bottom"><a class="el" href="group__misc.html#gace5171b1dbbc03ec89a98f8afdb5c9af">lws_daemonize</a> (const char *_lock_path)</td></tr>
+<tr class="separator:gace5171b1dbbc03ec89a98f8afdb5c9af"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:gac6abfc0b2bd5b2f09281a4432bb2f5f0"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN const char *LWS_WARN_UNUSED_RESULT </td><td class="memItemRight" valign="bottom"><a class="el" href="group__misc.html#gac6abfc0b2bd5b2f09281a4432bb2f5f0">lws_get_library_version</a> (void)</td></tr>
+<tr class="separator:gac6abfc0b2bd5b2f09281a4432bb2f5f0"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:gaa194584fff9698f3b280658f770ccd0f"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN void * </td><td class="memItemRight" valign="bottom"><a class="el" href="group__misc.html#gaa194584fff9698f3b280658f770ccd0f">lws_wsi_user</a> (struct lws *wsi)</td></tr>
+<tr class="separator:gaa194584fff9698f3b280658f770ccd0f"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga1ec0d9faac5d3a5824d765c287c043aa"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT </td><td class="memItemRight" valign="bottom"><a class="el" href="group__misc.html#ga1ec0d9faac5d3a5824d765c287c043aa">lws_parse_uri</a> (char *p, const char **prot, const char **ads, int *port, const char **path)</td></tr>
+<tr class="separator:ga1ec0d9faac5d3a5824d765c287c043aa"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga33bf2635033710b25f931b57ed663e1e"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN unsigned long </td><td class="memItemRight" valign="bottom"><a class="el" href="group__misc.html#ga33bf2635033710b25f931b57ed663e1e">lws_now_secs</a> (void)</td></tr>
+<tr class="separator:ga33bf2635033710b25f931b57ed663e1e"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga0af4f7d2dd375aeedcfa7eb0e1101c4b"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN struct lws_context *LWS_WARN_UNUSED_RESULT </td><td class="memItemRight" valign="bottom"><a class="el" href="group__misc.html#ga0af4f7d2dd375aeedcfa7eb0e1101c4b">lws_get_context</a> (const struct lws *wsi)</td></tr>
+<tr class="separator:ga0af4f7d2dd375aeedcfa7eb0e1101c4b"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga629f48268fd1856b54b11172991b97d9"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT </td><td class="memItemRight" valign="bottom"><a class="el" href="group__misc.html#ga629f48268fd1856b54b11172991b97d9">lws_get_count_threads</a> (struct lws_context *context)</td></tr>
+<tr class="separator:ga629f48268fd1856b54b11172991b97d9"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga8930fe36a3f3eefe4a6a4fd499d8e899"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN struct lws *LWS_WARN_UNUSED_RESULT </td><td class="memItemRight" valign="bottom"><a class="el" href="group__misc.html#ga8930fe36a3f3eefe4a6a4fd499d8e899">lws_get_parent</a> (const struct lws *wsi)</td></tr>
+<tr class="separator:ga8930fe36a3f3eefe4a6a4fd499d8e899"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:gacae4d7b6a8d22e4c2d82ff8b12c1e234"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN struct lws *LWS_WARN_UNUSED_RESULT </td><td class="memItemRight" valign="bottom"><a class="el" href="group__misc.html#gacae4d7b6a8d22e4c2d82ff8b12c1e234">lws_get_child</a> (const struct lws *wsi)</td></tr>
+<tr class="separator:gacae4d7b6a8d22e4c2d82ff8b12c1e234"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga0e705d498e8c8500649a26ba30a1e106"><td class="memItemLeft" align="right" valign="top">
+LWS_VISIBLE LWS_EXTERN int </td><td class="memItemRight" valign="bottom"><b>lws_read</b> (struct lws *wsi, unsigned char *buf, size_t len)</td></tr>
+<tr class="separator:ga0e705d498e8c8500649a26ba30a1e106"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:gab321ed812f46f6dc7ef9e3ca6f00cf1b"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN void </td><td class="memItemRight" valign="bottom"><a class="el" href="group__misc.html#gab321ed812f46f6dc7ef9e3ca6f00cf1b">lws_set_allocator</a> (void *(*realloc)(void *ptr, size_t size))</td></tr>
+<tr class="separator:gab321ed812f46f6dc7ef9e3ca6f00cf1b"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga2bb3655329b4651cd06f79ee3a764421"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT </td><td class="memItemRight" valign="bottom"><a class="el" href="group__wsstatus.html#ga2bb3655329b4651cd06f79ee3a764421">lws_send_pipe_choked</a> (struct lws *wsi)</td></tr>
+<tr class="separator:ga2bb3655329b4651cd06f79ee3a764421"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga08e9ee165fca503fd9427d55cfecac37"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN int </td><td class="memItemRight" valign="bottom"><a class="el" href="group__wsstatus.html#ga08e9ee165fca503fd9427d55cfecac37">lws_is_final_fragment</a> (struct lws *wsi)</td></tr>
+<tr class="separator:ga08e9ee165fca503fd9427d55cfecac37"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga3df5045656dfb6b0e63a38de2dca79d2"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN unsigned char </td><td class="memItemRight" valign="bottom"><a class="el" href="group__wsstatus.html#ga3df5045656dfb6b0e63a38de2dca79d2">lws_get_reserved_bits</a> (struct lws *wsi)</td></tr>
+<tr class="separator:ga3df5045656dfb6b0e63a38de2dca79d2"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:gaeca4afc94b1f026034f99cbba37e2f85"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT </td><td class="memItemRight" valign="bottom"><a class="el" href="group__wsstatus.html#gaeca4afc94b1f026034f99cbba37e2f85">lws_partial_buffered</a> (struct lws *wsi)</td></tr>
+<tr class="separator:gaeca4afc94b1f026034f99cbba37e2f85"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:gaccd9c59336efad8af0554f79cc5966fd"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT </td><td class="memItemRight" valign="bottom"><a class="el" href="group__wsstatus.html#gaccd9c59336efad8af0554f79cc5966fd">lws_frame_is_binary</a> (struct lws *wsi)</td></tr>
+<tr class="separator:gaccd9c59336efad8af0554f79cc5966fd"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga26a140623d202dd2bf2004deb6994baa"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN int </td><td class="memItemRight" valign="bottom"><a class="el" href="group__wsstatus.html#ga26a140623d202dd2bf2004deb6994baa">lws_is_ssl</a> (struct lws *wsi)</td></tr>
+<tr class="separator:ga26a140623d202dd2bf2004deb6994baa"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga4ad226d5e01024b4046f4a5a37199aa1"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN int </td><td class="memItemRight" valign="bottom"><a class="el" href="group__wsstatus.html#ga4ad226d5e01024b4046f4a5a37199aa1">lws_is_cgi</a> (struct lws *wsi)</td></tr>
+<tr class="separator:ga4ad226d5e01024b4046f4a5a37199aa1"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga7b09ab74646266f0b555103b3bb8dfe5"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN unsigned char * </td><td class="memItemRight" valign="bottom"><a class="el" href="group__sha.html#ga7b09ab74646266f0b555103b3bb8dfe5">lws_SHA1</a> (const unsigned char *d, size_t n, unsigned char *md)</td></tr>
+<tr class="separator:ga7b09ab74646266f0b555103b3bb8dfe5"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:gaf39765e4a3b413efb65e4698b2ec3575"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN int </td><td class="memItemRight" valign="bottom"><a class="el" href="group__sha.html#gaf39765e4a3b413efb65e4698b2ec3575">lws_b64_encode_string</a> (const char *in, int in_len, char *out, int out_size)</td></tr>
+<tr class="separator:gaf39765e4a3b413efb65e4698b2ec3575"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga66316e6a5a0644a09d5a10e919dfdd8d"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN int </td><td class="memItemRight" valign="bottom"><a class="el" href="group__sha.html#ga66316e6a5a0644a09d5a10e919dfdd8d">lws_b64_decode_string</a> (const char *in, char *out, int out_size)</td></tr>
+<tr class="separator:ga66316e6a5a0644a09d5a10e919dfdd8d"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:af52923473c59e643a974d65e12290831"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN int </td><td class="memItemRight" valign="bottom"><a class="el" href="libwebsockets_8h.html#af52923473c59e643a974d65e12290831">lws_cgi</a> (struct lws *wsi, const char *const *exec_array, int script_uri_path_len, int timeout_secs, const struct <a class="el" href="structlws__protocol__vhost__options.html">lws_protocol_vhost_options</a> *mp_cgienv)</td></tr>
+<tr class="separator:af52923473c59e643a974d65e12290831"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a5326d3402af8429a166dd991dc65c4a2"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN int </td><td class="memItemRight" valign="bottom"><a class="el" href="libwebsockets_8h.html#a5326d3402af8429a166dd991dc65c4a2">lws_cgi_write_split_stdout_headers</a> (struct lws *wsi)</td></tr>
+<tr class="separator:a5326d3402af8429a166dd991dc65c4a2"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a27bb0b3cdcd0af839c928c253b521ff4"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN int </td><td class="memItemRight" valign="bottom"><a class="el" href="libwebsockets_8h.html#a27bb0b3cdcd0af839c928c253b521ff4">lws_cgi_kill</a> (struct lws *wsi)</td></tr>
+<tr class="separator:a27bb0b3cdcd0af839c928c253b521ff4"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:gac08aef64c4c34647ed699b24759b6b0e"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN struct <a class="el" href="structlws__plat__file__ops.html">lws_plat_file_ops</a> *LWS_WARN_UNUSED_RESULT </td><td class="memItemRight" valign="bottom"><a class="el" href="group__fops.html#gac08aef64c4c34647ed699b24759b6b0e">lws_get_fops</a> (struct lws_context *context)</td></tr>
+<tr class="separator:gac08aef64c4c34647ed699b24759b6b0e"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga77fc9b56a1bb39484844981ec375fc29"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN int </td><td class="memItemRight" valign="bottom"><a class="el" href="group__smtp.html#ga77fc9b56a1bb39484844981ec375fc29">lws_email_init</a> (struct <a class="el" href="structlws__email.html">lws_email</a> *email, uv_loop_t *loop, int max_content)</td></tr>
+<tr class="separator:ga77fc9b56a1bb39484844981ec375fc29"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga5e535e346d92a9daf00be33abf79d4eb"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN void </td><td class="memItemRight" valign="bottom"><a class="el" href="group__smtp.html#ga5e535e346d92a9daf00be33abf79d4eb">lws_email_check</a> (struct <a class="el" href="structlws__email.html">lws_email</a> *email)</td></tr>
+<tr class="separator:ga5e535e346d92a9daf00be33abf79d4eb"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ga25298a5afc1074e13b2d5711a86432b2"><td class="memItemLeft" align="right" valign="top">LWS_VISIBLE LWS_EXTERN void </td><td class="memItemRight" valign="bottom"><a class="el" href="group__smtp.html#ga25298a5afc1074e13b2d5711a86432b2">lws_email_destroy</a> (struct <a class="el" href="structlws__email.html">lws_email</a> *email)</td></tr>
+<tr class="separator:ga25298a5afc1074e13b2d5711a86432b2"><td class="memSeparator" colspan="2"> </td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="af52923473c59e643a974d65e12290831"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">LWS_VISIBLE LWS_EXTERN int lws_cgi </td>
+ <td>(</td>
+ <td class="paramtype">struct lws * </td>
+ <td class="paramname"><em>wsi</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const char *const * </td>
+ <td class="paramname"><em>exec_array</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">int </td>
+ <td class="paramname"><em>script_uri_path_len</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">int </td>
+ <td class="paramname"><em>timeout_secs</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const struct <a class="el" href="structlws__protocol__vhost__options.html">lws_protocol_vhost_options</a> * </td>
+ <td class="paramname"><em>mp_cgienv</em> </td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>lws_cgi: spawn network-connected cgi process</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">wsi</td><td>connection to own the process </td></tr>
+ <tr><td class="paramname">exec_array</td><td>array of "exec-name" "arg1" ... "argn" NULL </td></tr>
+ <tr><td class="paramname">script_uri_path_len</td><td>how many chars on the left of the uri are the path to the cgi </td></tr>
+ <tr><td class="paramname">timeout_secs</td><td>seconds script should be allowed to run </td></tr>
+ <tr><td class="paramname">mp_cgienv</td><td>pvo list with per-vhost cgi options to put in env </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a class="anchor" id="a27bb0b3cdcd0af839c928c253b521ff4"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">LWS_VISIBLE LWS_EXTERN int lws_cgi_kill </td>
+ <td>(</td>
+ <td class="paramtype">struct lws * </td>
+ <td class="paramname"><em>wsi</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>lws_cgi_kill: terminate cgi process associated with wsi</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">wsi</td><td>connection to own the process </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a class="anchor" id="a5326d3402af8429a166dd991dc65c4a2"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">LWS_VISIBLE LWS_EXTERN int lws_cgi_write_split_stdout_headers </td>
+ <td>(</td>
+ <td class="paramtype">struct lws * </td>
+ <td class="paramname"><em>wsi</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>lws_cgi_write_split_stdout_headers: write cgi output accounting for header part</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">wsi</td><td>connection to own the process </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a class="anchor" id="a72fe65e83b8bb03f904a1a256c673536"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">LWS_VISIBLE LWS_EXTERN size_t lws_remaining_packet_payload </td>
+ <td>(</td>
+ <td class="paramtype">struct lws * </td>
+ <td class="paramname"><em>wsi</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p><a class="el" href="libwebsockets_8h.html#a72fe65e83b8bb03f904a1a256c673536">lws_remaining_packet_payload()</a> - Bytes to come before "overall" rx packet is complete </p><dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">wsi</td><td>Websocket instance (available from user callback) <pre class="fragment"> This function is intended to be called from the callback if the
+</pre> user code is interested in "complete packets" from the client. libwebsockets just passes through payload as it comes and issues a buffer additionally when it hits a built-in limit. The LWS_CALLBACK_RECEIVE callback handler can use this API to find out if the buffer it has just been given is the last piece of a "complete packet" from the client – when that is the case <a class="el" href="libwebsockets_8h.html#a72fe65e83b8bb03f904a1a256c673536">lws_remaining_packet_payload()</a> will return 0.</td></tr>
+ </table>
+ </dd>
+</dl>
+<p>Many protocols won't care becuse their packets are always small. </p>
+
+</div>
+</div>
+<a class="anchor" id="a5e627dbf1db48170ef486edbaf268672"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">LWS_VISIBLE LWS_EXTERN void lws_rx_flow_allow_all_protocol </td>
+ <td>(</td>
+ <td class="paramtype">const struct lws_context * </td>
+ <td class="paramname"><em>context</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const struct <a class="el" href="structlws__protocols.html">lws_protocols</a> * </td>
+ <td class="paramname"><em>protocol</em> </td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p><a class="el" href="libwebsockets_8h.html#a5e627dbf1db48170ef486edbaf268672">lws_rx_flow_allow_all_protocol()</a> - Allow all connections with this protocol to receive</p>
+<p>When the user server code realizes it can accept more input, it can call this to have the RX flow restriction removed from all connections using the given protocol. </p><dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">context</td><td>lws_context </td></tr>
+ <tr><td class="paramname">protocol</td><td>all connections using this protocol will be allowed to receive </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a class="anchor" id="adf4abd01e8c43f07c6e498ce13590c3e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">LWS_VISIBLE LWS_EXTERN int lws_rx_flow_control </td>
+ <td>(</td>
+ <td class="paramtype">struct lws * </td>
+ <td class="paramname"><em>wsi</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">int </td>
+ <td class="paramname"><em>enable</em> </td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p><a class="el" href="libwebsockets_8h.html#adf4abd01e8c43f07c6e498ce13590c3e">lws_rx_flow_control()</a> - Enable and disable socket servicing for received packets.</p>
+<p>If the output side of a server process becomes choked, this allows flow control for the input side.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">wsi</td><td>Websocket connection instance to get callback for </td></tr>
+ <tr><td class="paramname">enable</td><td>0 = disable read servicing for this connection, 1 = enable </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="dir_97aefd0d527b934f1d99a682da8fe6a9.html">lib</a></li><li class="navelem"><a class="el" href="libwebsockets_8h.html">libwebsockets.h</a></li>
+ <li class="footer">Generated by
+ <a href="http://www.doxygen.org/index.html">
+ <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.11 </li>
+ </ul>
+</div>
+</body>
+</html>
--- /dev/null
+var libwebsockets_8h =
+[
+ [ "lws_conn", "classlws__conn.html", "classlws__conn" ],
+ [ "lws_conn_listener", "classlws__conn__listener.html", "classlws__conn__listener" ],
+ [ "lws_polarssl_context", "structlws__polarssl__context.html", "structlws__polarssl__context" ],
+ [ "lws_pollfd", "structlws__pollfd.html", "structlws__pollfd" ],
+ [ "pollfd", "structpollfd.html", "structpollfd" ],
+ [ "lws_pollargs", "structlws__pollargs.html", "structlws__pollargs" ],
+ [ "lws_cgi_args", "structlws__cgi__args.html", "structlws__cgi__args" ],
+ [ "lws_callback_function", "group__usercb.html#gad4fcb82e68d60ffacca61a3f783a0a2f", null ],
+ [ "lws_ev_signal_cb_t", "group__ev.html#ga3b0ffd4d2b4fa791c0fd75353a330208", null ],
+ [ "lws_extension_callback_function", "group__extensions.html#gaae7169b2cd346b34fa33d0250db2afd0", null ],
+ [ "lws_filefd_type", "libwebsockets_8h.html#aff42d53861afdc1a6edfb999ba688ecb", null ],
+ [ "lws_plugin_destroy_func", "group__Protocols-and-Plugins.html#ga83f7a924ba790fa273476075a59f08b0", null ],
+ [ "lws_plugin_init_func", "group__Protocols-and-Plugins.html#ga40994491e1567f91f579d2b444775266", null ],
+ [ "lws_process_html_state_cb", "group__html-chunked-substitution.html#ga669d3d7ce2d5f193473f649a89b3e7ac", null ],
+ [ "lws_sockfd_type", "libwebsockets_8h.html#adedbc79528b71a5c7f27cde87100c9aa", null ],
+ [ "lws_spa_fileupload_cb", "group__form-parsing.html#ga5a70527c0861c2ffa3d29333a6aa7f8e", null ],
+ [ "SSL", "libwebsockets_8h.html#ac3abb8b7e6d29a0292797230e4031681", null ],
+ [ "SSL_CTX", "libwebsockets_8h.html#abddb8d337fb2692586d892b494739003", null ],
+ [ "http_status", "group__html-chunked-substitution.html#gabc3b93f68c8bdd857ad32913628dfa8d", [
+ [ "HTTP_STATUS_OK", "group__html-chunked-substitution.html#ggabc3b93f68c8bdd857ad32913628dfa8dad34cd21de350cd4fa83b8099e3993b91", null ],
+ [ "HTTP_STATUS_NO_CONTENT", "group__html-chunked-substitution.html#ggabc3b93f68c8bdd857ad32913628dfa8dad000a2e30c534c201201dd74fac8d2f9", null ],
+ [ "HTTP_STATUS_MOVED_PERMANENTLY", "group__html-chunked-substitution.html#ggabc3b93f68c8bdd857ad32913628dfa8da9632802fcd318d1676be7589e6004e96", null ],
+ [ "HTTP_STATUS_FOUND", "group__html-chunked-substitution.html#ggabc3b93f68c8bdd857ad32913628dfa8da53df069872b37830e4296f32e7ec20d8", null ],
+ [ "HTTP_STATUS_SEE_OTHER", "group__html-chunked-substitution.html#ggabc3b93f68c8bdd857ad32913628dfa8dae301c12d0cf56920659cb7b947a95267", null ],
+ [ "HTTP_STATUS_BAD_REQUEST", "group__html-chunked-substitution.html#ggabc3b93f68c8bdd857ad32913628dfa8da49cf9c4c184f9e4d265ceae249e92477", null ],
+ [ "HTTP_STATUS_UNAUTHORIZED", "group__html-chunked-substitution.html#ggabc3b93f68c8bdd857ad32913628dfa8dad771b2a0ab88db11b2719c8e5086fb48", null ],
+ [ "HTTP_STATUS_PAYMENT_REQUIRED", "group__html-chunked-substitution.html#ggabc3b93f68c8bdd857ad32913628dfa8dafac24097912a70f224166528ce44b83b", null ],
+ [ "HTTP_STATUS_FORBIDDEN", "group__html-chunked-substitution.html#ggabc3b93f68c8bdd857ad32913628dfa8da419c919f74b88d18803358141ab9471c", null ],
+ [ "HTTP_STATUS_NOT_FOUND", "group__html-chunked-substitution.html#ggabc3b93f68c8bdd857ad32913628dfa8daf06c31278cb67d7eec4b2b8157b9ad25", null ],
+ [ "HTTP_STATUS_METHOD_NOT_ALLOWED", "group__html-chunked-substitution.html#ggabc3b93f68c8bdd857ad32913628dfa8da63eb71a406e943d4634c357d60dd96df", null ],
+ [ "HTTP_STATUS_NOT_ACCEPTABLE", "group__html-chunked-substitution.html#ggabc3b93f68c8bdd857ad32913628dfa8da1558c42d80f54def5f3277dc879d2844", null ],
+ [ "HTTP_STATUS_PROXY_AUTH_REQUIRED", "group__html-chunked-substitution.html#ggabc3b93f68c8bdd857ad32913628dfa8da40246e02220192ce8d7f86591ca1cfe4", null ],
+ [ "HTTP_STATUS_REQUEST_TIMEOUT", "group__html-chunked-substitution.html#ggabc3b93f68c8bdd857ad32913628dfa8da36b5bcf2059ae3c84a47e080822239c7", null ],
+ [ "HTTP_STATUS_CONFLICT", "group__html-chunked-substitution.html#ggabc3b93f68c8bdd857ad32913628dfa8da6964f9591ba7284dc4bd388d40c106a9", null ],
+ [ "HTTP_STATUS_GONE", "group__html-chunked-substitution.html#ggabc3b93f68c8bdd857ad32913628dfa8da67278d96cfa0eb507535b94338810d65", null ],
+ [ "HTTP_STATUS_LENGTH_REQUIRED", "group__html-chunked-substitution.html#ggabc3b93f68c8bdd857ad32913628dfa8dab42dfcbd67b4e66096e3a8e924b6d6c9", null ],
+ [ "HTTP_STATUS_PRECONDITION_FAILED", "group__html-chunked-substitution.html#ggabc3b93f68c8bdd857ad32913628dfa8dac3d4da4de851d5c8f95748145b59716a", null ],
+ [ "HTTP_STATUS_REQ_ENTITY_TOO_LARGE", "group__html-chunked-substitution.html#ggabc3b93f68c8bdd857ad32913628dfa8daafd60e3a2073e04b8f2247f8f9ac9710", null ],
+ [ "HTTP_STATUS_REQ_URI_TOO_LONG", "group__html-chunked-substitution.html#ggabc3b93f68c8bdd857ad32913628dfa8da2637ec8a704c0d7fcb7ff8ce5d871be0", null ],
+ [ "HTTP_STATUS_UNSUPPORTED_MEDIA_TYPE", "group__html-chunked-substitution.html#ggabc3b93f68c8bdd857ad32913628dfa8da145570ed1178d3d90ad9b7652fea83cf", null ],
+ [ "HTTP_STATUS_REQ_RANGE_NOT_SATISFIABLE", "group__html-chunked-substitution.html#ggabc3b93f68c8bdd857ad32913628dfa8da2e57a633f7a2422f67bf207648519e30", null ],
+ [ "HTTP_STATUS_EXPECTATION_FAILED", "group__html-chunked-substitution.html#ggabc3b93f68c8bdd857ad32913628dfa8da08107f6b0e1d7c9e2ca100700cc7200f", null ],
+ [ "HTTP_STATUS_INTERNAL_SERVER_ERROR", "group__html-chunked-substitution.html#ggabc3b93f68c8bdd857ad32913628dfa8da299a2d262210540b593420fe89e01b32", null ],
+ [ "HTTP_STATUS_NOT_IMPLEMENTED", "group__html-chunked-substitution.html#ggabc3b93f68c8bdd857ad32913628dfa8dac9c5b4e80aa858cfe2763656db1f16e3", null ],
+ [ "HTTP_STATUS_BAD_GATEWAY", "group__html-chunked-substitution.html#ggabc3b93f68c8bdd857ad32913628dfa8dac96829d2c2cb76feb1549f0fac72c69e", null ],
+ [ "HTTP_STATUS_SERVICE_UNAVAILABLE", "group__html-chunked-substitution.html#ggabc3b93f68c8bdd857ad32913628dfa8dab355dd546e62b1478fe3ef94b554f75c", null ],
+ [ "HTTP_STATUS_GATEWAY_TIMEOUT", "group__html-chunked-substitution.html#ggabc3b93f68c8bdd857ad32913628dfa8daefdfc7b525c87b911d6e92a30e36cfec", null ],
+ [ "HTTP_STATUS_HTTP_VERSION_NOT_SUPPORTED", "group__html-chunked-substitution.html#ggabc3b93f68c8bdd857ad32913628dfa8dadd02813da14cfdc7fe83029b8779ea4b", null ]
+ ] ],
+ [ "lws_callback_reasons", "group__usercb.html#gad62860e19975ba4c4af401c3cdb6abf7", [
+ [ "LWS_CALLBACK_ESTABLISHED", "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a24d39bf1cfc0bad9d92da9ac1717e439", null ],
+ [ "LWS_CALLBACK_CLIENT_CONNECTION_ERROR", "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ad8c6207b0c4e732f3d507f0fb79370e8", null ],
+ [ "LWS_CALLBACK_CLIENT_FILTER_PRE_ESTABLISH", "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aa536e574a642ff3ab9e12bff7ba2c6a2", null ],
+ [ "LWS_CALLBACK_CLIENT_ESTABLISHED", "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a7e12418eec9bce85735e6460176ab604", null ],
+ [ "LWS_CALLBACK_CLOSED", "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a48a9590e5e18c7920282e094a0bfd9d8", null ],
+ [ "LWS_CALLBACK_CLOSED_HTTP", "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a838b18d255c1b94a533287ba302a2eba", null ],
+ [ "LWS_CALLBACK_RECEIVE", "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a492c1b1c0ac0ed980042ee732fe2990c", null ],
+ [ "LWS_CALLBACK_RECEIVE_PONG", "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a2db02fc6e1c17ab62b52109d1aa9d738", null ],
+ [ "LWS_CALLBACK_CLIENT_RECEIVE", "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7abbbe7a0a67c5866ca9109d46823fc5b1", null ],
+ [ "LWS_CALLBACK_CLIENT_RECEIVE_PONG", "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a136a7cec11c3afd13245623bd84e76c9", null ],
+ [ "LWS_CALLBACK_CLIENT_WRITEABLE", "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a8e8b2e6dbeac76d8d126947d2166a514", null ],
+ [ "LWS_CALLBACK_SERVER_WRITEABLE", "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a7ec8e2e9557ee02a4fc9f7dec7e2babc", null ],
+ [ "LWS_CALLBACK_HTTP", "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ae8d1de0bb56e03aa58cb4d44b18edd2e", null ],
+ [ "LWS_CALLBACK_HTTP_BODY", "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ac4c68e00efcf1ff7bda7ada462aff8ae", null ],
+ [ "LWS_CALLBACK_HTTP_BODY_COMPLETION", "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a2fce9a8608220f32abbf1422a5498804", null ],
+ [ "LWS_CALLBACK_HTTP_FILE_COMPLETION", "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aa627548e1296e654fcfab463ec3c9587", null ],
+ [ "LWS_CALLBACK_HTTP_WRITEABLE", "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7afedadfb3cde37a8ea4c84ed535f26d09", null ],
+ [ "LWS_CALLBACK_FILTER_NETWORK_CONNECTION", "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a026502768778b8d79d62dd0fe4375fc6", null ],
+ [ "LWS_CALLBACK_FILTER_HTTP_CONNECTION", "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a75199176c82c1a56e4a6bbf1cc30c12c", null ],
+ [ "LWS_CALLBACK_SERVER_NEW_CLIENT_INSTANTIATED", "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ae9734e1d7af2abf291665ce9e4a728d3", null ],
+ [ "LWS_CALLBACK_FILTER_PROTOCOL_CONNECTION", "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7accd8753672d319a30b4b4c2fb775e84d", null ],
+ [ "LWS_CALLBACK_OPENSSL_LOAD_EXTRA_CLIENT_VERIFY_CERTS", "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ae4986291b7a810fe290851d73bebeb1c", null ],
+ [ "LWS_CALLBACK_OPENSSL_LOAD_EXTRA_SERVER_VERIFY_CERTS", "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a06006e98d27e1e884364d88317f83493", null ],
+ [ "LWS_CALLBACK_OPENSSL_PERFORM_CLIENT_CERT_VERIFICATION", "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ae5ad65d779b7eab32ab67ceff91a3bac", null ],
+ [ "LWS_CALLBACK_CLIENT_APPEND_HANDSHAKE_HEADER", "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a909cc2a7018864b0b71abacc4058fd8f", null ],
+ [ "LWS_CALLBACK_CONFIRM_EXTENSION_OKAY", "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a390da3639296660a78cc1a5dcb19037e", null ],
+ [ "LWS_CALLBACK_CLIENT_CONFIRM_EXTENSION_SUPPORTED", "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a1ce5b22039ca37ee224d00047596ea46", null ],
+ [ "LWS_CALLBACK_PROTOCOL_INIT", "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ad5d34583e3556e153eda91620b48cc49", null ],
+ [ "LWS_CALLBACK_PROTOCOL_DESTROY", "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a54269ca88508e6efd3afdb9d360a9caa", null ],
+ [ "LWS_CALLBACK_WSI_CREATE", "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7afd8fd77a1cc9405fcb4f26915d7f2d01", null ],
+ [ "LWS_CALLBACK_WSI_DESTROY", "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aca834dc035b7f7486f9ce40fde54fe9e", null ],
+ [ "LWS_CALLBACK_GET_THREAD_ID", "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7adfb41c92e2522712207ef7f2462b5e34", null ],
+ [ "LWS_CALLBACK_ADD_POLL_FD", "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ab69783a9fbf2ca71ad70706bda77b412", null ],
+ [ "LWS_CALLBACK_DEL_POLL_FD", "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a1df60f314710236f9b53efbf468da768", null ],
+ [ "LWS_CALLBACK_CHANGE_MODE_POLL_FD", "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aa87d2e82fffa42c3680c7403ef94216e", null ],
+ [ "LWS_CALLBACK_LOCK_POLL", "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a8909732521d379179003d97ab7a05428", null ],
+ [ "LWS_CALLBACK_UNLOCK_POLL", "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a0e9e3dd667c0c42cdbe1a3d921f4fd79", null ],
+ [ "LWS_CALLBACK_OPENSSL_CONTEXT_REQUIRES_PRIVATE_KEY", "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aa46f705dcf97502e95627ffde614f98b", null ],
+ [ "LWS_CALLBACK_WS_PEER_INITIATED_CLOSE", "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ac3fc5bbb55e69f90396526287ee84a51", null ],
+ [ "LWS_CALLBACK_WS_EXT_DEFAULTS", "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7abcf9c720cd3d361a83d1ac65bf052a25", null ],
+ [ "LWS_CALLBACK_CGI", "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a23b90b5e5146e760bc3123ae1fd2a6e5", null ],
+ [ "LWS_CALLBACK_CGI_TERMINATED", "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ac8c0ae966ef1877e0020c0077ff2e4a4", null ],
+ [ "LWS_CALLBACK_CGI_STDIN_DATA", "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a659539cfa65c66e0d813113b09900d31", null ],
+ [ "LWS_CALLBACK_CGI_STDIN_COMPLETED", "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ad724974204d51d688f569c5d387b967d", null ],
+ [ "LWS_CALLBACK_ESTABLISHED_CLIENT_HTTP", "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a6a09ee9c01c4a233aedbe6697e29cc01", null ],
+ [ "LWS_CALLBACK_CLOSED_CLIENT_HTTP", "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ac432e9f891c733ba8f968c1bf57c0ddc", null ],
+ [ "LWS_CALLBACK_RECEIVE_CLIENT_HTTP", "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aaffd08a5cae791c9f3c38ee242203900", null ],
+ [ "LWS_CALLBACK_COMPLETED_CLIENT_HTTP", "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a182a4a14c3278784505cea6d516a8308", null ],
+ [ "LWS_CALLBACK_RECEIVE_CLIENT_HTTP_READ", "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ad87774f1c7784cf632e1e2f5b51036e1", null ],
+ [ "LWS_CALLBACK_HTTP_BIND_PROTOCOL", "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a0418587d5083bb4850faa438648496ba", null ],
+ [ "LWS_CALLBACK_HTTP_DROP_PROTOCOL", "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a45d538082dec32dbecfe9d9a05ddfecd", null ],
+ [ "LWS_CALLBACK_CHECK_ACCESS_RIGHTS", "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7afc4b2f72cc9e424a750b506ce0cc4310", null ],
+ [ "LWS_CALLBACK_PROCESS_HTML", "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a89862929a72bff65257ca1d51a0fce4d", null ],
+ [ "LWS_CALLBACK_ADD_HEADERS", "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ab884f3d5f8a6126a0d34c0172f5e3725", null ],
+ [ "LWS_CALLBACK_SESSION_INFO", "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ac11c336f7052abf3618962902a71ebc8", null ],
+ [ "LWS_CALLBACK_GS_EVENT", "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7af6cf80e57aae8ba0a57a5c456b1fe026", null ],
+ [ "LWS_CALLBACK_USER", "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a982579753e70e59a9ea13ce628ac891a", null ]
+ ] ],
+ [ "lws_cgi_hdr_state", "libwebsockets_8h.html#a42394a38f08a97420c98127358cfeedb", [
+ [ "LCHS_HEADER", "libwebsockets_8h.html#a42394a38f08a97420c98127358cfeedbaa424646e067c6266bcb4f0190b026d66", null ],
+ [ "LCHS_CR1", "libwebsockets_8h.html#a42394a38f08a97420c98127358cfeedba60ac587febc583475c185e1409a0210c", null ],
+ [ "LCHS_LF1", "libwebsockets_8h.html#a42394a38f08a97420c98127358cfeedbac8f5f992c6615324108cdf931da903be", null ],
+ [ "LCHS_CR2", "libwebsockets_8h.html#a42394a38f08a97420c98127358cfeedbad9cdc12a796e6c7d912278834d9c7dde", null ],
+ [ "LCHS_LF2", "libwebsockets_8h.html#a42394a38f08a97420c98127358cfeedba35cf2bed9944faa062d9310197489b2f", null ],
+ [ "LHCS_PAYLOAD", "libwebsockets_8h.html#a42394a38f08a97420c98127358cfeedbada3dca91d96bcde5df08a67b5a66e972", null ],
+ [ "LCHS_SINGLE_0A", "libwebsockets_8h.html#a42394a38f08a97420c98127358cfeedbad655f0eecc9e94be37b8ed07348716ef", null ]
+ ] ],
+ [ "lws_close_status", "group__wsclose.html#gae399c571df32ba532c0ca67da9284985", [
+ [ "LWS_CLOSE_STATUS_NOSTATUS", "group__wsclose.html#ggae399c571df32ba532c0ca67da9284985acc9a317c70363dd88e823e066b2c73b7", null ],
+ [ "LWS_CLOSE_STATUS_NORMAL", "group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a3ffa38d5081b85fb739e02a747ccf2c4", null ],
+ [ "LWS_CLOSE_STATUS_GOINGAWAY", "group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a9737a68759e739856b150ff9dfa30218", null ],
+ [ "LWS_CLOSE_STATUS_PROTOCOL_ERR", "group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a1bb501d212fa4d57053db681b1dfab98", null ],
+ [ "LWS_CLOSE_STATUS_UNACCEPTABLE_OPCODE", "group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a462c99b05459df700919cfd3f53c8276", null ],
+ [ "LWS_CLOSE_STATUS_RESERVED", "group__wsclose.html#ggae399c571df32ba532c0ca67da9284985af90cb98d983ad3d4c79df9b6f3d4a4d2", null ],
+ [ "LWS_CLOSE_STATUS_NO_STATUS", "group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a4b8a3b7ce6f731e5248e4b0fb64a5044", null ],
+ [ "LWS_CLOSE_STATUS_ABNORMAL_CLOSE", "group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a68b3d34bebd88547dcfa5cadba0acd6c", null ],
+ [ "LWS_CLOSE_STATUS_INVALID_PAYLOAD", "group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a7aef2da0062da606eeb35aaca5cf9050", null ],
+ [ "LWS_CLOSE_STATUS_POLICY_VIOLATION", "group__wsclose.html#ggae399c571df32ba532c0ca67da9284985ad09e68295eabdddcba4e332fbea70ae5", null ],
+ [ "LWS_CLOSE_STATUS_MESSAGE_TOO_LARGE", "group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a2e1f0113494a58e762eed3d22e7080d8", null ],
+ [ "LWS_CLOSE_STATUS_EXTENSION_REQUIRED", "group__wsclose.html#ggae399c571df32ba532c0ca67da9284985ac6a161822783ee873be1c66f48d14e0e", null ],
+ [ "LWS_CLOSE_STATUS_UNEXPECTED_CONDITION", "group__wsclose.html#ggae399c571df32ba532c0ca67da9284985ad0869604d79e13700ae5d196a431b350", null ],
+ [ "LWS_CLOSE_STATUS_TLS_FAILURE", "group__wsclose.html#ggae399c571df32ba532c0ca67da9284985ad2b477a91c8445bf34ecd43977f9b390", null ],
+ [ "LWS_CLOSE_STATUS_NOSTATUS_CONTEXT_DESTROY", "group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a32c38edab10d1379febac0c479ab2e9c", null ]
+ ] ],
+ [ "lws_context_options", "group__context-and-vhost.html#ga41c2d763f78cc248df3b9f8645dbd2a5", [
+ [ "LWS_SERVER_OPTION_REQUIRE_VALID_OPENSSL_CLIENT_CERT", "group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a274ed462a1a9239eb6ddf9007f5b7092", null ],
+ [ "LWS_SERVER_OPTION_SKIP_SERVER_CANONICAL_NAME", "group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a6582c985ee0ceaadc1d277030eae2d7c", null ],
+ [ "LWS_SERVER_OPTION_ALLOW_NON_SSL_ON_SSL_PORT", "group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a1cc4562d05cba52a6dfa0697a65ade0d", null ],
+ [ "LWS_SERVER_OPTION_LIBEV", "group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a273d9975675130de0c6dc937dde7c8a6", null ],
+ [ "LWS_SERVER_OPTION_DISABLE_IPV6", "group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a34ab36e68c0d593b6f19b8d5ef1240a9", null ],
+ [ "LWS_SERVER_OPTION_DISABLE_OS_CA_CERTS", "group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a4933347a821e73c3f1e13fb6bfc7ad93", null ],
+ [ "LWS_SERVER_OPTION_PEER_CERT_NOT_REQUIRED", "group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5ac56a8a6590e74a8016d0fae09fb404fc", null ],
+ [ "LWS_SERVER_OPTION_VALIDATE_UTF8", "group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5aa0158b4e85420811e6b0f1378c6ded0f", null ],
+ [ "LWS_SERVER_OPTION_SSL_ECDH", "group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a1b2f8bde0f62adc7ebe81b2043f34c0c", null ],
+ [ "LWS_SERVER_OPTION_LIBUV", "group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5aff121db04a10cf8b2c5df9d4f2b89f1e", null ],
+ [ "LWS_SERVER_OPTION_REDIRECT_HTTP_TO_HTTPS", "group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a4832187186c4d130c68051214cd42ada", null ],
+ [ "LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT", "group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a7fed6a527c8d5e0acac1b4179644583a", null ],
+ [ "LWS_SERVER_OPTION_EXPLICIT_VHOSTS", "group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5accc9d0d11d1124a21659586164b0962e", null ],
+ [ "LWS_SERVER_OPTION_UNIX_SOCK", "group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a9637e9001d8c8b2521086bcafbd8a941", null ],
+ [ "LWS_SERVER_OPTION_STS", "group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5ac962efd35abf6c402f9fb14aa14f5016", null ],
+ [ "LWS_SERVER_OPTION_IPV6_V6ONLY_MODIFY", "group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5af62887536e25e053e68741006dba46d8", null ],
+ [ "LWS_SERVER_OPTION_IPV6_V6ONLY_VALUE", "group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5aca5d42820b65eac5618ec3f0bd8a1160", null ]
+ ] ],
+ [ "lws_enum_stdinouterr", "libwebsockets_8h.html#a2271141d8be8d72b47ba327130b4905f", [
+ [ "LWS_STDIN", "libwebsockets_8h.html#a2271141d8be8d72b47ba327130b4905fafdb6cf2797a3ea957c690ad6edff25d6", null ],
+ [ "LWS_STDOUT", "libwebsockets_8h.html#a2271141d8be8d72b47ba327130b4905fa7741c12fc97574fa73a810fedae2be76", null ],
+ [ "LWS_STDERR", "libwebsockets_8h.html#a2271141d8be8d72b47ba327130b4905fa9ce9c65d4229d1d168fca3cc12e7f535", null ]
+ ] ],
+ [ "lws_ext_options_types", "group__extensions.html#gacc9f55936dc165257a2e1f7d47bce89e", [
+ [ "EXTARG_NONE", "group__extensions.html#ggacc9f55936dc165257a2e1f7d47bce89eaabcf56c456c1ff6e81dc82586a16f14c", null ],
+ [ "EXTARG_DEC", "group__extensions.html#ggacc9f55936dc165257a2e1f7d47bce89ea1c86adf924c8786a12bee9687094673e", null ],
+ [ "EXTARG_OPT_DEC", "group__extensions.html#ggacc9f55936dc165257a2e1f7d47bce89ea5265abe3e1c3f64412f2affe7bffd880", null ]
+ ] ],
+ [ "lws_extension_callback_reasons", "group__extensions.html#gae9993815eee72c6070300a0ae2f022d7", [
+ [ "LWS_EXT_CB_SERVER_CONTEXT_CONSTRUCT", "group__extensions.html#ggae9993815eee72c6070300a0ae2f022d7a866a849e7d59a3a44c92ecdfb1393e4e", null ],
+ [ "LWS_EXT_CB_CLIENT_CONTEXT_CONSTRUCT", "group__extensions.html#ggae9993815eee72c6070300a0ae2f022d7afa4a8739f6424c4dac3eead479628002", null ],
+ [ "LWS_EXT_CB_SERVER_CONTEXT_DESTRUCT", "group__extensions.html#ggae9993815eee72c6070300a0ae2f022d7a7fe88715ded486af17228050a1d05e90", null ],
+ [ "LWS_EXT_CB_CLIENT_CONTEXT_DESTRUCT", "group__extensions.html#ggae9993815eee72c6070300a0ae2f022d7abb36b02569c81df4509f58f964a8155b", null ],
+ [ "LWS_EXT_CB_CONSTRUCT", "group__extensions.html#ggae9993815eee72c6070300a0ae2f022d7aa2901960832871f606354d58e58b6453", null ],
+ [ "LWS_EXT_CB_CLIENT_CONSTRUCT", "group__extensions.html#ggae9993815eee72c6070300a0ae2f022d7a83dff5bb6cd4c6e0cc85cb12fb9c0178", null ],
+ [ "LWS_EXT_CB_CHECK_OK_TO_REALLY_CLOSE", "group__extensions.html#ggae9993815eee72c6070300a0ae2f022d7ad113e96df806fb20fd4f02dbe19e4f4b", null ],
+ [ "LWS_EXT_CB_CHECK_OK_TO_PROPOSE_EXTENSION", "group__extensions.html#ggae9993815eee72c6070300a0ae2f022d7a8e4e3c201d029c8d78457fb4fdddef4a", null ],
+ [ "LWS_EXT_CB_DESTROY", "group__extensions.html#ggae9993815eee72c6070300a0ae2f022d7a6cbdd5cfd6d39e3cacd4ca02e2ae54e3", null ],
+ [ "LWS_EXT_CB_DESTROY_ANY_WSI_CLOSING", "group__extensions.html#ggae9993815eee72c6070300a0ae2f022d7a05b74161bfab0f815d7fd47b85e20bfc", null ],
+ [ "LWS_EXT_CB_ANY_WSI_ESTABLISHED", "group__extensions.html#ggae9993815eee72c6070300a0ae2f022d7abc92c2b16b0d54b3a9736e62a520a446", null ],
+ [ "LWS_EXT_CB_PACKET_RX_PREPARSE", "group__extensions.html#ggae9993815eee72c6070300a0ae2f022d7a741d5d795895b192cbde6adbc851a822", null ],
+ [ "LWS_EXT_CB_PACKET_TX_PRESEND", "group__extensions.html#ggae9993815eee72c6070300a0ae2f022d7a5a4cacc86ebddc8cb5a3f4ec91ba3fba", null ],
+ [ "LWS_EXT_CB_PACKET_TX_DO_SEND", "group__extensions.html#ggae9993815eee72c6070300a0ae2f022d7a648e8e3988ca8bdf20ddcfd2a14e3f10", null ],
+ [ "LWS_EXT_CB_HANDSHAKE_REPLY_TX", "group__extensions.html#ggae9993815eee72c6070300a0ae2f022d7ac5d7be02c676c836bb8ec448803dd606", null ],
+ [ "LWS_EXT_CB_FLUSH_PENDING_TX", "group__extensions.html#ggae9993815eee72c6070300a0ae2f022d7ae57bedd24d5a29f5f381f8155c2ab3b8", null ],
+ [ "LWS_EXT_CB_EXTENDED_PAYLOAD_RX", "group__extensions.html#ggae9993815eee72c6070300a0ae2f022d7ac2af19277affbbc731379ddfb38f820e", null ],
+ [ "LWS_EXT_CB_CAN_PROXY_CLIENT_CONNECTION", "group__extensions.html#ggae9993815eee72c6070300a0ae2f022d7a0b220da55b7d7a9579175f1ec81579fb", null ],
+ [ "LWS_EXT_CB_1HZ", "group__extensions.html#ggae9993815eee72c6070300a0ae2f022d7aa6d94d15f31176a4e1214c4c31edd5f8", null ],
+ [ "LWS_EXT_CB_REQUEST_ON_WRITEABLE", "group__extensions.html#ggae9993815eee72c6070300a0ae2f022d7a246b82fadb41dc04cf4d40fd42987458", null ],
+ [ "LWS_EXT_CB_IS_WRITEABLE", "group__extensions.html#ggae9993815eee72c6070300a0ae2f022d7a862b122e8f17a50f5ab6e7b56087c09c", null ],
+ [ "LWS_EXT_CB_PAYLOAD_TX", "group__extensions.html#ggae9993815eee72c6070300a0ae2f022d7aaf81548db378fa156a7cf290abff87ad", null ],
+ [ "LWS_EXT_CB_PAYLOAD_RX", "group__extensions.html#ggae9993815eee72c6070300a0ae2f022d7a22a8130d0db03d62154d0502b1737a48", null ],
+ [ "LWS_EXT_CB_OPTION_DEFAULT", "group__extensions.html#ggae9993815eee72c6070300a0ae2f022d7a270b950562f97510ec06b02dbcbace11", null ],
+ [ "LWS_EXT_CB_OPTION_SET", "group__extensions.html#ggae9993815eee72c6070300a0ae2f022d7aa4eb48182ed8bd10d257df5a8b154cc2", null ],
+ [ "LWS_EXT_CB_OPTION_CONFIRM", "group__extensions.html#ggae9993815eee72c6070300a0ae2f022d7ad426ef79eec1b6e036118f64e6fa62f5", null ],
+ [ "LWS_EXT_CB_NAMED_OPTION_SET", "group__extensions.html#ggae9993815eee72c6070300a0ae2f022d7a25ceebb1ee06c2f0963b44165065efb9", null ]
+ ] ],
+ [ "lws_gs_event", "group__generic-sessions.html#gaa93946b3d921072209d5cd8cdfa5332e", [
+ [ "LWSGSE_CREATED", "group__generic-sessions.html#ggaa93946b3d921072209d5cd8cdfa5332ea596010a165bf13473c5eea3a34cd4308", null ],
+ [ "LWSGSE_DELETED", "group__generic-sessions.html#ggaa93946b3d921072209d5cd8cdfa5332ead908cdc5689c5d22c9d3c8934e94dcde", null ]
+ ] ],
+ [ "lws_log_levels", "group__log.html#ga14542b84d2c76efa7814124bb10f9c5f", [
+ [ "LLL_ERR", "group__log.html#gga14542b84d2c76efa7814124bb10f9c5faff4895280366d59ef0c5e9f4578241af", null ],
+ [ "LLL_WARN", "group__log.html#gga14542b84d2c76efa7814124bb10f9c5faa12195bd6dd442763a8321c463a2c906", null ],
+ [ "LLL_NOTICE", "group__log.html#gga14542b84d2c76efa7814124bb10f9c5fad40a82f6c94e6408dd003cf3f0231212", null ],
+ [ "LLL_INFO", "group__log.html#gga14542b84d2c76efa7814124bb10f9c5fa52e5cd60bbb85f30ec0078a2c4be0c59", null ],
+ [ "LLL_DEBUG", "group__log.html#gga14542b84d2c76efa7814124bb10f9c5fad0b18841adbb4792c39981ec05702744", null ],
+ [ "LLL_PARSER", "group__log.html#gga14542b84d2c76efa7814124bb10f9c5fa2be9c1d50d05756078e9abc72c9e50cc", null ],
+ [ "LLL_HEADER", "group__log.html#gga14542b84d2c76efa7814124bb10f9c5facef27c02b70f1bc9140685bdfafe0942", null ],
+ [ "LLL_EXT", "group__log.html#gga14542b84d2c76efa7814124bb10f9c5fa6353ac9650d35e8958981eebcb4b67a9", null ],
+ [ "LLL_CLIENT", "group__log.html#gga14542b84d2c76efa7814124bb10f9c5fa083a44e71966a0e768426e477e1bc358", null ],
+ [ "LLL_LATENCY", "group__log.html#gga14542b84d2c76efa7814124bb10f9c5fae4235ca28326353e283bc7dd1b39bd86", null ],
+ [ "LLL_COUNT", "group__log.html#gga14542b84d2c76efa7814124bb10f9c5faacc8fe5891eba3cf4537bee50eaaa8fa", null ]
+ ] ],
+ [ "lws_mount_protocols", "group__vhost-mounts.html#ga31eca18e50cb4357480f2fcad36ff437", [
+ [ "LWSMPRO_HTTP", "group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437a1e9f0842b0e85db50fe648ed4ba9a4b0", null ],
+ [ "LWSMPRO_HTTPS", "group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437afbd10eb4777517ed1f6bfdcf3b9ea1d1", null ],
+ [ "LWSMPRO_FILE", "group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437a42f2361cfe76cd287fa8fcfc502357e2", null ],
+ [ "LWSMPRO_CGI", "group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437a13ab58b01ac6e05f595977f1e0f0db69", null ],
+ [ "LWSMPRO_REDIR_HTTP", "group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437aec137a2434851bd856ceebfb697b9970", null ],
+ [ "LWSMPRO_REDIR_HTTPS", "group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437a8894d16316863077dfe530963ca59f67", null ],
+ [ "LWSMPRO_CALLBACK", "group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437a946a88cf9c852eed2c0317f4115d19da", null ]
+ ] ],
+ [ "lws_spa_fileupload_states", "group__form-parsing.html#ga41a74a822771d3dce89751aa3bce28ae", [
+ [ "LWS_UFS_CONTENT", "group__form-parsing.html#gga41a74a822771d3dce89751aa3bce28aead3a958e7719ac273c3ba4f684f00c87f", null ],
+ [ "LWS_UFS_FINAL_CONTENT", "group__form-parsing.html#gga41a74a822771d3dce89751aa3bce28aea6ce2a55a4c3695cdb640c893d95bd3a7", null ],
+ [ "LWS_UFS_OPEN", "group__form-parsing.html#gga41a74a822771d3dce89751aa3bce28aea2d25de44865bd44e5a3903a2bab9ca83", null ]
+ ] ],
+ [ "lws_token_indexes", "group__HTTP-headers-read.html#ga6e747906f9d76532ec118d6ef418b82e", [
+ [ "WSI_TOKEN_GET_URI", "group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82eae6286060884d4c80a88fa94fec58dda3", null ],
+ [ "WSI_TOKEN_POST_URI", "group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82ea751322eb9f58fa33bf1f6e4923ff9abb", null ],
+ [ "WSI_TOKEN_OPTIONS_URI", "group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82eab2339b9e75c79dae3547255d1fb046cd", null ],
+ [ "WSI_TOKEN_HOST", "group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82ea669e4eea57595f569f329bfba900a15d", null ],
+ [ "WSI_TOKEN_CONNECTION", "group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82eab460c34b18e1ae54219c3fb9e60544ef", null ],
+ [ "WSI_TOKEN_UPGRADE", "group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82eaab4585e187936b4f2abf22e9138ee271", null ],
+ [ "WSI_TOKEN_ORIGIN", "group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82eac9a937e393da4c3a77cf82463265dcee", null ],
+ [ "WSI_TOKEN_DRAFT", "group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82ea3cf47b821d473b717002b22619a9814e", null ],
+ [ "WSI_TOKEN_CHALLENGE", "group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82eaf48e3b9c89dba34054ea0833dbad4b57", null ],
+ [ "WSI_TOKEN_EXTENSIONS", "group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82ea138fedfdb81765272d22b0eca9aec22b", null ],
+ [ "WSI_TOKEN_KEY1", "group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82eadbb64ba8a29fee913ded2163a5d16615", null ],
+ [ "WSI_TOKEN_KEY2", "group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82ea0dd5ce6fa8932e0d378b86c393d8f726", null ],
+ [ "WSI_TOKEN_PROTOCOL", "group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82eac7157acd472d24de05aee3de57b8dc8a", null ],
+ [ "WSI_TOKEN_ACCEPT", "group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82ea166e60d6689436c1fb9169438d5db1b9", null ],
+ [ "WSI_TOKEN_NONCE", "group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82ea3fd7c7c9587953adc8f317a615df6b83", null ],
+ [ "WSI_TOKEN_HTTP", "group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82ea70b452bb6ce670e32c30fa237bceb731", null ],
+ [ "WSI_TOKEN_HTTP2_SETTINGS", "group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82ead603502e2545c533c4c01ba39e35a2b0", null ],
+ [ "WSI_TOKEN_HTTP_ACCEPT", "group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82ea3ef26b531c1c2416850ebd539f08ba5e", null ],
+ [ "WSI_TOKEN_HTTP_AC_REQUEST_HEADERS", "group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82eae215f7e72fea4458fd971cdcb45d8e04", null ],
+ [ "WSI_TOKEN_HTTP_IF_MODIFIED_SINCE", "group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82ea78fbb32e1809d5767e55de3181d454b0", null ],
+ [ "WSI_TOKEN_HTTP_IF_NONE_MATCH", "group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82ea57ff348ebbae88bf904bc64ef284d83b", null ],
+ [ "WSI_TOKEN_HTTP_ACCEPT_ENCODING", "group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82eaba11ed0aa8c8c7bd71d971a234df0a72", null ],
+ [ "WSI_TOKEN_HTTP_ACCEPT_LANGUAGE", "group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82ea549fcdd8300f0c7434289db6326ec06a", null ],
+ [ "WSI_TOKEN_HTTP_PRAGMA", "group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82eaeef14469c992ebb09a43a8548db37401", null ],
+ [ "WSI_TOKEN_HTTP_CACHE_CONTROL", "group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82ea8d9809cf381705f73af48d8f6809412b", null ],
+ [ "WSI_TOKEN_HTTP_AUTHORIZATION", "group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82eae5d5ca0131fbea1df03d7ad6d69ebfbd", null ],
+ [ "WSI_TOKEN_HTTP_COOKIE", "group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82ea8913c5b1378b1ffad7e2da975c454d15", null ],
+ [ "WSI_TOKEN_HTTP_CONTENT_LENGTH", "group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82ea0784fa0e5bdbacd1e14c2d6ba0c42992", null ],
+ [ "WSI_TOKEN_HTTP_CONTENT_TYPE", "group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82ead32022a286b9cc6fbe60b1a0411370a7", null ],
+ [ "WSI_TOKEN_HTTP_DATE", "group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82eaec821397393facee38ddd4119473b992", null ],
+ [ "WSI_TOKEN_HTTP_RANGE", "group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82eaa0cad0c7a20ac23945a33dbc3d726718", null ],
+ [ "WSI_TOKEN_HTTP_REFERER", "group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82ea7708c82134391d257d6c354ae7bf1429", null ],
+ [ "WSI_TOKEN_KEY", "group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82ea1347e093d73e88489ba3ebda56a393a5", null ],
+ [ "WSI_TOKEN_VERSION", "group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82ea525ee6d2330fca0929df75ffb8dec68e", null ],
+ [ "WSI_TOKEN_SWORIGIN", "group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82eadb08a1c7b1f76e2962d44149bf488bf8", null ],
+ [ "WSI_TOKEN_HTTP_COLON_AUTHORITY", "group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82eaec69fb61493d1c67316c02259b86bdc2", null ],
+ [ "WSI_TOKEN_HTTP_COLON_METHOD", "group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82ea832a110c8b9eb42890f252a756c81bde", null ],
+ [ "WSI_TOKEN_HTTP_COLON_PATH", "group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82eaf567d4d400062fab44f1b96c64cb93ac", null ],
+ [ "WSI_TOKEN_HTTP_COLON_SCHEME", "group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82eaae70d627de34f9c881445f6fbcfcc2dd", null ],
+ [ "WSI_TOKEN_HTTP_COLON_STATUS", "group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82ea277d11b0d5e7fdfc6b5fb45470e6f63e", null ],
+ [ "WSI_TOKEN_HTTP_ACCEPT_CHARSET", "group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82eaa76ea751f1ee86567d27e9e30075d6db", null ],
+ [ "WSI_TOKEN_HTTP_ACCEPT_RANGES", "group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82ea63e1e08da7555313caf632a819db27d4", null ],
+ [ "WSI_TOKEN_HTTP_ACCESS_CONTROL_ALLOW_ORIGIN", "group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82ea03293996964a8bb617215508908048d4", null ],
+ [ "WSI_TOKEN_HTTP_AGE", "group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82eae9d2323ce213a112ac90361f04a1ee5a", null ],
+ [ "WSI_TOKEN_HTTP_ALLOW", "group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82ea5e005569744e3246ba40d524f9a84fe4", null ],
+ [ "WSI_TOKEN_HTTP_CONTENT_DISPOSITION", "group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82ea2be8537e80387a88197d3ed62ac3b954", null ],
+ [ "WSI_TOKEN_HTTP_CONTENT_ENCODING", "group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82ea569588399651cdd6b81de40be4b73fd8", null ],
+ [ "WSI_TOKEN_HTTP_CONTENT_LANGUAGE", "group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82ea0830a0c1c62c444ade7cf15599e92345", null ],
+ [ "WSI_TOKEN_HTTP_CONTENT_LOCATION", "group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82ea6164d17e9598f89c822b4be55814de0a", null ],
+ [ "WSI_TOKEN_HTTP_CONTENT_RANGE", "group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82ea8d7393b324a076186bbde01a2cfe6b62", null ],
+ [ "WSI_TOKEN_HTTP_ETAG", "group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82ea220975eeb65cac57691adb3761a492bb", null ],
+ [ "WSI_TOKEN_HTTP_EXPECT", "group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82ea1d41be78df2704c54b906f7f0abbaa30", null ],
+ [ "WSI_TOKEN_HTTP_EXPIRES", "group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82ea7892390328672ed812b3b68bc3e0fe40", null ],
+ [ "WSI_TOKEN_HTTP_FROM", "group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82ea1ee866e12a483229599f4e3cfc358b36", null ],
+ [ "WSI_TOKEN_HTTP_IF_MATCH", "group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82ea385f0e1933f81529307fff61eb08ff8d", null ],
+ [ "WSI_TOKEN_HTTP_IF_RANGE", "group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82ea598578cda71fe6ca34320bbd6ba1e887", null ],
+ [ "WSI_TOKEN_HTTP_IF_UNMODIFIED_SINCE", "group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82ea2efae4ba6646ba040c371706f7f3a125", null ],
+ [ "WSI_TOKEN_HTTP_LAST_MODIFIED", "group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82ea05c73ad09f25570a50068de13333e41a", null ],
+ [ "WSI_TOKEN_HTTP_LINK", "group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82ea52a30bd1a5ca619ab19bb8178138e42f", null ],
+ [ "WSI_TOKEN_HTTP_LOCATION", "group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82eae24b2d70918c70e034ff574a516e0023", null ],
+ [ "WSI_TOKEN_HTTP_MAX_FORWARDS", "group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82ea3ac4744411849aff89001ee0350aed75", null ],
+ [ "WSI_TOKEN_HTTP_PROXY_AUTHENTICATE", "group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82ea86b3c4cf71dc5c5b441243db99ca696a", null ],
+ [ "WSI_TOKEN_HTTP_PROXY_AUTHORIZATION", "group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82ea11ed9b0cc3b4525c830de7185fd8d7df", null ],
+ [ "WSI_TOKEN_HTTP_REFRESH", "group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82ea9004d6ff6b16b8877f760545a3c7be60", null ],
+ [ "WSI_TOKEN_HTTP_RETRY_AFTER", "group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82ea78834452a5833032294abe1aa42055c6", null ],
+ [ "WSI_TOKEN_HTTP_SERVER", "group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82ea56913c617d46273743bb187bcd8e90c2", null ],
+ [ "WSI_TOKEN_HTTP_SET_COOKIE", "group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82ea439ada24e20de209e08e7dd398ca61ac", null ],
+ [ "WSI_TOKEN_HTTP_STRICT_TRANSPORT_SECURITY", "group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82eaa566f2c37d9a459ca95eee347cca68d0", null ],
+ [ "WSI_TOKEN_HTTP_TRANSFER_ENCODING", "group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82ea693a74f3cd695016120bfdae3d3ced1a", null ],
+ [ "WSI_TOKEN_HTTP_USER_AGENT", "group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82ea0a3c723f67cb6d95dba0c0ccc7d898f8", null ],
+ [ "WSI_TOKEN_HTTP_VARY", "group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82eadff4760ab45fc182ab1e1fb68afa6714", null ],
+ [ "WSI_TOKEN_HTTP_VIA", "group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82eabfb2738a1148ec7c039f2af640b28430", null ],
+ [ "WSI_TOKEN_HTTP_WWW_AUTHENTICATE", "group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82eaf2b7eac7ff98aea6d9b240f6f51995c3", null ],
+ [ "WSI_TOKEN_PATCH_URI", "group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82eae898ee2a1e374f7d98aa483940c91511", null ],
+ [ "WSI_TOKEN_PUT_URI", "group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82eaf64cb8232e172aaa019c38b398d0a0bb", null ],
+ [ "WSI_TOKEN_DELETE_URI", "group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82ea8f6a44a37c29cb5ade4c5989467a880b", null ],
+ [ "WSI_TOKEN_HTTP_URI_ARGS", "group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82ea7460d076c52a9fae65c9e00bac05ef19", null ],
+ [ "WSI_TOKEN_PROXY", "group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82eaee14b94fcd4ab788e313e0789bec0cdc", null ],
+ [ "WSI_TOKEN_HTTP_X_REAL_IP", "group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82ea7e80eff7eefa68741f0a776d6d8feeae", null ],
+ [ "WSI_TOKEN_HTTP1_0", "group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82eafc1e8568187b2de76e2ddd5cc692908e", null ],
+ [ "_WSI_TOKEN_CLIENT_SENT_PROTOCOLS", "group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82ea157c1db7d8edd3cd3b649e7756a559c8", null ],
+ [ "_WSI_TOKEN_CLIENT_PEER_ADDRESS", "group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82ea5dcd48b2643d8a82a97b7abbc3928ea8", null ],
+ [ "_WSI_TOKEN_CLIENT_URI", "group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82ea21ac48d2a499f6afa44cee92cebd8ae3", null ],
+ [ "_WSI_TOKEN_CLIENT_HOST", "group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82ea228ece9e187ddbb80236851e9a09145c", null ],
+ [ "_WSI_TOKEN_CLIENT_ORIGIN", "group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82eaa84e4902ebeb7ab468e3a4bd4acf4f90", null ],
+ [ "_WSI_TOKEN_CLIENT_METHOD", "group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82ea3733863fb466c1df6b00c9384a53e544", null ],
+ [ "WSI_TOKEN_COUNT", "group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82ea883a86db0c05266214affd78d37e871f", null ],
+ [ "WSI_TOKEN_NAME_PART", "group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82eaa8c8eb9b32feb43ec214d8469655a0df", null ],
+ [ "WSI_TOKEN_SKIPPING", "group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82eab0926aa28ea9bb73d2b0124c05c30a78", null ],
+ [ "WSI_TOKEN_SKIPPING_SAW_CR", "group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82ea8ff0b2f6666e008de14d9b9721b87ead", null ],
+ [ "WSI_PARSING_COMPLETE", "group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82ea428409a7aaea6446b660574e4097c0bd", null ],
+ [ "WSI_INIT_TOKEN_MUXURL", "group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82ea400831fe4ba52d4c454364a81ea3bfe4", null ]
+ ] ],
+ [ "lws_write_protocol", "group__sending-data.html#ga98b099cf8c1c7e38ad78501f270e193d", [
+ [ "LWS_WRITE_TEXT", "group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193da80e8f169fda236c56bfb795ed62903db", null ],
+ [ "LWS_WRITE_BINARY", "group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193daf6486c0dba50c44198100717721d9ab2", null ],
+ [ "LWS_WRITE_CONTINUATION", "group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193da10047eb05b5e1c298151dc47a5b44826", null ],
+ [ "LWS_WRITE_HTTP", "group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193dabb6705e1d1327cdda5025be28f07712e", null ],
+ [ "LWS_WRITE_PING", "group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193da6e556322ff8f205bf311608f7f6e6559", null ],
+ [ "LWS_WRITE_PONG", "group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193dab7e7a62cf6f456c09c21dff24dad9039", null ],
+ [ "LWS_WRITE_HTTP_FINAL", "group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193dae7d8a025a65524652fe9e24c2654c935", null ],
+ [ "LWS_WRITE_HTTP_HEADERS", "group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193dafe5a38e940ce56708ac814627e9c0917", null ],
+ [ "LWS_WRITE_NO_FIN", "group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193da115440f272a5d55518adfc8099acfee3", null ],
+ [ "LWS_WRITE_CLIENT_IGNORE_XOR_MASK", "group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193da220d8e8652d9b97fb66e476e2a60ffce", null ]
+ ] ],
+ [ "lwsgs_auth_bits", "group__generic-sessions.html#ga7c2dc7bfb4ccb91c5d771f9e9ea237e1", [
+ [ "LWSGS_AUTH_LOGGED_IN", "group__generic-sessions.html#gga7c2dc7bfb4ccb91c5d771f9e9ea237e1a81e63075115dedd150265d81b8f7fa57", null ],
+ [ "LWSGS_AUTH_ADMIN", "group__generic-sessions.html#gga7c2dc7bfb4ccb91c5d771f9e9ea237e1a0657a9e846814781b128c397fe4b10bf", null ],
+ [ "LWSGS_AUTH_VERIFIED", "group__generic-sessions.html#gga7c2dc7bfb4ccb91c5d771f9e9ea237e1a5a607e4668d20cadada62c4b8007f887", null ],
+ [ "LWSGS_AUTH_FORGOT_FLOW", "group__generic-sessions.html#gga7c2dc7bfb4ccb91c5d771f9e9ea237e1a2cd8fb86e3b85c106e7711c03f0ddd0a", null ]
+ ] ],
+ [ "lwsgs_smtp_states", "group__smtp.html#ga116be79bf44f9dc2a97f46e051fe4dc0", [
+ [ "LGSSMTP_IDLE", "group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a29e5b0ecf75375b5a643faa3d6222b7c", null ],
+ [ "LGSSMTP_CONNECTING", "group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0ab89442b7a3ca2b94c3cdcf33756eb933", null ],
+ [ "LGSSMTP_CONNECTED", "group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0ab61778f70ecac007b334bb14942eb41d", null ],
+ [ "LGSSMTP_SENT_HELO", "group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a1dfec948a864205cec875f63cbe0d4ad", null ],
+ [ "LGSSMTP_SENT_FROM", "group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a929bb4623ff3f585108aba2a1b047fab", null ],
+ [ "LGSSMTP_SENT_TO", "group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0aae20a0cb95b97a70f6b45d0ed2d5be83", null ],
+ [ "LGSSMTP_SENT_DATA", "group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a85e3c452950c09a79086bff4b9be5c14", null ],
+ [ "LGSSMTP_SENT_BODY", "group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a38fba41f28d754e38079b31418a86a69", null ],
+ [ "LGSSMTP_SENT_QUIT", "group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a2c2ed16ffc572326e3040684084b21d5", null ]
+ ] ],
+ [ "pending_timeout", "group__timeout.html#ga2c0aa4b9c3c55bae7b35cbfac3246c87", [
+ [ "NO_PENDING_TIMEOUT", "group__timeout.html#gga2c0aa4b9c3c55bae7b35cbfac3246c87a65785467c0b560bead865231fdd405d7", null ],
+ [ "PENDING_TIMEOUT_AWAITING_PROXY_RESPONSE", "group__timeout.html#gga2c0aa4b9c3c55bae7b35cbfac3246c87ad7ebebb506afd30c48e1e5e3a578cd30", null ],
+ [ "PENDING_TIMEOUT_AWAITING_CONNECT_RESPONSE", "group__timeout.html#gga2c0aa4b9c3c55bae7b35cbfac3246c87a52236b42ec5ffe65d4cdbadeb6c4fcb0", null ],
+ [ "PENDING_TIMEOUT_ESTABLISH_WITH_SERVER", "group__timeout.html#gga2c0aa4b9c3c55bae7b35cbfac3246c87a0eef059426f37d00b75142d4dc3e25e3", null ],
+ [ "PENDING_TIMEOUT_AWAITING_SERVER_RESPONSE", "group__timeout.html#gga2c0aa4b9c3c55bae7b35cbfac3246c87a1104c39d0177378713a9332ab7a9d7fe", null ],
+ [ "PENDING_TIMEOUT_AWAITING_PING", "group__timeout.html#gga2c0aa4b9c3c55bae7b35cbfac3246c87a211dd9910c37aa3a3a45fd532c76bf6e", null ],
+ [ "PENDING_TIMEOUT_CLOSE_ACK", "group__timeout.html#gga2c0aa4b9c3c55bae7b35cbfac3246c87ab20463ee983bcd68cd8a501319da56d3", null ],
+ [ "PENDING_TIMEOUT_AWAITING_EXTENSION_CONNECT_RESPONSE", "group__timeout.html#gga2c0aa4b9c3c55bae7b35cbfac3246c87a13527b2b1f61d9b2709eb432acd0a248", null ],
+ [ "PENDING_TIMEOUT_SENT_CLIENT_HANDSHAKE", "group__timeout.html#gga2c0aa4b9c3c55bae7b35cbfac3246c87a44feda6cc9507a8613b9263b1acc8ce1", null ],
+ [ "PENDING_TIMEOUT_SSL_ACCEPT", "group__timeout.html#gga2c0aa4b9c3c55bae7b35cbfac3246c87a7d5b3bcc88ccbddfa57674e174a78c2d", null ],
+ [ "PENDING_TIMEOUT_HTTP_CONTENT", "group__timeout.html#gga2c0aa4b9c3c55bae7b35cbfac3246c87ae8b3de955cec5da5ea52fe040f914501", null ],
+ [ "PENDING_TIMEOUT_AWAITING_CLIENT_HS_SEND", "group__timeout.html#gga2c0aa4b9c3c55bae7b35cbfac3246c87aaf69f440c2e000787efae5ad6f39e74c", null ],
+ [ "PENDING_FLUSH_STORED_SEND_BEFORE_CLOSE", "group__timeout.html#gga2c0aa4b9c3c55bae7b35cbfac3246c87a0d6b956db11acb6d263af3ea054a914e", null ],
+ [ "PENDING_TIMEOUT_SHUTDOWN_FLUSH", "group__timeout.html#gga2c0aa4b9c3c55bae7b35cbfac3246c87a11292263c9eccd090294e7e316200d7f", null ],
+ [ "PENDING_TIMEOUT_CGI", "group__timeout.html#gga2c0aa4b9c3c55bae7b35cbfac3246c87a73f61afae387e16f7ab8a4f299aca8d2", null ],
+ [ "PENDING_TIMEOUT_HTTP_KEEPALIVE_IDLE", "group__timeout.html#gga2c0aa4b9c3c55bae7b35cbfac3246c87a5fe48ea6f3f5363cca55d39b78490b45", null ]
+ ] ],
+ [ "_lws_log", "group__log.html#gaf5f07837692b2f231a79da8a058288aa", null ],
+ [ "_lws_logv", "group__log.html#ga74eb146969f0595e12ea835851b4588e", null ],
+ [ "lws_add_http_header_by_name", "group__HTTP-headers-create.html#ga2b36bf44405755ff51c1939303b995a8", null ],
+ [ "lws_add_http_header_by_token", "group__HTTP-headers-create.html#gaf74adb761b22566ad70004882712dce1", null ],
+ [ "lws_add_http_header_content_length", "group__HTTP-headers-create.html#gacc76a5babcb4dce1b01b1955aa7a2faf", null ],
+ [ "lws_add_http_header_status", "group__HTTP-headers-create.html#ga29b7d6d2ddfdbaff3d8b607e7e3151b6", null ],
+ [ "lws_adopt_socket", "group__sock-adopt.html#gabe71b7462afb21c767bdc67334f305af", null ],
+ [ "lws_adopt_socket_readbuf", "group__sock-adopt.html#gab2d045df0f81afe00891aaed312d552b", null ],
+ [ "lws_b64_decode_string", "group__sha.html#ga66316e6a5a0644a09d5a10e919dfdd8d", null ],
+ [ "lws_b64_encode_string", "group__sha.html#gaf39765e4a3b413efb65e4698b2ec3575", null ],
+ [ "lws_callback_all_protocol", "group__callback-when-writeable.html#gacf04bbe089f47c971c6408c5efe2ac70", null ],
+ [ "lws_callback_all_protocol_vhost", "group__callback-when-writeable.html#ga13c984d8c5a44a745fd02bc2fba36053", null ],
+ [ "lws_callback_on_writable", "group__callback-when-writeable.html#ga941caaa468bc507b1cae52275f58800d", null ],
+ [ "lws_callback_on_writable_all_protocol", "group__callback-when-writeable.html#gabbe4655c7eeb3eb1671b2323ec6b3107", null ],
+ [ "lws_callback_on_writable_all_protocol_vhost", "group__callback-when-writeable.html#ga8570860e191b62db264f2bac67354ea8", null ],
+ [ "lws_callback_vhost_protocols", "group__callback-when-writeable.html#ga60939cf0c073d933fde3d17f3591caf5", null ],
+ [ "lws_cancel_service", "group__service.html#ga53e3d0801dfda7960a7249dd559e68a2", null ],
+ [ "lws_cancel_service_pt", "group__service.html#ga29c246707997ab7a466aa709aecd2d7b", null ],
+ [ "lws_canonical_hostname", "group__net.html#gad0df22db2be9fc65a667a1e83f9a92a4", null ],
+ [ "lws_cgi", "libwebsockets_8h.html#af52923473c59e643a974d65e12290831", null ],
+ [ "lws_cgi_kill", "libwebsockets_8h.html#a27bb0b3cdcd0af839c928c253b521ff4", null ],
+ [ "lws_cgi_write_split_stdout_headers", "libwebsockets_8h.html#a5326d3402af8429a166dd991dc65c4a2", null ],
+ [ "lws_chunked_html_process", "group__html-chunked-substitution.html#ga643073f918c0a7016b690aae9793fd60", null ],
+ [ "lws_client_connect", "group__client.html#ga4af0a20108a95e8b6d94dd4d80055ff3", null ],
+ [ "lws_client_connect_extended", "group__client.html#gac6a8558b4410961a880241c2ac1271e2", null ],
+ [ "lws_client_connect_via_info", "group__client.html#gac30a7be106abd0cedfbb2e8b8fe3a2f5", null ],
+ [ "lws_close_reason", "group__wsclose.html#gaa1c863415d1783cd8de7938aa6efa262", null ],
+ [ "lws_context_destroy", "group__context-and-vhost.html#ga8ee0314028755f1ddfa9428e09b4fddb", null ],
+ [ "lws_context_user", "group__context-and-vhost.html#gaeb12f934bfd178bd2132a9e73fc641da", null ],
+ [ "lws_create_context", "group__context-and-vhost.html#gaf2fff58562caab7510c41eeac85a8648", null ],
+ [ "lws_create_vhost", "group__context-and-vhost.html#ga0c54c667ccd9b8b3dddcd123ca72f87c", null ],
+ [ "lws_daemonize", "group__misc.html#gace5171b1dbbc03ec89a98f8afdb5c9af", null ],
+ [ "lws_email_check", "group__smtp.html#ga5e535e346d92a9daf00be33abf79d4eb", null ],
+ [ "lws_email_destroy", "group__smtp.html#ga25298a5afc1074e13b2d5711a86432b2", null ],
+ [ "lws_email_init", "group__smtp.html#ga77fc9b56a1bb39484844981ec375fc29", null ],
+ [ "lws_ev_initloop", "group__ev.html#ga3fdd23ded693b21853356dc9eaef5ccc", null ],
+ [ "lws_ev_sigint_cb", "group__ev.html#gaabfc0880d6a98133550c61aa01ef3563", null ],
+ [ "lws_ev_sigint_cfg", "group__ev.html#ga5caf14a420a2a0bd687a1fc952f8d64e", null ],
+ [ "lws_ext_parse_options", "group__extensions.html#ga6fb3e2c3dfb9d64dc87026a4e99c128b", null ],
+ [ "lws_extension_callback_pm_deflate", "group__extensions.html#ga4cdbe42d872e21a448a947714d6c607e", null ],
+ [ "lws_finalize_http_header", "group__HTTP-headers-create.html#ga4887605ff2242a54db3a7fa01f6f864b", null ],
+ [ "lws_finalize_startup", "group__Protocols-and-Plugins.html#ga106b37ae9c247e84d191ab09441adc43", null ],
+ [ "lws_frame_is_binary", "group__wsstatus.html#gaccd9c59336efad8af0554f79cc5966fd", null ],
+ [ "lws_get_child", "group__misc.html#gacae4d7b6a8d22e4c2d82ff8b12c1e234", null ],
+ [ "lws_get_context", "group__misc.html#ga0af4f7d2dd375aeedcfa7eb0e1101c4b", null ],
+ [ "lws_get_count_threads", "group__misc.html#ga629f48268fd1856b54b11172991b97d9", null ],
+ [ "lws_get_fops", "group__fops.html#gac08aef64c4c34647ed699b24759b6b0e", null ],
+ [ "lws_get_library_version", "group__misc.html#gac6abfc0b2bd5b2f09281a4432bb2f5f0", null ],
+ [ "lws_get_parent", "group__misc.html#ga8930fe36a3f3eefe4a6a4fd499d8e899", null ],
+ [ "lws_get_peer_addresses", "group__net.html#ga092e5f473b3347f03ffeef8a950080f3", null ],
+ [ "lws_get_peer_simple", "group__net.html#gad01014fed09759741b6d23afccfdaacc", null ],
+ [ "lws_get_peer_write_allowance", "group__callback-when-writeable.html#gac4643fe16b0940ae5b68b4ee6195cbde", null ],
+ [ "lws_get_protocol", "group__Protocols-and-Plugins.html#ga72ad550786ca7976463589d347e62112", null ],
+ [ "lws_get_random", "group__misc.html#ga58f906c6be0ca80efd813f694569dd4a", null ],
+ [ "lws_get_reserved_bits", "group__wsstatus.html#ga3df5045656dfb6b0e63a38de2dca79d2", null ],
+ [ "lws_get_socket_fd", "group__callback-when-writeable.html#gaa709e02a10558753c851e58f1e2c16ba", null ],
+ [ "lws_get_urlarg_by_name", "group__HTTP-headers-read.html#ga84e9ce5e71a77501a0998ac403a984c2", null ],
+ [ "lws_get_vhost", "group__context-and-vhost.html#ga06e77ce2916f8bc9826ef8d9d68e3932", null ],
+ [ "lws_hdr_copy", "group__HTTP-headers-read.html#ga6ce6aa1c0155ea42b7708bed271d1c77", null ],
+ [ "lws_hdr_copy_fragment", "group__HTTP-headers-read.html#gaa427cad61a9a5e3004afd65c4527b5e9", null ],
+ [ "lws_hdr_fragment_length", "group__HTTP-headers-read.html#ga594f3d0ece5b09c2ccf9f98ea533bb4e", null ],
+ [ "lws_hdr_total_length", "group__HTTP-headers-read.html#ga8ade0e1ffb0da7e62b989d8d867bf6c8", null ],
+ [ "lws_http_client_read", "group__client.html#ga4450c34200bf9dab3beb90ef23221870", null ],
+ [ "lws_http_redirect", "group__http.html#ga8fbf01e473ac421fc33ad9f8da8b8a25", null ],
+ [ "lws_http_transaction_completed", "group__http.html#gad27aed6c66a41b2b89ffe4da2a309e8a", null ],
+ [ "lws_init_vhost_client_ssl", "group__client.html#ga4f44b8230e6732816ca5cd8d1aaaf340", null ],
+ [ "lws_interface_to_sa", "group__net.html#ga869d8bdffb0f2a7ce08e3ce10d6be3d8", null ],
+ [ "lws_is_cgi", "group__wsstatus.html#ga4ad226d5e01024b4046f4a5a37199aa1", null ],
+ [ "lws_is_final_fragment", "group__wsstatus.html#ga08e9ee165fca503fd9427d55cfecac37", null ],
+ [ "lws_is_ssl", "group__wsstatus.html#ga26a140623d202dd2bf2004deb6994baa", null ],
+ [ "lws_json_dump_context", "group__context-and-vhost.html#gae2134657cdd2ea7a59e13ad314e4c50d", null ],
+ [ "lws_json_dump_vhost", "group__context-and-vhost.html#ga94e6cc2223c4eec316b13bcebc3628b6", null ],
+ [ "lws_json_purify", "group__pur.html#gab15187efcfa256b7c928562c182b92a3", null ],
+ [ "lws_libuv_run", "group__uv.html#ga097c89497824d4de225a85a00661fc89", null ],
+ [ "lws_libuv_stop", "group__uv.html#ga3c75cd6ec3f80fc0a0c8ead4c4e71a15", null ],
+ [ "lws_now_secs", "group__misc.html#ga33bf2635033710b25f931b57ed663e1e", null ],
+ [ "lws_parse_uri", "group__misc.html#ga1ec0d9faac5d3a5824d765c287c043aa", null ],
+ [ "lws_partial_buffered", "group__wsstatus.html#gaeca4afc94b1f026034f99cbba37e2f85", null ],
+ [ "lws_protocol_get", "group__Protocols-and-Plugins.html#ga8bbe5e65faca068845704bab911a5030", null ],
+ [ "lws_protocol_vh_priv_get", "group__Protocols-and-Plugins.html#gaf3be4243443baac0f8be1fcfb4d25129", null ],
+ [ "lws_protocol_vh_priv_zalloc", "group__Protocols-and-Plugins.html#gaec0c0477288ff3f83aff38d357b883d1", null ],
+ [ "lws_read", "group__misc.html#ga0e705d498e8c8500649a26ba30a1e106", null ],
+ [ "lws_remaining_packet_payload", "libwebsockets_8h.html#a72fe65e83b8bb03f904a1a256c673536", null ],
+ [ "lws_return_http_status", "group__http.html#gac8a4a71240857dc6b2ed70456b6923f4", null ],
+ [ "lws_rx_flow_allow_all_protocol", "libwebsockets_8h.html#a5e627dbf1db48170ef486edbaf268672", null ],
+ [ "lws_rx_flow_control", "libwebsockets_8h.html#adf4abd01e8c43f07c6e498ce13590c3e", null ],
+ [ "lws_send_pipe_choked", "group__wsstatus.html#ga2bb3655329b4651cd06f79ee3a764421", null ],
+ [ "lws_serve_http_file", "group__httpft.html#gab393a06d3d2722af4c3f8b06842c80d7", null ],
+ [ "lws_serve_http_file_fragment", "group__httpft.html#ga29e1123f6d56cd777b3e5bf9ca40f9e5", null ],
+ [ "lws_service", "group__service.html#gaf95bd0c663d6516a0c80047d9b1167a8", null ],
+ [ "lws_service_fd", "group__service.html#gad82efa5466d14a9f05aa06416375b28d", null ],
+ [ "lws_service_fd_tsi", "group__service.html#gaebf426eda371ba23642fc11d8e0ace6b", null ],
+ [ "lws_service_tsi", "group__service.html#ga9b3cc4473fd8848e5bbee7f310712939", null ],
+ [ "lws_set_allocator", "group__misc.html#gab321ed812f46f6dc7ef9e3ca6f00cf1b", null ],
+ [ "lws_set_extension_option", "group__extensions.html#gae0e24e1768f83a7fb07896ce975704b9", null ],
+ [ "lws_set_log_level", "group__log.html#ga244647f9e1bf0097ccdde66d74f41e26", null ],
+ [ "lws_set_proxy", "group__context-and-vhost.html#ga7e9d5405547a457d86e0b4f0ae2bb1c4", null ],
+ [ "lws_set_timeout", "group__timeout.html#gaced9f9237f6172fed9f730a2af51345a", null ],
+ [ "lws_SHA1", "group__sha.html#ga7b09ab74646266f0b555103b3bb8dfe5", null ],
+ [ "lws_spa_create", "group__form-parsing.html#ga162f86762173a2bc8c28497941d74815", null ],
+ [ "lws_spa_destroy", "group__form-parsing.html#gaaa482f07dad3f04b391cccf0a814e13b", null ],
+ [ "lws_spa_finalize", "group__form-parsing.html#ga83835bf250ee3d4a60f36a182f2b8d24", null ],
+ [ "lws_spa_get_length", "group__form-parsing.html#ga3fbe378632f85ec9a14cc2c1687bf05f", null ],
+ [ "lws_spa_get_string", "group__form-parsing.html#ga2da476217166da02704b90d3a8d4f3cd", null ],
+ [ "lws_spa_process", "group__form-parsing.html#ga9ad9ebf5ea1a7108415ed7e04cb231d2", null ],
+ [ "lws_sql_purify", "group__pur.html#ga9cc82f06e5ae7e71458626d7a39a5865", null ],
+ [ "lws_token_to_string", "group__HTTP-headers-read.html#ga2c0597b2ef1d2cee35736c338bcbd17b", null ],
+ [ "lws_urldecode", "group__urlendec.html#gaa373a9c16acdd96c395af61ab915ece3", null ],
+ [ "lws_urlencode", "group__urlendec.html#gabc2888476e50e001c875c1a8abf455b7", null ],
+ [ "lws_uv_getloop", "group__uv.html#gaa5e3593c94f91910d9d928dfa0c18f6c", null ],
+ [ "lws_uv_initloop", "group__uv.html#gad85ce3bfc53ff754988d36bf5de39e21", null ],
+ [ "lws_uv_sigint_cb", "group__uv.html#gac5f60dba13a45e5d554b4fb7df7b9610", null ],
+ [ "lws_uv_sigint_cfg", "group__uv.html#ga99099e045993383f251a8026e1e40414", null ],
+ [ "lws_vhost_get", "group__context-and-vhost.html#ga8db03e19a372e34ac25cf21af894a02c", null ],
+ [ "lws_vhost_name_to_protocol", "group__Protocols-and-Plugins.html#ga25754726d97c5f519d313e691a9fe29d", null ],
+ [ "lws_write", "group__sending-data.html#gafd5fdd285a0e25ba7e3e1051deec1001", null ],
+ [ "lws_wsi_user", "group__misc.html#gaa194584fff9698f3b280658f770ccd0f", null ],
+ [ "lwsl_emit_syslog", "group__log.html#gab7c0fc936cc9f1eb58e2bb234c15147c", null ],
+ [ "lwsl_hexdump", "group__log.html#ga898b1f03872ad019f507d4e35bbefa90", null ],
+ [ "lwsl_timestamp", "group__log.html#ga42e39775c6b69b7251bdbf5a2cdd5dcd", null ],
+ [ "lwsws_get_config_globals", "group__context-and-vhost.html#ga98d88c9080fd89c37114363a6474ea73", null ],
+ [ "lwsws_get_config_vhosts", "group__context-and-vhost.html#ga341064721add2618ae1b29717493a212", null ],
+ [ "mbed3_create_tcp_stream_socket", "libwebsockets_8h.html#a0b056fdcf949a838ff82209b4a627dd9", null ],
+ [ "mbed3_delete_tcp_stream_socket", "libwebsockets_8h.html#aefb2f20fe5bb29d79701a399838ef4ce", null ],
+ [ "mbed3_tcp_stream_accept", "libwebsockets_8h.html#a9032a3062641d334161c29adcc4fa15d", null ],
+ [ "mbed3_tcp_stream_bind", "libwebsockets_8h.html#a9f2a8506fd963db95a5103823c60fb0a", null ]
+];
\ No newline at end of file
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.11"/>
+<title>libwebsockets: lib/libwebsockets.h Source File</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="libwebsockets.org-logo.png"/></td>
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname">libwebsockets
+ </div>
+ <div id="projectbrief">Lightweight C library for HTML5 websockets</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.11 -->
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main Page</span></a></li>
+ <li><a href="pages.html"><span>Related Pages</span></a></li>
+ <li><a href="modules.html"><span>Modules</span></a></li>
+ <li><a href="annotated.html"><span>Data Structures</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File List</span></a></li>
+ <li><a href="globals.html"><span>Globals</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('libwebsockets_8h_source.html','');});
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="headertitle">
+<div class="title">libwebsockets.h</div> </div>
+</div><!--header-->
+<div class="contents">
+<a href="libwebsockets_8h.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> <span class="comment">/*</span></div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span> <span class="comment"> * libwebsockets - small server side websockets and web server implementation</span></div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span> <span class="comment"> *</span></div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span> <span class="comment"> * Copyright (C) 2010-2016 Andy Green <andy@warmcat.com></span></div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span> <span class="comment"> *</span></div><div class="line"><a name="l00006"></a><span class="lineno"> 6</span> <span class="comment"> * This library is free software; you can redistribute it and/or</span></div><div class="line"><a name="l00007"></a><span class="lineno"> 7</span> <span class="comment"> * modify it under the terms of the GNU Lesser General Public</span></div><div class="line"><a name="l00008"></a><span class="lineno"> 8</span> <span class="comment"> * License as published by the Free Software Foundation:</span></div><div class="line"><a name="l00009"></a><span class="lineno"> 9</span> <span class="comment"> * version 2.1 of the License.</span></div><div class="line"><a name="l00010"></a><span class="lineno"> 10</span> <span class="comment"> *</span></div><div class="line"><a name="l00011"></a><span class="lineno"> 11</span> <span class="comment"> * This library is distributed in the hope that it will be useful,</span></div><div class="line"><a name="l00012"></a><span class="lineno"> 12</span> <span class="comment"> * but WITHOUT ANY WARRANTY; without even the implied warranty of</span></div><div class="line"><a name="l00013"></a><span class="lineno"> 13</span> <span class="comment"> * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU</span></div><div class="line"><a name="l00014"></a><span class="lineno"> 14</span> <span class="comment"> * Lesser General Public License for more details.</span></div><div class="line"><a name="l00015"></a><span class="lineno"> 15</span> <span class="comment"> *</span></div><div class="line"><a name="l00016"></a><span class="lineno"> 16</span> <span class="comment"> * You should have received a copy of the GNU Lesser General Public</span></div><div class="line"><a name="l00017"></a><span class="lineno"> 17</span> <span class="comment"> * License along with this library; if not, write to the Free Software</span></div><div class="line"><a name="l00018"></a><span class="lineno"> 18</span> <span class="comment"> * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,</span></div><div class="line"><a name="l00019"></a><span class="lineno"> 19</span> <span class="comment"> * MA 02110-1301 USA</span></div><div class="line"><a name="l00020"></a><span class="lineno"> 20</span> <span class="comment"> */</span></div><div class="line"><a name="l00021"></a><span class="lineno"> 21</span> </div><div class="line"><a name="l00024"></a><span class="lineno"> 24</span> <span class="preprocessor">#ifndef LIBWEBSOCKET_H_3060898B846849FF9F88F5DB59B5950C</span></div><div class="line"><a name="l00025"></a><span class="lineno"> 25</span> <span class="preprocessor">#define LIBWEBSOCKET_H_3060898B846849FF9F88F5DB59B5950C</span></div><div class="line"><a name="l00026"></a><span class="lineno"> 26</span> </div><div class="line"><a name="l00027"></a><span class="lineno"> 27</span> <span class="preprocessor">#ifdef __cplusplus</span></div><div class="line"><a name="l00028"></a><span class="lineno"> 28</span> <span class="preprocessor">#include <cstddef></span></div><div class="line"><a name="l00029"></a><span class="lineno"> 29</span> <span class="preprocessor">#include <cstdarg></span></div><div class="line"><a name="l00030"></a><span class="lineno"> 30</span> <span class="preprocessor">#ifdef MBED_OPERATORS</span></div><div class="line"><a name="l00031"></a><span class="lineno"> 31</span> <span class="preprocessor">#include "mbed-drivers/mbed.h"</span></div><div class="line"><a name="l00032"></a><span class="lineno"> 32</span> <span class="preprocessor">#include "sal-iface-eth/EthernetInterface.h"</span></div><div class="line"><a name="l00033"></a><span class="lineno"> 33</span> <span class="preprocessor">#include "sockets/TCPListener.h"</span></div><div class="line"><a name="l00034"></a><span class="lineno"> 34</span> <span class="preprocessor">#include "sal-stack-lwip/lwipv4_init.h"</span></div><div class="line"><a name="l00035"></a><span class="lineno"> 35</span> </div><div class="line"><a name="l00036"></a><span class="lineno"> 36</span> <span class="keyword">namespace </span>{</div><div class="line"><a name="l00037"></a><span class="lineno"> 37</span> }</div><div class="line"><a name="l00038"></a><span class="lineno"> 38</span> <span class="keyword">using namespace </span><a class="code" href="namespacembed_1_1Sockets_1_1v0.html">mbed::Sockets::v0</a>;</div><div class="line"><a name="l00039"></a><span class="lineno"> 39</span> </div><div class="line"><a name="l00040"></a><span class="lineno"> 40</span> </div><div class="line"><a name="l00041"></a><span class="lineno"> 41</span> <span class="keyword">struct </span>sockaddr_in;</div><div class="line"><a name="l00042"></a><span class="lineno"> 42</span> <span class="keyword">struct </span>lws;</div><div class="line"><a name="l00043"></a><span class="lineno"> 43</span> </div><div class="line"><a name="l00044"></a><span class="lineno"><a class="line" href="classlws__conn.html"> 44</a></span> <span class="keyword">class </span><a class="code" href="classlws__conn.html">lws_conn</a> {</div><div class="line"><a name="l00045"></a><span class="lineno"> 45</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l00046"></a><span class="lineno"> 46</span>  <a class="code" href="classlws__conn.html">lws_conn</a>():</div><div class="line"><a name="l00047"></a><span class="lineno"> 47</span>  ts(NULL),</div><div class="line"><a name="l00048"></a><span class="lineno"> 48</span>  wsi(NULL),</div><div class="line"><a name="l00049"></a><span class="lineno"> 49</span>  writeable(1),</div><div class="line"><a name="l00050"></a><span class="lineno"> 50</span>  awaiting_on_writeable(0)</div><div class="line"><a name="l00051"></a><span class="lineno"> 51</span>  {</div><div class="line"><a name="l00052"></a><span class="lineno"> 52</span>  }</div><div class="line"><a name="l00053"></a><span class="lineno"> 53</span> </div><div class="line"><a name="l00054"></a><span class="lineno"> 54</span> <span class="keyword">public</span>:</div><div class="line"><a name="l00055"></a><span class="lineno"> 55</span>  <span class="keywordtype">void</span> set_wsi(<span class="keyword">struct</span> lws *_wsi) { wsi = _wsi; }</div><div class="line"><a name="l00056"></a><span class="lineno"> 56</span>  <span class="keywordtype">int</span> actual_onRX(Socket *s);</div><div class="line"><a name="l00057"></a><span class="lineno"> 57</span>  <span class="keywordtype">void</span> onRX(Socket *s);</div><div class="line"><a name="l00058"></a><span class="lineno"> 58</span>  <span class="keywordtype">void</span> onError(Socket *s, socket_error_t err);</div><div class="line"><a name="l00059"></a><span class="lineno"> 59</span>  <span class="keywordtype">void</span> onDisconnect(TCPStream *s);</div><div class="line"><a name="l00060"></a><span class="lineno"> 60</span>  <span class="keywordtype">void</span> onSent(Socket *s, uint16_t len);</div><div class="line"><a name="l00061"></a><span class="lineno"> 61</span>  <span class="keywordtype">void</span> serialized_writeable(<span class="keyword">struct</span> lws *wsi);</div><div class="line"><a name="l00062"></a><span class="lineno"> 62</span> </div><div class="line"><a name="l00063"></a><span class="lineno"> 63</span> <span class="keyword">public</span>:</div><div class="line"><a name="l00064"></a><span class="lineno"> 64</span>  TCPStream *ts;</div><div class="line"><a name="l00065"></a><span class="lineno"> 65</span> </div><div class="line"><a name="l00066"></a><span class="lineno"> 66</span> <span class="keyword">public</span>:</div><div class="line"><a name="l00067"></a><span class="lineno"> 67</span>  <span class="keyword">struct </span>lws *wsi;</div><div class="line"><a name="l00068"></a><span class="lineno"> 68</span>  <span class="keywordtype">char</span> writeable;</div><div class="line"><a name="l00069"></a><span class="lineno"> 69</span>  <span class="keywordtype">char</span> awaiting_on_writeable;</div><div class="line"><a name="l00070"></a><span class="lineno"> 70</span> };</div><div class="line"><a name="l00071"></a><span class="lineno"> 71</span> </div><div class="line"><a name="l00072"></a><span class="lineno"><a class="line" href="classlws__conn__listener.html"> 72</a></span> <span class="keyword">class </span><a class="code" href="classlws__conn__listener.html">lws_conn_listener</a> : <a class="code" href="classlws__conn.html">lws_conn</a> {</div><div class="line"><a name="l00073"></a><span class="lineno"> 73</span> <span class="keyword">public</span>:</div><div class="line"><a name="l00074"></a><span class="lineno"> 74</span>  <a class="code" href="classlws__conn__listener.html">lws_conn_listener</a>():</div><div class="line"><a name="l00075"></a><span class="lineno"> 75</span>  srv(SOCKET_STACK_LWIP_IPV4)</div><div class="line"><a name="l00076"></a><span class="lineno"> 76</span>  {</div><div class="line"><a name="l00077"></a><span class="lineno"> 77</span>  srv.setOnError(TCPStream::ErrorHandler_t(<span class="keyword">this</span>,</div><div class="line"><a name="l00078"></a><span class="lineno"> 78</span>  &<a class="code" href="classlws__conn__listener.html#a271ac4f8ad5770b3bc96cce5b265b72c">lws_conn_listener::onError</a>));</div><div class="line"><a name="l00079"></a><span class="lineno"> 79</span>  }</div><div class="line"><a name="l00080"></a><span class="lineno"> 80</span> </div><div class="line"><a name="l00081"></a><span class="lineno"> 81</span>  <span class="keywordtype">void</span> start(<span class="keyword">const</span> uint16_t port); </div><div class="line"><a name="l00083"></a><span class="lineno"> 83</span> <span class="keyword">protected</span>:</div><div class="line"><a name="l00084"></a><span class="lineno"> 84</span>  <span class="keywordtype">void</span> onRX(Socket *s); </div><div class="line"><a name="l00085"></a><span class="lineno"> 85</span>  <span class="keywordtype">void</span> onError(Socket *s, socket_error_t err); </div><div class="line"><a name="l00086"></a><span class="lineno"> 86</span>  <span class="keywordtype">void</span> onIncoming(TCPListener *s, <span class="keywordtype">void</span> *impl); </div><div class="line"><a name="l00087"></a><span class="lineno"> 87</span>  <span class="keywordtype">void</span> onDisconnect(TCPStream *s); </div><div class="line"><a name="l00089"></a><span class="lineno"> 89</span> <span class="keyword">public</span>:</div><div class="line"><a name="l00090"></a><span class="lineno"> 90</span>  TCPListener srv;</div><div class="line"><a name="l00091"></a><span class="lineno"> 91</span> };</div><div class="line"><a name="l00092"></a><span class="lineno"> 92</span> </div><div class="line"><a name="l00093"></a><span class="lineno"> 93</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l00094"></a><span class="lineno"> 94</span> </div><div class="line"><a name="l00095"></a><span class="lineno"> 95</span> <span class="keyword">extern</span> <span class="stringliteral">"C"</span> {</div><div class="line"><a name="l00096"></a><span class="lineno"> 96</span> <span class="preprocessor">#else</span></div><div class="line"><a name="l00097"></a><span class="lineno"> 97</span> <span class="preprocessor">#include <stdarg.h></span></div><div class="line"><a name="l00098"></a><span class="lineno"> 98</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l00099"></a><span class="lineno"> 99</span> </div><div class="line"><a name="l00100"></a><span class="lineno"> 100</span> <span class="preprocessor">#ifdef MBED_OPERATORS</span></div><div class="line"><a name="l00101"></a><span class="lineno"> 101</span> <span class="keyword">struct </span>sockaddr_in;</div><div class="line"><a name="l00102"></a><span class="lineno"> 102</span> <span class="preprocessor">#define LWS_POSIX 0</span></div><div class="line"><a name="l00103"></a><span class="lineno"> 103</span> <span class="preprocessor">#else</span></div><div class="line"><a name="l00104"></a><span class="lineno"> 104</span> <span class="preprocessor">#define LWS_POSIX 1</span></div><div class="line"><a name="l00105"></a><span class="lineno"> 105</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l00106"></a><span class="lineno"> 106</span> </div><div class="line"><a name="l00107"></a><span class="lineno"> 107</span> <span class="preprocessor">#include "lws_config.h"</span></div><div class="line"><a name="l00108"></a><span class="lineno"> 108</span> </div><div class="line"><a name="l00109"></a><span class="lineno"> 109</span> <span class="preprocessor">#if defined(WIN32) || defined(_WIN32)</span></div><div class="line"><a name="l00110"></a><span class="lineno"> 110</span> <span class="preprocessor">#ifndef WIN32_LEAN_AND_MEAN</span></div><div class="line"><a name="l00111"></a><span class="lineno"> 111</span> <span class="preprocessor">#define WIN32_LEAN_AND_MEAN</span></div><div class="line"><a name="l00112"></a><span class="lineno"> 112</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l00113"></a><span class="lineno"> 113</span> </div><div class="line"><a name="l00114"></a><span class="lineno"> 114</span> <span class="preprocessor">#include <winsock2.h></span></div><div class="line"><a name="l00115"></a><span class="lineno"> 115</span> <span class="preprocessor">#include <ws2tcpip.h></span></div><div class="line"><a name="l00116"></a><span class="lineno"> 116</span> <span class="preprocessor">#include <stddef.h></span></div><div class="line"><a name="l00117"></a><span class="lineno"> 117</span> <span class="preprocessor">#include <basetsd.h></span></div><div class="line"><a name="l00118"></a><span class="lineno"> 118</span> <span class="preprocessor">#ifndef _WIN32_WCE</span></div><div class="line"><a name="l00119"></a><span class="lineno"> 119</span> <span class="preprocessor">#include <stdint.h></span></div><div class="line"><a name="l00120"></a><span class="lineno"> 120</span> <span class="preprocessor">#include <fcntl.h></span></div><div class="line"><a name="l00121"></a><span class="lineno"> 121</span> <span class="preprocessor">#else</span></div><div class="line"><a name="l00122"></a><span class="lineno"> 122</span> <span class="preprocessor">#define _O_RDONLY 0x0000</span></div><div class="line"><a name="l00123"></a><span class="lineno"> 123</span> <span class="preprocessor">#define O_RDONLY _O_RDONLY</span></div><div class="line"><a name="l00124"></a><span class="lineno"> 124</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l00125"></a><span class="lineno"> 125</span> </div><div class="line"><a name="l00126"></a><span class="lineno"> 126</span> <span class="comment">// Visual studio older than 2015 and WIN_CE has only _stricmp</span></div><div class="line"><a name="l00127"></a><span class="lineno"> 127</span> <span class="preprocessor">#if (defined(_MSC_VER) && _MSC_VER < 1900) || defined(_WIN32_WCE)</span></div><div class="line"><a name="l00128"></a><span class="lineno"> 128</span> <span class="preprocessor">#define strcasecmp _stricmp</span></div><div class="line"><a name="l00129"></a><span class="lineno"> 129</span> <span class="preprocessor">#else</span></div><div class="line"><a name="l00130"></a><span class="lineno"> 130</span> <span class="preprocessor">#define strcasecmp stricmp</span></div><div class="line"><a name="l00131"></a><span class="lineno"> 131</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l00132"></a><span class="lineno"> 132</span> <span class="preprocessor">#define getdtablesize() 30000</span></div><div class="line"><a name="l00133"></a><span class="lineno"> 133</span> </div><div class="line"><a name="l00134"></a><span class="lineno"> 134</span> <span class="preprocessor">#define LWS_INLINE __inline</span></div><div class="line"><a name="l00135"></a><span class="lineno"> 135</span> <span class="preprocessor">#define LWS_VISIBLE</span></div><div class="line"><a name="l00136"></a><span class="lineno"> 136</span> <span class="preprocessor">#define LWS_WARN_UNUSED_RESULT</span></div><div class="line"><a name="l00137"></a><span class="lineno"> 137</span> <span class="preprocessor">#define LWS_WARN_DEPRECATED</span></div><div class="line"><a name="l00138"></a><span class="lineno"> 138</span> </div><div class="line"><a name="l00139"></a><span class="lineno"> 139</span> <span class="preprocessor">#ifdef LWS_DLL</span></div><div class="line"><a name="l00140"></a><span class="lineno"> 140</span> <span class="preprocessor">#ifdef LWS_INTERNAL</span></div><div class="line"><a name="l00141"></a><span class="lineno"> 141</span> <span class="preprocessor">#define LWS_EXTERN extern __declspec(dllexport)</span></div><div class="line"><a name="l00142"></a><span class="lineno"> 142</span> <span class="preprocessor">#else</span></div><div class="line"><a name="l00143"></a><span class="lineno"> 143</span> <span class="preprocessor">#define LWS_EXTERN extern __declspec(dllimport)</span></div><div class="line"><a name="l00144"></a><span class="lineno"> 144</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l00145"></a><span class="lineno"> 145</span> <span class="preprocessor">#else</span></div><div class="line"><a name="l00146"></a><span class="lineno"> 146</span> <span class="preprocessor">#define LWS_EXTERN</span></div><div class="line"><a name="l00147"></a><span class="lineno"> 147</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l00148"></a><span class="lineno"> 148</span> </div><div class="line"><a name="l00149"></a><span class="lineno"> 149</span> <span class="preprocessor">#define LWS_INVALID_FILE INVALID_HANDLE_VALUE</span></div><div class="line"><a name="l00150"></a><span class="lineno"> 150</span> <span class="preprocessor">#define LWS_O_RDONLY _O_RDONLY</span></div><div class="line"><a name="l00151"></a><span class="lineno"> 151</span> </div><div class="line"><a name="l00152"></a><span class="lineno"> 152</span> <span class="preprocessor">#if !defined(_MSC_VER) || _MSC_VER < 1900 </span><span class="comment">/* Visual Studio 2015 already defines this in <stdio.h> */</span><span class="preprocessor"></span></div><div class="line"><a name="l00153"></a><span class="lineno"> 153</span> <span class="preprocessor">#define snprintf _snprintf</span></div><div class="line"><a name="l00154"></a><span class="lineno"> 154</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l00155"></a><span class="lineno"> 155</span> </div><div class="line"><a name="l00156"></a><span class="lineno"> 156</span> <span class="preprocessor">#ifndef __func__</span></div><div class="line"><a name="l00157"></a><span class="lineno"> 157</span> <span class="preprocessor">#define __func__ __FUNCTION__</span></div><div class="line"><a name="l00158"></a><span class="lineno"> 158</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l00159"></a><span class="lineno"> 159</span> </div><div class="line"><a name="l00160"></a><span class="lineno"> 160</span> <span class="preprocessor">#else </span><span class="comment">/* NOT WIN32 */</span><span class="preprocessor"></span></div><div class="line"><a name="l00161"></a><span class="lineno"> 161</span> <span class="preprocessor">#include <unistd.h></span></div><div class="line"><a name="l00162"></a><span class="lineno"> 162</span> </div><div class="line"><a name="l00163"></a><span class="lineno"> 163</span> <span class="preprocessor">#if defined(__NetBSD__) || defined(__FreeBSD__)</span></div><div class="line"><a name="l00164"></a><span class="lineno"> 164</span> <span class="preprocessor">#include <netinet/in.h></span></div><div class="line"><a name="l00165"></a><span class="lineno"> 165</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l00166"></a><span class="lineno"> 166</span> </div><div class="line"><a name="l00167"></a><span class="lineno"> 167</span> <span class="preprocessor">#define LWS_INLINE inline</span></div><div class="line"><a name="l00168"></a><span class="lineno"> 168</span> <span class="preprocessor">#define LWS_O_RDONLY O_RDONLY</span></div><div class="line"><a name="l00169"></a><span class="lineno"> 169</span> </div><div class="line"><a name="l00170"></a><span class="lineno"> 170</span> <span class="preprocessor">#ifndef MBED_OPERATORS</span></div><div class="line"><a name="l00171"></a><span class="lineno"> 171</span> <span class="preprocessor">#include <poll.h></span></div><div class="line"><a name="l00172"></a><span class="lineno"> 172</span> <span class="preprocessor">#include <netdb.h></span></div><div class="line"><a name="l00173"></a><span class="lineno"> 173</span> <span class="preprocessor">#define LWS_INVALID_FILE -1</span></div><div class="line"><a name="l00174"></a><span class="lineno"> 174</span> <span class="preprocessor">#else</span></div><div class="line"><a name="l00175"></a><span class="lineno"> 175</span> <span class="preprocessor">#define getdtablesize() (20)</span></div><div class="line"><a name="l00176"></a><span class="lineno"> 176</span> <span class="preprocessor">#define LWS_INVALID_FILE NULL</span></div><div class="line"><a name="l00177"></a><span class="lineno"> 177</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l00178"></a><span class="lineno"> 178</span> </div><div class="line"><a name="l00179"></a><span class="lineno"> 179</span> <span class="preprocessor">#if defined(__GNUC__)</span></div><div class="line"><a name="l00180"></a><span class="lineno"> 180</span> </div><div class="line"><a name="l00181"></a><span class="lineno"> 181</span> <span class="comment">/* warn_unused_result attribute only supported by GCC 3.4 or later */</span></div><div class="line"><a name="l00182"></a><span class="lineno"> 182</span> <span class="preprocessor">#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)</span></div><div class="line"><a name="l00183"></a><span class="lineno"> 183</span> <span class="preprocessor">#define LWS_WARN_UNUSED_RESULT __attribute__((warn_unused_result))</span></div><div class="line"><a name="l00184"></a><span class="lineno"> 184</span> <span class="preprocessor">#else</span></div><div class="line"><a name="l00185"></a><span class="lineno"> 185</span> <span class="preprocessor">#define LWS_WARN_UNUSED_RESULT</span></div><div class="line"><a name="l00186"></a><span class="lineno"> 186</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l00187"></a><span class="lineno"> 187</span> </div><div class="line"><a name="l00188"></a><span class="lineno"> 188</span> <span class="preprocessor">#define LWS_VISIBLE __attribute__((visibility("default")))</span></div><div class="line"><a name="l00189"></a><span class="lineno"> 189</span> <span class="preprocessor">#define LWS_WARN_DEPRECATED __attribute__ ((deprecated))</span></div><div class="line"><a name="l00190"></a><span class="lineno"> 190</span> <span class="preprocessor">#else</span></div><div class="line"><a name="l00191"></a><span class="lineno"> 191</span> <span class="preprocessor">#define LWS_VISIBLE</span></div><div class="line"><a name="l00192"></a><span class="lineno"> 192</span> <span class="preprocessor">#define LWS_WARN_UNUSED_RESULT</span></div><div class="line"><a name="l00193"></a><span class="lineno"> 193</span> <span class="preprocessor">#define LWS_WARN_DEPRECATED</span></div><div class="line"><a name="l00194"></a><span class="lineno"> 194</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l00195"></a><span class="lineno"> 195</span> </div><div class="line"><a name="l00196"></a><span class="lineno"> 196</span> <span class="preprocessor">#if defined(__ANDROID__)</span></div><div class="line"><a name="l00197"></a><span class="lineno"> 197</span> <span class="preprocessor">#include <unistd.h></span></div><div class="line"><a name="l00198"></a><span class="lineno"> 198</span> <span class="preprocessor">#define getdtablesize() sysconf(_SC_OPEN_MAX)</span></div><div class="line"><a name="l00199"></a><span class="lineno"> 199</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l00200"></a><span class="lineno"> 200</span> </div><div class="line"><a name="l00201"></a><span class="lineno"> 201</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l00202"></a><span class="lineno"> 202</span> </div><div class="line"><a name="l00203"></a><span class="lineno"> 203</span> <span class="preprocessor">#ifdef LWS_USE_LIBEV</span></div><div class="line"><a name="l00204"></a><span class="lineno"> 204</span> <span class="preprocessor">#include <ev.h></span></div><div class="line"><a name="l00205"></a><span class="lineno"> 205</span> <span class="preprocessor">#endif </span><span class="comment">/* LWS_USE_LIBEV */</span><span class="preprocessor"></span></div><div class="line"><a name="l00206"></a><span class="lineno"> 206</span> <span class="preprocessor">#ifdef LWS_USE_LIBUV</span></div><div class="line"><a name="l00207"></a><span class="lineno"> 207</span> <span class="preprocessor">#include <uv.h></span></div><div class="line"><a name="l00208"></a><span class="lineno"> 208</span> <span class="preprocessor">#endif </span><span class="comment">/* LWS_USE_LIBUV */</span><span class="preprocessor"></span></div><div class="line"><a name="l00209"></a><span class="lineno"> 209</span> </div><div class="line"><a name="l00210"></a><span class="lineno"> 210</span> <span class="preprocessor">#ifndef LWS_EXTERN</span></div><div class="line"><a name="l00211"></a><span class="lineno"> 211</span> <span class="preprocessor">#define LWS_EXTERN extern</span></div><div class="line"><a name="l00212"></a><span class="lineno"> 212</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l00213"></a><span class="lineno"> 213</span> </div><div class="line"><a name="l00214"></a><span class="lineno"> 214</span> <span class="preprocessor">#ifdef _WIN32</span></div><div class="line"><a name="l00215"></a><span class="lineno"> 215</span> <span class="preprocessor">#define random rand</span></div><div class="line"><a name="l00216"></a><span class="lineno"> 216</span> <span class="preprocessor">#else</span></div><div class="line"><a name="l00217"></a><span class="lineno"> 217</span> <span class="preprocessor">#include <sys/time.h></span></div><div class="line"><a name="l00218"></a><span class="lineno"> 218</span> <span class="preprocessor">#include <unistd.h></span></div><div class="line"><a name="l00219"></a><span class="lineno"> 219</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l00220"></a><span class="lineno"> 220</span> </div><div class="line"><a name="l00221"></a><span class="lineno"> 221</span> <span class="preprocessor">#ifdef LWS_OPENSSL_SUPPORT</span></div><div class="line"><a name="l00222"></a><span class="lineno"> 222</span> </div><div class="line"><a name="l00223"></a><span class="lineno"> 223</span> <span class="preprocessor">#ifdef USE_WOLFSSL</span></div><div class="line"><a name="l00224"></a><span class="lineno"> 224</span> <span class="preprocessor">#ifdef USE_OLD_CYASSL</span></div><div class="line"><a name="l00225"></a><span class="lineno"> 225</span> <span class="preprocessor">#include <cyassl/openssl/ssl.h></span></div><div class="line"><a name="l00226"></a><span class="lineno"> 226</span> <span class="preprocessor">#include <cyassl/error-ssl.h></span></div><div class="line"><a name="l00227"></a><span class="lineno"> 227</span> <span class="preprocessor">#else</span></div><div class="line"><a name="l00228"></a><span class="lineno"> 228</span> <span class="preprocessor">#include <wolfssl/openssl/ssl.h></span></div><div class="line"><a name="l00229"></a><span class="lineno"> 229</span> <span class="preprocessor">#include <wolfssl/error-ssl.h></span></div><div class="line"><a name="l00230"></a><span class="lineno"> 230</span> <span class="preprocessor">#endif </span><span class="comment">/* not USE_OLD_CYASSL */</span><span class="preprocessor"></span></div><div class="line"><a name="l00231"></a><span class="lineno"> 231</span> <span class="preprocessor">#else</span></div><div class="line"><a name="l00232"></a><span class="lineno"> 232</span> <span class="preprocessor">#if defined(LWS_USE_POLARSSL)</span></div><div class="line"><a name="l00233"></a><span class="lineno"> 233</span> <span class="preprocessor">#include <polarssl/ssl.h></span></div><div class="line"><a name="l00234"></a><span class="lineno"><a class="line" href="structlws__polarssl__context.html"> 234</a></span> <span class="keyword">struct </span><a class="code" href="structlws__polarssl__context.html">lws_polarssl_context</a> {</div><div class="line"><a name="l00235"></a><span class="lineno"><a class="line" href="structlws__polarssl__context.html#a1872f2ea24878d807ae20ca8513674af"> 235</a></span>  x509_crt <a class="code" href="structlws__polarssl__context.html#a1872f2ea24878d807ae20ca8513674af">ca</a>; </div><div class="line"><a name="l00236"></a><span class="lineno"><a class="line" href="structlws__polarssl__context.html#ae7e11c9129ff71c7ee71b3b2e320ff27"> 236</a></span>  x509_crt <a class="code" href="structlws__polarssl__context.html#ae7e11c9129ff71c7ee71b3b2e320ff27">certificate</a>; </div><div class="line"><a name="l00237"></a><span class="lineno"><a class="line" href="structlws__polarssl__context.html#a919c33af37aab170f828d954de1fa270"> 237</a></span>  rsa_context <a class="code" href="structlws__polarssl__context.html#a919c33af37aab170f828d954de1fa270">key</a>; </div><div class="line"><a name="l00238"></a><span class="lineno"> 238</span> };</div><div class="line"><a name="l00239"></a><span class="lineno"> 239</span> <span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="structlws__polarssl__context.html">lws_polarssl_context</a> <a class="code" href="structlws__polarssl__context.html">SSL_CTX</a>;</div><div class="line"><a name="l00240"></a><span class="lineno"> 240</span> <span class="keyword">typedef</span> ssl_context SSL;</div><div class="line"><a name="l00241"></a><span class="lineno"> 241</span> <span class="preprocessor">#else</span></div><div class="line"><a name="l00242"></a><span class="lineno"> 242</span> <span class="preprocessor">#if defined(LWS_USE_MBEDTLS)</span></div><div class="line"><a name="l00243"></a><span class="lineno"> 243</span> <span class="preprocessor">#include <mbedtls/ssl.h></span></div><div class="line"><a name="l00244"></a><span class="lineno"> 244</span> <span class="preprocessor">#else</span></div><div class="line"><a name="l00245"></a><span class="lineno"> 245</span> <span class="preprocessor">#include <openssl/ssl.h></span></div><div class="line"><a name="l00246"></a><span class="lineno"> 246</span> <span class="preprocessor">#include <openssl/err.h></span></div><div class="line"><a name="l00247"></a><span class="lineno"> 247</span> <span class="preprocessor">#endif </span><span class="comment">/* not USE_MBEDTLS */</span><span class="preprocessor"></span></div><div class="line"><a name="l00248"></a><span class="lineno"> 248</span> <span class="preprocessor">#endif </span><span class="comment">/* not USE_POLARSSL */</span><span class="preprocessor"></span></div><div class="line"><a name="l00249"></a><span class="lineno"> 249</span> <span class="preprocessor">#endif </span><span class="comment">/* not USE_WOLFSSL */</span><span class="preprocessor"></span></div><div class="line"><a name="l00250"></a><span class="lineno"> 250</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l00251"></a><span class="lineno"> 251</span> </div><div class="line"><a name="l00252"></a><span class="lineno"> 252</span> </div><div class="line"><a name="l00253"></a><span class="lineno"> 253</span> <span class="preprocessor">#define CONTEXT_PORT_NO_LISTEN -1</span></div><div class="line"><a name="l00254"></a><span class="lineno"> 254</span> </div><div class="line"><a name="l00265"></a><span class="lineno"> 265</span> </div><div class="line"><a name="l00267"></a><span class="lineno"> 267</span> <span class="keyword">enum</span> lws_log_levels {</div><div class="line"><a name="l00268"></a><span class="lineno"> 268</span>  LLL_ERR = 1 << 0,</div><div class="line"><a name="l00269"></a><span class="lineno"> 269</span>  LLL_WARN = 1 << 1,</div><div class="line"><a name="l00270"></a><span class="lineno"> 270</span>  LLL_NOTICE = 1 << 2,</div><div class="line"><a name="l00271"></a><span class="lineno"> 271</span>  LLL_INFO = 1 << 3,</div><div class="line"><a name="l00272"></a><span class="lineno"> 272</span>  LLL_DEBUG = 1 << 4,</div><div class="line"><a name="l00273"></a><span class="lineno"> 273</span>  LLL_PARSER = 1 << 5,</div><div class="line"><a name="l00274"></a><span class="lineno"> 274</span>  LLL_HEADER = 1 << 6,</div><div class="line"><a name="l00275"></a><span class="lineno"> 275</span>  LLL_EXT = 1 << 7,</div><div class="line"><a name="l00276"></a><span class="lineno"> 276</span>  LLL_CLIENT = 1 << 8,</div><div class="line"><a name="l00277"></a><span class="lineno"> 277</span>  LLL_LATENCY = 1 << 9,</div><div class="line"><a name="l00278"></a><span class="lineno"> 278</span> </div><div class="line"><a name="l00279"></a><span class="lineno"> 279</span>  LLL_COUNT = 10 <span class="comment">/* set to count of valid flags */</span></div><div class="line"><a name="l00280"></a><span class="lineno"> 280</span> };</div><div class="line"><a name="l00281"></a><span class="lineno"> 281</span> </div><div class="line"><a name="l00282"></a><span class="lineno"> 282</span> LWS_VISIBLE LWS_EXTERN <span class="keywordtype">void</span> _lws_log(<span class="keywordtype">int</span> filter, <span class="keyword">const</span> <span class="keywordtype">char</span> *format, ...);</div><div class="line"><a name="l00283"></a><span class="lineno"> 283</span> LWS_VISIBLE LWS_EXTERN <span class="keywordtype">void</span> _lws_logv(<span class="keywordtype">int</span> filter, <span class="keyword">const</span> <span class="keywordtype">char</span> *format, va_list vl);</div><div class="line"><a name="l00293"></a><span class="lineno"> 293</span> LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l00294"></a><span class="lineno"> 294</span> <a class="code" href="group__log.html#ga42e39775c6b69b7251bdbf5a2cdd5dcd">lwsl_timestamp</a>(<span class="keywordtype">int</span> level, <span class="keywordtype">char</span> *p, <span class="keywordtype">int</span> len);</div><div class="line"><a name="l00295"></a><span class="lineno"> 295</span> </div><div class="line"><a name="l00296"></a><span class="lineno"> 296</span> <span class="comment">/* notice, warn and log are always compiled in */</span></div><div class="line"><a name="l00297"></a><span class="lineno"> 297</span> <span class="preprocessor">#define lwsl_notice(...) _lws_log(LLL_NOTICE, __VA_ARGS__)</span></div><div class="line"><a name="l00298"></a><span class="lineno"> 298</span> <span class="preprocessor">#define lwsl_warn(...) _lws_log(LLL_WARN, __VA_ARGS__)</span></div><div class="line"><a name="l00299"></a><span class="lineno"> 299</span> <span class="preprocessor">#define lwsl_err(...) _lws_log(LLL_ERR, __VA_ARGS__)</span></div><div class="line"><a name="l00300"></a><span class="lineno"> 300</span> <span class="comment">/*</span></div><div class="line"><a name="l00301"></a><span class="lineno"> 301</span> <span class="comment"> * weaker logging can be deselected at configure time using --disable-debug</span></div><div class="line"><a name="l00302"></a><span class="lineno"> 302</span> <span class="comment"> * that gets rid of the overhead of checking while keeping _warn and _err</span></div><div class="line"><a name="l00303"></a><span class="lineno"> 303</span> <span class="comment"> * active</span></div><div class="line"><a name="l00304"></a><span class="lineno"> 304</span> <span class="comment"> */</span></div><div class="line"><a name="l00305"></a><span class="lineno"> 305</span> <span class="preprocessor">#ifdef _DEBUG</span></div><div class="line"><a name="l00306"></a><span class="lineno"> 306</span> </div><div class="line"><a name="l00307"></a><span class="lineno"> 307</span> <span class="preprocessor">#define lwsl_info(...) _lws_log(LLL_INFO, __VA_ARGS__)</span></div><div class="line"><a name="l00308"></a><span class="lineno"> 308</span> <span class="preprocessor">#define lwsl_debug(...) _lws_log(LLL_DEBUG, __VA_ARGS__)</span></div><div class="line"><a name="l00309"></a><span class="lineno"> 309</span> <span class="preprocessor">#define lwsl_parser(...) _lws_log(LLL_PARSER, __VA_ARGS__)</span></div><div class="line"><a name="l00310"></a><span class="lineno"> 310</span> <span class="preprocessor">#define lwsl_header(...) _lws_log(LLL_HEADER, __VA_ARGS__)</span></div><div class="line"><a name="l00311"></a><span class="lineno"> 311</span> <span class="preprocessor">#define lwsl_ext(...) _lws_log(LLL_EXT, __VA_ARGS__)</span></div><div class="line"><a name="l00312"></a><span class="lineno"> 312</span> <span class="preprocessor">#define lwsl_client(...) _lws_log(LLL_CLIENT, __VA_ARGS__)</span></div><div class="line"><a name="l00313"></a><span class="lineno"> 313</span> <span class="preprocessor">#define lwsl_latency(...) _lws_log(LLL_LATENCY, __VA_ARGS__)</span></div><div class="line"><a name="l00314"></a><span class="lineno"> 314</span> </div><div class="line"><a name="l00320"></a><span class="lineno"> 320</span> LWS_VISIBLE LWS_EXTERN <span class="keywordtype">void</span> <a class="code" href="group__log.html#ga898b1f03872ad019f507d4e35bbefa90">lwsl_hexdump</a>(<span class="keywordtype">void</span> *buf, <span class="keywordtype">size_t</span> len);</div><div class="line"><a name="l00321"></a><span class="lineno"> 321</span> </div><div class="line"><a name="l00322"></a><span class="lineno"> 322</span> <span class="preprocessor">#else </span><span class="comment">/* no debug */</span><span class="preprocessor"></span></div><div class="line"><a name="l00323"></a><span class="lineno"> 323</span> </div><div class="line"><a name="l00324"></a><span class="lineno"> 324</span> <span class="preprocessor">#define lwsl_info(...) {}</span></div><div class="line"><a name="l00325"></a><span class="lineno"> 325</span> <span class="preprocessor">#define lwsl_debug(...) {}</span></div><div class="line"><a name="l00326"></a><span class="lineno"> 326</span> <span class="preprocessor">#define lwsl_parser(...) {}</span></div><div class="line"><a name="l00327"></a><span class="lineno"> 327</span> <span class="preprocessor">#define lwsl_header(...) {}</span></div><div class="line"><a name="l00328"></a><span class="lineno"> 328</span> <span class="preprocessor">#define lwsl_ext(...) {}</span></div><div class="line"><a name="l00329"></a><span class="lineno"> 329</span> <span class="preprocessor">#define lwsl_client(...) {}</span></div><div class="line"><a name="l00330"></a><span class="lineno"> 330</span> <span class="preprocessor">#define lwsl_latency(...) {}</span></div><div class="line"><a name="l00331"></a><span class="lineno"> 331</span> <span class="preprocessor">#define lwsl_hexdump(a, b)</span></div><div class="line"><a name="l00332"></a><span class="lineno"> 332</span> </div><div class="line"><a name="l00333"></a><span class="lineno"> 333</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l00334"></a><span class="lineno"> 334</span> </div><div class="line"><a name="l00345"></a><span class="lineno"> 345</span> LWS_VISIBLE LWS_EXTERN <span class="keywordtype">void</span></div><div class="line"><a name="l00346"></a><span class="lineno"> 346</span> <a class="code" href="group__log.html#ga244647f9e1bf0097ccdde66d74f41e26">lws_set_log_level</a>(<span class="keywordtype">int</span> level,</div><div class="line"><a name="l00347"></a><span class="lineno"> 347</span>  <span class="keywordtype">void</span> (*log_emit_function)(<span class="keywordtype">int</span> level, <span class="keyword">const</span> <span class="keywordtype">char</span> *line));</div><div class="line"><a name="l00348"></a><span class="lineno"> 348</span> </div><div class="line"><a name="l00358"></a><span class="lineno"> 358</span> LWS_VISIBLE LWS_EXTERN <span class="keywordtype">void</span></div><div class="line"><a name="l00359"></a><span class="lineno"> 359</span> <a class="code" href="group__log.html#gab7c0fc936cc9f1eb58e2bb234c15147c">lwsl_emit_syslog</a>(<span class="keywordtype">int</span> level, <span class="keyword">const</span> <span class="keywordtype">char</span> *line);</div><div class="line"><a name="l00360"></a><span class="lineno"> 360</span> </div><div class="line"><a name="l00362"></a><span class="lineno"> 362</span> </div><div class="line"><a name="l00363"></a><span class="lineno"> 363</span> </div><div class="line"><a name="l00364"></a><span class="lineno"> 364</span> <span class="preprocessor">#include <stddef.h></span></div><div class="line"><a name="l00365"></a><span class="lineno"> 365</span> </div><div class="line"><a name="l00366"></a><span class="lineno"> 366</span> <span class="preprocessor">#ifndef lws_container_of</span></div><div class="line"><a name="l00367"></a><span class="lineno"> 367</span> <span class="preprocessor">#define lws_container_of(P,T,M) ((T *)((char *)(P) - offsetof(T, M)))</span></div><div class="line"><a name="l00368"></a><span class="lineno"> 368</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l00369"></a><span class="lineno"> 369</span> </div><div class="line"><a name="l00370"></a><span class="lineno"> 370</span> </div><div class="line"><a name="l00371"></a><span class="lineno"> 371</span> <span class="keyword">struct </span>lws;</div><div class="line"><a name="l00372"></a><span class="lineno"> 372</span> <span class="preprocessor">#ifndef ARRAY_SIZE</span></div><div class="line"><a name="l00373"></a><span class="lineno"> 373</span> <span class="preprocessor">#define ARRAY_SIZE(x) (sizeof(x) / sizeof(x[0]))</span></div><div class="line"><a name="l00374"></a><span class="lineno"> 374</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l00375"></a><span class="lineno"> 375</span> </div><div class="line"><a name="l00376"></a><span class="lineno"> 376</span> <span class="comment">/* api change list for user code to test against */</span></div><div class="line"><a name="l00377"></a><span class="lineno"> 377</span> </div><div class="line"><a name="l00378"></a><span class="lineno"> 378</span> <span class="preprocessor">#define LWS_FEATURE_SERVE_HTTP_FILE_HAS_OTHER_HEADERS_ARG</span></div><div class="line"><a name="l00379"></a><span class="lineno"> 379</span> </div><div class="line"><a name="l00380"></a><span class="lineno"> 380</span> <span class="comment">/* the struct lws_protocols has the id field present */</span></div><div class="line"><a name="l00381"></a><span class="lineno"> 381</span> <span class="preprocessor">#define LWS_FEATURE_PROTOCOLS_HAS_ID_FIELD</span></div><div class="line"><a name="l00382"></a><span class="lineno"> 382</span> </div><div class="line"><a name="l00383"></a><span class="lineno"> 383</span> <span class="comment">/* you can call lws_get_peer_write_allowance */</span></div><div class="line"><a name="l00384"></a><span class="lineno"> 384</span> <span class="preprocessor">#define LWS_FEATURE_PROTOCOLS_HAS_PEER_WRITE_ALLOWANCE</span></div><div class="line"><a name="l00385"></a><span class="lineno"> 385</span> </div><div class="line"><a name="l00386"></a><span class="lineno"> 386</span> <span class="comment">/* extra parameter introduced in 917f43ab821 */</span></div><div class="line"><a name="l00387"></a><span class="lineno"> 387</span> <span class="preprocessor">#define LWS_FEATURE_SERVE_HTTP_FILE_HAS_OTHER_HEADERS_LEN</span></div><div class="line"><a name="l00388"></a><span class="lineno"> 388</span> </div><div class="line"><a name="l00389"></a><span class="lineno"> 389</span> <span class="comment">/* File operations stuff exists */</span></div><div class="line"><a name="l00390"></a><span class="lineno"> 390</span> <span class="preprocessor">#define LWS_FEATURE_FOPS</span></div><div class="line"><a name="l00391"></a><span class="lineno"> 391</span> </div><div class="line"><a name="l00392"></a><span class="lineno"> 392</span> </div><div class="line"><a name="l00393"></a><span class="lineno"> 393</span> <span class="preprocessor">#if defined(_WIN32)</span></div><div class="line"><a name="l00394"></a><span class="lineno"> 394</span> <span class="keyword">typedef</span> SOCKET lws_sockfd_type;</div><div class="line"><a name="l00395"></a><span class="lineno"> 395</span> <span class="keyword">typedef</span> HANDLE lws_filefd_type;</div><div class="line"><a name="l00396"></a><span class="lineno"> 396</span> <span class="preprocessor">#define lws_sockfd_valid(sfd) (!!sfd)</span></div><div class="line"><a name="l00397"></a><span class="lineno"><a class="line" href="structlws__pollfd.html"> 397</a></span> <span class="keyword">struct </span><a class="code" href="structlws__pollfd.html">lws_pollfd</a> {</div><div class="line"><a name="l00398"></a><span class="lineno"><a class="line" href="structlws__pollfd.html#a714cf5ca90b41926117fdde9fa6542be"> 398</a></span>  lws_sockfd_type <a class="code" href="structlws__pollfd.html#a714cf5ca90b41926117fdde9fa6542be">fd</a>; </div><div class="line"><a name="l00399"></a><span class="lineno"><a class="line" href="structlws__pollfd.html#ac393db6fc7fb6ed8fe7ca20936908ee9"> 399</a></span>  SHORT <a class="code" href="structlws__pollfd.html#ac393db6fc7fb6ed8fe7ca20936908ee9">events</a>; </div><div class="line"><a name="l00400"></a><span class="lineno"><a class="line" href="structlws__pollfd.html#ae7cecfe7511c59d4a3a44f876d030932"> 400</a></span>  SHORT <a class="code" href="structlws__pollfd.html#ae7cecfe7511c59d4a3a44f876d030932">revents</a>; </div><div class="line"><a name="l00401"></a><span class="lineno"> 401</span> };</div><div class="line"><a name="l00402"></a><span class="lineno"> 402</span> <span class="preprocessor">#else</span></div><div class="line"><a name="l00403"></a><span class="lineno"> 403</span> </div><div class="line"><a name="l00404"></a><span class="lineno"> 404</span> <span class="preprocessor">#if defined(MBED_OPERATORS)</span></div><div class="line"><a name="l00405"></a><span class="lineno"> 405</span> <span class="comment">/* it's a class lws_conn * */</span></div><div class="line"><a name="l00406"></a><span class="lineno"> 406</span> <span class="keyword">typedef</span> <span class="keywordtype">void</span> * lws_sockfd_type;</div><div class="line"><a name="l00407"></a><span class="lineno"> 407</span> <span class="keyword">typedef</span> <span class="keywordtype">void</span> * lws_filefd_type;</div><div class="line"><a name="l00408"></a><span class="lineno"> 408</span> <span class="preprocessor">#define lws_sockfd_valid(sfd) (!!sfd)</span></div><div class="line"><a name="l00409"></a><span class="lineno"><a class="line" href="structpollfd.html"> 409</a></span> <span class="keyword">struct </span><a class="code" href="structpollfd.html">pollfd</a> {</div><div class="line"><a name="l00410"></a><span class="lineno"><a class="line" href="structpollfd.html#af084f089bdece61d177f85782d6673d0"> 410</a></span>  lws_sockfd_type <a class="code" href="structpollfd.html#af084f089bdece61d177f85782d6673d0">fd</a>; </div><div class="line"><a name="l00411"></a><span class="lineno"><a class="line" href="structpollfd.html#ac9b2f2c5b1f9a7487eb57e67cd4960ef"> 411</a></span>  <span class="keywordtype">short</span> <a class="code" href="structpollfd.html#ac9b2f2c5b1f9a7487eb57e67cd4960ef">events</a>; </div><div class="line"><a name="l00412"></a><span class="lineno"><a class="line" href="structpollfd.html#aafb457d11cac415faf0e1e2b825118c2"> 412</a></span>  <span class="keywordtype">short</span> <a class="code" href="structpollfd.html#aafb457d11cac415faf0e1e2b825118c2">revents</a>; </div><div class="line"><a name="l00413"></a><span class="lineno"> 413</span> };</div><div class="line"><a name="l00414"></a><span class="lineno"> 414</span> <span class="preprocessor">#define POLLIN 0x0001</span></div><div class="line"><a name="l00415"></a><span class="lineno"> 415</span> <span class="preprocessor">#define POLLPRI 0x0002</span></div><div class="line"><a name="l00416"></a><span class="lineno"> 416</span> <span class="preprocessor">#define POLLOUT 0x0004</span></div><div class="line"><a name="l00417"></a><span class="lineno"> 417</span> <span class="preprocessor">#define POLLERR 0x0008</span></div><div class="line"><a name="l00418"></a><span class="lineno"> 418</span> <span class="preprocessor">#define POLLHUP 0x0010</span></div><div class="line"><a name="l00419"></a><span class="lineno"> 419</span> <span class="preprocessor">#define POLLNVAL 0x0020</span></div><div class="line"><a name="l00420"></a><span class="lineno"> 420</span> </div><div class="line"><a name="l00421"></a><span class="lineno"> 421</span> <span class="keyword">struct </span>lws;</div><div class="line"><a name="l00422"></a><span class="lineno"> 422</span> </div><div class="line"><a name="l00423"></a><span class="lineno"> 423</span> <span class="keywordtype">void</span> * mbed3_create_tcp_stream_socket(<span class="keywordtype">void</span>);</div><div class="line"><a name="l00424"></a><span class="lineno"> 424</span> <span class="keywordtype">void</span> mbed3_delete_tcp_stream_socket(<span class="keywordtype">void</span> *sockfd);</div><div class="line"><a name="l00425"></a><span class="lineno"> 425</span> <span class="keywordtype">void</span> mbed3_tcp_stream_bind(<span class="keywordtype">void</span> *sock, <span class="keywordtype">int</span> port, <span class="keyword">struct</span> lws *);</div><div class="line"><a name="l00426"></a><span class="lineno"> 426</span> <span class="keywordtype">void</span> mbed3_tcp_stream_accept(<span class="keywordtype">void</span> *sock, <span class="keyword">struct</span> lws *);</div><div class="line"><a name="l00427"></a><span class="lineno"> 427</span> <span class="preprocessor">#else</span></div><div class="line"><a name="l00428"></a><span class="lineno"> 428</span> <span class="keyword">typedef</span> <span class="keywordtype">int</span> lws_sockfd_type;</div><div class="line"><a name="l00429"></a><span class="lineno"> 429</span> <span class="keyword">typedef</span> <span class="keywordtype">int</span> lws_filefd_type;</div><div class="line"><a name="l00430"></a><span class="lineno"> 430</span> <span class="preprocessor">#define lws_sockfd_valid(sfd) (sfd >= 0)</span></div><div class="line"><a name="l00431"></a><span class="lineno"> 431</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l00432"></a><span class="lineno"> 432</span> </div><div class="line"><a name="l00433"></a><span class="lineno"> 433</span> <span class="preprocessor">#define lws_pollfd pollfd</span></div><div class="line"><a name="l00434"></a><span class="lineno"> 434</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l00435"></a><span class="lineno"> 435</span> </div><div class="line"><a name="l00438"></a><span class="lineno"><a class="line" href="structlws__pollargs.html"> 438</a></span> <span class="keyword">struct </span><a class="code" href="structlws__pollargs.html">lws_pollargs</a> {</div><div class="line"><a name="l00439"></a><span class="lineno"><a class="line" href="structlws__pollargs.html#af14a48ef4e78128aef9a76902b104a81"> 439</a></span>  lws_sockfd_type <a class="code" href="structlws__pollargs.html#af14a48ef4e78128aef9a76902b104a81">fd</a>; </div><div class="line"><a name="l00440"></a><span class="lineno"><a class="line" href="structlws__pollargs.html#a00bbffea9f55de342783e32d71ce1de6"> 440</a></span>  <span class="keywordtype">int</span> <a class="code" href="structlws__pollargs.html#a00bbffea9f55de342783e32d71ce1de6">events</a>; </div><div class="line"><a name="l00441"></a><span class="lineno"><a class="line" href="structlws__pollargs.html#a437fec0de5cf264371e1ab5a401e86d8"> 441</a></span>  <span class="keywordtype">int</span> <a class="code" href="structlws__pollargs.html#a437fec0de5cf264371e1ab5a401e86d8">prev_events</a>; </div><div class="line"><a name="l00442"></a><span class="lineno"> 442</span> };</div><div class="line"><a name="l00443"></a><span class="lineno"> 443</span> </div><div class="line"><a name="l00444"></a><span class="lineno"> 444</span> <span class="keyword">struct </span><a class="code" href="structlws__tokens.html">lws_tokens</a>;</div><div class="line"><a name="l00445"></a><span class="lineno"> 445</span> <span class="keyword">struct </span><a class="code" href="structlws__token__limits.html">lws_token_limits</a>;</div><div class="line"><a name="l00446"></a><span class="lineno"> 446</span> </div><div class="line"><a name="l00454"></a><span class="lineno"> 454</span> </div><div class="line"><a name="l00456"></a><span class="lineno"> 456</span> <span class="comment">/*</span></div><div class="line"><a name="l00457"></a><span class="lineno"> 457</span> <span class="comment"> * NOTE: These public enums are part of the abi. If you want to add one,</span></div><div class="line"><a name="l00458"></a><span class="lineno"> 458</span> <span class="comment"> * add it at where specified so existing users are unaffected.</span></div><div class="line"><a name="l00459"></a><span class="lineno"> 459</span> <span class="comment"> */</span></div><div class="line"><a name="l00461"></a><span class="lineno"><a class="line" href="group__wsclose.html#gae399c571df32ba532c0ca67da9284985"> 461</a></span> <span class="keyword">enum</span> <a class="code" href="group__wsclose.html#gae399c571df32ba532c0ca67da9284985">lws_close_status</a> {</div><div class="line"><a name="l00462"></a><span class="lineno"> 462</span>  LWS_CLOSE_STATUS_NOSTATUS = 0,</div><div class="line"><a name="l00463"></a><span class="lineno"><a class="line" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a3ffa38d5081b85fb739e02a747ccf2c4"> 463</a></span>  <a class="code" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a3ffa38d5081b85fb739e02a747ccf2c4">LWS_CLOSE_STATUS_NORMAL</a> = 1000,</div><div class="line"><a name="l00466"></a><span class="lineno"><a class="line" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a9737a68759e739856b150ff9dfa30218"> 466</a></span>  <a class="code" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a9737a68759e739856b150ff9dfa30218">LWS_CLOSE_STATUS_GOINGAWAY</a> = 1001,</div><div class="line"><a name="l00469"></a><span class="lineno"><a class="line" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a1bb501d212fa4d57053db681b1dfab98"> 469</a></span>  <a class="code" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a1bb501d212fa4d57053db681b1dfab98">LWS_CLOSE_STATUS_PROTOCOL_ERR</a> = 1002,</div><div class="line"><a name="l00472"></a><span class="lineno"><a class="line" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a462c99b05459df700919cfd3f53c8276"> 472</a></span>  <a class="code" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a462c99b05459df700919cfd3f53c8276">LWS_CLOSE_STATUS_UNACCEPTABLE_OPCODE</a> = 1003,</div><div class="line"><a name="l00477"></a><span class="lineno"><a class="line" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985af90cb98d983ad3d4c79df9b6f3d4a4d2"> 477</a></span>  <a class="code" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985af90cb98d983ad3d4c79df9b6f3d4a4d2">LWS_CLOSE_STATUS_RESERVED</a> = 1004,</div><div class="line"><a name="l00479"></a><span class="lineno"><a class="line" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a4b8a3b7ce6f731e5248e4b0fb64a5044"> 479</a></span>  <a class="code" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a4b8a3b7ce6f731e5248e4b0fb64a5044">LWS_CLOSE_STATUS_NO_STATUS</a> = 1005,</div><div class="line"><a name="l00484"></a><span class="lineno"><a class="line" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a68b3d34bebd88547dcfa5cadba0acd6c"> 484</a></span>  <a class="code" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a68b3d34bebd88547dcfa5cadba0acd6c">LWS_CLOSE_STATUS_ABNORMAL_CLOSE</a> = 1006,</div><div class="line"><a name="l00490"></a><span class="lineno"><a class="line" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a7aef2da0062da606eeb35aaca5cf9050"> 490</a></span>  <a class="code" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a7aef2da0062da606eeb35aaca5cf9050">LWS_CLOSE_STATUS_INVALID_PAYLOAD</a> = 1007,</div><div class="line"><a name="l00495"></a><span class="lineno"><a class="line" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985ad09e68295eabdddcba4e332fbea70ae5"> 495</a></span>  <a class="code" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985ad09e68295eabdddcba4e332fbea70ae5">LWS_CLOSE_STATUS_POLICY_VIOLATION</a> = 1008,</div><div class="line"><a name="l00501"></a><span class="lineno"><a class="line" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a2e1f0113494a58e762eed3d22e7080d8"> 501</a></span>  <a class="code" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a2e1f0113494a58e762eed3d22e7080d8">LWS_CLOSE_STATUS_MESSAGE_TOO_LARGE</a> = 1009,</div><div class="line"><a name="l00505"></a><span class="lineno"><a class="line" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985ac6a161822783ee873be1c66f48d14e0e"> 505</a></span>  <a class="code" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985ac6a161822783ee873be1c66f48d14e0e">LWS_CLOSE_STATUS_EXTENSION_REQUIRED</a> = 1010,</div><div class="line"><a name="l00513"></a><span class="lineno"><a class="line" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985ad0869604d79e13700ae5d196a431b350"> 513</a></span>  <a class="code" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985ad0869604d79e13700ae5d196a431b350">LWS_CLOSE_STATUS_UNEXPECTED_CONDITION</a> = 1011,</div><div class="line"><a name="l00517"></a><span class="lineno"><a class="line" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985ad2b477a91c8445bf34ecd43977f9b390"> 517</a></span>  <a class="code" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985ad2b477a91c8445bf34ecd43977f9b390">LWS_CLOSE_STATUS_TLS_FAILURE</a> = 1015,</div><div class="line"><a name="l00524"></a><span class="lineno"> 524</span>  <span class="comment">/****** add new things just above ---^ ******/</span></div><div class="line"><a name="l00525"></a><span class="lineno"> 525</span> </div><div class="line"><a name="l00526"></a><span class="lineno"> 526</span>  LWS_CLOSE_STATUS_NOSTATUS_CONTEXT_DESTROY = 9999,</div><div class="line"><a name="l00527"></a><span class="lineno"> 527</span> };</div><div class="line"><a name="l00528"></a><span class="lineno"> 528</span> </div><div class="line"><a name="l00541"></a><span class="lineno"> 541</span> LWS_VISIBLE LWS_EXTERN <span class="keywordtype">void</span></div><div class="line"><a name="l00542"></a><span class="lineno"> 542</span> <a class="code" href="group__wsclose.html#gaa1c863415d1783cd8de7938aa6efa262">lws_close_reason</a>(<span class="keyword">struct</span> lws *wsi, <span class="keyword">enum</span> <a class="code" href="group__wsclose.html#gae399c571df32ba532c0ca67da9284985">lws_close_status</a> status,</div><div class="line"><a name="l00543"></a><span class="lineno"> 543</span>  <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *buf, <span class="keywordtype">size_t</span> len);</div><div class="line"><a name="l00544"></a><span class="lineno"> 544</span> </div><div class="line"><a name="l00546"></a><span class="lineno"> 546</span> </div><div class="line"><a name="l00547"></a><span class="lineno"> 547</span> <span class="keyword">struct </span>lws;</div><div class="line"><a name="l00548"></a><span class="lineno"> 548</span> <span class="keyword">struct </span>lws_context;</div><div class="line"><a name="l00549"></a><span class="lineno"> 549</span> <span class="comment">/* needed even with extensions disabled for create context */</span></div><div class="line"><a name="l00550"></a><span class="lineno"> 550</span> <span class="keyword">struct </span><a class="code" href="structlws__extension.html">lws_extension</a>;</div><div class="line"><a name="l00551"></a><span class="lineno"> 551</span> </div><div class="line"><a name="l00563"></a><span class="lineno"> 563</span> </div><div class="line"><a name="l00565"></a><span class="lineno"> 565</span> </div><div class="line"><a name="l00566"></a><span class="lineno"> 566</span> <span class="comment">/*</span></div><div class="line"><a name="l00567"></a><span class="lineno"> 567</span> <span class="comment"> * NOTE: These public enums are part of the abi. If you want to add one,</span></div><div class="line"><a name="l00568"></a><span class="lineno"> 568</span> <span class="comment"> * add it at where specified so existing users are unaffected.</span></div><div class="line"><a name="l00569"></a><span class="lineno"> 569</span> <span class="comment"> */</span></div><div class="line"><a name="l00571"></a><span class="lineno"><a class="line" href="group__usercb.html#gad62860e19975ba4c4af401c3cdb6abf7"> 571</a></span> <span class="keyword">enum</span> <a class="code" href="group__usercb.html#gad62860e19975ba4c4af401c3cdb6abf7">lws_callback_reasons</a> {</div><div class="line"><a name="l00572"></a><span class="lineno"><a class="line" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a24d39bf1cfc0bad9d92da9ac1717e439"> 572</a></span>  <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a24d39bf1cfc0bad9d92da9ac1717e439">LWS_CALLBACK_ESTABLISHED</a> = 0,</div><div class="line"><a name="l00576"></a><span class="lineno"><a class="line" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ad8c6207b0c4e732f3d507f0fb79370e8"> 576</a></span>  <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ad8c6207b0c4e732f3d507f0fb79370e8">LWS_CALLBACK_CLIENT_CONNECTION_ERROR</a> = 1,</div><div class="line"><a name="l00580"></a><span class="lineno"><a class="line" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aa536e574a642ff3ab9e12bff7ba2c6a2"> 580</a></span>  <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aa536e574a642ff3ab9e12bff7ba2c6a2">LWS_CALLBACK_CLIENT_FILTER_PRE_ESTABLISH</a> = 2,</div><div class="line"><a name="l00587"></a><span class="lineno"><a class="line" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a7e12418eec9bce85735e6460176ab604"> 587</a></span>  <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a7e12418eec9bce85735e6460176ab604">LWS_CALLBACK_CLIENT_ESTABLISHED</a> = 3,</div><div class="line"><a name="l00590"></a><span class="lineno"><a class="line" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a48a9590e5e18c7920282e094a0bfd9d8"> 590</a></span>  <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a48a9590e5e18c7920282e094a0bfd9d8">LWS_CALLBACK_CLOSED</a> = 4,</div><div class="line"><a name="l00592"></a><span class="lineno"><a class="line" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a838b18d255c1b94a533287ba302a2eba"> 592</a></span>  <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a838b18d255c1b94a533287ba302a2eba">LWS_CALLBACK_CLOSED_HTTP</a> = 5,</div><div class="line"><a name="l00594"></a><span class="lineno"><a class="line" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a492c1b1c0ac0ed980042ee732fe2990c"> 594</a></span>  <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a492c1b1c0ac0ed980042ee732fe2990c">LWS_CALLBACK_RECEIVE</a> = 6,</div><div class="line"><a name="l00598"></a><span class="lineno"><a class="line" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a2db02fc6e1c17ab62b52109d1aa9d738"> 598</a></span>  <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a2db02fc6e1c17ab62b52109d1aa9d738">LWS_CALLBACK_RECEIVE_PONG</a> = 7,</div><div class="line"><a name="l00600"></a><span class="lineno"><a class="line" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7abbbe7a0a67c5866ca9109d46823fc5b1"> 600</a></span>  <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7abbbe7a0a67c5866ca9109d46823fc5b1">LWS_CALLBACK_CLIENT_RECEIVE</a> = 8,</div><div class="line"><a name="l00603"></a><span class="lineno"><a class="line" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a136a7cec11c3afd13245623bd84e76c9"> 603</a></span>  <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a136a7cec11c3afd13245623bd84e76c9">LWS_CALLBACK_CLIENT_RECEIVE_PONG</a> = 9,</div><div class="line"><a name="l00605"></a><span class="lineno"><a class="line" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a8e8b2e6dbeac76d8d126947d2166a514"> 605</a></span>  <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a8e8b2e6dbeac76d8d126947d2166a514">LWS_CALLBACK_CLIENT_WRITEABLE</a> = 10,</div><div class="line"><a name="l00613"></a><span class="lineno"><a class="line" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a7ec8e2e9557ee02a4fc9f7dec7e2babc"> 613</a></span>  <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a7ec8e2e9557ee02a4fc9f7dec7e2babc">LWS_CALLBACK_SERVER_WRITEABLE</a> = 11,</div><div class="line"><a name="l00615"></a><span class="lineno"><a class="line" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ae8d1de0bb56e03aa58cb4d44b18edd2e"> 615</a></span>  <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ae8d1de0bb56e03aa58cb4d44b18edd2e">LWS_CALLBACK_HTTP</a> = 12,</div><div class="line"><a name="l00629"></a><span class="lineno"><a class="line" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ac4c68e00efcf1ff7bda7ada462aff8ae"> 629</a></span>  <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ac4c68e00efcf1ff7bda7ada462aff8ae">LWS_CALLBACK_HTTP_BODY</a> = 13,</div><div class="line"><a name="l00632"></a><span class="lineno"><a class="line" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a2fce9a8608220f32abbf1422a5498804"> 632</a></span>  <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a2fce9a8608220f32abbf1422a5498804">LWS_CALLBACK_HTTP_BODY_COMPLETION</a> = 14,</div><div class="line"><a name="l00634"></a><span class="lineno"><a class="line" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aa627548e1296e654fcfab463ec3c9587"> 634</a></span>  <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aa627548e1296e654fcfab463ec3c9587">LWS_CALLBACK_HTTP_FILE_COMPLETION</a> = 15,</div><div class="line"><a name="l00636"></a><span class="lineno"><a class="line" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7afedadfb3cde37a8ea4c84ed535f26d09"> 636</a></span>  <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7afedadfb3cde37a8ea4c84ed535f26d09">LWS_CALLBACK_HTTP_WRITEABLE</a> = 16,</div><div class="line"><a name="l00638"></a><span class="lineno"><a class="line" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a026502768778b8d79d62dd0fe4375fc6"> 638</a></span>  <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a026502768778b8d79d62dd0fe4375fc6">LWS_CALLBACK_FILTER_NETWORK_CONNECTION</a> = 17,</div><div class="line"><a name="l00649"></a><span class="lineno"><a class="line" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a75199176c82c1a56e4a6bbf1cc30c12c"> 649</a></span>  <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a75199176c82c1a56e4a6bbf1cc30c12c">LWS_CALLBACK_FILTER_HTTP_CONNECTION</a> = 18,</div><div class="line"><a name="l00661"></a><span class="lineno"><a class="line" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ae9734e1d7af2abf291665ce9e4a728d3"> 661</a></span>  <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ae9734e1d7af2abf291665ce9e4a728d3">LWS_CALLBACK_SERVER_NEW_CLIENT_INSTANTIATED</a> = 19,</div><div class="line"><a name="l00669"></a><span class="lineno"><a class="line" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7accd8753672d319a30b4b4c2fb775e84d"> 669</a></span>  <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7accd8753672d319a30b4b4c2fb775e84d">LWS_CALLBACK_FILTER_PROTOCOL_CONNECTION</a> = 20,</div><div class="line"><a name="l00681"></a><span class="lineno"><a class="line" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ae4986291b7a810fe290851d73bebeb1c"> 681</a></span>  <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ae4986291b7a810fe290851d73bebeb1c">LWS_CALLBACK_OPENSSL_LOAD_EXTRA_CLIENT_VERIFY_CERTS</a> = 21,</div><div class="line"><a name="l00688"></a><span class="lineno"><a class="line" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a06006e98d27e1e884364d88317f83493"> 688</a></span>  <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a06006e98d27e1e884364d88317f83493">LWS_CALLBACK_OPENSSL_LOAD_EXTRA_SERVER_VERIFY_CERTS</a> = 22,</div><div class="line"><a name="l00694"></a><span class="lineno"><a class="line" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ae5ad65d779b7eab32ab67ceff91a3bac"> 694</a></span>  <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ae5ad65d779b7eab32ab67ceff91a3bac">LWS_CALLBACK_OPENSSL_PERFORM_CLIENT_CERT_VERIFICATION</a> = 23,</div><div class="line"><a name="l00712"></a><span class="lineno"><a class="line" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a909cc2a7018864b0b71abacc4058fd8f"> 712</a></span>  <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a909cc2a7018864b0b71abacc4058fd8f">LWS_CALLBACK_CLIENT_APPEND_HANDSHAKE_HEADER</a> = 24,</div><div class="line"><a name="l00736"></a><span class="lineno"><a class="line" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a390da3639296660a78cc1a5dcb19037e"> 736</a></span>  <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a390da3639296660a78cc1a5dcb19037e">LWS_CALLBACK_CONFIRM_EXTENSION_OKAY</a> = 25,</div><div class="line"><a name="l00747"></a><span class="lineno"><a class="line" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a1ce5b22039ca37ee224d00047596ea46"> 747</a></span>  <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a1ce5b22039ca37ee224d00047596ea46">LWS_CALLBACK_CLIENT_CONFIRM_EXTENSION_SUPPORTED</a> = 26,</div><div class="line"><a name="l00756"></a><span class="lineno"><a class="line" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ad5d34583e3556e153eda91620b48cc49"> 756</a></span>  <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ad5d34583e3556e153eda91620b48cc49">LWS_CALLBACK_PROTOCOL_INIT</a> = 27,</div><div class="line"><a name="l00759"></a><span class="lineno"><a class="line" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a54269ca88508e6efd3afdb9d360a9caa"> 759</a></span>  <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a54269ca88508e6efd3afdb9d360a9caa">LWS_CALLBACK_PROTOCOL_DESTROY</a> = 28,</div><div class="line"><a name="l00764"></a><span class="lineno"><a class="line" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7afd8fd77a1cc9405fcb4f26915d7f2d01"> 764</a></span>  <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7afd8fd77a1cc9405fcb4f26915d7f2d01">LWS_CALLBACK_WSI_CREATE</a> = 29,</div><div class="line"><a name="l00766"></a><span class="lineno"><a class="line" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aca834dc035b7f7486f9ce40fde54fe9e"> 766</a></span>  <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aca834dc035b7f7486f9ce40fde54fe9e">LWS_CALLBACK_WSI_DESTROY</a> = 30,</div><div class="line"><a name="l00768"></a><span class="lineno"><a class="line" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7adfb41c92e2522712207ef7f2462b5e34"> 768</a></span>  <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7adfb41c92e2522712207ef7f2462b5e34">LWS_CALLBACK_GET_THREAD_ID</a> = 31,</div><div class="line"><a name="l00773"></a><span class="lineno"> 773</span>  <span class="comment">/* external poll() management support */</span></div><div class="line"><a name="l00774"></a><span class="lineno"><a class="line" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ab69783a9fbf2ca71ad70706bda77b412"> 774</a></span>  <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ab69783a9fbf2ca71ad70706bda77b412">LWS_CALLBACK_ADD_POLL_FD</a> = 32,</div><div class="line"><a name="l00790"></a><span class="lineno"><a class="line" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a1df60f314710236f9b53efbf468da768"> 790</a></span>  <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a1df60f314710236f9b53efbf468da768">LWS_CALLBACK_DEL_POLL_FD</a> = 33,</div><div class="line"><a name="l00796"></a><span class="lineno"><a class="line" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aa87d2e82fffa42c3680c7403ef94216e"> 796</a></span>  <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aa87d2e82fffa42c3680c7403ef94216e">LWS_CALLBACK_CHANGE_MODE_POLL_FD</a> = 34,</div><div class="line"><a name="l00804"></a><span class="lineno"><a class="line" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a8909732521d379179003d97ab7a05428"> 804</a></span>  <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a8909732521d379179003d97ab7a05428">LWS_CALLBACK_LOCK_POLL</a> = 35,</div><div class="line"><a name="l00816"></a><span class="lineno"><a class="line" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a0e9e3dd667c0c42cdbe1a3d921f4fd79"> 816</a></span>  <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a0e9e3dd667c0c42cdbe1a3d921f4fd79">LWS_CALLBACK_UNLOCK_POLL</a> = 36,</div><div class="line"><a name="l00819"></a><span class="lineno"><a class="line" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aa46f705dcf97502e95627ffde614f98b"> 819</a></span>  <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aa46f705dcf97502e95627ffde614f98b">LWS_CALLBACK_OPENSSL_CONTEXT_REQUIRES_PRIVATE_KEY</a> = 37,</div><div class="line"><a name="l00827"></a><span class="lineno"><a class="line" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ac3fc5bbb55e69f90396526287ee84a51"> 827</a></span>  <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ac3fc5bbb55e69f90396526287ee84a51">LWS_CALLBACK_WS_PEER_INITIATED_CLOSE</a> = 38,</div><div class="line"><a name="l00836"></a><span class="lineno"> 836</span>  LWS_CALLBACK_WS_EXT_DEFAULTS = 39,</div><div class="line"><a name="l00839"></a><span class="lineno"> 839</span>  LWS_CALLBACK_CGI = 40,</div><div class="line"><a name="l00841"></a><span class="lineno"> 841</span>  LWS_CALLBACK_CGI_TERMINATED = 41,</div><div class="line"><a name="l00843"></a><span class="lineno"> 843</span>  LWS_CALLBACK_CGI_STDIN_DATA = 42,</div><div class="line"><a name="l00845"></a><span class="lineno"> 845</span>  LWS_CALLBACK_CGI_STDIN_COMPLETED = 43,</div><div class="line"><a name="l00847"></a><span class="lineno"> 847</span>  LWS_CALLBACK_ESTABLISHED_CLIENT_HTTP = 44,</div><div class="line"><a name="l00849"></a><span class="lineno"> 849</span>  LWS_CALLBACK_CLOSED_CLIENT_HTTP = 45,</div><div class="line"><a name="l00851"></a><span class="lineno"> 851</span>  LWS_CALLBACK_RECEIVE_CLIENT_HTTP = 46,</div><div class="line"><a name="l00853"></a><span class="lineno"> 853</span>  LWS_CALLBACK_COMPLETED_CLIENT_HTTP = 47,</div><div class="line"><a name="l00855"></a><span class="lineno"> 855</span>  LWS_CALLBACK_RECEIVE_CLIENT_HTTP_READ = 48,</div><div class="line"><a name="l00857"></a><span class="lineno"> 857</span>  LWS_CALLBACK_HTTP_BIND_PROTOCOL = 49,</div><div class="line"><a name="l00859"></a><span class="lineno"> 859</span>  LWS_CALLBACK_HTTP_DROP_PROTOCOL = 50,</div><div class="line"><a name="l00861"></a><span class="lineno"> 861</span>  LWS_CALLBACK_CHECK_ACCESS_RIGHTS = 51,</div><div class="line"><a name="l00863"></a><span class="lineno"> 863</span>  LWS_CALLBACK_PROCESS_HTML = 52,</div><div class="line"><a name="l00865"></a><span class="lineno"> 865</span>  LWS_CALLBACK_ADD_HEADERS = 53,</div><div class="line"><a name="l00867"></a><span class="lineno"> 867</span>  LWS_CALLBACK_SESSION_INFO = 54,</div><div class="line"><a name="l00870"></a><span class="lineno"> 870</span>  LWS_CALLBACK_GS_EVENT = 55,</div><div class="line"><a name="l00873"></a><span class="lineno"> 873</span>  <span class="comment">/****** add new things just above ---^ ******/</span></div><div class="line"><a name="l00874"></a><span class="lineno"> 874</span> </div><div class="line"><a name="l00875"></a><span class="lineno"><a class="line" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a982579753e70e59a9ea13ce628ac891a"> 875</a></span>  <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a982579753e70e59a9ea13ce628ac891a">LWS_CALLBACK_USER</a> = 1000,</div><div class="line"><a name="l00877"></a><span class="lineno"> 877</span> };</div><div class="line"><a name="l00878"></a><span class="lineno"> 878</span> </div><div class="line"><a name="l00879"></a><span class="lineno"> 879</span> </div><div class="line"><a name="l00880"></a><span class="lineno"> 880</span> </div><div class="line"><a name="l00896"></a><span class="lineno"> 896</span> <span class="keyword">typedef</span> <span class="keywordtype">int</span></div><div class="line"><a name="l00897"></a><span class="lineno"><a class="line" href="group__usercb.html#gad4fcb82e68d60ffacca61a3f783a0a2f"> 897</a></span> <a class="code" href="group__usercb.html#gad4fcb82e68d60ffacca61a3f783a0a2f">lws_callback_function</a>(<span class="keyword">struct</span> lws *wsi, <span class="keyword">enum</span> <a class="code" href="group__usercb.html#gad62860e19975ba4c4af401c3cdb6abf7">lws_callback_reasons</a> reason,</div><div class="line"><a name="l00898"></a><span class="lineno"> 898</span>  <span class="keywordtype">void</span> *user, <span class="keywordtype">void</span> *in, <span class="keywordtype">size_t</span> len);</div><div class="line"><a name="l00900"></a><span class="lineno"> 900</span> </div><div class="line"><a name="l00910"></a><span class="lineno"> 910</span> </div><div class="line"><a name="l00912"></a><span class="lineno"> 912</span> <span class="comment">/*</span></div><div class="line"><a name="l00913"></a><span class="lineno"> 913</span> <span class="comment"> * NOTE: These public enums are part of the abi. If you want to add one,</span></div><div class="line"><a name="l00914"></a><span class="lineno"> 914</span> <span class="comment"> * add it at where specified so existing users are unaffected.</span></div><div class="line"><a name="l00915"></a><span class="lineno"> 915</span> <span class="comment"> */</span></div><div class="line"><a name="l00916"></a><span class="lineno"> 916</span> <span class="keyword">enum</span> lws_extension_callback_reasons {</div><div class="line"><a name="l00917"></a><span class="lineno"> 917</span>  LWS_EXT_CB_SERVER_CONTEXT_CONSTRUCT = 0,</div><div class="line"><a name="l00918"></a><span class="lineno"> 918</span>  LWS_EXT_CB_CLIENT_CONTEXT_CONSTRUCT = 1,</div><div class="line"><a name="l00919"></a><span class="lineno"> 919</span>  LWS_EXT_CB_SERVER_CONTEXT_DESTRUCT = 2,</div><div class="line"><a name="l00920"></a><span class="lineno"> 920</span>  LWS_EXT_CB_CLIENT_CONTEXT_DESTRUCT = 3,</div><div class="line"><a name="l00921"></a><span class="lineno"> 921</span>  LWS_EXT_CB_CONSTRUCT = 4,</div><div class="line"><a name="l00922"></a><span class="lineno"> 922</span>  LWS_EXT_CB_CLIENT_CONSTRUCT = 5,</div><div class="line"><a name="l00923"></a><span class="lineno"> 923</span>  LWS_EXT_CB_CHECK_OK_TO_REALLY_CLOSE = 6,</div><div class="line"><a name="l00924"></a><span class="lineno"> 924</span>  LWS_EXT_CB_CHECK_OK_TO_PROPOSE_EXTENSION = 7,</div><div class="line"><a name="l00925"></a><span class="lineno"> 925</span>  LWS_EXT_CB_DESTROY = 8,</div><div class="line"><a name="l00926"></a><span class="lineno"> 926</span>  LWS_EXT_CB_DESTROY_ANY_WSI_CLOSING = 9,</div><div class="line"><a name="l00927"></a><span class="lineno"> 927</span>  LWS_EXT_CB_ANY_WSI_ESTABLISHED = 10,</div><div class="line"><a name="l00928"></a><span class="lineno"> 928</span>  LWS_EXT_CB_PACKET_RX_PREPARSE = 11,</div><div class="line"><a name="l00929"></a><span class="lineno"> 929</span>  LWS_EXT_CB_PACKET_TX_PRESEND = 12,</div><div class="line"><a name="l00930"></a><span class="lineno"> 930</span>  LWS_EXT_CB_PACKET_TX_DO_SEND = 13,</div><div class="line"><a name="l00931"></a><span class="lineno"> 931</span>  LWS_EXT_CB_HANDSHAKE_REPLY_TX = 14,</div><div class="line"><a name="l00932"></a><span class="lineno"> 932</span>  LWS_EXT_CB_FLUSH_PENDING_TX = 15,</div><div class="line"><a name="l00933"></a><span class="lineno"> 933</span>  LWS_EXT_CB_EXTENDED_PAYLOAD_RX = 16,</div><div class="line"><a name="l00934"></a><span class="lineno"> 934</span>  LWS_EXT_CB_CAN_PROXY_CLIENT_CONNECTION = 17,</div><div class="line"><a name="l00935"></a><span class="lineno"> 935</span>  LWS_EXT_CB_1HZ = 18,</div><div class="line"><a name="l00936"></a><span class="lineno"> 936</span>  LWS_EXT_CB_REQUEST_ON_WRITEABLE = 19,</div><div class="line"><a name="l00937"></a><span class="lineno"> 937</span>  LWS_EXT_CB_IS_WRITEABLE = 20,</div><div class="line"><a name="l00938"></a><span class="lineno"> 938</span>  LWS_EXT_CB_PAYLOAD_TX = 21,</div><div class="line"><a name="l00939"></a><span class="lineno"> 939</span>  LWS_EXT_CB_PAYLOAD_RX = 22,</div><div class="line"><a name="l00940"></a><span class="lineno"> 940</span>  LWS_EXT_CB_OPTION_DEFAULT = 23,</div><div class="line"><a name="l00941"></a><span class="lineno"> 941</span>  LWS_EXT_CB_OPTION_SET = 24,</div><div class="line"><a name="l00942"></a><span class="lineno"> 942</span>  LWS_EXT_CB_OPTION_CONFIRM = 25,</div><div class="line"><a name="l00943"></a><span class="lineno"> 943</span>  LWS_EXT_CB_NAMED_OPTION_SET = 26,</div><div class="line"><a name="l00944"></a><span class="lineno"> 944</span> </div><div class="line"><a name="l00945"></a><span class="lineno"> 945</span>  <span class="comment">/****** add new things just above ---^ ******/</span></div><div class="line"><a name="l00946"></a><span class="lineno"> 946</span> };</div><div class="line"><a name="l00947"></a><span class="lineno"> 947</span> </div><div class="line"><a name="l00949"></a><span class="lineno"><a class="line" href="group__extensions.html#gacc9f55936dc165257a2e1f7d47bce89e"> 949</a></span> <span class="keyword">enum</span> <a class="code" href="group__extensions.html#gacc9f55936dc165257a2e1f7d47bce89e">lws_ext_options_types</a> {</div><div class="line"><a name="l00950"></a><span class="lineno"><a class="line" href="group__extensions.html#ggacc9f55936dc165257a2e1f7d47bce89eaabcf56c456c1ff6e81dc82586a16f14c"> 950</a></span>  <a class="code" href="group__extensions.html#ggacc9f55936dc165257a2e1f7d47bce89eaabcf56c456c1ff6e81dc82586a16f14c">EXTARG_NONE</a>, </div><div class="line"><a name="l00951"></a><span class="lineno"><a class="line" href="group__extensions.html#ggacc9f55936dc165257a2e1f7d47bce89ea1c86adf924c8786a12bee9687094673e"> 951</a></span>  <a class="code" href="group__extensions.html#ggacc9f55936dc165257a2e1f7d47bce89ea1c86adf924c8786a12bee9687094673e">EXTARG_DEC</a>, </div><div class="line"><a name="l00952"></a><span class="lineno"><a class="line" href="group__extensions.html#ggacc9f55936dc165257a2e1f7d47bce89ea5265abe3e1c3f64412f2affe7bffd880"> 952</a></span>  <a class="code" href="group__extensions.html#ggacc9f55936dc165257a2e1f7d47bce89ea5265abe3e1c3f64412f2affe7bffd880">EXTARG_OPT_DEC</a> </div><div class="line"><a name="l00954"></a><span class="lineno"> 954</span>  <span class="comment">/* Add new things just above here ---^</span></div><div class="line"><a name="l00955"></a><span class="lineno"> 955</span> <span class="comment"> * This is part of the ABI, don't needlessly break compatibility */</span></div><div class="line"><a name="l00956"></a><span class="lineno"> 956</span> };</div><div class="line"><a name="l00957"></a><span class="lineno"> 957</span> </div><div class="line"><a name="l00962"></a><span class="lineno"><a class="line" href="structlws__ext__options.html"> 962</a></span> <span class="keyword">struct </span><a class="code" href="structlws__ext__options.html">lws_ext_options</a> {</div><div class="line"><a name="l00963"></a><span class="lineno"><a class="line" href="structlws__ext__options.html#a1769e4a9805bbdda227821e9578ddc7e"> 963</a></span>  <span class="keyword">const</span> <span class="keywordtype">char</span> *<a class="code" href="structlws__ext__options.html#a1769e4a9805bbdda227821e9578ddc7e">name</a>; </div><div class="line"><a name="l00964"></a><span class="lineno"><a class="line" href="structlws__ext__options.html#a7c4dbd62dbeba63a9d50d2306bd1cc61"> 964</a></span>  <span class="keyword">enum</span> <a class="code" href="group__extensions.html#gacc9f55936dc165257a2e1f7d47bce89e">lws_ext_options_types</a> type; </div><div class="line"><a name="l00966"></a><span class="lineno"> 966</span>  <span class="comment">/* Add new things just above here ---^</span></div><div class="line"><a name="l00967"></a><span class="lineno"> 967</span> <span class="comment"> * This is part of the ABI, don't needlessly break compatibility */</span></div><div class="line"><a name="l00968"></a><span class="lineno"> 968</span> };</div><div class="line"><a name="l00969"></a><span class="lineno"> 969</span> </div><div class="line"><a name="l00971"></a><span class="lineno"><a class="line" href="structlws__ext__option__arg.html"> 971</a></span> <span class="keyword">struct </span><a class="code" href="structlws__ext__option__arg.html">lws_ext_option_arg</a> {</div><div class="line"><a name="l00972"></a><span class="lineno"><a class="line" href="structlws__ext__option__arg.html#a0a320c56b79271b8f059eeaad9423ac9"> 972</a></span>  <span class="keyword">const</span> <span class="keywordtype">char</span> *<a class="code" href="structlws__ext__option__arg.html#a0a320c56b79271b8f059eeaad9423ac9">option_name</a>; </div><div class="line"><a name="l00973"></a><span class="lineno"><a class="line" href="structlws__ext__option__arg.html#af57fffcfa253dfa8d98681ac1fb1785f"> 973</a></span>  <span class="keywordtype">int</span> <a class="code" href="structlws__ext__option__arg.html#af57fffcfa253dfa8d98681ac1fb1785f">option_index</a>; </div><div class="line"><a name="l00974"></a><span class="lineno"><a class="line" href="structlws__ext__option__arg.html#a0b1f7b30c3ceaf5f1bf9d105c24568d1"> 974</a></span>  <span class="keyword">const</span> <span class="keywordtype">char</span> *<a class="code" href="structlws__ext__option__arg.html#a0b1f7b30c3ceaf5f1bf9d105c24568d1">start</a>; </div><div class="line"><a name="l00975"></a><span class="lineno"><a class="line" href="structlws__ext__option__arg.html#af37f0b6caa7735af51a1ac12b68d5bc5"> 975</a></span>  <span class="keywordtype">int</span> <a class="code" href="structlws__ext__option__arg.html#af37f0b6caa7735af51a1ac12b68d5bc5">len</a>; </div><div class="line"><a name="l00976"></a><span class="lineno"> 976</span> };</div><div class="line"><a name="l00977"></a><span class="lineno"> 977</span> </div><div class="line"><a name="l01038"></a><span class="lineno"> 1038</span> <span class="keyword">typedef</span> <span class="keywordtype">int</span></div><div class="line"><a name="l01039"></a><span class="lineno"><a class="line" href="group__extensions.html#gaae7169b2cd346b34fa33d0250db2afd0"> 1039</a></span> <a class="code" href="group__extensions.html#gaae7169b2cd346b34fa33d0250db2afd0">lws_extension_callback_function</a>(<span class="keyword">struct</span> lws_context *context,</div><div class="line"><a name="l01040"></a><span class="lineno"> 1040</span>  <span class="keyword">const</span> <span class="keyword">struct</span> <a class="code" href="structlws__extension.html">lws_extension</a> *ext, <span class="keyword">struct</span> lws *wsi,</div><div class="line"><a name="l01041"></a><span class="lineno"> 1041</span>  <span class="keyword">enum</span> lws_extension_callback_reasons reason,</div><div class="line"><a name="l01042"></a><span class="lineno"> 1042</span>  <span class="keywordtype">void</span> *user, <span class="keywordtype">void</span> *in, <span class="keywordtype">size_t</span> len);</div><div class="line"><a name="l01043"></a><span class="lineno"> 1043</span> </div><div class="line"><a name="l01045"></a><span class="lineno"><a class="line" href="structlws__extension.html"> 1045</a></span> <span class="keyword">struct </span><a class="code" href="structlws__extension.html">lws_extension</a> {</div><div class="line"><a name="l01046"></a><span class="lineno"><a class="line" href="structlws__extension.html#a1e5018c883d85176f5c2152176843f9e"> 1046</a></span>  <span class="keyword">const</span> <span class="keywordtype">char</span> *<a class="code" href="structlws__extension.html#a1e5018c883d85176f5c2152176843f9e">name</a>; </div><div class="line"><a name="l01047"></a><span class="lineno"><a class="line" href="structlws__extension.html#afa21f3b3c8c2c9212a276c52b680c3af"> 1047</a></span>  <a class="code" href="group__extensions.html#gaae7169b2cd346b34fa33d0250db2afd0">lws_extension_callback_function</a> *<a class="code" href="structlws__extension.html#afa21f3b3c8c2c9212a276c52b680c3af">callback</a>; </div><div class="line"><a name="l01048"></a><span class="lineno"><a class="line" href="structlws__extension.html#a36b06c213aedb02bf9a402651751855b"> 1048</a></span>  <span class="keyword">const</span> <span class="keywordtype">char</span> *<a class="code" href="structlws__extension.html#a36b06c213aedb02bf9a402651751855b">client_offer</a>; </div><div class="line"><a name="l01050"></a><span class="lineno"> 1050</span>  <span class="comment">/* Add new things just above here ---^</span></div><div class="line"><a name="l01051"></a><span class="lineno"> 1051</span> <span class="comment"> * This is part of the ABI, don't needlessly break compatibility */</span></div><div class="line"><a name="l01052"></a><span class="lineno"> 1052</span> };</div><div class="line"><a name="l01053"></a><span class="lineno"> 1053</span> </div><div class="line"><a name="l01062"></a><span class="lineno"> 1062</span> LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l01063"></a><span class="lineno"> 1063</span> <a class="code" href="group__extensions.html#gae0e24e1768f83a7fb07896ce975704b9">lws_set_extension_option</a>(<span class="keyword">struct</span> lws *wsi, <span class="keyword">const</span> <span class="keywordtype">char</span> *ext_name,</div><div class="line"><a name="l01064"></a><span class="lineno"> 1064</span>  <span class="keyword">const</span> <span class="keywordtype">char</span> *opt_name, <span class="keyword">const</span> <span class="keywordtype">char</span> *opt_val);</div><div class="line"><a name="l01065"></a><span class="lineno"> 1065</span> </div><div class="line"><a name="l01066"></a><span class="lineno"> 1066</span> <span class="preprocessor">#ifndef LWS_NO_EXTENSIONS</span></div><div class="line"><a name="l01067"></a><span class="lineno"> 1067</span> <span class="comment">/* lws_get_internal_extensions() - DEPRECATED</span></div><div class="line"><a name="l01068"></a><span class="lineno"> 1068</span> <span class="comment"> *</span></div><div class="line"><a name="l01069"></a><span class="lineno"> 1069</span> <span class="comment"> * \Deprecated There is no longer a set internal extensions table. The table is provided</span></div><div class="line"><a name="l01070"></a><span class="lineno"> 1070</span> <span class="comment"> * by user code along with application-specific settings. See the test</span></div><div class="line"><a name="l01071"></a><span class="lineno"> 1071</span> <span class="comment"> * client and server for how to do.</span></div><div class="line"><a name="l01072"></a><span class="lineno"> 1072</span> <span class="comment"> */</span></div><div class="line"><a name="l01073"></a><span class="lineno"> 1073</span> <span class="keyword">static</span> LWS_INLINE LWS_WARN_DEPRECATED <span class="keyword">const</span> <span class="keyword">struct </span><a class="code" href="structlws__extension.html">lws_extension</a> *</div><div class="line"><a name="l01074"></a><span class="lineno"> 1074</span> lws_get_internal_extensions() { <span class="keywordflow">return</span> NULL; }</div><div class="line"><a name="l01075"></a><span class="lineno"> 1075</span> </div><div class="line"><a name="l01086"></a><span class="lineno"> 1086</span> LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span> LWS_WARN_UNUSED_RESULT</div><div class="line"><a name="l01087"></a><span class="lineno"> 1087</span> <a class="code" href="group__extensions.html#ga6fb3e2c3dfb9d64dc87026a4e99c128b">lws_ext_parse_options</a>(<span class="keyword">const</span> <span class="keyword">struct</span> <a class="code" href="structlws__extension.html">lws_extension</a> *ext, <span class="keyword">struct</span> lws *wsi,</div><div class="line"><a name="l01088"></a><span class="lineno"> 1088</span>  <span class="keywordtype">void</span> *ext_user, <span class="keyword">const</span> <span class="keyword">struct</span> <a class="code" href="structlws__ext__options.html">lws_ext_options</a> *opts,</div><div class="line"><a name="l01089"></a><span class="lineno"> 1089</span>  <span class="keyword">const</span> <span class="keywordtype">char</span> *o, <span class="keywordtype">int</span> len);</div><div class="line"><a name="l01090"></a><span class="lineno"> 1090</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l01091"></a><span class="lineno"> 1091</span> </div><div class="line"><a name="l01104"></a><span class="lineno"> 1104</span> LWS_EXTERN</div><div class="line"><a name="l01105"></a><span class="lineno"> 1105</span> <span class="keywordtype">int</span> <a class="code" href="group__extensions.html#ga4cdbe42d872e21a448a947714d6c607e">lws_extension_callback_pm_deflate</a>(</div><div class="line"><a name="l01106"></a><span class="lineno"> 1106</span>  <span class="keyword">struct</span> lws_context *context, <span class="keyword">const</span> <span class="keyword">struct</span> <a class="code" href="structlws__extension.html">lws_extension</a> *ext,</div><div class="line"><a name="l01107"></a><span class="lineno"> 1107</span>  <span class="keyword">struct</span> lws *wsi, <span class="keyword">enum</span> lws_extension_callback_reasons reason,</div><div class="line"><a name="l01108"></a><span class="lineno"> 1108</span>  <span class="keywordtype">void</span> *user, <span class="keywordtype">void</span> *in, <span class="keywordtype">size_t</span> len);</div><div class="line"><a name="l01109"></a><span class="lineno"> 1109</span> </div><div class="line"><a name="l01110"></a><span class="lineno"> 1110</span> <span class="comment">/*</span></div><div class="line"><a name="l01111"></a><span class="lineno"> 1111</span> <span class="comment"> * The internal exts are part of the public abi</span></div><div class="line"><a name="l01112"></a><span class="lineno"> 1112</span> <span class="comment"> * If we add more extensions, publish the callback here ------v</span></div><div class="line"><a name="l01113"></a><span class="lineno"> 1113</span> <span class="comment"> */</span></div><div class="line"><a name="l01115"></a><span class="lineno"> 1115</span> </div><div class="line"><a name="l01131"></a><span class="lineno"> 1131</span> </div><div class="line"><a name="l01135"></a><span class="lineno"><a class="line" href="structlws__protocols.html"> 1135</a></span> <span class="keyword">struct </span><a class="code" href="structlws__protocols.html">lws_protocols</a> {</div><div class="line"><a name="l01136"></a><span class="lineno"><a class="line" href="structlws__protocols.html#a0e63edb457a613c3fa4271e0a8f19624"> 1136</a></span>  <span class="keyword">const</span> <span class="keywordtype">char</span> *<a class="code" href="structlws__protocols.html#a0e63edb457a613c3fa4271e0a8f19624">name</a>;</div><div class="line"><a name="l01139"></a><span class="lineno"><a class="line" href="structlws__protocols.html#acabf94c1a9bfe7be0387fbb0e0c56b2d"> 1139</a></span>  <a class="code" href="group__usercb.html#gad4fcb82e68d60ffacca61a3f783a0a2f">lws_callback_function</a> *<a class="code" href="structlws__protocols.html#acabf94c1a9bfe7be0387fbb0e0c56b2d">callback</a>;</div><div class="line"><a name="l01143"></a><span class="lineno"><a class="line" href="structlws__protocols.html#a9bbd85f591ffb4259711cb5acbb05bea"> 1143</a></span>  <span class="keywordtype">size_t</span> <a class="code" href="structlws__protocols.html#a9bbd85f591ffb4259711cb5acbb05bea">per_session_data_size</a>;</div><div class="line"><a name="l01148"></a><span class="lineno"><a class="line" href="structlws__protocols.html#a0d1d4996d81b2f5e125bcec981e461c5"> 1148</a></span>  <span class="keywordtype">size_t</span> <a class="code" href="structlws__protocols.html#a0d1d4996d81b2f5e125bcec981e461c5">rx_buffer_size</a>;</div><div class="line"><a name="l01157"></a><span class="lineno"><a class="line" href="structlws__protocols.html#a6b632018590c2b1bbe43fbab6d5e6fac"> 1157</a></span>  <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="structlws__protocols.html#a6b632018590c2b1bbe43fbab6d5e6fac">id</a>;</div><div class="line"><a name="l01164"></a><span class="lineno"><a class="line" href="structlws__protocols.html#a3cbd903ad076736ae934a54cae36580e"> 1164</a></span>  <span class="keywordtype">void</span> *<a class="code" href="structlws__protocols.html#a3cbd903ad076736ae934a54cae36580e">user</a>; </div><div class="line"><a name="l01167"></a><span class="lineno"> 1167</span>  <span class="comment">/* Add new things just above here ---^</span></div><div class="line"><a name="l01168"></a><span class="lineno"> 1168</span> <span class="comment"> * This is part of the ABI, don't needlessly break compatibility */</span></div><div class="line"><a name="l01169"></a><span class="lineno"> 1169</span> };</div><div class="line"><a name="l01170"></a><span class="lineno"> 1170</span> </div><div class="line"><a name="l01171"></a><span class="lineno"> 1171</span> <span class="keyword">struct </span>lws_vhost;</div><div class="line"><a name="l01172"></a><span class="lineno"> 1172</span> </div><div class="line"><a name="l01181"></a><span class="lineno"> 1181</span> LWS_VISIBLE LWS_EXTERN <span class="keyword">const</span> <span class="keyword">struct </span><a class="code" href="structlws__protocols.html">lws_protocols</a> *</div><div class="line"><a name="l01182"></a><span class="lineno"> 1182</span> <a class="code" href="group__Protocols-and-Plugins.html#ga25754726d97c5f519d313e691a9fe29d">lws_vhost_name_to_protocol</a>(<span class="keyword">struct</span> lws_vhost *vh, <span class="keyword">const</span> <span class="keywordtype">char</span> *<a class="code" href="structlws__protocols.html#a0e63edb457a613c3fa4271e0a8f19624">name</a>);</div><div class="line"><a name="l01183"></a><span class="lineno"> 1183</span> </div><div class="line"><a name="l01193"></a><span class="lineno"> 1193</span> LWS_VISIBLE LWS_EXTERN <span class="keyword">const</span> <span class="keyword">struct </span><a class="code" href="structlws__protocols.html">lws_protocols</a> *</div><div class="line"><a name="l01194"></a><span class="lineno"> 1194</span> <a class="code" href="group__Protocols-and-Plugins.html#ga72ad550786ca7976463589d347e62112">lws_get_protocol</a>(<span class="keyword">struct</span> lws *wsi);</div><div class="line"><a name="l01195"></a><span class="lineno"> 1195</span> </div><div class="line"><a name="l01197"></a><span class="lineno"> 1197</span> LWS_VISIBLE LWS_EXTERN <span class="keyword">const</span> <span class="keyword">struct </span><a class="code" href="structlws__protocols.html">lws_protocols</a> *</div><div class="line"><a name="l01198"></a><span class="lineno"> 1198</span> <a class="code" href="group__Protocols-and-Plugins.html#ga8bbe5e65faca068845704bab911a5030">lws_protocol_get</a>(<span class="keyword">struct</span> lws *wsi) LWS_WARN_DEPRECATED;</div><div class="line"><a name="l01199"></a><span class="lineno"> 1199</span> </div><div class="line"><a name="l01210"></a><span class="lineno"> 1210</span> LWS_VISIBLE LWS_EXTERN <span class="keywordtype">void</span> *</div><div class="line"><a name="l01211"></a><span class="lineno"> 1211</span> <a class="code" href="group__Protocols-and-Plugins.html#gaec0c0477288ff3f83aff38d357b883d1">lws_protocol_vh_priv_zalloc</a>(<span class="keyword">struct</span> lws_vhost *vhost, <span class="keyword">const</span> <span class="keyword">struct</span> <a class="code" href="structlws__protocols.html">lws_protocols</a> *prot,</div><div class="line"><a name="l01212"></a><span class="lineno"> 1212</span>  <span class="keywordtype">int</span> size);</div><div class="line"><a name="l01213"></a><span class="lineno"> 1213</span> </div><div class="line"><a name="l01223"></a><span class="lineno"> 1223</span> LWS_VISIBLE LWS_EXTERN <span class="keywordtype">void</span> *</div><div class="line"><a name="l01224"></a><span class="lineno"> 1224</span> <a class="code" href="group__Protocols-and-Plugins.html#gaf3be4243443baac0f8be1fcfb4d25129">lws_protocol_vh_priv_get</a>(<span class="keyword">struct</span> lws_vhost *vhost, <span class="keyword">const</span> <span class="keyword">struct</span> <a class="code" href="structlws__protocols.html">lws_protocols</a> *prot);</div><div class="line"><a name="l01225"></a><span class="lineno"> 1225</span> </div><div class="line"><a name="l01234"></a><span class="lineno"> 1234</span> LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l01235"></a><span class="lineno"> 1235</span> <a class="code" href="group__Protocols-and-Plugins.html#ga106b37ae9c247e84d191ab09441adc43">lws_finalize_startup</a>(<span class="keyword">struct</span> lws_context *context);</div><div class="line"><a name="l01236"></a><span class="lineno"> 1236</span> </div><div class="line"><a name="l01237"></a><span class="lineno"> 1237</span> <span class="preprocessor">#ifdef LWS_WITH_PLUGINS</span></div><div class="line"><a name="l01238"></a><span class="lineno"> 1238</span> </div><div class="line"><a name="l01239"></a><span class="lineno"> 1239</span> <span class="comment">/* PLUGINS implies LIBUV */</span></div><div class="line"><a name="l01240"></a><span class="lineno"> 1240</span> </div><div class="line"><a name="l01241"></a><span class="lineno"> 1241</span> <span class="preprocessor">#define LWS_PLUGIN_API_MAGIC 180</span></div><div class="line"><a name="l01242"></a><span class="lineno"> 1242</span> </div><div class="line"><a name="l01244"></a><span class="lineno"><a class="line" href="structlws__plugin__capability.html"> 1244</a></span> <span class="keyword">struct </span><a class="code" href="structlws__plugin__capability.html">lws_plugin_capability</a> {</div><div class="line"><a name="l01245"></a><span class="lineno"><a class="line" href="structlws__plugin__capability.html#a523c7cde6f15bba345f56493dcf6b32a"> 1245</a></span>  <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="structlws__plugin__capability.html#a523c7cde6f15bba345f56493dcf6b32a">api_magic</a>; </div><div class="line"><a name="l01246"></a><span class="lineno"><a class="line" href="structlws__plugin__capability.html#a6a4d9d01e770f378ddadc77b37522033"> 1246</a></span>  <span class="keyword">const</span> <span class="keyword">struct </span><a class="code" href="structlws__protocols.html">lws_protocols</a> *<a class="code" href="structlws__plugin__capability.html#a6a4d9d01e770f378ddadc77b37522033">protocols</a>; </div><div class="line"><a name="l01247"></a><span class="lineno"><a class="line" href="structlws__plugin__capability.html#ae38f7cf1246b9ca3af3cbf9d46b7090f"> 1247</a></span>  <span class="keywordtype">int</span> <a class="code" href="structlws__plugin__capability.html#ae38f7cf1246b9ca3af3cbf9d46b7090f">count_protocols</a>; </div><div class="line"><a name="l01248"></a><span class="lineno"><a class="line" href="structlws__plugin__capability.html#a7936f0eb93d79dea76b903d0f8a5f623"> 1248</a></span>  <span class="keyword">const</span> <span class="keyword">struct </span><a class="code" href="structlws__extension.html">lws_extension</a> *<a class="code" href="structlws__plugin__capability.html#a7936f0eb93d79dea76b903d0f8a5f623">extensions</a>; </div><div class="line"><a name="l01249"></a><span class="lineno"><a class="line" href="structlws__plugin__capability.html#abcf51db969522fdda9aaf902e65739d3"> 1249</a></span>  <span class="keywordtype">int</span> <a class="code" href="structlws__plugin__capability.html#abcf51db969522fdda9aaf902e65739d3">count_extensions</a>; </div><div class="line"><a name="l01250"></a><span class="lineno"> 1250</span> };</div><div class="line"><a name="l01251"></a><span class="lineno"> 1251</span> </div><div class="line"><a name="l01252"></a><span class="lineno"> 1252</span> <span class="keyword">typedef</span> int (*lws_plugin_init_func)(<span class="keyword">struct </span>lws_context *,</div><div class="line"><a name="l01253"></a><span class="lineno"> 1253</span>  <span class="keyword">struct </span><a class="code" href="structlws__plugin__capability.html">lws_plugin_capability</a> *);</div><div class="line"><a name="l01254"></a><span class="lineno"> 1254</span> <span class="keyword">typedef</span> int (*lws_plugin_destroy_func)(<span class="keyword">struct </span>lws_context *);</div><div class="line"><a name="l01255"></a><span class="lineno"> 1255</span> </div><div class="line"><a name="l01257"></a><span class="lineno"><a class="line" href="structlws__plugin.html"> 1257</a></span> <span class="keyword">struct </span><a class="code" href="structlws__plugin.html">lws_plugin</a> {</div><div class="line"><a name="l01258"></a><span class="lineno"><a class="line" href="structlws__plugin.html#a65dffd68fd267ce17b988790d1d35f22"> 1258</a></span>  <span class="keyword">struct </span><a class="code" href="structlws__plugin.html">lws_plugin</a> *<a class="code" href="structlws__plugin.html#a65dffd68fd267ce17b988790d1d35f22">list</a>; </div><div class="line"><a name="l01259"></a><span class="lineno"> 1259</span> <span class="preprocessor">#if (UV_VERSION_MAJOR > 0)</span></div><div class="line"><a name="l01260"></a><span class="lineno"><a class="line" href="structlws__plugin.html#af9e1042dc1de5b9d202c2f5fd1834330"> 1260</a></span>  uv_lib_t <a class="code" href="structlws__plugin.html#af9e1042dc1de5b9d202c2f5fd1834330">lib</a>; </div><div class="line"><a name="l01261"></a><span class="lineno"> 1261</span> <span class="preprocessor">#else</span></div><div class="line"><a name="l01262"></a><span class="lineno"><a class="line" href="structlws__plugin.html#a4ef37a43653715b6c69cbf8a7be747f4"> 1262</a></span>  <span class="keywordtype">void</span> *<a class="code" href="structlws__plugin.html#a4ef37a43653715b6c69cbf8a7be747f4">l</a>; </div><div class="line"><a name="l01263"></a><span class="lineno"> 1263</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l01264"></a><span class="lineno"><a class="line" href="structlws__plugin.html#af4ac8fcb79e10e0c2d960e1804d98105"> 1264</a></span>  <span class="keywordtype">char</span> <a class="code" href="structlws__plugin.html#af4ac8fcb79e10e0c2d960e1804d98105">name</a>[64]; </div><div class="line"><a name="l01265"></a><span class="lineno"><a class="line" href="structlws__plugin.html#ac7f1fdfe8cf8a21f8ee9720c21934a3f"> 1265</a></span>  <span class="keyword">struct </span><a class="code" href="structlws__plugin__capability.html">lws_plugin_capability</a> caps; </div><div class="line"><a name="l01266"></a><span class="lineno"> 1266</span> };</div><div class="line"><a name="l01267"></a><span class="lineno"> 1267</span> </div><div class="line"><a name="l01268"></a><span class="lineno"> 1268</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l01269"></a><span class="lineno"> 1269</span> </div><div class="line"><a name="l01271"></a><span class="lineno"> 1271</span> </div><div class="line"><a name="l01272"></a><span class="lineno"> 1272</span> </div><div class="line"><a name="l01281"></a><span class="lineno"> 1281</span> </div><div class="line"><a name="l01283"></a><span class="lineno"> 1283</span> <span class="preprocessor">#define LWSGS_EMAIL_CONTENT_SIZE 16384</span></div><div class="line"><a name="l01284"></a><span class="lineno"> 1284</span> </div><div class="line"><a name="l01286"></a><span class="lineno"> 1286</span> <span class="comment">/* SHA-1 binary and hexified versions */</span></div><div class="line"><a name="l01288"></a><span class="lineno"><a class="line" href="structlwsgw__hash__bin.html#ac92f50d9471058525d110597a4e0de6b"> 1288</a></span> <span class="keyword">typedef</span> <span class="keyword">struct </span>{ <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> bin[20]; } <a class="code" href="structlwsgw__hash__bin.html">lwsgw_hash_bin</a>;</div><div class="line"><a name="l01290"></a><span class="lineno"><a class="line" href="structlwsgw__hash.html#a29435f5cf78747d4257695b0f141d164"> 1290</a></span> <span class="keyword">typedef</span> <span class="keyword">struct </span>{ <span class="keywordtype">char</span> <span class="keywordtype">id</span>[41]; } <a class="code" href="structlwsgw__hash.html">lwsgw_hash</a>;</div><div class="line"><a name="l01291"></a><span class="lineno"> 1291</span> </div><div class="line"><a name="l01293"></a><span class="lineno"><a class="line" href="group__generic-sessions.html#ga7c2dc7bfb4ccb91c5d771f9e9ea237e1"> 1293</a></span> <span class="keyword">enum</span> <a class="code" href="group__generic-sessions.html#ga7c2dc7bfb4ccb91c5d771f9e9ea237e1">lwsgs_auth_bits</a> {</div><div class="line"><a name="l01294"></a><span class="lineno"><a class="line" href="group__generic-sessions.html#gga7c2dc7bfb4ccb91c5d771f9e9ea237e1a81e63075115dedd150265d81b8f7fa57"> 1294</a></span>  <a class="code" href="group__generic-sessions.html#gga7c2dc7bfb4ccb91c5d771f9e9ea237e1a81e63075115dedd150265d81b8f7fa57">LWSGS_AUTH_LOGGED_IN</a> = 1, </div><div class="line"><a name="l01295"></a><span class="lineno"><a class="line" href="group__generic-sessions.html#gga7c2dc7bfb4ccb91c5d771f9e9ea237e1a0657a9e846814781b128c397fe4b10bf"> 1295</a></span>  <a class="code" href="group__generic-sessions.html#gga7c2dc7bfb4ccb91c5d771f9e9ea237e1a0657a9e846814781b128c397fe4b10bf">LWSGS_AUTH_ADMIN</a> = 2, </div><div class="line"><a name="l01296"></a><span class="lineno"><a class="line" href="group__generic-sessions.html#gga7c2dc7bfb4ccb91c5d771f9e9ea237e1a5a607e4668d20cadada62c4b8007f887"> 1296</a></span>  <a class="code" href="group__generic-sessions.html#gga7c2dc7bfb4ccb91c5d771f9e9ea237e1a5a607e4668d20cadada62c4b8007f887">LWSGS_AUTH_VERIFIED</a> = 4, </div><div class="line"><a name="l01297"></a><span class="lineno"><a class="line" href="group__generic-sessions.html#gga7c2dc7bfb4ccb91c5d771f9e9ea237e1a2cd8fb86e3b85c106e7711c03f0ddd0a"> 1297</a></span>  <a class="code" href="group__generic-sessions.html#gga7c2dc7bfb4ccb91c5d771f9e9ea237e1a2cd8fb86e3b85c106e7711c03f0ddd0a">LWSGS_AUTH_FORGOT_FLOW</a> = 8, </div><div class="line"><a name="l01298"></a><span class="lineno"> 1298</span> };</div><div class="line"><a name="l01299"></a><span class="lineno"> 1299</span> </div><div class="line"><a name="l01301"></a><span class="lineno"><a class="line" href="structlws__session__info.html"> 1301</a></span> <span class="keyword">struct </span><a class="code" href="structlws__session__info.html">lws_session_info</a> {</div><div class="line"><a name="l01302"></a><span class="lineno"><a class="line" href="structlws__session__info.html#a3d57a70b6e7181d95a8bec429b1a7697"> 1302</a></span>  <span class="keywordtype">char</span> username[32]; </div><div class="line"><a name="l01303"></a><span class="lineno"><a class="line" href="structlws__session__info.html#a94b813cfc6b0da4b182659de30038ad3"> 1303</a></span>  <span class="keywordtype">char</span> email[100]; </div><div class="line"><a name="l01304"></a><span class="lineno"><a class="line" href="structlws__session__info.html#a53eed02325e8717a53297391e3e98fac"> 1304</a></span>  <span class="keywordtype">char</span> ip[72]; </div><div class="line"><a name="l01305"></a><span class="lineno"><a class="line" href="structlws__session__info.html#afb924864b70f40372920688a5c1c895e"> 1305</a></span>  <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="structlws__session__info.html#afb924864b70f40372920688a5c1c895e">mask</a>; </div><div class="line"><a name="l01307"></a><span class="lineno"><a class="line" href="structlws__session__info.html#a4353b5dd19400b2b15edfd7cee1e4cd5"> 1307</a></span>  <span class="keywordtype">char</span> session[42]; </div><div class="line"><a name="l01308"></a><span class="lineno"> 1308</span> };</div><div class="line"><a name="l01309"></a><span class="lineno"> 1309</span> </div><div class="line"><a name="l01311"></a><span class="lineno"><a class="line" href="group__generic-sessions.html#gaa93946b3d921072209d5cd8cdfa5332e"> 1311</a></span> <span class="keyword">enum</span> <a class="code" href="group__generic-sessions.html#gaa93946b3d921072209d5cd8cdfa5332e">lws_gs_event</a> {</div><div class="line"><a name="l01312"></a><span class="lineno"><a class="line" href="group__generic-sessions.html#ggaa93946b3d921072209d5cd8cdfa5332ea596010a165bf13473c5eea3a34cd4308"> 1312</a></span>  <a class="code" href="group__generic-sessions.html#ggaa93946b3d921072209d5cd8cdfa5332ea596010a165bf13473c5eea3a34cd4308">LWSGSE_CREATED</a>, </div><div class="line"><a name="l01313"></a><span class="lineno"><a class="line" href="group__generic-sessions.html#ggaa93946b3d921072209d5cd8cdfa5332ead908cdc5689c5d22c9d3c8934e94dcde"> 1313</a></span>  <a class="code" href="group__generic-sessions.html#ggaa93946b3d921072209d5cd8cdfa5332ead908cdc5689c5d22c9d3c8934e94dcde">LWSGSE_DELETED</a> </div><div class="line"><a name="l01314"></a><span class="lineno"> 1314</span> };</div><div class="line"><a name="l01315"></a><span class="lineno"> 1315</span> </div><div class="line"><a name="l01317"></a><span class="lineno"><a class="line" href="structlws__gs__event__args.html"> 1317</a></span> <span class="keyword">struct </span><a class="code" href="structlws__gs__event__args.html">lws_gs_event_args</a> {</div><div class="line"><a name="l01318"></a><span class="lineno"><a class="line" href="structlws__gs__event__args.html#a477274f8ca22ba7411b9285b9dc8dd06"> 1318</a></span>  <span class="keyword">enum</span> <a class="code" href="group__generic-sessions.html#gaa93946b3d921072209d5cd8cdfa5332e">lws_gs_event</a> event; </div><div class="line"><a name="l01319"></a><span class="lineno"><a class="line" href="structlws__gs__event__args.html#a2bec693d8a43730d487004a44326178b"> 1319</a></span>  <span class="keyword">const</span> <span class="keywordtype">char</span> *<a class="code" href="structlws__gs__event__args.html#a2bec693d8a43730d487004a44326178b">username</a>; </div><div class="line"><a name="l01320"></a><span class="lineno"><a class="line" href="structlws__gs__event__args.html#acd17e4f9f91f7f9a8f0fbf0744a3a463"> 1320</a></span>  <span class="keyword">const</span> <span class="keywordtype">char</span> *<a class="code" href="structlws__gs__event__args.html#acd17e4f9f91f7f9a8f0fbf0744a3a463">email</a>; </div><div class="line"><a name="l01321"></a><span class="lineno"> 1321</span> };</div><div class="line"><a name="l01322"></a><span class="lineno"> 1322</span> </div><div class="line"><a name="l01324"></a><span class="lineno"> 1324</span> </div><div class="line"><a name="l01325"></a><span class="lineno"> 1325</span> </div><div class="line"><a name="l01339"></a><span class="lineno"> 1339</span> </div><div class="line"><a name="l01341"></a><span class="lineno"> 1341</span> <span class="comment">/*</span></div><div class="line"><a name="l01342"></a><span class="lineno"> 1342</span> <span class="comment"> * NOTE: These public enums are part of the abi. If you want to add one,</span></div><div class="line"><a name="l01343"></a><span class="lineno"> 1343</span> <span class="comment"> * add it at where specified so existing users are unaffected.</span></div><div class="line"><a name="l01344"></a><span class="lineno"> 1344</span> <span class="comment"> */</span></div><div class="line"><a name="l01345"></a><span class="lineno"> 1345</span> </div><div class="line"><a name="l01347"></a><span class="lineno"><a class="line" href="group__context-and-vhost.html#ga41c2d763f78cc248df3b9f8645dbd2a5"> 1347</a></span> <span class="keyword">enum</span> <a class="code" href="group__context-and-vhost.html#ga41c2d763f78cc248df3b9f8645dbd2a5">lws_context_options</a> {</div><div class="line"><a name="l01348"></a><span class="lineno"><a class="line" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a274ed462a1a9239eb6ddf9007f5b7092"> 1348</a></span>  <a class="code" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a274ed462a1a9239eb6ddf9007f5b7092">LWS_SERVER_OPTION_REQUIRE_VALID_OPENSSL_CLIENT_CERT</a> = (1 << 1) |</div><div class="line"><a name="l01349"></a><span class="lineno"> 1349</span>  (1 << 12),</div><div class="line"><a name="l01353"></a><span class="lineno"><a class="line" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a6582c985ee0ceaadc1d277030eae2d7c"> 1353</a></span>  <a class="code" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a6582c985ee0ceaadc1d277030eae2d7c">LWS_SERVER_OPTION_SKIP_SERVER_CANONICAL_NAME</a> = (1 << 2),</div><div class="line"><a name="l01355"></a><span class="lineno"><a class="line" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a1cc4562d05cba52a6dfa0697a65ade0d"> 1355</a></span>  <a class="code" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a1cc4562d05cba52a6dfa0697a65ade0d">LWS_SERVER_OPTION_ALLOW_NON_SSL_ON_SSL_PORT</a> = (1 << 3) |</div><div class="line"><a name="l01356"></a><span class="lineno"> 1356</span>  (1 << 12),</div><div class="line"><a name="l01360"></a><span class="lineno"><a class="line" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a273d9975675130de0c6dc937dde7c8a6"> 1360</a></span>  <a class="code" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a273d9975675130de0c6dc937dde7c8a6">LWS_SERVER_OPTION_LIBEV</a> = (1 << 4),</div><div class="line"><a name="l01362"></a><span class="lineno"><a class="line" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a34ab36e68c0d593b6f19b8d5ef1240a9"> 1362</a></span>  <a class="code" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a34ab36e68c0d593b6f19b8d5ef1240a9">LWS_SERVER_OPTION_DISABLE_IPV6</a> = (1 << 5),</div><div class="line"><a name="l01364"></a><span class="lineno"><a class="line" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a4933347a821e73c3f1e13fb6bfc7ad93"> 1364</a></span>  <a class="code" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a4933347a821e73c3f1e13fb6bfc7ad93">LWS_SERVER_OPTION_DISABLE_OS_CA_CERTS</a> = (1 << 6),</div><div class="line"><a name="l01367"></a><span class="lineno"><a class="line" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5ac56a8a6590e74a8016d0fae09fb404fc"> 1367</a></span>  <a class="code" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5ac56a8a6590e74a8016d0fae09fb404fc">LWS_SERVER_OPTION_PEER_CERT_NOT_REQUIRED</a> = (1 << 7),</div><div class="line"><a name="l01369"></a><span class="lineno"><a class="line" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5aa0158b4e85420811e6b0f1378c6ded0f"> 1369</a></span>  <a class="code" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5aa0158b4e85420811e6b0f1378c6ded0f">LWS_SERVER_OPTION_VALIDATE_UTF8</a> = (1 << 8),</div><div class="line"><a name="l01371"></a><span class="lineno"><a class="line" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a1b2f8bde0f62adc7ebe81b2043f34c0c"> 1371</a></span>  <a class="code" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a1b2f8bde0f62adc7ebe81b2043f34c0c">LWS_SERVER_OPTION_SSL_ECDH</a> = (1 << 9) |</div><div class="line"><a name="l01372"></a><span class="lineno"> 1372</span>  (1 << 12),</div><div class="line"><a name="l01374"></a><span class="lineno"><a class="line" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5aff121db04a10cf8b2c5df9d4f2b89f1e"> 1374</a></span>  <a class="code" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5aff121db04a10cf8b2c5df9d4f2b89f1e">LWS_SERVER_OPTION_LIBUV</a> = (1 << 10),</div><div class="line"><a name="l01376"></a><span class="lineno"><a class="line" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a4832187186c4d130c68051214cd42ada"> 1376</a></span>  <a class="code" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a4832187186c4d130c68051214cd42ada">LWS_SERVER_OPTION_REDIRECT_HTTP_TO_HTTPS</a> = (1 << 11) |</div><div class="line"><a name="l01377"></a><span class="lineno"> 1377</span>  (1 << 3) |</div><div class="line"><a name="l01378"></a><span class="lineno"> 1378</span>  (1 << 12),</div><div class="line"><a name="l01381"></a><span class="lineno"><a class="line" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a7fed6a527c8d5e0acac1b4179644583a"> 1381</a></span>  <a class="code" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a7fed6a527c8d5e0acac1b4179644583a">LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT</a> = (1 << 12),</div><div class="line"><a name="l01383"></a><span class="lineno"><a class="line" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5accc9d0d11d1124a21659586164b0962e"> 1383</a></span>  <a class="code" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5accc9d0d11d1124a21659586164b0962e">LWS_SERVER_OPTION_EXPLICIT_VHOSTS</a> = (1 << 13),</div><div class="line"><a name="l01386"></a><span class="lineno"><a class="line" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a9637e9001d8c8b2521086bcafbd8a941"> 1386</a></span>  <a class="code" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a9637e9001d8c8b2521086bcafbd8a941">LWS_SERVER_OPTION_UNIX_SOCK</a> = (1 << 14),</div><div class="line"><a name="l01388"></a><span class="lineno"><a class="line" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5ac962efd35abf6c402f9fb14aa14f5016"> 1388</a></span>  <a class="code" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5ac962efd35abf6c402f9fb14aa14f5016">LWS_SERVER_OPTION_STS</a> = (1 << 15),</div><div class="line"><a name="l01391"></a><span class="lineno"><a class="line" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5af62887536e25e053e68741006dba46d8"> 1391</a></span>  <a class="code" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5af62887536e25e053e68741006dba46d8">LWS_SERVER_OPTION_IPV6_V6ONLY_MODIFY</a> = (1 << 16),</div><div class="line"><a name="l01393"></a><span class="lineno"><a class="line" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5aca5d42820b65eac5618ec3f0bd8a1160"> 1393</a></span>  <a class="code" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5aca5d42820b65eac5618ec3f0bd8a1160">LWS_SERVER_OPTION_IPV6_V6ONLY_VALUE</a> = (1 << 17),</div><div class="line"><a name="l01396"></a><span class="lineno"> 1396</span>  <span class="comment">/****** add new things just above ---^ ******/</span></div><div class="line"><a name="l01397"></a><span class="lineno"> 1397</span> };</div><div class="line"><a name="l01398"></a><span class="lineno"> 1398</span> </div><div class="line"><a name="l01399"></a><span class="lineno"> 1399</span> <span class="preprocessor">#define lws_check_opt(c, f) (((c) & (f)) == (f))</span></div><div class="line"><a name="l01400"></a><span class="lineno"> 1400</span> </div><div class="line"><a name="l01410"></a><span class="lineno"><a class="line" href="structlws__context__creation__info.html"> 1410</a></span> <span class="keyword">struct </span><a class="code" href="structlws__context__creation__info.html">lws_context_creation_info</a> {</div><div class="line"><a name="l01411"></a><span class="lineno"><a class="line" href="structlws__context__creation__info.html#a424a5ce268d6903e42243be94487ab85"> 1411</a></span>  <span class="keywordtype">int</span> <a class="code" href="structlws__context__creation__info.html#a424a5ce268d6903e42243be94487ab85">port</a>;</div><div class="line"><a name="l01416"></a><span class="lineno"><a class="line" href="structlws__context__creation__info.html#a75434932bb5df54665ea678eb8ac104a"> 1416</a></span>  <span class="keyword">const</span> <span class="keywordtype">char</span> *<a class="code" href="structlws__context__creation__info.html#a75434932bb5df54665ea678eb8ac104a">iface</a>;</div><div class="line"><a name="l01423"></a><span class="lineno"><a class="line" href="structlws__context__creation__info.html#abb90ffb3e6d6db2db20f529d61bd9122"> 1423</a></span>  <span class="keyword">const</span> <span class="keyword">struct </span><a class="code" href="structlws__protocols.html">lws_protocols</a> *<a class="code" href="structlws__context__creation__info.html#abb90ffb3e6d6db2db20f529d61bd9122">protocols</a>;</div><div class="line"><a name="l01427"></a><span class="lineno"><a class="line" href="structlws__context__creation__info.html#a4a3d1155fc52f5048b481884f6fb947c"> 1427</a></span>  <span class="keyword">const</span> <span class="keyword">struct </span><a class="code" href="structlws__extension.html">lws_extension</a> *<a class="code" href="structlws__context__creation__info.html#a4a3d1155fc52f5048b481884f6fb947c">extensions</a>;</div><div class="line"><a name="l01430"></a><span class="lineno"><a class="line" href="structlws__context__creation__info.html#ac8a75b7b259a3c3a5fbb4219a3f06c29"> 1430</a></span>  <span class="keyword">const</span> <span class="keyword">struct </span><a class="code" href="structlws__token__limits.html">lws_token_limits</a> *<a class="code" href="structlws__context__creation__info.html#ac8a75b7b259a3c3a5fbb4219a3f06c29">token_limits</a>;</div><div class="line"><a name="l01433"></a><span class="lineno"><a class="line" href="structlws__context__creation__info.html#af3fb447be15c4fcb01d3285a6678ab54"> 1433</a></span>  <span class="keyword">const</span> <span class="keywordtype">char</span> *<a class="code" href="structlws__context__creation__info.html#af3fb447be15c4fcb01d3285a6678ab54">ssl_private_key_password</a>;</div><div class="line"><a name="l01435"></a><span class="lineno"><a class="line" href="structlws__context__creation__info.html#ac62b0f0e8e402412ba5011d15c244103"> 1435</a></span>  <span class="keyword">const</span> <span class="keywordtype">char</span> *<a class="code" href="structlws__context__creation__info.html#ac62b0f0e8e402412ba5011d15c244103">ssl_cert_filepath</a>;</div><div class="line"><a name="l01439"></a><span class="lineno"><a class="line" href="structlws__context__creation__info.html#ab9ec8893e0f7843cf5d783d2f350ef14"> 1439</a></span>  <span class="keyword">const</span> <span class="keywordtype">char</span> *<a class="code" href="structlws__context__creation__info.html#ab9ec8893e0f7843cf5d783d2f350ef14">ssl_private_key_filepath</a>;</div><div class="line"><a name="l01445"></a><span class="lineno"><a class="line" href="structlws__context__creation__info.html#a4f8e65c3a059d3b586fafa9ef3282c29"> 1445</a></span>  <span class="keyword">const</span> <span class="keywordtype">char</span> *<a class="code" href="structlws__context__creation__info.html#a4f8e65c3a059d3b586fafa9ef3282c29">ssl_ca_filepath</a>;</div><div class="line"><a name="l01447"></a><span class="lineno"><a class="line" href="structlws__context__creation__info.html#a3e1516fd7fed26bfa77c0246ed26c2eb"> 1447</a></span>  <span class="keyword">const</span> <span class="keywordtype">char</span> *<a class="code" href="structlws__context__creation__info.html#a3e1516fd7fed26bfa77c0246ed26c2eb">ssl_cipher_list</a>;</div><div class="line"><a name="l01451"></a><span class="lineno"><a class="line" href="structlws__context__creation__info.html#aef917c0b23976a264d2474901b4f5aa3"> 1451</a></span>  <span class="keyword">const</span> <span class="keywordtype">char</span> *<a class="code" href="structlws__context__creation__info.html#aef917c0b23976a264d2474901b4f5aa3">http_proxy_address</a>;</div><div class="line"><a name="l01454"></a><span class="lineno"><a class="line" href="structlws__context__creation__info.html#a7b59f2bdc869871e7bde232db94f5ca6"> 1454</a></span>  <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="structlws__context__creation__info.html#a7b59f2bdc869871e7bde232db94f5ca6">http_proxy_port</a>;</div><div class="line"><a name="l01456"></a><span class="lineno"><a class="line" href="structlws__context__creation__info.html#a9c9d22437de92c197f3cee52912b2c03"> 1456</a></span>  <span class="keywordtype">int</span> <a class="code" href="structlws__context__creation__info.html#a9c9d22437de92c197f3cee52912b2c03">gid</a>;</div><div class="line"><a name="l01458"></a><span class="lineno"><a class="line" href="structlws__context__creation__info.html#ac105b4180008cb3e672d57beead8382e"> 1458</a></span>  <span class="keywordtype">int</span> <a class="code" href="structlws__context__creation__info.html#ac105b4180008cb3e672d57beead8382e">uid</a>;</div><div class="line"><a name="l01460"></a><span class="lineno"><a class="line" href="structlws__context__creation__info.html#a9d3b17a25e1fbc772f21eb4959a82724"> 1460</a></span>  <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="structlws__context__creation__info.html#a9d3b17a25e1fbc772f21eb4959a82724">options</a>;</div><div class="line"><a name="l01462"></a><span class="lineno"><a class="line" href="structlws__context__creation__info.html#a0e9d94cdfb893d777b4a4db81e7b5ac0"> 1462</a></span>  <span class="keywordtype">void</span> *<a class="code" href="structlws__context__creation__info.html#a0e9d94cdfb893d777b4a4db81e7b5ac0">user</a>;</div><div class="line"><a name="l01465"></a><span class="lineno"><a class="line" href="structlws__context__creation__info.html#ac583ce92b8e1c949cb6fef6bfe713d56"> 1465</a></span>  <span class="keywordtype">int</span> <a class="code" href="structlws__context__creation__info.html#ac583ce92b8e1c949cb6fef6bfe713d56">ka_time</a>;</div><div class="line"><a name="l01468"></a><span class="lineno"><a class="line" href="structlws__context__creation__info.html#a3baab4285c679fbe027c2504621d7410"> 1468</a></span>  <span class="keywordtype">int</span> <a class="code" href="structlws__context__creation__info.html#a3baab4285c679fbe027c2504621d7410">ka_probes</a>;</div><div class="line"><a name="l01472"></a><span class="lineno"><a class="line" href="structlws__context__creation__info.html#a381342a398883d6204955ff3c1849ddd"> 1472</a></span>  <span class="keywordtype">int</span> <a class="code" href="structlws__context__creation__info.html#a381342a398883d6204955ff3c1849ddd">ka_interval</a>;</div><div class="line"><a name="l01475"></a><span class="lineno"> 1475</span> <span class="preprocessor">#ifdef LWS_OPENSSL_SUPPORT</span></div><div class="line"><a name="l01476"></a><span class="lineno"><a class="line" href="structlws__context__creation__info.html#a1654d41bea6fb2f619b57e6a264b26a4"> 1476</a></span>  <a class="code" href="structlws__polarssl__context.html">SSL_CTX</a> *<a class="code" href="structlws__context__creation__info.html#a1654d41bea6fb2f619b57e6a264b26a4">provided_client_ssl_ctx</a>;</div><div class="line"><a name="l01481"></a><span class="lineno"> 1481</span> <span class="preprocessor">#else </span><span class="comment">/* maintain structure layout either way */</span><span class="preprocessor"></span></div><div class="line"><a name="l01482"></a><span class="lineno"><a class="line" href="structlws__context__creation__info.html#a0e790dda6202604f73a03b6149bc12bb"> 1482</a></span>  <span class="keywordtype">void</span> *<a class="code" href="structlws__context__creation__info.html#a0e790dda6202604f73a03b6149bc12bb">provided_client_ssl_ctx</a>; </div><div class="line"><a name="l01483"></a><span class="lineno"> 1483</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l01484"></a><span class="lineno"> 1484</span> </div><div class="line"><a name="l01485"></a><span class="lineno"><a class="line" href="structlws__context__creation__info.html#a0cdfd3c484689ba6f0f2cc91b38ce948"> 1485</a></span>  <span class="keywordtype">short</span> <a class="code" href="structlws__context__creation__info.html#a0cdfd3c484689ba6f0f2cc91b38ce948">max_http_header_data</a>;</div><div class="line"><a name="l01488"></a><span class="lineno"><a class="line" href="structlws__context__creation__info.html#a0b154e79abc1167ba4ac3539f4af6720"> 1488</a></span>  <span class="keywordtype">short</span> <a class="code" href="structlws__context__creation__info.html#a0b154e79abc1167ba4ac3539f4af6720">max_http_header_pool</a>;</div><div class="line"><a name="l01495"></a><span class="lineno"><a class="line" href="structlws__context__creation__info.html#ae52f3237e144e9ddcab5e2cf91d1e419"> 1495</a></span>  <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="structlws__context__creation__info.html#ae52f3237e144e9ddcab5e2cf91d1e419">count_threads</a>;</div><div class="line"><a name="l01497"></a><span class="lineno"><a class="line" href="structlws__context__creation__info.html#a45e63e24c88289e0c8352377ef4d3646"> 1497</a></span>  <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="structlws__context__creation__info.html#a45e63e24c88289e0c8352377ef4d3646">fd_limit_per_thread</a>;</div><div class="line"><a name="l01501"></a><span class="lineno"><a class="line" href="structlws__context__creation__info.html#a6cfa3d51df2def3349a5cbf0d712822d"> 1501</a></span>  <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="structlws__context__creation__info.html#a6cfa3d51df2def3349a5cbf0d712822d">timeout_secs</a>;</div><div class="line"><a name="l01506"></a><span class="lineno"><a class="line" href="structlws__context__creation__info.html#afa5d4e7d9f86b58a1c6fac14f0a5f5f9"> 1506</a></span>  <span class="keyword">const</span> <span class="keywordtype">char</span> *<a class="code" href="structlws__context__creation__info.html#afa5d4e7d9f86b58a1c6fac14f0a5f5f9">ecdh_curve</a>;</div><div class="line"><a name="l01508"></a><span class="lineno"><a class="line" href="structlws__context__creation__info.html#ad50db098a208f045f7811207d2bee4b9"> 1508</a></span>  <span class="keyword">const</span> <span class="keywordtype">char</span> *<a class="code" href="structlws__context__creation__info.html#ad50db098a208f045f7811207d2bee4b9">vhost_name</a>;</div><div class="line"><a name="l01512"></a><span class="lineno"><a class="line" href="structlws__context__creation__info.html#a8122cfc0810bafe51edb3ba6bf9a1251"> 1512</a></span>  <span class="keyword">const</span> <span class="keywordtype">char</span> * <span class="keyword">const</span> *<a class="code" href="structlws__context__creation__info.html#a8122cfc0810bafe51edb3ba6bf9a1251">plugin_dirs</a>;</div><div class="line"><a name="l01515"></a><span class="lineno"><a class="line" href="structlws__context__creation__info.html#a999866fcd15dbd621773436f97190458"> 1515</a></span>  <span class="keyword">const</span> <span class="keyword">struct </span><a class="code" href="structlws__protocol__vhost__options.html">lws_protocol_vhost_options</a> *<a class="code" href="structlws__context__creation__info.html#a999866fcd15dbd621773436f97190458">pvo</a>;</div><div class="line"><a name="l01518"></a><span class="lineno"><a class="line" href="structlws__context__creation__info.html#a81697c6b763b5ef3ee52862bc70b07d6"> 1518</a></span>  <span class="keywordtype">int</span> <a class="code" href="structlws__context__creation__info.html#a81697c6b763b5ef3ee52862bc70b07d6">keepalive_timeout</a>;</div><div class="line"><a name="l01521"></a><span class="lineno"><a class="line" href="structlws__context__creation__info.html#ad0e95ba721f7bd2b676719f8093c23a2"> 1521</a></span>  <span class="keyword">const</span> <span class="keywordtype">char</span> *<a class="code" href="structlws__context__creation__info.html#ad0e95ba721f7bd2b676719f8093c23a2">log_filepath</a>;</div><div class="line"><a name="l01524"></a><span class="lineno"><a class="line" href="structlws__context__creation__info.html#a13ffbb0d010309669611f8c4eda7d7f8"> 1524</a></span>  <span class="keyword">const</span> <span class="keyword">struct </span><a class="code" href="structlws__http__mount.html">lws_http_mount</a> *<a class="code" href="structlws__context__creation__info.html#a13ffbb0d010309669611f8c4eda7d7f8">mounts</a>;</div><div class="line"><a name="l01526"></a><span class="lineno"><a class="line" href="structlws__context__creation__info.html#a137a9b9de4f6a7993fed8746d551e616"> 1526</a></span>  <span class="keyword">const</span> <span class="keywordtype">char</span> *<a class="code" href="structlws__context__creation__info.html#a137a9b9de4f6a7993fed8746d551e616">server_string</a>;</div><div class="line"><a name="l01529"></a><span class="lineno"><a class="line" href="structlws__context__creation__info.html#a57f88c0745adbd1d6b9b619b8de30209"> 1529</a></span>  <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="structlws__context__creation__info.html#a57f88c0745adbd1d6b9b619b8de30209">pt_serv_buf_size</a>;</div><div class="line"><a name="l01535"></a><span class="lineno"><a class="line" href="structlws__context__creation__info.html#aa8d9e85e137f35fb006f2e4a53f0887a"> 1535</a></span>  <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="structlws__context__creation__info.html#aa8d9e85e137f35fb006f2e4a53f0887a">max_http_header_data2</a>;</div><div class="line"><a name="l01540"></a><span class="lineno"><a class="line" href="structlws__context__creation__info.html#a704940261951ced6b5d8191bd8b9bb2d"> 1540</a></span>  <span class="keywordtype">long</span> <a class="code" href="structlws__context__creation__info.html#a704940261951ced6b5d8191bd8b9bb2d">ssl_options_set</a>;</div><div class="line"><a name="l01542"></a><span class="lineno"><a class="line" href="structlws__context__creation__info.html#adb0bc0b28cd7d90ab306723d8ffa96fa"> 1542</a></span>  <span class="keywordtype">long</span> <a class="code" href="structlws__context__creation__info.html#adb0bc0b28cd7d90ab306723d8ffa96fa">ssl_options_clear</a>;</div><div class="line"><a name="l01545"></a><span class="lineno"> 1545</span>  <span class="comment">/* Add new things just above here ---^</span></div><div class="line"><a name="l01546"></a><span class="lineno"> 1546</span> <span class="comment"> * This is part of the ABI, don't needlessly break compatibility</span></div><div class="line"><a name="l01547"></a><span class="lineno"> 1547</span> <span class="comment"> *</span></div><div class="line"><a name="l01548"></a><span class="lineno"> 1548</span> <span class="comment"> * The below is to ensure later library versions with new</span></div><div class="line"><a name="l01549"></a><span class="lineno"> 1549</span> <span class="comment"> * members added above will see 0 (default) even if the app</span></div><div class="line"><a name="l01550"></a><span class="lineno"> 1550</span> <span class="comment"> * was not built against the newer headers.</span></div><div class="line"><a name="l01551"></a><span class="lineno"> 1551</span> <span class="comment"> */</span></div><div class="line"><a name="l01552"></a><span class="lineno"> 1552</span> </div><div class="line"><a name="l01553"></a><span class="lineno"><a class="line" href="structlws__context__creation__info.html#afce3b59950eca3203faa07381bbed5d7"> 1553</a></span>  <span class="keywordtype">void</span> *_unused[8]; </div><div class="line"><a name="l01554"></a><span class="lineno"> 1554</span> };</div><div class="line"><a name="l01555"></a><span class="lineno"> 1555</span> </div><div class="line"><a name="l01590"></a><span class="lineno"> 1590</span> LWS_VISIBLE LWS_EXTERN <span class="keyword">struct </span>lws_context *</div><div class="line"><a name="l01591"></a><span class="lineno"> 1591</span> <a class="code" href="group__context-and-vhost.html#gaf2fff58562caab7510c41eeac85a8648">lws_create_context</a>(<span class="keyword">struct</span> <a class="code" href="structlws__context__creation__info.html">lws_context_creation_info</a> *info);</div><div class="line"><a name="l01592"></a><span class="lineno"> 1592</span> </div><div class="line"><a name="l01601"></a><span class="lineno"> 1601</span> LWS_VISIBLE LWS_EXTERN <span class="keywordtype">void</span></div><div class="line"><a name="l01602"></a><span class="lineno"> 1602</span> <a class="code" href="group__context-and-vhost.html#ga8ee0314028755f1ddfa9428e09b4fddb">lws_context_destroy</a>(<span class="keyword">struct</span> lws_context *context);</div><div class="line"><a name="l01603"></a><span class="lineno"> 1603</span> </div><div class="line"><a name="l01621"></a><span class="lineno"> 1621</span> LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l01622"></a><span class="lineno"> 1622</span> <a class="code" href="group__context-and-vhost.html#ga7e9d5405547a457d86e0b4f0ae2bb1c4">lws_set_proxy</a>(<span class="keyword">struct</span> lws_vhost *vhost, <span class="keyword">const</span> <span class="keywordtype">char</span> *proxy);</div><div class="line"><a name="l01623"></a><span class="lineno"> 1623</span> </div><div class="line"><a name="l01624"></a><span class="lineno"> 1624</span> </div><div class="line"><a name="l01625"></a><span class="lineno"> 1625</span> <span class="keyword">struct </span>lws_vhost;</div><div class="line"><a name="l01626"></a><span class="lineno"> 1626</span> </div><div class="line"><a name="l01636"></a><span class="lineno"> 1636</span> LWS_EXTERN LWS_VISIBLE <span class="keyword">struct </span>lws_vhost *</div><div class="line"><a name="l01637"></a><span class="lineno"> 1637</span> <a class="code" href="group__context-and-vhost.html#ga0c54c667ccd9b8b3dddcd123ca72f87c">lws_create_vhost</a>(<span class="keyword">struct</span> lws_context *context,</div><div class="line"><a name="l01638"></a><span class="lineno"> 1638</span>  <span class="keyword">struct</span> <a class="code" href="structlws__context__creation__info.html">lws_context_creation_info</a> *info);</div><div class="line"><a name="l01639"></a><span class="lineno"> 1639</span> </div><div class="line"><a name="l01654"></a><span class="lineno"> 1654</span> LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l01655"></a><span class="lineno"> 1655</span> <a class="code" href="group__context-and-vhost.html#ga98d88c9080fd89c37114363a6474ea73">lwsws_get_config_globals</a>(<span class="keyword">struct</span> <a class="code" href="structlws__context__creation__info.html">lws_context_creation_info</a> *info, <span class="keyword">const</span> <span class="keywordtype">char</span> *d,</div><div class="line"><a name="l01656"></a><span class="lineno"> 1656</span>  <span class="keywordtype">char</span> **config_strings, <span class="keywordtype">int</span> *len);</div><div class="line"><a name="l01657"></a><span class="lineno"> 1657</span> </div><div class="line"><a name="l01673"></a><span class="lineno"> 1673</span> LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l01674"></a><span class="lineno"> 1674</span> <a class="code" href="group__context-and-vhost.html#ga341064721add2618ae1b29717493a212">lwsws_get_config_vhosts</a>(<span class="keyword">struct</span> lws_context *context,</div><div class="line"><a name="l01675"></a><span class="lineno"> 1675</span>  <span class="keyword">struct</span> <a class="code" href="structlws__context__creation__info.html">lws_context_creation_info</a> *info, <span class="keyword">const</span> <span class="keywordtype">char</span> *d,</div><div class="line"><a name="l01676"></a><span class="lineno"> 1676</span>  <span class="keywordtype">char</span> **config_strings, <span class="keywordtype">int</span> *len);</div><div class="line"><a name="l01677"></a><span class="lineno"> 1677</span> </div><div class="line"><a name="l01679"></a><span class="lineno"> 1679</span> LWS_VISIBLE LWS_EXTERN <span class="keyword">struct </span>lws_vhost *</div><div class="line"><a name="l01680"></a><span class="lineno"> 1680</span> <a class="code" href="group__context-and-vhost.html#ga8db03e19a372e34ac25cf21af894a02c">lws_vhost_get</a>(<span class="keyword">struct</span> lws *wsi) LWS_WARN_DEPRECATED;</div><div class="line"><a name="l01681"></a><span class="lineno"> 1681</span> </div><div class="line"><a name="l01687"></a><span class="lineno"> 1687</span> LWS_VISIBLE LWS_EXTERN <span class="keyword">struct </span>lws_vhost *</div><div class="line"><a name="l01688"></a><span class="lineno"> 1688</span> <a class="code" href="group__context-and-vhost.html#ga06e77ce2916f8bc9826ef8d9d68e3932">lws_get_vhost</a>(<span class="keyword">struct</span> lws *wsi);</div><div class="line"><a name="l01689"></a><span class="lineno"> 1689</span> </div><div class="line"><a name="l01697"></a><span class="lineno"> 1697</span> LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l01698"></a><span class="lineno"> 1698</span> <a class="code" href="group__context-and-vhost.html#ga94e6cc2223c4eec316b13bcebc3628b6">lws_json_dump_vhost</a>(<span class="keyword">const</span> <span class="keyword">struct</span> lws_vhost *vh, <span class="keywordtype">char</span> *buf, <span class="keywordtype">int</span> len);</div><div class="line"><a name="l01699"></a><span class="lineno"> 1699</span> </div><div class="line"><a name="l01707"></a><span class="lineno"> 1707</span> LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l01708"></a><span class="lineno"> 1708</span> <a class="code" href="group__context-and-vhost.html#gae2134657cdd2ea7a59e13ad314e4c50d">lws_json_dump_context</a>(<span class="keyword">const</span> <span class="keyword">struct</span> lws_context *context, <span class="keywordtype">char</span> *buf, <span class="keywordtype">int</span> len);</div><div class="line"><a name="l01709"></a><span class="lineno"> 1709</span> </div><div class="line"><a name="l01719"></a><span class="lineno"> 1719</span> LWS_VISIBLE LWS_EXTERN <span class="keywordtype">void</span> *</div><div class="line"><a name="l01720"></a><span class="lineno"> 1720</span> <a class="code" href="group__context-and-vhost.html#gaeb12f934bfd178bd2132a9e73fc641da">lws_context_user</a>(<span class="keyword">struct</span> lws_context *context);</div><div class="line"><a name="l01721"></a><span class="lineno"> 1721</span> </div><div class="line"><a name="l01727"></a><span class="lineno"> 1727</span> </div><div class="line"><a name="l01734"></a><span class="lineno"><a class="line" href="structlws__protocol__vhost__options.html"> 1734</a></span> <span class="keyword">struct </span><a class="code" href="structlws__protocol__vhost__options.html">lws_protocol_vhost_options</a> {</div><div class="line"><a name="l01735"></a><span class="lineno"><a class="line" href="structlws__protocol__vhost__options.html#abc714ddb4171756fc8196e9823a1e21c"> 1735</a></span>  <span class="keyword">const</span> <span class="keyword">struct </span><a class="code" href="structlws__protocol__vhost__options.html">lws_protocol_vhost_options</a> *<a class="code" href="structlws__protocol__vhost__options.html#abc714ddb4171756fc8196e9823a1e21c">next</a>; </div><div class="line"><a name="l01736"></a><span class="lineno"><a class="line" href="structlws__protocol__vhost__options.html#afd99fbc90be51ea2465b550c2ec47822"> 1736</a></span>  <span class="keyword">const</span> <span class="keyword">struct </span><a class="code" href="structlws__protocol__vhost__options.html">lws_protocol_vhost_options</a> *<a class="code" href="structlws__protocol__vhost__options.html#afd99fbc90be51ea2465b550c2ec47822">options</a>; </div><div class="line"><a name="l01737"></a><span class="lineno"><a class="line" href="structlws__protocol__vhost__options.html#acf9db77f8eb64cd4e314be9b43d8a8b9"> 1737</a></span>  <span class="keyword">const</span> <span class="keywordtype">char</span> *<a class="code" href="structlws__protocol__vhost__options.html#acf9db77f8eb64cd4e314be9b43d8a8b9">name</a>; </div><div class="line"><a name="l01738"></a><span class="lineno"><a class="line" href="structlws__protocol__vhost__options.html#a0640a92513c70ee6b9b295a9ad1658e7"> 1738</a></span>  <span class="keyword">const</span> <span class="keywordtype">char</span> *<a class="code" href="structlws__protocol__vhost__options.html#a0640a92513c70ee6b9b295a9ad1658e7">value</a>; </div><div class="line"><a name="l01739"></a><span class="lineno"> 1739</span> };</div><div class="line"><a name="l01740"></a><span class="lineno"> 1740</span> </div><div class="line"><a name="l01745"></a><span class="lineno"><a class="line" href="group__vhost-mounts.html#ga31eca18e50cb4357480f2fcad36ff437"> 1745</a></span> <span class="keyword">enum</span> <a class="code" href="group__vhost-mounts.html#ga31eca18e50cb4357480f2fcad36ff437">lws_mount_protocols</a> {</div><div class="line"><a name="l01746"></a><span class="lineno"><a class="line" href="group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437a1e9f0842b0e85db50fe648ed4ba9a4b0"> 1746</a></span>  <a class="code" href="group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437a1e9f0842b0e85db50fe648ed4ba9a4b0">LWSMPRO_HTTP</a> = 0, </div><div class="line"><a name="l01747"></a><span class="lineno"><a class="line" href="group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437afbd10eb4777517ed1f6bfdcf3b9ea1d1"> 1747</a></span>  <a class="code" href="group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437afbd10eb4777517ed1f6bfdcf3b9ea1d1">LWSMPRO_HTTPS</a> = 1, </div><div class="line"><a name="l01748"></a><span class="lineno"><a class="line" href="group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437a42f2361cfe76cd287fa8fcfc502357e2"> 1748</a></span>  <a class="code" href="group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437a42f2361cfe76cd287fa8fcfc502357e2">LWSMPRO_FILE</a> = 2, </div><div class="line"><a name="l01749"></a><span class="lineno"><a class="line" href="group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437a13ab58b01ac6e05f595977f1e0f0db69"> 1749</a></span>  <a class="code" href="group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437a13ab58b01ac6e05f595977f1e0f0db69">LWSMPRO_CGI</a> = 3, </div><div class="line"><a name="l01750"></a><span class="lineno"><a class="line" href="group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437aec137a2434851bd856ceebfb697b9970"> 1750</a></span>  <a class="code" href="group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437aec137a2434851bd856ceebfb697b9970">LWSMPRO_REDIR_HTTP</a> = 4, </div><div class="line"><a name="l01751"></a><span class="lineno"><a class="line" href="group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437a8894d16316863077dfe530963ca59f67"> 1751</a></span>  <a class="code" href="group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437a8894d16316863077dfe530963ca59f67">LWSMPRO_REDIR_HTTPS</a> = 5, </div><div class="line"><a name="l01752"></a><span class="lineno"><a class="line" href="group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437a946a88cf9c852eed2c0317f4115d19da"> 1752</a></span>  <a class="code" href="group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437a946a88cf9c852eed2c0317f4115d19da">LWSMPRO_CALLBACK</a> = 6, </div><div class="line"><a name="l01753"></a><span class="lineno"> 1753</span> };</div><div class="line"><a name="l01754"></a><span class="lineno"> 1754</span> </div><div class="line"><a name="l01759"></a><span class="lineno"><a class="line" href="structlws__http__mount.html"> 1759</a></span> <span class="keyword">struct </span><a class="code" href="structlws__http__mount.html">lws_http_mount</a> {</div><div class="line"><a name="l01760"></a><span class="lineno"><a class="line" href="structlws__http__mount.html#ad878546ae1c399bbca7d7f8a0baf973d"> 1760</a></span>  <span class="keyword">struct </span><a class="code" href="structlws__http__mount.html">lws_http_mount</a> *<a class="code" href="structlws__http__mount.html#ad878546ae1c399bbca7d7f8a0baf973d">mount_next</a>;</div><div class="line"><a name="l01762"></a><span class="lineno"><a class="line" href="structlws__http__mount.html#aa2391bfcada0b7a290b3c6651f64586c"> 1762</a></span>  <span class="keyword">const</span> <span class="keywordtype">char</span> *<a class="code" href="structlws__http__mount.html#aa2391bfcada0b7a290b3c6651f64586c">mountpoint</a>;</div><div class="line"><a name="l01764"></a><span class="lineno"><a class="line" href="structlws__http__mount.html#a21d86fd6043ec00e121ababbc29af39a"> 1764</a></span>  <span class="keyword">const</span> <span class="keywordtype">char</span> *<a class="code" href="structlws__http__mount.html#a21d86fd6043ec00e121ababbc29af39a">origin</a>;</div><div class="line"><a name="l01766"></a><span class="lineno"><a class="line" href="structlws__http__mount.html#ae90d1efe7178199fad39de2926902ee4"> 1766</a></span>  <span class="keyword">const</span> <span class="keywordtype">char</span> *<a class="code" href="structlws__http__mount.html#ae90d1efe7178199fad39de2926902ee4">def</a>;</div><div class="line"><a name="l01768"></a><span class="lineno"><a class="line" href="structlws__http__mount.html#a05347d92c3d379809564bd4f3eab259b"> 1768</a></span>  <span class="keyword">const</span> <span class="keywordtype">char</span> *<a class="code" href="structlws__http__mount.html#a05347d92c3d379809564bd4f3eab259b">protocol</a>;</div><div class="line"><a name="l01771"></a><span class="lineno"><a class="line" href="structlws__http__mount.html#ae7b5c0f4c5408061e6ea3a8d281f45af"> 1771</a></span>  <span class="keyword">const</span> <span class="keyword">struct </span><a class="code" href="structlws__protocol__vhost__options.html">lws_protocol_vhost_options</a> *<a class="code" href="structlws__http__mount.html#ae7b5c0f4c5408061e6ea3a8d281f45af">cgienv</a>;</div><div class="line"><a name="l01775"></a><span class="lineno"><a class="line" href="structlws__http__mount.html#a4437423df85ee3dbcae0e15974c89ec7"> 1775</a></span>  <span class="keyword">const</span> <span class="keyword">struct </span><a class="code" href="structlws__protocol__vhost__options.html">lws_protocol_vhost_options</a> *<a class="code" href="structlws__http__mount.html#a4437423df85ee3dbcae0e15974c89ec7">extra_mimetypes</a>;</div><div class="line"><a name="l01777"></a><span class="lineno"><a class="line" href="structlws__http__mount.html#a11ea62b952710d59733dbcf9794a5773"> 1777</a></span>  <span class="keyword">const</span> <span class="keyword">struct </span><a class="code" href="structlws__protocol__vhost__options.html">lws_protocol_vhost_options</a> *<a class="code" href="structlws__http__mount.html#a11ea62b952710d59733dbcf9794a5773">interpret</a>;</div><div class="line"><a name="l01780"></a><span class="lineno"><a class="line" href="structlws__http__mount.html#a4a7239d6d4c03986e6e1a72abb6c83aa"> 1780</a></span>  <span class="keywordtype">int</span> <a class="code" href="structlws__http__mount.html#a4a7239d6d4c03986e6e1a72abb6c83aa">cgi_timeout</a>;</div><div class="line"><a name="l01782"></a><span class="lineno"><a class="line" href="structlws__http__mount.html#a4283e30ea89d27ae7d061ad760d1d146"> 1782</a></span>  <span class="keywordtype">int</span> <a class="code" href="structlws__http__mount.html#a4283e30ea89d27ae7d061ad760d1d146">cache_max_age</a>;</div><div class="line"><a name="l01784"></a><span class="lineno"><a class="line" href="structlws__http__mount.html#a614364c770b0bd4db464ad65cddab477"> 1784</a></span>  <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="structlws__http__mount.html#a614364c770b0bd4db464ad65cddab477">auth_mask</a>;</div><div class="line"><a name="l01787"></a><span class="lineno"><a class="line" href="structlws__http__mount.html#a8316dd183ffbef50419a5a4968d35d84"> 1787</a></span>  <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> cache_reusable:1; </div><div class="line"><a name="l01788"></a><span class="lineno"><a class="line" href="structlws__http__mount.html#ae137203040c6153694bd88a708da5395"> 1788</a></span>  <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> cache_revalidate:1; </div><div class="line"><a name="l01789"></a><span class="lineno"><a class="line" href="structlws__http__mount.html#aabec1a326780aafe11b977000983be0c"> 1789</a></span>  <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> cache_intermediaries:1; </div><div class="line"><a name="l01791"></a><span class="lineno"><a class="line" href="structlws__http__mount.html#a6a9b1492a0b9749e39bd19932717a0b7"> 1791</a></span>  <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> <a class="code" href="structlws__http__mount.html#a6a9b1492a0b9749e39bd19932717a0b7">origin_protocol</a>; </div><div class="line"><a name="l01792"></a><span class="lineno"><a class="line" href="structlws__http__mount.html#ac8489b60b8f969eb19c9abbdeac90743"> 1792</a></span>  <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> <a class="code" href="structlws__http__mount.html#ac8489b60b8f969eb19c9abbdeac90743">mountpoint_len</a>; </div><div class="line"><a name="l01793"></a><span class="lineno"> 1793</span> };</div><div class="line"><a name="l01796"></a><span class="lineno"> 1796</span> </div><div class="line"><a name="l01802"></a><span class="lineno"> 1802</span> </div><div class="line"><a name="l01807"></a><span class="lineno"><a class="line" href="structlws__client__connect__info.html"> 1807</a></span> <span class="keyword">struct </span><a class="code" href="structlws__client__connect__info.html">lws_client_connect_info</a> {</div><div class="line"><a name="l01808"></a><span class="lineno"><a class="line" href="structlws__client__connect__info.html#afe999d133cc240a0bfd02aade0514cfd"> 1808</a></span>  <span class="keyword">struct </span>lws_context *<a class="code" href="structlws__client__connect__info.html#afe999d133cc240a0bfd02aade0514cfd">context</a>;</div><div class="line"><a name="l01810"></a><span class="lineno"><a class="line" href="structlws__client__connect__info.html#aa364094f94ef1bcaaabbd9161971d502"> 1810</a></span>  <span class="keyword">const</span> <span class="keywordtype">char</span> *<a class="code" href="structlws__client__connect__info.html#aa364094f94ef1bcaaabbd9161971d502">address</a>;</div><div class="line"><a name="l01812"></a><span class="lineno"><a class="line" href="structlws__client__connect__info.html#a1af124d81c3c22a46d39387c5bc3d6b9"> 1812</a></span>  <span class="keywordtype">int</span> <a class="code" href="structlws__client__connect__info.html#a1af124d81c3c22a46d39387c5bc3d6b9">port</a>;</div><div class="line"><a name="l01814"></a><span class="lineno"><a class="line" href="structlws__client__connect__info.html#a9862297827639238a7a0b4054c3ddf3d"> 1814</a></span>  <span class="keywordtype">int</span> <a class="code" href="structlws__client__connect__info.html#a9862297827639238a7a0b4054c3ddf3d">ssl_connection</a>;</div><div class="line"><a name="l01816"></a><span class="lineno"><a class="line" href="structlws__client__connect__info.html#a76a8388733f114fb8fd3643874781185"> 1816</a></span>  <span class="keyword">const</span> <span class="keywordtype">char</span> *<a class="code" href="structlws__client__connect__info.html#a76a8388733f114fb8fd3643874781185">path</a>;</div><div class="line"><a name="l01818"></a><span class="lineno"><a class="line" href="structlws__client__connect__info.html#a9b36d47c3422329df32c21040a35ebc7"> 1818</a></span>  <span class="keyword">const</span> <span class="keywordtype">char</span> *<a class="code" href="structlws__client__connect__info.html#a9b36d47c3422329df32c21040a35ebc7">host</a>;</div><div class="line"><a name="l01820"></a><span class="lineno"><a class="line" href="structlws__client__connect__info.html#a8595f83e64147cb687b6418cf500dd4c"> 1820</a></span>  <span class="keyword">const</span> <span class="keywordtype">char</span> *<a class="code" href="structlws__client__connect__info.html#a8595f83e64147cb687b6418cf500dd4c">origin</a>;</div><div class="line"><a name="l01822"></a><span class="lineno"><a class="line" href="structlws__client__connect__info.html#aba35adfb74845a5fd0c3dc141cbdddd2"> 1822</a></span>  <span class="keyword">const</span> <span class="keywordtype">char</span> *<a class="code" href="structlws__client__connect__info.html#aba35adfb74845a5fd0c3dc141cbdddd2">protocol</a>;</div><div class="line"><a name="l01824"></a><span class="lineno"><a class="line" href="structlws__client__connect__info.html#a69abb5aeed755750b9755e5c91db6895"> 1824</a></span>  <span class="keywordtype">int</span> <a class="code" href="structlws__client__connect__info.html#a69abb5aeed755750b9755e5c91db6895">ietf_version_or_minus_one</a>;</div><div class="line"><a name="l01826"></a><span class="lineno"><a class="line" href="structlws__client__connect__info.html#a9831b9f9ab54a1aec4bb15324f1c3836"> 1826</a></span>  <span class="keywordtype">void</span> *<a class="code" href="structlws__client__connect__info.html#a9831b9f9ab54a1aec4bb15324f1c3836">userdata</a>;</div><div class="line"><a name="l01828"></a><span class="lineno"><a class="line" href="structlws__client__connect__info.html#a7732b996e977393c3e1076be2a8ded6c"> 1828</a></span>  <span class="keyword">const</span> <span class="keyword">struct </span><a class="code" href="structlws__extension.html">lws_extension</a> *<a class="code" href="structlws__client__connect__info.html#a7732b996e977393c3e1076be2a8ded6c">client_exts</a>;</div><div class="line"><a name="l01830"></a><span class="lineno"><a class="line" href="structlws__client__connect__info.html#aa9e8e3da4e783a0651b0dea62c2dd1db"> 1830</a></span>  <span class="keyword">const</span> <span class="keywordtype">char</span> *<a class="code" href="structlws__client__connect__info.html#aa9e8e3da4e783a0651b0dea62c2dd1db">method</a>;</div><div class="line"><a name="l01833"></a><span class="lineno"><a class="line" href="structlws__client__connect__info.html#a6843a60e1050b10db9d98d7eeb45f587"> 1833</a></span>  <span class="keyword">struct </span>lws *<a class="code" href="structlws__client__connect__info.html#a6843a60e1050b10db9d98d7eeb45f587">parent_wsi</a>;</div><div class="line"><a name="l01837"></a><span class="lineno"><a class="line" href="structlws__client__connect__info.html#a03c305fdca809667b6a9a83b3edfd83a"> 1837</a></span>  <span class="keyword">const</span> <span class="keywordtype">char</span> *<a class="code" href="structlws__client__connect__info.html#a03c305fdca809667b6a9a83b3edfd83a">uri_replace_from</a>;</div><div class="line"><a name="l01840"></a><span class="lineno"><a class="line" href="structlws__client__connect__info.html#a9959ba103d3d2484e559a9f7879eebe3"> 1840</a></span>  <span class="keyword">const</span> <span class="keywordtype">char</span> *<a class="code" href="structlws__client__connect__info.html#a9959ba103d3d2484e559a9f7879eebe3">uri_replace_to</a>;</div><div class="line"><a name="l01842"></a><span class="lineno"><a class="line" href="structlws__client__connect__info.html#a3893181d728f326f9f5b47c1459cb8be"> 1842</a></span>  <span class="keyword">struct </span>lws_vhost *<a class="code" href="structlws__client__connect__info.html#a3893181d728f326f9f5b47c1459cb8be">vhost</a>;</div><div class="line"><a name="l01845"></a><span class="lineno"> 1845</span>  <span class="comment">/* Add new things just above here ---^</span></div><div class="line"><a name="l01846"></a><span class="lineno"> 1846</span> <span class="comment"> * This is part of the ABI, don't needlessly break compatibility</span></div><div class="line"><a name="l01847"></a><span class="lineno"> 1847</span> <span class="comment"> *</span></div><div class="line"><a name="l01848"></a><span class="lineno"> 1848</span> <span class="comment"> * The below is to ensure later library versions with new</span></div><div class="line"><a name="l01849"></a><span class="lineno"> 1849</span> <span class="comment"> * members added above will see 0 (default) even if the app</span></div><div class="line"><a name="l01850"></a><span class="lineno"> 1850</span> <span class="comment"> * was not built against the newer headers.</span></div><div class="line"><a name="l01851"></a><span class="lineno"> 1851</span> <span class="comment"> */</span></div><div class="line"><a name="l01852"></a><span class="lineno"> 1852</span> </div><div class="line"><a name="l01853"></a><span class="lineno"><a class="line" href="structlws__client__connect__info.html#ad47f50d1633dc5df74548606c9a66d73"> 1853</a></span>  <span class="keywordtype">void</span> *_unused[4]; </div><div class="line"><a name="l01854"></a><span class="lineno"> 1854</span> };</div><div class="line"><a name="l01855"></a><span class="lineno"> 1855</span> </div><div class="line"><a name="l01862"></a><span class="lineno"> 1862</span> LWS_VISIBLE LWS_EXTERN <span class="keyword">struct </span>lws * LWS_WARN_UNUSED_RESULT</div><div class="line"><a name="l01863"></a><span class="lineno"> 1863</span> <a class="code" href="group__client.html#gac30a7be106abd0cedfbb2e8b8fe3a2f5">lws_client_connect_via_info</a>(<span class="keyword">struct</span> <a class="code" href="structlws__client__connect__info.html">lws_client_connect_info</a> * ccinfo);</div><div class="line"><a name="l01864"></a><span class="lineno"> 1864</span> </div><div class="line"><a name="l01885"></a><span class="lineno"> 1885</span> <span class="comment">/* deprecated, use lws_client_connect_via_info() */</span></div><div class="line"><a name="l01886"></a><span class="lineno"> 1886</span> LWS_VISIBLE LWS_EXTERN <span class="keyword">struct </span>lws * LWS_WARN_UNUSED_RESULT</div><div class="line"><a name="l01887"></a><span class="lineno"> 1887</span> <a class="code" href="group__client.html#ga4af0a20108a95e8b6d94dd4d80055ff3">lws_client_connect</a>(<span class="keyword">struct</span> lws_context *clients, <span class="keyword">const</span> <span class="keywordtype">char</span> *address,</div><div class="line"><a name="l01888"></a><span class="lineno"> 1888</span>  <span class="keywordtype">int</span> port, <span class="keywordtype">int</span> ssl_connection, <span class="keyword">const</span> <span class="keywordtype">char</span> *path,</div><div class="line"><a name="l01889"></a><span class="lineno"> 1889</span>  <span class="keyword">const</span> <span class="keywordtype">char</span> *host, <span class="keyword">const</span> <span class="keywordtype">char</span> *origin, <span class="keyword">const</span> <span class="keywordtype">char</span> *protocol,</div><div class="line"><a name="l01890"></a><span class="lineno"> 1890</span>  <span class="keywordtype">int</span> ietf_version_or_minus_one) LWS_WARN_DEPRECATED;</div><div class="line"><a name="l01891"></a><span class="lineno"> 1891</span> <span class="comment">/* deprecated, use lws_client_connect_via_info() */</span></div><div class="line"><a name="l01912"></a><span class="lineno"> 1912</span> LWS_VISIBLE LWS_EXTERN <span class="keyword">struct </span>lws * LWS_WARN_UNUSED_RESULT</div><div class="line"><a name="l01913"></a><span class="lineno"> 1913</span> <a class="code" href="group__client.html#gac6a8558b4410961a880241c2ac1271e2">lws_client_connect_extended</a>(<span class="keyword">struct</span> lws_context *clients, <span class="keyword">const</span> <span class="keywordtype">char</span> *address,</div><div class="line"><a name="l01914"></a><span class="lineno"> 1914</span>  <span class="keywordtype">int</span> port, <span class="keywordtype">int</span> ssl_connection, <span class="keyword">const</span> <span class="keywordtype">char</span> *path,</div><div class="line"><a name="l01915"></a><span class="lineno"> 1915</span>  <span class="keyword">const</span> <span class="keywordtype">char</span> *host, <span class="keyword">const</span> <span class="keywordtype">char</span> *origin,</div><div class="line"><a name="l01916"></a><span class="lineno"> 1916</span>  <span class="keyword">const</span> <span class="keywordtype">char</span> *protocol, <span class="keywordtype">int</span> ietf_version_or_minus_one,</div><div class="line"><a name="l01917"></a><span class="lineno"> 1917</span>  <span class="keywordtype">void</span> *userdata) LWS_WARN_DEPRECATED;</div><div class="line"><a name="l01918"></a><span class="lineno"> 1918</span> </div><div class="line"><a name="l01944"></a><span class="lineno"> 1944</span> LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l01945"></a><span class="lineno"> 1945</span> <a class="code" href="group__client.html#ga4f44b8230e6732816ca5cd8d1aaaf340">lws_init_vhost_client_ssl</a>(<span class="keyword">const</span> <span class="keyword">struct</span> <a class="code" href="structlws__context__creation__info.html">lws_context_creation_info</a> *info,</div><div class="line"><a name="l01946"></a><span class="lineno"> 1946</span>  <span class="keyword">struct</span> lws_vhost *vhost);</div><div class="line"><a name="l01947"></a><span class="lineno"> 1947</span> </div><div class="line"><a name="l01948"></a><span class="lineno"> 1948</span> LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l01949"></a><span class="lineno"> 1949</span> lws_http_client_read(<span class="keyword">struct</span> lws *wsi, <span class="keywordtype">char</span> **buf, <span class="keywordtype">int</span> *len);</div><div class="line"><a name="l01951"></a><span class="lineno"> 1951</span> </div><div class="line"><a name="l01959"></a><span class="lineno"> 1959</span> </div><div class="line"><a name="l01992"></a><span class="lineno"> 1992</span> LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l01993"></a><span class="lineno"> 1993</span> <a class="code" href="group__service.html#gaf95bd0c663d6516a0c80047d9b1167a8">lws_service</a>(<span class="keyword">struct</span> lws_context *context, <span class="keywordtype">int</span> timeout_ms);</div><div class="line"><a name="l01994"></a><span class="lineno"> 1994</span> </div><div class="line"><a name="l02006"></a><span class="lineno"> 2006</span> LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l02007"></a><span class="lineno"> 2007</span> <a class="code" href="group__service.html#ga9b3cc4473fd8848e5bbee7f310712939">lws_service_tsi</a>(<span class="keyword">struct</span> lws_context *context, <span class="keywordtype">int</span> timeout_ms, <span class="keywordtype">int</span> tsi);</div><div class="line"><a name="l02008"></a><span class="lineno"> 2008</span> </div><div class="line"><a name="l02024"></a><span class="lineno"> 2024</span> LWS_VISIBLE LWS_EXTERN <span class="keywordtype">void</span></div><div class="line"><a name="l02025"></a><span class="lineno"> 2025</span> <a class="code" href="group__service.html#ga29c246707997ab7a466aa709aecd2d7b">lws_cancel_service_pt</a>(<span class="keyword">struct</span> lws *wsi);</div><div class="line"><a name="l02026"></a><span class="lineno"> 2026</span> </div><div class="line"><a name="l02038"></a><span class="lineno"> 2038</span> LWS_VISIBLE LWS_EXTERN <span class="keywordtype">void</span></div><div class="line"><a name="l02039"></a><span class="lineno"> 2039</span> <a class="code" href="group__service.html#ga53e3d0801dfda7960a7249dd559e68a2">lws_cancel_service</a>(<span class="keyword">struct</span> lws_context *context);</div><div class="line"><a name="l02040"></a><span class="lineno"> 2040</span> </div><div class="line"><a name="l02063"></a><span class="lineno"> 2063</span> LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l02064"></a><span class="lineno"> 2064</span> <a class="code" href="group__service.html#gad82efa5466d14a9f05aa06416375b28d">lws_service_fd</a>(<span class="keyword">struct</span> lws_context *context, <span class="keyword">struct</span> <a class="code" href="structlws__pollfd.html">lws_pollfd</a> *<a class="code" href="structpollfd.html">pollfd</a>);</div><div class="line"><a name="l02065"></a><span class="lineno"> 2065</span> </div><div class="line"><a name="l02075"></a><span class="lineno"> 2075</span> LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l02076"></a><span class="lineno"> 2076</span> <a class="code" href="group__service.html#gaebf426eda371ba23642fc11d8e0ace6b">lws_service_fd_tsi</a>(<span class="keyword">struct</span> lws_context *context, <span class="keyword">struct</span> <a class="code" href="structlws__pollfd.html">lws_pollfd</a> *<a class="code" href="structpollfd.html">pollfd</a>,</div><div class="line"><a name="l02077"></a><span class="lineno"> 2077</span>  <span class="keywordtype">int</span> tsi);</div><div class="line"><a name="l02078"></a><span class="lineno"> 2078</span> </div><div class="line"><a name="l02080"></a><span class="lineno"> 2080</span> </div><div class="line"><a name="l02086"></a><span class="lineno"> 2086</span> </div><div class="line"><a name="l02093"></a><span class="lineno"> 2093</span> </div><div class="line"><a name="l02112"></a><span class="lineno"> 2112</span> LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l02113"></a><span class="lineno"> 2113</span> <a class="code" href="group__httpft.html#gab393a06d3d2722af4c3f8b06842c80d7">lws_serve_http_file</a>(<span class="keyword">struct</span> lws *wsi, <span class="keyword">const</span> <span class="keywordtype">char</span> *file, <span class="keyword">const</span> <span class="keywordtype">char</span> *content_type,</div><div class="line"><a name="l02114"></a><span class="lineno"> 2114</span>  <span class="keyword">const</span> <span class="keywordtype">char</span> *other_headers, <span class="keywordtype">int</span> other_headers_len);</div><div class="line"><a name="l02115"></a><span class="lineno"> 2115</span> LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l02116"></a><span class="lineno"> 2116</span> lws_serve_http_file_fragment(<span class="keyword">struct</span> lws *wsi);</div><div class="line"><a name="l02118"></a><span class="lineno"> 2118</span> </div><div class="line"><a name="l02129"></a><span class="lineno"> 2129</span> </div><div class="line"><a name="l02130"></a><span class="lineno"> 2130</span> <span class="keyword">enum</span> http_status {</div><div class="line"><a name="l02131"></a><span class="lineno"> 2131</span>  HTTP_STATUS_OK = 200,</div><div class="line"><a name="l02132"></a><span class="lineno"> 2132</span>  HTTP_STATUS_NO_CONTENT = 204,</div><div class="line"><a name="l02133"></a><span class="lineno"> 2133</span> </div><div class="line"><a name="l02134"></a><span class="lineno"> 2134</span>  HTTP_STATUS_MOVED_PERMANENTLY = 301,</div><div class="line"><a name="l02135"></a><span class="lineno"> 2135</span>  HTTP_STATUS_FOUND = 302,</div><div class="line"><a name="l02136"></a><span class="lineno"> 2136</span>  HTTP_STATUS_SEE_OTHER = 303,</div><div class="line"><a name="l02137"></a><span class="lineno"> 2137</span> </div><div class="line"><a name="l02138"></a><span class="lineno"> 2138</span>  HTTP_STATUS_BAD_REQUEST = 400,</div><div class="line"><a name="l02139"></a><span class="lineno"> 2139</span>  HTTP_STATUS_UNAUTHORIZED,</div><div class="line"><a name="l02140"></a><span class="lineno"> 2140</span>  HTTP_STATUS_PAYMENT_REQUIRED,</div><div class="line"><a name="l02141"></a><span class="lineno"> 2141</span>  HTTP_STATUS_FORBIDDEN,</div><div class="line"><a name="l02142"></a><span class="lineno"> 2142</span>  HTTP_STATUS_NOT_FOUND,</div><div class="line"><a name="l02143"></a><span class="lineno"> 2143</span>  HTTP_STATUS_METHOD_NOT_ALLOWED,</div><div class="line"><a name="l02144"></a><span class="lineno"> 2144</span>  HTTP_STATUS_NOT_ACCEPTABLE,</div><div class="line"><a name="l02145"></a><span class="lineno"> 2145</span>  HTTP_STATUS_PROXY_AUTH_REQUIRED,</div><div class="line"><a name="l02146"></a><span class="lineno"> 2146</span>  HTTP_STATUS_REQUEST_TIMEOUT,</div><div class="line"><a name="l02147"></a><span class="lineno"> 2147</span>  HTTP_STATUS_CONFLICT,</div><div class="line"><a name="l02148"></a><span class="lineno"> 2148</span>  HTTP_STATUS_GONE,</div><div class="line"><a name="l02149"></a><span class="lineno"> 2149</span>  HTTP_STATUS_LENGTH_REQUIRED,</div><div class="line"><a name="l02150"></a><span class="lineno"> 2150</span>  HTTP_STATUS_PRECONDITION_FAILED,</div><div class="line"><a name="l02151"></a><span class="lineno"> 2151</span>  HTTP_STATUS_REQ_ENTITY_TOO_LARGE,</div><div class="line"><a name="l02152"></a><span class="lineno"> 2152</span>  HTTP_STATUS_REQ_URI_TOO_LONG,</div><div class="line"><a name="l02153"></a><span class="lineno"> 2153</span>  HTTP_STATUS_UNSUPPORTED_MEDIA_TYPE,</div><div class="line"><a name="l02154"></a><span class="lineno"> 2154</span>  HTTP_STATUS_REQ_RANGE_NOT_SATISFIABLE,</div><div class="line"><a name="l02155"></a><span class="lineno"> 2155</span>  HTTP_STATUS_EXPECTATION_FAILED,</div><div class="line"><a name="l02156"></a><span class="lineno"> 2156</span> </div><div class="line"><a name="l02157"></a><span class="lineno"> 2157</span>  HTTP_STATUS_INTERNAL_SERVER_ERROR = 500,</div><div class="line"><a name="l02158"></a><span class="lineno"> 2158</span>  HTTP_STATUS_NOT_IMPLEMENTED,</div><div class="line"><a name="l02159"></a><span class="lineno"> 2159</span>  HTTP_STATUS_BAD_GATEWAY,</div><div class="line"><a name="l02160"></a><span class="lineno"> 2160</span>  HTTP_STATUS_SERVICE_UNAVAILABLE,</div><div class="line"><a name="l02161"></a><span class="lineno"> 2161</span>  HTTP_STATUS_GATEWAY_TIMEOUT,</div><div class="line"><a name="l02162"></a><span class="lineno"> 2162</span>  HTTP_STATUS_HTTP_VERSION_NOT_SUPPORTED,</div><div class="line"><a name="l02163"></a><span class="lineno"> 2163</span> };</div><div class="line"><a name="l02164"></a><span class="lineno"> 2164</span> </div><div class="line"><a name="l02165"></a><span class="lineno"><a class="line" href="structlws__process__html__args.html"> 2165</a></span> <span class="keyword">struct </span><a class="code" href="structlws__process__html__args.html">lws_process_html_args</a> {</div><div class="line"><a name="l02166"></a><span class="lineno"><a class="line" href="structlws__process__html__args.html#a11859d8bedd379fbf64543b25c65fe14"> 2166</a></span>  <span class="keywordtype">char</span> *<a class="code" href="structlws__process__html__args.html#a11859d8bedd379fbf64543b25c65fe14">p</a>; </div><div class="line"><a name="l02167"></a><span class="lineno"><a class="line" href="structlws__process__html__args.html#a754513f2311241cabb0cd1c90d7307ef"> 2167</a></span>  <span class="keywordtype">int</span> <a class="code" href="structlws__process__html__args.html#a754513f2311241cabb0cd1c90d7307ef">len</a>; </div><div class="line"><a name="l02168"></a><span class="lineno"><a class="line" href="structlws__process__html__args.html#a8be7fd396a1942ea2449a2fda990ff99"> 2168</a></span>  <span class="keywordtype">int</span> <a class="code" href="structlws__process__html__args.html#a8be7fd396a1942ea2449a2fda990ff99">max_len</a>; </div><div class="line"><a name="l02169"></a><span class="lineno"><a class="line" href="structlws__process__html__args.html#a362547891ee0d693f3900a1f807ea475"> 2169</a></span>  <span class="keywordtype">int</span> <span class="keyword">final</span>; </div><div class="line"><a name="l02170"></a><span class="lineno"> 2170</span> };</div><div class="line"><a name="l02171"></a><span class="lineno"> 2171</span> </div><div class="line"><a name="l02172"></a><span class="lineno"> 2172</span> <span class="keyword">typedef</span> <span class="keyword">const</span> <span class="keywordtype">char</span> *(*lws_process_html_state_cb)(<span class="keywordtype">void</span> *data, <span class="keywordtype">int</span> index);</div><div class="line"><a name="l02173"></a><span class="lineno"> 2173</span> </div><div class="line"><a name="l02174"></a><span class="lineno"><a class="line" href="structlws__process__html__state.html"> 2174</a></span> <span class="keyword">struct </span><a class="code" href="structlws__process__html__state.html">lws_process_html_state</a> {</div><div class="line"><a name="l02175"></a><span class="lineno"><a class="line" href="structlws__process__html__state.html#af0732884ef891e24fe5fa237ebaa21a3"> 2175</a></span>  <span class="keywordtype">char</span> *<a class="code" href="structlws__process__html__state.html#af0732884ef891e24fe5fa237ebaa21a3">start</a>; </div><div class="line"><a name="l02176"></a><span class="lineno"><a class="line" href="structlws__process__html__state.html#a71982bc1cbd8cf876ca0f545144404eb"> 2176</a></span>  <span class="keywordtype">char</span> swallow[16]; </div><div class="line"><a name="l02177"></a><span class="lineno"><a class="line" href="structlws__process__html__state.html#a53234f2948812c7208a256f9f5b23c20"> 2177</a></span>  <span class="keywordtype">int</span> <a class="code" href="structlws__process__html__state.html#a53234f2948812c7208a256f9f5b23c20">pos</a>; </div><div class="line"><a name="l02178"></a><span class="lineno"><a class="line" href="structlws__process__html__state.html#af21119890fdfebe28fb5c4dabfc1bdf5"> 2178</a></span>  <span class="keywordtype">void</span> *<a class="code" href="structlws__process__html__state.html#af21119890fdfebe28fb5c4dabfc1bdf5">data</a>; </div><div class="line"><a name="l02179"></a><span class="lineno"><a class="line" href="structlws__process__html__state.html#a3b113e00c03a2fded51b1c85ff5bf077"> 2179</a></span>  <span class="keyword">const</span> <span class="keywordtype">char</span> * <span class="keyword">const</span> *<a class="code" href="structlws__process__html__state.html#a3b113e00c03a2fded51b1c85ff5bf077">vars</a>; </div><div class="line"><a name="l02180"></a><span class="lineno"><a class="line" href="structlws__process__html__state.html#adcafd17704775b4bbeea9561fb340968"> 2180</a></span>  <span class="keywordtype">int</span> <a class="code" href="structlws__process__html__state.html#adcafd17704775b4bbeea9561fb340968">count_vars</a>; </div><div class="line"><a name="l02182"></a><span class="lineno"><a class="line" href="structlws__process__html__state.html#a693d2fb45378afee5da29b539c1ea644"> 2182</a></span>  lws_process_html_state_cb <a class="code" href="structlws__process__html__state.html#a693d2fb45378afee5da29b539c1ea644">replace</a>; </div><div class="line"><a name="l02183"></a><span class="lineno"> 2183</span> };</div><div class="line"><a name="l02184"></a><span class="lineno"> 2184</span> </div><div class="line"><a name="l02189"></a><span class="lineno"> 2189</span> LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l02190"></a><span class="lineno"> 2190</span> <a class="code" href="group__html-chunked-substitution.html#ga643073f918c0a7016b690aae9793fd60">lws_chunked_html_process</a>(<span class="keyword">struct</span> <a class="code" href="structlws__process__html__args.html">lws_process_html_args</a> *args,</div><div class="line"><a name="l02191"></a><span class="lineno"> 2191</span>  <span class="keyword">struct</span> <a class="code" href="structlws__process__html__state.html">lws_process_html_state</a> *s);</div><div class="line"><a name="l02193"></a><span class="lineno"> 2193</span> </div><div class="line"><a name="l02226"></a><span class="lineno"> 2226</span> </div><div class="line"><a name="l02234"></a><span class="lineno"><a class="line" href="structlws__tokens.html"> 2234</a></span> <span class="keyword">struct </span><a class="code" href="structlws__tokens.html">lws_tokens</a> {</div><div class="line"><a name="l02235"></a><span class="lineno"><a class="line" href="structlws__tokens.html#a9f3635412bc71a5cb78e9862b55f10cd"> 2235</a></span>  <span class="keywordtype">char</span> *<a class="code" href="structlws__tokens.html#a9f3635412bc71a5cb78e9862b55f10cd">token</a>; </div><div class="line"><a name="l02236"></a><span class="lineno"><a class="line" href="structlws__tokens.html#a855b7375d1d58516c0ecd4b60e9a7766"> 2236</a></span>  <span class="keywordtype">int</span> <a class="code" href="structlws__tokens.html#a855b7375d1d58516c0ecd4b60e9a7766">token_len</a>; </div><div class="line"><a name="l02237"></a><span class="lineno"> 2237</span> };</div><div class="line"><a name="l02238"></a><span class="lineno"> 2238</span> </div><div class="line"><a name="l02239"></a><span class="lineno"> 2239</span> <span class="comment">/* enum lws_token_indexes</span></div><div class="line"><a name="l02240"></a><span class="lineno"> 2240</span> <span class="comment"> * these have to be kept in sync with lextable.h / minilex.c</span></div><div class="line"><a name="l02241"></a><span class="lineno"> 2241</span> <span class="comment"> *</span></div><div class="line"><a name="l02242"></a><span class="lineno"> 2242</span> <span class="comment"> * NOTE: These public enums are part of the abi. If you want to add one,</span></div><div class="line"><a name="l02243"></a><span class="lineno"> 2243</span> <span class="comment"> * add it at where specified so existing users are unaffected.</span></div><div class="line"><a name="l02244"></a><span class="lineno"> 2244</span> <span class="comment"> */</span></div><div class="line"><a name="l02245"></a><span class="lineno"> 2245</span> <span class="keyword">enum</span> lws_token_indexes {</div><div class="line"><a name="l02246"></a><span class="lineno"> 2246</span>  WSI_TOKEN_GET_URI = 0,</div><div class="line"><a name="l02247"></a><span class="lineno"> 2247</span>  WSI_TOKEN_POST_URI = 1,</div><div class="line"><a name="l02248"></a><span class="lineno"> 2248</span>  WSI_TOKEN_OPTIONS_URI = 2,</div><div class="line"><a name="l02249"></a><span class="lineno"> 2249</span>  WSI_TOKEN_HOST = 3,</div><div class="line"><a name="l02250"></a><span class="lineno"> 2250</span>  WSI_TOKEN_CONNECTION = 4,</div><div class="line"><a name="l02251"></a><span class="lineno"> 2251</span>  WSI_TOKEN_UPGRADE = 5,</div><div class="line"><a name="l02252"></a><span class="lineno"> 2252</span>  WSI_TOKEN_ORIGIN = 6,</div><div class="line"><a name="l02253"></a><span class="lineno"> 2253</span>  WSI_TOKEN_DRAFT = 7,</div><div class="line"><a name="l02254"></a><span class="lineno"> 2254</span>  WSI_TOKEN_CHALLENGE = 8,</div><div class="line"><a name="l02255"></a><span class="lineno"> 2255</span>  WSI_TOKEN_EXTENSIONS = 9,</div><div class="line"><a name="l02256"></a><span class="lineno"> 2256</span>  WSI_TOKEN_KEY1 = 10,</div><div class="line"><a name="l02257"></a><span class="lineno"> 2257</span>  WSI_TOKEN_KEY2 = 11,</div><div class="line"><a name="l02258"></a><span class="lineno"> 2258</span>  WSI_TOKEN_PROTOCOL = 12,</div><div class="line"><a name="l02259"></a><span class="lineno"> 2259</span>  WSI_TOKEN_ACCEPT = 13,</div><div class="line"><a name="l02260"></a><span class="lineno"> 2260</span>  WSI_TOKEN_NONCE = 14,</div><div class="line"><a name="l02261"></a><span class="lineno"> 2261</span>  WSI_TOKEN_HTTP = 15,</div><div class="line"><a name="l02262"></a><span class="lineno"> 2262</span>  WSI_TOKEN_HTTP2_SETTINGS = 16,</div><div class="line"><a name="l02263"></a><span class="lineno"> 2263</span>  WSI_TOKEN_HTTP_ACCEPT = 17,</div><div class="line"><a name="l02264"></a><span class="lineno"> 2264</span>  WSI_TOKEN_HTTP_AC_REQUEST_HEADERS = 18,</div><div class="line"><a name="l02265"></a><span class="lineno"> 2265</span>  WSI_TOKEN_HTTP_IF_MODIFIED_SINCE = 19,</div><div class="line"><a name="l02266"></a><span class="lineno"> 2266</span>  WSI_TOKEN_HTTP_IF_NONE_MATCH = 20,</div><div class="line"><a name="l02267"></a><span class="lineno"> 2267</span>  WSI_TOKEN_HTTP_ACCEPT_ENCODING = 21,</div><div class="line"><a name="l02268"></a><span class="lineno"> 2268</span>  WSI_TOKEN_HTTP_ACCEPT_LANGUAGE = 22,</div><div class="line"><a name="l02269"></a><span class="lineno"> 2269</span>  WSI_TOKEN_HTTP_PRAGMA = 23,</div><div class="line"><a name="l02270"></a><span class="lineno"> 2270</span>  WSI_TOKEN_HTTP_CACHE_CONTROL = 24,</div><div class="line"><a name="l02271"></a><span class="lineno"> 2271</span>  WSI_TOKEN_HTTP_AUTHORIZATION = 25,</div><div class="line"><a name="l02272"></a><span class="lineno"> 2272</span>  WSI_TOKEN_HTTP_COOKIE = 26,</div><div class="line"><a name="l02273"></a><span class="lineno"> 2273</span>  WSI_TOKEN_HTTP_CONTENT_LENGTH = 27,</div><div class="line"><a name="l02274"></a><span class="lineno"> 2274</span>  WSI_TOKEN_HTTP_CONTENT_TYPE = 28,</div><div class="line"><a name="l02275"></a><span class="lineno"> 2275</span>  WSI_TOKEN_HTTP_DATE = 29,</div><div class="line"><a name="l02276"></a><span class="lineno"> 2276</span>  WSI_TOKEN_HTTP_RANGE = 30,</div><div class="line"><a name="l02277"></a><span class="lineno"> 2277</span>  WSI_TOKEN_HTTP_REFERER = 31,</div><div class="line"><a name="l02278"></a><span class="lineno"> 2278</span>  WSI_TOKEN_KEY = 32,</div><div class="line"><a name="l02279"></a><span class="lineno"> 2279</span>  WSI_TOKEN_VERSION = 33,</div><div class="line"><a name="l02280"></a><span class="lineno"> 2280</span>  WSI_TOKEN_SWORIGIN = 34,</div><div class="line"><a name="l02281"></a><span class="lineno"> 2281</span> </div><div class="line"><a name="l02282"></a><span class="lineno"> 2282</span>  WSI_TOKEN_HTTP_COLON_AUTHORITY = 35,</div><div class="line"><a name="l02283"></a><span class="lineno"> 2283</span>  WSI_TOKEN_HTTP_COLON_METHOD = 36,</div><div class="line"><a name="l02284"></a><span class="lineno"> 2284</span>  WSI_TOKEN_HTTP_COLON_PATH = 37,</div><div class="line"><a name="l02285"></a><span class="lineno"> 2285</span>  WSI_TOKEN_HTTP_COLON_SCHEME = 38,</div><div class="line"><a name="l02286"></a><span class="lineno"> 2286</span>  WSI_TOKEN_HTTP_COLON_STATUS = 39,</div><div class="line"><a name="l02287"></a><span class="lineno"> 2287</span> </div><div class="line"><a name="l02288"></a><span class="lineno"> 2288</span>  WSI_TOKEN_HTTP_ACCEPT_CHARSET = 40,</div><div class="line"><a name="l02289"></a><span class="lineno"> 2289</span>  WSI_TOKEN_HTTP_ACCEPT_RANGES = 41,</div><div class="line"><a name="l02290"></a><span class="lineno"> 2290</span>  WSI_TOKEN_HTTP_ACCESS_CONTROL_ALLOW_ORIGIN = 42,</div><div class="line"><a name="l02291"></a><span class="lineno"> 2291</span>  WSI_TOKEN_HTTP_AGE = 43,</div><div class="line"><a name="l02292"></a><span class="lineno"> 2292</span>  WSI_TOKEN_HTTP_ALLOW = 44,</div><div class="line"><a name="l02293"></a><span class="lineno"> 2293</span>  WSI_TOKEN_HTTP_CONTENT_DISPOSITION = 45,</div><div class="line"><a name="l02294"></a><span class="lineno"> 2294</span>  WSI_TOKEN_HTTP_CONTENT_ENCODING = 46,</div><div class="line"><a name="l02295"></a><span class="lineno"> 2295</span>  WSI_TOKEN_HTTP_CONTENT_LANGUAGE = 47,</div><div class="line"><a name="l02296"></a><span class="lineno"> 2296</span>  WSI_TOKEN_HTTP_CONTENT_LOCATION = 48,</div><div class="line"><a name="l02297"></a><span class="lineno"> 2297</span>  WSI_TOKEN_HTTP_CONTENT_RANGE = 49,</div><div class="line"><a name="l02298"></a><span class="lineno"> 2298</span>  WSI_TOKEN_HTTP_ETAG = 50,</div><div class="line"><a name="l02299"></a><span class="lineno"> 2299</span>  WSI_TOKEN_HTTP_EXPECT = 51,</div><div class="line"><a name="l02300"></a><span class="lineno"> 2300</span>  WSI_TOKEN_HTTP_EXPIRES = 52,</div><div class="line"><a name="l02301"></a><span class="lineno"> 2301</span>  WSI_TOKEN_HTTP_FROM = 53,</div><div class="line"><a name="l02302"></a><span class="lineno"> 2302</span>  WSI_TOKEN_HTTP_IF_MATCH = 54,</div><div class="line"><a name="l02303"></a><span class="lineno"> 2303</span>  WSI_TOKEN_HTTP_IF_RANGE = 55,</div><div class="line"><a name="l02304"></a><span class="lineno"> 2304</span>  WSI_TOKEN_HTTP_IF_UNMODIFIED_SINCE = 56,</div><div class="line"><a name="l02305"></a><span class="lineno"> 2305</span>  WSI_TOKEN_HTTP_LAST_MODIFIED = 57,</div><div class="line"><a name="l02306"></a><span class="lineno"> 2306</span>  WSI_TOKEN_HTTP_LINK = 58,</div><div class="line"><a name="l02307"></a><span class="lineno"> 2307</span>  WSI_TOKEN_HTTP_LOCATION = 59,</div><div class="line"><a name="l02308"></a><span class="lineno"> 2308</span>  WSI_TOKEN_HTTP_MAX_FORWARDS = 60,</div><div class="line"><a name="l02309"></a><span class="lineno"> 2309</span>  WSI_TOKEN_HTTP_PROXY_AUTHENTICATE = 61,</div><div class="line"><a name="l02310"></a><span class="lineno"> 2310</span>  WSI_TOKEN_HTTP_PROXY_AUTHORIZATION = 62,</div><div class="line"><a name="l02311"></a><span class="lineno"> 2311</span>  WSI_TOKEN_HTTP_REFRESH = 63,</div><div class="line"><a name="l02312"></a><span class="lineno"> 2312</span>  WSI_TOKEN_HTTP_RETRY_AFTER = 64,</div><div class="line"><a name="l02313"></a><span class="lineno"> 2313</span>  WSI_TOKEN_HTTP_SERVER = 65,</div><div class="line"><a name="l02314"></a><span class="lineno"> 2314</span>  WSI_TOKEN_HTTP_SET_COOKIE = 66,</div><div class="line"><a name="l02315"></a><span class="lineno"> 2315</span>  WSI_TOKEN_HTTP_STRICT_TRANSPORT_SECURITY = 67,</div><div class="line"><a name="l02316"></a><span class="lineno"> 2316</span>  WSI_TOKEN_HTTP_TRANSFER_ENCODING = 68,</div><div class="line"><a name="l02317"></a><span class="lineno"> 2317</span>  WSI_TOKEN_HTTP_USER_AGENT = 69,</div><div class="line"><a name="l02318"></a><span class="lineno"> 2318</span>  WSI_TOKEN_HTTP_VARY = 70,</div><div class="line"><a name="l02319"></a><span class="lineno"> 2319</span>  WSI_TOKEN_HTTP_VIA = 71,</div><div class="line"><a name="l02320"></a><span class="lineno"> 2320</span>  WSI_TOKEN_HTTP_WWW_AUTHENTICATE = 72,</div><div class="line"><a name="l02321"></a><span class="lineno"> 2321</span> </div><div class="line"><a name="l02322"></a><span class="lineno"> 2322</span>  WSI_TOKEN_PATCH_URI = 73,</div><div class="line"><a name="l02323"></a><span class="lineno"> 2323</span>  WSI_TOKEN_PUT_URI = 74,</div><div class="line"><a name="l02324"></a><span class="lineno"> 2324</span>  WSI_TOKEN_DELETE_URI = 75,</div><div class="line"><a name="l02325"></a><span class="lineno"> 2325</span> </div><div class="line"><a name="l02326"></a><span class="lineno"> 2326</span>  WSI_TOKEN_HTTP_URI_ARGS = 76,</div><div class="line"><a name="l02327"></a><span class="lineno"> 2327</span>  WSI_TOKEN_PROXY = 77,</div><div class="line"><a name="l02328"></a><span class="lineno"> 2328</span>  WSI_TOKEN_HTTP_X_REAL_IP = 78,</div><div class="line"><a name="l02329"></a><span class="lineno"> 2329</span>  WSI_TOKEN_HTTP1_0 = 79,</div><div class="line"><a name="l02330"></a><span class="lineno"> 2330</span> </div><div class="line"><a name="l02331"></a><span class="lineno"> 2331</span>  <span class="comment">/****** add new things just above ---^ ******/</span></div><div class="line"><a name="l02332"></a><span class="lineno"> 2332</span> </div><div class="line"><a name="l02333"></a><span class="lineno"> 2333</span>  <span class="comment">/* use token storage to stash these internally, not for</span></div><div class="line"><a name="l02334"></a><span class="lineno"> 2334</span> <span class="comment"> * user use */</span></div><div class="line"><a name="l02335"></a><span class="lineno"> 2335</span> </div><div class="line"><a name="l02336"></a><span class="lineno"> 2336</span>  _WSI_TOKEN_CLIENT_SENT_PROTOCOLS,</div><div class="line"><a name="l02337"></a><span class="lineno"> 2337</span>  _WSI_TOKEN_CLIENT_PEER_ADDRESS,</div><div class="line"><a name="l02338"></a><span class="lineno"> 2338</span>  _WSI_TOKEN_CLIENT_URI,</div><div class="line"><a name="l02339"></a><span class="lineno"> 2339</span>  _WSI_TOKEN_CLIENT_HOST,</div><div class="line"><a name="l02340"></a><span class="lineno"> 2340</span>  _WSI_TOKEN_CLIENT_ORIGIN,</div><div class="line"><a name="l02341"></a><span class="lineno"> 2341</span>  _WSI_TOKEN_CLIENT_METHOD,</div><div class="line"><a name="l02342"></a><span class="lineno"> 2342</span> </div><div class="line"><a name="l02343"></a><span class="lineno"> 2343</span>  <span class="comment">/* always last real token index*/</span></div><div class="line"><a name="l02344"></a><span class="lineno"> 2344</span>  WSI_TOKEN_COUNT,</div><div class="line"><a name="l02345"></a><span class="lineno"> 2345</span> </div><div class="line"><a name="l02346"></a><span class="lineno"> 2346</span>  <span class="comment">/* parser state additions, no storage associated */</span></div><div class="line"><a name="l02347"></a><span class="lineno"> 2347</span>  WSI_TOKEN_NAME_PART,</div><div class="line"><a name="l02348"></a><span class="lineno"> 2348</span>  WSI_TOKEN_SKIPPING,</div><div class="line"><a name="l02349"></a><span class="lineno"> 2349</span>  WSI_TOKEN_SKIPPING_SAW_CR,</div><div class="line"><a name="l02350"></a><span class="lineno"> 2350</span>  WSI_PARSING_COMPLETE,</div><div class="line"><a name="l02351"></a><span class="lineno"> 2351</span>  WSI_INIT_TOKEN_MUXURL,</div><div class="line"><a name="l02352"></a><span class="lineno"> 2352</span> };</div><div class="line"><a name="l02353"></a><span class="lineno"> 2353</span> </div><div class="line"><a name="l02354"></a><span class="lineno"><a class="line" href="structlws__token__limits.html"> 2354</a></span> <span class="keyword">struct </span><a class="code" href="structlws__token__limits.html">lws_token_limits</a> {</div><div class="line"><a name="l02355"></a><span class="lineno"><a class="line" href="structlws__token__limits.html#a6ec712306cbf8585bce7a56758a3ceff"> 2355</a></span>  <span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> token_limit[WSI_TOKEN_COUNT]; </div><div class="line"><a name="l02356"></a><span class="lineno"> 2356</span> };</div><div class="line"><a name="l02357"></a><span class="lineno"> 2357</span> </div><div class="line"><a name="l02363"></a><span class="lineno"> 2363</span> LWS_VISIBLE LWS_EXTERN <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *</div><div class="line"><a name="l02364"></a><span class="lineno"> 2364</span> <a class="code" href="group__HTTP-headers-read.html#ga2c0597b2ef1d2cee35736c338bcbd17b">lws_token_to_string</a>(<span class="keyword">enum</span> lws_token_indexes token);</div><div class="line"><a name="l02365"></a><span class="lineno"> 2365</span> </div><div class="line"><a name="l02366"></a><span class="lineno"> 2366</span> </div><div class="line"><a name="l02375"></a><span class="lineno"> 2375</span> LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span> LWS_WARN_UNUSED_RESULT</div><div class="line"><a name="l02376"></a><span class="lineno"> 2376</span> <a class="code" href="group__HTTP-headers-read.html#ga8ade0e1ffb0da7e62b989d8d867bf6c8">lws_hdr_total_length</a>(<span class="keyword">struct</span> lws *wsi, <span class="keyword">enum</span> lws_token_indexes h);</div><div class="line"><a name="l02377"></a><span class="lineno"> 2377</span> </div><div class="line"><a name="l02387"></a><span class="lineno"> 2387</span> LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span> LWS_WARN_UNUSED_RESULT</div><div class="line"><a name="l02388"></a><span class="lineno"> 2388</span> <a class="code" href="group__HTTP-headers-read.html#ga594f3d0ece5b09c2ccf9f98ea533bb4e">lws_hdr_fragment_length</a>(<span class="keyword">struct</span> lws *wsi, <span class="keyword">enum</span> lws_token_indexes h, <span class="keywordtype">int</span> frag_idx);</div><div class="line"><a name="l02389"></a><span class="lineno"> 2389</span> </div><div class="line"><a name="l02403"></a><span class="lineno"> 2403</span> LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l02404"></a><span class="lineno"> 2404</span> <a class="code" href="group__HTTP-headers-read.html#ga6ce6aa1c0155ea42b7708bed271d1c77">lws_hdr_copy</a>(<span class="keyword">struct</span> lws *wsi, <span class="keywordtype">char</span> *dest, <span class="keywordtype">int</span> len, <span class="keyword">enum</span> lws_token_indexes h);</div><div class="line"><a name="l02405"></a><span class="lineno"> 2405</span> </div><div class="line"><a name="l02423"></a><span class="lineno"> 2423</span> LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l02424"></a><span class="lineno"> 2424</span> <a class="code" href="group__HTTP-headers-read.html#gaa427cad61a9a5e3004afd65c4527b5e9">lws_hdr_copy_fragment</a>(<span class="keyword">struct</span> lws *wsi, <span class="keywordtype">char</span> *dest, <span class="keywordtype">int</span> len,</div><div class="line"><a name="l02425"></a><span class="lineno"> 2425</span>  <span class="keyword">enum</span> lws_token_indexes h, <span class="keywordtype">int</span> frag_idx);</div><div class="line"><a name="l02426"></a><span class="lineno"> 2426</span> </div><div class="line"><a name="l02437"></a><span class="lineno"> 2437</span> LWS_VISIBLE LWS_EXTERN <span class="keyword">const</span> <span class="keywordtype">char</span> *</div><div class="line"><a name="l02438"></a><span class="lineno"> 2438</span> <a class="code" href="group__HTTP-headers-read.html#ga84e9ce5e71a77501a0998ac403a984c2">lws_get_urlarg_by_name</a>(<span class="keyword">struct</span> lws *wsi, <span class="keyword">const</span> <span class="keywordtype">char</span> *name, <span class="keywordtype">char</span> *buf, <span class="keywordtype">int</span> len);</div><div class="line"><a name="l02440"></a><span class="lineno"> 2440</span> </div><div class="line"><a name="l02455"></a><span class="lineno"> 2455</span> </div><div class="line"><a name="l02466"></a><span class="lineno"> 2466</span> LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span> LWS_WARN_UNUSED_RESULT</div><div class="line"><a name="l02467"></a><span class="lineno"> 2467</span> <a class="code" href="group__HTTP-headers-create.html#ga29b7d6d2ddfdbaff3d8b607e7e3151b6">lws_add_http_header_status</a>(<span class="keyword">struct</span> lws *wsi,</div><div class="line"><a name="l02468"></a><span class="lineno"> 2468</span>  <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> code, <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> **p,</div><div class="line"><a name="l02469"></a><span class="lineno"> 2469</span>  <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *end);</div><div class="line"><a name="l02482"></a><span class="lineno"> 2482</span> LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span> LWS_WARN_UNUSED_RESULT</div><div class="line"><a name="l02483"></a><span class="lineno"> 2483</span> <a class="code" href="group__HTTP-headers-create.html#ga2b36bf44405755ff51c1939303b995a8">lws_add_http_header_by_name</a>(<span class="keyword">struct</span> lws *wsi, <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *name,</div><div class="line"><a name="l02484"></a><span class="lineno"> 2484</span>  <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *value, <span class="keywordtype">int</span> length,</div><div class="line"><a name="l02485"></a><span class="lineno"> 2485</span>  <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> **p, <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *end);</div><div class="line"><a name="l02499"></a><span class="lineno"> 2499</span> LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span> LWS_WARN_UNUSED_RESULT</div><div class="line"><a name="l02500"></a><span class="lineno"> 2500</span> <a class="code" href="group__HTTP-headers-create.html#gaf74adb761b22566ad70004882712dce1">lws_add_http_header_by_token</a>(<span class="keyword">struct</span> lws *wsi, <span class="keyword">enum</span> lws_token_indexes token,</div><div class="line"><a name="l02501"></a><span class="lineno"> 2501</span>  <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *value, <span class="keywordtype">int</span> length,</div><div class="line"><a name="l02502"></a><span class="lineno"> 2502</span>  <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> **p, <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *end);</div><div class="line"><a name="l02513"></a><span class="lineno"> 2513</span> LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span> LWS_WARN_UNUSED_RESULT</div><div class="line"><a name="l02514"></a><span class="lineno"> 2514</span> <a class="code" href="group__HTTP-headers-create.html#gacc76a5babcb4dce1b01b1955aa7a2faf">lws_add_http_header_content_length</a>(<span class="keyword">struct</span> lws *wsi,</div><div class="line"><a name="l02515"></a><span class="lineno"> 2515</span>  <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> content_length,</div><div class="line"><a name="l02516"></a><span class="lineno"> 2516</span>  <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> **p, <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *end);</div><div class="line"><a name="l02526"></a><span class="lineno"> 2526</span> LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span> LWS_WARN_UNUSED_RESULT</div><div class="line"><a name="l02527"></a><span class="lineno"> 2527</span> <a class="code" href="group__HTTP-headers-create.html#ga4887605ff2242a54db3a7fa01f6f864b">lws_finalize_http_header</a>(<span class="keyword">struct</span> lws *wsi, <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> **p,</div><div class="line"><a name="l02528"></a><span class="lineno"> 2528</span>  <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *end);</div><div class="line"><a name="l02530"></a><span class="lineno"> 2530</span> </div><div class="line"><a name="l02549"></a><span class="lineno"> 2549</span> </div><div class="line"><a name="l02552"></a><span class="lineno"><a class="line" href="group__form-parsing.html#ga41a74a822771d3dce89751aa3bce28ae"> 2552</a></span> <span class="keyword">enum</span> <a class="code" href="group__form-parsing.html#ga41a74a822771d3dce89751aa3bce28ae">lws_spa_fileupload_states</a> {</div><div class="line"><a name="l02553"></a><span class="lineno"><a class="line" href="group__form-parsing.html#gga41a74a822771d3dce89751aa3bce28aead3a958e7719ac273c3ba4f684f00c87f"> 2553</a></span>  <a class="code" href="group__form-parsing.html#gga41a74a822771d3dce89751aa3bce28aead3a958e7719ac273c3ba4f684f00c87f">LWS_UFS_CONTENT</a>,</div><div class="line"><a name="l02555"></a><span class="lineno"><a class="line" href="group__form-parsing.html#gga41a74a822771d3dce89751aa3bce28aea6ce2a55a4c3695cdb640c893d95bd3a7"> 2555</a></span>  <a class="code" href="group__form-parsing.html#gga41a74a822771d3dce89751aa3bce28aea6ce2a55a4c3695cdb640c893d95bd3a7">LWS_UFS_FINAL_CONTENT</a>,</div><div class="line"><a name="l02557"></a><span class="lineno"><a class="line" href="group__form-parsing.html#gga41a74a822771d3dce89751aa3bce28aea2d25de44865bd44e5a3903a2bab9ca83"> 2557</a></span>  <a class="code" href="group__form-parsing.html#gga41a74a822771d3dce89751aa3bce28aea2d25de44865bd44e5a3903a2bab9ca83">LWS_UFS_OPEN</a></div><div class="line"><a name="l02559"></a><span class="lineno"> 2559</span> };</div><div class="line"><a name="l02560"></a><span class="lineno"> 2560</span> </div><div class="line"><a name="l02574"></a><span class="lineno"><a class="line" href="group__form-parsing.html#ga5a70527c0861c2ffa3d29333a6aa7f8e"> 2574</a></span> <span class="keyword">typedef</span> int (*<a class="code" href="group__form-parsing.html#ga5a70527c0861c2ffa3d29333a6aa7f8e">lws_spa_fileupload_cb</a>)(<span class="keywordtype">void</span> *data, <span class="keyword">const</span> <span class="keywordtype">char</span> *name,</div><div class="line"><a name="l02575"></a><span class="lineno"> 2575</span>  <span class="keyword">const</span> <span class="keywordtype">char</span> *filename, <span class="keywordtype">char</span> *buf, <span class="keywordtype">int</span> len,</div><div class="line"><a name="l02576"></a><span class="lineno"> 2576</span>  <span class="keyword">enum</span> <a class="code" href="group__form-parsing.html#ga41a74a822771d3dce89751aa3bce28ae">lws_spa_fileupload_states</a> state);</div><div class="line"><a name="l02577"></a><span class="lineno"> 2577</span> </div><div class="line"><a name="l02580"></a><span class="lineno"> 2580</span> <span class="keyword">struct </span>lws_spa;</div><div class="line"><a name="l02581"></a><span class="lineno"> 2581</span> </div><div class="line"><a name="l02600"></a><span class="lineno"> 2600</span> LWS_VISIBLE LWS_EXTERN <span class="keyword">struct </span>lws_spa *</div><div class="line"><a name="l02601"></a><span class="lineno"> 2601</span> <a class="code" href="group__form-parsing.html#ga162f86762173a2bc8c28497941d74815">lws_spa_create</a>(<span class="keyword">struct</span> lws *wsi, <span class="keyword">const</span> <span class="keywordtype">char</span> * <span class="keyword">const</span> *param_names,</div><div class="line"><a name="l02602"></a><span class="lineno"> 2602</span>  <span class="keywordtype">int</span> count_params, <span class="keywordtype">int</span> max_storage, <a class="code" href="group__form-parsing.html#ga5a70527c0861c2ffa3d29333a6aa7f8e">lws_spa_fileupload_cb</a> opt_cb,</div><div class="line"><a name="l02603"></a><span class="lineno"> 2603</span>  <span class="keywordtype">void</span> *opt_data);</div><div class="line"><a name="l02604"></a><span class="lineno"> 2604</span> </div><div class="line"><a name="l02612"></a><span class="lineno"> 2612</span> LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l02613"></a><span class="lineno"> 2613</span> <a class="code" href="group__form-parsing.html#ga9ad9ebf5ea1a7108415ed7e04cb231d2">lws_spa_process</a>(<span class="keyword">struct</span> lws_spa *spa, <span class="keyword">const</span> <span class="keywordtype">char</span> *in, <span class="keywordtype">int</span> len);</div><div class="line"><a name="l02614"></a><span class="lineno"> 2614</span> </div><div class="line"><a name="l02620"></a><span class="lineno"> 2620</span> LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l02621"></a><span class="lineno"> 2621</span> <a class="code" href="group__form-parsing.html#ga83835bf250ee3d4a60f36a182f2b8d24">lws_spa_finalize</a>(<span class="keyword">struct</span> lws_spa *spa);</div><div class="line"><a name="l02622"></a><span class="lineno"> 2622</span> </div><div class="line"><a name="l02629"></a><span class="lineno"> 2629</span> LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l02630"></a><span class="lineno"> 2630</span> <a class="code" href="group__form-parsing.html#ga3fbe378632f85ec9a14cc2c1687bf05f">lws_spa_get_length</a>(<span class="keyword">struct</span> lws_spa *spa, <span class="keywordtype">int</span> n);</div><div class="line"><a name="l02631"></a><span class="lineno"> 2631</span> </div><div class="line"><a name="l02637"></a><span class="lineno"> 2637</span> LWS_VISIBLE LWS_EXTERN <span class="keyword">const</span> <span class="keywordtype">char</span> *</div><div class="line"><a name="l02638"></a><span class="lineno"> 2638</span> <a class="code" href="group__form-parsing.html#ga2da476217166da02704b90d3a8d4f3cd">lws_spa_get_string</a>(<span class="keyword">struct</span> lws_spa *spa, <span class="keywordtype">int</span> n);</div><div class="line"><a name="l02639"></a><span class="lineno"> 2639</span> </div><div class="line"><a name="l02645"></a><span class="lineno"> 2645</span> LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l02646"></a><span class="lineno"> 2646</span> <a class="code" href="group__form-parsing.html#gaaa482f07dad3f04b391cccf0a814e13b">lws_spa_destroy</a>(<span class="keyword">struct</span> lws_spa *spa);</div><div class="line"><a name="l02648"></a><span class="lineno"> 2648</span> </div><div class="line"><a name="l02659"></a><span class="lineno"> 2659</span> </div><div class="line"><a name="l02670"></a><span class="lineno"> 2670</span> LWS_VISIBLE LWS_EXTERN <span class="keyword">const</span> <span class="keywordtype">char</span> *</div><div class="line"><a name="l02671"></a><span class="lineno"> 2671</span> <a class="code" href="group__urlendec.html#gabc2888476e50e001c875c1a8abf455b7">lws_urlencode</a>(<span class="keywordtype">char</span> *escaped, <span class="keyword">const</span> <span class="keywordtype">char</span> *<span class="keywordtype">string</span>, <span class="keywordtype">int</span> len);</div><div class="line"><a name="l02672"></a><span class="lineno"> 2672</span> </div><div class="line"><a name="l02673"></a><span class="lineno"> 2673</span> <span class="comment">/*</span></div><div class="line"><a name="l02674"></a><span class="lineno"> 2674</span> <span class="comment"> * URLDECODE 1 / 2</span></div><div class="line"><a name="l02675"></a><span class="lineno"> 2675</span> <span class="comment"> *</span></div><div class="line"><a name="l02676"></a><span class="lineno"> 2676</span> <span class="comment"> * This simple urldecode only operates until the first '\0' and requires the</span></div><div class="line"><a name="l02677"></a><span class="lineno"> 2677</span> <span class="comment"> * data to exist all at once</span></div><div class="line"><a name="l02678"></a><span class="lineno"> 2678</span> <span class="comment"> */</span></div><div class="line"><a name="l02691"></a><span class="lineno"> 2691</span> LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l02692"></a><span class="lineno"> 2692</span> <a class="code" href="group__urlendec.html#gaa373a9c16acdd96c395af61ab915ece3">lws_urldecode</a>(<span class="keywordtype">char</span> *<span class="keywordtype">string</span>, <span class="keyword">const</span> <span class="keywordtype">char</span> *escaped, <span class="keywordtype">int</span> len);</div><div class="line"><a name="l02694"></a><span class="lineno"> 2694</span> </div><div class="line"><a name="l02703"></a><span class="lineno"> 2703</span> LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l02704"></a><span class="lineno"> 2704</span> <a class="code" href="group__http.html#gac8a4a71240857dc6b2ed70456b6923f4">lws_return_http_status</a>(<span class="keyword">struct</span> lws *wsi, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> code,</div><div class="line"><a name="l02705"></a><span class="lineno"> 2705</span>  <span class="keyword">const</span> <span class="keywordtype">char</span> *html_body);</div><div class="line"><a name="l02706"></a><span class="lineno"> 2706</span> </div><div class="line"><a name="l02717"></a><span class="lineno"> 2717</span> LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span> LWS_WARN_UNUSED_RESULT</div><div class="line"><a name="l02718"></a><span class="lineno"> 2718</span> <a class="code" href="group__http.html#ga8fbf01e473ac421fc33ad9f8da8b8a25">lws_http_redirect</a>(<span class="keyword">struct</span> lws *wsi, <span class="keywordtype">int</span> code, <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *loc, <span class="keywordtype">int</span> len,</div><div class="line"><a name="l02719"></a><span class="lineno"> 2719</span>  <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> **p, <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *end);</div><div class="line"><a name="l02720"></a><span class="lineno"> 2720</span> </div><div class="line"><a name="l02729"></a><span class="lineno"> 2729</span> LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span> LWS_WARN_UNUSED_RESULT</div><div class="line"><a name="l02730"></a><span class="lineno"> 2730</span> <a class="code" href="group__http.html#gad27aed6c66a41b2b89ffe4da2a309e8a">lws_http_transaction_completed</a>(<span class="keyword">struct</span> lws *wsi);</div><div class="line"><a name="l02732"></a><span class="lineno"> 2732</span> </div><div class="line"><a name="l02740"></a><span class="lineno"> 2740</span> </div><div class="line"><a name="l02751"></a><span class="lineno"> 2751</span> LWS_VISIBLE LWS_EXTERN <span class="keyword">const</span> <span class="keywordtype">char</span> *</div><div class="line"><a name="l02752"></a><span class="lineno"> 2752</span> <a class="code" href="group__pur.html#ga9cc82f06e5ae7e71458626d7a39a5865">lws_sql_purify</a>(<span class="keywordtype">char</span> *escaped, <span class="keyword">const</span> <span class="keywordtype">char</span> *<span class="keywordtype">string</span>, <span class="keywordtype">int</span> len);</div><div class="line"><a name="l02753"></a><span class="lineno"> 2753</span> </div><div class="line"><a name="l02764"></a><span class="lineno"> 2764</span> LWS_VISIBLE LWS_EXTERN <span class="keyword">const</span> <span class="keywordtype">char</span> *</div><div class="line"><a name="l02765"></a><span class="lineno"> 2765</span> <a class="code" href="group__pur.html#gab15187efcfa256b7c928562c182b92a3">lws_json_purify</a>(<span class="keywordtype">char</span> *escaped, <span class="keyword">const</span> <span class="keywordtype">char</span> *<span class="keywordtype">string</span>, <span class="keywordtype">int</span> len);</div><div class="line"><a name="l02767"></a><span class="lineno"> 2767</span> </div><div class="line"><a name="l02774"></a><span class="lineno"> 2774</span> </div><div class="line"><a name="l02776"></a><span class="lineno"> 2776</span> <span class="preprocessor">#ifdef LWS_USE_LIBEV</span></div><div class="line"><a name="l02777"></a><span class="lineno"> 2777</span> <span class="keyword">typedef</span> void (lws_ev_signal_cb_t)(EV_P_ <span class="keyword">struct </span>ev_signal *w, <span class="keywordtype">int</span> revents);</div><div class="line"><a name="l02778"></a><span class="lineno"> 2778</span> </div><div class="line"><a name="l02779"></a><span class="lineno"> 2779</span> LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l02780"></a><span class="lineno"> 2780</span> lws_ev_sigint_cfg(<span class="keyword">struct</span> lws_context *context, <span class="keywordtype">int</span> use_ev_sigint,</div><div class="line"><a name="l02781"></a><span class="lineno"> 2781</span>  lws_ev_signal_cb_t *cb);</div><div class="line"><a name="l02782"></a><span class="lineno"> 2782</span> </div><div class="line"><a name="l02783"></a><span class="lineno"> 2783</span> LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l02784"></a><span class="lineno"> 2784</span> lws_ev_initloop(<span class="keyword">struct</span> lws_context *context, <span class="keyword">struct</span> ev_loop *loop, <span class="keywordtype">int</span> tsi);</div><div class="line"><a name="l02785"></a><span class="lineno"> 2785</span> </div><div class="line"><a name="l02786"></a><span class="lineno"> 2786</span> LWS_VISIBLE LWS_EXTERN <span class="keywordtype">void</span></div><div class="line"><a name="l02787"></a><span class="lineno"> 2787</span> lws_ev_sigint_cb(<span class="keyword">struct</span> ev_loop *loop, <span class="keyword">struct</span> ev_signal *watcher, <span class="keywordtype">int</span> revents);</div><div class="line"><a name="l02788"></a><span class="lineno"> 2788</span> <span class="preprocessor">#endif </span><span class="comment">/* LWS_USE_LIBEV */</span><span class="preprocessor"></span></div><div class="line"><a name="l02789"></a><span class="lineno"> 2789</span> </div><div class="line"><a name="l02791"></a><span class="lineno"> 2791</span> </div><div class="line"><a name="l02798"></a><span class="lineno"> 2798</span> <span class="preprocessor">#ifdef LWS_USE_LIBUV</span></div><div class="line"><a name="l02800"></a><span class="lineno"> 2800</span> LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l02801"></a><span class="lineno"> 2801</span> lws_uv_sigint_cfg(<span class="keyword">struct</span> lws_context *context, <span class="keywordtype">int</span> use_uv_sigint,</div><div class="line"><a name="l02802"></a><span class="lineno"> 2802</span>  uv_signal_cb cb);</div><div class="line"><a name="l02803"></a><span class="lineno"> 2803</span> </div><div class="line"><a name="l02804"></a><span class="lineno"> 2804</span> LWS_VISIBLE LWS_EXTERN <span class="keywordtype">void</span></div><div class="line"><a name="l02805"></a><span class="lineno"> 2805</span> lws_libuv_run(<span class="keyword">const</span> <span class="keyword">struct</span> lws_context *context, <span class="keywordtype">int</span> tsi);</div><div class="line"><a name="l02806"></a><span class="lineno"> 2806</span> </div><div class="line"><a name="l02807"></a><span class="lineno"> 2807</span> LWS_VISIBLE LWS_EXTERN <span class="keywordtype">void</span></div><div class="line"><a name="l02808"></a><span class="lineno"> 2808</span> lws_libuv_stop(<span class="keyword">struct</span> lws_context *context);</div><div class="line"><a name="l02809"></a><span class="lineno"> 2809</span> </div><div class="line"><a name="l02810"></a><span class="lineno"> 2810</span> LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l02811"></a><span class="lineno"> 2811</span> lws_uv_initloop(<span class="keyword">struct</span> lws_context *context, uv_loop_t *loop, <span class="keywordtype">int</span> tsi);</div><div class="line"><a name="l02812"></a><span class="lineno"> 2812</span> </div><div class="line"><a name="l02813"></a><span class="lineno"> 2813</span> LWS_VISIBLE LWS_EXTERN uv_loop_t *</div><div class="line"><a name="l02814"></a><span class="lineno"> 2814</span> lws_uv_getloop(<span class="keyword">struct</span> lws_context *context, <span class="keywordtype">int</span> tsi);</div><div class="line"><a name="l02815"></a><span class="lineno"> 2815</span> </div><div class="line"><a name="l02816"></a><span class="lineno"> 2816</span> LWS_VISIBLE LWS_EXTERN <span class="keywordtype">void</span></div><div class="line"><a name="l02817"></a><span class="lineno"> 2817</span> lws_uv_sigint_cb(uv_signal_t *watcher, <span class="keywordtype">int</span> signum);</div><div class="line"><a name="l02818"></a><span class="lineno"> 2818</span> <span class="preprocessor">#endif </span><span class="comment">/* LWS_USE_LIBUV */</span><span class="preprocessor"></span></div><div class="line"><a name="l02819"></a><span class="lineno"> 2819</span> </div><div class="line"><a name="l02826"></a><span class="lineno"> 2826</span> </div><div class="line"><a name="l02827"></a><span class="lineno"> 2827</span> <span class="comment">/*</span></div><div class="line"><a name="l02828"></a><span class="lineno"> 2828</span> <span class="comment"> * NOTE: These public enums are part of the abi. If you want to add one,</span></div><div class="line"><a name="l02829"></a><span class="lineno"> 2829</span> <span class="comment"> * add it at where specified so existing users are unaffected.</span></div><div class="line"><a name="l02830"></a><span class="lineno"> 2830</span> <span class="comment"> */</span></div><div class="line"><a name="l02831"></a><span class="lineno"> 2831</span> <span class="keyword">enum</span> pending_timeout {</div><div class="line"><a name="l02832"></a><span class="lineno"> 2832</span>  NO_PENDING_TIMEOUT = 0,</div><div class="line"><a name="l02833"></a><span class="lineno"> 2833</span>  PENDING_TIMEOUT_AWAITING_PROXY_RESPONSE = 1,</div><div class="line"><a name="l02834"></a><span class="lineno"> 2834</span>  PENDING_TIMEOUT_AWAITING_CONNECT_RESPONSE = 2,</div><div class="line"><a name="l02835"></a><span class="lineno"> 2835</span>  PENDING_TIMEOUT_ESTABLISH_WITH_SERVER = 3,</div><div class="line"><a name="l02836"></a><span class="lineno"> 2836</span>  PENDING_TIMEOUT_AWAITING_SERVER_RESPONSE = 4,</div><div class="line"><a name="l02837"></a><span class="lineno"> 2837</span>  PENDING_TIMEOUT_AWAITING_PING = 5,</div><div class="line"><a name="l02838"></a><span class="lineno"> 2838</span>  PENDING_TIMEOUT_CLOSE_ACK = 6,</div><div class="line"><a name="l02839"></a><span class="lineno"> 2839</span>  PENDING_TIMEOUT_AWAITING_EXTENSION_CONNECT_RESPONSE = 7,</div><div class="line"><a name="l02840"></a><span class="lineno"> 2840</span>  PENDING_TIMEOUT_SENT_CLIENT_HANDSHAKE = 8,</div><div class="line"><a name="l02841"></a><span class="lineno"> 2841</span>  PENDING_TIMEOUT_SSL_ACCEPT = 9,</div><div class="line"><a name="l02842"></a><span class="lineno"> 2842</span>  PENDING_TIMEOUT_HTTP_CONTENT = 10,</div><div class="line"><a name="l02843"></a><span class="lineno"> 2843</span>  PENDING_TIMEOUT_AWAITING_CLIENT_HS_SEND = 11,</div><div class="line"><a name="l02844"></a><span class="lineno"> 2844</span>  PENDING_FLUSH_STORED_SEND_BEFORE_CLOSE = 12,</div><div class="line"><a name="l02845"></a><span class="lineno"> 2845</span>  PENDING_TIMEOUT_SHUTDOWN_FLUSH = 13,</div><div class="line"><a name="l02846"></a><span class="lineno"> 2846</span>  PENDING_TIMEOUT_CGI = 14,</div><div class="line"><a name="l02847"></a><span class="lineno"> 2847</span>  PENDING_TIMEOUT_HTTP_KEEPALIVE_IDLE = 15,</div><div class="line"><a name="l02848"></a><span class="lineno"> 2848</span> </div><div class="line"><a name="l02849"></a><span class="lineno"> 2849</span>  <span class="comment">/****** add new things just above ---^ ******/</span></div><div class="line"><a name="l02850"></a><span class="lineno"> 2850</span> };</div><div class="line"><a name="l02851"></a><span class="lineno"> 2851</span> </div><div class="line"><a name="l02861"></a><span class="lineno"> 2861</span> LWS_VISIBLE LWS_EXTERN <span class="keywordtype">void</span></div><div class="line"><a name="l02862"></a><span class="lineno"> 2862</span> <a class="code" href="group__timeout.html#gaced9f9237f6172fed9f730a2af51345a">lws_set_timeout</a>(<span class="keyword">struct</span> lws *wsi, <span class="keyword">enum</span> pending_timeout reason, <span class="keywordtype">int</span> secs);</div><div class="line"><a name="l02864"></a><span class="lineno"> 2864</span> </div><div class="line"><a name="l02870"></a><span class="lineno"> 2870</span> <span class="preprocessor">#if !defined(LWS_SIZEOFPTR)</span></div><div class="line"><a name="l02871"></a><span class="lineno"> 2871</span> <span class="preprocessor">#define LWS_SIZEOFPTR (sizeof (void *))</span></div><div class="line"><a name="l02872"></a><span class="lineno"> 2872</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l02873"></a><span class="lineno"> 2873</span> <span class="preprocessor">#if !defined(u_int64_t)</span></div><div class="line"><a name="l02874"></a><span class="lineno"> 2874</span> <span class="preprocessor">#define u_int64_t unsigned long long</span></div><div class="line"><a name="l02875"></a><span class="lineno"> 2875</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l02876"></a><span class="lineno"> 2876</span> </div><div class="line"><a name="l02877"></a><span class="lineno"> 2877</span> <span class="preprocessor">#if __x86_64__</span></div><div class="line"><a name="l02878"></a><span class="lineno"> 2878</span> <span class="preprocessor">#define _LWS_PAD_SIZE 16 </span><span class="comment">/* Intel recommended for best performance */</span><span class="preprocessor"></span></div><div class="line"><a name="l02879"></a><span class="lineno"> 2879</span> <span class="preprocessor">#else</span></div><div class="line"><a name="l02880"></a><span class="lineno"> 2880</span> <span class="preprocessor">#define _LWS_PAD_SIZE LWS_SIZEOFPTR </span><span class="comment">/* Size of a pointer on the target arch */</span><span class="preprocessor"></span></div><div class="line"><a name="l02881"></a><span class="lineno"> 2881</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l02882"></a><span class="lineno"> 2882</span> <span class="preprocessor">#define _LWS_PAD(n) (((n) % _LWS_PAD_SIZE) ? \</span></div><div class="line"><a name="l02883"></a><span class="lineno"> 2883</span> <span class="preprocessor"> ((n) + (_LWS_PAD_SIZE - ((n) % _LWS_PAD_SIZE))) : (n))</span></div><div class="line"><a name="l02884"></a><span class="lineno"> 2884</span> <span class="preprocessor">#define LWS_PRE _LWS_PAD(4 + 10)</span></div><div class="line"><a name="l02885"></a><span class="lineno"> 2885</span> <span class="comment">/* used prior to 1.7 and retained for backward compatibility */</span></div><div class="line"><a name="l02886"></a><span class="lineno"> 2886</span> <span class="preprocessor">#define LWS_SEND_BUFFER_PRE_PADDING LWS_PRE</span></div><div class="line"><a name="l02887"></a><span class="lineno"> 2887</span> <span class="preprocessor">#define LWS_SEND_BUFFER_POST_PADDING 0</span></div><div class="line"><a name="l02888"></a><span class="lineno"> 2888</span> </div><div class="line"><a name="l02889"></a><span class="lineno"> 2889</span> <span class="comment">/*</span></div><div class="line"><a name="l02890"></a><span class="lineno"> 2890</span> <span class="comment"> * NOTE: These public enums are part of the abi. If you want to add one,</span></div><div class="line"><a name="l02891"></a><span class="lineno"> 2891</span> <span class="comment"> * add it at where specified so existing users are unaffected.</span></div><div class="line"><a name="l02892"></a><span class="lineno"> 2892</span> <span class="comment"> */</span></div><div class="line"><a name="l02893"></a><span class="lineno"><a class="line" href="group__sending-data.html#ga98b099cf8c1c7e38ad78501f270e193d"> 2893</a></span> <span class="keyword">enum</span> <a class="code" href="group__sending-data.html#ga98b099cf8c1c7e38ad78501f270e193d">lws_write_protocol</a> {</div><div class="line"><a name="l02894"></a><span class="lineno"><a class="line" href="group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193da80e8f169fda236c56bfb795ed62903db"> 2894</a></span>  <a class="code" href="group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193da80e8f169fda236c56bfb795ed62903db">LWS_WRITE_TEXT</a> = 0,</div><div class="line"><a name="l02898"></a><span class="lineno"><a class="line" href="group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193daf6486c0dba50c44198100717721d9ab2"> 2898</a></span>  <a class="code" href="group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193daf6486c0dba50c44198100717721d9ab2">LWS_WRITE_BINARY</a> = 1,</div><div class="line"><a name="l02901"></a><span class="lineno"><a class="line" href="group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193da10047eb05b5e1c298151dc47a5b44826"> 2901</a></span>  <a class="code" href="group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193da10047eb05b5e1c298151dc47a5b44826">LWS_WRITE_CONTINUATION</a> = 2,</div><div class="line"><a name="l02904"></a><span class="lineno"><a class="line" href="group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193dabb6705e1d1327cdda5025be28f07712e"> 2904</a></span>  <a class="code" href="group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193dabb6705e1d1327cdda5025be28f07712e">LWS_WRITE_HTTP</a> = 3,</div><div class="line"><a name="l02907"></a><span class="lineno"> 2907</span>  <span class="comment">/* LWS_WRITE_CLOSE is handled by lws_close_reason() */</span></div><div class="line"><a name="l02908"></a><span class="lineno"> 2908</span>  LWS_WRITE_PING = 5,</div><div class="line"><a name="l02909"></a><span class="lineno"> 2909</span>  LWS_WRITE_PONG = 6,</div><div class="line"><a name="l02910"></a><span class="lineno"> 2910</span> </div><div class="line"><a name="l02911"></a><span class="lineno"> 2911</span>  <span class="comment">/* Same as write_http but we know this write ends the transaction */</span></div><div class="line"><a name="l02912"></a><span class="lineno"> 2912</span>  LWS_WRITE_HTTP_FINAL = 7,</div><div class="line"><a name="l02913"></a><span class="lineno"> 2913</span> </div><div class="line"><a name="l02914"></a><span class="lineno"> 2914</span>  <span class="comment">/* HTTP2 */</span></div><div class="line"><a name="l02915"></a><span class="lineno"> 2915</span> </div><div class="line"><a name="l02916"></a><span class="lineno"><a class="line" href="group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193dafe5a38e940ce56708ac814627e9c0917"> 2916</a></span>  <a class="code" href="group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193dafe5a38e940ce56708ac814627e9c0917">LWS_WRITE_HTTP_HEADERS</a> = 8,</div><div class="line"><a name="l02923"></a><span class="lineno"> 2923</span>  <span class="comment">/****** add new things just above ---^ ******/</span></div><div class="line"><a name="l02924"></a><span class="lineno"> 2924</span> </div><div class="line"><a name="l02925"></a><span class="lineno"> 2925</span>  <span class="comment">/* flags */</span></div><div class="line"><a name="l02926"></a><span class="lineno"> 2926</span> </div><div class="line"><a name="l02927"></a><span class="lineno"><a class="line" href="group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193da115440f272a5d55518adfc8099acfee3"> 2927</a></span>  <a class="code" href="group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193da115440f272a5d55518adfc8099acfee3">LWS_WRITE_NO_FIN</a> = 0x40,</div><div class="line"><a name="l02930"></a><span class="lineno"><a class="line" href="group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193da220d8e8652d9b97fb66e476e2a60ffce"> 2930</a></span>  <a class="code" href="group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193da220d8e8652d9b97fb66e476e2a60ffce">LWS_WRITE_CLIENT_IGNORE_XOR_MASK</a> = 0x80</div><div class="line"><a name="l02934"></a><span class="lineno"> 2934</span> };</div><div class="line"><a name="l02935"></a><span class="lineno"> 2935</span> </div><div class="line"><a name="l02936"></a><span class="lineno"> 2936</span> </div><div class="line"><a name="l03008"></a><span class="lineno"> 3008</span> LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l03009"></a><span class="lineno"> 3009</span> <a class="code" href="group__sending-data.html#gafd5fdd285a0e25ba7e3e1051deec1001">lws_write</a>(<span class="keyword">struct</span> lws *wsi, <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *buf, <span class="keywordtype">size_t</span> len,</div><div class="line"><a name="l03010"></a><span class="lineno"> 3010</span>  <span class="keyword">enum</span> <a class="code" href="group__sending-data.html#ga98b099cf8c1c7e38ad78501f270e193d">lws_write_protocol</a> protocol);</div><div class="line"><a name="l03011"></a><span class="lineno"> 3011</span> </div><div class="line"><a name="l03012"></a><span class="lineno"> 3012</span> <span class="comment">/* helper for case where buffer may be const */</span></div><div class="line"><a name="l03013"></a><span class="lineno"> 3013</span> <span class="preprocessor">#define lws_write_http(wsi, buf, len) \</span></div><div class="line"><a name="l03014"></a><span class="lineno"> 3014</span> <span class="preprocessor"> lws_write(wsi, (unsigned char *)(buf), len, LWS_WRITE_HTTP)</span></div><div class="line"><a name="l03015"></a><span class="lineno"> 3015</span> </div><div class="line"><a name="l03017"></a><span class="lineno"> 3017</span> </div><div class="line"><a name="l03036"></a><span class="lineno"> 3036</span> </div><div class="line"><a name="l03049"></a><span class="lineno"> 3049</span> LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l03050"></a><span class="lineno"> 3050</span> <a class="code" href="group__callback-when-writeable.html#ga941caaa468bc507b1cae52275f58800d">lws_callback_on_writable</a>(<span class="keyword">struct</span> lws *wsi);</div><div class="line"><a name="l03051"></a><span class="lineno"> 3051</span> </div><div class="line"><a name="l03065"></a><span class="lineno"> 3065</span> LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l03066"></a><span class="lineno"> 3066</span> <a class="code" href="group__callback-when-writeable.html#gabbe4655c7eeb3eb1671b2323ec6b3107">lws_callback_on_writable_all_protocol</a>(<span class="keyword">const</span> <span class="keyword">struct</span> lws_context *context,</div><div class="line"><a name="l03067"></a><span class="lineno"> 3067</span>  <span class="keyword">const</span> <span class="keyword">struct</span> <a class="code" href="structlws__protocols.html">lws_protocols</a> *protocol);</div><div class="line"><a name="l03068"></a><span class="lineno"> 3068</span> </div><div class="line"><a name="l03082"></a><span class="lineno"> 3082</span> LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l03083"></a><span class="lineno"> 3083</span> <a class="code" href="group__callback-when-writeable.html#ga8570860e191b62db264f2bac67354ea8">lws_callback_on_writable_all_protocol_vhost</a>(<span class="keyword">const</span> <span class="keyword">struct</span> lws_vhost *vhost,</div><div class="line"><a name="l03084"></a><span class="lineno"> 3084</span>  <span class="keyword">const</span> <span class="keyword">struct</span> <a class="code" href="structlws__protocols.html">lws_protocols</a> *protocol);</div><div class="line"><a name="l03085"></a><span class="lineno"> 3085</span> </div><div class="line"><a name="l03098"></a><span class="lineno"> 3098</span> LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l03099"></a><span class="lineno"> 3099</span> <a class="code" href="group__callback-when-writeable.html#gacf04bbe089f47c971c6408c5efe2ac70">lws_callback_all_protocol</a>(<span class="keyword">struct</span> lws_context *context,</div><div class="line"><a name="l03100"></a><span class="lineno"> 3100</span>  <span class="keyword">const</span> <span class="keyword">struct</span> <a class="code" href="structlws__protocols.html">lws_protocols</a> *protocol, <span class="keywordtype">int</span> reason);</div><div class="line"><a name="l03101"></a><span class="lineno"> 3101</span> </div><div class="line"><a name="l03114"></a><span class="lineno"> 3114</span> LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l03115"></a><span class="lineno"> 3115</span> <a class="code" href="group__callback-when-writeable.html#ga13c984d8c5a44a745fd02bc2fba36053">lws_callback_all_protocol_vhost</a>(<span class="keyword">struct</span> lws_vhost *vh,</div><div class="line"><a name="l03116"></a><span class="lineno"> 3116</span>  <span class="keyword">const</span> <span class="keyword">struct</span> <a class="code" href="structlws__protocols.html">lws_protocols</a> *protocol, <span class="keywordtype">int</span> reason);</div><div class="line"><a name="l03117"></a><span class="lineno"> 3117</span> </div><div class="line"><a name="l03131"></a><span class="lineno"> 3131</span> LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l03132"></a><span class="lineno"> 3132</span> <a class="code" href="group__callback-when-writeable.html#ga60939cf0c073d933fde3d17f3591caf5">lws_callback_vhost_protocols</a>(<span class="keyword">struct</span> lws *wsi, <span class="keywordtype">int</span> reason, <span class="keywordtype">void</span> *in, <span class="keywordtype">int</span> len);</div><div class="line"><a name="l03133"></a><span class="lineno"> 3133</span> </div><div class="line"><a name="l03141"></a><span class="lineno"> 3141</span> LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l03142"></a><span class="lineno"> 3142</span> <a class="code" href="group__callback-when-writeable.html#gaa709e02a10558753c851e58f1e2c16ba">lws_get_socket_fd</a>(<span class="keyword">struct</span> lws *wsi);</div><div class="line"><a name="l03143"></a><span class="lineno"> 3143</span> </div><div class="line"><a name="l03165"></a><span class="lineno"> 3165</span> LWS_VISIBLE LWS_EXTERN <span class="keywordtype">size_t</span></div><div class="line"><a name="l03166"></a><span class="lineno"> 3166</span> <a class="code" href="group__callback-when-writeable.html#gac4643fe16b0940ae5b68b4ee6195cbde">lws_get_peer_write_allowance</a>(<span class="keyword">struct</span> lws *wsi);</div><div class="line"><a name="l03168"></a><span class="lineno"> 3168</span> </div><div class="line"><a name="l03179"></a><span class="lineno"> 3179</span> LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l03180"></a><span class="lineno"> 3180</span> <a class="code" href="libwebsockets_8h.html#adf4abd01e8c43f07c6e498ce13590c3e">lws_rx_flow_control</a>(<span class="keyword">struct</span> lws *wsi, <span class="keywordtype">int</span> enable);</div><div class="line"><a name="l03181"></a><span class="lineno"> 3181</span> </div><div class="line"><a name="l03191"></a><span class="lineno"> 3191</span> LWS_VISIBLE LWS_EXTERN <span class="keywordtype">void</span></div><div class="line"><a name="l03192"></a><span class="lineno"> 3192</span> <a class="code" href="libwebsockets_8h.html#a5e627dbf1db48170ef486edbaf268672">lws_rx_flow_allow_all_protocol</a>(<span class="keyword">const</span> <span class="keyword">struct</span> lws_context *context,</div><div class="line"><a name="l03193"></a><span class="lineno"> 3193</span>  <span class="keyword">const</span> <span class="keyword">struct</span> <a class="code" href="structlws__protocols.html">lws_protocols</a> *protocol);</div><div class="line"><a name="l03194"></a><span class="lineno"> 3194</span> </div><div class="line"><a name="l03211"></a><span class="lineno"> 3211</span> LWS_VISIBLE LWS_EXTERN <span class="keywordtype">size_t</span></div><div class="line"><a name="l03212"></a><span class="lineno"> 3212</span> <a class="code" href="libwebsockets_8h.html#a72fe65e83b8bb03f904a1a256c673536">lws_remaining_packet_payload</a>(<span class="keyword">struct</span> lws *wsi);</div><div class="line"><a name="l03213"></a><span class="lineno"> 3213</span> </div><div class="line"><a name="l03214"></a><span class="lineno"> 3214</span> </div><div class="line"><a name="l03223"></a><span class="lineno"> 3223</span> </div><div class="line"><a name="l03236"></a><span class="lineno"> 3236</span> LWS_VISIBLE LWS_EXTERN <span class="keyword">struct </span>lws *</div><div class="line"><a name="l03237"></a><span class="lineno"> 3237</span> <a class="code" href="group__sock-adopt.html#gabe71b7462afb21c767bdc67334f305af">lws_adopt_socket</a>(<span class="keyword">struct</span> lws_context *context, lws_sockfd_type accept_fd);</div><div class="line"><a name="l03260"></a><span class="lineno"> 3260</span> LWS_VISIBLE LWS_EXTERN <span class="keyword">struct </span>lws *</div><div class="line"><a name="l03261"></a><span class="lineno"> 3261</span> <a class="code" href="group__sock-adopt.html#gab2d045df0f81afe00891aaed312d552b">lws_adopt_socket_readbuf</a>(<span class="keyword">struct</span> lws_context *context, lws_sockfd_type accept_fd,</div><div class="line"><a name="l03262"></a><span class="lineno"> 3262</span>  <span class="keyword">const</span> <span class="keywordtype">char</span> *readbuf, <span class="keywordtype">size_t</span> len);</div><div class="line"><a name="l03264"></a><span class="lineno"> 3264</span> </div><div class="line"><a name="l03270"></a><span class="lineno"> 3270</span> </div><div class="line"><a name="l03281"></a><span class="lineno"> 3281</span> LWS_VISIBLE LWS_EXTERN <span class="keyword">const</span> <span class="keywordtype">char</span> * LWS_WARN_UNUSED_RESULT</div><div class="line"><a name="l03282"></a><span class="lineno"> 3282</span> <a class="code" href="group__net.html#gad0df22db2be9fc65a667a1e83f9a92a4">lws_canonical_hostname</a>(<span class="keyword">struct</span> lws_context *context);</div><div class="line"><a name="l03283"></a><span class="lineno"> 3283</span> </div><div class="line"><a name="l03298"></a><span class="lineno"> 3298</span> LWS_VISIBLE LWS_EXTERN <span class="keywordtype">void</span></div><div class="line"><a name="l03299"></a><span class="lineno"> 3299</span> <a class="code" href="group__net.html#ga092e5f473b3347f03ffeef8a950080f3">lws_get_peer_addresses</a>(<span class="keyword">struct</span> lws *wsi, lws_sockfd_type fd, <span class="keywordtype">char</span> *name,</div><div class="line"><a name="l03300"></a><span class="lineno"> 3300</span>  <span class="keywordtype">int</span> name_len, <span class="keywordtype">char</span> *rip, <span class="keywordtype">int</span> rip_len);</div><div class="line"><a name="l03301"></a><span class="lineno"> 3301</span> </div><div class="line"><a name="l03312"></a><span class="lineno"> 3312</span> LWS_VISIBLE LWS_EXTERN <span class="keyword">const</span> <span class="keywordtype">char</span> *</div><div class="line"><a name="l03313"></a><span class="lineno"> 3313</span> <a class="code" href="group__net.html#gad01014fed09759741b6d23afccfdaacc">lws_get_peer_simple</a>(<span class="keyword">struct</span> lws *wsi, <span class="keywordtype">char</span> *name, <span class="keywordtype">int</span> namelen);</div><div class="line"><a name="l03314"></a><span class="lineno"> 3314</span> </div><div class="line"><a name="l03326"></a><span class="lineno"> 3326</span> LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l03327"></a><span class="lineno"> 3327</span> <a class="code" href="group__net.html#ga869d8bdffb0f2a7ce08e3ce10d6be3d8">lws_interface_to_sa</a>(<span class="keywordtype">int</span> ipv6, <span class="keyword">const</span> <span class="keywordtype">char</span> *ifname, <span class="keyword">struct</span> sockaddr_in *addr,</div><div class="line"><a name="l03328"></a><span class="lineno"> 3328</span>  <span class="keywordtype">size_t</span> addrlen);</div><div class="line"><a name="l03330"></a><span class="lineno"> 3330</span> </div><div class="line"><a name="l03336"></a><span class="lineno"> 3336</span> </div><div class="line"><a name="l03349"></a><span class="lineno"> 3349</span> LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l03350"></a><span class="lineno"> 3350</span> <a class="code" href="group__misc.html#ga58f906c6be0ca80efd813f694569dd4a">lws_get_random</a>(<span class="keyword">struct</span> lws_context *context, <span class="keywordtype">void</span> *buf, <span class="keywordtype">int</span> len);</div><div class="line"><a name="l03358"></a><span class="lineno"> 3358</span> LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span> LWS_WARN_UNUSED_RESULT</div><div class="line"><a name="l03359"></a><span class="lineno"> 3359</span> <a class="code" href="group__misc.html#gace5171b1dbbc03ec89a98f8afdb5c9af">lws_daemonize</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> *_lock_path);</div><div class="line"><a name="l03365"></a><span class="lineno"> 3365</span> LWS_VISIBLE LWS_EXTERN <span class="keyword">const</span> <span class="keywordtype">char</span> * LWS_WARN_UNUSED_RESULT</div><div class="line"><a name="l03366"></a><span class="lineno"> 3366</span> <a class="code" href="group__misc.html#gac6abfc0b2bd5b2f09281a4432bb2f5f0">lws_get_library_version</a>(<span class="keywordtype">void</span>);</div><div class="line"><a name="l03367"></a><span class="lineno"> 3367</span> </div><div class="line"><a name="l03374"></a><span class="lineno"> 3374</span> LWS_VISIBLE LWS_EXTERN <span class="keywordtype">void</span> *</div><div class="line"><a name="l03375"></a><span class="lineno"> 3375</span> <a class="code" href="group__misc.html#gaa194584fff9698f3b280658f770ccd0f">lws_wsi_user</a>(<span class="keyword">struct</span> lws *wsi);</div><div class="line"><a name="l03376"></a><span class="lineno"> 3376</span> </div><div class="line"><a name="l03388"></a><span class="lineno"> 3388</span> LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span> LWS_WARN_UNUSED_RESULT</div><div class="line"><a name="l03389"></a><span class="lineno"> 3389</span> <a class="code" href="group__misc.html#ga1ec0d9faac5d3a5824d765c287c043aa">lws_parse_uri</a>(<span class="keywordtype">char</span> *p, <span class="keyword">const</span> <span class="keywordtype">char</span> **prot, <span class="keyword">const</span> <span class="keywordtype">char</span> **ads, <span class="keywordtype">int</span> *port,</div><div class="line"><a name="l03390"></a><span class="lineno"> 3390</span>  <span class="keyword">const</span> <span class="keywordtype">char</span> **path);</div><div class="line"><a name="l03391"></a><span class="lineno"> 3391</span> </div><div class="line"><a name="l03395"></a><span class="lineno"> 3395</span> LWS_VISIBLE LWS_EXTERN <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span></div><div class="line"><a name="l03396"></a><span class="lineno"> 3396</span> <a class="code" href="group__misc.html#ga33bf2635033710b25f931b57ed663e1e">lws_now_secs</a>(<span class="keywordtype">void</span>);</div><div class="line"><a name="l03397"></a><span class="lineno"> 3397</span> </div><div class="line"><a name="l03407"></a><span class="lineno"> 3407</span> LWS_VISIBLE LWS_EXTERN <span class="keyword">struct </span>lws_context * LWS_WARN_UNUSED_RESULT</div><div class="line"><a name="l03408"></a><span class="lineno"> 3408</span> <a class="code" href="group__misc.html#ga0af4f7d2dd375aeedcfa7eb0e1101c4b">lws_get_context</a>(<span class="keyword">const</span> <span class="keyword">struct</span> lws *wsi);</div><div class="line"><a name="l03409"></a><span class="lineno"> 3409</span> </div><div class="line"><a name="l03419"></a><span class="lineno"> 3419</span> LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span> LWS_WARN_UNUSED_RESULT</div><div class="line"><a name="l03420"></a><span class="lineno"> 3420</span> <a class="code" href="group__misc.html#ga629f48268fd1856b54b11172991b97d9">lws_get_count_threads</a>(<span class="keyword">struct</span> lws_context *context);</div><div class="line"><a name="l03421"></a><span class="lineno"> 3421</span> </div><div class="line"><a name="l03429"></a><span class="lineno"> 3429</span> LWS_VISIBLE LWS_EXTERN <span class="keyword">struct </span>lws * LWS_WARN_UNUSED_RESULT</div><div class="line"><a name="l03430"></a><span class="lineno"> 3430</span> <a class="code" href="group__misc.html#ga8930fe36a3f3eefe4a6a4fd499d8e899">lws_get_parent</a>(<span class="keyword">const</span> <span class="keyword">struct</span> lws *wsi);</div><div class="line"><a name="l03431"></a><span class="lineno"> 3431</span> </div><div class="line"><a name="l03438"></a><span class="lineno"> 3438</span> LWS_VISIBLE LWS_EXTERN <span class="keyword">struct </span>lws * LWS_WARN_UNUSED_RESULT</div><div class="line"><a name="l03439"></a><span class="lineno"> 3439</span> <a class="code" href="group__misc.html#gacae4d7b6a8d22e4c2d82ff8b12c1e234">lws_get_child</a>(<span class="keyword">const</span> <span class="keyword">struct</span> lws *wsi);</div><div class="line"><a name="l03440"></a><span class="lineno"> 3440</span> </div><div class="line"><a name="l03441"></a><span class="lineno"> 3441</span> </div><div class="line"><a name="l03442"></a><span class="lineno"> 3442</span> <span class="comment">/*</span></div><div class="line"><a name="l03443"></a><span class="lineno"> 3443</span> <span class="comment"> * \deprecated DEPRECATED Note: this is not normally needed as a user api.</span></div><div class="line"><a name="l03444"></a><span class="lineno"> 3444</span> <span class="comment"> * It's provided in case it is</span></div><div class="line"><a name="l03445"></a><span class="lineno"> 3445</span> <span class="comment"> * useful when integrating with other app poll loop service code.</span></div><div class="line"><a name="l03446"></a><span class="lineno"> 3446</span> <span class="comment"> */</span></div><div class="line"><a name="l03447"></a><span class="lineno"> 3447</span> LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l03448"></a><span class="lineno"> 3448</span> lws_read(<span class="keyword">struct</span> lws *wsi, <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *buf, <span class="keywordtype">size_t</span> len);</div><div class="line"><a name="l03449"></a><span class="lineno"> 3449</span> </div><div class="line"><a name="l03457"></a><span class="lineno"> 3457</span> LWS_VISIBLE LWS_EXTERN <span class="keywordtype">void</span></div><div class="line"><a name="l03458"></a><span class="lineno"> 3458</span> <a class="code" href="group__misc.html#gab321ed812f46f6dc7ef9e3ca6f00cf1b">lws_set_allocator</a>(<span class="keywordtype">void</span> *(*realloc)(<span class="keywordtype">void</span> *ptr, <span class="keywordtype">size_t</span> size));</div><div class="line"><a name="l03460"></a><span class="lineno"> 3460</span> </div><div class="line"><a name="l03466"></a><span class="lineno"> 3466</span> </div><div class="line"><a name="l03473"></a><span class="lineno"> 3473</span> LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span> LWS_WARN_UNUSED_RESULT</div><div class="line"><a name="l03474"></a><span class="lineno"> 3474</span> <a class="code" href="group__wsstatus.html#ga2bb3655329b4651cd06f79ee3a764421">lws_send_pipe_choked</a>(<span class="keyword">struct</span> lws *wsi);</div><div class="line"><a name="l03475"></a><span class="lineno"> 3475</span> </div><div class="line"><a name="l03480"></a><span class="lineno"> 3480</span> LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l03481"></a><span class="lineno"> 3481</span> <a class="code" href="group__wsstatus.html#ga08e9ee165fca503fd9427d55cfecac37">lws_is_final_fragment</a>(<span class="keyword">struct</span> lws *wsi);</div><div class="line"><a name="l03482"></a><span class="lineno"> 3482</span> </div><div class="line"><a name="l03487"></a><span class="lineno"> 3487</span> LWS_VISIBLE LWS_EXTERN <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span></div><div class="line"><a name="l03488"></a><span class="lineno"> 3488</span> <a class="code" href="group__wsstatus.html#ga3df5045656dfb6b0e63a38de2dca79d2">lws_get_reserved_bits</a>(<span class="keyword">struct</span> lws *wsi);</div><div class="line"><a name="l03489"></a><span class="lineno"> 3489</span> </div><div class="line"><a name="l03506"></a><span class="lineno"> 3506</span> LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span> LWS_WARN_UNUSED_RESULT</div><div class="line"><a name="l03507"></a><span class="lineno"> 3507</span> <a class="code" href="group__wsstatus.html#gaeca4afc94b1f026034f99cbba37e2f85">lws_partial_buffered</a>(<span class="keyword">struct</span> lws *wsi);</div><div class="line"><a name="l03508"></a><span class="lineno"> 3508</span> </div><div class="line"><a name="l03518"></a><span class="lineno"> 3518</span> LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span> LWS_WARN_UNUSED_RESULT</div><div class="line"><a name="l03519"></a><span class="lineno"> 3519</span> <a class="code" href="group__wsstatus.html#gaccd9c59336efad8af0554f79cc5966fd">lws_frame_is_binary</a>(<span class="keyword">struct</span> lws *wsi);</div><div class="line"><a name="l03520"></a><span class="lineno"> 3520</span> </div><div class="line"><a name="l03529"></a><span class="lineno"> 3529</span> LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l03530"></a><span class="lineno"> 3530</span> <a class="code" href="group__wsstatus.html#ga26a140623d202dd2bf2004deb6994baa">lws_is_ssl</a>(<span class="keyword">struct</span> lws *wsi);</div><div class="line"><a name="l03535"></a><span class="lineno"> 3535</span> LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l03536"></a><span class="lineno"> 3536</span> <a class="code" href="group__wsstatus.html#ga4ad226d5e01024b4046f4a5a37199aa1">lws_is_cgi</a>(<span class="keyword">struct</span> lws *wsi);</div><div class="line"><a name="l03538"></a><span class="lineno"> 3538</span> </div><div class="line"><a name="l03539"></a><span class="lineno"> 3539</span> </div><div class="line"><a name="l03545"></a><span class="lineno"> 3545</span> <span class="preprocessor">#ifdef LWS_SHA1_USE_OPENSSL_NAME</span></div><div class="line"><a name="l03547"></a><span class="lineno"> 3547</span> <span class="preprocessor">#define lws_SHA1 SHA1</span></div><div class="line"><a name="l03548"></a><span class="lineno"> 3548</span> <span class="preprocessor">#else</span></div><div class="line"><a name="l03549"></a><span class="lineno"> 3549</span> </div><div class="line"><a name="l03558"></a><span class="lineno"> 3558</span> LWS_VISIBLE LWS_EXTERN <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *</div><div class="line"><a name="l03559"></a><span class="lineno"> 3559</span> <a class="code" href="group__sha.html#ga7b09ab74646266f0b555103b3bb8dfe5">lws_SHA1</a>(<span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *d, <span class="keywordtype">size_t</span> n, <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *md);</div><div class="line"><a name="l03560"></a><span class="lineno"> 3560</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l03561"></a><span class="lineno"> 3561</span> </div><div class="line"><a name="l03571"></a><span class="lineno"> 3571</span> LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l03572"></a><span class="lineno"> 3572</span> <a class="code" href="group__sha.html#gaf39765e4a3b413efb65e4698b2ec3575">lws_b64_encode_string</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> *in, <span class="keywordtype">int</span> in_len, <span class="keywordtype">char</span> *out, <span class="keywordtype">int</span> out_size);</div><div class="line"><a name="l03582"></a><span class="lineno"> 3582</span> LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l03583"></a><span class="lineno"> 3583</span> <a class="code" href="group__sha.html#ga66316e6a5a0644a09d5a10e919dfdd8d">lws_b64_decode_string</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> *in, <span class="keywordtype">char</span> *out, <span class="keywordtype">int</span> out_size);</div><div class="line"><a name="l03585"></a><span class="lineno"> 3585</span> </div><div class="line"><a name="l03586"></a><span class="lineno"> 3586</span> </div><div class="line"><a name="l03596"></a><span class="lineno"> 3596</span> <span class="preprocessor">#ifdef LWS_WITH_CGI</span></div><div class="line"><a name="l03597"></a><span class="lineno"> 3597</span> <span class="keyword">enum</span> lws_enum_stdinouterr {</div><div class="line"><a name="l03598"></a><span class="lineno"> 3598</span>  LWS_STDIN = 0,</div><div class="line"><a name="l03599"></a><span class="lineno"> 3599</span>  LWS_STDOUT = 1,</div><div class="line"><a name="l03600"></a><span class="lineno"> 3600</span>  LWS_STDERR = 2,</div><div class="line"><a name="l03601"></a><span class="lineno"> 3601</span> };</div><div class="line"><a name="l03602"></a><span class="lineno"> 3602</span> </div><div class="line"><a name="l03603"></a><span class="lineno"> 3603</span> <span class="keyword">enum</span> lws_cgi_hdr_state {</div><div class="line"><a name="l03604"></a><span class="lineno"> 3604</span>  LCHS_HEADER,</div><div class="line"><a name="l03605"></a><span class="lineno"> 3605</span>  LCHS_CR1,</div><div class="line"><a name="l03606"></a><span class="lineno"> 3606</span>  LCHS_LF1,</div><div class="line"><a name="l03607"></a><span class="lineno"> 3607</span>  LCHS_CR2,</div><div class="line"><a name="l03608"></a><span class="lineno"> 3608</span>  LCHS_LF2,</div><div class="line"><a name="l03609"></a><span class="lineno"> 3609</span>  LHCS_PAYLOAD,</div><div class="line"><a name="l03610"></a><span class="lineno"> 3610</span>  LCHS_SINGLE_0A,</div><div class="line"><a name="l03611"></a><span class="lineno"> 3611</span> };</div><div class="line"><a name="l03612"></a><span class="lineno"> 3612</span> </div><div class="line"><a name="l03613"></a><span class="lineno"><a class="line" href="structlws__cgi__args.html"> 3613</a></span> <span class="keyword">struct </span><a class="code" href="structlws__cgi__args.html">lws_cgi_args</a> {</div><div class="line"><a name="l03614"></a><span class="lineno"><a class="line" href="structlws__cgi__args.html#a4ccc1058e7e914a26eef31ab2ad46aa1"> 3614</a></span>  <span class="keyword">struct </span>lws **<a class="code" href="structlws__cgi__args.html#a4ccc1058e7e914a26eef31ab2ad46aa1">stdwsi</a>; </div><div class="line"><a name="l03615"></a><span class="lineno"><a class="line" href="structlws__cgi__args.html#adeee220b29aeacc34632c38e50f0f5a5"> 3615</a></span>  <span class="keyword">enum</span> lws_enum_stdinouterr ch; </div><div class="line"><a name="l03616"></a><span class="lineno"><a class="line" href="structlws__cgi__args.html#a8ac842084688c02f3f94694ef700d8f7"> 3616</a></span>  <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *<a class="code" href="structlws__cgi__args.html#a8ac842084688c02f3f94694ef700d8f7">data</a>; </div><div class="line"><a name="l03617"></a><span class="lineno"><a class="line" href="structlws__cgi__args.html#a741c11b9aa05997ec45a3400d7fb7739"> 3617</a></span>  <span class="keyword">enum</span> lws_cgi_hdr_state hdr_state; </div><div class="line"><a name="l03618"></a><span class="lineno"><a class="line" href="structlws__cgi__args.html#a36e5c256433c187bd0eaa9c1ca667f1d"> 3618</a></span>  <span class="keywordtype">int</span> <a class="code" href="structlws__cgi__args.html#a36e5c256433c187bd0eaa9c1ca667f1d">len</a>; </div><div class="line"><a name="l03619"></a><span class="lineno"> 3619</span> };</div><div class="line"><a name="l03620"></a><span class="lineno"> 3620</span> </div><div class="line"><a name="l03621"></a><span class="lineno"> 3621</span> </div><div class="line"><a name="l03631"></a><span class="lineno"> 3631</span> LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l03632"></a><span class="lineno"> 3632</span> <a class="code" href="libwebsockets_8h.html#af52923473c59e643a974d65e12290831">lws_cgi</a>(<span class="keyword">struct</span> lws *wsi, <span class="keyword">const</span> <span class="keywordtype">char</span> * <span class="keyword">const</span> *exec_array,</div><div class="line"><a name="l03633"></a><span class="lineno"> 3633</span>  <span class="keywordtype">int</span> script_uri_path_len, <span class="keywordtype">int</span> timeout_secs,</div><div class="line"><a name="l03634"></a><span class="lineno"> 3634</span>  <span class="keyword">const</span> <span class="keyword">struct</span> <a class="code" href="structlws__protocol__vhost__options.html">lws_protocol_vhost_options</a> *mp_cgienv);</div><div class="line"><a name="l03635"></a><span class="lineno"> 3635</span> </div><div class="line"><a name="l03641"></a><span class="lineno"> 3641</span> LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l03642"></a><span class="lineno"> 3642</span> <a class="code" href="libwebsockets_8h.html#a5326d3402af8429a166dd991dc65c4a2">lws_cgi_write_split_stdout_headers</a>(<span class="keyword">struct</span> lws *wsi);</div><div class="line"><a name="l03643"></a><span class="lineno"> 3643</span> </div><div class="line"><a name="l03649"></a><span class="lineno"> 3649</span> LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l03650"></a><span class="lineno"> 3650</span> <a class="code" href="libwebsockets_8h.html#a27bb0b3cdcd0af839c928c253b521ff4">lws_cgi_kill</a>(<span class="keyword">struct</span> lws *wsi);</div><div class="line"><a name="l03651"></a><span class="lineno"> 3651</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l03652"></a><span class="lineno"> 3652</span> </div><div class="line"><a name="l03654"></a><span class="lineno"> 3654</span> </div><div class="line"><a name="l03671"></a><span class="lineno"> 3671</span> </div><div class="line"><a name="l03677"></a><span class="lineno"><a class="line" href="structlws__plat__file__ops.html"> 3677</a></span> <span class="keyword">struct </span><a class="code" href="structlws__plat__file__ops.html">lws_plat_file_ops</a> {</div><div class="line"><a name="l03678"></a><span class="lineno"><a class="line" href="structlws__plat__file__ops.html#ad37a97abc68d0af967cef874f4d8df32"> 3678</a></span>  lws_filefd_type (*open)(<span class="keyword">struct </span>lws *wsi, <span class="keyword">const</span> <span class="keywordtype">char</span> *filename,</div><div class="line"><a name="l03679"></a><span class="lineno"> 3679</span>  <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> *filelen, <span class="keywordtype">int</span> flags);</div><div class="line"><a name="l03683"></a><span class="lineno"><a class="line" href="structlws__plat__file__ops.html#a034ec96f2fbaf52b4aa3e82d20795f7b"> 3683</a></span>  int (*close)(<span class="keyword">struct </span>lws *wsi, lws_filefd_type fd);</div><div class="line"><a name="l03685"></a><span class="lineno"><a class="line" href="structlws__plat__file__ops.html#abfcda19b003dcc13c61ff9e2bb4ff869"> 3685</a></span>  <span class="keywordtype">unsigned</span> long (*seek_cur)(<span class="keyword">struct </span>lws *wsi, lws_filefd_type fd,</div><div class="line"><a name="l03686"></a><span class="lineno"> 3686</span>  <span class="keywordtype">long</span> offset_from_cur_pos);</div><div class="line"><a name="l03688"></a><span class="lineno"><a class="line" href="structlws__plat__file__ops.html#a01f483807a9862736b17ba9ed5110c40"> 3688</a></span>  int (*read)(<span class="keyword">struct </span>lws *wsi, lws_filefd_type fd, <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> *amount,</div><div class="line"><a name="l03689"></a><span class="lineno"> 3689</span>  <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *buf, <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> len);</div><div class="line"><a name="l03691"></a><span class="lineno"><a class="line" href="structlws__plat__file__ops.html#a1fae8330ee94649a3551e31a30809793"> 3691</a></span>  int (*write)(<span class="keyword">struct </span>lws *wsi, lws_filefd_type fd, <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> *amount,</div><div class="line"><a name="l03692"></a><span class="lineno"> 3692</span>  <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *buf, <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> len);</div><div class="line"><a name="l03695"></a><span class="lineno"> 3695</span>  <span class="comment">/* Add new things just above here ---^</span></div><div class="line"><a name="l03696"></a><span class="lineno"> 3696</span> <span class="comment"> * This is part of the ABI, don't needlessly break compatibility */</span></div><div class="line"><a name="l03697"></a><span class="lineno"> 3697</span> };</div><div class="line"><a name="l03698"></a><span class="lineno"> 3698</span> </div><div class="line"><a name="l03704"></a><span class="lineno"> 3704</span> LWS_VISIBLE LWS_EXTERN <span class="keyword">struct </span><a class="code" href="structlws__plat__file__ops.html">lws_plat_file_ops</a> * LWS_WARN_UNUSED_RESULT</div><div class="line"><a name="l03705"></a><span class="lineno"> 3705</span> <a class="code" href="group__fops.html#gac08aef64c4c34647ed699b24759b6b0e">lws_get_fops</a>(<span class="keyword">struct</span> lws_context *context);</div><div class="line"><a name="l03706"></a><span class="lineno"> 3706</span> </div><div class="line"><a name="l03715"></a><span class="lineno"> 3715</span> <span class="keyword">static</span> LWS_INLINE lws_filefd_type LWS_WARN_UNUSED_RESULT</div><div class="line"><a name="l03716"></a><span class="lineno"> 3716</span> lws_plat_file_open(<span class="keyword">struct</span> lws *wsi, <span class="keyword">const</span> <span class="keywordtype">char</span> *filename,</div><div class="line"><a name="l03717"></a><span class="lineno"> 3717</span>  <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> *filelen, <span class="keywordtype">int</span> flags)</div><div class="line"><a name="l03718"></a><span class="lineno"> 3718</span> {</div><div class="line"><a name="l03719"></a><span class="lineno"> 3719</span>  <span class="keywordflow">return</span> <a class="code" href="group__fops.html#gac08aef64c4c34647ed699b24759b6b0e">lws_get_fops</a>(<a class="code" href="group__misc.html#ga0af4f7d2dd375aeedcfa7eb0e1101c4b">lws_get_context</a>(wsi))-><a class="code" href="structlws__plat__file__ops.html#ad37a97abc68d0af967cef874f4d8df32">open</a>(wsi, filename,</div><div class="line"><a name="l03720"></a><span class="lineno"> 3720</span>  filelen, flags);</div><div class="line"><a name="l03721"></a><span class="lineno"> 3721</span> }</div><div class="line"><a name="l03722"></a><span class="lineno"> 3722</span> </div><div class="line"><a name="l03729"></a><span class="lineno"> 3729</span> <span class="keyword">static</span> LWS_INLINE <span class="keywordtype">int</span></div><div class="line"><a name="l03730"></a><span class="lineno"> 3730</span> lws_plat_file_close(<span class="keyword">struct</span> lws *wsi, lws_filefd_type fd)</div><div class="line"><a name="l03731"></a><span class="lineno"> 3731</span> {</div><div class="line"><a name="l03732"></a><span class="lineno"> 3732</span>  <span class="keywordflow">return</span> <a class="code" href="group__fops.html#gac08aef64c4c34647ed699b24759b6b0e">lws_get_fops</a>(<a class="code" href="group__misc.html#ga0af4f7d2dd375aeedcfa7eb0e1101c4b">lws_get_context</a>(wsi))-><a class="code" href="structlws__plat__file__ops.html#a034ec96f2fbaf52b4aa3e82d20795f7b">close</a>(wsi, fd);</div><div class="line"><a name="l03733"></a><span class="lineno"> 3733</span> }</div><div class="line"><a name="l03734"></a><span class="lineno"> 3734</span> </div><div class="line"><a name="l03742"></a><span class="lineno"> 3742</span> <span class="keyword">static</span> LWS_INLINE <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span></div><div class="line"><a name="l03743"></a><span class="lineno"> 3743</span> lws_plat_file_seek_cur(<span class="keyword">struct</span> lws *wsi, lws_filefd_type fd, <span class="keywordtype">long</span> offset)</div><div class="line"><a name="l03744"></a><span class="lineno"> 3744</span> {</div><div class="line"><a name="l03745"></a><span class="lineno"> 3745</span>  <span class="keywordflow">return</span> <a class="code" href="group__fops.html#gac08aef64c4c34647ed699b24759b6b0e">lws_get_fops</a>(<a class="code" href="group__misc.html#ga0af4f7d2dd375aeedcfa7eb0e1101c4b">lws_get_context</a>(wsi))-><a class="code" href="structlws__plat__file__ops.html#abfcda19b003dcc13c61ff9e2bb4ff869">seek_cur</a>(wsi, fd, offset);</div><div class="line"><a name="l03746"></a><span class="lineno"> 3746</span> }</div><div class="line"><a name="l03756"></a><span class="lineno"> 3756</span> <span class="keyword">static</span> LWS_INLINE <span class="keywordtype">int</span> LWS_WARN_UNUSED_RESULT</div><div class="line"><a name="l03757"></a><span class="lineno"> 3757</span> lws_plat_file_read(<span class="keyword">struct</span> lws *wsi, lws_filefd_type fd, <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> *amount,</div><div class="line"><a name="l03758"></a><span class="lineno"> 3758</span>  <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *buf, <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> len)</div><div class="line"><a name="l03759"></a><span class="lineno"> 3759</span> {</div><div class="line"><a name="l03760"></a><span class="lineno"> 3760</span>  <span class="keywordflow">return</span> <a class="code" href="group__fops.html#gac08aef64c4c34647ed699b24759b6b0e">lws_get_fops</a>(<a class="code" href="group__misc.html#ga0af4f7d2dd375aeedcfa7eb0e1101c4b">lws_get_context</a>(wsi))-><a class="code" href="structlws__plat__file__ops.html#a01f483807a9862736b17ba9ed5110c40">read</a>(wsi, fd, amount, buf,</div><div class="line"><a name="l03761"></a><span class="lineno"> 3761</span>  len);</div><div class="line"><a name="l03762"></a><span class="lineno"> 3762</span> }</div><div class="line"><a name="l03772"></a><span class="lineno"> 3772</span> <span class="keyword">static</span> LWS_INLINE <span class="keywordtype">int</span> LWS_WARN_UNUSED_RESULT</div><div class="line"><a name="l03773"></a><span class="lineno"> 3773</span> lws_plat_file_write(<span class="keyword">struct</span> lws *wsi, lws_filefd_type fd, <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> *amount,</div><div class="line"><a name="l03774"></a><span class="lineno"> 3774</span>  <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *buf, <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> len)</div><div class="line"><a name="l03775"></a><span class="lineno"> 3775</span> {</div><div class="line"><a name="l03776"></a><span class="lineno"> 3776</span>  <span class="keywordflow">return</span> <a class="code" href="group__fops.html#gac08aef64c4c34647ed699b24759b6b0e">lws_get_fops</a>(<a class="code" href="group__misc.html#ga0af4f7d2dd375aeedcfa7eb0e1101c4b">lws_get_context</a>(wsi))-><a class="code" href="structlws__plat__file__ops.html#a1fae8330ee94649a3551e31a30809793">write</a>(wsi, fd, amount, buf,</div><div class="line"><a name="l03777"></a><span class="lineno"> 3777</span>  len);</div><div class="line"><a name="l03778"></a><span class="lineno"> 3778</span> }</div><div class="line"><a name="l03780"></a><span class="lineno"> 3780</span> </div><div class="line"><a name="l03812"></a><span class="lineno"> 3812</span> <span class="preprocessor">#ifdef LWS_WITH_SMTP</span></div><div class="line"><a name="l03813"></a><span class="lineno"> 3813</span> </div><div class="line"><a name="l03815"></a><span class="lineno"><a class="line" href="group__smtp.html#ga116be79bf44f9dc2a97f46e051fe4dc0"> 3815</a></span> <span class="keyword">enum</span> <a class="code" href="group__smtp.html#ga116be79bf44f9dc2a97f46e051fe4dc0">lwsgs_smtp_states</a> {</div><div class="line"><a name="l03816"></a><span class="lineno"><a class="line" href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a29e5b0ecf75375b5a643faa3d6222b7c"> 3816</a></span>  <a class="code" href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a29e5b0ecf75375b5a643faa3d6222b7c">LGSSMTP_IDLE</a>, </div><div class="line"><a name="l03817"></a><span class="lineno"><a class="line" href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0ab89442b7a3ca2b94c3cdcf33756eb933"> 3817</a></span>  <a class="code" href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0ab89442b7a3ca2b94c3cdcf33756eb933">LGSSMTP_CONNECTING</a>, </div><div class="line"><a name="l03818"></a><span class="lineno"><a class="line" href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0ab61778f70ecac007b334bb14942eb41d"> 3818</a></span>  <a class="code" href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0ab61778f70ecac007b334bb14942eb41d">LGSSMTP_CONNECTED</a>, </div><div class="line"><a name="l03819"></a><span class="lineno"><a class="line" href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a1dfec948a864205cec875f63cbe0d4ad"> 3819</a></span>  <a class="code" href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a1dfec948a864205cec875f63cbe0d4ad">LGSSMTP_SENT_HELO</a>, </div><div class="line"><a name="l03820"></a><span class="lineno"><a class="line" href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a929bb4623ff3f585108aba2a1b047fab"> 3820</a></span>  <a class="code" href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a929bb4623ff3f585108aba2a1b047fab">LGSSMTP_SENT_FROM</a>, </div><div class="line"><a name="l03821"></a><span class="lineno"><a class="line" href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0aae20a0cb95b97a70f6b45d0ed2d5be83"> 3821</a></span>  <a class="code" href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0aae20a0cb95b97a70f6b45d0ed2d5be83">LGSSMTP_SENT_TO</a>, </div><div class="line"><a name="l03822"></a><span class="lineno"><a class="line" href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a85e3c452950c09a79086bff4b9be5c14"> 3822</a></span>  <a class="code" href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a85e3c452950c09a79086bff4b9be5c14">LGSSMTP_SENT_DATA</a>, </div><div class="line"><a name="l03823"></a><span class="lineno"><a class="line" href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a38fba41f28d754e38079b31418a86a69"> 3823</a></span>  <a class="code" href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a38fba41f28d754e38079b31418a86a69">LGSSMTP_SENT_BODY</a>, </div><div class="line"><a name="l03824"></a><span class="lineno"><a class="line" href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a2c2ed16ffc572326e3040684084b21d5"> 3824</a></span>  <a class="code" href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a2c2ed16ffc572326e3040684084b21d5">LGSSMTP_SENT_QUIT</a>, </div><div class="line"><a name="l03825"></a><span class="lineno"> 3825</span> };</div><div class="line"><a name="l03826"></a><span class="lineno"> 3826</span> </div><div class="line"><a name="l03828"></a><span class="lineno"><a class="line" href="structlws__email.html"> 3828</a></span> <span class="keyword">struct </span><a class="code" href="structlws__email.html">lws_email</a> {</div><div class="line"><a name="l03829"></a><span class="lineno"><a class="line" href="structlws__email.html#add1341456045382c183f4c763bdea6bc"> 3829</a></span>  <span class="keywordtype">void</span> *<a class="code" href="structlws__email.html#add1341456045382c183f4c763bdea6bc">data</a>;</div><div class="line"><a name="l03831"></a><span class="lineno"><a class="line" href="structlws__email.html#ab5fbf121195a8e67509c78a42cfbe168"> 3831</a></span>  uv_loop_t *<a class="code" href="structlws__email.html#ab5fbf121195a8e67509c78a42cfbe168">loop</a>;</div><div class="line"><a name="l03834"></a><span class="lineno"><a class="line" href="structlws__email.html#a472ae23fc9fca6599e5c512bc21458d2"> 3834</a></span>  <span class="keywordtype">char</span> email_smtp_ip[32]; </div><div class="line"><a name="l03835"></a><span class="lineno"><a class="line" href="structlws__email.html#a939e5d7ee0339a16de73bde71ab4d4d9"> 3835</a></span>  <span class="keywordtype">char</span> email_helo[32]; </div><div class="line"><a name="l03836"></a><span class="lineno"><a class="line" href="structlws__email.html#af7f0ae934347d81071f63a963301f9e2"> 3836</a></span>  <span class="keywordtype">char</span> email_from[100]; </div><div class="line"><a name="l03837"></a><span class="lineno"><a class="line" href="structlws__email.html#a6453a8b92b3de6d2c2101af3edce685e"> 3837</a></span>  <span class="keywordtype">char</span> email_to[100]; </div><div class="line"><a name="l03839"></a><span class="lineno"><a class="line" href="structlws__email.html#a7bbc1964889c984b3da723c86a210e05"> 3839</a></span>  <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="structlws__email.html#a7bbc1964889c984b3da723c86a210e05">max_content_size</a>;</div><div class="line"><a name="l03842"></a><span class="lineno"> 3842</span>  <span class="comment">/* Fill all the callbacks before init */</span></div><div class="line"><a name="l03843"></a><span class="lineno"> 3843</span> </div><div class="line"><a name="l03844"></a><span class="lineno"><a class="line" href="structlws__email.html#ad8dc60353ee246d84dd59ec0591e9719"> 3844</a></span>  int (*on_next)(<span class="keyword">struct </span><a class="code" href="structlws__email.html">lws_email</a> *email);</div><div class="line"><a name="l03849"></a><span class="lineno"><a class="line" href="structlws__email.html#a39ef6263d58eb40cca417c8697b227d8"> 3849</a></span>  int (*<a class="code" href="structlws__email.html#a39ef6263d58eb40cca417c8697b227d8">on_sent</a>)(<span class="keyword">struct </span><a class="code" href="structlws__email.html">lws_email</a> *email);</div><div class="line"><a name="l03854"></a><span class="lineno"><a class="line" href="structlws__email.html#a2aff78c8e04db243052aa91b4d87e987"> 3854</a></span>  int (*<a class="code" href="structlws__email.html#a2aff78c8e04db243052aa91b4d87e987">on_get_body</a>)(<span class="keyword">struct </span><a class="code" href="structlws__email.html">lws_email</a> *email, <span class="keywordtype">char</span> *buf, <span class="keywordtype">int</span> len);</div><div class="line"><a name="l03860"></a><span class="lineno"> 3860</span>  <span class="comment">/* private things */</span></div><div class="line"><a name="l03861"></a><span class="lineno"><a class="line" href="structlws__email.html#a77723e2f2b940b1c879ef5e1cd88c2be"> 3861</a></span>  uv_timer_t <a class="code" href="structlws__email.html#a77723e2f2b940b1c879ef5e1cd88c2be">timeout_email</a>; </div><div class="line"><a name="l03862"></a><span class="lineno"><a class="line" href="structlws__email.html#ac6115d3cbef2e8bac62cc00895bf5fd3"> 3862</a></span>  <span class="keyword">enum</span> <a class="code" href="group__smtp.html#ga116be79bf44f9dc2a97f46e051fe4dc0">lwsgs_smtp_states</a> <a class="code" href="structlws__email.html#ac6115d3cbef2e8bac62cc00895bf5fd3">estate</a>; </div><div class="line"><a name="l03863"></a><span class="lineno"><a class="line" href="structlws__email.html#a5f53d4c5a1e34b0dcaa8787e2eabb1b3"> 3863</a></span>  uv_connect_t <a class="code" href="structlws__email.html#a5f53d4c5a1e34b0dcaa8787e2eabb1b3">email_connect_req</a>; </div><div class="line"><a name="l03864"></a><span class="lineno"><a class="line" href="structlws__email.html#a01f31934166dc6d01e8a375012f8ad1e"> 3864</a></span>  uv_tcp_t <a class="code" href="structlws__email.html#a01f31934166dc6d01e8a375012f8ad1e">email_client</a>; </div><div class="line"><a name="l03865"></a><span class="lineno"><a class="line" href="structlws__email.html#a9747ca85597788c2d118d287df47b7c1"> 3865</a></span>  time_t <a class="code" href="structlws__email.html#a9747ca85597788c2d118d287df47b7c1">email_connect_started</a>; </div><div class="line"><a name="l03866"></a><span class="lineno"><a class="line" href="structlws__email.html#a8f34ec0643a817be67ef4276aeb7fb82"> 3866</a></span>  <span class="keywordtype">char</span> <a class="code" href="structlws__email.html#a8f34ec0643a817be67ef4276aeb7fb82">email_buf</a>[256]; </div><div class="line"><a name="l03867"></a><span class="lineno"><a class="line" href="structlws__email.html#a6fff03c5a5d369a2aa3cab0c897b1bed"> 3867</a></span>  <span class="keywordtype">char</span> *<a class="code" href="structlws__email.html#a6fff03c5a5d369a2aa3cab0c897b1bed">content</a>; </div><div class="line"><a name="l03868"></a><span class="lineno"> 3868</span> };</div><div class="line"><a name="l03869"></a><span class="lineno"> 3869</span> </div><div class="line"><a name="l03879"></a><span class="lineno"> 3879</span> LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l03880"></a><span class="lineno"> 3880</span> <a class="code" href="group__smtp.html#ga77fc9b56a1bb39484844981ec375fc29">lws_email_init</a>(<span class="keyword">struct</span> <a class="code" href="structlws__email.html">lws_email</a> *email, uv_loop_t *<a class="code" href="structlws__email.html#ab5fbf121195a8e67509c78a42cfbe168">loop</a>, <span class="keywordtype">int</span> max_content);</div><div class="line"><a name="l03881"></a><span class="lineno"> 3881</span> </div><div class="line"><a name="l03890"></a><span class="lineno"> 3890</span> LWS_VISIBLE LWS_EXTERN <span class="keywordtype">void</span></div><div class="line"><a name="l03891"></a><span class="lineno"> 3891</span> <a class="code" href="group__smtp.html#ga5e535e346d92a9daf00be33abf79d4eb">lws_email_check</a>(<span class="keyword">struct</span> <a class="code" href="structlws__email.html">lws_email</a> *email);</div><div class="line"><a name="l03899"></a><span class="lineno"> 3899</span> LWS_VISIBLE LWS_EXTERN <span class="keywordtype">void</span></div><div class="line"><a name="l03900"></a><span class="lineno"> 3900</span> <a class="code" href="group__smtp.html#ga25298a5afc1074e13b2d5711a86432b2">lws_email_destroy</a>(<span class="keyword">struct</span> <a class="code" href="structlws__email.html">lws_email</a> *email);</div><div class="line"><a name="l03901"></a><span class="lineno"> 3901</span> </div><div class="line"><a name="l03902"></a><span class="lineno"> 3902</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l03903"></a><span class="lineno"> 3903</span> </div><div class="line"><a name="l03904"></a><span class="lineno"> 3904</span> </div><div class="line"><a name="l03905"></a><span class="lineno"> 3905</span> <span class="preprocessor">#ifdef __cplusplus</span></div><div class="line"><a name="l03906"></a><span class="lineno"> 3906</span> }</div><div class="line"><a name="l03907"></a><span class="lineno"> 3907</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l03908"></a><span class="lineno"> 3908</span> </div><div class="line"><a name="l03909"></a><span class="lineno"> 3909</span> <span class="preprocessor">#endif</span></div><div class="ttc" id="group__form-parsing_html_gaaa482f07dad3f04b391cccf0a814e13b"><div class="ttname"><a href="group__form-parsing.html#gaaa482f07dad3f04b391cccf0a814e13b">lws_spa_destroy</a></div><div class="ttdeci">LWS_VISIBLE LWS_EXTERN int lws_spa_destroy(struct lws_spa *spa)</div></div>
+<div class="ttc" id="group__pur_html_gab15187efcfa256b7c928562c182b92a3"><div class="ttname"><a href="group__pur.html#gab15187efcfa256b7c928562c182b92a3">lws_json_purify</a></div><div class="ttdeci">LWS_VISIBLE LWS_EXTERN const char * lws_json_purify(char *escaped, const char *string, int len)</div></div>
+<div class="ttc" id="structlws__cgi__args_html"><div class="ttname"><a href="structlws__cgi__args.html">lws_cgi_args</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:3613</div></div>
+<div class="ttc" id="structlws__protocols_html_a0d1d4996d81b2f5e125bcec981e461c5"><div class="ttname"><a href="structlws__protocols.html#a0d1d4996d81b2f5e125bcec981e461c5">lws_protocols::rx_buffer_size</a></div><div class="ttdeci">size_t rx_buffer_size</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1148</div></div>
+<div class="ttc" id="group__form-parsing_html_ga162f86762173a2bc8c28497941d74815"><div class="ttname"><a href="group__form-parsing.html#ga162f86762173a2bc8c28497941d74815">lws_spa_create</a></div><div class="ttdeci">LWS_VISIBLE LWS_EXTERN struct lws_spa * lws_spa_create(struct lws *wsi, const char *const *param_names, int count_params, int max_storage, lws_spa_fileupload_cb opt_cb, void *opt_data)</div></div>
+<div class="ttc" id="group__context-and-vhost_html_ga8db03e19a372e34ac25cf21af894a02c"><div class="ttname"><a href="group__context-and-vhost.html#ga8db03e19a372e34ac25cf21af894a02c">lws_vhost_get</a></div><div class="ttdeci">LWS_VISIBLE LWS_EXTERN struct lws_vhost * lws_vhost_get(struct lws *wsi) LWS_WARN_DEPRECATED</div></div>
+<div class="ttc" id="namespacembed_1_1Sockets_1_1v0_html"><div class="ttname"><a href="namespacembed_1_1Sockets_1_1v0.html">v0</a></div></div>
+<div class="ttc" id="group__usercb_html_ggad62860e19975ba4c4af401c3cdb6abf7a026502768778b8d79d62dd0fe4375fc6"><div class="ttname"><a href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a026502768778b8d79d62dd0fe4375fc6">LWS_CALLBACK_FILTER_NETWORK_CONNECTION</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:638</div></div>
+<div class="ttc" id="group__usercb_html_ggad62860e19975ba4c4af401c3cdb6abf7aca834dc035b7f7486f9ce40fde54fe9e"><div class="ttname"><a href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aca834dc035b7f7486f9ce40fde54fe9e">LWS_CALLBACK_WSI_DESTROY</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:766</div></div>
+<div class="ttc" id="group__misc_html_gace5171b1dbbc03ec89a98f8afdb5c9af"><div class="ttname"><a href="group__misc.html#gace5171b1dbbc03ec89a98f8afdb5c9af">lws_daemonize</a></div><div class="ttdeci">LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT lws_daemonize(const char *_lock_path)</div></div>
+<div class="ttc" id="group__vhost-mounts_html_gga31eca18e50cb4357480f2fcad36ff437a13ab58b01ac6e05f595977f1e0f0db69"><div class="ttname"><a href="group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437a13ab58b01ac6e05f595977f1e0f0db69">LWSMPRO_CGI</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1749</div></div>
+<div class="ttc" id="group__sending-data_html_gga98b099cf8c1c7e38ad78501f270e193dabb6705e1d1327cdda5025be28f07712e"><div class="ttname"><a href="group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193dabb6705e1d1327cdda5025be28f07712e">LWS_WRITE_HTTP</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:2904</div></div>
+<div class="ttc" id="group__smtp_html_gga116be79bf44f9dc2a97f46e051fe4dc0ab61778f70ecac007b334bb14942eb41d"><div class="ttname"><a href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0ab61778f70ecac007b334bb14942eb41d">LGSSMTP_CONNECTED</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:3818</div></div>
+<div class="ttc" id="group__sock-adopt_html_gab2d045df0f81afe00891aaed312d552b"><div class="ttname"><a href="group__sock-adopt.html#gab2d045df0f81afe00891aaed312d552b">lws_adopt_socket_readbuf</a></div><div class="ttdeci">LWS_VISIBLE LWS_EXTERN struct lws * lws_adopt_socket_readbuf(struct lws_context *context, lws_sockfd_type accept_fd, const char *readbuf, size_t len)</div></div>
+<div class="ttc" id="structlws__polarssl__context_html"><div class="ttname"><a href="structlws__polarssl__context.html">lws_polarssl_context</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:234</div></div>
+<div class="ttc" id="structlws__http__mount_html_a614364c770b0bd4db464ad65cddab477"><div class="ttname"><a href="structlws__http__mount.html#a614364c770b0bd4db464ad65cddab477">lws_http_mount::auth_mask</a></div><div class="ttdeci">unsigned int auth_mask</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1784</div></div>
+<div class="ttc" id="group__sending-data_html_gga98b099cf8c1c7e38ad78501f270e193da115440f272a5d55518adfc8099acfee3"><div class="ttname"><a href="group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193da115440f272a5d55518adfc8099acfee3">LWS_WRITE_NO_FIN</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:2927</div></div>
+<div class="ttc" id="structlws__email_html_add1341456045382c183f4c763bdea6bc"><div class="ttname"><a href="structlws__email.html#add1341456045382c183f4c763bdea6bc">lws_email::data</a></div><div class="ttdeci">void * data</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:3829</div></div>
+<div class="ttc" id="structlws__client__connect__info_html_a03c305fdca809667b6a9a83b3edfd83a"><div class="ttname"><a href="structlws__client__connect__info.html#a03c305fdca809667b6a9a83b3edfd83a">lws_client_connect_info::uri_replace_from</a></div><div class="ttdeci">const char * uri_replace_from</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1837</div></div>
+<div class="ttc" id="structlws__plat__file__ops_html_a1fae8330ee94649a3551e31a30809793"><div class="ttname"><a href="structlws__plat__file__ops.html#a1fae8330ee94649a3551e31a30809793">lws_plat_file_ops::write</a></div><div class="ttdeci">int(* write)(struct lws *wsi, lws_filefd_type fd, unsigned long *amount, unsigned char *buf, unsigned long len)</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:3691</div></div>
+<div class="ttc" id="group__usercb_html_gad62860e19975ba4c4af401c3cdb6abf7"><div class="ttname"><a href="group__usercb.html#gad62860e19975ba4c4af401c3cdb6abf7">lws_callback_reasons</a></div><div class="ttdeci">lws_callback_reasons</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:571</div></div>
+<div class="ttc" id="group__HTTP-headers-read_html_gaa427cad61a9a5e3004afd65c4527b5e9"><div class="ttname"><a href="group__HTTP-headers-read.html#gaa427cad61a9a5e3004afd65c4527b5e9">lws_hdr_copy_fragment</a></div><div class="ttdeci">LWS_VISIBLE LWS_EXTERN int lws_hdr_copy_fragment(struct lws *wsi, char *dest, int len, enum lws_token_indexes h, int frag_idx)</div></div>
+<div class="ttc" id="group__usercb_html_ggad62860e19975ba4c4af401c3cdb6abf7ae4986291b7a810fe290851d73bebeb1c"><div class="ttname"><a href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ae4986291b7a810fe290851d73bebeb1c">LWS_CALLBACK_OPENSSL_LOAD_EXTRA_CLIENT_VERIFY_CERTS</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:681</div></div>
+<div class="ttc" id="group__generic-sessions_html_ga7c2dc7bfb4ccb91c5d771f9e9ea237e1"><div class="ttname"><a href="group__generic-sessions.html#ga7c2dc7bfb4ccb91c5d771f9e9ea237e1">lwsgs_auth_bits</a></div><div class="ttdeci">lwsgs_auth_bits</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1293</div></div>
+<div class="ttc" id="group__wsclose_html_gaa1c863415d1783cd8de7938aa6efa262"><div class="ttname"><a href="group__wsclose.html#gaa1c863415d1783cd8de7938aa6efa262">lws_close_reason</a></div><div class="ttdeci">LWS_VISIBLE LWS_EXTERN void lws_close_reason(struct lws *wsi, enum lws_close_status status, unsigned char *buf, size_t len)</div></div>
+<div class="ttc" id="group__smtp_html_ga25298a5afc1074e13b2d5711a86432b2"><div class="ttname"><a href="group__smtp.html#ga25298a5afc1074e13b2d5711a86432b2">lws_email_destroy</a></div><div class="ttdeci">LWS_VISIBLE LWS_EXTERN void lws_email_destroy(struct lws_email *email)</div></div>
+<div class="ttc" id="group__urlendec_html_gaa373a9c16acdd96c395af61ab915ece3"><div class="ttname"><a href="group__urlendec.html#gaa373a9c16acdd96c395af61ab915ece3">lws_urldecode</a></div><div class="ttdeci">LWS_VISIBLE LWS_EXTERN int lws_urldecode(char *string, const char *escaped, int len)</div></div>
+<div class="ttc" id="group__usercb_html_ggad62860e19975ba4c4af401c3cdb6abf7afd8fd77a1cc9405fcb4f26915d7f2d01"><div class="ttname"><a href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7afd8fd77a1cc9405fcb4f26915d7f2d01">LWS_CALLBACK_WSI_CREATE</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:764</div></div>
+<div class="ttc" id="group__extensions_html_ggacc9f55936dc165257a2e1f7d47bce89ea5265abe3e1c3f64412f2affe7bffd880"><div class="ttname"><a href="group__extensions.html#ggacc9f55936dc165257a2e1f7d47bce89ea5265abe3e1c3f64412f2affe7bffd880">EXTARG_OPT_DEC</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:952</div></div>
+<div class="ttc" id="structlws__protocols_html_a6b632018590c2b1bbe43fbab6d5e6fac"><div class="ttname"><a href="structlws__protocols.html#a6b632018590c2b1bbe43fbab6d5e6fac">lws_protocols::id</a></div><div class="ttdeci">unsigned int id</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1157</div></div>
+<div class="ttc" id="group__HTTP-headers-read_html_ga8ade0e1ffb0da7e62b989d8d867bf6c8"><div class="ttname"><a href="group__HTTP-headers-read.html#ga8ade0e1ffb0da7e62b989d8d867bf6c8">lws_hdr_total_length</a></div><div class="ttdeci">LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT lws_hdr_total_length(struct lws *wsi, enum lws_token_indexes h)</div></div>
+<div class="ttc" id="group__extensions_html_ggacc9f55936dc165257a2e1f7d47bce89eaabcf56c456c1ff6e81dc82586a16f14c"><div class="ttname"><a href="group__extensions.html#ggacc9f55936dc165257a2e1f7d47bce89eaabcf56c456c1ff6e81dc82586a16f14c">EXTARG_NONE</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:950</div></div>
+<div class="ttc" id="group__usercb_html_ggad62860e19975ba4c4af401c3cdb6abf7accd8753672d319a30b4b4c2fb775e84d"><div class="ttname"><a href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7accd8753672d319a30b4b4c2fb775e84d">LWS_CALLBACK_FILTER_PROTOCOL_CONNECTION</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:669</div></div>
+<div class="ttc" id="group__service_html_gaebf426eda371ba23642fc11d8e0ace6b"><div class="ttname"><a href="group__service.html#gaebf426eda371ba23642fc11d8e0ace6b">lws_service_fd_tsi</a></div><div class="ttdeci">LWS_VISIBLE LWS_EXTERN int lws_service_fd_tsi(struct lws_context *context, struct lws_pollfd *pollfd, int tsi)</div></div>
+<div class="ttc" id="group__misc_html_ga8930fe36a3f3eefe4a6a4fd499d8e899"><div class="ttname"><a href="group__misc.html#ga8930fe36a3f3eefe4a6a4fd499d8e899">lws_get_parent</a></div><div class="ttdeci">LWS_VISIBLE LWS_EXTERN struct lws *LWS_WARN_UNUSED_RESULT lws_get_parent(const struct lws *wsi)</div></div>
+<div class="ttc" id="group__callback-when-writeable_html_gac4643fe16b0940ae5b68b4ee6195cbde"><div class="ttname"><a href="group__callback-when-writeable.html#gac4643fe16b0940ae5b68b4ee6195cbde">lws_get_peer_write_allowance</a></div><div class="ttdeci">LWS_VISIBLE LWS_EXTERN size_t lws_get_peer_write_allowance(struct lws *wsi)</div></div>
+<div class="ttc" id="group__usercb_html_ggad62860e19975ba4c4af401c3cdb6abf7ae8d1de0bb56e03aa58cb4d44b18edd2e"><div class="ttname"><a href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ae8d1de0bb56e03aa58cb4d44b18edd2e">LWS_CALLBACK_HTTP</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:615</div></div>
+<div class="ttc" id="group__misc_html_gac6abfc0b2bd5b2f09281a4432bb2f5f0"><div class="ttname"><a href="group__misc.html#gac6abfc0b2bd5b2f09281a4432bb2f5f0">lws_get_library_version</a></div><div class="ttdeci">LWS_VISIBLE LWS_EXTERN const char *LWS_WARN_UNUSED_RESULT lws_get_library_version(void)</div></div>
+<div class="ttc" id="structlws__email_html_a39ef6263d58eb40cca417c8697b227d8"><div class="ttname"><a href="structlws__email.html#a39ef6263d58eb40cca417c8697b227d8">lws_email::on_sent</a></div><div class="ttdeci">int(* on_sent)(struct lws_email *email)</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:3849</div></div>
+<div class="ttc" id="structlwsgw__hash__bin_html"><div class="ttname"><a href="structlwsgw__hash__bin.html">lwsgw_hash_bin</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1288</div></div>
+<div class="ttc" id="group__usercb_html_ggad62860e19975ba4c4af401c3cdb6abf7a75199176c82c1a56e4a6bbf1cc30c12c"><div class="ttname"><a href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a75199176c82c1a56e4a6bbf1cc30c12c">LWS_CALLBACK_FILTER_HTTP_CONNECTION</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:649</div></div>
+<div class="ttc" id="structlws__client__connect__info_html_a76a8388733f114fb8fd3643874781185"><div class="ttname"><a href="structlws__client__connect__info.html#a76a8388733f114fb8fd3643874781185">lws_client_connect_info::path</a></div><div class="ttdeci">const char * path</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1816</div></div>
+<div class="ttc" id="libwebsockets_8h_html_a72fe65e83b8bb03f904a1a256c673536"><div class="ttname"><a href="libwebsockets_8h.html#a72fe65e83b8bb03f904a1a256c673536">lws_remaining_packet_payload</a></div><div class="ttdeci">LWS_VISIBLE LWS_EXTERN size_t lws_remaining_packet_payload(struct lws *wsi)</div></div>
+<div class="ttc" id="group__wsclose_html_ggae399c571df32ba532c0ca67da9284985a7aef2da0062da606eeb35aaca5cf9050"><div class="ttname"><a href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a7aef2da0062da606eeb35aaca5cf9050">LWS_CLOSE_STATUS_INVALID_PAYLOAD</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:490</div></div>
+<div class="ttc" id="structlws__plugin__capability_html"><div class="ttname"><a href="structlws__plugin__capability.html">lws_plugin_capability</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1244</div></div>
+<div class="ttc" id="group__extensions_html_ga6fb3e2c3dfb9d64dc87026a4e99c128b"><div class="ttname"><a href="group__extensions.html#ga6fb3e2c3dfb9d64dc87026a4e99c128b">lws_ext_parse_options</a></div><div class="ttdeci">LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT lws_ext_parse_options(const struct lws_extension *ext, struct lws *wsi, void *ext_user, const struct lws_ext_options *opts, const char *o, int len)</div></div>
+<div class="ttc" id="structlws__email_html_a9747ca85597788c2d118d287df47b7c1"><div class="ttname"><a href="structlws__email.html#a9747ca85597788c2d118d287df47b7c1">lws_email::email_connect_started</a></div><div class="ttdeci">time_t email_connect_started</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:3865</div></div>
+<div class="ttc" id="group__wsclose_html_gae399c571df32ba532c0ca67da9284985"><div class="ttname"><a href="group__wsclose.html#gae399c571df32ba532c0ca67da9284985">lws_close_status</a></div><div class="ttdeci">lws_close_status</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:461</div></div>
+<div class="ttc" id="group__callback-when-writeable_html_gacf04bbe089f47c971c6408c5efe2ac70"><div class="ttname"><a href="group__callback-when-writeable.html#gacf04bbe089f47c971c6408c5efe2ac70">lws_callback_all_protocol</a></div><div class="ttdeci">LWS_VISIBLE LWS_EXTERN int lws_callback_all_protocol(struct lws_context *context, const struct lws_protocols *protocol, int reason)</div></div>
+<div class="ttc" id="group__wsclose_html_ggae399c571df32ba532c0ca67da9284985a2e1f0113494a58e762eed3d22e7080d8"><div class="ttname"><a href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a2e1f0113494a58e762eed3d22e7080d8">LWS_CLOSE_STATUS_MESSAGE_TOO_LARGE</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:501</div></div>
+<div class="ttc" id="group__context-and-vhost_html_gga41c2d763f78cc248df3b9f8645dbd2a5a274ed462a1a9239eb6ddf9007f5b7092"><div class="ttname"><a href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a274ed462a1a9239eb6ddf9007f5b7092">LWS_SERVER_OPTION_REQUIRE_VALID_OPENSSL_CLIENT_CERT</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1348</div></div>
+<div class="ttc" id="structlws__tokens_html_a855b7375d1d58516c0ecd4b60e9a7766"><div class="ttname"><a href="structlws__tokens.html#a855b7375d1d58516c0ecd4b60e9a7766">lws_tokens::token_len</a></div><div class="ttdeci">int token_len</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:2236</div></div>
+<div class="ttc" id="structlws__context__creation__info_html_a13ffbb0d010309669611f8c4eda7d7f8"><div class="ttname"><a href="structlws__context__creation__info.html#a13ffbb0d010309669611f8c4eda7d7f8">lws_context_creation_info::mounts</a></div><div class="ttdeci">const struct lws_http_mount * mounts</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1524</div></div>
+<div class="ttc" id="group__usercb_html_ggad62860e19975ba4c4af401c3cdb6abf7a1df60f314710236f9b53efbf468da768"><div class="ttname"><a href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a1df60f314710236f9b53efbf468da768">LWS_CALLBACK_DEL_POLL_FD</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:790</div></div>
+<div class="ttc" id="group__misc_html_ga0af4f7d2dd375aeedcfa7eb0e1101c4b"><div class="ttname"><a href="group__misc.html#ga0af4f7d2dd375aeedcfa7eb0e1101c4b">lws_get_context</a></div><div class="ttdeci">LWS_VISIBLE LWS_EXTERN struct lws_context *LWS_WARN_UNUSED_RESULT lws_get_context(const struct lws *wsi)</div></div>
+<div class="ttc" id="structlws__protocol__vhost__options_html_a0640a92513c70ee6b9b295a9ad1658e7"><div class="ttname"><a href="structlws__protocol__vhost__options.html#a0640a92513c70ee6b9b295a9ad1658e7">lws_protocol_vhost_options::value</a></div><div class="ttdeci">const char * value</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1738</div></div>
+<div class="ttc" id="group__form-parsing_html_gga41a74a822771d3dce89751aa3bce28aea6ce2a55a4c3695cdb640c893d95bd3a7"><div class="ttname"><a href="group__form-parsing.html#gga41a74a822771d3dce89751aa3bce28aea6ce2a55a4c3695cdb640c893d95bd3a7">LWS_UFS_FINAL_CONTENT</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:2555</div></div>
+<div class="ttc" id="group__smtp_html_gga116be79bf44f9dc2a97f46e051fe4dc0a38fba41f28d754e38079b31418a86a69"><div class="ttname"><a href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a38fba41f28d754e38079b31418a86a69">LGSSMTP_SENT_BODY</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:3823</div></div>
+<div class="ttc" id="structlws__gs__event__args_html_a2bec693d8a43730d487004a44326178b"><div class="ttname"><a href="structlws__gs__event__args.html#a2bec693d8a43730d487004a44326178b">lws_gs_event_args::username</a></div><div class="ttdeci">const char * username</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1319</div></div>
+<div class="ttc" id="structlws__http__mount_html_a05347d92c3d379809564bd4f3eab259b"><div class="ttname"><a href="structlws__http__mount.html#a05347d92c3d379809564bd4f3eab259b">lws_http_mount::protocol</a></div><div class="ttdeci">const char * protocol</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1768</div></div>
+<div class="ttc" id="structlws__cgi__args_html_a4ccc1058e7e914a26eef31ab2ad46aa1"><div class="ttname"><a href="structlws__cgi__args.html#a4ccc1058e7e914a26eef31ab2ad46aa1">lws_cgi_args::stdwsi</a></div><div class="ttdeci">struct lws ** stdwsi</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:3614</div></div>
+<div class="ttc" id="group__context-and-vhost_html_ga94e6cc2223c4eec316b13bcebc3628b6"><div class="ttname"><a href="group__context-and-vhost.html#ga94e6cc2223c4eec316b13bcebc3628b6">lws_json_dump_vhost</a></div><div class="ttdeci">LWS_VISIBLE LWS_EXTERN int lws_json_dump_vhost(const struct lws_vhost *vh, char *buf, int len)</div></div>
+<div class="ttc" id="group__usercb_html_ggad62860e19975ba4c4af401c3cdb6abf7a390da3639296660a78cc1a5dcb19037e"><div class="ttname"><a href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a390da3639296660a78cc1a5dcb19037e">LWS_CALLBACK_CONFIRM_EXTENSION_OKAY</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:736</div></div>
+<div class="ttc" id="structlwsgw__hash_html"><div class="ttname"><a href="structlwsgw__hash.html">lwsgw_hash</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1290</div></div>
+<div class="ttc" id="structlws__http__mount_html_a4283e30ea89d27ae7d061ad760d1d146"><div class="ttname"><a href="structlws__http__mount.html#a4283e30ea89d27ae7d061ad760d1d146">lws_http_mount::cache_max_age</a></div><div class="ttdeci">int cache_max_age</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1782</div></div>
+<div class="ttc" id="structlws__context__creation__info_html_adb0bc0b28cd7d90ab306723d8ffa96fa"><div class="ttname"><a href="structlws__context__creation__info.html#adb0bc0b28cd7d90ab306723d8ffa96fa">lws_context_creation_info::ssl_options_clear</a></div><div class="ttdeci">long ssl_options_clear</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1542</div></div>
+<div class="ttc" id="group__usercb_html_ggad62860e19975ba4c4af401c3cdb6abf7ac4c68e00efcf1ff7bda7ada462aff8ae"><div class="ttname"><a href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ac4c68e00efcf1ff7bda7ada462aff8ae">LWS_CALLBACK_HTTP_BODY</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:629</div></div>
+<div class="ttc" id="structlws__context__creation__info_html"><div class="ttname"><a href="structlws__context__creation__info.html">lws_context_creation_info</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1410</div></div>
+<div class="ttc" id="group__context-and-vhost_html_ga8ee0314028755f1ddfa9428e09b4fddb"><div class="ttname"><a href="group__context-and-vhost.html#ga8ee0314028755f1ddfa9428e09b4fddb">lws_context_destroy</a></div><div class="ttdeci">LWS_VISIBLE LWS_EXTERN void lws_context_destroy(struct lws_context *context)</div></div>
+<div class="ttc" id="group__wsclose_html_ggae399c571df32ba532c0ca67da9284985ad2b477a91c8445bf34ecd43977f9b390"><div class="ttname"><a href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985ad2b477a91c8445bf34ecd43977f9b390">LWS_CLOSE_STATUS_TLS_FAILURE</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:517</div></div>
+<div class="ttc" id="structlws__process__html__state_html_af0732884ef891e24fe5fa237ebaa21a3"><div class="ttname"><a href="structlws__process__html__state.html#af0732884ef891e24fe5fa237ebaa21a3">lws_process_html_state::start</a></div><div class="ttdeci">char * start</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:2175</div></div>
+<div class="ttc" id="group__misc_html_gab321ed812f46f6dc7ef9e3ca6f00cf1b"><div class="ttname"><a href="group__misc.html#gab321ed812f46f6dc7ef9e3ca6f00cf1b">lws_set_allocator</a></div><div class="ttdeci">LWS_VISIBLE LWS_EXTERN void lws_set_allocator(void *(*realloc)(void *ptr, size_t size))</div></div>
+<div class="ttc" id="structlws__protocols_html_acabf94c1a9bfe7be0387fbb0e0c56b2d"><div class="ttname"><a href="structlws__protocols.html#acabf94c1a9bfe7be0387fbb0e0c56b2d">lws_protocols::callback</a></div><div class="ttdeci">lws_callback_function * callback</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1139</div></div>
+<div class="ttc" id="group__sending-data_html_gga98b099cf8c1c7e38ad78501f270e193da80e8f169fda236c56bfb795ed62903db"><div class="ttname"><a href="group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193da80e8f169fda236c56bfb795ed62903db">LWS_WRITE_TEXT</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:2894</div></div>
+<div class="ttc" id="group__callback-when-writeable_html_gaa709e02a10558753c851e58f1e2c16ba"><div class="ttname"><a href="group__callback-when-writeable.html#gaa709e02a10558753c851e58f1e2c16ba">lws_get_socket_fd</a></div><div class="ttdeci">LWS_VISIBLE LWS_EXTERN int lws_get_socket_fd(struct lws *wsi)</div></div>
+<div class="ttc" id="group__usercb_html_ggad62860e19975ba4c4af401c3cdb6abf7ac3fc5bbb55e69f90396526287ee84a51"><div class="ttname"><a href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ac3fc5bbb55e69f90396526287ee84a51">LWS_CALLBACK_WS_PEER_INITIATED_CLOSE</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:827</div></div>
+<div class="ttc" id="group__usercb_html_ggad62860e19975ba4c4af401c3cdb6abf7aa46f705dcf97502e95627ffde614f98b"><div class="ttname"><a href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aa46f705dcf97502e95627ffde614f98b">LWS_CALLBACK_OPENSSL_CONTEXT_REQUIRES_PRIVATE_KEY</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:819</div></div>
+<div class="ttc" id="structlws__client__connect__info_html_aba35adfb74845a5fd0c3dc141cbdddd2"><div class="ttname"><a href="structlws__client__connect__info.html#aba35adfb74845a5fd0c3dc141cbdddd2">lws_client_connect_info::protocol</a></div><div class="ttdeci">const char * protocol</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1822</div></div>
+<div class="ttc" id="group__usercb_html_ggad62860e19975ba4c4af401c3cdb6abf7a0e9e3dd667c0c42cdbe1a3d921f4fd79"><div class="ttname"><a href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a0e9e3dd667c0c42cdbe1a3d921f4fd79">LWS_CALLBACK_UNLOCK_POLL</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:816</div></div>
+<div class="ttc" id="structlws__context__creation__info_html_a57f88c0745adbd1d6b9b619b8de30209"><div class="ttname"><a href="structlws__context__creation__info.html#a57f88c0745adbd1d6b9b619b8de30209">lws_context_creation_info::pt_serv_buf_size</a></div><div class="ttdeci">unsigned int pt_serv_buf_size</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1529</div></div>
+<div class="ttc" id="group__sock-adopt_html_gabe71b7462afb21c767bdc67334f305af"><div class="ttname"><a href="group__sock-adopt.html#gabe71b7462afb21c767bdc67334f305af">lws_adopt_socket</a></div><div class="ttdeci">LWS_VISIBLE LWS_EXTERN struct lws * lws_adopt_socket(struct lws_context *context, lws_sockfd_type accept_fd)</div></div>
+<div class="ttc" id="structlws__process__html__args_html_a754513f2311241cabb0cd1c90d7307ef"><div class="ttname"><a href="structlws__process__html__args.html#a754513f2311241cabb0cd1c90d7307ef">lws_process_html_args::len</a></div><div class="ttdeci">int len</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:2167</div></div>
+<div class="ttc" id="structlws__context__creation__info_html_ac583ce92b8e1c949cb6fef6bfe713d56"><div class="ttname"><a href="structlws__context__creation__info.html#ac583ce92b8e1c949cb6fef6bfe713d56">lws_context_creation_info::ka_time</a></div><div class="ttdeci">int ka_time</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1465</div></div>
+<div class="ttc" id="group__context-and-vhost_html_gga41c2d763f78cc248df3b9f8645dbd2a5a4933347a821e73c3f1e13fb6bfc7ad93"><div class="ttname"><a href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a4933347a821e73c3f1e13fb6bfc7ad93">LWS_SERVER_OPTION_DISABLE_OS_CA_CERTS</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1364</div></div>
+<div class="ttc" id="group__callback-when-writeable_html_gabbe4655c7eeb3eb1671b2323ec6b3107"><div class="ttname"><a href="group__callback-when-writeable.html#gabbe4655c7eeb3eb1671b2323ec6b3107">lws_callback_on_writable_all_protocol</a></div><div class="ttdeci">LWS_VISIBLE LWS_EXTERN int lws_callback_on_writable_all_protocol(const struct lws_context *context, const struct lws_protocols *protocol)</div></div>
+<div class="ttc" id="group__log_html_ga244647f9e1bf0097ccdde66d74f41e26"><div class="ttname"><a href="group__log.html#ga244647f9e1bf0097ccdde66d74f41e26">lws_set_log_level</a></div><div class="ttdeci">LWS_VISIBLE LWS_EXTERN void lws_set_log_level(int level, void(*log_emit_function)(int level, const char *line))</div></div>
+<div class="ttc" id="structlws__plugin__capability_html_abcf51db969522fdda9aaf902e65739d3"><div class="ttname"><a href="structlws__plugin__capability.html#abcf51db969522fdda9aaf902e65739d3">lws_plugin_capability::count_extensions</a></div><div class="ttdeci">int count_extensions</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1249</div></div>
+<div class="ttc" id="group__sending-data_html_gga98b099cf8c1c7e38ad78501f270e193daf6486c0dba50c44198100717721d9ab2"><div class="ttname"><a href="group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193daf6486c0dba50c44198100717721d9ab2">LWS_WRITE_BINARY</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:2898</div></div>
+<div class="ttc" id="structlws__client__connect__info_html_a1af124d81c3c22a46d39387c5bc3d6b9"><div class="ttname"><a href="structlws__client__connect__info.html#a1af124d81c3c22a46d39387c5bc3d6b9">lws_client_connect_info::port</a></div><div class="ttdeci">int port</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1812</div></div>
+<div class="ttc" id="structlws__client__connect__info_html_afe999d133cc240a0bfd02aade0514cfd"><div class="ttname"><a href="structlws__client__connect__info.html#afe999d133cc240a0bfd02aade0514cfd">lws_client_connect_info::context</a></div><div class="ttdeci">struct lws_context * context</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1808</div></div>
+<div class="ttc" id="group__generic-sessions_html_gga7c2dc7bfb4ccb91c5d771f9e9ea237e1a5a607e4668d20cadada62c4b8007f887"><div class="ttname"><a href="group__generic-sessions.html#gga7c2dc7bfb4ccb91c5d771f9e9ea237e1a5a607e4668d20cadada62c4b8007f887">LWSGS_AUTH_VERIFIED</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1296</div></div>
+<div class="ttc" id="structlws__client__connect__info_html_a69abb5aeed755750b9755e5c91db6895"><div class="ttname"><a href="structlws__client__connect__info.html#a69abb5aeed755750b9755e5c91db6895">lws_client_connect_info::ietf_version_or_minus_one</a></div><div class="ttdeci">int ietf_version_or_minus_one</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1824</div></div>
+<div class="ttc" id="group__callback-when-writeable_html_ga13c984d8c5a44a745fd02bc2fba36053"><div class="ttname"><a href="group__callback-when-writeable.html#ga13c984d8c5a44a745fd02bc2fba36053">lws_callback_all_protocol_vhost</a></div><div class="ttdeci">LWS_VISIBLE LWS_EXTERN int lws_callback_all_protocol_vhost(struct lws_vhost *vh, const struct lws_protocols *protocol, int reason)</div></div>
+<div class="ttc" id="group__smtp_html_gga116be79bf44f9dc2a97f46e051fe4dc0a29e5b0ecf75375b5a643faa3d6222b7c"><div class="ttname"><a href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a29e5b0ecf75375b5a643faa3d6222b7c">LGSSMTP_IDLE</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:3816</div></div>
+<div class="ttc" id="structlws__protocol__vhost__options_html"><div class="ttname"><a href="structlws__protocol__vhost__options.html">lws_protocol_vhost_options</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1734</div></div>
+<div class="ttc" id="group__callback-when-writeable_html_ga941caaa468bc507b1cae52275f58800d"><div class="ttname"><a href="group__callback-when-writeable.html#ga941caaa468bc507b1cae52275f58800d">lws_callback_on_writable</a></div><div class="ttdeci">LWS_VISIBLE LWS_EXTERN int lws_callback_on_writable(struct lws *wsi)</div></div>
+<div class="ttc" id="structlws__process__html__state_html_a3b113e00c03a2fded51b1c85ff5bf077"><div class="ttname"><a href="structlws__process__html__state.html#a3b113e00c03a2fded51b1c85ff5bf077">lws_process_html_state::vars</a></div><div class="ttdeci">const char *const * vars</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:2179</div></div>
+<div class="ttc" id="group__wsclose_html_ggae399c571df32ba532c0ca67da9284985a1bb501d212fa4d57053db681b1dfab98"><div class="ttname"><a href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a1bb501d212fa4d57053db681b1dfab98">LWS_CLOSE_STATUS_PROTOCOL_ERR</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:469</div></div>
+<div class="ttc" id="structlws__client__connect__info_html"><div class="ttname"><a href="structlws__client__connect__info.html">lws_client_connect_info</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1807</div></div>
+<div class="ttc" id="group__extensions_html_gaae7169b2cd346b34fa33d0250db2afd0"><div class="ttname"><a href="group__extensions.html#gaae7169b2cd346b34fa33d0250db2afd0">lws_extension_callback_function</a></div><div class="ttdeci">int lws_extension_callback_function(struct lws_context *context, const struct lws_extension *ext, struct lws *wsi, enum lws_extension_callback_reasons reason, void *user, void *in, size_t len)</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1039</div></div>
+<div class="ttc" id="group__usercb_html_ggad62860e19975ba4c4af401c3cdb6abf7a1ce5b22039ca37ee224d00047596ea46"><div class="ttname"><a href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a1ce5b22039ca37ee224d00047596ea46">LWS_CALLBACK_CLIENT_CONFIRM_EXTENSION_SUPPORTED</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:747</div></div>
+<div class="ttc" id="structlws__ext__option__arg_html_af37f0b6caa7735af51a1ac12b68d5bc5"><div class="ttname"><a href="structlws__ext__option__arg.html#af37f0b6caa7735af51a1ac12b68d5bc5">lws_ext_option_arg::len</a></div><div class="ttdeci">int len</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:975</div></div>
+<div class="ttc" id="structlws__http__mount_html"><div class="ttname"><a href="structlws__http__mount.html">lws_http_mount</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1759</div></div>
+<div class="ttc" id="structlws__http__mount_html_ae90d1efe7178199fad39de2926902ee4"><div class="ttname"><a href="structlws__http__mount.html#ae90d1efe7178199fad39de2926902ee4">lws_http_mount::def</a></div><div class="ttdeci">const char * def</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1766</div></div>
+<div class="ttc" id="group__usercb_html_ggad62860e19975ba4c4af401c3cdb6abf7a48a9590e5e18c7920282e094a0bfd9d8"><div class="ttname"><a href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a48a9590e5e18c7920282e094a0bfd9d8">LWS_CALLBACK_CLOSED</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:590</div></div>
+<div class="ttc" id="group__context-and-vhost_html_gga41c2d763f78cc248df3b9f8645dbd2a5a4832187186c4d130c68051214cd42ada"><div class="ttname"><a href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a4832187186c4d130c68051214cd42ada">LWS_SERVER_OPTION_REDIRECT_HTTP_TO_HTTPS</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1376</div></div>
+<div class="ttc" id="group__context-and-vhost_html_ga41c2d763f78cc248df3b9f8645dbd2a5"><div class="ttname"><a href="group__context-and-vhost.html#ga41c2d763f78cc248df3b9f8645dbd2a5">lws_context_options</a></div><div class="ttdeci">lws_context_options</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1347</div></div>
+<div class="ttc" id="group__usercb_html_ggad62860e19975ba4c4af401c3cdb6abf7adfb41c92e2522712207ef7f2462b5e34"><div class="ttname"><a href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7adfb41c92e2522712207ef7f2462b5e34">LWS_CALLBACK_GET_THREAD_ID</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:768</div></div>
+<div class="ttc" id="group__generic-sessions_html_ggaa93946b3d921072209d5cd8cdfa5332ead908cdc5689c5d22c9d3c8934e94dcde"><div class="ttname"><a href="group__generic-sessions.html#ggaa93946b3d921072209d5cd8cdfa5332ead908cdc5689c5d22c9d3c8934e94dcde">LWSGSE_DELETED</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1313</div></div>
+<div class="ttc" id="group__context-and-vhost_html_gga41c2d763f78cc248df3b9f8645dbd2a5accc9d0d11d1124a21659586164b0962e"><div class="ttname"><a href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5accc9d0d11d1124a21659586164b0962e">LWS_SERVER_OPTION_EXPLICIT_VHOSTS</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1383</div></div>
+<div class="ttc" id="group__usercb_html_ggad62860e19975ba4c4af401c3cdb6abf7ad5d34583e3556e153eda91620b48cc49"><div class="ttname"><a href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ad5d34583e3556e153eda91620b48cc49">LWS_CALLBACK_PROTOCOL_INIT</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:756</div></div>
+<div class="ttc" id="structlws__ext__option__arg_html_a0a320c56b79271b8f059eeaad9423ac9"><div class="ttname"><a href="structlws__ext__option__arg.html#a0a320c56b79271b8f059eeaad9423ac9">lws_ext_option_arg::option_name</a></div><div class="ttdeci">const char * option_name</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:972</div></div>
+<div class="ttc" id="group__vhost-mounts_html_gga31eca18e50cb4357480f2fcad36ff437afbd10eb4777517ed1f6bfdcf3b9ea1d1"><div class="ttname"><a href="group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437afbd10eb4777517ed1f6bfdcf3b9ea1d1">LWSMPRO_HTTPS</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1747</div></div>
+<div class="ttc" id="structlws__pollargs_html_af14a48ef4e78128aef9a76902b104a81"><div class="ttname"><a href="structlws__pollargs.html#af14a48ef4e78128aef9a76902b104a81">lws_pollargs::fd</a></div><div class="ttdeci">lws_sockfd_type fd</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:439</div></div>
+<div class="ttc" id="structlws__context__creation__info_html_af3fb447be15c4fcb01d3285a6678ab54"><div class="ttname"><a href="structlws__context__creation__info.html#af3fb447be15c4fcb01d3285a6678ab54">lws_context_creation_info::ssl_private_key_password</a></div><div class="ttdeci">const char * ssl_private_key_password</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1433</div></div>
+<div class="ttc" id="structpollfd_html_ac9b2f2c5b1f9a7487eb57e67cd4960ef"><div class="ttname"><a href="structpollfd.html#ac9b2f2c5b1f9a7487eb57e67cd4960ef">pollfd::events</a></div><div class="ttdeci">short events</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:411</div></div>
+<div class="ttc" id="structlws__plugin_html"><div class="ttname"><a href="structlws__plugin.html">lws_plugin</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1257</div></div>
+<div class="ttc" id="structlws__plugin__capability_html_a7936f0eb93d79dea76b903d0f8a5f623"><div class="ttname"><a href="structlws__plugin__capability.html#a7936f0eb93d79dea76b903d0f8a5f623">lws_plugin_capability::extensions</a></div><div class="ttdeci">const struct lws_extension * extensions</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1248</div></div>
+<div class="ttc" id="group__timeout_html_gaced9f9237f6172fed9f730a2af51345a"><div class="ttname"><a href="group__timeout.html#gaced9f9237f6172fed9f730a2af51345a">lws_set_timeout</a></div><div class="ttdeci">LWS_VISIBLE LWS_EXTERN void lws_set_timeout(struct lws *wsi, enum pending_timeout reason, int secs)</div></div>
+<div class="ttc" id="structlws__client__connect__info_html_a9831b9f9ab54a1aec4bb15324f1c3836"><div class="ttname"><a href="structlws__client__connect__info.html#a9831b9f9ab54a1aec4bb15324f1c3836">lws_client_connect_info::userdata</a></div><div class="ttdeci">void * userdata</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1826</div></div>
+<div class="ttc" id="group__usercb_html_ggad62860e19975ba4c4af401c3cdb6abf7a7e12418eec9bce85735e6460176ab604"><div class="ttname"><a href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a7e12418eec9bce85735e6460176ab604">LWS_CALLBACK_CLIENT_ESTABLISHED</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:587</div></div>
+<div class="ttc" id="group__usercb_html_ggad62860e19975ba4c4af401c3cdb6abf7ab69783a9fbf2ca71ad70706bda77b412"><div class="ttname"><a href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ab69783a9fbf2ca71ad70706bda77b412">LWS_CALLBACK_ADD_POLL_FD</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:774</div></div>
+<div class="ttc" id="group__service_html_ga9b3cc4473fd8848e5bbee7f310712939"><div class="ttname"><a href="group__service.html#ga9b3cc4473fd8848e5bbee7f310712939">lws_service_tsi</a></div><div class="ttdeci">LWS_VISIBLE LWS_EXTERN int lws_service_tsi(struct lws_context *context, int timeout_ms, int tsi)</div></div>
+<div class="ttc" id="structlws__cgi__args_html_a8ac842084688c02f3f94694ef700d8f7"><div class="ttname"><a href="structlws__cgi__args.html#a8ac842084688c02f3f94694ef700d8f7">lws_cgi_args::data</a></div><div class="ttdeci">unsigned char * data</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:3616</div></div>
+<div class="ttc" id="structlws__http__mount_html_a4437423df85ee3dbcae0e15974c89ec7"><div class="ttname"><a href="structlws__http__mount.html#a4437423df85ee3dbcae0e15974c89ec7">lws_http_mount::extra_mimetypes</a></div><div class="ttdeci">const struct lws_protocol_vhost_options * extra_mimetypes</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1775</div></div>
+<div class="ttc" id="group__HTTP-headers-create_html_ga4887605ff2242a54db3a7fa01f6f864b"><div class="ttname"><a href="group__HTTP-headers-create.html#ga4887605ff2242a54db3a7fa01f6f864b">lws_finalize_http_header</a></div><div class="ttdeci">LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT lws_finalize_http_header(struct lws *wsi, unsigned char **p, unsigned char *end)</div></div>
+<div class="ttc" id="group__usercb_html_ggad62860e19975ba4c4af401c3cdb6abf7aa536e574a642ff3ab9e12bff7ba2c6a2"><div class="ttname"><a href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aa536e574a642ff3ab9e12bff7ba2c6a2">LWS_CALLBACK_CLIENT_FILTER_PRE_ESTABLISH</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:580</div></div>
+<div class="ttc" id="group__urlendec_html_gabc2888476e50e001c875c1a8abf455b7"><div class="ttname"><a href="group__urlendec.html#gabc2888476e50e001c875c1a8abf455b7">lws_urlencode</a></div><div class="ttdeci">LWS_VISIBLE LWS_EXTERN const char * lws_urlencode(char *escaped, const char *string, int len)</div></div>
+<div class="ttc" id="group__usercb_html_ggad62860e19975ba4c4af401c3cdb6abf7ae9734e1d7af2abf291665ce9e4a728d3"><div class="ttname"><a href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ae9734e1d7af2abf291665ce9e4a728d3">LWS_CALLBACK_SERVER_NEW_CLIENT_INSTANTIATED</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:661</div></div>
+<div class="ttc" id="structlws__email_html_ab5fbf121195a8e67509c78a42cfbe168"><div class="ttname"><a href="structlws__email.html#ab5fbf121195a8e67509c78a42cfbe168">lws_email::loop</a></div><div class="ttdeci">uv_loop_t * loop</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:3831</div></div>
+<div class="ttc" id="group__usercb_html_ggad62860e19975ba4c4af401c3cdb6abf7a54269ca88508e6efd3afdb9d360a9caa"><div class="ttname"><a href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a54269ca88508e6efd3afdb9d360a9caa">LWS_CALLBACK_PROTOCOL_DESTROY</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:759</div></div>
+<div class="ttc" id="classlws__conn__listener_html"><div class="ttname"><a href="classlws__conn__listener.html">lws_conn_listener</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:72</div></div>
+<div class="ttc" id="group__sending-data_html_gga98b099cf8c1c7e38ad78501f270e193da220d8e8652d9b97fb66e476e2a60ffce"><div class="ttname"><a href="group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193da220d8e8652d9b97fb66e476e2a60ffce">LWS_WRITE_CLIENT_IGNORE_XOR_MASK</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:2930</div></div>
+<div class="ttc" id="structlws__process__html__state_html_a53234f2948812c7208a256f9f5b23c20"><div class="ttname"><a href="structlws__process__html__state.html#a53234f2948812c7208a256f9f5b23c20">lws_process_html_state::pos</a></div><div class="ttdeci">int pos</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:2177</div></div>
+<div class="ttc" id="structlws__plugin_html_a65dffd68fd267ce17b988790d1d35f22"><div class="ttname"><a href="structlws__plugin.html#a65dffd68fd267ce17b988790d1d35f22">lws_plugin::list</a></div><div class="ttdeci">struct lws_plugin * list</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1258</div></div>
+<div class="ttc" id="group__client_html_gac6a8558b4410961a880241c2ac1271e2"><div class="ttname"><a href="group__client.html#gac6a8558b4410961a880241c2ac1271e2">lws_client_connect_extended</a></div><div class="ttdeci">LWS_VISIBLE LWS_EXTERN struct lws *LWS_WARN_UNUSED_RESULT lws_client_connect_extended(struct lws_context *clients, const char *address, int port, int ssl_connection, const char *path, const char *host, const char *origin, const char *protocol, int ietf_version_or_minus_one, void *userdata) LWS_WARN_DEPRECATED</div></div>
+<div class="ttc" id="structlws__context__creation__info_html_a0cdfd3c484689ba6f0f2cc91b38ce948"><div class="ttname"><a href="structlws__context__creation__info.html#a0cdfd3c484689ba6f0f2cc91b38ce948">lws_context_creation_info::max_http_header_data</a></div><div class="ttdeci">short max_http_header_data</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1485</div></div>
+<div class="ttc" id="group__form-parsing_html_ga9ad9ebf5ea1a7108415ed7e04cb231d2"><div class="ttname"><a href="group__form-parsing.html#ga9ad9ebf5ea1a7108415ed7e04cb231d2">lws_spa_process</a></div><div class="ttdeci">LWS_VISIBLE LWS_EXTERN int lws_spa_process(struct lws_spa *spa, const char *in, int len)</div></div>
+<div class="ttc" id="structlws__context__creation__info_html_a0e790dda6202604f73a03b6149bc12bb"><div class="ttname"><a href="structlws__context__creation__info.html#a0e790dda6202604f73a03b6149bc12bb">lws_context_creation_info::provided_client_ssl_ctx</a></div><div class="ttdeci">void * provided_client_ssl_ctx</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1482</div></div>
+<div class="ttc" id="group__context-and-vhost_html_ga06e77ce2916f8bc9826ef8d9d68e3932"><div class="ttname"><a href="group__context-and-vhost.html#ga06e77ce2916f8bc9826ef8d9d68e3932">lws_get_vhost</a></div><div class="ttdeci">LWS_VISIBLE LWS_EXTERN struct lws_vhost * lws_get_vhost(struct lws *wsi)</div></div>
+<div class="ttc" id="classlws__conn_html"><div class="ttname"><a href="classlws__conn.html">lws_conn</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:44</div></div>
+<div class="ttc" id="group__log_html_gab7c0fc936cc9f1eb58e2bb234c15147c"><div class="ttname"><a href="group__log.html#gab7c0fc936cc9f1eb58e2bb234c15147c">lwsl_emit_syslog</a></div><div class="ttdeci">LWS_VISIBLE LWS_EXTERN void lwsl_emit_syslog(int level, const char *line)</div></div>
+<div class="ttc" id="structlws__plugin__capability_html_a6a4d9d01e770f378ddadc77b37522033"><div class="ttname"><a href="structlws__plugin__capability.html#a6a4d9d01e770f378ddadc77b37522033">lws_plugin_capability::protocols</a></div><div class="ttdeci">const struct lws_protocols * protocols</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1246</div></div>
+<div class="ttc" id="group__extensions_html_ggacc9f55936dc165257a2e1f7d47bce89ea1c86adf924c8786a12bee9687094673e"><div class="ttname"><a href="group__extensions.html#ggacc9f55936dc165257a2e1f7d47bce89ea1c86adf924c8786a12bee9687094673e">EXTARG_DEC</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:951</div></div>
+<div class="ttc" id="structlws__context__creation__info_html_a3baab4285c679fbe027c2504621d7410"><div class="ttname"><a href="structlws__context__creation__info.html#a3baab4285c679fbe027c2504621d7410">lws_context_creation_info::ka_probes</a></div><div class="ttdeci">int ka_probes</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1468</div></div>
+<div class="ttc" id="classlws__conn__listener_html_a271ac4f8ad5770b3bc96cce5b265b72c"><div class="ttname"><a href="classlws__conn__listener.html#a271ac4f8ad5770b3bc96cce5b265b72c">lws_conn_listener::onError</a></div><div class="ttdeci">void onError(Socket *s, socket_error_t err)</div></div>
+<div class="ttc" id="structlws__client__connect__info_html_a8595f83e64147cb687b6418cf500dd4c"><div class="ttname"><a href="structlws__client__connect__info.html#a8595f83e64147cb687b6418cf500dd4c">lws_client_connect_info::origin</a></div><div class="ttdeci">const char * origin</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1820</div></div>
+<div class="ttc" id="structlws__pollfd_html_ae7cecfe7511c59d4a3a44f876d030932"><div class="ttname"><a href="structlws__pollfd.html#ae7cecfe7511c59d4a3a44f876d030932">lws_pollfd::revents</a></div><div class="ttdeci">SHORT revents</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:400</div></div>
+<div class="ttc" id="structlws__client__connect__info_html_aa9e8e3da4e783a0651b0dea62c2dd1db"><div class="ttname"><a href="structlws__client__connect__info.html#aa9e8e3da4e783a0651b0dea62c2dd1db">lws_client_connect_info::method</a></div><div class="ttdeci">const char * method</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1830</div></div>
+<div class="ttc" id="group__form-parsing_html_ga2da476217166da02704b90d3a8d4f3cd"><div class="ttname"><a href="group__form-parsing.html#ga2da476217166da02704b90d3a8d4f3cd">lws_spa_get_string</a></div><div class="ttdeci">LWS_VISIBLE LWS_EXTERN const char * lws_spa_get_string(struct lws_spa *spa, int n)</div></div>
+<div class="ttc" id="structlws__extension_html"><div class="ttname"><a href="structlws__extension.html">lws_extension</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1045</div></div>
+<div class="ttc" id="group__callback-when-writeable_html_ga8570860e191b62db264f2bac67354ea8"><div class="ttname"><a href="group__callback-when-writeable.html#ga8570860e191b62db264f2bac67354ea8">lws_callback_on_writable_all_protocol_vhost</a></div><div class="ttdeci">LWS_VISIBLE LWS_EXTERN int lws_callback_on_writable_all_protocol_vhost(const struct lws_vhost *vhost, const struct lws_protocols *protocol)</div></div>
+<div class="ttc" id="group__usercb_html_ggad62860e19975ba4c4af401c3cdb6abf7aa87d2e82fffa42c3680c7403ef94216e"><div class="ttname"><a href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aa87d2e82fffa42c3680c7403ef94216e">LWS_CALLBACK_CHANGE_MODE_POLL_FD</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:796</div></div>
+<div class="ttc" id="structlws__client__connect__info_html_a7732b996e977393c3e1076be2a8ded6c"><div class="ttname"><a href="structlws__client__connect__info.html#a7732b996e977393c3e1076be2a8ded6c">lws_client_connect_info::client_exts</a></div><div class="ttdeci">const struct lws_extension * client_exts</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1828</div></div>
+<div class="ttc" id="structlws__http__mount_html_a6a9b1492a0b9749e39bd19932717a0b7"><div class="ttname"><a href="structlws__http__mount.html#a6a9b1492a0b9749e39bd19932717a0b7">lws_http_mount::origin_protocol</a></div><div class="ttdeci">unsigned char origin_protocol</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1791</div></div>
+<div class="ttc" id="structlws__context__creation__info_html_ad0e95ba721f7bd2b676719f8093c23a2"><div class="ttname"><a href="structlws__context__creation__info.html#ad0e95ba721f7bd2b676719f8093c23a2">lws_context_creation_info::log_filepath</a></div><div class="ttdeci">const char * log_filepath</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1521</div></div>
+<div class="ttc" id="group__usercb_html_ggad62860e19975ba4c4af401c3cdb6abf7afedadfb3cde37a8ea4c84ed535f26d09"><div class="ttname"><a href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7afedadfb3cde37a8ea4c84ed535f26d09">LWS_CALLBACK_HTTP_WRITEABLE</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:636</div></div>
+<div class="ttc" id="structlws__email_html_a7bbc1964889c984b3da723c86a210e05"><div class="ttname"><a href="structlws__email.html#a7bbc1964889c984b3da723c86a210e05">lws_email::max_content_size</a></div><div class="ttdeci">unsigned int max_content_size</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:3839</div></div>
+<div class="ttc" id="structlws__ext__option__arg_html_af57fffcfa253dfa8d98681ac1fb1785f"><div class="ttname"><a href="structlws__ext__option__arg.html#af57fffcfa253dfa8d98681ac1fb1785f">lws_ext_option_arg::option_index</a></div><div class="ttdeci">int option_index</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:973</div></div>
+<div class="ttc" id="group__misc_html_gacae4d7b6a8d22e4c2d82ff8b12c1e234"><div class="ttname"><a href="group__misc.html#gacae4d7b6a8d22e4c2d82ff8b12c1e234">lws_get_child</a></div><div class="ttdeci">LWS_VISIBLE LWS_EXTERN struct lws *LWS_WARN_UNUSED_RESULT lws_get_child(const struct lws *wsi)</div></div>
+<div class="ttc" id="group__HTTP-headers-create_html_gaf74adb761b22566ad70004882712dce1"><div class="ttname"><a href="group__HTTP-headers-create.html#gaf74adb761b22566ad70004882712dce1">lws_add_http_header_by_token</a></div><div class="ttdeci">LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT lws_add_http_header_by_token(struct lws *wsi, enum lws_token_indexes token, const unsigned char *value, int length, unsigned char **p, unsigned char *end)</div></div>
+<div class="ttc" id="group__usercb_html_ggad62860e19975ba4c4af401c3cdb6abf7a2fce9a8608220f32abbf1422a5498804"><div class="ttname"><a href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a2fce9a8608220f32abbf1422a5498804">LWS_CALLBACK_HTTP_BODY_COMPLETION</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:632</div></div>
+<div class="ttc" id="structlws__client__connect__info_html_a9959ba103d3d2484e559a9f7879eebe3"><div class="ttname"><a href="structlws__client__connect__info.html#a9959ba103d3d2484e559a9f7879eebe3">lws_client_connect_info::uri_replace_to</a></div><div class="ttdeci">const char * uri_replace_to</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1840</div></div>
+<div class="ttc" id="structlws__client__connect__info_html_a6843a60e1050b10db9d98d7eeb45f587"><div class="ttname"><a href="structlws__client__connect__info.html#a6843a60e1050b10db9d98d7eeb45f587">lws_client_connect_info::parent_wsi</a></div><div class="ttdeci">struct lws * parent_wsi</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1833</div></div>
+<div class="ttc" id="group__sha_html_ga66316e6a5a0644a09d5a10e919dfdd8d"><div class="ttname"><a href="group__sha.html#ga66316e6a5a0644a09d5a10e919dfdd8d">lws_b64_decode_string</a></div><div class="ttdeci">LWS_VISIBLE LWS_EXTERN int lws_b64_decode_string(const char *in, char *out, int out_size)</div></div>
+<div class="ttc" id="structlws__email_html_ac6115d3cbef2e8bac62cc00895bf5fd3"><div class="ttname"><a href="structlws__email.html#ac6115d3cbef2e8bac62cc00895bf5fd3">lws_email::estate</a></div><div class="ttdeci">enum lwsgs_smtp_states estate</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:3862</div></div>
+<div class="ttc" id="group__form-parsing_html_ga83835bf250ee3d4a60f36a182f2b8d24"><div class="ttname"><a href="group__form-parsing.html#ga83835bf250ee3d4a60f36a182f2b8d24">lws_spa_finalize</a></div><div class="ttdeci">LWS_VISIBLE LWS_EXTERN int lws_spa_finalize(struct lws_spa *spa)</div></div>
+<div class="ttc" id="group__usercb_html_ggad62860e19975ba4c4af401c3cdb6abf7a24d39bf1cfc0bad9d92da9ac1717e439"><div class="ttname"><a href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a24d39bf1cfc0bad9d92da9ac1717e439">LWS_CALLBACK_ESTABLISHED</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:572</div></div>
+<div class="ttc" id="group__misc_html_ga629f48268fd1856b54b11172991b97d9"><div class="ttname"><a href="group__misc.html#ga629f48268fd1856b54b11172991b97d9">lws_get_count_threads</a></div><div class="ttdeci">LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT lws_get_count_threads(struct lws_context *context)</div></div>
+<div class="ttc" id="structlws__context__creation__info_html_a8122cfc0810bafe51edb3ba6bf9a1251"><div class="ttname"><a href="structlws__context__creation__info.html#a8122cfc0810bafe51edb3ba6bf9a1251">lws_context_creation_info::plugin_dirs</a></div><div class="ttdeci">const char *const * plugin_dirs</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1512</div></div>
+<div class="ttc" id="structlws__plugin_html_af4ac8fcb79e10e0c2d960e1804d98105"><div class="ttname"><a href="structlws__plugin.html#af4ac8fcb79e10e0c2d960e1804d98105">lws_plugin::name</a></div><div class="ttdeci">char name[64]</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1264</div></div>
+<div class="ttc" id="group__HTTP-headers-read_html_ga594f3d0ece5b09c2ccf9f98ea533bb4e"><div class="ttname"><a href="group__HTTP-headers-read.html#ga594f3d0ece5b09c2ccf9f98ea533bb4e">lws_hdr_fragment_length</a></div><div class="ttdeci">LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT lws_hdr_fragment_length(struct lws *wsi, enum lws_token_indexes h, int frag_idx)</div></div>
+<div class="ttc" id="libwebsockets_8h_html_a27bb0b3cdcd0af839c928c253b521ff4"><div class="ttname"><a href="libwebsockets_8h.html#a27bb0b3cdcd0af839c928c253b521ff4">lws_cgi_kill</a></div><div class="ttdeci">LWS_VISIBLE LWS_EXTERN int lws_cgi_kill(struct lws *wsi)</div></div>
+<div class="ttc" id="structlws__email_html_a8f34ec0643a817be67ef4276aeb7fb82"><div class="ttname"><a href="structlws__email.html#a8f34ec0643a817be67ef4276aeb7fb82">lws_email::email_buf</a></div><div class="ttdeci">char email_buf[256]</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:3866</div></div>
+<div class="ttc" id="group__wsstatus_html_ga26a140623d202dd2bf2004deb6994baa"><div class="ttname"><a href="group__wsstatus.html#ga26a140623d202dd2bf2004deb6994baa">lws_is_ssl</a></div><div class="ttdeci">LWS_VISIBLE LWS_EXTERN int lws_is_ssl(struct lws *wsi)</div></div>
+<div class="ttc" id="group__context-and-vhost_html_gga41c2d763f78cc248df3b9f8645dbd2a5a6582c985ee0ceaadc1d277030eae2d7c"><div class="ttname"><a href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a6582c985ee0ceaadc1d277030eae2d7c">LWS_SERVER_OPTION_SKIP_SERVER_CANONICAL_NAME</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1353</div></div>
+<div class="ttc" id="structlws__plat__file__ops_html_a034ec96f2fbaf52b4aa3e82d20795f7b"><div class="ttname"><a href="structlws__plat__file__ops.html#a034ec96f2fbaf52b4aa3e82d20795f7b">lws_plat_file_ops::close</a></div><div class="ttdeci">int(* close)(struct lws *wsi, lws_filefd_type fd)</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:3683</div></div>
+<div class="ttc" id="structlws__plugin_html_af9e1042dc1de5b9d202c2f5fd1834330"><div class="ttname"><a href="structlws__plugin.html#af9e1042dc1de5b9d202c2f5fd1834330">lws_plugin::lib</a></div><div class="ttdeci">uv_lib_t lib</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1260</div></div>
+<div class="ttc" id="structlws__polarssl__context_html_ae7e11c9129ff71c7ee71b3b2e320ff27"><div class="ttname"><a href="structlws__polarssl__context.html#ae7e11c9129ff71c7ee71b3b2e320ff27">lws_polarssl_context::certificate</a></div><div class="ttdeci">x509_crt certificate</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:236</div></div>
+<div class="ttc" id="group__net_html_ga092e5f473b3347f03ffeef8a950080f3"><div class="ttname"><a href="group__net.html#ga092e5f473b3347f03ffeef8a950080f3">lws_get_peer_addresses</a></div><div class="ttdeci">LWS_VISIBLE LWS_EXTERN void lws_get_peer_addresses(struct lws *wsi, lws_sockfd_type fd, char *name, int name_len, char *rip, int rip_len)</div></div>
+<div class="ttc" id="group__smtp_html_gga116be79bf44f9dc2a97f46e051fe4dc0ab89442b7a3ca2b94c3cdcf33756eb933"><div class="ttname"><a href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0ab89442b7a3ca2b94c3cdcf33756eb933">LGSSMTP_CONNECTING</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:3817</div></div>
+<div class="ttc" id="group__wsstatus_html_ga4ad226d5e01024b4046f4a5a37199aa1"><div class="ttname"><a href="group__wsstatus.html#ga4ad226d5e01024b4046f4a5a37199aa1">lws_is_cgi</a></div><div class="ttdeci">LWS_VISIBLE LWS_EXTERN int lws_is_cgi(struct lws *wsi)</div></div>
+<div class="ttc" id="structlws__client__connect__info_html_a9862297827639238a7a0b4054c3ddf3d"><div class="ttname"><a href="structlws__client__connect__info.html#a9862297827639238a7a0b4054c3ddf3d">lws_client_connect_info::ssl_connection</a></div><div class="ttdeci">int ssl_connection</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1814</div></div>
+<div class="ttc" id="group__generic-sessions_html_ggaa93946b3d921072209d5cd8cdfa5332ea596010a165bf13473c5eea3a34cd4308"><div class="ttname"><a href="group__generic-sessions.html#ggaa93946b3d921072209d5cd8cdfa5332ea596010a165bf13473c5eea3a34cd4308">LWSGSE_CREATED</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1312</div></div>
+<div class="ttc" id="structlws__context__creation__info_html_a1654d41bea6fb2f619b57e6a264b26a4"><div class="ttname"><a href="structlws__context__creation__info.html#a1654d41bea6fb2f619b57e6a264b26a4">lws_context_creation_info::provided_client_ssl_ctx</a></div><div class="ttdeci">SSL_CTX * provided_client_ssl_ctx</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1476</div></div>
+<div class="ttc" id="libwebsockets_8h_html_adf4abd01e8c43f07c6e498ce13590c3e"><div class="ttname"><a href="libwebsockets_8h.html#adf4abd01e8c43f07c6e498ce13590c3e">lws_rx_flow_control</a></div><div class="ttdeci">LWS_VISIBLE LWS_EXTERN int lws_rx_flow_control(struct lws *wsi, int enable)</div></div>
+<div class="ttc" id="structlws__process__html__args_html"><div class="ttname"><a href="structlws__process__html__args.html">lws_process_html_args</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:2165</div></div>
+<div class="ttc" id="group__fops_html_gac08aef64c4c34647ed699b24759b6b0e"><div class="ttname"><a href="group__fops.html#gac08aef64c4c34647ed699b24759b6b0e">lws_get_fops</a></div><div class="ttdeci">LWS_VISIBLE LWS_EXTERN struct lws_plat_file_ops *LWS_WARN_UNUSED_RESULT lws_get_fops(struct lws_context *context)</div></div>
+<div class="ttc" id="structlws__pollargs_html"><div class="ttname"><a href="structlws__pollargs.html">lws_pollargs</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:438</div></div>
+<div class="ttc" id="structlws__http__mount_html_ae7b5c0f4c5408061e6ea3a8d281f45af"><div class="ttname"><a href="structlws__http__mount.html#ae7b5c0f4c5408061e6ea3a8d281f45af">lws_http_mount::cgienv</a></div><div class="ttdeci">const struct lws_protocol_vhost_options * cgienv</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1771</div></div>
+<div class="ttc" id="structlws__protocol__vhost__options_html_acf9db77f8eb64cd4e314be9b43d8a8b9"><div class="ttname"><a href="structlws__protocol__vhost__options.html#acf9db77f8eb64cd4e314be9b43d8a8b9">lws_protocol_vhost_options::name</a></div><div class="ttdeci">const char * name</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1737</div></div>
+<div class="ttc" id="structlws__http__mount_html_ac8489b60b8f969eb19c9abbdeac90743"><div class="ttname"><a href="structlws__http__mount.html#ac8489b60b8f969eb19c9abbdeac90743">lws_http_mount::mountpoint_len</a></div><div class="ttdeci">unsigned char mountpoint_len</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1792</div></div>
+<div class="ttc" id="group__sending-data_html_gga98b099cf8c1c7e38ad78501f270e193da10047eb05b5e1c298151dc47a5b44826"><div class="ttname"><a href="group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193da10047eb05b5e1c298151dc47a5b44826">LWS_WRITE_CONTINUATION</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:2901</div></div>
+<div class="ttc" id="group__context-and-vhost_html_gga41c2d763f78cc248df3b9f8645dbd2a5a1b2f8bde0f62adc7ebe81b2043f34c0c"><div class="ttname"><a href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a1b2f8bde0f62adc7ebe81b2043f34c0c">LWS_SERVER_OPTION_SSL_ECDH</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1371</div></div>
+<div class="ttc" id="structlws__pollfd_html_a714cf5ca90b41926117fdde9fa6542be"><div class="ttname"><a href="structlws__pollfd.html#a714cf5ca90b41926117fdde9fa6542be">lws_pollfd::fd</a></div><div class="ttdeci">lws_sockfd_type fd</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:398</div></div>
+<div class="ttc" id="group__vhost-mounts_html_gga31eca18e50cb4357480f2fcad36ff437a42f2361cfe76cd287fa8fcfc502357e2"><div class="ttname"><a href="group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437a42f2361cfe76cd287fa8fcfc502357e2">LWSMPRO_FILE</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1748</div></div>
+<div class="ttc" id="group__wsstatus_html_ga08e9ee165fca503fd9427d55cfecac37"><div class="ttname"><a href="group__wsstatus.html#ga08e9ee165fca503fd9427d55cfecac37">lws_is_final_fragment</a></div><div class="ttdeci">LWS_VISIBLE LWS_EXTERN int lws_is_final_fragment(struct lws *wsi)</div></div>
+<div class="ttc" id="structlws__context__creation__info_html_a4a3d1155fc52f5048b481884f6fb947c"><div class="ttname"><a href="structlws__context__creation__info.html#a4a3d1155fc52f5048b481884f6fb947c">lws_context_creation_info::extensions</a></div><div class="ttdeci">const struct lws_extension * extensions</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1427</div></div>
+<div class="ttc" id="group__context-and-vhost_html_gga41c2d763f78cc248df3b9f8645dbd2a5a1cc4562d05cba52a6dfa0697a65ade0d"><div class="ttname"><a href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a1cc4562d05cba52a6dfa0697a65ade0d">LWS_SERVER_OPTION_ALLOW_NON_SSL_ON_SSL_PORT</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1355</div></div>
+<div class="ttc" id="group__Protocols-and-Plugins_html_gaec0c0477288ff3f83aff38d357b883d1"><div class="ttname"><a href="group__Protocols-and-Plugins.html#gaec0c0477288ff3f83aff38d357b883d1">lws_protocol_vh_priv_zalloc</a></div><div class="ttdeci">LWS_VISIBLE LWS_EXTERN void * lws_protocol_vh_priv_zalloc(struct lws_vhost *vhost, const struct lws_protocols *prot, int size)</div></div>
+<div class="ttc" id="group__context-and-vhost_html_gga41c2d763f78cc248df3b9f8645dbd2a5a273d9975675130de0c6dc937dde7c8a6"><div class="ttname"><a href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a273d9975675130de0c6dc937dde7c8a6">LWS_SERVER_OPTION_LIBEV</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1360</div></div>
+<div class="ttc" id="group__extensions_html_gacc9f55936dc165257a2e1f7d47bce89e"><div class="ttname"><a href="group__extensions.html#gacc9f55936dc165257a2e1f7d47bce89e">lws_ext_options_types</a></div><div class="ttdeci">lws_ext_options_types</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:949</div></div>
+<div class="ttc" id="structlws__context__creation__info_html_abb90ffb3e6d6db2db20f529d61bd9122"><div class="ttname"><a href="structlws__context__creation__info.html#abb90ffb3e6d6db2db20f529d61bd9122">lws_context_creation_info::protocols</a></div><div class="ttdeci">const struct lws_protocols * protocols</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1423</div></div>
+<div class="ttc" id="group__context-and-vhost_html_ga98d88c9080fd89c37114363a6474ea73"><div class="ttname"><a href="group__context-and-vhost.html#ga98d88c9080fd89c37114363a6474ea73">lwsws_get_config_globals</a></div><div class="ttdeci">LWS_VISIBLE LWS_EXTERN int lwsws_get_config_globals(struct lws_context_creation_info *info, const char *d, char **config_strings, int *len)</div></div>
+<div class="ttc" id="group__misc_html_gaa194584fff9698f3b280658f770ccd0f"><div class="ttname"><a href="group__misc.html#gaa194584fff9698f3b280658f770ccd0f">lws_wsi_user</a></div><div class="ttdeci">LWS_VISIBLE LWS_EXTERN void * lws_wsi_user(struct lws *wsi)</div></div>
+<div class="ttc" id="group__misc_html_ga33bf2635033710b25f931b57ed663e1e"><div class="ttname"><a href="group__misc.html#ga33bf2635033710b25f931b57ed663e1e">lws_now_secs</a></div><div class="ttdeci">LWS_VISIBLE LWS_EXTERN unsigned long lws_now_secs(void)</div></div>
+<div class="ttc" id="group__net_html_gad01014fed09759741b6d23afccfdaacc"><div class="ttname"><a href="group__net.html#gad01014fed09759741b6d23afccfdaacc">lws_get_peer_simple</a></div><div class="ttdeci">LWS_VISIBLE LWS_EXTERN const char * lws_get_peer_simple(struct lws *wsi, char *name, int namelen)</div></div>
+<div class="ttc" id="structlws__ext__option__arg_html_a0b1f7b30c3ceaf5f1bf9d105c24568d1"><div class="ttname"><a href="structlws__ext__option__arg.html#a0b1f7b30c3ceaf5f1bf9d105c24568d1">lws_ext_option_arg::start</a></div><div class="ttdeci">const char * start</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:974</div></div>
+<div class="ttc" id="structlws__context__creation__info_html_a3e1516fd7fed26bfa77c0246ed26c2eb"><div class="ttname"><a href="structlws__context__creation__info.html#a3e1516fd7fed26bfa77c0246ed26c2eb">lws_context_creation_info::ssl_cipher_list</a></div><div class="ttdeci">const char * ssl_cipher_list</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1447</div></div>
+<div class="ttc" id="group__HTTP-headers-create_html_ga2b36bf44405755ff51c1939303b995a8"><div class="ttname"><a href="group__HTTP-headers-create.html#ga2b36bf44405755ff51c1939303b995a8">lws_add_http_header_by_name</a></div><div class="ttdeci">LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT lws_add_http_header_by_name(struct lws *wsi, const unsigned char *name, const unsigned char *value, int length, unsigned char **p, unsigned char *end)</div></div>
+<div class="ttc" id="structlws__http__mount_html_aa2391bfcada0b7a290b3c6651f64586c"><div class="ttname"><a href="structlws__http__mount.html#aa2391bfcada0b7a290b3c6651f64586c">lws_http_mount::mountpoint</a></div><div class="ttdeci">const char * mountpoint</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1762</div></div>
+<div class="ttc" id="structlws__context__creation__info_html_aef917c0b23976a264d2474901b4f5aa3"><div class="ttname"><a href="structlws__context__creation__info.html#aef917c0b23976a264d2474901b4f5aa3">lws_context_creation_info::http_proxy_address</a></div><div class="ttdeci">const char * http_proxy_address</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1451</div></div>
+<div class="ttc" id="group__client_html_gac30a7be106abd0cedfbb2e8b8fe3a2f5"><div class="ttname"><a href="group__client.html#gac30a7be106abd0cedfbb2e8b8fe3a2f5">lws_client_connect_via_info</a></div><div class="ttdeci">LWS_VISIBLE LWS_EXTERN struct lws *LWS_WARN_UNUSED_RESULT lws_client_connect_via_info(struct lws_client_connect_info *ccinfo)</div></div>
+<div class="ttc" id="group__usercb_html_ggad62860e19975ba4c4af401c3cdb6abf7ae5ad65d779b7eab32ab67ceff91a3bac"><div class="ttname"><a href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ae5ad65d779b7eab32ab67ceff91a3bac">LWS_CALLBACK_OPENSSL_PERFORM_CLIENT_CERT_VERIFICATION</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:694</div></div>
+<div class="ttc" id="structlws__polarssl__context_html_a919c33af37aab170f828d954de1fa270"><div class="ttname"><a href="structlws__polarssl__context.html#a919c33af37aab170f828d954de1fa270">lws_polarssl_context::key</a></div><div class="ttdeci">rsa_context key</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:237</div></div>
+<div class="ttc" id="structlws__context__creation__info_html_ac62b0f0e8e402412ba5011d15c244103"><div class="ttname"><a href="structlws__context__creation__info.html#ac62b0f0e8e402412ba5011d15c244103">lws_context_creation_info::ssl_cert_filepath</a></div><div class="ttdeci">const char * ssl_cert_filepath</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1435</div></div>
+<div class="ttc" id="structlws__context__creation__info_html_afa5d4e7d9f86b58a1c6fac14f0a5f5f9"><div class="ttname"><a href="structlws__context__creation__info.html#afa5d4e7d9f86b58a1c6fac14f0a5f5f9">lws_context_creation_info::ecdh_curve</a></div><div class="ttdeci">const char * ecdh_curve</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1506</div></div>
+<div class="ttc" id="structlws__http__mount_html_a4a7239d6d4c03986e6e1a72abb6c83aa"><div class="ttname"><a href="structlws__http__mount.html#a4a7239d6d4c03986e6e1a72abb6c83aa">lws_http_mount::cgi_timeout</a></div><div class="ttdeci">int cgi_timeout</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1780</div></div>
+<div class="ttc" id="group__vhost-mounts_html_gga31eca18e50cb4357480f2fcad36ff437aec137a2434851bd856ceebfb697b9970"><div class="ttname"><a href="group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437aec137a2434851bd856ceebfb697b9970">LWSMPRO_REDIR_HTTP</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1750</div></div>
+<div class="ttc" id="group__generic-sessions_html_gga7c2dc7bfb4ccb91c5d771f9e9ea237e1a2cd8fb86e3b85c106e7711c03f0ddd0a"><div class="ttname"><a href="group__generic-sessions.html#gga7c2dc7bfb4ccb91c5d771f9e9ea237e1a2cd8fb86e3b85c106e7711c03f0ddd0a">LWSGS_AUTH_FORGOT_FLOW</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1297</div></div>
+<div class="ttc" id="structpollfd_html"><div class="ttname"><a href="structpollfd.html">pollfd</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:409</div></div>
+<div class="ttc" id="group__wsclose_html_ggae399c571df32ba532c0ca67da9284985ad09e68295eabdddcba4e332fbea70ae5"><div class="ttname"><a href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985ad09e68295eabdddcba4e332fbea70ae5">LWS_CLOSE_STATUS_POLICY_VIOLATION</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:495</div></div>
+<div class="ttc" id="group__wsstatus_html_ga3df5045656dfb6b0e63a38de2dca79d2"><div class="ttname"><a href="group__wsstatus.html#ga3df5045656dfb6b0e63a38de2dca79d2">lws_get_reserved_bits</a></div><div class="ttdeci">LWS_VISIBLE LWS_EXTERN unsigned char lws_get_reserved_bits(struct lws *wsi)</div></div>
+<div class="ttc" id="group__sha_html_ga7b09ab74646266f0b555103b3bb8dfe5"><div class="ttname"><a href="group__sha.html#ga7b09ab74646266f0b555103b3bb8dfe5">lws_SHA1</a></div><div class="ttdeci">LWS_VISIBLE LWS_EXTERN unsigned char * lws_SHA1(const unsigned char *d, size_t n, unsigned char *md)</div></div>
+<div class="ttc" id="group__HTTP-headers-read_html_ga2c0597b2ef1d2cee35736c338bcbd17b"><div class="ttname"><a href="group__HTTP-headers-read.html#ga2c0597b2ef1d2cee35736c338bcbd17b">lws_token_to_string</a></div><div class="ttdeci">LWS_VISIBLE LWS_EXTERN const unsigned char * lws_token_to_string(enum lws_token_indexes token)</div></div>
+<div class="ttc" id="group__extensions_html_gae0e24e1768f83a7fb07896ce975704b9"><div class="ttname"><a href="group__extensions.html#gae0e24e1768f83a7fb07896ce975704b9">lws_set_extension_option</a></div><div class="ttdeci">LWS_VISIBLE LWS_EXTERN int lws_set_extension_option(struct lws *wsi, const char *ext_name, const char *opt_name, const char *opt_val)</div></div>
+<div class="ttc" id="group__usercb_html_ggad62860e19975ba4c4af401c3cdb6abf7abbbe7a0a67c5866ca9109d46823fc5b1"><div class="ttname"><a href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7abbbe7a0a67c5866ca9109d46823fc5b1">LWS_CALLBACK_CLIENT_RECEIVE</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:600</div></div>
+<div class="ttc" id="libwebsockets_8h_html_af52923473c59e643a974d65e12290831"><div class="ttname"><a href="libwebsockets_8h.html#af52923473c59e643a974d65e12290831">lws_cgi</a></div><div class="ttdeci">LWS_VISIBLE LWS_EXTERN int lws_cgi(struct lws *wsi, const char *const *exec_array, int script_uri_path_len, int timeout_secs, const struct lws_protocol_vhost_options *mp_cgienv)</div></div>
+<div class="ttc" id="group__client_html_ga4af0a20108a95e8b6d94dd4d80055ff3"><div class="ttname"><a href="group__client.html#ga4af0a20108a95e8b6d94dd4d80055ff3">lws_client_connect</a></div><div class="ttdeci">LWS_VISIBLE LWS_EXTERN struct lws *LWS_WARN_UNUSED_RESULT lws_client_connect(struct lws_context *clients, const char *address, int port, int ssl_connection, const char *path, const char *host, const char *origin, const char *protocol, int ietf_version_or_minus_one) LWS_WARN_DEPRECATED</div></div>
+<div class="ttc" id="group__usercb_html_ggad62860e19975ba4c4af401c3cdb6abf7aa627548e1296e654fcfab463ec3c9587"><div class="ttname"><a href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aa627548e1296e654fcfab463ec3c9587">LWS_CALLBACK_HTTP_FILE_COMPLETION</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:634</div></div>
+<div class="ttc" id="group__context-and-vhost_html_ga341064721add2618ae1b29717493a212"><div class="ttname"><a href="group__context-and-vhost.html#ga341064721add2618ae1b29717493a212">lwsws_get_config_vhosts</a></div><div class="ttdeci">LWS_VISIBLE LWS_EXTERN int lwsws_get_config_vhosts(struct lws_context *context, struct lws_context_creation_info *info, const char *d, char **config_strings, int *len)</div></div>
+<div class="ttc" id="group__context-and-vhost_html_gga41c2d763f78cc248df3b9f8645dbd2a5a7fed6a527c8d5e0acac1b4179644583a"><div class="ttname"><a href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a7fed6a527c8d5e0acac1b4179644583a">LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1381</div></div>
+<div class="ttc" id="group__log_html_ga42e39775c6b69b7251bdbf5a2cdd5dcd"><div class="ttname"><a href="group__log.html#ga42e39775c6b69b7251bdbf5a2cdd5dcd">lwsl_timestamp</a></div><div class="ttdeci">LWS_VISIBLE LWS_EXTERN int lwsl_timestamp(int level, char *p, int len)</div></div>
+<div class="ttc" id="group__context-and-vhost_html_gga41c2d763f78cc248df3b9f8645dbd2a5aca5d42820b65eac5618ec3f0bd8a1160"><div class="ttname"><a href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5aca5d42820b65eac5618ec3f0bd8a1160">LWS_SERVER_OPTION_IPV6_V6ONLY_VALUE</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1393</div></div>
+<div class="ttc" id="structlws__email_html_a77723e2f2b940b1c879ef5e1cd88c2be"><div class="ttname"><a href="structlws__email.html#a77723e2f2b940b1c879ef5e1cd88c2be">lws_email::timeout_email</a></div><div class="ttdeci">uv_timer_t timeout_email</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:3861</div></div>
+<div class="ttc" id="group__context-and-vhost_html_gga41c2d763f78cc248df3b9f8645dbd2a5a34ab36e68c0d593b6f19b8d5ef1240a9"><div class="ttname"><a href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a34ab36e68c0d593b6f19b8d5ef1240a9">LWS_SERVER_OPTION_DISABLE_IPV6</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1362</div></div>
+<div class="ttc" id="structlws__context__creation__info_html_a0b154e79abc1167ba4ac3539f4af6720"><div class="ttname"><a href="structlws__context__creation__info.html#a0b154e79abc1167ba4ac3539f4af6720">lws_context_creation_info::max_http_header_pool</a></div><div class="ttdeci">short max_http_header_pool</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1488</div></div>
+<div class="ttc" id="group__html-chunked-substitution_html_ga643073f918c0a7016b690aae9793fd60"><div class="ttname"><a href="group__html-chunked-substitution.html#ga643073f918c0a7016b690aae9793fd60">lws_chunked_html_process</a></div><div class="ttdeci">LWS_VISIBLE LWS_EXTERN int lws_chunked_html_process(struct lws_process_html_args *args, struct lws_process_html_state *s)</div></div>
+<div class="ttc" id="structlws__process__html__args_html_a11859d8bedd379fbf64543b25c65fe14"><div class="ttname"><a href="structlws__process__html__args.html#a11859d8bedd379fbf64543b25c65fe14">lws_process_html_args::p</a></div><div class="ttdeci">char * p</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:2166</div></div>
+<div class="ttc" id="structlws__polarssl__context_html_a1872f2ea24878d807ae20ca8513674af"><div class="ttname"><a href="structlws__polarssl__context.html#a1872f2ea24878d807ae20ca8513674af">lws_polarssl_context::ca</a></div><div class="ttdeci">x509_crt ca</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:235</div></div>
+<div class="ttc" id="structlws__protocols_html_a9bbd85f591ffb4259711cb5acbb05bea"><div class="ttname"><a href="structlws__protocols.html#a9bbd85f591ffb4259711cb5acbb05bea">lws_protocols::per_session_data_size</a></div><div class="ttdeci">size_t per_session_data_size</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1143</div></div>
+<div class="ttc" id="group__wsclose_html_ggae399c571df32ba532c0ca67da9284985a4b8a3b7ce6f731e5248e4b0fb64a5044"><div class="ttname"><a href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a4b8a3b7ce6f731e5248e4b0fb64a5044">LWS_CLOSE_STATUS_NO_STATUS</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:479</div></div>
+<div class="ttc" id="group__smtp_html_ga116be79bf44f9dc2a97f46e051fe4dc0"><div class="ttname"><a href="group__smtp.html#ga116be79bf44f9dc2a97f46e051fe4dc0">lwsgs_smtp_states</a></div><div class="ttdeci">lwsgs_smtp_states</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:3815</div></div>
+<div class="ttc" id="group__context-and-vhost_html_gga41c2d763f78cc248df3b9f8645dbd2a5aff121db04a10cf8b2c5df9d4f2b89f1e"><div class="ttname"><a href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5aff121db04a10cf8b2c5df9d4f2b89f1e">LWS_SERVER_OPTION_LIBUV</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1374</div></div>
+<div class="ttc" id="group__usercb_html_ggad62860e19975ba4c4af401c3cdb6abf7a909cc2a7018864b0b71abacc4058fd8f"><div class="ttname"><a href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a909cc2a7018864b0b71abacc4058fd8f">LWS_CALLBACK_CLIENT_APPEND_HANDSHAKE_HEADER</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:712</div></div>
+<div class="ttc" id="group__usercb_html_ggad62860e19975ba4c4af401c3cdb6abf7a2db02fc6e1c17ab62b52109d1aa9d738"><div class="ttname"><a href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a2db02fc6e1c17ab62b52109d1aa9d738">LWS_CALLBACK_RECEIVE_PONG</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:598</div></div>
+<div class="ttc" id="structlws__protocols_html"><div class="ttname"><a href="structlws__protocols.html">lws_protocols</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1135</div></div>
+<div class="ttc" id="group__wsclose_html_ggae399c571df32ba532c0ca67da9284985a68b3d34bebd88547dcfa5cadba0acd6c"><div class="ttname"><a href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a68b3d34bebd88547dcfa5cadba0acd6c">LWS_CLOSE_STATUS_ABNORMAL_CLOSE</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:484</div></div>
+<div class="ttc" id="group__http_html_ga8fbf01e473ac421fc33ad9f8da8b8a25"><div class="ttname"><a href="group__http.html#ga8fbf01e473ac421fc33ad9f8da8b8a25">lws_http_redirect</a></div><div class="ttdeci">LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT lws_http_redirect(struct lws *wsi, int code, const unsigned char *loc, int len, unsigned char **p, unsigned char *end)</div></div>
+<div class="ttc" id="structlws__context__creation__info_html_ae52f3237e144e9ddcab5e2cf91d1e419"><div class="ttname"><a href="structlws__context__creation__info.html#ae52f3237e144e9ddcab5e2cf91d1e419">lws_context_creation_info::count_threads</a></div><div class="ttdeci">unsigned int count_threads</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1495</div></div>
+<div class="ttc" id="structlws__gs__event__args_html_acd17e4f9f91f7f9a8f0fbf0744a3a463"><div class="ttname"><a href="structlws__gs__event__args.html#acd17e4f9f91f7f9a8f0fbf0744a3a463">lws_gs_event_args::email</a></div><div class="ttdeci">const char * email</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1320</div></div>
+<div class="ttc" id="group__misc_html_ga58f906c6be0ca80efd813f694569dd4a"><div class="ttname"><a href="group__misc.html#ga58f906c6be0ca80efd813f694569dd4a">lws_get_random</a></div><div class="ttdeci">LWS_VISIBLE LWS_EXTERN int lws_get_random(struct lws_context *context, void *buf, int len)</div></div>
+<div class="ttc" id="group__wsclose_html_ggae399c571df32ba532c0ca67da9284985a9737a68759e739856b150ff9dfa30218"><div class="ttname"><a href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a9737a68759e739856b150ff9dfa30218">LWS_CLOSE_STATUS_GOINGAWAY</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:466</div></div>
+<div class="ttc" id="structlws__email_html_a5f53d4c5a1e34b0dcaa8787e2eabb1b3"><div class="ttname"><a href="structlws__email.html#a5f53d4c5a1e34b0dcaa8787e2eabb1b3">lws_email::email_connect_req</a></div><div class="ttdeci">uv_connect_t email_connect_req</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:3863</div></div>
+<div class="ttc" id="structlws__context__creation__info_html_a137a9b9de4f6a7993fed8746d551e616"><div class="ttname"><a href="structlws__context__creation__info.html#a137a9b9de4f6a7993fed8746d551e616">lws_context_creation_info::server_string</a></div><div class="ttdeci">const char * server_string</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1526</div></div>
+<div class="ttc" id="group__context-and-vhost_html_gga41c2d763f78cc248df3b9f8645dbd2a5a9637e9001d8c8b2521086bcafbd8a941"><div class="ttname"><a href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a9637e9001d8c8b2521086bcafbd8a941">LWS_SERVER_OPTION_UNIX_SOCK</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1386</div></div>
+<div class="ttc" id="structlws__pollfd_html_ac393db6fc7fb6ed8fe7ca20936908ee9"><div class="ttname"><a href="structlws__pollfd.html#ac393db6fc7fb6ed8fe7ca20936908ee9">lws_pollfd::events</a></div><div class="ttdeci">SHORT events</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:399</div></div>
+<div class="ttc" id="group__usercb_html_ggad62860e19975ba4c4af401c3cdb6abf7a136a7cec11c3afd13245623bd84e76c9"><div class="ttname"><a href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a136a7cec11c3afd13245623bd84e76c9">LWS_CALLBACK_CLIENT_RECEIVE_PONG</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:603</div></div>
+<div class="ttc" id="group__context-and-vhost_html_gga41c2d763f78cc248df3b9f8645dbd2a5aa0158b4e85420811e6b0f1378c6ded0f"><div class="ttname"><a href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5aa0158b4e85420811e6b0f1378c6ded0f">LWS_SERVER_OPTION_VALIDATE_UTF8</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1369</div></div>
+<div class="ttc" id="structlws__context__creation__info_html_ad50db098a208f045f7811207d2bee4b9"><div class="ttname"><a href="structlws__context__creation__info.html#ad50db098a208f045f7811207d2bee4b9">lws_context_creation_info::vhost_name</a></div><div class="ttdeci">const char * vhost_name</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1508</div></div>
+<div class="ttc" id="group__vhost-mounts_html_gga31eca18e50cb4357480f2fcad36ff437a8894d16316863077dfe530963ca59f67"><div class="ttname"><a href="group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437a8894d16316863077dfe530963ca59f67">LWSMPRO_REDIR_HTTPS</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1751</div></div>
+<div class="ttc" id="group__Protocols-and-Plugins_html_ga72ad550786ca7976463589d347e62112"><div class="ttname"><a href="group__Protocols-and-Plugins.html#ga72ad550786ca7976463589d347e62112">lws_get_protocol</a></div><div class="ttdeci">LWS_VISIBLE LWS_EXTERN const struct lws_protocols * lws_get_protocol(struct lws *wsi)</div></div>
+<div class="ttc" id="group__generic-sessions_html_gga7c2dc7bfb4ccb91c5d771f9e9ea237e1a0657a9e846814781b128c397fe4b10bf"><div class="ttname"><a href="group__generic-sessions.html#gga7c2dc7bfb4ccb91c5d771f9e9ea237e1a0657a9e846814781b128c397fe4b10bf">LWSGS_AUTH_ADMIN</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1295</div></div>
+<div class="ttc" id="structlws__gs__event__args_html"><div class="ttname"><a href="structlws__gs__event__args.html">lws_gs_event_args</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1317</div></div>
+<div class="ttc" id="structlws__context__creation__info_html_a45e63e24c88289e0c8352377ef4d3646"><div class="ttname"><a href="structlws__context__creation__info.html#a45e63e24c88289e0c8352377ef4d3646">lws_context_creation_info::fd_limit_per_thread</a></div><div class="ttdeci">unsigned int fd_limit_per_thread</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1497</div></div>
+<div class="ttc" id="libwebsockets_8h_html_a5326d3402af8429a166dd991dc65c4a2"><div class="ttname"><a href="libwebsockets_8h.html#a5326d3402af8429a166dd991dc65c4a2">lws_cgi_write_split_stdout_headers</a></div><div class="ttdeci">LWS_VISIBLE LWS_EXTERN int lws_cgi_write_split_stdout_headers(struct lws *wsi)</div></div>
+<div class="ttc" id="group__generic-sessions_html_gaa93946b3d921072209d5cd8cdfa5332e"><div class="ttname"><a href="group__generic-sessions.html#gaa93946b3d921072209d5cd8cdfa5332e">lws_gs_event</a></div><div class="ttdeci">lws_gs_event</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1311</div></div>
+<div class="ttc" id="group__Protocols-and-Plugins_html_ga106b37ae9c247e84d191ab09441adc43"><div class="ttname"><a href="group__Protocols-and-Plugins.html#ga106b37ae9c247e84d191ab09441adc43">lws_finalize_startup</a></div><div class="ttdeci">LWS_VISIBLE LWS_EXTERN int lws_finalize_startup(struct lws_context *context)</div></div>
+<div class="ttc" id="structlws__context__creation__info_html_a381342a398883d6204955ff3c1849ddd"><div class="ttname"><a href="structlws__context__creation__info.html#a381342a398883d6204955ff3c1849ddd">lws_context_creation_info::ka_interval</a></div><div class="ttdeci">int ka_interval</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1472</div></div>
+<div class="ttc" id="group__generic-sessions_html_gga7c2dc7bfb4ccb91c5d771f9e9ea237e1a81e63075115dedd150265d81b8f7fa57"><div class="ttname"><a href="group__generic-sessions.html#gga7c2dc7bfb4ccb91c5d771f9e9ea237e1a81e63075115dedd150265d81b8f7fa57">LWSGS_AUTH_LOGGED_IN</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1294</div></div>
+<div class="ttc" id="structlws__context__creation__info_html_ac105b4180008cb3e672d57beead8382e"><div class="ttname"><a href="structlws__context__creation__info.html#ac105b4180008cb3e672d57beead8382e">lws_context_creation_info::uid</a></div><div class="ttdeci">int uid</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1458</div></div>
+<div class="ttc" id="group__form-parsing_html_gga41a74a822771d3dce89751aa3bce28aea2d25de44865bd44e5a3903a2bab9ca83"><div class="ttname"><a href="group__form-parsing.html#gga41a74a822771d3dce89751aa3bce28aea2d25de44865bd44e5a3903a2bab9ca83">LWS_UFS_OPEN</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:2557</div></div>
+<div class="ttc" id="group__sha_html_gaf39765e4a3b413efb65e4698b2ec3575"><div class="ttname"><a href="group__sha.html#gaf39765e4a3b413efb65e4698b2ec3575">lws_b64_encode_string</a></div><div class="ttdeci">LWS_VISIBLE LWS_EXTERN int lws_b64_encode_string(const char *in, int in_len, char *out, int out_size)</div></div>
+<div class="ttc" id="group__context-and-vhost_html_gaeb12f934bfd178bd2132a9e73fc641da"><div class="ttname"><a href="group__context-and-vhost.html#gaeb12f934bfd178bd2132a9e73fc641da">lws_context_user</a></div><div class="ttdeci">LWS_VISIBLE LWS_EXTERN void * lws_context_user(struct lws_context *context)</div></div>
+<div class="ttc" id="structlws__protocols_html_a0e63edb457a613c3fa4271e0a8f19624"><div class="ttname"><a href="structlws__protocols.html#a0e63edb457a613c3fa4271e0a8f19624">lws_protocols::name</a></div><div class="ttdeci">const char * name</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1136</div></div>
+<div class="ttc" id="group__client_html_ga4f44b8230e6732816ca5cd8d1aaaf340"><div class="ttname"><a href="group__client.html#ga4f44b8230e6732816ca5cd8d1aaaf340">lws_init_vhost_client_ssl</a></div><div class="ttdeci">LWS_VISIBLE LWS_EXTERN int lws_init_vhost_client_ssl(const struct lws_context_creation_info *info, struct lws_vhost *vhost)</div></div>
+<div class="ttc" id="group__smtp_html_gga116be79bf44f9dc2a97f46e051fe4dc0aae20a0cb95b97a70f6b45d0ed2d5be83"><div class="ttname"><a href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0aae20a0cb95b97a70f6b45d0ed2d5be83">LGSSMTP_SENT_TO</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:3821</div></div>
+<div class="ttc" id="structlws__context__creation__info_html_a7b59f2bdc869871e7bde232db94f5ca6"><div class="ttname"><a href="structlws__context__creation__info.html#a7b59f2bdc869871e7bde232db94f5ca6">lws_context_creation_info::http_proxy_port</a></div><div class="ttdeci">unsigned int http_proxy_port</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1454</div></div>
+<div class="ttc" id="group__wsstatus_html_gaeca4afc94b1f026034f99cbba37e2f85"><div class="ttname"><a href="group__wsstatus.html#gaeca4afc94b1f026034f99cbba37e2f85">lws_partial_buffered</a></div><div class="ttdeci">LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT lws_partial_buffered(struct lws *wsi)</div></div>
+<div class="ttc" id="structlws__context__creation__info_html_a6cfa3d51df2def3349a5cbf0d712822d"><div class="ttname"><a href="structlws__context__creation__info.html#a6cfa3d51df2def3349a5cbf0d712822d">lws_context_creation_info::timeout_secs</a></div><div class="ttdeci">unsigned int timeout_secs</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1501</div></div>
+<div class="ttc" id="structlws__context__creation__info_html_a424a5ce268d6903e42243be94487ab85"><div class="ttname"><a href="structlws__context__creation__info.html#a424a5ce268d6903e42243be94487ab85">lws_context_creation_info::port</a></div><div class="ttdeci">int port</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1411</div></div>
+<div class="ttc" id="group__misc_html_ga1ec0d9faac5d3a5824d765c287c043aa"><div class="ttname"><a href="group__misc.html#ga1ec0d9faac5d3a5824d765c287c043aa">lws_parse_uri</a></div><div class="ttdeci">LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT lws_parse_uri(char *p, const char **prot, const char **ads, int *port, const char **path)</div></div>
+<div class="ttc" id="structlws__context__creation__info_html_a9d3b17a25e1fbc772f21eb4959a82724"><div class="ttname"><a href="structlws__context__creation__info.html#a9d3b17a25e1fbc772f21eb4959a82724">lws_context_creation_info::options</a></div><div class="ttdeci">unsigned int options</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1460</div></div>
+<div class="ttc" id="group__form-parsing_html_ga3fbe378632f85ec9a14cc2c1687bf05f"><div class="ttname"><a href="group__form-parsing.html#ga3fbe378632f85ec9a14cc2c1687bf05f">lws_spa_get_length</a></div><div class="ttdeci">LWS_VISIBLE LWS_EXTERN int lws_spa_get_length(struct lws_spa *spa, int n)</div></div>
+<div class="ttc" id="structlws__protocol__vhost__options_html_afd99fbc90be51ea2465b550c2ec47822"><div class="ttname"><a href="structlws__protocol__vhost__options.html#afd99fbc90be51ea2465b550c2ec47822">lws_protocol_vhost_options::options</a></div><div class="ttdeci">const struct lws_protocol_vhost_options * options</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1736</div></div>
+<div class="ttc" id="structlws__pollargs_html_a437fec0de5cf264371e1ab5a401e86d8"><div class="ttname"><a href="structlws__pollargs.html#a437fec0de5cf264371e1ab5a401e86d8">lws_pollargs::prev_events</a></div><div class="ttdeci">int prev_events</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:441</div></div>
+<div class="ttc" id="structlws__context__creation__info_html_a81697c6b763b5ef3ee52862bc70b07d6"><div class="ttname"><a href="structlws__context__creation__info.html#a81697c6b763b5ef3ee52862bc70b07d6">lws_context_creation_info::keepalive_timeout</a></div><div class="ttdeci">int keepalive_timeout</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1518</div></div>
+<div class="ttc" id="structlws__session__info_html"><div class="ttname"><a href="structlws__session__info.html">lws_session_info</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1301</div></div>
+<div class="ttc" id="structlws__ext__options_html"><div class="ttname"><a href="structlws__ext__options.html">lws_ext_options</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:962</div></div>
+<div class="ttc" id="structlws__token__limits_html"><div class="ttname"><a href="structlws__token__limits.html">lws_token_limits</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:2354</div></div>
+<div class="ttc" id="group__sending-data_html_gafd5fdd285a0e25ba7e3e1051deec1001"><div class="ttname"><a href="group__sending-data.html#gafd5fdd285a0e25ba7e3e1051deec1001">lws_write</a></div><div class="ttdeci">LWS_VISIBLE LWS_EXTERN int lws_write(struct lws *wsi, unsigned char *buf, size_t len, enum lws_write_protocol protocol)</div></div>
+<div class="ttc" id="structlws__context__creation__info_html_a999866fcd15dbd621773436f97190458"><div class="ttname"><a href="structlws__context__creation__info.html#a999866fcd15dbd621773436f97190458">lws_context_creation_info::pvo</a></div><div class="ttdeci">const struct lws_protocol_vhost_options * pvo</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1515</div></div>
+<div class="ttc" id="structlws__client__connect__info_html_a9b36d47c3422329df32c21040a35ebc7"><div class="ttname"><a href="structlws__client__connect__info.html#a9b36d47c3422329df32c21040a35ebc7">lws_client_connect_info::host</a></div><div class="ttdeci">const char * host</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1818</div></div>
+<div class="ttc" id="structlws__ext__option__arg_html"><div class="ttname"><a href="structlws__ext__option__arg.html">lws_ext_option_arg</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:971</div></div>
+<div class="ttc" id="group__wsclose_html_ggae399c571df32ba532c0ca67da9284985ac6a161822783ee873be1c66f48d14e0e"><div class="ttname"><a href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985ac6a161822783ee873be1c66f48d14e0e">LWS_CLOSE_STATUS_EXTENSION_REQUIRED</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:505</div></div>
+<div class="ttc" id="group__Protocols-and-Plugins_html_ga25754726d97c5f519d313e691a9fe29d"><div class="ttname"><a href="group__Protocols-and-Plugins.html#ga25754726d97c5f519d313e691a9fe29d">lws_vhost_name_to_protocol</a></div><div class="ttdeci">LWS_VISIBLE LWS_EXTERN const struct lws_protocols * lws_vhost_name_to_protocol(struct lws_vhost *vh, const char *name)</div></div>
+<div class="ttc" id="structlws__cgi__args_html_a36e5c256433c187bd0eaa9c1ca667f1d"><div class="ttname"><a href="structlws__cgi__args.html#a36e5c256433c187bd0eaa9c1ca667f1d">lws_cgi_args::len</a></div><div class="ttdeci">int len</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:3618</div></div>
+<div class="ttc" id="structlws__http__mount_html_ad878546ae1c399bbca7d7f8a0baf973d"><div class="ttname"><a href="structlws__http__mount.html#ad878546ae1c399bbca7d7f8a0baf973d">lws_http_mount::mount_next</a></div><div class="ttdeci">struct lws_http_mount * mount_next</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1760</div></div>
+<div class="ttc" id="group__HTTP-headers-read_html_ga84e9ce5e71a77501a0998ac403a984c2"><div class="ttname"><a href="group__HTTP-headers-read.html#ga84e9ce5e71a77501a0998ac403a984c2">lws_get_urlarg_by_name</a></div><div class="ttdeci">LWS_VISIBLE LWS_EXTERN const char * lws_get_urlarg_by_name(struct lws *wsi, const char *name, char *buf, int len)</div></div>
+<div class="ttc" id="structlws__context__creation__info_html_a75434932bb5df54665ea678eb8ac104a"><div class="ttname"><a href="structlws__context__creation__info.html#a75434932bb5df54665ea678eb8ac104a">lws_context_creation_info::iface</a></div><div class="ttdeci">const char * iface</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1416</div></div>
+<div class="ttc" id="structlws__plat__file__ops_html"><div class="ttname"><a href="structlws__plat__file__ops.html">lws_plat_file_ops</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:3677</div></div>
+<div class="ttc" id="group__log_html_ga898b1f03872ad019f507d4e35bbefa90"><div class="ttname"><a href="group__log.html#ga898b1f03872ad019f507d4e35bbefa90">lwsl_hexdump</a></div><div class="ttdeci">LWS_VISIBLE LWS_EXTERN void lwsl_hexdump(void *buf, size_t len)</div></div>
+<div class="ttc" id="group__form-parsing_html_ga41a74a822771d3dce89751aa3bce28ae"><div class="ttname"><a href="group__form-parsing.html#ga41a74a822771d3dce89751aa3bce28ae">lws_spa_fileupload_states</a></div><div class="ttdeci">lws_spa_fileupload_states</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:2552</div></div>
+<div class="ttc" id="group__service_html_gad82efa5466d14a9f05aa06416375b28d"><div class="ttname"><a href="group__service.html#gad82efa5466d14a9f05aa06416375b28d">lws_service_fd</a></div><div class="ttdeci">LWS_VISIBLE LWS_EXTERN int lws_service_fd(struct lws_context *context, struct lws_pollfd *pollfd)</div></div>
+<div class="ttc" id="group__callback-when-writeable_html_ga60939cf0c073d933fde3d17f3591caf5"><div class="ttname"><a href="group__callback-when-writeable.html#ga60939cf0c073d933fde3d17f3591caf5">lws_callback_vhost_protocols</a></div><div class="ttdeci">LWS_VISIBLE LWS_EXTERN int lws_callback_vhost_protocols(struct lws *wsi, int reason, void *in, int len)</div></div>
+<div class="ttc" id="group__usercb_html_ggad62860e19975ba4c4af401c3cdb6abf7a06006e98d27e1e884364d88317f83493"><div class="ttname"><a href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a06006e98d27e1e884364d88317f83493">LWS_CALLBACK_OPENSSL_LOAD_EXTRA_SERVER_VERIFY_CERTS</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:688</div></div>
+<div class="ttc" id="group__wsclose_html_ggae399c571df32ba532c0ca67da9284985a3ffa38d5081b85fb739e02a747ccf2c4"><div class="ttname"><a href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a3ffa38d5081b85fb739e02a747ccf2c4">LWS_CLOSE_STATUS_NORMAL</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:463</div></div>
+<div class="ttc" id="group__wsclose_html_ggae399c571df32ba532c0ca67da9284985a462c99b05459df700919cfd3f53c8276"><div class="ttname"><a href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a462c99b05459df700919cfd3f53c8276">LWS_CLOSE_STATUS_UNACCEPTABLE_OPCODE</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:472</div></div>
+<div class="ttc" id="group__pur_html_ga9cc82f06e5ae7e71458626d7a39a5865"><div class="ttname"><a href="group__pur.html#ga9cc82f06e5ae7e71458626d7a39a5865">lws_sql_purify</a></div><div class="ttdeci">LWS_VISIBLE LWS_EXTERN const char * lws_sql_purify(char *escaped, const char *string, int len)</div></div>
+<div class="ttc" id="structlws__email_html_a01f31934166dc6d01e8a375012f8ad1e"><div class="ttname"><a href="structlws__email.html#a01f31934166dc6d01e8a375012f8ad1e">lws_email::email_client</a></div><div class="ttdeci">uv_tcp_t email_client</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:3864</div></div>
+<div class="ttc" id="group__context-and-vhost_html_gae2134657cdd2ea7a59e13ad314e4c50d"><div class="ttname"><a href="group__context-and-vhost.html#gae2134657cdd2ea7a59e13ad314e4c50d">lws_json_dump_context</a></div><div class="ttdeci">LWS_VISIBLE LWS_EXTERN int lws_json_dump_context(const struct lws_context *context, char *buf, int len)</div></div>
+<div class="ttc" id="structlws__pollfd_html"><div class="ttname"><a href="structlws__pollfd.html">lws_pollfd</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:397</div></div>
+<div class="ttc" id="group__usercb_html_ggad62860e19975ba4c4af401c3cdb6abf7ad8c6207b0c4e732f3d507f0fb79370e8"><div class="ttname"><a href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ad8c6207b0c4e732f3d507f0fb79370e8">LWS_CALLBACK_CLIENT_CONNECTION_ERROR</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:576</div></div>
+<div class="ttc" id="structlws__plat__file__ops_html_ad37a97abc68d0af967cef874f4d8df32"><div class="ttname"><a href="structlws__plat__file__ops.html#ad37a97abc68d0af967cef874f4d8df32">lws_plat_file_ops::open</a></div><div class="ttdeci">lws_filefd_type(* open)(struct lws *wsi, const char *filename, unsigned long *filelen, int flags)</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:3678</div></div>
+<div class="ttc" id="group__sending-data_html_ga98b099cf8c1c7e38ad78501f270e193d"><div class="ttname"><a href="group__sending-data.html#ga98b099cf8c1c7e38ad78501f270e193d">lws_write_protocol</a></div><div class="ttdeci">lws_write_protocol</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:2893</div></div>
+<div class="ttc" id="structlws__extension_html_a36b06c213aedb02bf9a402651751855b"><div class="ttname"><a href="structlws__extension.html#a36b06c213aedb02bf9a402651751855b">lws_extension::client_offer</a></div><div class="ttdeci">const char * client_offer</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1048</div></div>
+<div class="ttc" id="structlws__plat__file__ops_html_a01f483807a9862736b17ba9ed5110c40"><div class="ttname"><a href="structlws__plat__file__ops.html#a01f483807a9862736b17ba9ed5110c40">lws_plat_file_ops::read</a></div><div class="ttdeci">int(* read)(struct lws *wsi, lws_filefd_type fd, unsigned long *amount, unsigned char *buf, unsigned long len)</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:3688</div></div>
+<div class="ttc" id="group__service_html_ga53e3d0801dfda7960a7249dd559e68a2"><div class="ttname"><a href="group__service.html#ga53e3d0801dfda7960a7249dd559e68a2">lws_cancel_service</a></div><div class="ttdeci">LWS_VISIBLE LWS_EXTERN void lws_cancel_service(struct lws_context *context)</div></div>
+<div class="ttc" id="group__form-parsing_html_gga41a74a822771d3dce89751aa3bce28aead3a958e7719ac273c3ba4f684f00c87f"><div class="ttname"><a href="group__form-parsing.html#gga41a74a822771d3dce89751aa3bce28aead3a958e7719ac273c3ba4f684f00c87f">LWS_UFS_CONTENT</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:2553</div></div>
+<div class="ttc" id="group__wsclose_html_ggae399c571df32ba532c0ca67da9284985af90cb98d983ad3d4c79df9b6f3d4a4d2"><div class="ttname"><a href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985af90cb98d983ad3d4c79df9b6f3d4a4d2">LWS_CLOSE_STATUS_RESERVED</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:477</div></div>
+<div class="ttc" id="structlws__http__mount_html_a21d86fd6043ec00e121ababbc29af39a"><div class="ttname"><a href="structlws__http__mount.html#a21d86fd6043ec00e121ababbc29af39a">lws_http_mount::origin</a></div><div class="ttdeci">const char * origin</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1764</div></div>
+<div class="ttc" id="structlws__ext__options_html_a1769e4a9805bbdda227821e9578ddc7e"><div class="ttname"><a href="structlws__ext__options.html#a1769e4a9805bbdda227821e9578ddc7e">lws_ext_options::name</a></div><div class="ttdeci">const char * name</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:963</div></div>
+<div class="ttc" id="group__httpft_html_gab393a06d3d2722af4c3f8b06842c80d7"><div class="ttname"><a href="group__httpft.html#gab393a06d3d2722af4c3f8b06842c80d7">lws_serve_http_file</a></div><div class="ttdeci">LWS_VISIBLE LWS_EXTERN int lws_serve_http_file(struct lws *wsi, const char *file, const char *content_type, const char *other_headers, int other_headers_len)</div></div>
+<div class="ttc" id="group__smtp_html_ga5e535e346d92a9daf00be33abf79d4eb"><div class="ttname"><a href="group__smtp.html#ga5e535e346d92a9daf00be33abf79d4eb">lws_email_check</a></div><div class="ttdeci">LWS_VISIBLE LWS_EXTERN void lws_email_check(struct lws_email *email)</div></div>
+<div class="ttc" id="group__context-and-vhost_html_ga7e9d5405547a457d86e0b4f0ae2bb1c4"><div class="ttname"><a href="group__context-and-vhost.html#ga7e9d5405547a457d86e0b4f0ae2bb1c4">lws_set_proxy</a></div><div class="ttdeci">LWS_VISIBLE LWS_EXTERN int lws_set_proxy(struct lws_vhost *vhost, const char *proxy)</div></div>
+<div class="ttc" id="group__wsstatus_html_gaccd9c59336efad8af0554f79cc5966fd"><div class="ttname"><a href="group__wsstatus.html#gaccd9c59336efad8af0554f79cc5966fd">lws_frame_is_binary</a></div><div class="ttdeci">LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT lws_frame_is_binary(struct lws *wsi)</div></div>
+<div class="ttc" id="group__HTTP-headers-read_html_ga6ce6aa1c0155ea42b7708bed271d1c77"><div class="ttname"><a href="group__HTTP-headers-read.html#ga6ce6aa1c0155ea42b7708bed271d1c77">lws_hdr_copy</a></div><div class="ttdeci">LWS_VISIBLE LWS_EXTERN int lws_hdr_copy(struct lws *wsi, char *dest, int len, enum lws_token_indexes h)</div></div>
+<div class="ttc" id="group__usercb_html_ggad62860e19975ba4c4af401c3cdb6abf7a7ec8e2e9557ee02a4fc9f7dec7e2babc"><div class="ttname"><a href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a7ec8e2e9557ee02a4fc9f7dec7e2babc">LWS_CALLBACK_SERVER_WRITEABLE</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:613</div></div>
+<div class="ttc" id="structlws__extension_html_a1e5018c883d85176f5c2152176843f9e"><div class="ttname"><a href="structlws__extension.html#a1e5018c883d85176f5c2152176843f9e">lws_extension::name</a></div><div class="ttdeci">const char * name</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1046</div></div>
+<div class="ttc" id="group__smtp_html_gga116be79bf44f9dc2a97f46e051fe4dc0a929bb4623ff3f585108aba2a1b047fab"><div class="ttname"><a href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a929bb4623ff3f585108aba2a1b047fab">LGSSMTP_SENT_FROM</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:3820</div></div>
+<div class="ttc" id="structpollfd_html_aafb457d11cac415faf0e1e2b825118c2"><div class="ttname"><a href="structpollfd.html#aafb457d11cac415faf0e1e2b825118c2">pollfd::revents</a></div><div class="ttdeci">short revents</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:412</div></div>
+<div class="ttc" id="structlws__extension_html_afa21f3b3c8c2c9212a276c52b680c3af"><div class="ttname"><a href="structlws__extension.html#afa21f3b3c8c2c9212a276c52b680c3af">lws_extension::callback</a></div><div class="ttdeci">lws_extension_callback_function * callback</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1047</div></div>
+<div class="ttc" id="structlws__context__creation__info_html_a704940261951ced6b5d8191bd8b9bb2d"><div class="ttname"><a href="structlws__context__creation__info.html#a704940261951ced6b5d8191bd8b9bb2d">lws_context_creation_info::ssl_options_set</a></div><div class="ttdeci">long ssl_options_set</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1540</div></div>
+<div class="ttc" id="group__usercb_html_ggad62860e19975ba4c4af401c3cdb6abf7a982579753e70e59a9ea13ce628ac891a"><div class="ttname"><a href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a982579753e70e59a9ea13ce628ac891a">LWS_CALLBACK_USER</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:875</div></div>
+<div class="ttc" id="group__Protocols-and-Plugins_html_ga8bbe5e65faca068845704bab911a5030"><div class="ttname"><a href="group__Protocols-and-Plugins.html#ga8bbe5e65faca068845704bab911a5030">lws_protocol_get</a></div><div class="ttdeci">LWS_VISIBLE LWS_EXTERN const struct lws_protocols * lws_protocol_get(struct lws *wsi) LWS_WARN_DEPRECATED</div></div>
+<div class="ttc" id="structlws__session__info_html_afb924864b70f40372920688a5c1c895e"><div class="ttname"><a href="structlws__session__info.html#afb924864b70f40372920688a5c1c895e">lws_session_info::mask</a></div><div class="ttdeci">unsigned int mask</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1305</div></div>
+<div class="ttc" id="group__smtp_html_ga77fc9b56a1bb39484844981ec375fc29"><div class="ttname"><a href="group__smtp.html#ga77fc9b56a1bb39484844981ec375fc29">lws_email_init</a></div><div class="ttdeci">LWS_VISIBLE LWS_EXTERN int lws_email_init(struct lws_email *email, uv_loop_t *loop, int max_content)</div></div>
+<div class="ttc" id="group__vhost-mounts_html_ga31eca18e50cb4357480f2fcad36ff437"><div class="ttname"><a href="group__vhost-mounts.html#ga31eca18e50cb4357480f2fcad36ff437">lws_mount_protocols</a></div><div class="ttdeci">lws_mount_protocols</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1745</div></div>
+<div class="ttc" id="group__extensions_html_ga4cdbe42d872e21a448a947714d6c607e"><div class="ttname"><a href="group__extensions.html#ga4cdbe42d872e21a448a947714d6c607e">lws_extension_callback_pm_deflate</a></div><div class="ttdeci">LWS_EXTERN int lws_extension_callback_pm_deflate(struct lws_context *context, const struct lws_extension *ext, struct lws *wsi, enum lws_extension_callback_reasons reason, void *user, void *in, size_t len)</div></div>
+<div class="ttc" id="group__HTTP-headers-create_html_gacc76a5babcb4dce1b01b1955aa7a2faf"><div class="ttname"><a href="group__HTTP-headers-create.html#gacc76a5babcb4dce1b01b1955aa7a2faf">lws_add_http_header_content_length</a></div><div class="ttdeci">LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT lws_add_http_header_content_length(struct lws *wsi, unsigned long content_length, unsigned char **p, unsigned char *end)</div></div>
+<div class="ttc" id="structpollfd_html_af084f089bdece61d177f85782d6673d0"><div class="ttname"><a href="structpollfd.html#af084f089bdece61d177f85782d6673d0">pollfd::fd</a></div><div class="ttdeci">lws_sockfd_type fd</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:410</div></div>
+<div class="ttc" id="structlws__context__creation__info_html_aa8d9e85e137f35fb006f2e4a53f0887a"><div class="ttname"><a href="structlws__context__creation__info.html#aa8d9e85e137f35fb006f2e4a53f0887a">lws_context_creation_info::max_http_header_data2</a></div><div class="ttdeci">unsigned int max_http_header_data2</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1535</div></div>
+<div class="ttc" id="group__vhost-mounts_html_gga31eca18e50cb4357480f2fcad36ff437a1e9f0842b0e85db50fe648ed4ba9a4b0"><div class="ttname"><a href="group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437a1e9f0842b0e85db50fe648ed4ba9a4b0">LWSMPRO_HTTP</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1746</div></div>
+<div class="ttc" id="group__http_html_gac8a4a71240857dc6b2ed70456b6923f4"><div class="ttname"><a href="group__http.html#gac8a4a71240857dc6b2ed70456b6923f4">lws_return_http_status</a></div><div class="ttdeci">LWS_VISIBLE LWS_EXTERN int lws_return_http_status(struct lws *wsi, unsigned int code, const char *html_body)</div></div>
+<div class="ttc" id="group__context-and-vhost_html_ga0c54c667ccd9b8b3dddcd123ca72f87c"><div class="ttname"><a href="group__context-and-vhost.html#ga0c54c667ccd9b8b3dddcd123ca72f87c">lws_create_vhost</a></div><div class="ttdeci">LWS_EXTERN LWS_VISIBLE struct lws_vhost * lws_create_vhost(struct lws_context *context, struct lws_context_creation_info *info)</div></div>
+<div class="ttc" id="structlws__http__mount_html_a11ea62b952710d59733dbcf9794a5773"><div class="ttname"><a href="structlws__http__mount.html#a11ea62b952710d59733dbcf9794a5773">lws_http_mount::interpret</a></div><div class="ttdeci">const struct lws_protocol_vhost_options * interpret</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1777</div></div>
+<div class="ttc" id="group__service_html_gaf95bd0c663d6516a0c80047d9b1167a8"><div class="ttname"><a href="group__service.html#gaf95bd0c663d6516a0c80047d9b1167a8">lws_service</a></div><div class="ttdeci">LWS_VISIBLE LWS_EXTERN int lws_service(struct lws_context *context, int timeout_ms)</div></div>
+<div class="ttc" id="group__context-and-vhost_html_gga41c2d763f78cc248df3b9f8645dbd2a5ac56a8a6590e74a8016d0fae09fb404fc"><div class="ttname"><a href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5ac56a8a6590e74a8016d0fae09fb404fc">LWS_SERVER_OPTION_PEER_CERT_NOT_REQUIRED</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1367</div></div>
+<div class="ttc" id="group__http_html_gad27aed6c66a41b2b89ffe4da2a309e8a"><div class="ttname"><a href="group__http.html#gad27aed6c66a41b2b89ffe4da2a309e8a">lws_http_transaction_completed</a></div><div class="ttdeci">LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT lws_http_transaction_completed(struct lws *wsi)</div></div>
+<div class="ttc" id="structlws__process__html__state_html_adcafd17704775b4bbeea9561fb340968"><div class="ttname"><a href="structlws__process__html__state.html#adcafd17704775b4bbeea9561fb340968">lws_process_html_state::count_vars</a></div><div class="ttdeci">int count_vars</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:2180</div></div>
+<div class="ttc" id="group__HTTP-headers-create_html_ga29b7d6d2ddfdbaff3d8b607e7e3151b6"><div class="ttname"><a href="group__HTTP-headers-create.html#ga29b7d6d2ddfdbaff3d8b607e7e3151b6">lws_add_http_header_status</a></div><div class="ttdeci">LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT lws_add_http_header_status(struct lws *wsi, unsigned int code, unsigned char **p, unsigned char *end)</div></div>
+<div class="ttc" id="structlws__tokens_html"><div class="ttname"><a href="structlws__tokens.html">lws_tokens</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:2234</div></div>
+<div class="ttc" id="group__context-and-vhost_html_gaf2fff58562caab7510c41eeac85a8648"><div class="ttname"><a href="group__context-and-vhost.html#gaf2fff58562caab7510c41eeac85a8648">lws_create_context</a></div><div class="ttdeci">LWS_VISIBLE LWS_EXTERN struct lws_context * lws_create_context(struct lws_context_creation_info *info)</div></div>
+<div class="ttc" id="group__usercb_html_ggad62860e19975ba4c4af401c3cdb6abf7a838b18d255c1b94a533287ba302a2eba"><div class="ttname"><a href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a838b18d255c1b94a533287ba302a2eba">LWS_CALLBACK_CLOSED_HTTP</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:592</div></div>
+<div class="ttc" id="structlws__process__html__state_html_af21119890fdfebe28fb5c4dabfc1bdf5"><div class="ttname"><a href="structlws__process__html__state.html#af21119890fdfebe28fb5c4dabfc1bdf5">lws_process_html_state::data</a></div><div class="ttdeci">void * data</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:2178</div></div>
+<div class="ttc" id="structlws__email_html_a6fff03c5a5d369a2aa3cab0c897b1bed"><div class="ttname"><a href="structlws__email.html#a6fff03c5a5d369a2aa3cab0c897b1bed">lws_email::content</a></div><div class="ttdeci">char * content</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:3867</div></div>
+<div class="ttc" id="group__net_html_ga869d8bdffb0f2a7ce08e3ce10d6be3d8"><div class="ttname"><a href="group__net.html#ga869d8bdffb0f2a7ce08e3ce10d6be3d8">lws_interface_to_sa</a></div><div class="ttdeci">LWS_VISIBLE LWS_EXTERN int lws_interface_to_sa(int ipv6, const char *ifname, struct sockaddr_in *addr, size_t addrlen)</div></div>
+<div class="ttc" id="structlws__context__creation__info_html_ac8a75b7b259a3c3a5fbb4219a3f06c29"><div class="ttname"><a href="structlws__context__creation__info.html#ac8a75b7b259a3c3a5fbb4219a3f06c29">lws_context_creation_info::token_limits</a></div><div class="ttdeci">const struct lws_token_limits * token_limits</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1430</div></div>
+<div class="ttc" id="structlws__process__html__state_html_a693d2fb45378afee5da29b539c1ea644"><div class="ttname"><a href="structlws__process__html__state.html#a693d2fb45378afee5da29b539c1ea644">lws_process_html_state::replace</a></div><div class="ttdeci">lws_process_html_state_cb replace</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:2182</div></div>
+<div class="ttc" id="structlws__email_html"><div class="ttname"><a href="structlws__email.html">lws_email</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:3828</div></div>
+<div class="ttc" id="structlws__client__connect__info_html_aa364094f94ef1bcaaabbd9161971d502"><div class="ttname"><a href="structlws__client__connect__info.html#aa364094f94ef1bcaaabbd9161971d502">lws_client_connect_info::address</a></div><div class="ttdeci">const char * address</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1810</div></div>
+<div class="ttc" id="structlws__plat__file__ops_html_abfcda19b003dcc13c61ff9e2bb4ff869"><div class="ttname"><a href="structlws__plat__file__ops.html#abfcda19b003dcc13c61ff9e2bb4ff869">lws_plat_file_ops::seek_cur</a></div><div class="ttdeci">unsigned long(* seek_cur)(struct lws *wsi, lws_filefd_type fd, long offset_from_cur_pos)</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:3685</div></div>
+<div class="ttc" id="structlws__protocols_html_a3cbd903ad076736ae934a54cae36580e"><div class="ttname"><a href="structlws__protocols.html#a3cbd903ad076736ae934a54cae36580e">lws_protocols::user</a></div><div class="ttdeci">void * user</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1164</div></div>
+<div class="ttc" id="structlws__pollargs_html_a00bbffea9f55de342783e32d71ce1de6"><div class="ttname"><a href="structlws__pollargs.html#a00bbffea9f55de342783e32d71ce1de6">lws_pollargs::events</a></div><div class="ttdeci">int events</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:440</div></div>
+<div class="ttc" id="structlws__email_html_a2aff78c8e04db243052aa91b4d87e987"><div class="ttname"><a href="structlws__email.html#a2aff78c8e04db243052aa91b4d87e987">lws_email::on_get_body</a></div><div class="ttdeci">int(* on_get_body)(struct lws_email *email, char *buf, int len)</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:3854</div></div>
+<div class="ttc" id="group__vhost-mounts_html_gga31eca18e50cb4357480f2fcad36ff437a946a88cf9c852eed2c0317f4115d19da"><div class="ttname"><a href="group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437a946a88cf9c852eed2c0317f4115d19da">LWSMPRO_CALLBACK</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1752</div></div>
+<div class="ttc" id="structlws__context__creation__info_html_a0e9d94cdfb893d777b4a4db81e7b5ac0"><div class="ttname"><a href="structlws__context__creation__info.html#a0e9d94cdfb893d777b4a4db81e7b5ac0">lws_context_creation_info::user</a></div><div class="ttdeci">void * user</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1462</div></div>
+<div class="ttc" id="group__smtp_html_gga116be79bf44f9dc2a97f46e051fe4dc0a2c2ed16ffc572326e3040684084b21d5"><div class="ttname"><a href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a2c2ed16ffc572326e3040684084b21d5">LGSSMTP_SENT_QUIT</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:3824</div></div>
+<div class="ttc" id="group__sending-data_html_gga98b099cf8c1c7e38ad78501f270e193dafe5a38e940ce56708ac814627e9c0917"><div class="ttname"><a href="group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193dafe5a38e940ce56708ac814627e9c0917">LWS_WRITE_HTTP_HEADERS</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:2916</div></div>
+<div class="ttc" id="structlws__tokens_html_a9f3635412bc71a5cb78e9862b55f10cd"><div class="ttname"><a href="structlws__tokens.html#a9f3635412bc71a5cb78e9862b55f10cd">lws_tokens::token</a></div><div class="ttdeci">char * token</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:2235</div></div>
+<div class="ttc" id="group__Protocols-and-Plugins_html_gaf3be4243443baac0f8be1fcfb4d25129"><div class="ttname"><a href="group__Protocols-and-Plugins.html#gaf3be4243443baac0f8be1fcfb4d25129">lws_protocol_vh_priv_get</a></div><div class="ttdeci">LWS_VISIBLE LWS_EXTERN void * lws_protocol_vh_priv_get(struct lws_vhost *vhost, const struct lws_protocols *prot)</div></div>
+<div class="ttc" id="structlws__plugin__capability_html_ae38f7cf1246b9ca3af3cbf9d46b7090f"><div class="ttname"><a href="structlws__plugin__capability.html#ae38f7cf1246b9ca3af3cbf9d46b7090f">lws_plugin_capability::count_protocols</a></div><div class="ttdeci">int count_protocols</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1247</div></div>
+<div class="ttc" id="structlws__plugin_html_a4ef37a43653715b6c69cbf8a7be747f4"><div class="ttname"><a href="structlws__plugin.html#a4ef37a43653715b6c69cbf8a7be747f4">lws_plugin::l</a></div><div class="ttdeci">void * l</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1262</div></div>
+<div class="ttc" id="structlws__context__creation__info_html_ab9ec8893e0f7843cf5d783d2f350ef14"><div class="ttname"><a href="structlws__context__creation__info.html#ab9ec8893e0f7843cf5d783d2f350ef14">lws_context_creation_info::ssl_private_key_filepath</a></div><div class="ttdeci">const char * ssl_private_key_filepath</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1439</div></div>
+<div class="ttc" id="structlws__process__html__args_html_a8be7fd396a1942ea2449a2fda990ff99"><div class="ttname"><a href="structlws__process__html__args.html#a8be7fd396a1942ea2449a2fda990ff99">lws_process_html_args::max_len</a></div><div class="ttdeci">int max_len</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:2168</div></div>
+<div class="ttc" id="group__usercb_html_ggad62860e19975ba4c4af401c3cdb6abf7a492c1b1c0ac0ed980042ee732fe2990c"><div class="ttname"><a href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a492c1b1c0ac0ed980042ee732fe2990c">LWS_CALLBACK_RECEIVE</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:594</div></div>
+<div class="ttc" id="structlws__protocol__vhost__options_html_abc714ddb4171756fc8196e9823a1e21c"><div class="ttname"><a href="structlws__protocol__vhost__options.html#abc714ddb4171756fc8196e9823a1e21c">lws_protocol_vhost_options::next</a></div><div class="ttdeci">const struct lws_protocol_vhost_options * next</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1735</div></div>
+<div class="ttc" id="group__usercb_html_ggad62860e19975ba4c4af401c3cdb6abf7a8e8b2e6dbeac76d8d126947d2166a514"><div class="ttname"><a href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a8e8b2e6dbeac76d8d126947d2166a514">LWS_CALLBACK_CLIENT_WRITEABLE</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:605</div></div>
+<div class="ttc" id="libwebsockets_8h_html_a5e627dbf1db48170ef486edbaf268672"><div class="ttname"><a href="libwebsockets_8h.html#a5e627dbf1db48170ef486edbaf268672">lws_rx_flow_allow_all_protocol</a></div><div class="ttdeci">LWS_VISIBLE LWS_EXTERN void lws_rx_flow_allow_all_protocol(const struct lws_context *context, const struct lws_protocols *protocol)</div></div>
+<div class="ttc" id="structlws__process__html__state_html"><div class="ttname"><a href="structlws__process__html__state.html">lws_process_html_state</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:2174</div></div>
+<div class="ttc" id="group__net_html_gad0df22db2be9fc65a667a1e83f9a92a4"><div class="ttname"><a href="group__net.html#gad0df22db2be9fc65a667a1e83f9a92a4">lws_canonical_hostname</a></div><div class="ttdeci">LWS_VISIBLE LWS_EXTERN const char *LWS_WARN_UNUSED_RESULT lws_canonical_hostname(struct lws_context *context)</div></div>
+<div class="ttc" id="group__usercb_html_ggad62860e19975ba4c4af401c3cdb6abf7a8909732521d379179003d97ab7a05428"><div class="ttname"><a href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a8909732521d379179003d97ab7a05428">LWS_CALLBACK_LOCK_POLL</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:804</div></div>
+<div class="ttc" id="structlws__context__creation__info_html_a4f8e65c3a059d3b586fafa9ef3282c29"><div class="ttname"><a href="structlws__context__creation__info.html#a4f8e65c3a059d3b586fafa9ef3282c29">lws_context_creation_info::ssl_ca_filepath</a></div><div class="ttdeci">const char * ssl_ca_filepath</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1445</div></div>
+<div class="ttc" id="structlws__context__creation__info_html_a9c9d22437de92c197f3cee52912b2c03"><div class="ttname"><a href="structlws__context__creation__info.html#a9c9d22437de92c197f3cee52912b2c03">lws_context_creation_info::gid</a></div><div class="ttdeci">int gid</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1456</div></div>
+<div class="ttc" id="structlws__client__connect__info_html_a3893181d728f326f9f5b47c1459cb8be"><div class="ttname"><a href="structlws__client__connect__info.html#a3893181d728f326f9f5b47c1459cb8be">lws_client_connect_info::vhost</a></div><div class="ttdeci">struct lws_vhost * vhost</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1842</div></div>
+<div class="ttc" id="group__usercb_html_gad4fcb82e68d60ffacca61a3f783a0a2f"><div class="ttname"><a href="group__usercb.html#gad4fcb82e68d60ffacca61a3f783a0a2f">lws_callback_function</a></div><div class="ttdeci">int lws_callback_function(struct lws *wsi, enum lws_callback_reasons reason, void *user, void *in, size_t len)</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:897</div></div>
+<div class="ttc" id="group__service_html_ga29c246707997ab7a466aa709aecd2d7b"><div class="ttname"><a href="group__service.html#ga29c246707997ab7a466aa709aecd2d7b">lws_cancel_service_pt</a></div><div class="ttdeci">LWS_VISIBLE LWS_EXTERN void lws_cancel_service_pt(struct lws *wsi)</div></div>
+<div class="ttc" id="group__context-and-vhost_html_gga41c2d763f78cc248df3b9f8645dbd2a5ac962efd35abf6c402f9fb14aa14f5016"><div class="ttname"><a href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5ac962efd35abf6c402f9fb14aa14f5016">LWS_SERVER_OPTION_STS</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1388</div></div>
+<div class="ttc" id="group__wsclose_html_ggae399c571df32ba532c0ca67da9284985ad0869604d79e13700ae5d196a431b350"><div class="ttname"><a href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985ad0869604d79e13700ae5d196a431b350">LWS_CLOSE_STATUS_UNEXPECTED_CONDITION</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:513</div></div>
+<div class="ttc" id="group__smtp_html_gga116be79bf44f9dc2a97f46e051fe4dc0a1dfec948a864205cec875f63cbe0d4ad"><div class="ttname"><a href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a1dfec948a864205cec875f63cbe0d4ad">LGSSMTP_SENT_HELO</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:3819</div></div>
+<div class="ttc" id="structlws__plugin__capability_html_a523c7cde6f15bba345f56493dcf6b32a"><div class="ttname"><a href="structlws__plugin__capability.html#a523c7cde6f15bba345f56493dcf6b32a">lws_plugin_capability::api_magic</a></div><div class="ttdeci">unsigned int api_magic</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1245</div></div>
+<div class="ttc" id="group__context-and-vhost_html_gga41c2d763f78cc248df3b9f8645dbd2a5af62887536e25e053e68741006dba46d8"><div class="ttname"><a href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5af62887536e25e053e68741006dba46d8">LWS_SERVER_OPTION_IPV6_V6ONLY_MODIFY</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1391</div></div>
+<div class="ttc" id="group__wsstatus_html_ga2bb3655329b4651cd06f79ee3a764421"><div class="ttname"><a href="group__wsstatus.html#ga2bb3655329b4651cd06f79ee3a764421">lws_send_pipe_choked</a></div><div class="ttdeci">LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT lws_send_pipe_choked(struct lws *wsi)</div></div>
+<div class="ttc" id="group__smtp_html_gga116be79bf44f9dc2a97f46e051fe4dc0a85e3c452950c09a79086bff4b9be5c14"><div class="ttname"><a href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a85e3c452950c09a79086bff4b9be5c14">LGSSMTP_SENT_DATA</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:3822</div></div>
+<div class="ttc" id="group__form-parsing_html_ga5a70527c0861c2ffa3d29333a6aa7f8e"><div class="ttname"><a href="group__form-parsing.html#ga5a70527c0861c2ffa3d29333a6aa7f8e">lws_spa_fileupload_cb</a></div><div class="ttdeci">int(* lws_spa_fileupload_cb)(void *data, const char *name, const char *filename, char *buf, int len, enum lws_spa_fileupload_states state)</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:2574</div></div>
+</div><!-- fragment --></div><!-- contents -->
+</div><!-- doc-content -->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="dir_97aefd0d527b934f1d99a682da8fe6a9.html">lib</a></li><li class="navelem"><a class="el" href="libwebsockets_8h.html">libwebsockets.h</a></li>
+ <li class="footer">Generated by
+ <a href="http://www.doxygen.org/index.html">
+ <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.11 </li>
+ </ul>
+</div>
+</body>
+</html>
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.11"/>
+<title>libwebsockets: Notes about building lws</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="libwebsockets.org-logo.png"/></td>
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname">libwebsockets
+ </div>
+ <div id="projectbrief">Lightweight C library for HTML5 websockets</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.11 -->
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main Page</span></a></li>
+ <li class="current"><a href="pages.html"><span>Related Pages</span></a></li>
+ <li><a href="modules.html"><span>Modules</span></a></li>
+ <li><a href="annotated.html"><span>Data Structures</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('md_README.build.html','');});
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="headertitle">
+<div class="title">Notes about building lws </div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><h2>Introduction to CMake </h2>
+<p>CMake is a multi-platform build tool that can generate build files for many different target platforms. See more info at <a href="http://www.cmake.org">http://www.cmake.org</a></p>
+<p>CMake also allows/recommends you to do "out of source"-builds, that is, the build files are separated from your sources, so there is no need to create elaborate clean scripts to get a clean source tree, instead you simply remove your build directory.</p>
+<p>Libwebsockets has been tested to build successfully on the following platforms with SSL support (both OpenSSL/wolfSSL):</p>
+<ul>
+<li>Windows (Visual Studio)</li>
+<li>Windows (MinGW)</li>
+<li>Linux (x86 and ARM)</li>
+<li>OSX</li>
+<li>NetBSD</li>
+</ul>
+<h2>Building the library and test apps </h2>
+<p>The project settings used by CMake to generate the platform specific build files is called <a href="CMakeLists.txt">CMakeLists.txt</a>. CMake then uses one of its "Generators" to output a Visual Studio project or Make file for instance. To see a list of the available generators for your platform, simply run the "cmake" command.</p>
+<p>Note that by default OpenSSL will be linked, if you don't want SSL support see below on how to toggle compile options.</p>
+<h2>Building on Unix: </h2>
+<ol type="1">
+<li>Install CMake 2.8 or greater: <a href="http://cmake.org/cmake/resources/software.html">http://cmake.org/cmake/resources/software.html</a> (Most Unix distributions comes with a packaged version also)</li>
+<li>Install OpenSSL.</li>
+<li>Generate the build files (default is Make files): <div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> $ cd /path/to/src</div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span> $ mkdir build</div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span> $ cd build</div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span> $ cmake ..</div></div><!-- fragment --></li>
+<li>Finally you can build using the generated Makefile: <div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> $ make && sudo make install</div></div><!-- fragment --> <b>NOTE</b>: The <code>build/</code><code>directory can have any name and be located anywhere on your filesystem, and that the argument</code>..` given to cmake is simply the source directory of <b>libwebsockets</b> containing the <a href="CMakeLists.txt">CMakeLists.txt</a> project file. All examples in this file assumes you use ".."</li>
+</ol>
+<p><b>NOTE2</b>: A common option you may want to give is to set the install path, same as –prefix= with autotools. It defaults to /usr/local. You can do this by, eg </p><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> $ cmake -DCMAKE_INSTALL_PREFIX:PATH=/usr .</div></div><!-- fragment --><p><b>NOTE3</b>: On machines that want libraries in lib64, you can also add the following to the cmake line </p><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> -DLIB_SUFFIX=64</div></div><!-- fragment --><p><b>NOTE4</b>: If you are building against a non-distro OpenSSL (eg, in order to get access to ALPN support only in newer OpenSSL versions) the nice way to express that in one cmake command is eg, </p><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> $ cmake .. -DOPENSSL_ROOT_DIR=/usr/local/ssl \</div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span>  -DCMAKE_INCLUDE_DIRECTORIES_PROJECT_BEFORE=/usr/local/ssl \</div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span>  -DLWS_WITH_HTTP2=1</div></div><!-- fragment --><p>When you run the test apps using non-distro SSL, you have to force them to use your libs, not the distro ones </p><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> $ LD_LIBRARY_PATH=/usr/local/ssl/lib libwebsockets-test-server --ssl</div></div><!-- fragment --><p>To get it to build on latest openssl (2016-04-10) it needed this approach </p><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> cmake .. -DLWS_WITH_HTTP2=1 -DLWS_OPENSSL_INCLUDE_DIRS=/usr/local/include/openssl -DLWS_OPENSSL_LIBRARIES="/usr/local/lib64/libssl.so;/usr/local/lib64/libcrypto.so"</div></div><!-- fragment --><p><b>NOTE5</b>: To build with debug info and _DEBUG for lower priority debug messages compiled in, use </p><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> $ cmake .. -DCMAKE_BUILD_TYPE=DEBUG</div></div><!-- fragment --><h2>Quirk of cmake </h2>
+<p>When changing cmake options, for some reason the only way to get it to see the changes sometimes is delete the contents of your build directory and do the cmake from scratch.</p>
+<h2>Building on Windows (Visual Studio) </h2>
+<ol type="1">
+<li>Install CMake 2.6 or greater: <a href="http://cmake.org/cmake/resources/software.html">http://cmake.org/cmake/resources/software.html</a></li>
+<li><p class="startli">Install OpenSSL binaries. <a href="http://www.openssl.org/related/binaries.html">http://www.openssl.org/related/binaries.html</a></p>
+<p class="startli">(<b>NOTE</b>: Preferably in the default location to make it easier for CMake to find them)</p>
+<p class="startli"><b>NOTE2</b>: Be sure that OPENSSL_CONF environment variable is defined and points at <OpenSSL install="" location>="">.cfg</p>
+</li>
+<li>Generate the Visual studio project by opening the Visual Studio cmd prompt:</li>
+</ol>
+<div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> cd <path to src></div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span> md build</div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span> cd build</div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span> cmake -G "Visual Studio 10" ..</div></div><!-- fragment --><p>(<b>NOTE</b>: There is also a cmake-gui available on Windows if you prefer that)</p>
+<p><b>NOTE2</b>: See this link to find out the version number corresponding to your Visual Studio edition: <a href="http://superuser.com/a/194065">http://superuser.com/a/194065</a></p>
+<ol type="1">
+<li>Now you should have a generated Visual Studio Solution in your <code><path to src>/build</code> directory, which can be used to build.</li>
+<li>Some additional deps may be needed<ul>
+<li>iphlpapi.lib</li>
+<li>psapi.lib</li>
+<li>userenv.lib</li>
+</ul>
+</li>
+<li>If you're using libuv, you must make sure to compile libuv with the same multithread-dll / Mtd attributes as libwebsockets itself</li>
+</ol>
+<h2>Building on Windows (MinGW) </h2>
+<ol type="1">
+<li><p class="startli">Install MinGW: <a href="http://sourceforge.net/projects/mingw/files">http://sourceforge.net/projects/mingw/files</a></p>
+<p class="startli">(<b>NOTE</b>: Preferably in the default location C:)</p>
+</li>
+<li><p class="startli">Fix up MinGW headers</p>
+<p class="startli">a) Add the following lines to C:.h: </p><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> #if(_WIN32_WINNT >= 0x0600)</div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span> </div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span> typedef struct pollfd {</div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span> </div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span>  SOCKET fd;</div><div class="line"><a name="l00006"></a><span class="lineno"> 6</span>  SHORT events;</div><div class="line"><a name="l00007"></a><span class="lineno"> 7</span>  SHORT revents;</div><div class="line"><a name="l00008"></a><span class="lineno"> 8</span> </div><div class="line"><a name="l00009"></a><span class="lineno"> 9</span> } WSAPOLLFD, *PWSAPOLLFD, FAR *LPWSAPOLLFD;</div><div class="line"><a name="l00010"></a><span class="lineno"> 10</span> </div><div class="line"><a name="l00011"></a><span class="lineno"> 11</span> WINSOCK_API_LINKAGE int WSAAPI WSAPoll(LPWSAPOLLFD fdArray, ULONG fds, INT timeout);</div><div class="line"><a name="l00012"></a><span class="lineno"> 12</span> </div><div class="line"><a name="l00013"></a><span class="lineno"> 13</span> #endif // (_WIN32_WINNT >= 0x0600)</div></div><!-- fragment --><p> b) Create C:.h and copy and paste the content from following link into it:</p>
+<p class="startli"><a href="http://wine-unstable.sourcearchive.com/documentation/1.1.32/mstcpip_8h-source.html">http://wine-unstable.sourcearchive.com/documentation/1.1.32/mstcpip_8h-source.html</a></p>
+</li>
+<li>Install CMake 2.6 or greater: <a href="http://cmake.org/cmake/resources/software.html">http://cmake.org/cmake/resources/software.html</a></li>
+<li><p class="startli">Install OpenSSL binaries. <a href="http://www.openssl.org/related/binaries.html">http://www.openssl.org/related/binaries.html</a></p>
+<p class="startli">(<b>NOTE</b>: Preferably in the default location to make it easier for CMake to find them)</p>
+<p class="startli"><b>NOTE2</b>: Be sure that OPENSSL_CONF environment variable is defined and points at <OpenSSL install="" location>="">.cfg</p>
+</li>
+<li><p class="startli">Generate the build files (default is Make files) using MSYS shell: </p><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> $ cd /drive/path/to/src</div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span> $ mkdir build</div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span> $ cd build</div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span> $ cmake -G "MSYS Makefiles" -DCMAKE_INSTALL_PREFIX=C:/MinGW ..</div></div><!-- fragment --><p> (<b>NOTE</b>: The <code>build/</code><code>directory can have any name and be located anywhere on your filesystem, and that the argument</code>..` given to cmake is simply the source directory of <b>libwebsockets</b> containing the <a href="CMakeLists.txt">CMakeLists.txt</a> project file. All examples in this file assumes you use "..")</p>
+<p class="startli"><b>NOTE2</b>: To generate build files allowing to create libwebsockets binaries with debug information set the CMAKE_BUILD_TYPE flag to DEBUG: </p><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> $ cmake -G "MSYS Makefiles" -DCMAKE_INSTALL_PREFIX=C:/MinGW -DCMAKE_BUILD_TYPE=DEBUG ..</div></div><!-- fragment --></li>
+<li>Finally you can build using the generated Makefile and get the results deployed into your MinGW installation:</li>
+</ol>
+<div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> $ make</div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span> $ make install</div></div><!-- fragment --><h2>Setting compile options </h2>
+<p>To set compile time flags you can either use one of the CMake gui applications or do it via command line.</p>
+<h2>Command line </h2>
+<p>To list avaialable options (ommit the H if you don't want the help text): </p><pre class="fragment"> cmake -LH ..
+</pre><p>Then to set an option and build (for example turn off SSL support): </p><pre class="fragment"> cmake -DLWS_WITH_SSL=0 ..
+</pre><p> or cmake -DLWS_WITH_SSL:BOOL=OFF ..</p>
+<h2>Building on mbed3 </h2>
+<p>MBED3 is a non-posix embedded OS targeted on Cortex M class chips.</p>
+<p><a href="https://www.mbed.com/">https://www.mbed.com/</a></p>
+<p>It's quite unlike any other Posixy platform since the OS is linked statically in with lws to form one binary.</p>
+<p>At the minute server-only is supported and due to bugs in mbed3 network support, the port is of alpha quality. However it can serve the test html, favicon.ico and logo png and may be able to make ws connections. The binary for that including the OS, test app, lws and all the assets is only 117KB.</p>
+<p>0) Today mbed3 only properly works on FRDM K64F $35 Freescale Dev Board with 1MB Flash, 256KB SRAM and Ethernet.</p>
+<p><a href="http://www.freescale.com/products/arm-processors/kinetis-cortex-m/k-series/k6x-ethernet-mcus/freescale-freedom-development-platform-for-kinetis-k64-k63-and-k24-mcus:FRDM-K64F">http://www.freescale.com/products/arm-processors/kinetis-cortex-m/k-series/k6x-ethernet-mcus/freescale-freedom-development-platform-for-kinetis-k64-k63-and-k24-mcus:FRDM-K64F</a></p>
+<p>1) Get a working mbed3 environment with arm-none-eabi-cs toolchain (available in Fedora, Ubuntu and other distros)</p>
+<p>2) Confirm you can build things using yotta by following the getting started guide here</p>
+<p><a href="https://docs.mbed.com/docs/getting-started-mbed-os/en/latest/">https://docs.mbed.com/docs/getting-started-mbed-os/en/latest/</a></p>
+<p>3)</p>
+<p>git clone <a href="https://github.com/warmcat/lws-test-server">https://github.com/warmcat/lws-test-server</a></p>
+<p>and cd into it</p>
+<p>4) mkdir -p yotta_modules ; cd yotta_modules</p>
+<p>5) git clone <a href="https://github.com/warmcat/libwebsockets">https://github.com/warmcat/libwebsockets</a> ; mv libwebsockets websockets ; cd ..</p>
+<p>6) yotta target frdm-k64f-gcc</p>
+<p>7) yotta install</p>
+<p>8) yotta build</p>
+<h2>Unix GUI </h2>
+<p>If you have a curses-enabled build you simply type: (not all packages include this, my debian install does not for example). </p><pre class="fragment"> ccmake
+</pre><h2>Windows GUI </h2>
+<p>On windows CMake comes with a gui application: Start -> Programs -> CMake -> CMake (cmake-gui)</p>
+<h2>wolfSSL/CyaSSL replacement for OpenSSL </h2>
+<p>wolfSSL/CyaSSL is a lightweight SSL library targeted at embedded systems: <a href="https://www.wolfssl.com/wolfSSL/Products-wolfssl.html">https://www.wolfssl.com/wolfSSL/Products-wolfssl.html</a></p>
+<p>It contains a OpenSSL compatibility layer which makes it possible to pretty much link to it instead of OpenSSL, giving a much smaller footprint.</p>
+<p><b>NOTE</b>: wolfssl needs to be compiled using the <code>--enable-opensslextra</code> flag for this to work.</p>
+<h2>Compiling libwebsockets with wolfSSL </h2>
+<div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> cmake .. -DLWS_USE_WOLFSSL=1 \</div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span>  -DLWS_WOLFSSL_INCLUDE_DIRS=/path/to/wolfssl \</div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span>  -DLWS_WOLFSSL_LIBRARIES=/path/to/wolfssl/wolfssl.a ..</div></div><!-- fragment --><p><b>NOTE</b>: On windows use the .lib file extension for <code>LWS_WOLFSSL_LIBRARIES</code> instead.</p>
+<h2>Compiling libwebsockets with CyaSSL </h2>
+<div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> cmake .. -DLWS_USE_CYASSL=1 \</div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span>  -DLWS_CYASSL_INCLUDE_DIRS=/path/to/cyassl \</div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span>  -DLWS_CYASSL_LIBRARIES=/path/to/wolfssl/cyassl.a ..</div></div><!-- fragment --><p><b>NOTE</b>: On windows use the .lib file extension for <code>LWS_CYASSL_LIBRARIES</code> instead.</p>
+<h2>Compiling libwebsockets with PolarSSL </h2>
+<p>Caution... at some point PolarSSL became MbedTLS. But it did not happen all at once. The name changed first then at mbedTLS 2.0 the apis changed. So eg in Fedora 22, there is an "mbedtls" package which is actually using polarssl for the include dir and polarssl apis... this should be treated as polarssl then.</p>
+<p>Example config for this case is </p><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> cmake .. -DLWS_USE_POLARSSL=1 -DLWS_POLARSSL_LIBRARIES=/usr/lib64/libmbedtls.so \</div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span>  -DLWS_POLARSSL_INCLUDE_DIRS=/usr/include/polarssl/</div></div><!-- fragment --><h2>Building plugins outside of lws itself </h2>
+<p>The directory ./plugin-standalone/ shows how easy it is to create plugins outside of lws itself. First build lws itself with -DLWS_WITH_PLUGINS, then use the same flow to build the standalone plugin </p><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> cd ./plugin-standalone</div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span> mkdir build</div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span> cd build</div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span> cmake ..</div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span> make && sudo make install</div></div><!-- fragment --><p>if you changed the default plugin directory when you built lws, you must also give the same arguments to cmake here (eg, <code>-DCMAKE_INSTALL_PREFIX:PATH=/usr/something/else...</code> )</p>
+<p>Otherwise if you run lwsws or libwebsockets-test-server-v2.0, it will now find the additional plugin "libprotocol_example_standalone.so" </p><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> lwsts[21257]: Plugins:</div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span> lwsts[21257]: libprotocol_dumb_increment.so</div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span> lwsts[21257]: libprotocol_example_standalone.so</div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span> lwsts[21257]: libprotocol_lws_mirror.so</div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span> lwsts[21257]: libprotocol_lws_server_status.so</div><div class="line"><a name="l00006"></a><span class="lineno"> 6</span> lwsts[21257]: libprotocol_lws_status.so</div></div><!-- fragment --><p> If you have multiple vhosts, you must enable plugins at the vhost additionally, discovered plugins are not enabled automatically for security reasons. You do this using info->pvo or for lwsws, in the JSON config.</p>
+<h2>Reproducing HTTP2.0 tests </h2>
+<p>You must have built and be running lws against a version of openssl that has ALPN / NPN. Most distros still have older versions. You'll know it's right by seeing </p><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> lwsts[4752]: Compiled with OpenSSL support</div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span> lwsts[4752]: Using SSL mode</div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span> lwsts[4752]: HTTP2 / ALPN enabled</div></div><!-- fragment --><p> at lws startup.</p>
+<p>For non-SSL HTTP2.0 upgrade </p><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> $ nghttp -nvasu http://localhost:7681/test.htm</div></div><!-- fragment --><p> For SSL / ALPN HTTP2.0 upgrade </p><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> $ nghttp -nvas https://localhost:7681/test.html</div></div><!-- fragment --><h2>Cross compiling </h2>
+<p>To enable cross-compiling <b>libwebsockets</b> using CMake you need to create a "Toolchain file" that you supply to CMake when generating your build files. CMake will then use the cross compilers and build paths specified in this file to look for dependencies and such.</p>
+<p><b>Libwebsockets</b> includes an example toolchain file <a href="cross-arm-linux-gnueabihf.cmake">cross-arm-linux-gnueabihf.cmake</a> you can use as a starting point.</p>
+<p>The commandline to configure for cross with this would look like </p><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> $ cmake .. -DCMAKE_INSTALL_PREFIX:PATH=/usr \</div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span>  -DCMAKE_TOOLCHAIN_FILE=../cross-arm-linux-gnueabihf.cmake \</div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span>  -DWITHOUT_EXTENSIONS=1 -DWITH_SSL=0</div></div><!-- fragment --><p> The example shows how to build with no external cross lib dependencies, you need to provide the cross libraries otherwise.</p>
+<p><b>NOTE</b>: start from an EMPTY build directory if you had a non-cross build in there before the settings will be cached and your changes ignored.</p>
+<p>Additional information on cross compilation with CMake: <a href="http://www.vtk.org/Wiki/CMake_Cross_Compiling">http://www.vtk.org/Wiki/CMake_Cross_Compiling</a></p>
+<h2>Memory efficiency </h2>
+<p>Embedded server-only configuration without extensions (ie, no compression on websocket connections), but with full v13 websocket features and http server, built on ARM Cortex-A9:</p>
+<p>Update at 8dac94d (2013-02-18) </p><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> $ ./configure --without-client --without-extensions --disable-debug --without-daemonize</div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span> </div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span> Context Creation, 1024 fd limit[2]: 16720 (includes 12 bytes per fd)</div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span> Per-connection [3]: 72 bytes, +1328 during headers</div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span> </div><div class="line"><a name="l00006"></a><span class="lineno"> 6</span> .text .rodata .data .bss</div><div class="line"><a name="l00007"></a><span class="lineno"> 7</span> 11512 2784 288 4</div></div><!-- fragment --><p> This shows the impact of the major configuration with/without options at 13ba5bbc633ea962d46d using Ubuntu ARM on a PandaBoard ES.</p>
+<p>These are accounting for static allocations from the library elf, there are additional dynamic allocations via malloc. These are a bit old now but give the right idea for relative "expense" of features.</p>
+<p>Static allocations, ARM9</p>
+<table class="doxtable">
+<tr>
+<th></th><th>.text </th><th>.rodata </th><th>.data </th><th>.bss </th></tr>
+<tr>
+<td>All (no without) </td><td>35024 </td><td>9940 </td><td>336 </td><td>4104 </td></tr>
+<tr>
+<td>without client </td><td>25684 </td><td>7144 </td><td>336 </td><td>4104 </td></tr>
+<tr>
+<td>without client, exts </td><td>21652 </td><td>6288 </td><td>288 </td><td>4104 </td></tr>
+<tr>
+<td>without client, exts, debug[1] </td><td>19756 </td><td>3768 </td><td>288 </td><td>4104 </td></tr>
+<tr>
+<td>without server </td><td>30304 </td><td>8160 </td><td>336 </td><td>4104 </td></tr>
+<tr>
+<td>without server, exts </td><td>25382 </td><td>7204 </td><td>288 </td><td>4104 </td></tr>
+<tr>
+<td>without server, exts, debug[1] </td><td>23712 </td><td>4256 </td><td>288 </td><td>4104 </td></tr>
+</table>
+<p>[1] <code>--disable-debug</code> only removes messages below <code>lwsl_notice</code>. Since that is the default logging level the impact is not noticeable, error, warn and notice logs are all still there.</p>
+<p>[2] <code>1024</code> fd per process is the default limit (set by ulimit) in at least Fedora and Ubuntu. You can make significant savings tailoring this to actual expected peak fds, ie, at a limit of <code>20</code>, context creation allocation reduces to <code>4432 + 240 = 4672</code>)</p>
+<p>[3] known header content is freed after connection establishment </p>
+</div></div><!-- contents -->
+</div><!-- doc-content -->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">Generated by
+ <a href="http://www.doxygen.org/index.html">
+ <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.11 </li>
+ </ul>
+</div>
+</body>
+</html>
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.11"/>
+<title>libwebsockets: Notes about coding with lws</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="libwebsockets.org-logo.png"/></td>
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname">libwebsockets
+ </div>
+ <div id="projectbrief">Lightweight C library for HTML5 websockets</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.11 -->
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main Page</span></a></li>
+ <li class="current"><a href="pages.html"><span>Related Pages</span></a></li>
+ <li><a href="modules.html"><span>Modules</span></a></li>
+ <li><a href="annotated.html"><span>Data Structures</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('md_README.coding.html','');});
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="headertitle">
+<div class="title">Notes about coding with lws </div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><h2>Daemonization </h2>
+<p>There's a helper api <code>lws_daemonize</code> built by default that does everything you need to daemonize well, including creating a lock file. If you're making what's basically a daemon, just call this early in your init to fork to a headless background process and exit the starting process.</p>
+<p>Notice stdout, stderr, stdin are all redirected to /dev/null to enforce your daemon is headless, so you'll need to sort out alternative logging, by, eg, syslog.</p>
+<h2>Maximum number of connections </h2>
+<p>The maximum number of connections the library can deal with is decided when it starts by querying the OS to find out how many file descriptors it is allowed to open (1024 on Fedora for example). It then allocates arrays that allow up to that many connections, minus whatever other file descriptors are in use by the user code.</p>
+<p>If you want to restrict that allocation, or increase it, you can use ulimit or similar to change the avaiable number of file descriptors, and when restarted <b>libwebsockets</b> will adapt accordingly.</p>
+<h2>Libwebsockets is singlethreaded </h2>
+<p>Directly performing websocket actions from other threads is not allowed. Aside from the internal data being inconsistent in <code>forked()</code> processes, the scope of a <code>wsi</code> (<code>struct websocket</code>) can end at any time during service with the socket closing and the <code>wsi</code> freed.</p>
+<p>Websocket write activities should only take place in the <code>LWS_CALLBACK_SERVER_WRITEABLE</code> callback as described below.</p>
+<p>[This network-programming necessity to link the issue of new data to the peer taking the previous data is not obvious to all users so let's repeat that in other words:</p>
+<p>***ONLY DO LWS_WRITE FROM THE WRITEABLE CALLBACK***</p>
+<p>There is another network-programming truism that surprises some people which is if the sink for the data cannot accept more:</p>
+<p>***YOU MUST PERFORM RX FLOW CONTROL***</p>
+<p>See the mirror protocol implementations for example code.</p>
+<p>Only live connections appear in the user callbacks, so this removes any possibility of trying to used closed and freed wsis.</p>
+<p>If you need to service other socket or file descriptors as well as the websocket ones, you can combine them together with the websocket ones in one poll loop, see "External Polling Loop support" below, and still do it all in one thread / process context.</p>
+<p>If you insist on trying to use it from multiple threads, take special care if you might simultaneously create more than one context from different threads.</p>
+<p>SSL_library_init() is called from the context create api and it also is not reentrant. So at least create the contexts sequentially.</p>
+<h2>Only send data when socket writeable </h2>
+<p>You should only send data on a websocket connection from the user callback <code>LWS_CALLBACK_SERVER_WRITEABLE</code> (or <code>LWS_CALLBACK_CLIENT_WRITEABLE</code> for clients).</p>
+<p>If you want to send something, do not just send it but request a callback when the socket is writeable using</p>
+<ul>
+<li><code>lws_callback_on_writable(context, wsi)</code> for a specific <code>wsi</code>, or</li>
+<li><code>lws_callback_on_writable_all_protocol(protocol)</code> for all connections using that protocol to get a callback when next writeable.</li>
+</ul>
+<p>Usually you will get called back immediately next time around the service loop, but if your peer is slow or temporarily inactive the callback will be delayed accordingly. Generating what to write and sending it should be done in the ...WRITEABLE callback.</p>
+<p>See the test server code for an example of how to do this.</p>
+<h2>Do not rely on only your own WRITEABLE requests appearing </h2>
+<p>Libwebsockets may generate additional <code>LWS_CALLBACK_CLIENT_WRITEABLE</code> events if it met network conditions where it had to buffer your send data internally.</p>
+<p>So your code for <code>LWS_CALLBACK_CLIENT_WRITEABLE</code> needs to own the decision about what to send, it can't assume that just because the writeable callback came it really is time to send something.</p>
+<p>It's quite possible you get an 'extra' writeable callback at any time and just need to <code>return 0</code> and wait for the expected callback later.</p>
+<h2>Closing connections from the user side </h2>
+<p>When you want to close a connection, you do it by returning <code>-1</code> from a callback for that connection.</p>
+<p>You can provoke a callback by calling <code>lws_callback_on_writable</code> on the wsi, then notice in the callback you want to close it and just return -1. But usually, the decision to close is made in a callback already and returning -1 is simple.</p>
+<p>If the socket knows the connection is dead, because the peer closed or there was an affirmitive network error like a FIN coming, then <b>libwebsockets</b> will take care of closing the connection automatically.</p>
+<p>If you have a silently dead connection, it's possible to enter a state where the send pipe on the connection is choked but no ack will ever come, so the dead connection will never become writeable. To cover that, you can use TCP keepalives (see later in this document)</p>
+<h2>Fragmented messages </h2>
+<p>To support fragmented messages you need to check for the final frame of a message with <code>lws_is_final_fragment</code>. This check can be combined with <code>libwebsockets_remaining_packet_payload</code> to gather the whole contents of a message, eg:</p>
+<div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> case LWS_CALLBACK_RECEIVE:</div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span> {</div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span>  Client * const client = (Client *)user;</div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span>  const size_t remaining = lws_remaining_packet_payload(wsi);</div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span> </div><div class="line"><a name="l00006"></a><span class="lineno"> 6</span>  if (!remaining && lws_is_final_fragment(wsi)) {</div><div class="line"><a name="l00007"></a><span class="lineno"> 7</span>  if (client->HasFragments()) {</div><div class="line"><a name="l00008"></a><span class="lineno"> 8</span>  client->AppendMessageFragment(in, len, 0);</div><div class="line"><a name="l00009"></a><span class="lineno"> 9</span>  in = (void *)client->GetMessage();</div><div class="line"><a name="l00010"></a><span class="lineno"> 10</span>  len = client->GetMessageLength();</div><div class="line"><a name="l00011"></a><span class="lineno"> 11</span>  }</div><div class="line"><a name="l00012"></a><span class="lineno"> 12</span> </div><div class="line"><a name="l00013"></a><span class="lineno"> 13</span>  client->ProcessMessage((char *)in, len, wsi);</div><div class="line"><a name="l00014"></a><span class="lineno"> 14</span>  client->ResetMessage();</div><div class="line"><a name="l00015"></a><span class="lineno"> 15</span>  } else</div><div class="line"><a name="l00016"></a><span class="lineno"> 16</span>  client->AppendMessageFragment(in, len, remaining);</div><div class="line"><a name="l00017"></a><span class="lineno"> 17</span> }</div><div class="line"><a name="l00018"></a><span class="lineno"> 18</span> break;</div></div><!-- fragment --><p>The test app libwebsockets-test-fraggle sources also show how to deal with fragmented messages.</p>
+<h2>Debug Logging </h2>
+<p>Also using <code>lws_set_log_level</code> api you may provide a custom callback to actually emit the log string. By default, this points to an internal emit function that sends to stderr. Setting it to <code>NULL</code> leaves it as it is instead.</p>
+<p>A helper function <code><a class="el" href="group__log.html#gab7c0fc936cc9f1eb58e2bb234c15147c">lwsl_emit_syslog()</a></code> is exported from the library to simplify logging to syslog. You still need to use <code>setlogmask</code>, <code>openlog</code> and <code>closelog</code> in your user code.</p>
+<p>The logging apis are made available for user code.</p>
+<ul>
+<li><code>lwsl_err(...)</code></li>
+<li><code>lwsl_warn(...)</code></li>
+<li><code>lwsl_notice(...)</code></li>
+<li><code>lwsl_info(...)</code></li>
+<li><code>lwsl_debug(...)</code></li>
+</ul>
+<p>The difference between notice and info is that notice will be logged by default whereas info is ignored by default.</p>
+<h2>External Polling Loop support </h2>
+<p><b>libwebsockets</b> maintains an internal <code>poll()</code> array for all of its sockets, but you can instead integrate the sockets into an external polling array. That's needed if <b>libwebsockets</b> will cooperate with an existing poll array maintained by another server.</p>
+<p>Four callbacks <code>LWS_CALLBACK_ADD_POLL_FD</code>, <code>LWS_CALLBACK_DEL_POLL_FD</code>, <code>LWS_CALLBACK_SET_MODE_POLL_FD</code> and <code>LWS_CALLBACK_CLEAR_MODE_POLL_FD</code> appear in the callback for protocol 0 and allow interface code to manage socket descriptors in other poll loops.</p>
+<p>You can pass all pollfds that need service to <code><a class="el" href="group__service.html#gad82efa5466d14a9f05aa06416375b28d">lws_service_fd()</a></code>, even if the socket or file does not belong to <b>libwebsockets</b> it is safe.</p>
+<p>If <b>libwebsocket</b> handled it, it zeros the pollfd <code>revents</code> field before returning. So you can let <b>libwebsockets</b> try and if <code>pollfd->revents</code> is nonzero on return, you know it needs handling by your code.</p>
+<h2>Using with in c++ apps </h2>
+<p>The library is ready for use by C++ apps. You can get started quickly by copying the test server</p>
+<div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> $ cp test-server/test-server.c test.cpp</div></div><!-- fragment --><p>and building it in C++ like this</p>
+<div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> $ g++ -DINSTALL_DATADIR=\"/usr/share\" -ocpptest test.cpp -lwebsockets</div></div><!-- fragment --><p><code>INSTALL_DATADIR</code> is only needed because the test server uses it as shipped, if you remove the references to it in your app you don't need to define it on the g++ line either.</p>
+<h2>Availability of header information </h2>
+<p>From v1.2 of the library onwards, the HTTP header content is <code>free()</code>d as soon as the websocket connection is established. For websocket servers, you can copy interesting headers by handling <code>LWS_CALLBACK_FILTER_PROTOCOL_CONNECTION</code> callback, for clients there's a new callback just for this purpose <code>LWS_CALLBACK_CLIENT_FILTER_PRE_ESTABLISH</code>.</p>
+<h2>TCP Keepalive </h2>
+<p>It is possible for a connection which is not being used to send to die silently somewhere between the peer and the side not sending. In this case by default TCP will just not report anything and you will never get any more incoming data or sign the link is dead until you try to send.</p>
+<p>To deal with getting a notification of that situation, you can choose to enable TCP keepalives on all <b>libwebsockets</b> sockets, when you create the context.</p>
+<p>To enable keepalive, set the ka_time member of the context creation parameter struct to a nonzero value (in seconds) at context creation time. You should also fill ka_probes and ka_interval in that case.</p>
+<p>With keepalive enabled, the TCP layer will send control packets that should stimulate a response from the peer without affecting link traffic. If the response is not coming, the socket will announce an error at <code>poll()</code> forcing a close.</p>
+<p>Note that BSDs don't support keepalive time / probes / interval per-socket like Linux does. On those systems you can enable keepalive by a nonzero value in <code>ka_time</code>, but the systemwide kernel settings for the time / probes/ interval are used, regardless of what nonzero value is in <code>ka_time</code>.</p>
+<h2>Optimizing SSL connections </h2>
+<p>There's a member <code>ssl_cipher_list</code> in the <code><a class="el" href="structlws__context__creation__info.html">lws_context_creation_info</a></code> struct which allows the user code to restrict the possible cipher selection at context-creation time.</p>
+<p>You might want to look into that to stop the ssl peers selecting a cipher which is too computationally expensive. To use it, point it to a string like </p><pre class="fragment"> `"RC4-MD5:RC4-SHA:AES128-SHA:AES256-SHA:HIGH:!DSS:!aNULL"`
+</pre><p>if left <code>NULL</code>, then the "DEFAULT" set of ciphers are all possible to select.</p>
+<p>You can also set it to <code>"ALL"</code> to allow everything (including insecure ciphers).</p>
+<h2>Async nature of client connections </h2>
+<p>When you call <code><a class="el" href="structlws__client__connect__info.html">lws_client_connect_info</a>(..)</code> and get a <code>wsi</code> back, it does not mean your connection is active. It just means it started trying to connect.</p>
+<p>Your client connection is actually active only when you receive <code>LWS_CALLBACK_CLIENT_ESTABLISHED</code> for it.</p>
+<p>There's a 5 second timeout for the connection, and it may give up or die for other reasons, if any of that happens you'll get a <code>LWS_CALLBACK_CLIENT_CONNECTION_ERROR</code> callback on protocol 0 instead for the <code>wsi</code>.</p>
+<p>After attempting the connection and getting back a non-<code>NULL</code> <code>wsi</code> you should loop calling <code><a class="el" href="group__service.html#gaf95bd0c663d6516a0c80047d9b1167a8">lws_service()</a></code> until one of the above callbacks occurs.</p>
+<p>As usual, see <a href="test-server/test-client.c">test-client.c</a> for example code.</p>
+<h2>Lws platform-independent file access apis </h2>
+<p>lws now exposes his internal platform file abstraction in a way that can be both used by user code to make it platform-agnostic, and be overridden or subclassed by user code. This allows things like handling the URI "directory
+space" as a virtual filesystem that may or may not be backed by a regular filesystem. One example use is serving files from inside large compressed archive storage without having to unpack anything except the file being requested.</p>
+<p>The test server shows how to use it, basically the platform-specific part of lws prepares a file operations structure that lives in the lws context.</p>
+<p>The user code can get a pointer to the file operations struct</p>
+<div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> LWS_VISIBLE LWS_EXTERN struct lws_plat_file_ops *</div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span>  `lws_get_fops`(struct lws_context *context);</div></div><!-- fragment --><p>and then can use helpers to also leverage these platform-independent file handling apis</p>
+<div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> static inline lws_filefd_type</div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span> `lws_plat_file_open`(struct lws *wsi, const char *filename, unsigned long *filelen, int flags)</div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span> </div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span> static inline int</div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span> `lws_plat_file_close`(struct lws *wsi, lws_filefd_type fd)</div><div class="line"><a name="l00006"></a><span class="lineno"> 6</span> </div><div class="line"><a name="l00007"></a><span class="lineno"> 7</span> static inline unsigned long</div><div class="line"><a name="l00008"></a><span class="lineno"> 8</span> `lws_plat_file_seek_cur`(struct lws *wsi, lws_filefd_type fd, long offset_from_cur_pos)</div><div class="line"><a name="l00009"></a><span class="lineno"> 9</span> </div><div class="line"><a name="l00010"></a><span class="lineno"> 10</span> static inline int</div><div class="line"><a name="l00011"></a><span class="lineno"> 11</span> `lws_plat_file_read`(struct lws *wsi, lws_filefd_type fd, unsigned long *amount, unsigned char *buf, unsigned long len)</div><div class="line"><a name="l00012"></a><span class="lineno"> 12</span> </div><div class="line"><a name="l00013"></a><span class="lineno"> 13</span> static inline int</div><div class="line"><a name="l00014"></a><span class="lineno"> 14</span> `lws_plat_file_write`(struct lws *wsi, lws_filefd_type fd, unsigned long *amount, unsigned char *buf, unsigned long len)</div></div><!-- fragment --><p>The user code can also override or subclass the file operations, to either wrap or replace them. An example is shown in test server.</p>
+<h2>ECDH Support </h2>
+<p>ECDH Certs are now supported. Enable the CMake option </p><pre class="fragment"> cmake .. -DLWS_SSL_SERVER_WITH_ECDH_CERT=1
+</pre><p><b>and</b> the info->options flag </p><pre class="fragment"> LWS_SERVER_OPTION_SSL_ECDH
+</pre><p>to build in support and select it at runtime.</p>
+<h2>SMP / Multithreaded service </h2>
+<p>SMP support is integrated into LWS without any internal threading. It's very simple to use, libwebsockets-test-server-pthread shows how to do it, use -j <n> argument there to control the number of service threads up to 32.</p>
+<p>Two new members are added to the info struct </p><pre class="fragment"> unsigned int count_threads;
+ unsigned int fd_limit_per_thread;
+</pre><p>leave them at the default 0 to get the normal singlethreaded service loop.</p>
+<p>Set count_threads to n to tell lws you will have n simultaneous service threads operating on the context.</p>
+<p>There is still a single listen socket on one port, no matter how many service threads.</p>
+<p>When a connection is made, it is accepted by the service thread with the least connections active to perform load balancing.</p>
+<p>The user code is responsible for spawning n threads running the service loop associated to a specific tsi (Thread Service Index, 0 .. n - 1). See the libwebsockets-test-server-pthread for how to do.</p>
+<p>If you leave fd_limit_per_thread at 0, then the process limit of fds is shared between the service threads; if you process was allowed 1024 fds overall then each thread is limited to 1024 / n.</p>
+<p>You can set fd_limit_per_thread to a nonzero number to control this manually, eg the overall supported fd limit is less than the process allowance.</p>
+<p>You can control the context basic data allocation for multithreading from Cmake using -DLWS_MAX_SMP=, if not given it's set to 32. The serv_buf allocation for the threads (currently 4096) is made at runtime only for active threads.</p>
+<p>Because lws will limit the requested number of actual threads supported according to LWS_MAX_SMP, there is an api lws_get_count_threads(context) to discover how many threads were actually allowed when the context was created.</p>
+<p>It's required to implement locking in the user code in the same way that libwebsockets-test-server-pthread does it, for the FD locking callbacks.</p>
+<p>There is no knowledge or dependency in lws itself about pthreads. How the locking is implemented is entirely up to the user code.</p>
+<h2>Libev / Libuv support </h2>
+<p>You can select either or both </p><pre class="fragment"> -DLWS_WITH_LIBEV=1
+ -DLWS_WITH_LIBUV=1
+</pre><p>at cmake configure-time. The user application may use one of the context init options flags </p><pre class="fragment"> LWS_SERVER_OPTION_LIBEV
+ LWS_SERVER_OPTION_LIBUV
+</pre><p>to indicate it will use either of the event libraries.</p>
+<h2>Extension option control from user code </h2>
+<p>User code may set per-connection extension options now, using a new api <code><a class="el" href="group__extensions.html#gae0e24e1768f83a7fb07896ce975704b9">lws_set_extension_option()</a></code>.</p>
+<p>This should be called from the ESTABLISHED callback like this </p><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> lws_set_extension_option(wsi, "permessage-deflate",</div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span>  "rx_buf_size", "12"); /* 1 << 12 */</div></div><!-- fragment --><p>If the extension is not active (missing or not negotiated for the connection, or extensions are disabled on the library) the call is just returns -1. Otherwise the connection's extension has its named option changed.</p>
+<p>The extension may decide to alter or disallow the change, in the example above permessage-deflate restricts the size of his rx output buffer also considering the protocol's rx_buf_size member.</p>
+<h2>Client connections as HTTP[S] rather than WS[S] </h2>
+<p>You may open a generic http client connection using the same struct <a class="el" href="structlws__client__connect__info.html">lws_client_connect_info</a> used to create client ws[s] connections.</p>
+<p>To stay in http[s], set the optional info member "method" to point to the string "GET" instead of the default NULL.</p>
+<p>After the server headers are processed, when payload from the server is available the callback LWS_CALLBACK_RECEIVE_CLIENT_HTTP will be made.</p>
+<p>You can choose whether to process the data immediately, or queue a callback when an outgoing socket is writeable to provide flow control, and process the data in the writable callback.</p>
+<p>Either way you use the api <code>lws_http_client_read()</code> to access the data, eg</p>
+<div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> case LWS_CALLBACK_RECEIVE_CLIENT_HTTP:</div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span>  {</div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span>  char buffer[1024 + LWS_PRE];</div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span>  char *px = buffer + LWS_PRE;</div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span>  int lenx = sizeof(buffer) - LWS_PRE;</div><div class="line"><a name="l00006"></a><span class="lineno"> 6</span> </div><div class="line"><a name="l00007"></a><span class="lineno"> 7</span>  lwsl_notice("LWS_CALLBACK_RECEIVE_CLIENT_HTTP\n");</div><div class="line"><a name="l00008"></a><span class="lineno"> 8</span> </div><div class="line"><a name="l00009"></a><span class="lineno"> 9</span>  /*</div><div class="line"><a name="l00010"></a><span class="lineno"> 10</span>  * Often you need to flow control this by something</div><div class="line"><a name="l00011"></a><span class="lineno"> 11</span>  * else being writable. In that case call the api</div><div class="line"><a name="l00012"></a><span class="lineno"> 12</span>  * to get a callback when writable here, and do the</div><div class="line"><a name="l00013"></a><span class="lineno"> 13</span>  * pending client read in the writeable callback of</div><div class="line"><a name="l00014"></a><span class="lineno"> 14</span>  * the output.</div><div class="line"><a name="l00015"></a><span class="lineno"> 15</span>  */</div><div class="line"><a name="l00016"></a><span class="lineno"> 16</span>  if (lws_http_client_read(wsi, &px, &lenx) < 0)</div><div class="line"><a name="l00017"></a><span class="lineno"> 17</span>  return -1;</div><div class="line"><a name="l00018"></a><span class="lineno"> 18</span>  while (lenx--)</div><div class="line"><a name="l00019"></a><span class="lineno"> 19</span>  putchar(*px++);</div><div class="line"><a name="l00020"></a><span class="lineno"> 20</span>  }</div><div class="line"><a name="l00021"></a><span class="lineno"> 21</span>  break;</div></div><!-- fragment --><h2>Using lws v2 vhosts </h2>
+<p>If you set LWS_SERVER_OPTION_EXPLICIT_VHOSTS options flag when you create your context, it won't create a default vhost using the info struct members for compatibility. Instead you can call <a class="el" href="group__context-and-vhost.html#ga0c54c667ccd9b8b3dddcd123ca72f87c">lws_create_vhost()</a> afterwards to attach one or more vhosts manually.</p>
+<div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> LWS_VISIBLE struct lws_vhost *</div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span> lws_create_vhost(struct lws_context *context,</div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span>  struct lws_context_creation_info *info,</div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span>  struct lws_http_mount *mounts);</div></div><!-- fragment --><p><a class="el" href="group__context-and-vhost.html#ga0c54c667ccd9b8b3dddcd123ca72f87c">lws_create_vhost()</a> uses the same info struct as <a class="el" href="group__context-and-vhost.html#gaf2fff58562caab7510c41eeac85a8648">lws_create_context()</a>, it ignores members related to context and uses the ones meaningful for vhost (marked with VH in <a class="el" href="libwebsockets_8h.html">libwebsockets.h</a>).</p>
+<div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> struct lws_context_creation_info {</div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span>  int port; /* VH */</div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span>  const char *iface; /* VH */</div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span>  const struct lws_protocols *protocols; /* VH */</div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span>  const struct lws_extension *extensions; /* VH */</div><div class="line"><a name="l00006"></a><span class="lineno"> 6</span> ...</div></div><!-- fragment --><p>When you attach the vhost, if the vhost's port already has a listen socket then both vhosts share it and use SNI (is SSL in use) or the Host: header from the client to select the right one. Or if no other vhost already listening the a new listen socket is created.</p>
+<p>There are some new members but mainly it's stuff you used to set at context creation time.</p>
+<h2>Using lws v2 mounts on a vhost </h2>
+<p>The last argument to <a class="el" href="group__context-and-vhost.html#ga0c54c667ccd9b8b3dddcd123ca72f87c">lws_create_vhost()</a> lets you associate a linked list of <a class="el" href="structlws__http__mount.html">lws_http_mount</a> structures with that vhost's URL 'namespace', in a similar way that unix lets you mount filesystems into areas of your / filesystem how you like and deal with the contents transparently.</p>
+<div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> struct lws_http_mount {</div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span>  struct lws_http_mount *mount_next;</div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span>  const char *mountpoint; /* mountpoint in http pathspace, eg, "/" */</div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span>  const char *origin; /* path to be mounted, eg, "/var/www/warmcat.com" */</div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span>  const char *def; /* default target, eg, "index.html" */</div><div class="line"><a name="l00006"></a><span class="lineno"> 6</span> </div><div class="line"><a name="l00007"></a><span class="lineno"> 7</span>  struct lws_protocol_vhost_options *cgienv;</div><div class="line"><a name="l00008"></a><span class="lineno"> 8</span> </div><div class="line"><a name="l00009"></a><span class="lineno"> 9</span>  int cgi_timeout;</div><div class="line"><a name="l00010"></a><span class="lineno"> 10</span>  int cache_max_age;</div><div class="line"><a name="l00011"></a><span class="lineno"> 11</span> </div><div class="line"><a name="l00012"></a><span class="lineno"> 12</span>  unsigned int cache_reusable:1;</div><div class="line"><a name="l00013"></a><span class="lineno"> 13</span>  unsigned int cache_revalidate:1;</div><div class="line"><a name="l00014"></a><span class="lineno"> 14</span>  unsigned int cache_intermediaries:1;</div><div class="line"><a name="l00015"></a><span class="lineno"> 15</span> </div><div class="line"><a name="l00016"></a><span class="lineno"> 16</span>  unsigned char origin_protocol;</div><div class="line"><a name="l00017"></a><span class="lineno"> 17</span>  unsigned char mountpoint_len;</div><div class="line"><a name="l00018"></a><span class="lineno"> 18</span> };</div></div><!-- fragment --><p>The last mount structure should have a NULL mount_next, otherwise it should point to the 'next' mount structure in your list.</p>
+<p>Both the mount structures and the strings must persist until the context is destroyed, since they are not copied but used in place.</p>
+<p><code>.origin_protocol</code> should be one of</p>
+<div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> enum {</div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span>  LWSMPRO_HTTP,</div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span>  LWSMPRO_HTTPS,</div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span>  LWSMPRO_FILE,</div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span>  LWSMPRO_CGI,</div><div class="line"><a name="l00006"></a><span class="lineno"> 6</span>  LWSMPRO_REDIR_HTTP,</div><div class="line"><a name="l00007"></a><span class="lineno"> 7</span>  LWSMPRO_REDIR_HTTPS,</div><div class="line"><a name="l00008"></a><span class="lineno"> 8</span>  LWSMPRO_CALLBACK,</div><div class="line"><a name="l00009"></a><span class="lineno"> 9</span> };</div></div><!-- fragment --><ul>
+<li>LWSMPRO_FILE is used for mapping url namespace to a filesystem directory and serve it automatically.</li>
+<li>LWSMPRO_CGI associates the url namespace with the given CGI executable, which runs when the URL is accessed and the output provided to the client.</li>
+<li>LWSMPRO_REDIR_HTTP and LWSMPRO_REDIR_HTTPS auto-redirect clients to the given origin URL.</li>
+<li>LWSMPRO_CALLBACK causes the http connection to attach to the callback associated with the named protocol (which may be a plugin).</li>
+</ul>
+<h2>Operation of LWSMPRO_CALLBACK mounts </h2>
+<p>The feature provided by CALLBACK type mounts is binding a part of the URL namespace to a named protocol callback handler.</p>
+<p>This allows protocol plugins to handle areas of the URL namespace. For example in test-server-v2.0.c, the URL area "/formtest" is associated with the plugin providing "protocol-post-demo" like this</p>
+<div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> static const struct lws_http_mount mount_post = {</div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span>  NULL, /* linked-list pointer to next*/</div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span>  "/formtest", /* mountpoint in URL namespace on this vhost */</div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span>  "protocol-post-demo", /* handler */</div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span>  NULL, /* default filename if none given */</div><div class="line"><a name="l00006"></a><span class="lineno"> 6</span>  NULL,</div><div class="line"><a name="l00007"></a><span class="lineno"> 7</span>  0,</div><div class="line"><a name="l00008"></a><span class="lineno"> 8</span>  0,</div><div class="line"><a name="l00009"></a><span class="lineno"> 9</span>  0,</div><div class="line"><a name="l00010"></a><span class="lineno"> 10</span>  0,</div><div class="line"><a name="l00011"></a><span class="lineno"> 11</span>  0,</div><div class="line"><a name="l00012"></a><span class="lineno"> 12</span>  LWSMPRO_CALLBACK, /* origin points to a callback */</div><div class="line"><a name="l00013"></a><span class="lineno"> 13</span>  9, /* strlen("/formtest"), ie length of the mountpoint */</div><div class="line"><a name="l00014"></a><span class="lineno"> 14</span> };</div></div><!-- fragment --><p>Client access to /formtest[anything] will be passed to the callback registered with the named protocol, which in this case is provided by a protocol plugin.</p>
+<p>Access by all methods, eg, GET and POST are handled by the callback.</p>
+<p>protocol-post-demo deals with accepting and responding to the html form that is in the test server HTML.</p>
+<p>When a connection accesses a URL related to a CALLBACK type mount, the connection protocol is changed until the next access on the connection to a URL outside the same CALLBACK mount area. User space on the connection is arranged to be the size of the new protocol user space allocation as given in the protocol struct.</p>
+<p>This allocation is only deleted / replaced when the connection accesses a URL region with a different protocol (or the default protocols[0] if no CALLBACK area matches it). </p>
+</div></div><!-- contents -->
+</div><!-- doc-content -->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">Generated by
+ <a href="http://www.doxygen.org/index.html">
+ <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.11 </li>
+ </ul>
+</div>
+</body>
+</html>
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.11"/>
+<title>libwebsockets: Notes about generic-sessions Plugin</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="libwebsockets.org-logo.png"/></td>
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname">libwebsockets
+ </div>
+ <div id="projectbrief">Lightweight C library for HTML5 websockets</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.11 -->
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main Page</span></a></li>
+ <li class="current"><a href="pages.html"><span>Related Pages</span></a></li>
+ <li><a href="modules.html"><span>Modules</span></a></li>
+ <li><a href="annotated.html"><span>Data Structures</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('md_README.generic-sessions.html','');});
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="headertitle">
+<div class="title">Notes about generic-sessions Plugin </div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><h2>Enabling for build </h2>
+<p>Enable at CMake with -DLWS_WITH_GENERIC_SESSIONS=1</p>
+<p>This also needs sqlite3 (libsqlite3-dev or similar package)</p>
+<h2>Introduction </h2>
+<p>The generic-sessions protocol plugin provides cookie-based login authentication for lws web and ws connections.</p>
+<p>The plugin handles everything about generic account registration, email verification, lost password, account deletion, and other generic account management.</p>
+<p>Other code, in another eg, ws protocol handler, only needs very high-level state information from generic-sessions, ie, which user the client is authenticated as. Everything underneath is managed in generic-sessions.</p>
+<ul>
+<li>random 20-byte session id managed in a cookie</li>
+<li>all information related to the session held at the server, nothing managed clientside</li>
+<li>sqlite3 used at the server to manage active sessions and users</li>
+<li>defaults to creating anonymous sessions with no user associated</li>
+<li>admin account (with user-selectable username) is defined in config with a SHA-1 of the password; rest of the accounts are in sqlite3</li>
+<li>user account passwords stored as salted SHA-1 with additional confounder only stored in the JSON config, not the database</li>
+<li>login, logout, register account + email verification built-in with examples</li>
+<li>in a mount, some file suffixes (ie, .js) can be associated with a protocol for the purposes of rewriting symbolnames. These are read-only copies of logged-in server state.</li>
+<li>When your page fetches .js or other rewritten files from that mount, "$lwsgs_user" and so on are rewritten on the fly using chunked transfer encoding</li>
+<li>Eliminates server-side scripting with a few rewritten symbols and javascript on client side</li>
+<li>32-bit bitfield for authentication sectoring, mounts can provide a mask on the loggin-in session's associated server-side bitfield that must be set for access.</li>
+<li>No code (just config) required for, eg, private URL namespace that requires login to access.</li>
+</ul>
+<h2>Integration to HTML </h2>
+<p>Only three steps are needed to integrate lwsgs in your HTML.</p>
+<p>1) lwsgs HTML UI is bundled with the javascript it uses in <code>lwsgs.js</code>, so import that script file in your head section</p>
+<p>2) define an empty div of id "lwsgs" somewhere</p>
+<p>3) Call lwsgs_initial() in your page</p>
+<p>That's it. An example is below</p>
+<div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> <html></div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span>  <head></div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span>  <script src="lwsgs.js"></script></div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span>  <style></div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span>  .body { font-size: 12 }</div><div class="line"><a name="l00006"></a><span class="lineno"> 6</span>  .gstitle { font-size: 18 }</div><div class="line"><a name="l00007"></a><span class="lineno"> 7</span>  </style></div><div class="line"><a name="l00008"></a><span class="lineno"> 8</span>  </head></div><div class="line"><a name="l00009"></a><span class="lineno"> 9</span>  <body style="background-image:url(seats.jpg)"></div><div class="line"><a name="l00010"></a><span class="lineno"> 10</span>  <table style="width:100%;transition: max-height 2s;"></div><div class="line"><a name="l00011"></a><span class="lineno"> 11</span>  <tr></div><div class="line"><a name="l00012"></a><span class="lineno"> 12</span>  <td style="vertical-align:top;text-align:left;width=200px"></div><div class="line"><a name="l00013"></a><span class="lineno"> 13</span>  <img src="lwsgs-logo.png"></div><div class="line"><a name="l00014"></a><span class="lineno"> 14</span>  </td></div><div class="line"><a name="l00015"></a><span class="lineno"> 15</span>  <td style="vertical-align:top;float:right"></div><div class="line"><a name="l00016"></a><span class="lineno"> 16</span>  <div id=lwsgs style="text-align:right;background-color: rgba(255, 255, 255, 0.8);"></div></div><div class="line"><a name="l00017"></a><span class="lineno"> 17</span>  </td></div><div class="line"><a name="l00018"></a><span class="lineno"> 18</span>  </tr></div><div class="line"><a name="l00019"></a><span class="lineno"> 19</span>  </table></div><div class="line"><a name="l00020"></a><span class="lineno"> 20</span>  </form></div><div class="line"><a name="l00021"></a><span class="lineno"> 21</span> </div><div class="line"><a name="l00022"></a><span class="lineno"> 22</span>  <script>lwsgs_initial();</script></div><div class="line"><a name="l00023"></a><span class="lineno"> 23</span> </div><div class="line"><a name="l00024"></a><span class="lineno"> 24</span>  </body></div><div class="line"><a name="l00025"></a><span class="lineno"> 25</span> </html></div></div><!-- fragment --> <h2>Overall Flow </h2>
+<p>When the protocol is initialized, it gets per-vhost information from the config, such as where the sqlite3 databases are to be stored. The admin username and sha-1 of the admin password are also taken from here.</p>
+<p>In the mounts using protocol-generic-sessions, a cookie is maintained against any requests; if no cookie was active on the initial request a new session is created with no attached user.</p>
+<p>So there should always be an active session after any transactions with the server.</p>
+<p>In the example html going to the mount /lwsgs loads a login / register page as the default.</p>
+<p>The <form> in the login page contains 'next url' hidden inputs that let the html 'program' where the form handler will go after a successful admin login, a successful user login and a failed login.</p>
+<p>After a successful login, the sqlite record at the server for the current session is updated to have the logged-in username associated with it.</p>
+<h2>Configuration </h2>
+<p>"auth-mask" defines the autorization sector bits that must be enabled on the session to gain access.</p>
+<p>"auth-mask" 0 is the default.</p>
+<ul>
+<li>b0 is set if you are logged in as a user at all.</li>
+<li>b1 is set if you are logged in with the user configured to be admin</li>
+<li>b2 is set if the account has been verified (the account configured for admin is always verified)</li>
+<li>b3 is set if your session just did the forgot password flow successfully</li>
+</ul>
+<div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> {</div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span>  # things in here can always be served</div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span>  "mountpoint": "/lwsgs",</div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span>  "origin": "file:///usr/share/libwebsockets-test-server/generic-sessions",</div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span>  "origin": "callback://protocol-lws-messageboard",</div><div class="line"><a name="l00006"></a><span class="lineno"> 6</span>  "default": "generic-sessions-login-example.html",</div><div class="line"><a name="l00007"></a><span class="lineno"> 7</span>  "auth-mask": "0",</div><div class="line"><a name="l00008"></a><span class="lineno"> 8</span>  "interpret": {</div><div class="line"><a name="l00009"></a><span class="lineno"> 9</span>  ".js": "protocol-lws-messageboard"</div><div class="line"><a name="l00010"></a><span class="lineno"> 10</span>  }</div><div class="line"><a name="l00011"></a><span class="lineno"> 11</span>  }, {</div><div class="line"><a name="l00012"></a><span class="lineno"> 12</span>  # things in here can only be served if logged in as a user</div><div class="line"><a name="l00013"></a><span class="lineno"> 13</span>  "mountpoint": "/lwsgs/needauth",</div><div class="line"><a name="l00014"></a><span class="lineno"> 14</span>  "origin": "file:///usr/share/libwebsockets-test-server/generic-sessions/needauth",</div><div class="line"><a name="l00015"></a><span class="lineno"> 15</span>  "origin": "callback://protocol-lws-messageboard",</div><div class="line"><a name="l00016"></a><span class="lineno"> 16</span>  "default": "generic-sessions-login-example.html",</div><div class="line"><a name="l00017"></a><span class="lineno"> 17</span>  "auth-mask": "5", # logged in as a verified user</div><div class="line"><a name="l00018"></a><span class="lineno"> 18</span>  "interpret": {</div><div class="line"><a name="l00019"></a><span class="lineno"> 19</span>  ".js": "protocol-lws-messageboard"</div><div class="line"><a name="l00020"></a><span class="lineno"> 20</span>  }</div><div class="line"><a name="l00021"></a><span class="lineno"> 21</span>  }, {</div><div class="line"><a name="l00022"></a><span class="lineno"> 22</span>  # things in here can only be served if logged in as admin</div><div class="line"><a name="l00023"></a><span class="lineno"> 23</span>  "mountpoint": "/lwsgs/needadmin",</div><div class="line"><a name="l00024"></a><span class="lineno"> 24</span>  "origin": "file:///usr/share/libwebsockets-test-server/generic-sessions/needadmin",</div><div class="line"><a name="l00025"></a><span class="lineno"> 25</span>  "origin": "callback://protocol-lws-messageboard",</div><div class="line"><a name="l00026"></a><span class="lineno"> 26</span>  "default": "generic-sessions-login-example.html",</div><div class="line"><a name="l00027"></a><span class="lineno"> 27</span>  "auth-mask": "7", # b2 = verified (by email / or admin), b1 = admin, b0 = logged in with any user name</div><div class="line"><a name="l00028"></a><span class="lineno"> 28</span>  "interpret": {</div><div class="line"><a name="l00029"></a><span class="lineno"> 29</span>  ".js": "protocol-lws-messageboard"</div><div class="line"><a name="l00030"></a><span class="lineno"> 30</span>  }</div><div class="line"><a name="l00031"></a><span class="lineno"> 31</span>  }</div></div><!-- fragment --><p> Note that the name of the real application protocol that uses generic-sessions is used, not generic-sessions itself.</p>
+<p>The vhost configures the storage dir, admin credentials and session cookie lifetimes:</p>
+<div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span>  "ws-protocols": [{</div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span>  "protocol-generic-sessions": {</div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span>  "status": "ok",</div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span>  "admin-user": "admin",</div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span> </div><div class="line"><a name="l00006"></a><span class="lineno"> 6</span> # create the pw hash like this (for the example pw, "jipdocesExunt" )</div><div class="line"><a name="l00007"></a><span class="lineno"> 7</span> # $ echo -n "jipdocesExunt" | sha1sum</div><div class="line"><a name="l00008"></a><span class="lineno"> 8</span> # 046ce9a9cca769e85798133be06ef30c9c0122c9 -</div><div class="line"><a name="l00009"></a><span class="lineno"> 9</span> #</div><div class="line"><a name="l00010"></a><span class="lineno"> 10</span> # Obviously ** change this password hash to a secret one before deploying **</div><div class="line"><a name="l00011"></a><span class="lineno"> 11</span> #</div><div class="line"><a name="l00012"></a><span class="lineno"> 12</span>  "admin-password-sha1": "046ce9a9cca769e85798133be06ef30c9c0122c9",</div><div class="line"><a name="l00013"></a><span class="lineno"> 13</span>  "session-db": "/var/www/sessions/lws.sqlite3",</div><div class="line"><a name="l00014"></a><span class="lineno"> 14</span>  "timeout-idle-secs": "600",</div><div class="line"><a name="l00015"></a><span class="lineno"> 15</span>  "timeout-anon-idle-secs": "1200",</div><div class="line"><a name="l00016"></a><span class="lineno"> 16</span>  "timeout-absolute-secs": "6000",</div><div class="line"><a name="l00017"></a><span class="lineno"> 17</span> # the confounder is part of the salted password hashes. If this config</div><div class="line"><a name="l00018"></a><span class="lineno"> 18</span> # file is in a 0700 root:root dir, an attacker with apache credentials</div><div class="line"><a name="l00019"></a><span class="lineno"> 19</span> # will have to get the confounder out of the process image to even try</div><div class="line"><a name="l00020"></a><span class="lineno"> 20</span> # to guess the password hashes.</div><div class="line"><a name="l00021"></a><span class="lineno"> 21</span>  "confounder": "Change to <=31 chars of junk",</div><div class="line"><a name="l00022"></a><span class="lineno"> 22</span> </div><div class="line"><a name="l00023"></a><span class="lineno"> 23</span>  "email-from": "noreply@example.com",</div><div class="line"><a name="l00024"></a><span class="lineno"> 24</span>  "email-smtp-ip": "127.0.0.1",</div><div class="line"><a name="l00025"></a><span class="lineno"> 25</span>  "email-expire": "3600",</div><div class="line"><a name="l00026"></a><span class="lineno"> 26</span>  "email-helo": "myhost.com",</div><div class="line"><a name="l00027"></a><span class="lineno"> 27</span>  "email-contact-person": "Set Me <real-person@email.com>",</div><div class="line"><a name="l00028"></a><span class="lineno"> 28</span>  "email-confirm-url-base": "http://localhost:7681/lwsgs"</div><div class="line"><a name="l00029"></a><span class="lineno"> 29</span>  }</div></div><!-- fragment --><p>The email- related settings control generation of automatic emails for registration and forgotten password.</p>
+<ul>
+<li><code>email-from</code>: The email address automatic emails are sent from</li>
+<li><code>email-smtp-ip</code>: Normally 127.0.0.1, if you have a suitable server on port 25 on your lan you can use this instead here.</li>
+<li><code>email-expire</code>: Seconds that links sent in email will work before being deleted</li>
+<li><code>email-helo</code>: HELO to use when communicating with your SMTP server</li>
+<li><code>email-contact-person</code>: mentioned in the automatic emails as a human who can answer questions</li>
+<li><code>email-confirm-url-base</code>: the URL to start links with in the emails, so the recipient can get back to the web server</li>
+</ul>
+<p>The real protocol that makes use of generic-sessions must also be listed and any configuration it needs given</p>
+<div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> "protocol-lws-messageboard": {</div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span>  "status": "ok",</div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span>  "message-db": "/var/www/sessions/messageboard.sqlite3"</div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span> },</div></div><!-- fragment --><p>Notice the real application uses his own sqlite db, no details about how generic-sessions works or how it stores data are available to it.</p>
+<h2>Password Confounder </h2>
+<p>You can also define a per-vhost confounder shown in the example above, used when aggregating the password with the salt when it is hashed. Any attacker will also need to get the confounder along with the database, which you can make harder by making the config dir only eneterable / readable by root.</p>
+<h2>Preparing the db directory </h2>
+<p>You will have to prepare the db directory so it's suitable for the lwsws user to use, that usually means apache, eg</p>
+<div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> # mkdir -p /var/www/sessions</div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span> # chown root:apache /var/www/sessions</div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span> # chmod 770 /var/www/sessions</div></div><!-- fragment --><h2>Email configuration </h2>
+<p>lwsgs will can send emails by talking to an SMTP server on localhost:25. That will usually be sendmail or postfix, you should confirm that works first by itself using the <code>mail</code> application to send on it.</p>
+<p>lwsgs has been tested on stock Fedora sendmail and postfix.</p>
+<h2>Integration with another protocol </h2>
+<p>lwsgs is designed to provide sessions and accounts in a standalone and generic way.</p>
+<p>But it's not useful by itself, there will always be the actual application who wants to make use of generic-sessions features.</p>
+<p>The basic approach is the 'real' protocol handler (usually a plugin itself) subclasses the generic-sessions plugin and calls through to it by default.</p>
+<p>The "real" protocol handler entirely deals with ws-related stuff itself, since generic-sessions does not use ws. But for</p>
+<ul>
+<li>LWS_CALLBACK_HTTP</li>
+<li>LWS_CALLBACK_HTTP_BODY</li>
+<li>LWS_CALLBACK_HTTP_BODY_COMPLETION</li>
+<li>LWS_CALLBACK_HTTP_DROP_PROTOCOL</li>
+</ul>
+<p>the "real" protocol handler checks if it recognizes the activity (eg, his own POST form URL) and if not, passes stuff through to the generic-sessions protocol callback to handle it. To simplify matters the real protocol can just pass through any unhandled messages to generic-sessions.</p>
+<p>The "real" protocol can get a pointer to generic-sessions protocol on the same vhost using</p>
+<div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> vhd->gsp = lws_vhost_name_to_protocol(vhd->vh, "protocol-generic-sessions");</div></div><!-- fragment --><p>The "real" protocol must also arrange generic-sessions per_session_data in his own per-session allocation. To allow keeping generic-sessions opaque, the real protocol must allocate that space at runtime, using the pss size the generic-sessions protocol struct exposes</p>
+<div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> struct per_session_data__myapp {</div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span>  void *pss_gs;</div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span> ...</div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span> </div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span>  pss->pss_gs = malloc(vhd->gsp->per_session_data_size);</div></div><!-- fragment --><p>The allocation reserved for generic-sessions is then used as user_space when the real protocol calls through to the generic-sessions callback</p>
+<div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> vhd->gsp->callback(wsi, reason, &pss->pss_gs, in, len);</div></div><!-- fragment --><p>In that way the "real" protocol can subclass generic-sessions functionality.</p>
+<p>To ease management of these secondary allocations, there are callbacks that occur when a wsi binds to a protocol and when the binding is dropped. These should be used to malloc and free and kind of per-connection secondary allocations.</p>
+<div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> case LWS_CALLBACK_HTTP_BIND_PROTOCOL:</div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span>  if (!pss || pss->pss_gs)</div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span>  break;</div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span> </div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span>  pss->pss_gs = malloc(vhd->gsp->per_session_data_size);</div><div class="line"><a name="l00006"></a><span class="lineno"> 6</span>  if (!pss->pss_gs)</div><div class="line"><a name="l00007"></a><span class="lineno"> 7</span>  return -1;</div><div class="line"><a name="l00008"></a><span class="lineno"> 8</span> </div><div class="line"><a name="l00009"></a><span class="lineno"> 9</span>  memset(pss->pss_gs, 0, vhd->gsp->per_session_data_size);</div><div class="line"><a name="l00010"></a><span class="lineno"> 10</span>  break;</div><div class="line"><a name="l00011"></a><span class="lineno"> 11</span> </div><div class="line"><a name="l00012"></a><span class="lineno"> 12</span> case LWS_CALLBACK_HTTP_DROP_PROTOCOL:</div><div class="line"><a name="l00013"></a><span class="lineno"> 13</span>  if (vhd->gsp->callback(wsi, reason, pss ? pss->pss_gs : NULL, in, len))</div><div class="line"><a name="l00014"></a><span class="lineno"> 14</span>  return -1;</div><div class="line"><a name="l00015"></a><span class="lineno"> 15</span> </div><div class="line"><a name="l00016"></a><span class="lineno"> 16</span>  if (pss->pss_gs) {</div><div class="line"><a name="l00017"></a><span class="lineno"> 17</span>  free(pss->pss_gs);</div><div class="line"><a name="l00018"></a><span class="lineno"> 18</span>  pss->pss_gs = NULL;</div><div class="line"><a name="l00019"></a><span class="lineno"> 19</span>  }</div><div class="line"><a name="l00020"></a><span class="lineno"> 20</span>  break;</div></div><!-- fragment --><h2>Getting session-specific information from another protocol </h2>
+<p>At least at the time when someone tries to upgrade an http(s) connection to ws(s) with your real protocol, it is necessary to confirm the cookie the http(s) connection has with generic-sessions and find out his username and other info.</p>
+<p>Generic sessions lets another protocol check it again by calling his callback, and lws itself provides a generic session info struct to pass the related data</p>
+<div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> struct lws_session_info {</div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span>  char username[32];</div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span>  char email[100];</div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span>  char ip[72];</div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span>  unsigned int mask;</div><div class="line"><a name="l00006"></a><span class="lineno"> 6</span>  char session[42];</div><div class="line"><a name="l00007"></a><span class="lineno"> 7</span> };</div><div class="line"><a name="l00008"></a><span class="lineno"> 8</span> </div><div class="line"><a name="l00009"></a><span class="lineno"> 9</span> struct lws_session_info sinfo;</div><div class="line"><a name="l00010"></a><span class="lineno"> 10</span> ...</div><div class="line"><a name="l00011"></a><span class="lineno"> 11</span> vhd->gsp->callback(wsi, LWS_CALLBACK_SESSION_INFO,</div><div class="line"><a name="l00012"></a><span class="lineno"> 12</span>  &pss->pss_gs, &sinfo, 0);</div></div><!-- fragment --><p>After the call to generic-sessions, the results can be</p>
+<ul>
+<li>all the strings will be zero-length and .mask zero, there is no usable cookie<ul>
+<li>only .ip and .session are set: the cookie is OK but no user logged in</li>
+<li>all the strings contain information about the logged-in user</li>
+</ul>
+</li>
+</ul>
+<p>the real protocol can use this to reject attempts to open ws connections from http connections that are not authenticated; afterwards there's no need to check the ws connection auth status again. </p>
+</div></div><!-- contents -->
+</div><!-- doc-content -->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">Generated by
+ <a href="http://www.doxygen.org/index.html">
+ <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.11 </li>
+ </ul>
+</div>
+</body>
+</html>
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.11"/>
+<title>libwebsockets: Notes about lwsws</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="libwebsockets.org-logo.png"/></td>
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname">libwebsockets
+ </div>
+ <div id="projectbrief">Lightweight C library for HTML5 websockets</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.11 -->
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main Page</span></a></li>
+ <li class="current"><a href="pages.html"><span>Related Pages</span></a></li>
+ <li><a href="modules.html"><span>Modules</span></a></li>
+ <li><a href="annotated.html"><span>Data Structures</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('md_README.lwsws.html','');});
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="headertitle">
+<div class="title">Notes about lwsws </div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><h2>Libwebsockets Web Server </h2>
+<p>lwsws is an implementation of a very lightweight, ws-capable generic web server, which uses libwebsockets to implement everything underneath.</p>
+<h2>Build </h2>
+<p>Just enable -DLWS_WITH_LWSWS=1 at cmake-time.</p>
+<p>It enables libuv and plugin support automatically.</p>
+<h2>Configuration </h2>
+<p>lwsws uses JSON config files, they're pure JSON but # may be used to turn the rest of the line into a comment.</p>
+<p>There is a single file intended for global settings</p>
+<p>/etc/lwsws/conf </p><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> # these are the server global settings</div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span> # stuff related to vhosts should go in one</div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span> # file per vhost in ../conf.d/</div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span> </div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span> {</div><div class="line"><a name="l00006"></a><span class="lineno"> 6</span>  "global": {</div><div class="line"><a name="l00007"></a><span class="lineno"> 7</span>  "uid": "48", # apache user</div><div class="line"><a name="l00008"></a><span class="lineno"> 8</span>  "gid": "48", # apache user</div><div class="line"><a name="l00009"></a><span class="lineno"> 9</span>  "count-threads": "1",</div><div class="line"><a name="l00010"></a><span class="lineno"> 10</span>  "server-string": "myserver v1", # returned in http headers</div><div class="line"><a name="l00011"></a><span class="lineno"> 11</span>  "init-ssl": "yes"</div><div class="line"><a name="l00012"></a><span class="lineno"> 12</span>  }</div><div class="line"><a name="l00013"></a><span class="lineno"> 13</span> }</div></div><!-- fragment --><p> and a config directory intended to take one file per vhost</p>
+<p>/etc/lwsws/conf.d/warmcat.com </p><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> {</div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span>  "vhosts": [{</div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span>  "name": "warmcat.com",</div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span>  "port": "443",</div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span>  "interface": "eth0", # optional</div><div class="line"><a name="l00006"></a><span class="lineno"> 6</span>  "host-ssl-key": "/etc/pki/tls/private/warmcat.com.key", # if given enable ssl</div><div class="line"><a name="l00007"></a><span class="lineno"> 7</span>  "host-ssl-cert": "/etc/pki/tls/certs/warmcat.com.crt",</div><div class="line"><a name="l00008"></a><span class="lineno"> 8</span>  "host-ssl-ca": "/etc/pki/tls/certs/warmcat.com.cer",</div><div class="line"><a name="l00009"></a><span class="lineno"> 9</span>  "mounts": [{ # autoserve</div><div class="line"><a name="l00010"></a><span class="lineno"> 10</span>  "mountpoint": "/",</div><div class="line"><a name="l00011"></a><span class="lineno"> 11</span>  "origin": "file:///var/www/warmcat.com",</div><div class="line"><a name="l00012"></a><span class="lineno"> 12</span>  "default": "index.html"</div><div class="line"><a name="l00013"></a><span class="lineno"> 13</span>  }]</div><div class="line"><a name="l00014"></a><span class="lineno"> 14</span>  }]</div><div class="line"><a name="l00015"></a><span class="lineno"> 15</span> }</div></div><!-- fragment --><p> To get started quickly, an example config reproducing the old test server on port 7681, non-SSL is provided. To set it up </p><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> # mkdir -p /etc/lwsws/conf.d /var/log/lwsws</div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span> # cp ./lwsws/etc-lwsws-conf-EXAMPLE /etc/lwsws/conf</div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span> # cp ./lwsws/etc-lwsws-conf.d-localhost-EXAMPLE /etc/lwsws/conf.d/test-server</div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span> # sudo lwsws</div></div><!-- fragment --> <h2>Vhosts </h2>
+<p>One server can run many vhosts, where SSL is in use SNI is used to match the connection to a vhost and its vhost-specific SSL keys during SSL negotiation.</p>
+<p>Listing multiple vhosts looks something like this </p><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> {</div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span>  "vhosts": [ {</div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span>  "name": "localhost",</div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span>  "port": "443",</div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span>  "host-ssl-key": "/etc/pki/tls/private/libwebsockets.org.key",</div><div class="line"><a name="l00006"></a><span class="lineno"> 6</span>  "host-ssl-cert": "/etc/pki/tls/certs/libwebsockets.org.crt",</div><div class="line"><a name="l00007"></a><span class="lineno"> 7</span>  "host-ssl-ca": "/etc/pki/tls/certs/libwebsockets.org.cer",</div><div class="line"><a name="l00008"></a><span class="lineno"> 8</span>  "mounts": [{</div><div class="line"><a name="l00009"></a><span class="lineno"> 9</span>  "mountpoint": "/",</div><div class="line"><a name="l00010"></a><span class="lineno"> 10</span>  "origin": "file:///var/www/libwebsockets.org",</div><div class="line"><a name="l00011"></a><span class="lineno"> 11</span>  "default": "index.html"</div><div class="line"><a name="l00012"></a><span class="lineno"> 12</span>  }, {</div><div class="line"><a name="l00013"></a><span class="lineno"> 13</span>  "mountpoint": "/testserver",</div><div class="line"><a name="l00014"></a><span class="lineno"> 14</span>  "origin": "file:///usr/local/share/libwebsockets-test-server",</div><div class="line"><a name="l00015"></a><span class="lineno"> 15</span>  "default": "test.html"</div><div class="line"><a name="l00016"></a><span class="lineno"> 16</span>  }],</div><div class="line"><a name="l00017"></a><span class="lineno"> 17</span>  # which protocols are enabled for this vhost, and optional</div><div class="line"><a name="l00018"></a><span class="lineno"> 18</span>  # vhost-specific config options for the protocol</div><div class="line"><a name="l00019"></a><span class="lineno"> 19</span>  #</div><div class="line"><a name="l00020"></a><span class="lineno"> 20</span>  "ws-protocols": [{</div><div class="line"><a name="l00021"></a><span class="lineno"> 21</span>  "warmcat,timezoom": {</div><div class="line"><a name="l00022"></a><span class="lineno"> 22</span>  "status": "ok"</div><div class="line"><a name="l00023"></a><span class="lineno"> 23</span>  }</div><div class="line"><a name="l00024"></a><span class="lineno"> 24</span>  }]</div><div class="line"><a name="l00025"></a><span class="lineno"> 25</span>  },</div><div class="line"><a name="l00026"></a><span class="lineno"> 26</span>  {</div><div class="line"><a name="l00027"></a><span class="lineno"> 27</span>  "name": "localhost",</div><div class="line"><a name="l00028"></a><span class="lineno"> 28</span>  "port": "7681",</div><div class="line"><a name="l00029"></a><span class="lineno"> 29</span>  "host-ssl-key": "/etc/pki/tls/private/libwebsockets.org.key",</div><div class="line"><a name="l00030"></a><span class="lineno"> 30</span>  "host-ssl-cert": "/etc/pki/tls/certs/libwebsockets.org.crt",</div><div class="line"><a name="l00031"></a><span class="lineno"> 31</span>  "host-ssl-ca": "/etc/pki/tls/certs/libwebsockets.org.cer",</div><div class="line"><a name="l00032"></a><span class="lineno"> 32</span>  "mounts": [{</div><div class="line"><a name="l00033"></a><span class="lineno"> 33</span>  "mountpoint": "/",</div><div class="line"><a name="l00034"></a><span class="lineno"> 34</span>  "origin": ">https://localhost"</div><div class="line"><a name="l00035"></a><span class="lineno"> 35</span>  }]</div><div class="line"><a name="l00036"></a><span class="lineno"> 36</span>  },</div><div class="line"><a name="l00037"></a><span class="lineno"> 37</span>  {</div><div class="line"><a name="l00038"></a><span class="lineno"> 38</span>  "name": "localhost",</div><div class="line"><a name="l00039"></a><span class="lineno"> 39</span>  "port": "80",</div><div class="line"><a name="l00040"></a><span class="lineno"> 40</span>  "mounts": [{</div><div class="line"><a name="l00041"></a><span class="lineno"> 41</span>  "mountpoint": "/",</div><div class="line"><a name="l00042"></a><span class="lineno"> 42</span>  "origin": ">https://localhost"</div><div class="line"><a name="l00043"></a><span class="lineno"> 43</span>  }]</div><div class="line"><a name="l00044"></a><span class="lineno"> 44</span>  }</div><div class="line"><a name="l00045"></a><span class="lineno"> 45</span> </div><div class="line"><a name="l00046"></a><span class="lineno"> 46</span>  ]</div><div class="line"><a name="l00047"></a><span class="lineno"> 47</span> }</div></div><!-- fragment --><p>That sets up three vhosts all called "localhost" on ports 443 and 7681 with SSL, and port 80 without SSL but with a forced redirect to <a href="https://localhost">https://localhost</a></p>
+<h2>Vhost name and port </h2>
+<p>The vhost name field is used to match on incoming SNI or Host: header, so it must always be the host name used to reach the vhost externally.</p>
+<ul>
+<li>Vhosts may have the same name and different ports, these will each create a listening socket on the appropriate port.</li>
+<li>Vhosts may also have the same port and different name: these will be treated as true vhosts on one listening socket and the active vhost decided at SSL negotiation time (via SNI) or if no SSL, then after the Host: header from the client has been parsed.</li>
+</ul>
+<h2>Protocols </h2>
+<p>Vhosts by default have available the union of any initial protocols from context creation time, and any protocols exposed by plugins.</p>
+<p>Vhosts can select which plugins they want to offer and give them per-vhost settings using this syntax </p><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> "ws-protocols": [{</div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span>  "warmcat-timezoom": {</div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span>  "status": "ok"</div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span>  }</div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span> }]</div></div><!-- fragment --><p>The "x":"y" parameters like "status":"ok" are made available to the protocol during its per-vhost LWS_CALLBACK_PROTOCOL_INIT ( is a pointer to a linked list of struct <a class="el" href="structlws__protocol__vhost__options.html">lws_protocol_vhost_options</a> containing the name and value pointers).</p>
+<p>To indicate that a protocol should be used when no Protocol: header is sent by the client, you can use "default": "1" </p><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> "ws-protocols": [{</div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span>  "warmcat-timezoom": {</div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span>  "status": "ok",</div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span>  "default": "1"</div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span>  }</div><div class="line"><a name="l00006"></a><span class="lineno"> 6</span> }]</div></div><!-- fragment --><h2>Other vhost options </h2>
+<ul>
+<li>If the three options <code>host-ssl-cert</code>, <code>host-ssl-ca</code> and <code>host-ssl-key</code> are given, then the vhost supports SSL.</li>
+</ul>
+<p>Each vhost may have its own certs, SNI is used during the initial connection negotiation to figure out which certs to use by the server name it's asking for from the request DNS name.</p>
+<ul>
+<li><code>keeplive-timeout</code> (in secs) defaults to 60 for lwsws, it may be set as a vhost option</li>
+<li><code>interface</code> lets you specify which network interface to listen on, if not given listens on all</li>
+<li>"`unix-socket`": "1" causes the unix socket specified in the interface option to be used instead of an INET socket</li>
+<li>"`sts`": "1" causes lwsws to send a Strict Transport Security header with responses that informs the client he should never accept to connect to this address using http. This is needed to get the A+ security rating from SSL Labs for your server.</li>
+<li>"`access-log`": "filepath" sets where apache-compatible access logs will be written</li>
+<li><code>"enable-client-ssl"</code>: <code>"1"</code> enables the vhost's client SSL context, you will need this if you plan to create client conections on the vhost that will use SSL. You don't need it if you only want http / ws client connections.</li>
+<li>"`ciphers`": "<cipher list>" sets the allowed list of ciphers and key exchange protocols for the vhost. The default list is restricted to only those providing PFS (Perfect Forward Secrecy) on the author's Fedora system.</li>
+</ul>
+<p>If you need to allow weaker ciphers,you can provide an alternative list here per-vhost.</p>
+<ul>
+<li>"`ecdh-curve`": "<curve name>" The default ecdh curve is "prime256v1", but you can override it here, per-vhost</li>
+<li>"`noipv6`": "on" Disable ipv6 completely for this vhost</li>
+<li>"`ipv6only`": "on" Only allow ipv6 on this vhost / "off" only allow ipv4 on this vhost</li>
+<li>"`ssl-option-set`": "<decimal>" Sets the SSL option flag value for the vhost. It may be used multiple times and OR's the flags together.</li>
+</ul>
+<p>The values are derived from /usr/include/openssl/ssl.h </p><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> # define SSL_OP_NO_TLSv1_1 0x10000000L</div></div><!-- fragment --><p>would equate to</p>
+<div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> "`ssl-option-set`": "268435456"</div></div><!-- fragment --><ul>
+<li>"`ssl-option-clear'": "<decimal>" Clears the SSL option flag value for the vhost. It may be used multiple times and OR's the flags together.</li>
+</ul>
+<h2>Mounts </h2>
+<p>Where mounts are given in the vhost definition, then directory contents may be auto-served if it matches the mountpoint.</p>
+<p>Mount protocols are used to control what kind of translation happens</p>
+<ul>
+<li><a href="file://">file://</a> serve the uri using the remainder of the url past the mountpoint based on the origin directory.</li>
+</ul>
+<p>Eg, with this mountpoint </p><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> {</div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span>  "mountpoint": "/",</div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span>  "origin": "file:///var/www/mysite.com",</div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span>  "default": "/"</div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span> }</div></div><!-- fragment --><p> The uri /file.jpg would serve /var/www/mysite.com/file.jpg, since / matched.</p>
+<ul>
+<li>^http:// or ^https:// these cause any url matching the mountpoint to issue a redirect to the origin url</li>
+<li>cgi:// this causes any matching url to be given to the named cgi, eg <div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> {</div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span>  "mountpoint": "/git",</div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span>  "origin": "cgi:///var/www/cgi-bin/cgit",</div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span>  "default": "/"</div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span> }, {</div><div class="line"><a name="l00006"></a><span class="lineno"> 6</span>  "mountpoint": "/cgit-data",</div><div class="line"><a name="l00007"></a><span class="lineno"> 7</span>  "origin": "file:///usr/share/cgit",</div><div class="line"><a name="l00008"></a><span class="lineno"> 8</span>  "default": "/"</div><div class="line"><a name="l00009"></a><span class="lineno"> 9</span> },</div></div><!-- fragment --> would cause the url /git/myrepo to pass "myrepo" to the cgi /var/www/cgi-bin/cgit and send the results to the client.</li>
+</ul>
+<h2>Other mount options </h2>
+<p>1) When using a cgi:// protcol origin at a mountpoint, you may also give cgi environment variables specific to the mountpoint like this </p><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> {</div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span>  "mountpoint": "/git",</div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span>  "origin": "cgi:///var/www/cgi-bin/cgit",</div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span>  "default": "/",</div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span>  "cgi-env": [{</div><div class="line"><a name="l00006"></a><span class="lineno"> 6</span>  "CGIT_CONFIG": "/etc/cgitrc/libwebsockets.org"</div><div class="line"><a name="l00007"></a><span class="lineno"> 7</span>  }]</div><div class="line"><a name="l00008"></a><span class="lineno"> 8</span> }</div></div><!-- fragment --><p> This allows you to customize one cgi depending on the mountpoint (and / or vhost).</p>
+<p>2) It's also possible to set the cgi timeout (in secs) per cgi:// mount, like this </p><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> "cgi-timeout": "30"</div></div><!-- fragment --><p> 3) <code>callback://</code> protocol may be used when defining a mount to associate a named protocol callback with the URL namespace area. For example </p><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> {</div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span>  "mountpoint": "/formtest",</div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span>  "origin": "callback://protocol-post-demo"</div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span> }</div></div><!-- fragment --><p> All handling of client access to /formtest[anything] will be passed to the callback registered to the protocol "protocol-post-demo".</p>
+<p>This is useful for handling POST http body content or general non-cgi http payload generation inside a plugin.</p>
+<p>See the related notes in README.coding.md</p>
+<p>4) Cache policy of the files in the mount can also be set. If no options are given, the content is marked uncacheable. </p><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> {</div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span>  "mountpoint": "/",</div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span>  "origin": "file:///var/www/mysite.com",</div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span>  "cache-max-age": "60", # seconds</div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span>  "cache-reuse": "1", # allow reuse at client at all</div><div class="line"><a name="l00006"></a><span class="lineno"> 6</span>  "cache-revalidate": "1", # check it with server each time</div><div class="line"><a name="l00007"></a><span class="lineno"> 7</span>  "cache-intermediaries": "1" # allow intermediary caches to hold</div><div class="line"><a name="l00008"></a><span class="lineno"> 8</span> }</div></div><!-- fragment --><p>4) You can also define a list of additional mimetypes per-mount </p><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> "extra-mimetypes": {</div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span>  ".zip": "application/zip",</div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span>  ".doc": "text/evil"</div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span>  }</div></div><!-- fragment --><h2>Plugins </h2>
+<p>Protcols and extensions may also be provided from "plugins", these are lightweight dynamic libraries. They are scanned for at init time, and any protocols and extensions found are added to the list given at context creation time.</p>
+<p>Protocols receive init (LWS_CALLBACK_PROTOCOL_INIT) and destruction (LWS_CALLBACK_PROTOCOL_DESTROY) callbacks per-vhost, and there are arrangements they can make per-vhost allocations and get hold of the correct pointer from the wsi at the callback.</p>
+<p>This allows a protocol to choose to strictly segregate data on a per-vhost basis, and also allows the plugin to handle its own initialization and context storage.</p>
+<p>To help that happen conveniently, there are some new apis</p>
+<ul>
+<li>lws_vhost_get(wsi)</li>
+<li>lws_protocol_get(wsi)</li>
+<li>lws_callback_on_writable_all_protocol_vhost(vhost, protocol)</li>
+<li>lws_protocol_vh_priv_zalloc(vhost, protocol, size)</li>
+<li>lws_protocol_vh_priv_get(vhost, protocol)</li>
+</ul>
+<p>dumb increment, mirror and status protocol plugins are provided as examples.</p>
+<h2>Additional plugin search paths </h2>
+<p>Packages that have their own lws plugins can install them in their own preferred dir and ask lwsws to scan there by using a config fragment like this, in its own conf.d/ file managed by the other package </p><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> {</div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span>  "global": {</div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span>  "plugin-dir": "/usr/local/share/coherent-timeline/plugins"</div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span>  }</div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span> }</div></div><!-- fragment --><h2>lws-server-status plugin </h2>
+<p>One provided protocol can be used to monitor the server status.</p>
+<p>Enable the protocol like this on a vhost's ws-protocols section </p><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> "lws-server-status": {</div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span>  "status": "ok",</div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span>  "update-ms": "5000"</div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span> }</div></div><!-- fragment --><p> "update-ms" is used to control how often updated JSON is sent on a ws link.</p>
+<p>And map the provided HTML into the vhost in the mounts section </p><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> {</div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span>  "mountpoint": "/server-status",</div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span>  "origin": "file:///usr/local/share/libwebsockets-test-server/server-status",</div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span>  "default": "server-status.html"</div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span> }</div></div><!-- fragment --><p> You might choose to put it on its own vhost which has "interface": "lo", so it's not externally visible.</p>
+<h2>Integration with Systemd </h2>
+<p>lwsws needs a service file like this as <code>/usr/lib/systemd/system/lwsws.service</code> </p><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> [Unit]</div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span> Description=Libwebsockets Web Server</div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span> After=syslog.target</div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span> </div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span> [Service]</div><div class="line"><a name="l00006"></a><span class="lineno"> 6</span> ExecStart=/usr/local/bin/lwsws</div><div class="line"><a name="l00007"></a><span class="lineno"> 7</span> StandardError=null</div><div class="line"><a name="l00008"></a><span class="lineno"> 8</span> </div><div class="line"><a name="l00009"></a><span class="lineno"> 9</span> [Install]</div><div class="line"><a name="l00010"></a><span class="lineno"> 10</span> WantedBy=multi-user.target</div></div><!-- fragment --><p>You can find this prepared in <code>./lwsws/usr-lib-systemd-system-lwsws.service</code></p>
+<h2>Integration with logrotate </h2>
+<p>For correct operation with logrotate, <code>/etc/logrotate.d/lwsws</code> (if that's where we're putting the logs) should contain </p><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> /var/log/lwsws/*log {</div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span>  copytruncate</div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span>  missingok</div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span>  notifempty</div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span>  delaycompress</div><div class="line"><a name="l00006"></a><span class="lineno"> 6</span> }</div></div><!-- fragment --><p> You can find this prepared in <code>/lwsws/etc-logrotate.d-lwsws</code></p>
+<p>Prepare the log directory like this</p>
+<div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> sudo mkdir /var/log/lwsws</div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span> sudo chmod 700 /var/log/lwsws</div></div><!-- fragment --> </div></div><!-- contents -->
+</div><!-- doc-content -->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">Generated by
+ <a href="http://www.doxygen.org/index.html">
+ <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.11 </li>
+ </ul>
+</div>
+</body>
+</html>
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.11"/>
+<title>libwebsockets: Notes about lws test apps</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="libwebsockets.org-logo.png"/></td>
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname">libwebsockets
+ </div>
+ <div id="projectbrief">Lightweight C library for HTML5 websockets</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.11 -->
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main Page</span></a></li>
+ <li class="current"><a href="pages.html"><span>Related Pages</span></a></li>
+ <li><a href="modules.html"><span>Modules</span></a></li>
+ <li><a href="annotated.html"><span>Data Structures</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('md_README.test-apps.html','');});
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="headertitle">
+<div class="title">Notes about lws test apps </div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><h2>Testing server with a browser </h2>
+<p>If you run <a href="test-server/test-server.c">libwebsockets-test-server</a> and point your browser (eg, Chrome) to </p><pre class="fragment"> http://127.0.0.1:7681
+</pre><p>It will fetch a script in the form of <code>test.html</code>, and then run the script in there on the browser to open a websocket connection. Incrementing numbers should appear in the browser display.</p>
+<p>By default the test server logs to both stderr and syslog, you can control what is logged using <code>-d <log level></code>, see later.</p>
+<h2>Running test server as a Daemon </h2>
+<p>You can use the -D option on the test server to have it fork into the background and return immediately. In this daemonized mode all stderr is disabled and logging goes only to syslog, eg, <code>/var/log/messages</code> or similar.</p>
+<p>The server maintains a lockfile at <code>/tmp/.lwsts-lock</code> that contains the pid of the master process, and deletes this file when the master process terminates.</p>
+<p>To stop the daemon, do </p><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> $ kill cat /tmp/.lwsts-lock </div></div><!-- fragment --><p> If it finds a stale lock (the pid mentioned in the file does not exist any more) it will delete the lock and create a new one during startup.</p>
+<p>If the lock is valid, the daemon will exit with a note on stderr that it was already running.</p>
+<h2>Using SSL on the server side </h2>
+<p>To test it using SSL/WSS, just run the test server with </p><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> $ libwebsockets-test-server --ssl</div></div><!-- fragment --><p> and use the URL </p><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> https://127.0.0.1:7681</div></div><!-- fragment --><p> The connection will be entirely encrypted using some generated certificates that your browser will not accept, since they are not signed by any real Certificate Authority. Just accept the certificates in the browser and the connection will proceed in first https and then websocket wss, acting exactly the same.</p>
+<p><a href="test-server/test-server.c">test-server.c</a> is all that is needed to use libwebsockets for serving both the script html over http and websockets.</p>
+<h2>Testing websocket client support </h2>
+<p>If you run the test server as described above, you can also connect to it using the test client as well as a browser.</p>
+<div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> $ libwebsockets-test-client localhost</div></div><!-- fragment --><p>will by default connect to the test server on localhost:7681 and print the dumb increment number from the server at the same time as drawing random circles in the mirror protocol; if you connect to the test server using a browser at the same time you will be able to see the circles being drawn.</p>
+<p>The test client supports SSL too, use</p>
+<div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> $ libwebsockets-test-client localhost --ssl -s</div></div><!-- fragment --><p>the -s tells it to accept the default selfsigned cert from the server, otherwise it will strictly fail the connection if there is no CA cert to validate the server's certificate.</p>
+<h2>Choosing between test server variations </h2>
+<p>If you will be doing standalone serving with lws, ideally you should avoid making your own server at all, and use lwsws with your own protocol plugins.</p>
+<p>The second best option is follow test-server-v2.0.c, which uses a mount to autoserve a directory, and lws protocol plugins for ws, without needing any user callback code (other than what's needed in the protocol plugin).</p>
+<p>For those two options libuv is needed to support the protocol plugins, if that's not possible then the other variations with their own protocol code should be considered.</p>
+<h2>Testing simple echo </h2>
+<p>You can test against <code>echo.websockets.org</code> as a sanity test like this (the client connects to port <code>80</code> by default):</p>
+<div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> $ libwebsockets-test-echo --client echo.websocket.org</div></div><!-- fragment --><p>This echo test is of limited use though because it doesn't negotiate any protocol. You can run the same test app as a local server, by default on localhost:7681 </p><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> $ libwebsockets-test-echo</div></div><!-- fragment --><p> and do the echo test against the local echo server </p><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> $ libwebsockets-test-echo --client localhost --port 7681</div></div><!-- fragment --><p> If you add the <code>--ssl</code> switch to both the client and server, you can also test with an encrypted link.</p>
+<h2>Testing SSL on the client side </h2>
+<p>To test SSL/WSS client action, just run the client test with </p><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> $ libwebsockets-test-client localhost --ssl</div></div><!-- fragment --><p> By default the client test applet is set to accept selfsigned certificates used by the test server, this is indicated by the <code>use_ssl</code> var being set to <code>2</code>. Set it to <code>1</code> to reject any server certificate that it doesn't have a trusted CA cert for.</p>
+<h2>Using the websocket ping utility </h2>
+<p>libwebsockets-test-ping connects as a client to a remote websocket server and pings it like the normal unix ping utility. </p><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> $ libwebsockets-test-ping localhost</div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span> handshake OK for protocol lws-mirror-protocol</div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span> Websocket PING localhost.localdomain (127.0.0.1) 64 bytes of data.</div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span> 64 bytes from localhost: req=1 time=0.1ms</div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span> 64 bytes from localhost: req=2 time=0.1ms</div><div class="line"><a name="l00006"></a><span class="lineno"> 6</span> 64 bytes from localhost: req=3 time=0.1ms</div><div class="line"><a name="l00007"></a><span class="lineno"> 7</span> 64 bytes from localhost: req=4 time=0.2ms</div><div class="line"><a name="l00008"></a><span class="lineno"> 8</span> 64 bytes from localhost: req=5 time=0.1ms</div><div class="line"><a name="l00009"></a><span class="lineno"> 9</span> 64 bytes from localhost: req=6 time=0.2ms</div><div class="line"><a name="l00010"></a><span class="lineno"> 10</span> 64 bytes from localhost: req=7 time=0.2ms</div><div class="line"><a name="l00011"></a><span class="lineno"> 11</span> 64 bytes from localhost: req=8 time=0.1ms</div><div class="line"><a name="l00012"></a><span class="lineno"> 12</span> ^C</div><div class="line"><a name="l00013"></a><span class="lineno"> 13</span> --- localhost.localdomain websocket ping statistics ---</div><div class="line"><a name="l00014"></a><span class="lineno"> 14</span> 8 packets transmitted, 8 received, 0% packet loss, time 7458ms</div><div class="line"><a name="l00015"></a><span class="lineno"> 15</span> rtt min/avg/max = 0.110/0.185/0.218 ms</div><div class="line"><a name="l00016"></a><span class="lineno"> 16</span> $</div></div><!-- fragment --><p> By default it sends 64 byte payload packets using the 04 PING packet opcode type. You can change the payload size using the <code>-s=</code> flag, up to a maximum of 125 mandated by the 04 standard.</p>
+<p>Using the lws-mirror protocol that is provided by the test server, libwebsockets-test-ping can also use larger payload sizes up to 4096 is BINARY packets; lws-mirror will copy them back to the client and they appear as a PONG. Use the <code>-m</code> flag to select this operation.</p>
+<p>The default interval between pings is 1s, you can use the -i= flag to set this, including fractions like <code>-i=0.01</code> for 10ms interval.</p>
+<p>Before you can even use the PING opcode that is part of the standard, you must complete a handshake with a specified protocol. By default lws-mirror-protocol is used which is supported by the test server. But if you are using it on another server, you can specify the protcol to handshake with by <code>--protocol=protocolname</code></p>
+<h2>Fraggle test app </h2>
+<p>By default it runs in server mode </p><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> $ libwebsockets-test-fraggle</div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span> libwebsockets test fraggle</div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span> (C) Copyright 2010-2011 Andy Green <andy@warmcat.com> licensed under LGPL2.1</div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span>  Compiled with SSL support, not using it</div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span>  Listening on port 7681</div><div class="line"><a name="l00006"></a><span class="lineno"> 6</span> server sees client connect</div><div class="line"><a name="l00007"></a><span class="lineno"> 7</span> accepted v06 connection</div><div class="line"><a name="l00008"></a><span class="lineno"> 8</span> Spamming 360 random fragments</div><div class="line"><a name="l00009"></a><span class="lineno"> 9</span> Spamming session over, len = 371913. sum = 0x2D3C0AE</div><div class="line"><a name="l00010"></a><span class="lineno"> 10</span> Spamming 895 random fragments</div><div class="line"><a name="l00011"></a><span class="lineno"> 11</span> Spamming session over, len = 875970. sum = 0x6A74DA1</div><div class="line"><a name="l00012"></a><span class="lineno"> 12</span> ...</div></div><!-- fragment --><p> You need to run a second session in client mode, you have to give the <code>-c</code> switch and the server address at least: </p><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> $ libwebsockets-test-fraggle -c localhost</div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span> libwebsockets test fraggle</div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span> (C) Copyright 2010-2011 Andy Green <andy@warmcat.com> licensed under LGPL2.1</div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span>  Client mode</div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span> Connecting to localhost:7681</div><div class="line"><a name="l00006"></a><span class="lineno"> 6</span> denied deflate-stream extension</div><div class="line"><a name="l00007"></a><span class="lineno"> 7</span> handshake OK for protocol fraggle-protocol</div><div class="line"><a name="l00008"></a><span class="lineno"> 8</span> client connects to server</div><div class="line"><a name="l00009"></a><span class="lineno"> 9</span> EOM received 371913 correctly from 360 fragments</div><div class="line"><a name="l00010"></a><span class="lineno"> 10</span> EOM received 875970 correctly from 895 fragments</div><div class="line"><a name="l00011"></a><span class="lineno"> 11</span> EOM received 247140 correctly from 258 fragments</div><div class="line"><a name="l00012"></a><span class="lineno"> 12</span> EOM received 695451 correctly from 692 fragments</div><div class="line"><a name="l00013"></a><span class="lineno"> 13</span> ...</div></div><!-- fragment --><p> The fraggle test sends a random number up to 1024 fragmented websocket frames each of a random size between 1 and 2001 bytes in a single message, then sends a checksum and starts sending a new randomly sized and fragmented message.</p>
+<p>The fraggle test client receives the same message fragments and computes the same checksum using websocket framing to see when the message has ended. It then accepts the server checksum message and compares that to its checksum.</p>
+<h2>proxy support </h2>
+<p>The http_proxy environment variable is respected by the client connection code for both <code>ws://</code> and <code>wss://</code>. It doesn't support authentication.</p>
+<p>You use it like this </p><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> $ export http_proxy=myproxy.com:3128</div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span> $ libwebsockets-test-client someserver.com</div></div><!-- fragment --><h2>debug logging </h2>
+<p>By default logging of severity "notice", "warn" or "err" is enabled to stderr.</p>
+<p>Again by default other logging is compiled in but disabled from printing.</p>
+<p>If you want to eliminate the debug logging below notice in severity, use the <code>--disable-debug</code> configure option to have it removed from the code by the preprocesser.</p>
+<p>If you want to see more detailed debug logs, you can control a bitfield to select which logs types may print using the <code><a class="el" href="group__log.html#ga244647f9e1bf0097ccdde66d74f41e26">lws_set_log_level()</a></code> api, in the test apps you can use <code>-d <number></code> to control this. The types of logging available are (OR together the numbers to select multiple)</p>
+<ul>
+<li>1 ERR</li>
+<li>2 WARN</li>
+<li>4 NOTICE</li>
+<li>8 INFO</li>
+<li>16 DEBUG</li>
+<li>32 PARSER</li>
+<li>64 HEADER</li>
+<li>128 EXTENSION</li>
+<li>256 CLIENT</li>
+<li>512 LATENCY</li>
+</ul>
+<h2>Websocket version supported </h2>
+<p>The final IETF standard is supported for both client and server, protocol version 13.</p>
+<h2>Latency Tracking </h2>
+<p>Since libwebsockets runs using <code>poll()</code> and a single threaded approach, any unexpected latency coming from system calls would be bad news. There's now a latency tracking scheme that can be built in with <code>--with-latency</code> at configure-time, logging the time taken for system calls to complete and if the whole action did complete that time or was deferred.</p>
+<p>You can see the detailed data by enabling logging level 512 (eg, <code>-d 519</code> on the test server to see that and the usual logs), however even without that the "worst" latency is kept and reported to the logs with NOTICE severity when the context is destroyed.</p>
+<p>Some care is needed interpreting them, if the action completed the first figure (in us) is the time taken for the whole action, which may have retried through the poll loop many times and will depend on network roundtrip times. High figures here don't indicate a problem. The figure in us reported after "lat" in the logging is the time taken by this particular attempt. High figures here may indicate a problem, or if you system is loaded with another app at that time, such as the browser, it may simply indicate the OS gave preferential treatment to the other app during that call.</p>
+<h2>Autobahn Test Suite </h2>
+<p>Lws can be tested against the autobahn websocket fuzzer.</p>
+<p>1) pip install autobahntestsuite</p>
+<p>2) wstest -m fuzzingserver</p>
+<p>3) Run tests like this</p>
+<p>libwebsockets-test-echo –client localhost –port 9001 -u "/runCase?case=20&agent=libwebsockets" -v -d 65535 -n 1</p>
+<p>(this runs test 20)</p>
+<p>4) In a browser, go here</p>
+<p><a href="http://localhost:8080/test_browser.html">http://localhost:8080/test_browser.html</a></p>
+<p>fill in "libwebsockets" in "User Agent Identifier" and press "Update Reports (Manual)"</p>
+<p>5) In a browser go to the directory you ran wstest in (eg, /projects/libwebsockets)</p>
+<p><a href="file:///projects/libwebsockets/reports/clients/index.html">file:///projects/libwebsockets/reports/clients/index.html</a></p>
+<p>to see the results</p>
+<h2>Autobahn Test Notes </h2>
+<p>1) Autobahn tests the user code + lws implementation. So to get the same results, you need to follow test-echo.c in terms of user implmentation.</p>
+<p>2) Some of the tests make no sense for Libwebsockets to support and we fail them.</p>
+<ul>
+<li>Tests 2.10 + 2.11: sends multiple pings on one connection. Lws policy is to only allow one active ping in flight on each connection, the rest are dropped. The autobahn test itself admits this is not part of the standard, just someone's random opinion about how they think a ws server should act. So we will fail this by design and it is no problem about RFC6455 compliance. </li>
+</ul>
+</div></div><!-- contents -->
+</div><!-- doc-content -->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">Generated by
+ <a href="http://www.doxygen.org/index.html">
+ <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.11 </li>
+ </ul>
+</div>
+</body>
+</html>
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.11"/>
+<title>libwebsockets: Modules</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="libwebsockets.org-logo.png"/></td>
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname">libwebsockets
+ </div>
+ <div id="projectbrief">Lightweight C library for HTML5 websockets</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.11 -->
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main Page</span></a></li>
+ <li><a href="pages.html"><span>Related Pages</span></a></li>
+ <li class="current"><a href="modules.html"><span>Modules</span></a></li>
+ <li><a href="annotated.html"><span>Data Structures</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('modules.html','');});
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="headertitle">
+<div class="title">Modules</div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock">Here is a list of all modules:</div><div class="directory">
+<div class="levels">[detail level <span onclick="javascript:toggleLevel(1);">1</span><span onclick="javascript:toggleLevel(2);">2</span>]</div><table class="directory">
+<tr id="row_0_" class="even"><td class="entry"><span style="width:16px;display:inline-block;"> </span><a class="el" href="group__service.html" target="_self">Built-in service loop entry</a></td><td class="desc"></td></tr>
+<tr id="row_1_"><td class="entry"><span style="width:16px;display:inline-block;"> </span><a class="el" href="group__callback-when-writeable.html" target="_self">Callback when writeable</a></td><td class="desc"></td></tr>
+<tr id="row_2_" class="even"><td class="entry"><span style="width:16px;display:inline-block;"> </span><a class="el" href="group__client.html" target="_self">Client</a></td><td class="desc"></td></tr>
+<tr id="row_3_"><td class="entry"><span style="width:16px;display:inline-block;"> </span><a class="el" href="group__timeout.html" target="_self">Connection timeouts</a></td><td class="desc"></td></tr>
+<tr id="row_4_" class="even"><td class="entry"><span style="width:0px;display:inline-block;"> </span><span id="arr_4_" class="arrow" onclick="toggleFolder('4_')">▼</span><a class="el" href="group__context-and-vhost.html" target="_self">Context-and-vhost</a></td><td class="desc"></td></tr>
+<tr id="row_4_0_"><td class="entry"><span style="width:32px;display:inline-block;"> </span><a class="el" href="group__vhost-mounts.html" target="_self">Vhost mounts and options</a></td><td class="desc"></td></tr>
+<tr id="row_5_" class="even"><td class="entry"><span style="width:16px;display:inline-block;"> </span><a class="el" href="group__extensions.html" target="_self">Extensions</a></td><td class="desc"></td></tr>
+<tr id="row_6_"><td class="entry"><span style="width:0px;display:inline-block;"> </span><span id="arr_6_" class="arrow" onclick="toggleFolder('6_')">▼</span><a class="el" href="group__http.html" target="_self">HTTP</a></td><td class="desc"></td></tr>
+<tr id="row_6_0_" class="even"><td class="entry"><span style="width:32px;display:inline-block;"> </span><a class="el" href="group__form-parsing.html" target="_self">Form Parsing</a></td><td class="desc"></td></tr>
+<tr id="row_6_1_"><td class="entry"><span style="width:32px;display:inline-block;"> </span><a class="el" href="group__html-chunked-substitution.html" target="_self">HTML Chunked Substitution</a></td><td class="desc"></td></tr>
+<tr id="row_6_2_" class="even"><td class="entry"><span style="width:32px;display:inline-block;"> </span><a class="el" href="group__httpft.html" target="_self">HTTP File transfer</a></td><td class="desc"></td></tr>
+<tr id="row_6_3_"><td class="entry"><span style="width:32px;display:inline-block;"> </span><a class="el" href="group__HTTP-headers-create.html" target="_self">HTTP headers: create</a></td><td class="desc"></td></tr>
+<tr id="row_6_4_" class="even"><td class="entry"><span style="width:32px;display:inline-block;"> </span><a class="el" href="group__HTTP-headers-read.html" target="_self">HTTP headers: read</a></td><td class="desc"></td></tr>
+<tr id="row_6_5_"><td class="entry"><span style="width:32px;display:inline-block;"> </span><a class="el" href="group__urlendec.html" target="_self">Urlencode and Urldecode</a></td><td class="desc"></td></tr>
+<tr id="row_7_" class="even"><td class="entry"><span style="width:16px;display:inline-block;"> </span><a class="el" href="group__log.html" target="_self">Logging</a></td><td class="desc"></td></tr>
+<tr id="row_8_"><td class="entry"><span style="width:16px;display:inline-block;"> </span><a class="el" href="group__misc.html" target="_self">Miscellaneous APIs</a></td><td class="desc"></td></tr>
+<tr id="row_9_" class="even"><td class="entry"><span style="width:16px;display:inline-block;"> </span><a class="el" href="group__net.html" target="_self">Network related helper APIs</a></td><td class="desc"></td></tr>
+<tr id="row_10_"><td class="entry"><span style="width:0px;display:inline-block;"> </span><span id="arr_10_" class="arrow" onclick="toggleFolder('10_')">▼</span><a class="el" href="group__Protocols-and-Plugins.html" target="_self">Protocols and Plugins</a></td><td class="desc"></td></tr>
+<tr id="row_10_0_" class="even"><td class="entry"><span style="width:32px;display:inline-block;"> </span><a class="el" href="group__generic-sessions.html" target="_self">plugin: generic-sessions</a></td><td class="desc"></td></tr>
+<tr id="row_11_"><td class="entry"><span style="width:16px;display:inline-block;"> </span><a class="el" href="group__sha.html" target="_self">SHA and B64 helpers</a></td><td class="desc"></td></tr>
+<tr id="row_12_" class="even"><td class="entry"><span style="width:16px;display:inline-block;"> </span><a class="el" href="group__pur.html" target="_self">Sanitize / purify SQL and JSON helpers</a></td><td class="desc"></td></tr>
+<tr id="row_13_"><td class="entry"><span style="width:16px;display:inline-block;"> </span><a class="el" href="group__sending-data.html" target="_self">Sending data</a></td><td class="desc"></td></tr>
+<tr id="row_14_" class="even"><td class="entry"><span style="width:16px;display:inline-block;"> </span><a class="el" href="group__smtp.html" target="_self">Smtp</a></td><td class="desc"></td></tr>
+<tr id="row_15_"><td class="entry"><span style="width:16px;display:inline-block;"> </span><a class="el" href="group__sock-adopt.html" target="_self">Socket adoption helpers</a></td><td class="desc"></td></tr>
+<tr id="row_16_" class="even"><td class="entry"><span style="width:16px;display:inline-block;"> </span><a class="el" href="group__usercb.html" target="_self">User Callback</a></td><td class="desc"></td></tr>
+<tr id="row_17_"><td class="entry"><span style="width:16px;display:inline-block;"> </span><a class="el" href="group__wsclose.html" target="_self">Websocket Close</a></td><td class="desc"></td></tr>
+<tr id="row_18_" class="even"><td class="entry"><span style="width:16px;display:inline-block;"> </span><a class="el" href="group__wsstatus.html" target="_self">Websocket status APIs</a></td><td class="desc"></td></tr>
+<tr id="row_19_"><td class="entry"><span style="width:16px;display:inline-block;"> </span><a class="el" href="group__cgi.html" target="_self">cgi handling</a></td><td class="desc"></td></tr>
+<tr id="row_20_" class="even"><td class="entry"><span style="width:16px;display:inline-block;"> </span><a class="el" href="group__fops.html" target="_self">file operation wrapping</a></td><td class="desc"></td></tr>
+<tr id="row_21_"><td class="entry"><span style="width:16px;display:inline-block;"> </span><a class="el" href="group__ev.html" target="_self">libev helpers</a></td><td class="desc"></td></tr>
+<tr id="row_22_" class="even"><td class="entry"><span style="width:16px;display:inline-block;"> </span><a class="el" href="group__uv.html" target="_self">libuv helpers</a></td><td class="desc"></td></tr>
+</table>
+</div><!-- directory -->
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">Generated by
+ <a href="http://www.doxygen.org/index.html">
+ <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.11 </li>
+ </ul>
+</div>
+</body>
+</html>
--- /dev/null
+var modules =
+[
+ [ "Built-in service loop entry", "group__service.html", "group__service" ],
+ [ "Callback when writeable", "group__callback-when-writeable.html", "group__callback-when-writeable" ],
+ [ "Client", "group__client.html", "group__client" ],
+ [ "Connection timeouts", "group__timeout.html", "group__timeout" ],
+ [ "Context-and-vhost", "group__context-and-vhost.html", "group__context-and-vhost" ],
+ [ "Extensions", "group__extensions.html", "group__extensions" ],
+ [ "HTTP", "group__http.html", "group__http" ],
+ [ "Logging", "group__log.html", "group__log" ],
+ [ "Miscellaneous APIs", "group__misc.html", "group__misc" ],
+ [ "Network related helper APIs", "group__net.html", "group__net" ],
+ [ "Protocols and Plugins", "group__Protocols-and-Plugins.html", "group__Protocols-and-Plugins" ],
+ [ "SHA and B64 helpers", "group__sha.html", "group__sha" ],
+ [ "Sanitize / purify SQL and JSON helpers", "group__pur.html", "group__pur" ],
+ [ "Sending data", "group__sending-data.html", "group__sending-data" ],
+ [ "Smtp", "group__smtp.html", "group__smtp" ],
+ [ "Socket adoption helpers", "group__sock-adopt.html", "group__sock-adopt" ],
+ [ "User Callback", "group__usercb.html", "group__usercb" ],
+ [ "Websocket Close", "group__wsclose.html", "group__wsclose" ],
+ [ "Websocket status APIs", "group__wsstatus.html", "group__wsstatus" ],
+ [ "cgi handling", "group__cgi.html", null ],
+ [ "file operation wrapping", "group__fops.html", "group__fops" ],
+ [ "libev helpers", "group__ev.html", null ],
+ [ "libuv helpers", "group__uv.html", null ]
+];
\ No newline at end of file
--- /dev/null
+#nav-tree .children_ul {
+ margin:0;
+ padding:4px;
+}
+
+#nav-tree ul {
+ list-style:none outside none;
+ margin:0px;
+ padding:0px;
+}
+
+#nav-tree li {
+ white-space:nowrap;
+ margin:0px;
+ padding:0px;
+}
+
+#nav-tree .plus {
+ margin:0px;
+}
+
+#nav-tree .selected {
+ background-image: url('tab_a.png');
+ background-repeat:repeat-x;
+ color: #fff;
+ text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0);
+}
+
+#nav-tree img {
+ margin:0px;
+ padding:0px;
+ border:0px;
+ vertical-align: middle;
+}
+
+#nav-tree a {
+ text-decoration:none;
+ padding:0px;
+ margin:0px;
+ outline:none;
+}
+
+#nav-tree .label {
+ margin:0px;
+ padding:0px;
+ font: 12px 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif;
+}
+
+#nav-tree .label a {
+ padding:2px;
+}
+
+#nav-tree .selected a {
+ text-decoration:none;
+ color:#fff;
+}
+
+#nav-tree .children_ul {
+ margin:0px;
+ padding:0px;
+}
+
+#nav-tree .item {
+ margin:0px;
+ padding:0px;
+}
+
+#nav-tree {
+ padding: 0px 0px;
+ background-color: #FAFAFF;
+ font-size:14px;
+ overflow:auto;
+}
+
+#doc-content {
+ overflow:auto;
+ display:block;
+ padding:0px;
+ margin:0px;
+ -webkit-overflow-scrolling : touch; /* iOS 5+ */
+}
+
+#side-nav {
+ padding:0 6px 0 0;
+ margin: 0px;
+ display:block;
+ position: absolute;
+ left: 0px;
+ width: 250px;
+}
+
+.ui-resizable .ui-resizable-handle {
+ display:block;
+}
+
+.ui-resizable-e {
+ background:url("splitbar.png") repeat scroll right center transparent;
+ cursor:e-resize;
+ height:100%;
+ right:0;
+ top:0;
+ width:6px;
+}
+
+.ui-resizable-handle {
+ display:none;
+ font-size:0.1px;
+ position:absolute;
+ z-index:1;
+}
+
+#nav-tree-contents {
+ margin: 6px 0px 0px 0px;
+}
+
+#nav-tree {
+ background-image:url('nav_h.png');
+ background-repeat:repeat-x;
+ background-color: #F9FAFC;
+ -webkit-overflow-scrolling : touch; /* iOS 5+ */
+}
+
+#nav-sync {
+ position:absolute;
+ top:5px;
+ right:24px;
+ z-index:0;
+}
+
+#nav-sync img {
+ opacity:0.3;
+}
+
+#nav-sync img:hover {
+ opacity:0.9;
+}
+
+@media print
+{
+ #nav-tree { display: none; }
+ div.ui-resizable-handle { display: none; position: relative; }
+}
+
--- /dev/null
+var navTreeSubIndices = new Array();
+
+function getData(varName)
+{
+ var i = varName.lastIndexOf('/');
+ var n = i>=0 ? varName.substring(i+1) : varName;
+ return eval(n.replace(/\-/g,'_'));
+}
+
+function stripPath(uri)
+{
+ return uri.substring(uri.lastIndexOf('/')+1);
+}
+
+function stripPath2(uri)
+{
+ var i = uri.lastIndexOf('/');
+ var s = uri.substring(i+1);
+ var m = uri.substring(0,i+1).match(/\/d\w\/d\w\w\/$/);
+ return m ? uri.substring(i-6) : s;
+}
+
+function hashValue()
+{
+ return $(location).attr('hash').substring(1).replace(/[^\w\-]/g,'');
+}
+
+function hashUrl()
+{
+ return '#'+hashValue();
+}
+
+function pathName()
+{
+ return $(location).attr('pathname').replace(/[^-A-Za-z0-9+&@#/%?=~_|!:,.;\(\)]/g, '');
+}
+
+function localStorageSupported()
+{
+ try {
+ return 'localStorage' in window && window['localStorage'] !== null && window.localStorage.getItem;
+ }
+ catch(e) {
+ return false;
+ }
+}
+
+
+function storeLink(link)
+{
+ if (!$("#nav-sync").hasClass('sync') && localStorageSupported()) {
+ window.localStorage.setItem('navpath',link);
+ }
+}
+
+function deleteLink()
+{
+ if (localStorageSupported()) {
+ window.localStorage.setItem('navpath','');
+ }
+}
+
+function cachedLink()
+{
+ if (localStorageSupported()) {
+ return window.localStorage.getItem('navpath');
+ } else {
+ return '';
+ }
+}
+
+function getScript(scriptName,func,show)
+{
+ var head = document.getElementsByTagName("head")[0];
+ var script = document.createElement('script');
+ script.id = scriptName;
+ script.type = 'text/javascript';
+ script.onload = func;
+ script.src = scriptName+'.js';
+ if ($.browser.msie && $.browser.version<=8) {
+ // script.onload does not work with older versions of IE
+ script.onreadystatechange = function() {
+ if (script.readyState=='complete' || script.readyState=='loaded') {
+ func(); if (show) showRoot();
+ }
+ }
+ }
+ head.appendChild(script);
+}
+
+function createIndent(o,domNode,node,level)
+{
+ var level=-1;
+ var n = node;
+ while (n.parentNode) { level++; n=n.parentNode; }
+ if (node.childrenData) {
+ var imgNode = document.createElement("img");
+ imgNode.style.paddingLeft=(16*level).toString()+'px';
+ imgNode.width = 16;
+ imgNode.height = 22;
+ imgNode.border = 0;
+ node.plus_img = imgNode;
+ node.expandToggle = document.createElement("a");
+ node.expandToggle.href = "javascript:void(0)";
+ node.expandToggle.onclick = function() {
+ if (node.expanded) {
+ $(node.getChildrenUL()).slideUp("fast");
+ node.plus_img.src = node.relpath+"arrowright.png";
+ node.expanded = false;
+ } else {
+ expandNode(o, node, false, false);
+ }
+ }
+ node.expandToggle.appendChild(imgNode);
+ domNode.appendChild(node.expandToggle);
+ imgNode.src = node.relpath+"arrowright.png";
+ } else {
+ var span = document.createElement("span");
+ span.style.display = 'inline-block';
+ span.style.width = 16*(level+1)+'px';
+ span.style.height = '22px';
+ span.innerHTML = ' ';
+ domNode.appendChild(span);
+ }
+}
+
+var animationInProgress = false;
+
+function gotoAnchor(anchor,aname,updateLocation)
+{
+ var pos, docContent = $('#doc-content');
+ var ancParent = $(anchor.parent());
+ if (ancParent.hasClass('memItemLeft') ||
+ ancParent.hasClass('fieldname') ||
+ ancParent.hasClass('fieldtype') ||
+ ancParent.is(':header'))
+ {
+ pos = ancParent.position().top;
+ } else if (anchor.position()) {
+ pos = anchor.position().top;
+ }
+ if (pos) {
+ var dist = Math.abs(Math.min(
+ pos-docContent.offset().top,
+ docContent[0].scrollHeight-
+ docContent.height()-docContent.scrollTop()));
+ animationInProgress=true;
+ docContent.animate({
+ scrollTop: pos + docContent.scrollTop() - docContent.offset().top
+ },Math.max(50,Math.min(500,dist)),function(){
+ if (updateLocation) window.location.href=aname;
+ animationInProgress=false;
+ });
+ }
+}
+
+function newNode(o, po, text, link, childrenData, lastNode)
+{
+ var node = new Object();
+ node.children = Array();
+ node.childrenData = childrenData;
+ node.depth = po.depth + 1;
+ node.relpath = po.relpath;
+ node.isLast = lastNode;
+
+ node.li = document.createElement("li");
+ po.getChildrenUL().appendChild(node.li);
+ node.parentNode = po;
+
+ node.itemDiv = document.createElement("div");
+ node.itemDiv.className = "item";
+
+ node.labelSpan = document.createElement("span");
+ node.labelSpan.className = "label";
+
+ createIndent(o,node.itemDiv,node,0);
+ node.itemDiv.appendChild(node.labelSpan);
+ node.li.appendChild(node.itemDiv);
+
+ var a = document.createElement("a");
+ node.labelSpan.appendChild(a);
+ node.label = document.createTextNode(text);
+ node.expanded = false;
+ a.appendChild(node.label);
+ if (link) {
+ var url;
+ if (link.substring(0,1)=='^') {
+ url = link.substring(1);
+ link = url;
+ } else {
+ url = node.relpath+link;
+ }
+ a.className = stripPath(link.replace('#',':'));
+ if (link.indexOf('#')!=-1) {
+ var aname = '#'+link.split('#')[1];
+ var srcPage = stripPath(pathName());
+ var targetPage = stripPath(link.split('#')[0]);
+ a.href = srcPage!=targetPage ? url : "javascript:void(0)";
+ a.onclick = function(){
+ storeLink(link);
+ if (!$(a).parent().parent().hasClass('selected'))
+ {
+ $('.item').removeClass('selected');
+ $('.item').removeAttr('id');
+ $(a).parent().parent().addClass('selected');
+ $(a).parent().parent().attr('id','selected');
+ }
+ var anchor = $(aname);
+ gotoAnchor(anchor,aname,true);
+ };
+ } else {
+ a.href = url;
+ a.onclick = function() { storeLink(link); }
+ }
+ } else {
+ if (childrenData != null)
+ {
+ a.className = "nolink";
+ a.href = "javascript:void(0)";
+ a.onclick = node.expandToggle.onclick;
+ }
+ }
+
+ node.childrenUL = null;
+ node.getChildrenUL = function() {
+ if (!node.childrenUL) {
+ node.childrenUL = document.createElement("ul");
+ node.childrenUL.className = "children_ul";
+ node.childrenUL.style.display = "none";
+ node.li.appendChild(node.childrenUL);
+ }
+ return node.childrenUL;
+ };
+
+ return node;
+}
+
+function showRoot()
+{
+ var headerHeight = $("#top").height();
+ var footerHeight = $("#nav-path").height();
+ var windowHeight = $(window).height() - headerHeight - footerHeight;
+ (function (){ // retry until we can scroll to the selected item
+ try {
+ var navtree=$('#nav-tree');
+ navtree.scrollTo('#selected',0,{offset:-windowHeight/2});
+ } catch (err) {
+ setTimeout(arguments.callee, 0);
+ }
+ })();
+}
+
+function expandNode(o, node, imm, showRoot)
+{
+ if (node.childrenData && !node.expanded) {
+ if (typeof(node.childrenData)==='string') {
+ var varName = node.childrenData;
+ getScript(node.relpath+varName,function(){
+ node.childrenData = getData(varName);
+ expandNode(o, node, imm, showRoot);
+ }, showRoot);
+ } else {
+ if (!node.childrenVisited) {
+ getNode(o, node);
+ } if (imm || ($.browser.msie && $.browser.version>8)) {
+ // somehow slideDown jumps to the start of tree for IE9 :-(
+ $(node.getChildrenUL()).show();
+ } else {
+ $(node.getChildrenUL()).slideDown("fast");
+ }
+ if (node.isLast) {
+ node.plus_img.src = node.relpath+"arrowdown.png";
+ } else {
+ node.plus_img.src = node.relpath+"arrowdown.png";
+ }
+ node.expanded = true;
+ }
+ }
+}
+
+function glowEffect(n,duration)
+{
+ n.addClass('glow').delay(duration).queue(function(next){
+ $(this).removeClass('glow');next();
+ });
+}
+
+function highlightAnchor()
+{
+ var aname = hashUrl();
+ var anchor = $(aname);
+ if (anchor.parent().attr('class')=='memItemLeft'){
+ var rows = $('.memberdecls tr[class$="'+hashValue()+'"]');
+ glowEffect(rows.children(),300); // member without details
+ } else if (anchor.parent().attr('class')=='fieldname'){
+ glowEffect(anchor.parent().parent(),1000); // enum value
+ } else if (anchor.parent().attr('class')=='fieldtype'){
+ glowEffect(anchor.parent().parent(),1000); // struct field
+ } else if (anchor.parent().is(":header")) {
+ glowEffect(anchor.parent(),1000); // section header
+ } else {
+ glowEffect(anchor.next(),1000); // normal member
+ }
+ gotoAnchor(anchor,aname,false);
+}
+
+function selectAndHighlight(hash,n)
+{
+ var a;
+ if (hash) {
+ var link=stripPath(pathName())+':'+hash.substring(1);
+ a=$('.item a[class$="'+link+'"]');
+ }
+ if (a && a.length) {
+ a.parent().parent().addClass('selected');
+ a.parent().parent().attr('id','selected');
+ highlightAnchor();
+ } else if (n) {
+ $(n.itemDiv).addClass('selected');
+ $(n.itemDiv).attr('id','selected');
+ }
+ if ($('#nav-tree-contents .item:first').hasClass('selected')) {
+ $('#nav-sync').css('top','30px');
+ } else {
+ $('#nav-sync').css('top','5px');
+ }
+ showRoot();
+}
+
+function showNode(o, node, index, hash)
+{
+ if (node && node.childrenData) {
+ if (typeof(node.childrenData)==='string') {
+ var varName = node.childrenData;
+ getScript(node.relpath+varName,function(){
+ node.childrenData = getData(varName);
+ showNode(o,node,index,hash);
+ },true);
+ } else {
+ if (!node.childrenVisited) {
+ getNode(o, node);
+ }
+ $(node.getChildrenUL()).css({'display':'block'});
+ node.plus_img.src = node.relpath+"arrowdown.png";
+ node.expanded = true;
+ var n = node.children[o.breadcrumbs[index]];
+ if (index+1<o.breadcrumbs.length) {
+ showNode(o,n,index+1,hash);
+ } else {
+ if (typeof(n.childrenData)==='string') {
+ var varName = n.childrenData;
+ getScript(n.relpath+varName,function(){
+ n.childrenData = getData(varName);
+ node.expanded=false;
+ showNode(o,node,index,hash); // retry with child node expanded
+ },true);
+ } else {
+ var rootBase = stripPath(o.toroot.replace(/\..+$/, ''));
+ if (rootBase=="index" || rootBase=="pages" || rootBase=="search") {
+ expandNode(o, n, true, true);
+ }
+ selectAndHighlight(hash,n);
+ }
+ }
+ }
+ } else {
+ selectAndHighlight(hash);
+ }
+}
+
+function removeToInsertLater(element) {
+ var parentNode = element.parentNode;
+ var nextSibling = element.nextSibling;
+ parentNode.removeChild(element);
+ return function() {
+ if (nextSibling) {
+ parentNode.insertBefore(element, nextSibling);
+ } else {
+ parentNode.appendChild(element);
+ }
+ };
+}
+
+function getNode(o, po)
+{
+ var insertFunction = removeToInsertLater(po.li);
+ po.childrenVisited = true;
+ var l = po.childrenData.length-1;
+ for (var i in po.childrenData) {
+ var nodeData = po.childrenData[i];
+ po.children[i] = newNode(o, po, nodeData[0], nodeData[1], nodeData[2],
+ i==l);
+ }
+ insertFunction();
+}
+
+function gotoNode(o,subIndex,root,hash,relpath)
+{
+ var nti = navTreeSubIndices[subIndex][root+hash];
+ o.breadcrumbs = $.extend(true, [], nti ? nti : navTreeSubIndices[subIndex][root]);
+ if (!o.breadcrumbs && root!=NAVTREE[0][1]) { // fallback: show index
+ navTo(o,NAVTREE[0][1],"",relpath);
+ $('.item').removeClass('selected');
+ $('.item').removeAttr('id');
+ }
+ if (o.breadcrumbs) {
+ o.breadcrumbs.unshift(0); // add 0 for root node
+ showNode(o, o.node, 0, hash);
+ }
+}
+
+function navTo(o,root,hash,relpath)
+{
+ var link = cachedLink();
+ if (link) {
+ var parts = link.split('#');
+ root = parts[0];
+ if (parts.length>1) hash = '#'+parts[1].replace(/[^\w\-]/g,'');
+ else hash='';
+ }
+ if (hash.match(/^#l\d+$/)) {
+ var anchor=$('a[name='+hash.substring(1)+']');
+ glowEffect(anchor.parent(),1000); // line number
+ hash=''; // strip line number anchors
+ }
+ var url=root+hash;
+ var i=-1;
+ while (NAVTREEINDEX[i+1]<=url) i++;
+ if (i==-1) { i=0; root=NAVTREE[0][1]; } // fallback: show index
+ if (navTreeSubIndices[i]) {
+ gotoNode(o,i,root,hash,relpath)
+ } else {
+ getScript(relpath+'navtreeindex'+i,function(){
+ navTreeSubIndices[i] = eval('NAVTREEINDEX'+i);
+ if (navTreeSubIndices[i]) {
+ gotoNode(o,i,root,hash,relpath);
+ }
+ },true);
+ }
+}
+
+function showSyncOff(n,relpath)
+{
+ n.html('<img src="'+relpath+'sync_off.png" title="'+SYNCOFFMSG+'"/>');
+}
+
+function showSyncOn(n,relpath)
+{
+ n.html('<img src="'+relpath+'sync_on.png" title="'+SYNCONMSG+'"/>');
+}
+
+function toggleSyncButton(relpath)
+{
+ var navSync = $('#nav-sync');
+ if (navSync.hasClass('sync')) {
+ navSync.removeClass('sync');
+ showSyncOff(navSync,relpath);
+ storeLink(stripPath2(pathName())+hashUrl());
+ } else {
+ navSync.addClass('sync');
+ showSyncOn(navSync,relpath);
+ deleteLink();
+ }
+}
+
+function initNavTree(toroot,relpath)
+{
+ var o = new Object();
+ o.toroot = toroot;
+ o.node = new Object();
+ o.node.li = document.getElementById("nav-tree-contents");
+ o.node.childrenData = NAVTREE;
+ o.node.children = new Array();
+ o.node.childrenUL = document.createElement("ul");
+ o.node.getChildrenUL = function() { return o.node.childrenUL; };
+ o.node.li.appendChild(o.node.childrenUL);
+ o.node.depth = 0;
+ o.node.relpath = relpath;
+ o.node.expanded = false;
+ o.node.isLast = true;
+ o.node.plus_img = document.createElement("img");
+ o.node.plus_img.src = relpath+"arrowright.png";
+ o.node.plus_img.width = 16;
+ o.node.plus_img.height = 22;
+
+ if (localStorageSupported()) {
+ var navSync = $('#nav-sync');
+ if (cachedLink()) {
+ showSyncOff(navSync,relpath);
+ navSync.removeClass('sync');
+ } else {
+ showSyncOn(navSync,relpath);
+ }
+ navSync.click(function(){ toggleSyncButton(relpath); });
+ }
+
+ $(window).load(function(){
+ navTo(o,toroot,hashUrl(),relpath);
+ showRoot();
+ });
+
+ $(window).bind('hashchange', function(){
+ if (window.location.hash && window.location.hash.length>1){
+ var a;
+ if ($(location).attr('hash')){
+ var clslink=stripPath(pathName())+':'+hashValue();
+ a=$('.item a[class$="'+clslink.replace(/</g,'\\3c ')+'"]');
+ }
+ if (a==null || !$(a).parent().parent().hasClass('selected')){
+ $('.item').removeClass('selected');
+ $('.item').removeAttr('id');
+ }
+ var link=stripPath2(pathName());
+ navTo(o,link,hashUrl(),relpath);
+ } else if (!animationInProgress) {
+ $('#doc-content').scrollTop(0);
+ $('.item').removeClass('selected');
+ $('.item').removeAttr('id');
+ navTo(o,toroot,hashUrl(),relpath);
+ }
+ })
+}
+
--- /dev/null
+var NAVTREE =
+[
+ [ "libwebsockets", "index.html", [
+ [ "Libwebsockets API introduction", "index.html", null ],
+ [ "Notes about building lws", "md_README.build.html", null ],
+ [ "Notes about lwsws", "md_README.lwsws.html", null ],
+ [ "Notes about coding with lws", "md_README.coding.html", null ],
+ [ "Notes about generic-sessions Plugin", "md_README.generic-sessions.html", null ],
+ [ "Notes about lws test apps", "md_README.test-apps.html", null ],
+ [ "Deprecated List", "deprecated.html", null ],
+ [ "Modules", "modules.html", "modules" ],
+ [ "Data Structures", "annotated.html", [
+ [ "Data Structures", "annotated.html", "annotated_dup" ],
+ [ "Data Structure Index", "classes.html", null ],
+ [ "Class Hierarchy", "hierarchy.html", "hierarchy" ],
+ [ "Data Fields", "functions.html", [
+ [ "All", "functions.html", null ],
+ [ "Functions", "functions_func.html", null ],
+ [ "Variables", "functions_vars.html", null ]
+ ] ]
+ ] ],
+ [ "Files", null, [
+ [ "File List", "files.html", "files" ],
+ [ "Globals", "globals.html", [
+ [ "All", "globals.html", "globals_dup" ],
+ [ "Functions", "globals_func.html", null ],
+ [ "Typedefs", "globals_type.html", null ],
+ [ "Enumerations", "globals_enum.html", null ],
+ [ "Enumerator", "globals_eval.html", null ]
+ ] ]
+ ] ]
+ ] ]
+];
+
+var NAVTREEINDEX =
+[
+"annotated.html",
+"group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5accc9d0d11d1124a21659586164b0962e",
+"group__smtp.html#ga25298a5afc1074e13b2d5711a86432b2",
+"libwebsockets_8h.html#abddb8d337fb2692586d892b494739003"
+];
+
+var SYNCONMSG = 'click to disable panel synchronisation';
+var SYNCOFFMSG = 'click to enable panel synchronisation';
\ No newline at end of file
--- /dev/null
+var NAVTREEINDEX0 =
+{
+"annotated.html":[8,0],
+"classes.html":[8,1],
+"classlws__conn.html":[8,0,2],
+"classlws__conn.html#a49f87612c6a3098cd1587f8382b8c85b":[8,0,2,2],
+"classlws__conn.html#a4fb477fad697ce1faf8ec7a884ea6c6b":[8,0,2,3],
+"classlws__conn.html#a5226010afdf5421f279454e5cbb282a4":[8,0,2,8],
+"classlws__conn.html#a5cad031b6b779da42b37f4007cae541b":[8,0,2,9],
+"classlws__conn.html#a7e504bd449ffb51c7ab1d2126613ebc3":[8,0,2,11],
+"classlws__conn.html#a8e1fdd467b7f66fc438dc70ae979b938":[8,0,2,10],
+"classlws__conn.html#aad7d2406618e560114650a91c729a596":[8,0,2,5],
+"classlws__conn.html#aba42bdd763a36c3a331b62410969b6ba":[8,0,2,4],
+"classlws__conn.html#accc57581269c554291dac840ed135231":[8,0,2,6],
+"classlws__conn.html#aef530971372f55e862f2e09bc98f1029":[8,0,2,1],
+"classlws__conn.html#af0e213af91d53d1e1aef70ed7816191f":[8,0,2,0],
+"classlws__conn.html#afe73e53da2070f659ad6e7fd14878c7e":[8,0,2,7],
+"classlws__conn__listener.html":[8,0,3],
+"classlws__conn__listener.html#a271ac4f8ad5770b3bc96cce5b265b72c":[8,0,3,2],
+"classlws__conn__listener.html#a3c19c314f2ea2b758407b4041e4c4010":[8,0,3,5],
+"classlws__conn__listener.html#aa7076f8965bb9df268798fd9a0283374":[8,0,3,6],
+"classlws__conn__listener.html#aab3c7bf550a8f15d20f1e093125c2e60":[8,0,3,1],
+"classlws__conn__listener.html#ab3bc839797ba14554ac70ad09fd155c7":[8,0,3,4],
+"classlws__conn__listener.html#ab432a456c3a961ec562e06141897806b":[8,0,3,3],
+"classlws__conn__listener.html#ac82c8696a36a2f386b4094490d300dee":[8,0,3,0],
+"deprecated.html":[6],
+"dir_97aefd0d527b934f1d99a682da8fe6a9.html":[9,0,0],
+"files.html":[9,0],
+"functions.html":[8,3,0],
+"functions_func.html":[8,3,1],
+"functions_vars.html":[8,3,2],
+"globals.html":[9,1,0],
+"globals.html":[9,1,0,0],
+"globals_enum.html":[9,1,3],
+"globals_eval.html":[9,1,4],
+"globals_func.html":[9,1,1],
+"globals_l.html":[9,1,0,1],
+"globals_type.html":[9,1,2],
+"group__HTTP-headers-create.html":[7,6,3],
+"group__HTTP-headers-create.html#ga29b7d6d2ddfdbaff3d8b607e7e3151b6":[9,0,0,0,40],
+"group__HTTP-headers-create.html#ga29b7d6d2ddfdbaff3d8b607e7e3151b6":[7,6,3,3],
+"group__HTTP-headers-create.html#ga2b36bf44405755ff51c1939303b995a8":[9,0,0,0,37],
+"group__HTTP-headers-create.html#ga2b36bf44405755ff51c1939303b995a8":[7,6,3,0],
+"group__HTTP-headers-create.html#ga4887605ff2242a54db3a7fa01f6f864b":[7,6,3,4],
+"group__HTTP-headers-create.html#ga4887605ff2242a54db3a7fa01f6f864b":[9,0,0,0,75],
+"group__HTTP-headers-create.html#gacc76a5babcb4dce1b01b1955aa7a2faf":[9,0,0,0,39],
+"group__HTTP-headers-create.html#gacc76a5babcb4dce1b01b1955aa7a2faf":[7,6,3,2],
+"group__HTTP-headers-create.html#gaf74adb761b22566ad70004882712dce1":[9,0,0,0,38],
+"group__HTTP-headers-create.html#gaf74adb761b22566ad70004882712dce1":[7,6,3,1],
+"group__HTTP-headers-read.html":[7,6,4],
+"group__HTTP-headers-read.html#ga2c0597b2ef1d2cee35736c338bcbd17b":[7,6,4,7],
+"group__HTTP-headers-read.html#ga2c0597b2ef1d2cee35736c338bcbd17b":[9,0,0,0,141],
+"group__HTTP-headers-read.html#ga594f3d0ece5b09c2ccf9f98ea533bb4e":[9,0,0,0,95],
+"group__HTTP-headers-read.html#ga594f3d0ece5b09c2ccf9f98ea533bb4e":[7,6,4,5],
+"group__HTTP-headers-read.html#ga6ce6aa1c0155ea42b7708bed271d1c77":[7,6,4,3],
+"group__HTTP-headers-read.html#ga6ce6aa1c0155ea42b7708bed271d1c77":[9,0,0,0,93],
+"group__HTTP-headers-read.html#ga6e747906f9d76532ec118d6ef418b82e":[9,0,0,0,30],
+"group__HTTP-headers-read.html#ga84e9ce5e71a77501a0998ac403a984c2":[9,0,0,0,91],
+"group__HTTP-headers-read.html#ga84e9ce5e71a77501a0998ac403a984c2":[7,6,4,2],
+"group__HTTP-headers-read.html#ga8ade0e1ffb0da7e62b989d8d867bf6c8":[9,0,0,0,96],
+"group__HTTP-headers-read.html#ga8ade0e1ffb0da7e62b989d8d867bf6c8":[7,6,4,6],
+"group__HTTP-headers-read.html#gaa427cad61a9a5e3004afd65c4527b5e9":[9,0,0,0,94],
+"group__HTTP-headers-read.html#gaa427cad61a9a5e3004afd65c4527b5e9":[7,6,4,4],
+"group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82ea03293996964a8bb617215508908048d4":[9,0,0,0,30,42],
+"group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82ea05c73ad09f25570a50068de13333e41a":[9,0,0,0,30,57],
+"group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82ea0784fa0e5bdbacd1e14c2d6ba0c42992":[9,0,0,0,30,27],
+"group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82ea0830a0c1c62c444ade7cf15599e92345":[9,0,0,0,30,47],
+"group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82ea0a3c723f67cb6d95dba0c0ccc7d898f8":[9,0,0,0,30,69],
+"group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82ea0dd5ce6fa8932e0d378b86c393d8f726":[9,0,0,0,30,11],
+"group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82ea11ed9b0cc3b4525c830de7185fd8d7df":[9,0,0,0,30,62],
+"group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82ea1347e093d73e88489ba3ebda56a393a5":[9,0,0,0,30,32],
+"group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82ea138fedfdb81765272d22b0eca9aec22b":[9,0,0,0,30,9],
+"group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82ea157c1db7d8edd3cd3b649e7756a559c8":[9,0,0,0,30,80],
+"group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82ea166e60d6689436c1fb9169438d5db1b9":[9,0,0,0,30,13],
+"group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82ea1d41be78df2704c54b906f7f0abbaa30":[9,0,0,0,30,51],
+"group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82ea1ee866e12a483229599f4e3cfc358b36":[9,0,0,0,30,53],
+"group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82ea21ac48d2a499f6afa44cee92cebd8ae3":[9,0,0,0,30,82],
+"group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82ea220975eeb65cac57691adb3761a492bb":[9,0,0,0,30,50],
+"group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82ea228ece9e187ddbb80236851e9a09145c":[9,0,0,0,30,83],
+"group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82ea277d11b0d5e7fdfc6b5fb45470e6f63e":[9,0,0,0,30,39],
+"group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82ea2be8537e80387a88197d3ed62ac3b954":[9,0,0,0,30,45],
+"group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82ea2efae4ba6646ba040c371706f7f3a125":[9,0,0,0,30,56],
+"group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82ea3733863fb466c1df6b00c9384a53e544":[9,0,0,0,30,85],
+"group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82ea385f0e1933f81529307fff61eb08ff8d":[9,0,0,0,30,54],
+"group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82ea3ac4744411849aff89001ee0350aed75":[9,0,0,0,30,60],
+"group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82ea3cf47b821d473b717002b22619a9814e":[9,0,0,0,30,7],
+"group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82ea3ef26b531c1c2416850ebd539f08ba5e":[9,0,0,0,30,17],
+"group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82ea3fd7c7c9587953adc8f317a615df6b83":[9,0,0,0,30,14],
+"group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82ea400831fe4ba52d4c454364a81ea3bfe4":[9,0,0,0,30,91],
+"group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82ea428409a7aaea6446b660574e4097c0bd":[9,0,0,0,30,90],
+"group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82ea439ada24e20de209e08e7dd398ca61ac":[9,0,0,0,30,66],
+"group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82ea525ee6d2330fca0929df75ffb8dec68e":[9,0,0,0,30,33],
+"group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82ea52a30bd1a5ca619ab19bb8178138e42f":[9,0,0,0,30,58],
+"group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82ea549fcdd8300f0c7434289db6326ec06a":[9,0,0,0,30,22],
+"group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82ea56913c617d46273743bb187bcd8e90c2":[9,0,0,0,30,65],
+"group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82ea569588399651cdd6b81de40be4b73fd8":[9,0,0,0,30,46],
+"group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82ea57ff348ebbae88bf904bc64ef284d83b":[9,0,0,0,30,20],
+"group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82ea598578cda71fe6ca34320bbd6ba1e887":[9,0,0,0,30,55],
+"group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82ea5dcd48b2643d8a82a97b7abbc3928ea8":[9,0,0,0,30,81],
+"group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82ea5e005569744e3246ba40d524f9a84fe4":[9,0,0,0,30,44],
+"group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82ea6164d17e9598f89c822b4be55814de0a":[9,0,0,0,30,48],
+"group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82ea63e1e08da7555313caf632a819db27d4":[9,0,0,0,30,41],
+"group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82ea669e4eea57595f569f329bfba900a15d":[9,0,0,0,30,3],
+"group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82ea693a74f3cd695016120bfdae3d3ced1a":[9,0,0,0,30,68],
+"group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82ea70b452bb6ce670e32c30fa237bceb731":[9,0,0,0,30,15],
+"group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82ea7460d076c52a9fae65c9e00bac05ef19":[9,0,0,0,30,76],
+"group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82ea751322eb9f58fa33bf1f6e4923ff9abb":[9,0,0,0,30,1],
+"group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82ea7708c82134391d257d6c354ae7bf1429":[9,0,0,0,30,31],
+"group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82ea78834452a5833032294abe1aa42055c6":[9,0,0,0,30,64],
+"group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82ea7892390328672ed812b3b68bc3e0fe40":[9,0,0,0,30,52],
+"group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82ea78fbb32e1809d5767e55de3181d454b0":[9,0,0,0,30,19],
+"group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82ea7e80eff7eefa68741f0a776d6d8feeae":[9,0,0,0,30,78],
+"group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82ea832a110c8b9eb42890f252a756c81bde":[9,0,0,0,30,36],
+"group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82ea86b3c4cf71dc5c5b441243db99ca696a":[9,0,0,0,30,61],
+"group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82ea883a86db0c05266214affd78d37e871f":[9,0,0,0,30,86],
+"group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82ea8913c5b1378b1ffad7e2da975c454d15":[9,0,0,0,30,26],
+"group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82ea8d7393b324a076186bbde01a2cfe6b62":[9,0,0,0,30,49],
+"group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82ea8d9809cf381705f73af48d8f6809412b":[9,0,0,0,30,24],
+"group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82ea8f6a44a37c29cb5ade4c5989467a880b":[9,0,0,0,30,75],
+"group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82ea8ff0b2f6666e008de14d9b9721b87ead":[9,0,0,0,30,89],
+"group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82ea9004d6ff6b16b8877f760545a3c7be60":[9,0,0,0,30,63],
+"group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82eaa0cad0c7a20ac23945a33dbc3d726718":[9,0,0,0,30,30],
+"group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82eaa566f2c37d9a459ca95eee347cca68d0":[9,0,0,0,30,67],
+"group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82eaa76ea751f1ee86567d27e9e30075d6db":[9,0,0,0,30,40],
+"group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82eaa84e4902ebeb7ab468e3a4bd4acf4f90":[9,0,0,0,30,84],
+"group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82eaa8c8eb9b32feb43ec214d8469655a0df":[9,0,0,0,30,87],
+"group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82eaab4585e187936b4f2abf22e9138ee271":[9,0,0,0,30,5],
+"group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82eaae70d627de34f9c881445f6fbcfcc2dd":[9,0,0,0,30,38],
+"group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82eab0926aa28ea9bb73d2b0124c05c30a78":[9,0,0,0,30,88],
+"group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82eab2339b9e75c79dae3547255d1fb046cd":[9,0,0,0,30,2],
+"group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82eab460c34b18e1ae54219c3fb9e60544ef":[9,0,0,0,30,4],
+"group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82eaba11ed0aa8c8c7bd71d971a234df0a72":[9,0,0,0,30,21],
+"group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82eabfb2738a1148ec7c039f2af640b28430":[9,0,0,0,30,71],
+"group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82eac7157acd472d24de05aee3de57b8dc8a":[9,0,0,0,30,12],
+"group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82eac9a937e393da4c3a77cf82463265dcee":[9,0,0,0,30,6],
+"group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82ead32022a286b9cc6fbe60b1a0411370a7":[9,0,0,0,30,28],
+"group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82ead603502e2545c533c4c01ba39e35a2b0":[9,0,0,0,30,16],
+"group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82eadb08a1c7b1f76e2962d44149bf488bf8":[9,0,0,0,30,34],
+"group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82eadbb64ba8a29fee913ded2163a5d16615":[9,0,0,0,30,10],
+"group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82eadff4760ab45fc182ab1e1fb68afa6714":[9,0,0,0,30,70],
+"group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82eae215f7e72fea4458fd971cdcb45d8e04":[9,0,0,0,30,18],
+"group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82eae24b2d70918c70e034ff574a516e0023":[9,0,0,0,30,59],
+"group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82eae5d5ca0131fbea1df03d7ad6d69ebfbd":[9,0,0,0,30,25],
+"group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82eae6286060884d4c80a88fa94fec58dda3":[9,0,0,0,30,0],
+"group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82eae898ee2a1e374f7d98aa483940c91511":[9,0,0,0,30,73],
+"group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82eae9d2323ce213a112ac90361f04a1ee5a":[9,0,0,0,30,43],
+"group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82eaec69fb61493d1c67316c02259b86bdc2":[9,0,0,0,30,35],
+"group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82eaec821397393facee38ddd4119473b992":[9,0,0,0,30,29],
+"group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82eaee14b94fcd4ab788e313e0789bec0cdc":[9,0,0,0,30,77],
+"group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82eaeef14469c992ebb09a43a8548db37401":[9,0,0,0,30,23],
+"group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82eaf2b7eac7ff98aea6d9b240f6f51995c3":[9,0,0,0,30,72],
+"group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82eaf48e3b9c89dba34054ea0833dbad4b57":[9,0,0,0,30,8],
+"group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82eaf567d4d400062fab44f1b96c64cb93ac":[9,0,0,0,30,37],
+"group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82eaf64cb8232e172aaa019c38b398d0a0bb":[9,0,0,0,30,74],
+"group__HTTP-headers-read.html#gga6e747906f9d76532ec118d6ef418b82eafc1e8568187b2de76e2ddd5cc692908e":[9,0,0,0,30,79],
+"group__Protocols-and-Plugins.html":[7,10],
+"group__Protocols-and-Plugins.html#ga106b37ae9c247e84d191ab09441adc43":[7,10,4],
+"group__Protocols-and-Plugins.html#ga106b37ae9c247e84d191ab09441adc43":[9,0,0,0,76],
+"group__Protocols-and-Plugins.html#ga25754726d97c5f519d313e691a9fe29d":[7,10,9],
+"group__Protocols-and-Plugins.html#ga25754726d97c5f519d313e691a9fe29d":[9,0,0,0,149],
+"group__Protocols-and-Plugins.html#ga40994491e1567f91f579d2b444775266":[9,0,0,0,12],
+"group__Protocols-and-Plugins.html#ga72ad550786ca7976463589d347e62112":[7,10,5],
+"group__Protocols-and-Plugins.html#ga72ad550786ca7976463589d347e62112":[9,0,0,0,87],
+"group__Protocols-and-Plugins.html#ga83f7a924ba790fa273476075a59f08b0":[9,0,0,0,11],
+"group__Protocols-and-Plugins.html#ga8bbe5e65faca068845704bab911a5030":[7,10,6],
+"group__Protocols-and-Plugins.html#ga8bbe5e65faca068845704bab911a5030":[9,0,0,0,113],
+"group__Protocols-and-Plugins.html#gaec0c0477288ff3f83aff38d357b883d1":[7,10,8],
+"group__Protocols-and-Plugins.html#gaec0c0477288ff3f83aff38d357b883d1":[9,0,0,0,115],
+"group__Protocols-and-Plugins.html#gaf3be4243443baac0f8be1fcfb4d25129":[7,10,7],
+"group__Protocols-and-Plugins.html#gaf3be4243443baac0f8be1fcfb4d25129":[9,0,0,0,114],
+"group__callback-when-writeable.html":[7,1],
+"group__callback-when-writeable.html#ga13c984d8c5a44a745fd02bc2fba36053":[7,1,1],
+"group__callback-when-writeable.html#ga13c984d8c5a44a745fd02bc2fba36053":[9,0,0,0,46],
+"group__callback-when-writeable.html#ga60939cf0c073d933fde3d17f3591caf5":[9,0,0,0,50],
+"group__callback-when-writeable.html#ga60939cf0c073d933fde3d17f3591caf5":[7,1,5],
+"group__callback-when-writeable.html#ga8570860e191b62db264f2bac67354ea8":[7,1,4],
+"group__callback-when-writeable.html#ga8570860e191b62db264f2bac67354ea8":[9,0,0,0,49],
+"group__callback-when-writeable.html#ga941caaa468bc507b1cae52275f58800d":[7,1,2],
+"group__callback-when-writeable.html#ga941caaa468bc507b1cae52275f58800d":[9,0,0,0,47],
+"group__callback-when-writeable.html#gaa709e02a10558753c851e58f1e2c16ba":[7,1,7],
+"group__callback-when-writeable.html#gaa709e02a10558753c851e58f1e2c16ba":[9,0,0,0,90],
+"group__callback-when-writeable.html#gabbe4655c7eeb3eb1671b2323ec6b3107":[7,1,3],
+"group__callback-when-writeable.html#gabbe4655c7eeb3eb1671b2323ec6b3107":[9,0,0,0,48],
+"group__callback-when-writeable.html#gac4643fe16b0940ae5b68b4ee6195cbde":[7,1,6],
+"group__callback-when-writeable.html#gac4643fe16b0940ae5b68b4ee6195cbde":[9,0,0,0,86],
+"group__callback-when-writeable.html#gacf04bbe089f47c971c6408c5efe2ac70":[7,1,0],
+"group__callback-when-writeable.html#gacf04bbe089f47c971c6408c5efe2ac70":[9,0,0,0,45],
+"group__cgi.html":[7,19],
+"group__client.html":[7,2],
+"group__client.html#ga4450c34200bf9dab3beb90ef23221870":[9,0,0,0,97],
+"group__client.html#ga4af0a20108a95e8b6d94dd4d80055ff3":[7,2,1],
+"group__client.html#ga4af0a20108a95e8b6d94dd4d80055ff3":[9,0,0,0,58],
+"group__client.html#ga4f44b8230e6732816ca5cd8d1aaaf340":[7,2,4],
+"group__client.html#ga4f44b8230e6732816ca5cd8d1aaaf340":[9,0,0,0,100],
+"group__client.html#gac30a7be106abd0cedfbb2e8b8fe3a2f5":[7,2,3],
+"group__client.html#gac30a7be106abd0cedfbb2e8b8fe3a2f5":[9,0,0,0,60],
+"group__client.html#gac6a8558b4410961a880241c2ac1271e2":[9,0,0,0,59],
+"group__client.html#gac6a8558b4410961a880241c2ac1271e2":[7,2,2],
+"group__context-and-vhost.html":[7,4],
+"group__context-and-vhost.html#ga06e77ce2916f8bc9826ef8d9d68e3932":[7,4,8],
+"group__context-and-vhost.html#ga06e77ce2916f8bc9826ef8d9d68e3932":[9,0,0,0,92],
+"group__context-and-vhost.html#ga0c54c667ccd9b8b3dddcd123ca72f87c":[7,4,7],
+"group__context-and-vhost.html#ga0c54c667ccd9b8b3dddcd123ca72f87c":[9,0,0,0,65],
+"group__context-and-vhost.html#ga341064721add2618ae1b29717493a212":[7,4,14],
+"group__context-and-vhost.html#ga341064721add2618ae1b29717493a212":[9,0,0,0,156],
+"group__context-and-vhost.html#ga41c2d763f78cc248df3b9f8645dbd2a5":[7,4,3],
+"group__context-and-vhost.html#ga41c2d763f78cc248df3b9f8645dbd2a5":[9,0,0,0,22],
+"group__context-and-vhost.html#ga7e9d5405547a457d86e0b4f0ae2bb1c4":[7,4,11],
+"group__context-and-vhost.html#ga7e9d5405547a457d86e0b4f0ae2bb1c4":[9,0,0,0,131],
+"group__context-and-vhost.html#ga8db03e19a372e34ac25cf21af894a02c":[7,4,12],
+"group__context-and-vhost.html#ga8db03e19a372e34ac25cf21af894a02c":[9,0,0,0,148],
+"group__context-and-vhost.html#ga8ee0314028755f1ddfa9428e09b4fddb":[7,4,4],
+"group__context-and-vhost.html#ga8ee0314028755f1ddfa9428e09b4fddb":[9,0,0,0,62],
+"group__context-and-vhost.html#ga94e6cc2223c4eec316b13bcebc3628b6":[7,4,10],
+"group__context-and-vhost.html#ga94e6cc2223c4eec316b13bcebc3628b6":[9,0,0,0,106],
+"group__context-and-vhost.html#ga98d88c9080fd89c37114363a6474ea73":[7,4,13],
+"group__context-and-vhost.html#ga98d88c9080fd89c37114363a6474ea73":[9,0,0,0,155],
+"group__context-and-vhost.html#gae2134657cdd2ea7a59e13ad314e4c50d":[7,4,9],
+"group__context-and-vhost.html#gae2134657cdd2ea7a59e13ad314e4c50d":[9,0,0,0,105],
+"group__context-and-vhost.html#gaeb12f934bfd178bd2132a9e73fc641da":[7,4,5],
+"group__context-and-vhost.html#gaeb12f934bfd178bd2132a9e73fc641da":[9,0,0,0,63],
+"group__context-and-vhost.html#gaf2fff58562caab7510c41eeac85a8648":[7,4,6],
+"group__context-and-vhost.html#gaf2fff58562caab7510c41eeac85a8648":[9,0,0,0,64],
+"group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a1b2f8bde0f62adc7ebe81b2043f34c0c":[7,4,3,8],
+"group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a1b2f8bde0f62adc7ebe81b2043f34c0c":[9,0,0,0,22,8],
+"group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a1cc4562d05cba52a6dfa0697a65ade0d":[7,4,3,2],
+"group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a1cc4562d05cba52a6dfa0697a65ade0d":[9,0,0,0,22,2],
+"group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a273d9975675130de0c6dc937dde7c8a6":[7,4,3,3],
+"group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a273d9975675130de0c6dc937dde7c8a6":[9,0,0,0,22,3],
+"group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a274ed462a1a9239eb6ddf9007f5b7092":[7,4,3,0],
+"group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a274ed462a1a9239eb6ddf9007f5b7092":[9,0,0,0,22,0],
+"group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a34ab36e68c0d593b6f19b8d5ef1240a9":[7,4,3,4],
+"group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a34ab36e68c0d593b6f19b8d5ef1240a9":[9,0,0,0,22,4],
+"group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a4832187186c4d130c68051214cd42ada":[7,4,3,10],
+"group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a4832187186c4d130c68051214cd42ada":[9,0,0,0,22,10],
+"group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a4933347a821e73c3f1e13fb6bfc7ad93":[7,4,3,5],
+"group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a4933347a821e73c3f1e13fb6bfc7ad93":[9,0,0,0,22,5],
+"group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a6582c985ee0ceaadc1d277030eae2d7c":[7,4,3,1],
+"group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a6582c985ee0ceaadc1d277030eae2d7c":[9,0,0,0,22,1],
+"group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a7fed6a527c8d5e0acac1b4179644583a":[7,4,3,11],
+"group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a7fed6a527c8d5e0acac1b4179644583a":[9,0,0,0,22,11],
+"group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a9637e9001d8c8b2521086bcafbd8a941":[7,4,3,13],
+"group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a9637e9001d8c8b2521086bcafbd8a941":[9,0,0,0,22,13],
+"group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5aa0158b4e85420811e6b0f1378c6ded0f":[7,4,3,7],
+"group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5aa0158b4e85420811e6b0f1378c6ded0f":[9,0,0,0,22,7],
+"group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5ac56a8a6590e74a8016d0fae09fb404fc":[7,4,3,6],
+"group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5ac56a8a6590e74a8016d0fae09fb404fc":[9,0,0,0,22,6],
+"group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5ac962efd35abf6c402f9fb14aa14f5016":[7,4,3,14],
+"group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5ac962efd35abf6c402f9fb14aa14f5016":[9,0,0,0,22,14],
+"group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5aca5d42820b65eac5618ec3f0bd8a1160":[7,4,3,16],
+"group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5aca5d42820b65eac5618ec3f0bd8a1160":[9,0,0,0,22,16],
+"group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5accc9d0d11d1124a21659586164b0962e":[7,4,3,12]
+};
--- /dev/null
+var NAVTREEINDEX1 =
+{
+"group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5accc9d0d11d1124a21659586164b0962e":[9,0,0,0,22,12],
+"group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5af62887536e25e053e68741006dba46d8":[7,4,3,15],
+"group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5af62887536e25e053e68741006dba46d8":[9,0,0,0,22,15],
+"group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5aff121db04a10cf8b2c5df9d4f2b89f1e":[7,4,3,9],
+"group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5aff121db04a10cf8b2c5df9d4f2b89f1e":[9,0,0,0,22,9],
+"group__ev.html":[7,21],
+"group__ev.html#ga3b0ffd4d2b4fa791c0fd75353a330208":[9,0,0,0,8],
+"group__ev.html#ga3fdd23ded693b21853356dc9eaef5ccc":[9,0,0,0,70],
+"group__ev.html#ga5caf14a420a2a0bd687a1fc952f8d64e":[9,0,0,0,72],
+"group__ev.html#gaabfc0880d6a98133550c61aa01ef3563":[9,0,0,0,71],
+"group__extensions.html":[7,5],
+"group__extensions.html#ga4cdbe42d872e21a448a947714d6c607e":[7,5,6],
+"group__extensions.html#ga4cdbe42d872e21a448a947714d6c607e":[9,0,0,0,74],
+"group__extensions.html#ga6fb3e2c3dfb9d64dc87026a4e99c128b":[7,5,5],
+"group__extensions.html#ga6fb3e2c3dfb9d64dc87026a4e99c128b":[9,0,0,0,73],
+"group__extensions.html#gaae7169b2cd346b34fa33d0250db2afd0":[7,5,3],
+"group__extensions.html#gaae7169b2cd346b34fa33d0250db2afd0":[9,0,0,0,9],
+"group__extensions.html#gacc9f55936dc165257a2e1f7d47bce89e":[9,0,0,0,24],
+"group__extensions.html#gacc9f55936dc165257a2e1f7d47bce89e":[7,5,4],
+"group__extensions.html#gae0e24e1768f83a7fb07896ce975704b9":[7,5,7],
+"group__extensions.html#gae0e24e1768f83a7fb07896ce975704b9":[9,0,0,0,129],
+"group__extensions.html#gae9993815eee72c6070300a0ae2f022d7":[9,0,0,0,25],
+"group__extensions.html#ggacc9f55936dc165257a2e1f7d47bce89ea1c86adf924c8786a12bee9687094673e":[9,0,0,0,24,1],
+"group__extensions.html#ggacc9f55936dc165257a2e1f7d47bce89ea1c86adf924c8786a12bee9687094673e":[7,5,4,1],
+"group__extensions.html#ggacc9f55936dc165257a2e1f7d47bce89ea5265abe3e1c3f64412f2affe7bffd880":[9,0,0,0,24,2],
+"group__extensions.html#ggacc9f55936dc165257a2e1f7d47bce89ea5265abe3e1c3f64412f2affe7bffd880":[7,5,4,2],
+"group__extensions.html#ggacc9f55936dc165257a2e1f7d47bce89eaabcf56c456c1ff6e81dc82586a16f14c":[9,0,0,0,24,0],
+"group__extensions.html#ggacc9f55936dc165257a2e1f7d47bce89eaabcf56c456c1ff6e81dc82586a16f14c":[7,5,4,0],
+"group__extensions.html#ggae9993815eee72c6070300a0ae2f022d7a05b74161bfab0f815d7fd47b85e20bfc":[9,0,0,0,25,9],
+"group__extensions.html#ggae9993815eee72c6070300a0ae2f022d7a0b220da55b7d7a9579175f1ec81579fb":[9,0,0,0,25,17],
+"group__extensions.html#ggae9993815eee72c6070300a0ae2f022d7a22a8130d0db03d62154d0502b1737a48":[9,0,0,0,25,22],
+"group__extensions.html#ggae9993815eee72c6070300a0ae2f022d7a246b82fadb41dc04cf4d40fd42987458":[9,0,0,0,25,19],
+"group__extensions.html#ggae9993815eee72c6070300a0ae2f022d7a25ceebb1ee06c2f0963b44165065efb9":[9,0,0,0,25,26],
+"group__extensions.html#ggae9993815eee72c6070300a0ae2f022d7a270b950562f97510ec06b02dbcbace11":[9,0,0,0,25,23],
+"group__extensions.html#ggae9993815eee72c6070300a0ae2f022d7a5a4cacc86ebddc8cb5a3f4ec91ba3fba":[9,0,0,0,25,12],
+"group__extensions.html#ggae9993815eee72c6070300a0ae2f022d7a648e8e3988ca8bdf20ddcfd2a14e3f10":[9,0,0,0,25,13],
+"group__extensions.html#ggae9993815eee72c6070300a0ae2f022d7a6cbdd5cfd6d39e3cacd4ca02e2ae54e3":[9,0,0,0,25,8],
+"group__extensions.html#ggae9993815eee72c6070300a0ae2f022d7a741d5d795895b192cbde6adbc851a822":[9,0,0,0,25,11],
+"group__extensions.html#ggae9993815eee72c6070300a0ae2f022d7a7fe88715ded486af17228050a1d05e90":[9,0,0,0,25,2],
+"group__extensions.html#ggae9993815eee72c6070300a0ae2f022d7a83dff5bb6cd4c6e0cc85cb12fb9c0178":[9,0,0,0,25,5],
+"group__extensions.html#ggae9993815eee72c6070300a0ae2f022d7a862b122e8f17a50f5ab6e7b56087c09c":[9,0,0,0,25,20],
+"group__extensions.html#ggae9993815eee72c6070300a0ae2f022d7a866a849e7d59a3a44c92ecdfb1393e4e":[9,0,0,0,25,0],
+"group__extensions.html#ggae9993815eee72c6070300a0ae2f022d7a8e4e3c201d029c8d78457fb4fdddef4a":[9,0,0,0,25,7],
+"group__extensions.html#ggae9993815eee72c6070300a0ae2f022d7aa2901960832871f606354d58e58b6453":[9,0,0,0,25,4],
+"group__extensions.html#ggae9993815eee72c6070300a0ae2f022d7aa4eb48182ed8bd10d257df5a8b154cc2":[9,0,0,0,25,24],
+"group__extensions.html#ggae9993815eee72c6070300a0ae2f022d7aa6d94d15f31176a4e1214c4c31edd5f8":[9,0,0,0,25,18],
+"group__extensions.html#ggae9993815eee72c6070300a0ae2f022d7aaf81548db378fa156a7cf290abff87ad":[9,0,0,0,25,21],
+"group__extensions.html#ggae9993815eee72c6070300a0ae2f022d7abb36b02569c81df4509f58f964a8155b":[9,0,0,0,25,3],
+"group__extensions.html#ggae9993815eee72c6070300a0ae2f022d7abc92c2b16b0d54b3a9736e62a520a446":[9,0,0,0,25,10],
+"group__extensions.html#ggae9993815eee72c6070300a0ae2f022d7ac2af19277affbbc731379ddfb38f820e":[9,0,0,0,25,16],
+"group__extensions.html#ggae9993815eee72c6070300a0ae2f022d7ac5d7be02c676c836bb8ec448803dd606":[9,0,0,0,25,14],
+"group__extensions.html#ggae9993815eee72c6070300a0ae2f022d7ad113e96df806fb20fd4f02dbe19e4f4b":[9,0,0,0,25,6],
+"group__extensions.html#ggae9993815eee72c6070300a0ae2f022d7ad426ef79eec1b6e036118f64e6fa62f5":[9,0,0,0,25,25],
+"group__extensions.html#ggae9993815eee72c6070300a0ae2f022d7ae57bedd24d5a29f5f381f8155c2ab3b8":[9,0,0,0,25,15],
+"group__extensions.html#ggae9993815eee72c6070300a0ae2f022d7afa4a8739f6424c4dac3eead479628002":[9,0,0,0,25,1],
+"group__fops.html":[7,20],
+"group__fops.html#gac08aef64c4c34647ed699b24759b6b0e":[7,20,1],
+"group__fops.html#gac08aef64c4c34647ed699b24759b6b0e":[9,0,0,0,81],
+"group__form-parsing.html":[7,6,0],
+"group__form-parsing.html#ga162f86762173a2bc8c28497941d74815":[7,6,0,2],
+"group__form-parsing.html#ga162f86762173a2bc8c28497941d74815":[9,0,0,0,134],
+"group__form-parsing.html#ga2da476217166da02704b90d3a8d4f3cd":[7,6,0,6],
+"group__form-parsing.html#ga2da476217166da02704b90d3a8d4f3cd":[9,0,0,0,138],
+"group__form-parsing.html#ga3fbe378632f85ec9a14cc2c1687bf05f":[7,6,0,5],
+"group__form-parsing.html#ga3fbe378632f85ec9a14cc2c1687bf05f":[9,0,0,0,137],
+"group__form-parsing.html#ga41a74a822771d3dce89751aa3bce28ae":[9,0,0,0,29],
+"group__form-parsing.html#ga41a74a822771d3dce89751aa3bce28ae":[7,6,0,1],
+"group__form-parsing.html#ga5a70527c0861c2ffa3d29333a6aa7f8e":[7,6,0,0],
+"group__form-parsing.html#ga5a70527c0861c2ffa3d29333a6aa7f8e":[9,0,0,0,15],
+"group__form-parsing.html#ga83835bf250ee3d4a60f36a182f2b8d24":[7,6,0,4],
+"group__form-parsing.html#ga83835bf250ee3d4a60f36a182f2b8d24":[9,0,0,0,136],
+"group__form-parsing.html#ga9ad9ebf5ea1a7108415ed7e04cb231d2":[7,6,0,7],
+"group__form-parsing.html#ga9ad9ebf5ea1a7108415ed7e04cb231d2":[9,0,0,0,139],
+"group__form-parsing.html#gaaa482f07dad3f04b391cccf0a814e13b":[7,6,0,3],
+"group__form-parsing.html#gaaa482f07dad3f04b391cccf0a814e13b":[9,0,0,0,135],
+"group__form-parsing.html#gga41a74a822771d3dce89751aa3bce28aea2d25de44865bd44e5a3903a2bab9ca83":[9,0,0,0,29,2],
+"group__form-parsing.html#gga41a74a822771d3dce89751aa3bce28aea2d25de44865bd44e5a3903a2bab9ca83":[7,6,0,1,2],
+"group__form-parsing.html#gga41a74a822771d3dce89751aa3bce28aea6ce2a55a4c3695cdb640c893d95bd3a7":[9,0,0,0,29,1],
+"group__form-parsing.html#gga41a74a822771d3dce89751aa3bce28aea6ce2a55a4c3695cdb640c893d95bd3a7":[7,6,0,1,1],
+"group__form-parsing.html#gga41a74a822771d3dce89751aa3bce28aead3a958e7719ac273c3ba4f684f00c87f":[9,0,0,0,29,0],
+"group__form-parsing.html#gga41a74a822771d3dce89751aa3bce28aead3a958e7719ac273c3ba4f684f00c87f":[7,6,0,1,0],
+"group__generic-sessions.html":[7,10,0],
+"group__generic-sessions.html#ga7c2dc7bfb4ccb91c5d771f9e9ea237e1":[7,10,0,5],
+"group__generic-sessions.html#ga7c2dc7bfb4ccb91c5d771f9e9ea237e1":[9,0,0,0,32],
+"group__generic-sessions.html#gaa93946b3d921072209d5cd8cdfa5332e":[7,10,0,4],
+"group__generic-sessions.html#gaa93946b3d921072209d5cd8cdfa5332e":[9,0,0,0,26],
+"group__generic-sessions.html#gga7c2dc7bfb4ccb91c5d771f9e9ea237e1a0657a9e846814781b128c397fe4b10bf":[7,10,0,5,1],
+"group__generic-sessions.html#gga7c2dc7bfb4ccb91c5d771f9e9ea237e1a0657a9e846814781b128c397fe4b10bf":[9,0,0,0,32,1],
+"group__generic-sessions.html#gga7c2dc7bfb4ccb91c5d771f9e9ea237e1a2cd8fb86e3b85c106e7711c03f0ddd0a":[7,10,0,5,3],
+"group__generic-sessions.html#gga7c2dc7bfb4ccb91c5d771f9e9ea237e1a2cd8fb86e3b85c106e7711c03f0ddd0a":[9,0,0,0,32,3],
+"group__generic-sessions.html#gga7c2dc7bfb4ccb91c5d771f9e9ea237e1a5a607e4668d20cadada62c4b8007f887":[7,10,0,5,2],
+"group__generic-sessions.html#gga7c2dc7bfb4ccb91c5d771f9e9ea237e1a5a607e4668d20cadada62c4b8007f887":[9,0,0,0,32,2],
+"group__generic-sessions.html#gga7c2dc7bfb4ccb91c5d771f9e9ea237e1a81e63075115dedd150265d81b8f7fa57":[7,10,0,5,0],
+"group__generic-sessions.html#gga7c2dc7bfb4ccb91c5d771f9e9ea237e1a81e63075115dedd150265d81b8f7fa57":[9,0,0,0,32,0],
+"group__generic-sessions.html#ggaa93946b3d921072209d5cd8cdfa5332ea596010a165bf13473c5eea3a34cd4308":[7,10,0,4,0],
+"group__generic-sessions.html#ggaa93946b3d921072209d5cd8cdfa5332ea596010a165bf13473c5eea3a34cd4308":[9,0,0,0,26,0],
+"group__generic-sessions.html#ggaa93946b3d921072209d5cd8cdfa5332ead908cdc5689c5d22c9d3c8934e94dcde":[7,10,0,4,1],
+"group__generic-sessions.html#ggaa93946b3d921072209d5cd8cdfa5332ead908cdc5689c5d22c9d3c8934e94dcde":[9,0,0,0,26,1],
+"group__html-chunked-substitution.html":[7,6,1],
+"group__html-chunked-substitution.html#ga643073f918c0a7016b690aae9793fd60":[7,6,1,2],
+"group__html-chunked-substitution.html#ga643073f918c0a7016b690aae9793fd60":[9,0,0,0,57],
+"group__html-chunked-substitution.html#ga669d3d7ce2d5f193473f649a89b3e7ac":[9,0,0,0,13],
+"group__html-chunked-substitution.html#gabc3b93f68c8bdd857ad32913628dfa8d":[9,0,0,0,18],
+"group__html-chunked-substitution.html#ggabc3b93f68c8bdd857ad32913628dfa8da08107f6b0e1d7c9e2ca100700cc7200f":[9,0,0,0,18,22],
+"group__html-chunked-substitution.html#ggabc3b93f68c8bdd857ad32913628dfa8da145570ed1178d3d90ad9b7652fea83cf":[9,0,0,0,18,20],
+"group__html-chunked-substitution.html#ggabc3b93f68c8bdd857ad32913628dfa8da1558c42d80f54def5f3277dc879d2844":[9,0,0,0,18,11],
+"group__html-chunked-substitution.html#ggabc3b93f68c8bdd857ad32913628dfa8da2637ec8a704c0d7fcb7ff8ce5d871be0":[9,0,0,0,18,19],
+"group__html-chunked-substitution.html#ggabc3b93f68c8bdd857ad32913628dfa8da299a2d262210540b593420fe89e01b32":[9,0,0,0,18,23],
+"group__html-chunked-substitution.html#ggabc3b93f68c8bdd857ad32913628dfa8da2e57a633f7a2422f67bf207648519e30":[9,0,0,0,18,21],
+"group__html-chunked-substitution.html#ggabc3b93f68c8bdd857ad32913628dfa8da36b5bcf2059ae3c84a47e080822239c7":[9,0,0,0,18,13],
+"group__html-chunked-substitution.html#ggabc3b93f68c8bdd857ad32913628dfa8da40246e02220192ce8d7f86591ca1cfe4":[9,0,0,0,18,12],
+"group__html-chunked-substitution.html#ggabc3b93f68c8bdd857ad32913628dfa8da419c919f74b88d18803358141ab9471c":[9,0,0,0,18,8],
+"group__html-chunked-substitution.html#ggabc3b93f68c8bdd857ad32913628dfa8da49cf9c4c184f9e4d265ceae249e92477":[9,0,0,0,18,5],
+"group__html-chunked-substitution.html#ggabc3b93f68c8bdd857ad32913628dfa8da53df069872b37830e4296f32e7ec20d8":[9,0,0,0,18,3],
+"group__html-chunked-substitution.html#ggabc3b93f68c8bdd857ad32913628dfa8da63eb71a406e943d4634c357d60dd96df":[9,0,0,0,18,10],
+"group__html-chunked-substitution.html#ggabc3b93f68c8bdd857ad32913628dfa8da67278d96cfa0eb507535b94338810d65":[9,0,0,0,18,15],
+"group__html-chunked-substitution.html#ggabc3b93f68c8bdd857ad32913628dfa8da6964f9591ba7284dc4bd388d40c106a9":[9,0,0,0,18,14],
+"group__html-chunked-substitution.html#ggabc3b93f68c8bdd857ad32913628dfa8da9632802fcd318d1676be7589e6004e96":[9,0,0,0,18,2],
+"group__html-chunked-substitution.html#ggabc3b93f68c8bdd857ad32913628dfa8daafd60e3a2073e04b8f2247f8f9ac9710":[9,0,0,0,18,18],
+"group__html-chunked-substitution.html#ggabc3b93f68c8bdd857ad32913628dfa8dab355dd546e62b1478fe3ef94b554f75c":[9,0,0,0,18,26],
+"group__html-chunked-substitution.html#ggabc3b93f68c8bdd857ad32913628dfa8dab42dfcbd67b4e66096e3a8e924b6d6c9":[9,0,0,0,18,16],
+"group__html-chunked-substitution.html#ggabc3b93f68c8bdd857ad32913628dfa8dac3d4da4de851d5c8f95748145b59716a":[9,0,0,0,18,17],
+"group__html-chunked-substitution.html#ggabc3b93f68c8bdd857ad32913628dfa8dac96829d2c2cb76feb1549f0fac72c69e":[9,0,0,0,18,25],
+"group__html-chunked-substitution.html#ggabc3b93f68c8bdd857ad32913628dfa8dac9c5b4e80aa858cfe2763656db1f16e3":[9,0,0,0,18,24],
+"group__html-chunked-substitution.html#ggabc3b93f68c8bdd857ad32913628dfa8dad000a2e30c534c201201dd74fac8d2f9":[9,0,0,0,18,1],
+"group__html-chunked-substitution.html#ggabc3b93f68c8bdd857ad32913628dfa8dad34cd21de350cd4fa83b8099e3993b91":[9,0,0,0,18,0],
+"group__html-chunked-substitution.html#ggabc3b93f68c8bdd857ad32913628dfa8dad771b2a0ab88db11b2719c8e5086fb48":[9,0,0,0,18,6],
+"group__html-chunked-substitution.html#ggabc3b93f68c8bdd857ad32913628dfa8dadd02813da14cfdc7fe83029b8779ea4b":[9,0,0,0,18,28],
+"group__html-chunked-substitution.html#ggabc3b93f68c8bdd857ad32913628dfa8dae301c12d0cf56920659cb7b947a95267":[9,0,0,0,18,4],
+"group__html-chunked-substitution.html#ggabc3b93f68c8bdd857ad32913628dfa8daefdfc7b525c87b911d6e92a30e36cfec":[9,0,0,0,18,27],
+"group__html-chunked-substitution.html#ggabc3b93f68c8bdd857ad32913628dfa8daf06c31278cb67d7eec4b2b8157b9ad25":[9,0,0,0,18,9],
+"group__html-chunked-substitution.html#ggabc3b93f68c8bdd857ad32913628dfa8dafac24097912a70f224166528ce44b83b":[9,0,0,0,18,7],
+"group__http.html":[7,6],
+"group__http.html#ga8fbf01e473ac421fc33ad9f8da8b8a25":[9,0,0,0,98],
+"group__http.html#ga8fbf01e473ac421fc33ad9f8da8b8a25":[7,6,7],
+"group__http.html#gac8a4a71240857dc6b2ed70456b6923f4":[7,6,9],
+"group__http.html#gac8a4a71240857dc6b2ed70456b6923f4":[9,0,0,0,118],
+"group__http.html#gad27aed6c66a41b2b89ffe4da2a309e8a":[9,0,0,0,99],
+"group__http.html#gad27aed6c66a41b2b89ffe4da2a309e8a":[7,6,8],
+"group__httpft.html":[7,6,2],
+"group__httpft.html#ga29e1123f6d56cd777b3e5bf9ca40f9e5":[9,0,0,0,123],
+"group__httpft.html#gab393a06d3d2722af4c3f8b06842c80d7":[7,6,2,0],
+"group__httpft.html#gab393a06d3d2722af4c3f8b06842c80d7":[9,0,0,0,122],
+"group__log.html":[7,7],
+"group__log.html#ga14542b84d2c76efa7814124bb10f9c5f":[9,0,0,0,27],
+"group__log.html#ga244647f9e1bf0097ccdde66d74f41e26":[9,0,0,0,130],
+"group__log.html#ga244647f9e1bf0097ccdde66d74f41e26":[7,7,0],
+"group__log.html#ga42e39775c6b69b7251bdbf5a2cdd5dcd":[9,0,0,0,154],
+"group__log.html#ga42e39775c6b69b7251bdbf5a2cdd5dcd":[7,7,3],
+"group__log.html#ga74eb146969f0595e12ea835851b4588e":[9,0,0,0,36],
+"group__log.html#ga898b1f03872ad019f507d4e35bbefa90":[9,0,0,0,153],
+"group__log.html#ga898b1f03872ad019f507d4e35bbefa90":[7,7,2],
+"group__log.html#gab7c0fc936cc9f1eb58e2bb234c15147c":[7,7,1],
+"group__log.html#gab7c0fc936cc9f1eb58e2bb234c15147c":[9,0,0,0,152],
+"group__log.html#gaf5f07837692b2f231a79da8a058288aa":[9,0,0,0,35],
+"group__log.html#gga14542b84d2c76efa7814124bb10f9c5fa083a44e71966a0e768426e477e1bc358":[9,0,0,0,27,8],
+"group__log.html#gga14542b84d2c76efa7814124bb10f9c5fa2be9c1d50d05756078e9abc72c9e50cc":[9,0,0,0,27,5],
+"group__log.html#gga14542b84d2c76efa7814124bb10f9c5fa52e5cd60bbb85f30ec0078a2c4be0c59":[9,0,0,0,27,3],
+"group__log.html#gga14542b84d2c76efa7814124bb10f9c5fa6353ac9650d35e8958981eebcb4b67a9":[9,0,0,0,27,7],
+"group__log.html#gga14542b84d2c76efa7814124bb10f9c5faa12195bd6dd442763a8321c463a2c906":[9,0,0,0,27,1],
+"group__log.html#gga14542b84d2c76efa7814124bb10f9c5faacc8fe5891eba3cf4537bee50eaaa8fa":[9,0,0,0,27,10],
+"group__log.html#gga14542b84d2c76efa7814124bb10f9c5facef27c02b70f1bc9140685bdfafe0942":[9,0,0,0,27,6],
+"group__log.html#gga14542b84d2c76efa7814124bb10f9c5fad0b18841adbb4792c39981ec05702744":[9,0,0,0,27,4],
+"group__log.html#gga14542b84d2c76efa7814124bb10f9c5fad40a82f6c94e6408dd003cf3f0231212":[9,0,0,0,27,2],
+"group__log.html#gga14542b84d2c76efa7814124bb10f9c5fae4235ca28326353e283bc7dd1b39bd86":[9,0,0,0,27,9],
+"group__log.html#gga14542b84d2c76efa7814124bb10f9c5faff4895280366d59ef0c5e9f4578241af":[9,0,0,0,27,0],
+"group__misc.html":[7,8],
+"group__misc.html#ga0af4f7d2dd375aeedcfa7eb0e1101c4b":[9,0,0,0,79],
+"group__misc.html#ga0af4f7d2dd375aeedcfa7eb0e1101c4b":[7,8,2],
+"group__misc.html#ga0e705d498e8c8500649a26ba30a1e106":[9,0,0,0,116],
+"group__misc.html#ga1ec0d9faac5d3a5824d765c287c043aa":[9,0,0,0,111],
+"group__misc.html#ga1ec0d9faac5d3a5824d765c287c043aa":[7,8,8],
+"group__misc.html#ga33bf2635033710b25f931b57ed663e1e":[9,0,0,0,110],
+"group__misc.html#ga33bf2635033710b25f931b57ed663e1e":[7,8,7],
+"group__misc.html#ga58f906c6be0ca80efd813f694569dd4a":[9,0,0,0,88],
+"group__misc.html#ga58f906c6be0ca80efd813f694569dd4a":[7,8,6],
+"group__misc.html#ga629f48268fd1856b54b11172991b97d9":[9,0,0,0,80],
+"group__misc.html#ga629f48268fd1856b54b11172991b97d9":[7,8,3],
+"group__misc.html#ga8930fe36a3f3eefe4a6a4fd499d8e899":[9,0,0,0,83],
+"group__misc.html#ga8930fe36a3f3eefe4a6a4fd499d8e899":[7,8,5],
+"group__misc.html#gaa194584fff9698f3b280658f770ccd0f":[9,0,0,0,151],
+"group__misc.html#gaa194584fff9698f3b280658f770ccd0f":[7,8,10],
+"group__misc.html#gab321ed812f46f6dc7ef9e3ca6f00cf1b":[9,0,0,0,128],
+"group__misc.html#gab321ed812f46f6dc7ef9e3ca6f00cf1b":[7,8,9],
+"group__misc.html#gac6abfc0b2bd5b2f09281a4432bb2f5f0":[9,0,0,0,82],
+"group__misc.html#gac6abfc0b2bd5b2f09281a4432bb2f5f0":[7,8,4],
+"group__misc.html#gacae4d7b6a8d22e4c2d82ff8b12c1e234":[9,0,0,0,78],
+"group__misc.html#gacae4d7b6a8d22e4c2d82ff8b12c1e234":[7,8,1],
+"group__misc.html#gace5171b1dbbc03ec89a98f8afdb5c9af":[9,0,0,0,66],
+"group__misc.html#gace5171b1dbbc03ec89a98f8afdb5c9af":[7,8,0],
+"group__net.html":[7,9],
+"group__net.html#ga092e5f473b3347f03ffeef8a950080f3":[9,0,0,0,84],
+"group__net.html#ga092e5f473b3347f03ffeef8a950080f3":[7,9,1],
+"group__net.html#ga869d8bdffb0f2a7ce08e3ce10d6be3d8":[7,9,3],
+"group__net.html#ga869d8bdffb0f2a7ce08e3ce10d6be3d8":[9,0,0,0,101],
+"group__net.html#gad01014fed09759741b6d23afccfdaacc":[7,9,2],
+"group__net.html#gad01014fed09759741b6d23afccfdaacc":[9,0,0,0,85],
+"group__net.html#gad0df22db2be9fc65a667a1e83f9a92a4":[9,0,0,0,53],
+"group__net.html#gad0df22db2be9fc65a667a1e83f9a92a4":[7,9,0],
+"group__pur.html":[7,12],
+"group__pur.html#ga9cc82f06e5ae7e71458626d7a39a5865":[7,12,1],
+"group__pur.html#ga9cc82f06e5ae7e71458626d7a39a5865":[9,0,0,0,140],
+"group__pur.html#gab15187efcfa256b7c928562c182b92a3":[7,12,0],
+"group__pur.html#gab15187efcfa256b7c928562c182b92a3":[9,0,0,0,107],
+"group__sending-data.html":[7,13],
+"group__sending-data.html#ga98b099cf8c1c7e38ad78501f270e193d":[7,13,0],
+"group__sending-data.html#ga98b099cf8c1c7e38ad78501f270e193d":[9,0,0,0,31],
+"group__sending-data.html#gafd5fdd285a0e25ba7e3e1051deec1001":[7,13,1],
+"group__sending-data.html#gafd5fdd285a0e25ba7e3e1051deec1001":[9,0,0,0,150],
+"group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193da10047eb05b5e1c298151dc47a5b44826":[7,13,0,2],
+"group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193da10047eb05b5e1c298151dc47a5b44826":[9,0,0,0,31,2],
+"group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193da115440f272a5d55518adfc8099acfee3":[7,13,0,5],
+"group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193da115440f272a5d55518adfc8099acfee3":[9,0,0,0,31,8],
+"group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193da220d8e8652d9b97fb66e476e2a60ffce":[7,13,0,6],
+"group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193da220d8e8652d9b97fb66e476e2a60ffce":[9,0,0,0,31,9],
+"group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193da6e556322ff8f205bf311608f7f6e6559":[9,0,0,0,31,4],
+"group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193da80e8f169fda236c56bfb795ed62903db":[7,13,0,0],
+"group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193da80e8f169fda236c56bfb795ed62903db":[9,0,0,0,31,0],
+"group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193dab7e7a62cf6f456c09c21dff24dad9039":[9,0,0,0,31,5],
+"group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193dabb6705e1d1327cdda5025be28f07712e":[7,13,0,3],
+"group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193dabb6705e1d1327cdda5025be28f07712e":[9,0,0,0,31,3],
+"group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193dae7d8a025a65524652fe9e24c2654c935":[9,0,0,0,31,6],
+"group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193daf6486c0dba50c44198100717721d9ab2":[7,13,0,1],
+"group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193daf6486c0dba50c44198100717721d9ab2":[9,0,0,0,31,1],
+"group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193dafe5a38e940ce56708ac814627e9c0917":[7,13,0,4],
+"group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193dafe5a38e940ce56708ac814627e9c0917":[9,0,0,0,31,7],
+"group__service.html":[7,0],
+"group__service.html#ga29c246707997ab7a466aa709aecd2d7b":[7,0,1],
+"group__service.html#ga29c246707997ab7a466aa709aecd2d7b":[9,0,0,0,52],
+"group__service.html#ga53e3d0801dfda7960a7249dd559e68a2":[9,0,0,0,51],
+"group__service.html#ga53e3d0801dfda7960a7249dd559e68a2":[7,0,0],
+"group__service.html#ga9b3cc4473fd8848e5bbee7f310712939":[7,0,5],
+"group__service.html#ga9b3cc4473fd8848e5bbee7f310712939":[9,0,0,0,127],
+"group__service.html#gad82efa5466d14a9f05aa06416375b28d":[7,0,3],
+"group__service.html#gad82efa5466d14a9f05aa06416375b28d":[9,0,0,0,125],
+"group__service.html#gaebf426eda371ba23642fc11d8e0ace6b":[7,0,4],
+"group__service.html#gaebf426eda371ba23642fc11d8e0ace6b":[9,0,0,0,126],
+"group__service.html#gaf95bd0c663d6516a0c80047d9b1167a8":[9,0,0,0,124],
+"group__service.html#gaf95bd0c663d6516a0c80047d9b1167a8":[7,0,2],
+"group__sha.html":[7,11],
+"group__sha.html#ga66316e6a5a0644a09d5a10e919dfdd8d":[7,11,0],
+"group__sha.html#ga66316e6a5a0644a09d5a10e919dfdd8d":[9,0,0,0,43],
+"group__sha.html#ga7b09ab74646266f0b555103b3bb8dfe5":[7,11,2],
+"group__sha.html#ga7b09ab74646266f0b555103b3bb8dfe5":[9,0,0,0,133],
+"group__sha.html#gaf39765e4a3b413efb65e4698b2ec3575":[7,11,1],
+"group__sha.html#gaf39765e4a3b413efb65e4698b2ec3575":[9,0,0,0,44],
+"group__smtp.html":[7,14],
+"group__smtp.html#ga116be79bf44f9dc2a97f46e051fe4dc0":[7,14,1],
+"group__smtp.html#ga116be79bf44f9dc2a97f46e051fe4dc0":[9,0,0,0,33],
+"group__smtp.html#ga25298a5afc1074e13b2d5711a86432b2":[7,14,3]
+};
--- /dev/null
+var NAVTREEINDEX2 =
+{
+"group__smtp.html#ga25298a5afc1074e13b2d5711a86432b2":[9,0,0,0,68],
+"group__smtp.html#ga5e535e346d92a9daf00be33abf79d4eb":[7,14,2],
+"group__smtp.html#ga5e535e346d92a9daf00be33abf79d4eb":[9,0,0,0,67],
+"group__smtp.html#ga77fc9b56a1bb39484844981ec375fc29":[7,14,4],
+"group__smtp.html#ga77fc9b56a1bb39484844981ec375fc29":[9,0,0,0,69],
+"group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a1dfec948a864205cec875f63cbe0d4ad":[7,14,1,3],
+"group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a1dfec948a864205cec875f63cbe0d4ad":[9,0,0,0,33,3],
+"group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a29e5b0ecf75375b5a643faa3d6222b7c":[7,14,1,0],
+"group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a29e5b0ecf75375b5a643faa3d6222b7c":[9,0,0,0,33,0],
+"group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a2c2ed16ffc572326e3040684084b21d5":[7,14,1,8],
+"group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a2c2ed16ffc572326e3040684084b21d5":[9,0,0,0,33,8],
+"group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a38fba41f28d754e38079b31418a86a69":[7,14,1,7],
+"group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a38fba41f28d754e38079b31418a86a69":[9,0,0,0,33,7],
+"group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a85e3c452950c09a79086bff4b9be5c14":[7,14,1,6],
+"group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a85e3c452950c09a79086bff4b9be5c14":[9,0,0,0,33,6],
+"group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a929bb4623ff3f585108aba2a1b047fab":[7,14,1,4],
+"group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a929bb4623ff3f585108aba2a1b047fab":[9,0,0,0,33,4],
+"group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0aae20a0cb95b97a70f6b45d0ed2d5be83":[7,14,1,5],
+"group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0aae20a0cb95b97a70f6b45d0ed2d5be83":[9,0,0,0,33,5],
+"group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0ab61778f70ecac007b334bb14942eb41d":[9,0,0,0,33,2],
+"group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0ab61778f70ecac007b334bb14942eb41d":[7,14,1,2],
+"group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0ab89442b7a3ca2b94c3cdcf33756eb933":[7,14,1,1],
+"group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0ab89442b7a3ca2b94c3cdcf33756eb933":[9,0,0,0,33,1],
+"group__sock-adopt.html":[7,15],
+"group__sock-adopt.html#gab2d045df0f81afe00891aaed312d552b":[9,0,0,0,42],
+"group__sock-adopt.html#gab2d045df0f81afe00891aaed312d552b":[7,15,1],
+"group__sock-adopt.html#gabe71b7462afb21c767bdc67334f305af":[7,15,0],
+"group__sock-adopt.html#gabe71b7462afb21c767bdc67334f305af":[9,0,0,0,41],
+"group__timeout.html":[7,3],
+"group__timeout.html#ga2c0aa4b9c3c55bae7b35cbfac3246c87":[9,0,0,0,34],
+"group__timeout.html#gaced9f9237f6172fed9f730a2af51345a":[7,3,0],
+"group__timeout.html#gaced9f9237f6172fed9f730a2af51345a":[9,0,0,0,132],
+"group__timeout.html#gga2c0aa4b9c3c55bae7b35cbfac3246c87a0d6b956db11acb6d263af3ea054a914e":[9,0,0,0,34,12],
+"group__timeout.html#gga2c0aa4b9c3c55bae7b35cbfac3246c87a0eef059426f37d00b75142d4dc3e25e3":[9,0,0,0,34,3],
+"group__timeout.html#gga2c0aa4b9c3c55bae7b35cbfac3246c87a1104c39d0177378713a9332ab7a9d7fe":[9,0,0,0,34,4],
+"group__timeout.html#gga2c0aa4b9c3c55bae7b35cbfac3246c87a11292263c9eccd090294e7e316200d7f":[9,0,0,0,34,13],
+"group__timeout.html#gga2c0aa4b9c3c55bae7b35cbfac3246c87a13527b2b1f61d9b2709eb432acd0a248":[9,0,0,0,34,7],
+"group__timeout.html#gga2c0aa4b9c3c55bae7b35cbfac3246c87a211dd9910c37aa3a3a45fd532c76bf6e":[9,0,0,0,34,5],
+"group__timeout.html#gga2c0aa4b9c3c55bae7b35cbfac3246c87a44feda6cc9507a8613b9263b1acc8ce1":[9,0,0,0,34,8],
+"group__timeout.html#gga2c0aa4b9c3c55bae7b35cbfac3246c87a52236b42ec5ffe65d4cdbadeb6c4fcb0":[9,0,0,0,34,2],
+"group__timeout.html#gga2c0aa4b9c3c55bae7b35cbfac3246c87a5fe48ea6f3f5363cca55d39b78490b45":[9,0,0,0,34,15],
+"group__timeout.html#gga2c0aa4b9c3c55bae7b35cbfac3246c87a65785467c0b560bead865231fdd405d7":[9,0,0,0,34,0],
+"group__timeout.html#gga2c0aa4b9c3c55bae7b35cbfac3246c87a73f61afae387e16f7ab8a4f299aca8d2":[9,0,0,0,34,14],
+"group__timeout.html#gga2c0aa4b9c3c55bae7b35cbfac3246c87a7d5b3bcc88ccbddfa57674e174a78c2d":[9,0,0,0,34,9],
+"group__timeout.html#gga2c0aa4b9c3c55bae7b35cbfac3246c87aaf69f440c2e000787efae5ad6f39e74c":[9,0,0,0,34,11],
+"group__timeout.html#gga2c0aa4b9c3c55bae7b35cbfac3246c87ab20463ee983bcd68cd8a501319da56d3":[9,0,0,0,34,6],
+"group__timeout.html#gga2c0aa4b9c3c55bae7b35cbfac3246c87ad7ebebb506afd30c48e1e5e3a578cd30":[9,0,0,0,34,1],
+"group__timeout.html#gga2c0aa4b9c3c55bae7b35cbfac3246c87ae8b3de955cec5da5ea52fe040f914501":[9,0,0,0,34,10],
+"group__urlendec.html":[7,6,5],
+"group__urlendec.html#gaa373a9c16acdd96c395af61ab915ece3":[7,6,5,0],
+"group__urlendec.html#gaa373a9c16acdd96c395af61ab915ece3":[9,0,0,0,142],
+"group__urlendec.html#gabc2888476e50e001c875c1a8abf455b7":[7,6,5,1],
+"group__urlendec.html#gabc2888476e50e001c875c1a8abf455b7":[9,0,0,0,143],
+"group__usercb.html":[7,16],
+"group__usercb.html#gad4fcb82e68d60ffacca61a3f783a0a2f":[7,16,0],
+"group__usercb.html#gad4fcb82e68d60ffacca61a3f783a0a2f":[9,0,0,0,7],
+"group__usercb.html#gad62860e19975ba4c4af401c3cdb6abf7":[9,0,0,0,19],
+"group__usercb.html#gad62860e19975ba4c4af401c3cdb6abf7":[7,16,1],
+"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a026502768778b8d79d62dd0fe4375fc6":[9,0,0,0,19,17],
+"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a026502768778b8d79d62dd0fe4375fc6":[7,16,1,17],
+"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a0418587d5083bb4850faa438648496ba":[9,0,0,0,19,49],
+"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a06006e98d27e1e884364d88317f83493":[9,0,0,0,19,22],
+"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a06006e98d27e1e884364d88317f83493":[7,16,1,22],
+"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a0e9e3dd667c0c42cdbe1a3d921f4fd79":[9,0,0,0,19,36],
+"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a0e9e3dd667c0c42cdbe1a3d921f4fd79":[7,16,1,36],
+"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a136a7cec11c3afd13245623bd84e76c9":[7,16,1,9],
+"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a136a7cec11c3afd13245623bd84e76c9":[9,0,0,0,19,9],
+"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a182a4a14c3278784505cea6d516a8308":[9,0,0,0,19,47],
+"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a1ce5b22039ca37ee224d00047596ea46":[9,0,0,0,19,26],
+"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a1ce5b22039ca37ee224d00047596ea46":[7,16,1,26],
+"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a1df60f314710236f9b53efbf468da768":[9,0,0,0,19,33],
+"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a1df60f314710236f9b53efbf468da768":[7,16,1,33],
+"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a23b90b5e5146e760bc3123ae1fd2a6e5":[9,0,0,0,19,40],
+"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a24d39bf1cfc0bad9d92da9ac1717e439":[9,0,0,0,19,0],
+"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a24d39bf1cfc0bad9d92da9ac1717e439":[7,16,1,0],
+"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a2db02fc6e1c17ab62b52109d1aa9d738":[9,0,0,0,19,7],
+"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a2db02fc6e1c17ab62b52109d1aa9d738":[7,16,1,7],
+"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a2fce9a8608220f32abbf1422a5498804":[9,0,0,0,19,14],
+"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a2fce9a8608220f32abbf1422a5498804":[7,16,1,14],
+"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a390da3639296660a78cc1a5dcb19037e":[9,0,0,0,19,25],
+"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a390da3639296660a78cc1a5dcb19037e":[7,16,1,25],
+"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a45d538082dec32dbecfe9d9a05ddfecd":[9,0,0,0,19,50],
+"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a48a9590e5e18c7920282e094a0bfd9d8":[9,0,0,0,19,4],
+"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a48a9590e5e18c7920282e094a0bfd9d8":[7,16,1,4],
+"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a492c1b1c0ac0ed980042ee732fe2990c":[7,16,1,6],
+"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a492c1b1c0ac0ed980042ee732fe2990c":[9,0,0,0,19,6],
+"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a54269ca88508e6efd3afdb9d360a9caa":[9,0,0,0,19,28],
+"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a54269ca88508e6efd3afdb9d360a9caa":[7,16,1,28],
+"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a659539cfa65c66e0d813113b09900d31":[9,0,0,0,19,42],
+"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a6a09ee9c01c4a233aedbe6697e29cc01":[9,0,0,0,19,44],
+"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a75199176c82c1a56e4a6bbf1cc30c12c":[9,0,0,0,19,18],
+"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a75199176c82c1a56e4a6bbf1cc30c12c":[7,16,1,18],
+"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a7e12418eec9bce85735e6460176ab604":[9,0,0,0,19,3],
+"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a7e12418eec9bce85735e6460176ab604":[7,16,1,3],
+"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a7ec8e2e9557ee02a4fc9f7dec7e2babc":[9,0,0,0,19,11],
+"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a7ec8e2e9557ee02a4fc9f7dec7e2babc":[7,16,1,11],
+"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a838b18d255c1b94a533287ba302a2eba":[9,0,0,0,19,5],
+"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a838b18d255c1b94a533287ba302a2eba":[7,16,1,5],
+"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a8909732521d379179003d97ab7a05428":[7,16,1,35],
+"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a8909732521d379179003d97ab7a05428":[9,0,0,0,19,35],
+"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a89862929a72bff65257ca1d51a0fce4d":[9,0,0,0,19,52],
+"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a8e8b2e6dbeac76d8d126947d2166a514":[7,16,1,10],
+"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a8e8b2e6dbeac76d8d126947d2166a514":[9,0,0,0,19,10],
+"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a909cc2a7018864b0b71abacc4058fd8f":[9,0,0,0,19,24],
+"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a909cc2a7018864b0b71abacc4058fd8f":[7,16,1,24],
+"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a982579753e70e59a9ea13ce628ac891a":[9,0,0,0,19,56],
+"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a982579753e70e59a9ea13ce628ac891a":[7,16,1,39],
+"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aa46f705dcf97502e95627ffde614f98b":[9,0,0,0,19,37],
+"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aa46f705dcf97502e95627ffde614f98b":[7,16,1,37],
+"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aa536e574a642ff3ab9e12bff7ba2c6a2":[9,0,0,0,19,2],
+"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aa536e574a642ff3ab9e12bff7ba2c6a2":[7,16,1,2],
+"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aa627548e1296e654fcfab463ec3c9587":[9,0,0,0,19,15],
+"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aa627548e1296e654fcfab463ec3c9587":[7,16,1,15],
+"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aa87d2e82fffa42c3680c7403ef94216e":[9,0,0,0,19,34],
+"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aa87d2e82fffa42c3680c7403ef94216e":[7,16,1,34],
+"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aaffd08a5cae791c9f3c38ee242203900":[9,0,0,0,19,46],
+"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ab69783a9fbf2ca71ad70706bda77b412":[9,0,0,0,19,32],
+"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ab69783a9fbf2ca71ad70706bda77b412":[7,16,1,32],
+"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ab884f3d5f8a6126a0d34c0172f5e3725":[9,0,0,0,19,53],
+"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7abbbe7a0a67c5866ca9109d46823fc5b1":[9,0,0,0,19,8],
+"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7abbbe7a0a67c5866ca9109d46823fc5b1":[7,16,1,8],
+"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7abcf9c720cd3d361a83d1ac65bf052a25":[9,0,0,0,19,39],
+"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ac11c336f7052abf3618962902a71ebc8":[9,0,0,0,19,54],
+"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ac3fc5bbb55e69f90396526287ee84a51":[7,16,1,38],
+"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ac3fc5bbb55e69f90396526287ee84a51":[9,0,0,0,19,38],
+"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ac432e9f891c733ba8f968c1bf57c0ddc":[9,0,0,0,19,45],
+"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ac4c68e00efcf1ff7bda7ada462aff8ae":[9,0,0,0,19,13],
+"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ac4c68e00efcf1ff7bda7ada462aff8ae":[7,16,1,13],
+"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ac8c0ae966ef1877e0020c0077ff2e4a4":[9,0,0,0,19,41],
+"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aca834dc035b7f7486f9ce40fde54fe9e":[9,0,0,0,19,30],
+"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aca834dc035b7f7486f9ce40fde54fe9e":[7,16,1,30],
+"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7accd8753672d319a30b4b4c2fb775e84d":[9,0,0,0,19,20],
+"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7accd8753672d319a30b4b4c2fb775e84d":[7,16,1,20],
+"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ad5d34583e3556e153eda91620b48cc49":[9,0,0,0,19,27],
+"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ad5d34583e3556e153eda91620b48cc49":[7,16,1,27],
+"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ad724974204d51d688f569c5d387b967d":[9,0,0,0,19,43],
+"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ad87774f1c7784cf632e1e2f5b51036e1":[9,0,0,0,19,48],
+"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ad8c6207b0c4e732f3d507f0fb79370e8":[9,0,0,0,19,1],
+"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ad8c6207b0c4e732f3d507f0fb79370e8":[7,16,1,1],
+"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7adfb41c92e2522712207ef7f2462b5e34":[7,16,1,31],
+"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7adfb41c92e2522712207ef7f2462b5e34":[9,0,0,0,19,31],
+"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ae4986291b7a810fe290851d73bebeb1c":[9,0,0,0,19,21],
+"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ae4986291b7a810fe290851d73bebeb1c":[7,16,1,21],
+"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ae5ad65d779b7eab32ab67ceff91a3bac":[9,0,0,0,19,23],
+"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ae5ad65d779b7eab32ab67ceff91a3bac":[7,16,1,23],
+"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ae8d1de0bb56e03aa58cb4d44b18edd2e":[9,0,0,0,19,12],
+"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ae8d1de0bb56e03aa58cb4d44b18edd2e":[7,16,1,12],
+"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ae9734e1d7af2abf291665ce9e4a728d3":[9,0,0,0,19,19],
+"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ae9734e1d7af2abf291665ce9e4a728d3":[7,16,1,19],
+"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7af6cf80e57aae8ba0a57a5c456b1fe026":[9,0,0,0,19,55],
+"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7afc4b2f72cc9e424a750b506ce0cc4310":[9,0,0,0,19,51],
+"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7afd8fd77a1cc9405fcb4f26915d7f2d01":[9,0,0,0,19,29],
+"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7afd8fd77a1cc9405fcb4f26915d7f2d01":[7,16,1,29],
+"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7afedadfb3cde37a8ea4c84ed535f26d09":[9,0,0,0,19,16],
+"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7afedadfb3cde37a8ea4c84ed535f26d09":[7,16,1,16],
+"group__uv.html":[7,22],
+"group__uv.html#ga097c89497824d4de225a85a00661fc89":[9,0,0,0,108],
+"group__uv.html#ga3c75cd6ec3f80fc0a0c8ead4c4e71a15":[9,0,0,0,109],
+"group__uv.html#ga99099e045993383f251a8026e1e40414":[9,0,0,0,147],
+"group__uv.html#gaa5e3593c94f91910d9d928dfa0c18f6c":[9,0,0,0,144],
+"group__uv.html#gac5f60dba13a45e5d554b4fb7df7b9610":[9,0,0,0,146],
+"group__uv.html#gad85ce3bfc53ff754988d36bf5de39e21":[9,0,0,0,145],
+"group__vhost-mounts.html":[7,4,0],
+"group__vhost-mounts.html#ga31eca18e50cb4357480f2fcad36ff437":[7,4,0,2],
+"group__vhost-mounts.html#ga31eca18e50cb4357480f2fcad36ff437":[9,0,0,0,28],
+"group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437a13ab58b01ac6e05f595977f1e0f0db69":[9,0,0,0,28,3],
+"group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437a13ab58b01ac6e05f595977f1e0f0db69":[7,4,0,2,3],
+"group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437a1e9f0842b0e85db50fe648ed4ba9a4b0":[7,4,0,2,0],
+"group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437a1e9f0842b0e85db50fe648ed4ba9a4b0":[9,0,0,0,28,0],
+"group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437a42f2361cfe76cd287fa8fcfc502357e2":[7,4,0,2,2],
+"group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437a42f2361cfe76cd287fa8fcfc502357e2":[9,0,0,0,28,2],
+"group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437a8894d16316863077dfe530963ca59f67":[7,4,0,2,5],
+"group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437a8894d16316863077dfe530963ca59f67":[9,0,0,0,28,5],
+"group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437a946a88cf9c852eed2c0317f4115d19da":[9,0,0,0,28,6],
+"group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437a946a88cf9c852eed2c0317f4115d19da":[7,4,0,2,6],
+"group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437aec137a2434851bd856ceebfb697b9970":[9,0,0,0,28,4],
+"group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437aec137a2434851bd856ceebfb697b9970":[7,4,0,2,4],
+"group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437afbd10eb4777517ed1f6bfdcf3b9ea1d1":[7,4,0,2,1],
+"group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437afbd10eb4777517ed1f6bfdcf3b9ea1d1":[9,0,0,0,28,1],
+"group__wsclose.html":[7,17],
+"group__wsclose.html#gaa1c863415d1783cd8de7938aa6efa262":[7,17,1],
+"group__wsclose.html#gaa1c863415d1783cd8de7938aa6efa262":[9,0,0,0,61],
+"group__wsclose.html#gae399c571df32ba532c0ca67da9284985":[9,0,0,0,21],
+"group__wsclose.html#gae399c571df32ba532c0ca67da9284985":[7,17,0],
+"group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a1bb501d212fa4d57053db681b1dfab98":[9,0,0,0,21,3],
+"group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a1bb501d212fa4d57053db681b1dfab98":[7,17,0,2],
+"group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a2e1f0113494a58e762eed3d22e7080d8":[9,0,0,0,21,10],
+"group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a2e1f0113494a58e762eed3d22e7080d8":[7,17,0,9],
+"group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a32c38edab10d1379febac0c479ab2e9c":[9,0,0,0,21,14],
+"group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a3ffa38d5081b85fb739e02a747ccf2c4":[9,0,0,0,21,1],
+"group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a3ffa38d5081b85fb739e02a747ccf2c4":[7,17,0,0],
+"group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a462c99b05459df700919cfd3f53c8276":[9,0,0,0,21,4],
+"group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a462c99b05459df700919cfd3f53c8276":[7,17,0,3],
+"group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a4b8a3b7ce6f731e5248e4b0fb64a5044":[9,0,0,0,21,6],
+"group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a4b8a3b7ce6f731e5248e4b0fb64a5044":[7,17,0,5],
+"group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a68b3d34bebd88547dcfa5cadba0acd6c":[7,17,0,6],
+"group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a68b3d34bebd88547dcfa5cadba0acd6c":[9,0,0,0,21,7],
+"group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a7aef2da0062da606eeb35aaca5cf9050":[7,17,0,7],
+"group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a7aef2da0062da606eeb35aaca5cf9050":[9,0,0,0,21,8],
+"group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a9737a68759e739856b150ff9dfa30218":[7,17,0,1],
+"group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a9737a68759e739856b150ff9dfa30218":[9,0,0,0,21,2],
+"group__wsclose.html#ggae399c571df32ba532c0ca67da9284985ac6a161822783ee873be1c66f48d14e0e":[7,17,0,10],
+"group__wsclose.html#ggae399c571df32ba532c0ca67da9284985ac6a161822783ee873be1c66f48d14e0e":[9,0,0,0,21,11],
+"group__wsclose.html#ggae399c571df32ba532c0ca67da9284985acc9a317c70363dd88e823e066b2c73b7":[9,0,0,0,21,0],
+"group__wsclose.html#ggae399c571df32ba532c0ca67da9284985ad0869604d79e13700ae5d196a431b350":[9,0,0,0,21,12],
+"group__wsclose.html#ggae399c571df32ba532c0ca67da9284985ad0869604d79e13700ae5d196a431b350":[7,17,0,11],
+"group__wsclose.html#ggae399c571df32ba532c0ca67da9284985ad09e68295eabdddcba4e332fbea70ae5":[9,0,0,0,21,9],
+"group__wsclose.html#ggae399c571df32ba532c0ca67da9284985ad09e68295eabdddcba4e332fbea70ae5":[7,17,0,8],
+"group__wsclose.html#ggae399c571df32ba532c0ca67da9284985ad2b477a91c8445bf34ecd43977f9b390":[7,17,0,12],
+"group__wsclose.html#ggae399c571df32ba532c0ca67da9284985ad2b477a91c8445bf34ecd43977f9b390":[9,0,0,0,21,13],
+"group__wsclose.html#ggae399c571df32ba532c0ca67da9284985af90cb98d983ad3d4c79df9b6f3d4a4d2":[9,0,0,0,21,5],
+"group__wsclose.html#ggae399c571df32ba532c0ca67da9284985af90cb98d983ad3d4c79df9b6f3d4a4d2":[7,17,0,4],
+"group__wsstatus.html":[7,18],
+"group__wsstatus.html#ga08e9ee165fca503fd9427d55cfecac37":[7,18,3],
+"group__wsstatus.html#ga08e9ee165fca503fd9427d55cfecac37":[9,0,0,0,103],
+"group__wsstatus.html#ga26a140623d202dd2bf2004deb6994baa":[7,18,4],
+"group__wsstatus.html#ga26a140623d202dd2bf2004deb6994baa":[9,0,0,0,104],
+"group__wsstatus.html#ga2bb3655329b4651cd06f79ee3a764421":[7,18,6],
+"group__wsstatus.html#ga2bb3655329b4651cd06f79ee3a764421":[9,0,0,0,121],
+"group__wsstatus.html#ga3df5045656dfb6b0e63a38de2dca79d2":[7,18,1],
+"group__wsstatus.html#ga3df5045656dfb6b0e63a38de2dca79d2":[9,0,0,0,89],
+"group__wsstatus.html#ga4ad226d5e01024b4046f4a5a37199aa1":[9,0,0,0,102],
+"group__wsstatus.html#ga4ad226d5e01024b4046f4a5a37199aa1":[7,18,2],
+"group__wsstatus.html#gaccd9c59336efad8af0554f79cc5966fd":[9,0,0,0,77],
+"group__wsstatus.html#gaccd9c59336efad8af0554f79cc5966fd":[7,18,0],
+"group__wsstatus.html#gaeca4afc94b1f026034f99cbba37e2f85":[9,0,0,0,112],
+"group__wsstatus.html#gaeca4afc94b1f026034f99cbba37e2f85":[7,18,5],
+"hierarchy.html":[8,2],
+"index.html":[0],
+"index.html":[],
+"libwebsockets_8h.html":[9,0,0,0],
+"libwebsockets_8h.html#a0b056fdcf949a838ff82209b4a627dd9":[9,0,0,0,157],
+"libwebsockets_8h.html#a2271141d8be8d72b47ba327130b4905f":[9,0,0,0,23],
+"libwebsockets_8h.html#a2271141d8be8d72b47ba327130b4905fa7741c12fc97574fa73a810fedae2be76":[9,0,0,0,23,1],
+"libwebsockets_8h.html#a2271141d8be8d72b47ba327130b4905fa9ce9c65d4229d1d168fca3cc12e7f535":[9,0,0,0,23,2],
+"libwebsockets_8h.html#a2271141d8be8d72b47ba327130b4905fafdb6cf2797a3ea957c690ad6edff25d6":[9,0,0,0,23,0],
+"libwebsockets_8h.html#a27bb0b3cdcd0af839c928c253b521ff4":[9,0,0,0,55],
+"libwebsockets_8h.html#a42394a38f08a97420c98127358cfeedb":[9,0,0,0,20],
+"libwebsockets_8h.html#a42394a38f08a97420c98127358cfeedba35cf2bed9944faa062d9310197489b2f":[9,0,0,0,20,4],
+"libwebsockets_8h.html#a42394a38f08a97420c98127358cfeedba60ac587febc583475c185e1409a0210c":[9,0,0,0,20,1],
+"libwebsockets_8h.html#a42394a38f08a97420c98127358cfeedbaa424646e067c6266bcb4f0190b026d66":[9,0,0,0,20,0],
+"libwebsockets_8h.html#a42394a38f08a97420c98127358cfeedbac8f5f992c6615324108cdf931da903be":[9,0,0,0,20,2],
+"libwebsockets_8h.html#a42394a38f08a97420c98127358cfeedbad655f0eecc9e94be37b8ed07348716ef":[9,0,0,0,20,6],
+"libwebsockets_8h.html#a42394a38f08a97420c98127358cfeedbad9cdc12a796e6c7d912278834d9c7dde":[9,0,0,0,20,3],
+"libwebsockets_8h.html#a42394a38f08a97420c98127358cfeedbada3dca91d96bcde5df08a67b5a66e972":[9,0,0,0,20,5],
+"libwebsockets_8h.html#a5326d3402af8429a166dd991dc65c4a2":[9,0,0,0,56],
+"libwebsockets_8h.html#a5e627dbf1db48170ef486edbaf268672":[9,0,0,0,119],
+"libwebsockets_8h.html#a72fe65e83b8bb03f904a1a256c673536":[9,0,0,0,117],
+"libwebsockets_8h.html#a9032a3062641d334161c29adcc4fa15d":[9,0,0,0,159],
+"libwebsockets_8h.html#a9f2a8506fd963db95a5103823c60fb0a":[9,0,0,0,160]
+};
--- /dev/null
+var NAVTREEINDEX3 =
+{
+"libwebsockets_8h.html#abddb8d337fb2692586d892b494739003":[9,0,0,0,17],
+"libwebsockets_8h.html#ac3abb8b7e6d29a0292797230e4031681":[9,0,0,0,16],
+"libwebsockets_8h.html#adedbc79528b71a5c7f27cde87100c9aa":[9,0,0,0,14],
+"libwebsockets_8h.html#adf4abd01e8c43f07c6e498ce13590c3e":[9,0,0,0,120],
+"libwebsockets_8h.html#aefb2f20fe5bb29d79701a399838ef4ce":[9,0,0,0,158],
+"libwebsockets_8h.html#af52923473c59e643a974d65e12290831":[9,0,0,0,54],
+"libwebsockets_8h.html#aff42d53861afdc1a6edfb999ba688ecb":[9,0,0,0,10],
+"libwebsockets_8h_source.html":[9,0,0,0],
+"md_README.build.html":[1],
+"md_README.coding.html":[3],
+"md_README.generic-sessions.html":[4],
+"md_README.lwsws.html":[2],
+"md_README.test-apps.html":[5],
+"modules.html":[7],
+"pages.html":[],
+"structlws__cgi__args.html":[8,0,0],
+"structlws__cgi__args.html#a36e5c256433c187bd0eaa9c1ca667f1d":[8,0,0,3],
+"structlws__cgi__args.html#a4ccc1058e7e914a26eef31ab2ad46aa1":[8,0,0,4],
+"structlws__cgi__args.html#a741c11b9aa05997ec45a3400d7fb7739":[8,0,0,2],
+"structlws__cgi__args.html#a8ac842084688c02f3f94694ef700d8f7":[8,0,0,1],
+"structlws__cgi__args.html#adeee220b29aeacc34632c38e50f0f5a5":[8,0,0,0],
+"structlws__client__connect__info.html":[7,2,0],
+"structlws__client__connect__info.html#a03c305fdca809667b6a9a83b3edfd83a":[7,2,0,13],
+"structlws__client__connect__info.html#a1af124d81c3c22a46d39387c5bc3d6b9":[7,2,0,10],
+"structlws__client__connect__info.html#a3893181d728f326f9f5b47c1459cb8be":[7,2,0,16],
+"structlws__client__connect__info.html#a6843a60e1050b10db9d98d7eeb45f587":[7,2,0,8],
+"structlws__client__connect__info.html#a69abb5aeed755750b9755e5c91db6895":[7,2,0,5],
+"structlws__client__connect__info.html#a76a8388733f114fb8fd3643874781185":[7,2,0,9],
+"structlws__client__connect__info.html#a7732b996e977393c3e1076be2a8ded6c":[7,2,0,2],
+"structlws__client__connect__info.html#a8595f83e64147cb687b6418cf500dd4c":[7,2,0,7],
+"structlws__client__connect__info.html#a9831b9f9ab54a1aec4bb15324f1c3836":[7,2,0,15],
+"structlws__client__connect__info.html#a9862297827639238a7a0b4054c3ddf3d":[7,2,0,12],
+"structlws__client__connect__info.html#a9959ba103d3d2484e559a9f7879eebe3":[7,2,0,14],
+"structlws__client__connect__info.html#a9b36d47c3422329df32c21040a35ebc7":[7,2,0,4],
+"structlws__client__connect__info.html#aa364094f94ef1bcaaabbd9161971d502":[7,2,0,1],
+"structlws__client__connect__info.html#aa9e8e3da4e783a0651b0dea62c2dd1db":[7,2,0,6],
+"structlws__client__connect__info.html#aba35adfb74845a5fd0c3dc141cbdddd2":[7,2,0,11],
+"structlws__client__connect__info.html#ad47f50d1633dc5df74548606c9a66d73":[7,2,0,0],
+"structlws__client__connect__info.html#afe999d133cc240a0bfd02aade0514cfd":[7,2,0,3],
+"structlws__context__creation__info.html":[7,4,1],
+"structlws__context__creation__info.html#a0b154e79abc1167ba4ac3539f4af6720":[7,4,1,16],
+"structlws__context__creation__info.html#a0cdfd3c484689ba6f0f2cc91b38ce948":[7,4,1,14],
+"structlws__context__creation__info.html#a0e790dda6202604f73a03b6149bc12bb":[7,4,1,23],
+"structlws__context__creation__info.html#a0e9d94cdfb893d777b4a4db81e7b5ac0":[7,4,1,37],
+"structlws__context__creation__info.html#a137a9b9de4f6a7993fed8746d551e616":[7,4,1,26],
+"structlws__context__creation__info.html#a13ffbb0d010309669611f8c4eda7d7f8":[7,4,1,17],
+"structlws__context__creation__info.html#a1654d41bea6fb2f619b57e6a264b26a4":[7,4,1,22],
+"structlws__context__creation__info.html#a381342a398883d6204955ff3c1849ddd":[7,4,1,9],
+"structlws__context__creation__info.html#a3baab4285c679fbe027c2504621d7410":[7,4,1,10],
+"structlws__context__creation__info.html#a3e1516fd7fed26bfa77c0246ed26c2eb":[7,4,1,29],
+"structlws__context__creation__info.html#a424a5ce268d6903e42243be94487ab85":[7,4,1,20],
+"structlws__context__creation__info.html#a45e63e24c88289e0c8352377ef4d3646":[7,4,1,4],
+"structlws__context__creation__info.html#a4a3d1155fc52f5048b481884f6fb947c":[7,4,1,3],
+"structlws__context__creation__info.html#a4f8e65c3a059d3b586fafa9ef3282c29":[7,4,1,27],
+"structlws__context__creation__info.html#a57f88c0745adbd1d6b9b619b8de30209":[7,4,1,24],
+"structlws__context__creation__info.html#a6cfa3d51df2def3349a5cbf0d712822d":[7,4,1,34],
+"structlws__context__creation__info.html#a704940261951ced6b5d8191bd8b9bb2d":[7,4,1,31],
+"structlws__context__creation__info.html#a75434932bb5df54665ea678eb8ac104a":[7,4,1,8],
+"structlws__context__creation__info.html#a7b59f2bdc869871e7bde232db94f5ca6":[7,4,1,7],
+"structlws__context__creation__info.html#a8122cfc0810bafe51edb3ba6bf9a1251":[7,4,1,19],
+"structlws__context__creation__info.html#a81697c6b763b5ef3ee52862bc70b07d6":[7,4,1,12],
+"structlws__context__creation__info.html#a999866fcd15dbd621773436f97190458":[7,4,1,25],
+"structlws__context__creation__info.html#a9c9d22437de92c197f3cee52912b2c03":[7,4,1,5],
+"structlws__context__creation__info.html#a9d3b17a25e1fbc772f21eb4959a82724":[7,4,1,18],
+"structlws__context__creation__info.html#aa8d9e85e137f35fb006f2e4a53f0887a":[7,4,1,15],
+"structlws__context__creation__info.html#ab9ec8893e0f7843cf5d783d2f350ef14":[7,4,1,32],
+"structlws__context__creation__info.html#abb90ffb3e6d6db2db20f529d61bd9122":[7,4,1,21],
+"structlws__context__creation__info.html#ac105b4180008cb3e672d57beead8382e":[7,4,1,36],
+"structlws__context__creation__info.html#ac583ce92b8e1c949cb6fef6bfe713d56":[7,4,1,11],
+"structlws__context__creation__info.html#ac62b0f0e8e402412ba5011d15c244103":[7,4,1,28],
+"structlws__context__creation__info.html#ac8a75b7b259a3c3a5fbb4219a3f06c29":[7,4,1,35],
+"structlws__context__creation__info.html#ad0e95ba721f7bd2b676719f8093c23a2":[7,4,1,13],
+"structlws__context__creation__info.html#ad50db098a208f045f7811207d2bee4b9":[7,4,1,38],
+"structlws__context__creation__info.html#adb0bc0b28cd7d90ab306723d8ffa96fa":[7,4,1,30],
+"structlws__context__creation__info.html#ae52f3237e144e9ddcab5e2cf91d1e419":[7,4,1,1],
+"structlws__context__creation__info.html#aef917c0b23976a264d2474901b4f5aa3":[7,4,1,6],
+"structlws__context__creation__info.html#af3fb447be15c4fcb01d3285a6678ab54":[7,4,1,33],
+"structlws__context__creation__info.html#afa5d4e7d9f86b58a1c6fac14f0a5f5f9":[7,4,1,2],
+"structlws__context__creation__info.html#afce3b59950eca3203faa07381bbed5d7":[7,4,1,0],
+"structlws__email.html":[7,14,0],
+"structlws__email.html#a01f31934166dc6d01e8a375012f8ad1e":[7,14,0,3],
+"structlws__email.html#a2aff78c8e04db243052aa91b4d87e987":[7,14,0,13],
+"structlws__email.html#a39ef6263d58eb40cca417c8697b227d8":[7,14,0,15],
+"structlws__email.html#a472ae23fc9fca6599e5c512bc21458d2":[7,14,0,8],
+"structlws__email.html#a5f53d4c5a1e34b0dcaa8787e2eabb1b3":[7,14,0,4],
+"structlws__email.html#a6453a8b92b3de6d2c2101af3edce685e":[7,14,0,9],
+"structlws__email.html#a6fff03c5a5d369a2aa3cab0c897b1bed":[7,14,0,0],
+"structlws__email.html#a77723e2f2b940b1c879ef5e1cd88c2be":[7,14,0,16],
+"structlws__email.html#a7bbc1964889c984b3da723c86a210e05":[7,14,0,12],
+"structlws__email.html#a8f34ec0643a817be67ef4276aeb7fb82":[7,14,0,2],
+"structlws__email.html#a939e5d7ee0339a16de73bde71ab4d4d9":[7,14,0,7],
+"structlws__email.html#a9747ca85597788c2d118d287df47b7c1":[7,14,0,5],
+"structlws__email.html#ab5fbf121195a8e67509c78a42cfbe168":[7,14,0,11],
+"structlws__email.html#ac6115d3cbef2e8bac62cc00895bf5fd3":[7,14,0,10],
+"structlws__email.html#ad8dc60353ee246d84dd59ec0591e9719":[7,14,0,14],
+"structlws__email.html#add1341456045382c183f4c763bdea6bc":[7,14,0,1],
+"structlws__email.html#af7f0ae934347d81071f63a963301f9e2":[7,14,0,6],
+"structlws__ext__option__arg.html":[7,5,1],
+"structlws__ext__option__arg.html#a0a320c56b79271b8f059eeaad9423ac9":[7,5,1,2],
+"structlws__ext__option__arg.html#a0b1f7b30c3ceaf5f1bf9d105c24568d1":[7,5,1,3],
+"structlws__ext__option__arg.html#af37f0b6caa7735af51a1ac12b68d5bc5":[7,5,1,0],
+"structlws__ext__option__arg.html#af57fffcfa253dfa8d98681ac1fb1785f":[7,5,1,1],
+"structlws__ext__options.html":[7,5,0],
+"structlws__ext__options.html#a1769e4a9805bbdda227821e9578ddc7e":[7,5,0,0],
+"structlws__ext__options.html#a7c4dbd62dbeba63a9d50d2306bd1cc61":[7,5,0,1],
+"structlws__extension.html":[7,5,2],
+"structlws__extension.html#a1e5018c883d85176f5c2152176843f9e":[7,5,2,2],
+"structlws__extension.html#a36b06c213aedb02bf9a402651751855b":[7,5,2,1],
+"structlws__extension.html#afa21f3b3c8c2c9212a276c52b680c3af":[7,5,2,0],
+"structlws__gs__event__args.html":[7,10,0,3],
+"structlws__gs__event__args.html#a2bec693d8a43730d487004a44326178b":[7,10,0,3,2],
+"structlws__gs__event__args.html#a477274f8ca22ba7411b9285b9dc8dd06":[7,10,0,3,1],
+"structlws__gs__event__args.html#acd17e4f9f91f7f9a8f0fbf0744a3a463":[7,10,0,3,0],
+"structlws__http__mount.html":[7,4,0,1],
+"structlws__http__mount.html#a05347d92c3d379809564bd4f3eab259b":[7,4,0,1,15],
+"structlws__http__mount.html#a11ea62b952710d59733dbcf9794a5773":[7,4,0,1,9],
+"structlws__http__mount.html#a21d86fd6043ec00e121ababbc29af39a":[7,4,0,1,13],
+"structlws__http__mount.html#a4283e30ea89d27ae7d061ad760d1d146":[7,4,0,1,2],
+"structlws__http__mount.html#a4437423df85ee3dbcae0e15974c89ec7":[7,4,0,1,8],
+"structlws__http__mount.html#a4a7239d6d4c03986e6e1a72abb6c83aa":[7,4,0,1,5],
+"structlws__http__mount.html#a614364c770b0bd4db464ad65cddab477":[7,4,0,1,0],
+"structlws__http__mount.html#a6a9b1492a0b9749e39bd19932717a0b7":[7,4,0,1,14],
+"structlws__http__mount.html#a8316dd183ffbef50419a5a4968d35d84":[7,4,0,1,3],
+"structlws__http__mount.html#aa2391bfcada0b7a290b3c6651f64586c":[7,4,0,1,11],
+"structlws__http__mount.html#aabec1a326780aafe11b977000983be0c":[7,4,0,1,1],
+"structlws__http__mount.html#ac8489b60b8f969eb19c9abbdeac90743":[7,4,0,1,12],
+"structlws__http__mount.html#ad878546ae1c399bbca7d7f8a0baf973d":[7,4,0,1,10],
+"structlws__http__mount.html#ae137203040c6153694bd88a708da5395":[7,4,0,1,4],
+"structlws__http__mount.html#ae7b5c0f4c5408061e6ea3a8d281f45af":[7,4,0,1,6],
+"structlws__http__mount.html#ae90d1efe7178199fad39de2926902ee4":[7,4,0,1,7],
+"structlws__plat__file__ops.html":[7,20,0],
+"structlws__plat__file__ops.html#a01f483807a9862736b17ba9ed5110c40":[7,20,0,2],
+"structlws__plat__file__ops.html#a034ec96f2fbaf52b4aa3e82d20795f7b":[7,20,0,0],
+"structlws__plat__file__ops.html#a1fae8330ee94649a3551e31a30809793":[7,20,0,4],
+"structlws__plat__file__ops.html#abfcda19b003dcc13c61ff9e2bb4ff869":[7,20,0,3],
+"structlws__plat__file__ops.html#ad37a97abc68d0af967cef874f4d8df32":[7,20,0,1],
+"structlws__plugin.html":[7,10,3],
+"structlws__plugin.html#a4ef37a43653715b6c69cbf8a7be747f4":[7,10,3,1],
+"structlws__plugin.html#a65dffd68fd267ce17b988790d1d35f22":[7,10,3,3],
+"structlws__plugin.html#ac7f1fdfe8cf8a21f8ee9720c21934a3f":[7,10,3,0],
+"structlws__plugin.html#af4ac8fcb79e10e0c2d960e1804d98105":[7,10,3,4],
+"structlws__plugin.html#af9e1042dc1de5b9d202c2f5fd1834330":[7,10,3,2],
+"structlws__plugin__capability.html":[7,10,2],
+"structlws__plugin__capability.html#a523c7cde6f15bba345f56493dcf6b32a":[7,10,2,0],
+"structlws__plugin__capability.html#a6a4d9d01e770f378ddadc77b37522033":[7,10,2,4],
+"structlws__plugin__capability.html#a7936f0eb93d79dea76b903d0f8a5f623":[7,10,2,3],
+"structlws__plugin__capability.html#abcf51db969522fdda9aaf902e65739d3":[7,10,2,1],
+"structlws__plugin__capability.html#ae38f7cf1246b9ca3af3cbf9d46b7090f":[7,10,2,2],
+"structlws__polarssl__context.html":[8,0,14],
+"structlws__polarssl__context.html#a1872f2ea24878d807ae20ca8513674af":[8,0,14,0],
+"structlws__polarssl__context.html#a919c33af37aab170f828d954de1fa270":[8,0,14,2],
+"structlws__polarssl__context.html#ae7e11c9129ff71c7ee71b3b2e320ff27":[8,0,14,1],
+"structlws__pollargs.html":[8,0,15],
+"structlws__pollargs.html#a00bbffea9f55de342783e32d71ce1de6":[8,0,15,0],
+"structlws__pollargs.html#a437fec0de5cf264371e1ab5a401e86d8":[8,0,15,2],
+"structlws__pollargs.html#af14a48ef4e78128aef9a76902b104a81":[8,0,15,1],
+"structlws__pollfd.html":[8,0,16],
+"structlws__pollfd.html#a714cf5ca90b41926117fdde9fa6542be":[8,0,16,1],
+"structlws__pollfd.html#ac393db6fc7fb6ed8fe7ca20936908ee9":[8,0,16,0],
+"structlws__pollfd.html#ae7cecfe7511c59d4a3a44f876d030932":[8,0,16,2],
+"structlws__process__html__args.html":[7,6,1,0],
+"structlws__process__html__args.html#a11859d8bedd379fbf64543b25c65fe14":[7,6,1,0,3],
+"structlws__process__html__args.html#a362547891ee0d693f3900a1f807ea475":[7,6,1,0,0],
+"structlws__process__html__args.html#a754513f2311241cabb0cd1c90d7307ef":[7,6,1,0,1],
+"structlws__process__html__args.html#a8be7fd396a1942ea2449a2fda990ff99":[7,6,1,0,2],
+"structlws__process__html__state.html":[7,6,1,1],
+"structlws__process__html__state.html#a3b113e00c03a2fded51b1c85ff5bf077":[7,6,1,1,6],
+"structlws__process__html__state.html#a53234f2948812c7208a256f9f5b23c20":[7,6,1,1,2],
+"structlws__process__html__state.html#a693d2fb45378afee5da29b539c1ea644":[7,6,1,1,3],
+"structlws__process__html__state.html#a71982bc1cbd8cf876ca0f545144404eb":[7,6,1,1,5],
+"structlws__process__html__state.html#adcafd17704775b4bbeea9561fb340968":[7,6,1,1,0],
+"structlws__process__html__state.html#af0732884ef891e24fe5fa237ebaa21a3":[7,6,1,1,4],
+"structlws__process__html__state.html#af21119890fdfebe28fb5c4dabfc1bdf5":[7,6,1,1,1],
+"structlws__protocol__vhost__options.html":[7,4,2],
+"structlws__protocol__vhost__options.html":[7,4,0,0],
+"structlws__protocol__vhost__options.html#a0640a92513c70ee6b9b295a9ad1658e7":[7,4,2,3],
+"structlws__protocol__vhost__options.html#a0640a92513c70ee6b9b295a9ad1658e7":[7,4,0,0,3],
+"structlws__protocol__vhost__options.html#abc714ddb4171756fc8196e9823a1e21c":[7,4,0,0,1],
+"structlws__protocol__vhost__options.html#abc714ddb4171756fc8196e9823a1e21c":[7,4,2,1],
+"structlws__protocol__vhost__options.html#acf9db77f8eb64cd4e314be9b43d8a8b9":[7,4,0,0,0],
+"structlws__protocol__vhost__options.html#acf9db77f8eb64cd4e314be9b43d8a8b9":[7,4,2,0],
+"structlws__protocol__vhost__options.html#afd99fbc90be51ea2465b550c2ec47822":[7,4,2,2],
+"structlws__protocol__vhost__options.html#afd99fbc90be51ea2465b550c2ec47822":[7,4,0,0,2],
+"structlws__protocols.html":[7,10,1],
+"structlws__protocols.html#a0d1d4996d81b2f5e125bcec981e461c5":[7,10,1,4],
+"structlws__protocols.html#a0e63edb457a613c3fa4271e0a8f19624":[7,10,1,2],
+"structlws__protocols.html#a3cbd903ad076736ae934a54cae36580e":[7,10,1,5],
+"structlws__protocols.html#a6b632018590c2b1bbe43fbab6d5e6fac":[7,10,1,1],
+"structlws__protocols.html#a9bbd85f591ffb4259711cb5acbb05bea":[7,10,1,3],
+"structlws__protocols.html#acabf94c1a9bfe7be0387fbb0e0c56b2d":[7,10,1,0],
+"structlws__session__info.html":[7,10,0,2],
+"structlws__session__info.html#a3d57a70b6e7181d95a8bec429b1a7697":[7,10,0,2,4],
+"structlws__session__info.html#a4353b5dd19400b2b15edfd7cee1e4cd5":[7,10,0,2,3],
+"structlws__session__info.html#a53eed02325e8717a53297391e3e98fac":[7,10,0,2,1],
+"structlws__session__info.html#a94b813cfc6b0da4b182659de30038ad3":[7,10,0,2,0],
+"structlws__session__info.html#afb924864b70f40372920688a5c1c895e":[7,10,0,2,2],
+"structlws__token__limits.html":[7,6,4,1],
+"structlws__token__limits.html#a6ec712306cbf8585bce7a56758a3ceff":[7,6,4,1,0],
+"structlws__tokens.html":[7,6,4,0],
+"structlws__tokens.html":[7,6,6],
+"structlws__tokens.html#a855b7375d1d58516c0ecd4b60e9a7766":[7,6,4,0,1],
+"structlws__tokens.html#a855b7375d1d58516c0ecd4b60e9a7766":[7,6,6,1],
+"structlws__tokens.html#a9f3635412bc71a5cb78e9862b55f10cd":[7,6,4,0,0],
+"structlws__tokens.html#a9f3635412bc71a5cb78e9862b55f10cd":[7,6,6,0],
+"structlwsgw__hash.html":[7,10,0,1],
+"structlwsgw__hash.html#a29435f5cf78747d4257695b0f141d164":[7,10,0,1,0],
+"structlwsgw__hash__bin.html":[7,10,0,0],
+"structlwsgw__hash__bin.html#ac92f50d9471058525d110597a4e0de6b":[7,10,0,0,0],
+"structpollfd.html":[8,0,26],
+"structpollfd.html#aafb457d11cac415faf0e1e2b825118c2":[8,0,26,2],
+"structpollfd.html#ac9b2f2c5b1f9a7487eb57e67cd4960ef":[8,0,26,0],
+"structpollfd.html#af084f089bdece61d177f85782d6673d0":[8,0,26,1]
+};
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.11"/>
+<title>libwebsockets: Related Pages</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="libwebsockets.org-logo.png"/></td>
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname">libwebsockets
+ </div>
+ <div id="projectbrief">Lightweight C library for HTML5 websockets</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.11 -->
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main Page</span></a></li>
+ <li class="current"><a href="pages.html"><span>Related Pages</span></a></li>
+ <li><a href="modules.html"><span>Modules</span></a></li>
+ <li><a href="annotated.html"><span>Data Structures</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('pages.html','');});
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="headertitle">
+<div class="title">Related Pages</div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock">Here is a list of all related documentation pages:</div><div class="directory">
+<table class="directory">
+<tr id="row_0_" class="even"><td class="entry"><span style="width:16px;display:inline-block;"> </span><a class="el" href="md_README.build.html" target="_self">Notes about building lws</a></td><td class="desc"></td></tr>
+<tr id="row_1_"><td class="entry"><span style="width:16px;display:inline-block;"> </span><a class="el" href="md_README.lwsws.html" target="_self">Notes about lwsws</a></td><td class="desc"></td></tr>
+<tr id="row_2_" class="even"><td class="entry"><span style="width:16px;display:inline-block;"> </span><a class="el" href="md_README.coding.html" target="_self">Notes about coding with lws</a></td><td class="desc"></td></tr>
+<tr id="row_3_"><td class="entry"><span style="width:16px;display:inline-block;"> </span><a class="el" href="md_README.generic-sessions.html" target="_self">Notes about generic-sessions Plugin</a></td><td class="desc"></td></tr>
+<tr id="row_4_" class="even"><td class="entry"><span style="width:16px;display:inline-block;"> </span><a class="el" href="md_README.test-apps.html" target="_self">Notes about lws test apps</a></td><td class="desc"></td></tr>
+<tr id="row_5_"><td class="entry"><span style="width:16px;display:inline-block;"> </span><a class="el" href="deprecated.html" target="_self">Deprecated List</a></td><td class="desc"></td></tr>
+</table>
+</div><!-- directory -->
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="footer">Generated by
+ <a href="http://www.doxygen.org/index.html">
+ <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.11 </li>
+ </ul>
+</div>
+</body>
+</html>
--- /dev/null
+var cookie_namespace = 'doxygen';
+var sidenav,navtree,content,header;
+
+function readCookie(cookie)
+{
+ var myCookie = cookie_namespace+"_"+cookie+"=";
+ if (document.cookie)
+ {
+ var index = document.cookie.indexOf(myCookie);
+ if (index != -1)
+ {
+ var valStart = index + myCookie.length;
+ var valEnd = document.cookie.indexOf(";", valStart);
+ if (valEnd == -1)
+ {
+ valEnd = document.cookie.length;
+ }
+ var val = document.cookie.substring(valStart, valEnd);
+ return val;
+ }
+ }
+ return 0;
+}
+
+function writeCookie(cookie, val, expiration)
+{
+ if (val==undefined) return;
+ if (expiration == null)
+ {
+ var date = new Date();
+ date.setTime(date.getTime()+(10*365*24*60*60*1000)); // default expiration is one week
+ expiration = date.toGMTString();
+ }
+ document.cookie = cookie_namespace + "_" + cookie + "=" + val + "; expires=" + expiration+"; path=/";
+}
+
+function resizeWidth()
+{
+ var windowWidth = $(window).width() + "px";
+ var sidenavWidth = $(sidenav).outerWidth();
+ content.css({marginLeft:parseInt(sidenavWidth)+"px"});
+ writeCookie('width',sidenavWidth, null);
+}
+
+function restoreWidth(navWidth)
+{
+ var windowWidth = $(window).width() + "px";
+ content.css({marginLeft:parseInt(navWidth)+6+"px"});
+ sidenav.css({width:navWidth + "px"});
+}
+
+function resizeHeight()
+{
+ var headerHeight = header.outerHeight();
+ var footerHeight = footer.outerHeight();
+ var windowHeight = $(window).height() - headerHeight - footerHeight;
+ content.css({height:windowHeight + "px"});
+ navtree.css({height:windowHeight + "px"});
+ sidenav.css({height:windowHeight + "px"});
+}
+
+function initResizable()
+{
+ header = $("#top");
+ sidenav = $("#side-nav");
+ content = $("#doc-content");
+ navtree = $("#nav-tree");
+ footer = $("#nav-path");
+ $(".side-nav-resizable").resizable({resize: function(e, ui) { resizeWidth(); } });
+ $(window).resize(function() { resizeHeight(); });
+ var width = readCookie('width');
+ if (width) { restoreWidth(width); } else { resizeWidth(); }
+ resizeHeight();
+ var url = location.href;
+ var i=url.indexOf("#");
+ if (i>=0) window.location.hash=url.substr(i);
+ var _preventDefault = function(evt) { evt.preventDefault(); };
+ $("#splitbar").bind("dragstart", _preventDefault).bind("selectstart", _preventDefault);
+ $(document).bind('touchmove',function(e){
+ var device = navigator.userAgent.toLowerCase();
+ var ios = device.match(/(iphone|ipod|ipad)/);
+ if (ios) {
+ try {
+ var target = e.target;
+ while (target) {
+ if ($(target).css('-webkit-overflow-scrolling')=='touch') return;
+ target = target.parentNode;
+ }
+ e.preventDefault();
+ } catch(err) {
+ e.preventDefault();
+ }
+ }
+ });
+}
+
+
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.11"/>
+<title>libwebsockets: lws_cgi_args Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="libwebsockets.org-logo.png"/></td>
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname">libwebsockets
+ </div>
+ <div id="projectbrief">Lightweight C library for HTML5 websockets</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.11 -->
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main Page</span></a></li>
+ <li><a href="pages.html"><span>Related Pages</span></a></li>
+ <li><a href="modules.html"><span>Modules</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Data Structures</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Data Structures</span></a></li>
+ <li><a href="classes.html"><span>Data Structure Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Data Fields</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('structlws__cgi__args.html','');});
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#pub-attribs">Data Fields</a> </div>
+ <div class="headertitle">
+<div class="title">lws_cgi_args Struct Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:a4ccc1058e7e914a26eef31ab2ad46aa1"><td class="memItemLeft" align="right" valign="top">struct lws ** </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__cgi__args.html#a4ccc1058e7e914a26eef31ab2ad46aa1">stdwsi</a></td></tr>
+<tr class="separator:a4ccc1058e7e914a26eef31ab2ad46aa1"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:adeee220b29aeacc34632c38e50f0f5a5"><td class="memItemLeft" align="right" valign="top">enum lws_enum_stdinouterr </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__cgi__args.html#adeee220b29aeacc34632c38e50f0f5a5">ch</a></td></tr>
+<tr class="separator:adeee220b29aeacc34632c38e50f0f5a5"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a8ac842084688c02f3f94694ef700d8f7"><td class="memItemLeft" align="right" valign="top">unsigned char * </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__cgi__args.html#a8ac842084688c02f3f94694ef700d8f7">data</a></td></tr>
+<tr class="separator:a8ac842084688c02f3f94694ef700d8f7"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a741c11b9aa05997ec45a3400d7fb7739"><td class="memItemLeft" align="right" valign="top">enum lws_cgi_hdr_state </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__cgi__args.html#a741c11b9aa05997ec45a3400d7fb7739">hdr_state</a></td></tr>
+<tr class="separator:a741c11b9aa05997ec45a3400d7fb7739"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a36e5c256433c187bd0eaa9c1ca667f1d"><td class="memItemLeft" align="right" valign="top">int </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__cgi__args.html#a36e5c256433c187bd0eaa9c1ca667f1d">len</a></td></tr>
+<tr class="separator:a36e5c256433c187bd0eaa9c1ca667f1d"><td class="memSeparator" colspan="2"> </td></tr>
+</table>
+<h2 class="groupheader">Field Documentation</h2>
+<a class="anchor" id="adeee220b29aeacc34632c38e50f0f5a5"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">enum lws_enum_stdinouterr lws_cgi_args::ch</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>channel index </p>
+
+</div>
+</div>
+<a class="anchor" id="a8ac842084688c02f3f94694ef700d8f7"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">unsigned char* lws_cgi_args::data</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>for messages with payload </p>
+
+</div>
+</div>
+<a class="anchor" id="a741c11b9aa05997ec45a3400d7fb7739"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">enum lws_cgi_hdr_state lws_cgi_args::hdr_state</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>track where we are in cgi headers </p>
+
+</div>
+</div>
+<a class="anchor" id="a36e5c256433c187bd0eaa9c1ca667f1d"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">int lws_cgi_args::len</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>length </p>
+
+</div>
+</div>
+<a class="anchor" id="a4ccc1058e7e914a26eef31ab2ad46aa1"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">struct lws** lws_cgi_args::stdwsi</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>get fd with <a class="el" href="group__callback-when-writeable.html#gaa709e02a10558753c851e58f1e2c16ba">lws_get_socket_fd()</a> </p>
+
+</div>
+</div>
+<hr/>The documentation for this struct was generated from the following file:<ul>
+<li>lib/<a class="el" href="libwebsockets_8h_source.html">libwebsockets.h</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="structlws__cgi__args.html">lws_cgi_args</a></li>
+ <li class="footer">Generated by
+ <a href="http://www.doxygen.org/index.html">
+ <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.11 </li>
+ </ul>
+</div>
+</body>
+</html>
--- /dev/null
+var structlws__cgi__args =
+[
+ [ "ch", "structlws__cgi__args.html#adeee220b29aeacc34632c38e50f0f5a5", null ],
+ [ "data", "structlws__cgi__args.html#a8ac842084688c02f3f94694ef700d8f7", null ],
+ [ "hdr_state", "structlws__cgi__args.html#a741c11b9aa05997ec45a3400d7fb7739", null ],
+ [ "len", "structlws__cgi__args.html#a36e5c256433c187bd0eaa9c1ca667f1d", null ],
+ [ "stdwsi", "structlws__cgi__args.html#a4ccc1058e7e914a26eef31ab2ad46aa1", null ]
+];
\ No newline at end of file
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.11"/>
+<title>libwebsockets: lws_client_connect_info Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="libwebsockets.org-logo.png"/></td>
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname">libwebsockets
+ </div>
+ <div id="projectbrief">Lightweight C library for HTML5 websockets</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.11 -->
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main Page</span></a></li>
+ <li><a href="pages.html"><span>Related Pages</span></a></li>
+ <li><a href="modules.html"><span>Modules</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Data Structures</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Data Structures</span></a></li>
+ <li><a href="classes.html"><span>Data Structure Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Data Fields</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('structlws__client__connect__info.html','');});
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#pub-attribs">Data Fields</a> </div>
+ <div class="headertitle">
+<div class="title">lws_client_connect_info Struct Reference<div class="ingroups"><a class="el" href="group__client.html">Client</a></div></div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h_source.html">libwebsockets.h</a>></code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:afe999d133cc240a0bfd02aade0514cfd"><td class="memItemLeft" align="right" valign="top">struct lws_context * </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__client__connect__info.html#afe999d133cc240a0bfd02aade0514cfd">context</a></td></tr>
+<tr class="separator:afe999d133cc240a0bfd02aade0514cfd"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:aa364094f94ef1bcaaabbd9161971d502"><td class="memItemLeft" align="right" valign="top">const char * </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__client__connect__info.html#aa364094f94ef1bcaaabbd9161971d502">address</a></td></tr>
+<tr class="separator:aa364094f94ef1bcaaabbd9161971d502"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a1af124d81c3c22a46d39387c5bc3d6b9"><td class="memItemLeft" align="right" valign="top">int </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__client__connect__info.html#a1af124d81c3c22a46d39387c5bc3d6b9">port</a></td></tr>
+<tr class="separator:a1af124d81c3c22a46d39387c5bc3d6b9"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a9862297827639238a7a0b4054c3ddf3d"><td class="memItemLeft" align="right" valign="top">int </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__client__connect__info.html#a9862297827639238a7a0b4054c3ddf3d">ssl_connection</a></td></tr>
+<tr class="separator:a9862297827639238a7a0b4054c3ddf3d"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a76a8388733f114fb8fd3643874781185"><td class="memItemLeft" align="right" valign="top">const char * </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__client__connect__info.html#a76a8388733f114fb8fd3643874781185">path</a></td></tr>
+<tr class="separator:a76a8388733f114fb8fd3643874781185"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a9b36d47c3422329df32c21040a35ebc7"><td class="memItemLeft" align="right" valign="top">const char * </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__client__connect__info.html#a9b36d47c3422329df32c21040a35ebc7">host</a></td></tr>
+<tr class="separator:a9b36d47c3422329df32c21040a35ebc7"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a8595f83e64147cb687b6418cf500dd4c"><td class="memItemLeft" align="right" valign="top">const char * </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__client__connect__info.html#a8595f83e64147cb687b6418cf500dd4c">origin</a></td></tr>
+<tr class="separator:a8595f83e64147cb687b6418cf500dd4c"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:aba35adfb74845a5fd0c3dc141cbdddd2"><td class="memItemLeft" align="right" valign="top">const char * </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__client__connect__info.html#aba35adfb74845a5fd0c3dc141cbdddd2">protocol</a></td></tr>
+<tr class="separator:aba35adfb74845a5fd0c3dc141cbdddd2"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a69abb5aeed755750b9755e5c91db6895"><td class="memItemLeft" align="right" valign="top">int </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__client__connect__info.html#a69abb5aeed755750b9755e5c91db6895">ietf_version_or_minus_one</a></td></tr>
+<tr class="separator:a69abb5aeed755750b9755e5c91db6895"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a9831b9f9ab54a1aec4bb15324f1c3836"><td class="memItemLeft" align="right" valign="top">void * </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__client__connect__info.html#a9831b9f9ab54a1aec4bb15324f1c3836">userdata</a></td></tr>
+<tr class="separator:a9831b9f9ab54a1aec4bb15324f1c3836"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a7732b996e977393c3e1076be2a8ded6c"><td class="memItemLeft" align="right" valign="top">const struct <a class="el" href="structlws__extension.html">lws_extension</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__client__connect__info.html#a7732b996e977393c3e1076be2a8ded6c">client_exts</a></td></tr>
+<tr class="separator:a7732b996e977393c3e1076be2a8ded6c"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:aa9e8e3da4e783a0651b0dea62c2dd1db"><td class="memItemLeft" align="right" valign="top">const char * </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__client__connect__info.html#aa9e8e3da4e783a0651b0dea62c2dd1db">method</a></td></tr>
+<tr class="separator:aa9e8e3da4e783a0651b0dea62c2dd1db"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a6843a60e1050b10db9d98d7eeb45f587"><td class="memItemLeft" align="right" valign="top">struct lws * </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__client__connect__info.html#a6843a60e1050b10db9d98d7eeb45f587">parent_wsi</a></td></tr>
+<tr class="separator:a6843a60e1050b10db9d98d7eeb45f587"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a03c305fdca809667b6a9a83b3edfd83a"><td class="memItemLeft" align="right" valign="top">const char * </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__client__connect__info.html#a03c305fdca809667b6a9a83b3edfd83a">uri_replace_from</a></td></tr>
+<tr class="separator:a03c305fdca809667b6a9a83b3edfd83a"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a9959ba103d3d2484e559a9f7879eebe3"><td class="memItemLeft" align="right" valign="top">const char * </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__client__connect__info.html#a9959ba103d3d2484e559a9f7879eebe3">uri_replace_to</a></td></tr>
+<tr class="separator:a9959ba103d3d2484e559a9f7879eebe3"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a3893181d728f326f9f5b47c1459cb8be"><td class="memItemLeft" align="right" valign="top">struct lws_vhost * </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__client__connect__info.html#a3893181d728f326f9f5b47c1459cb8be">vhost</a></td></tr>
+<tr class="separator:a3893181d728f326f9f5b47c1459cb8be"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ad47f50d1633dc5df74548606c9a66d73"><td class="memItemLeft" align="right" valign="top">void * </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__client__connect__info.html#ad47f50d1633dc5df74548606c9a66d73">_unused</a> [4]</td></tr>
+<tr class="separator:ad47f50d1633dc5df74548606c9a66d73"><td class="memSeparator" colspan="2"> </td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>struct <a class="el" href="structlws__client__connect__info.html">lws_client_connect_info</a> - parameters to connect with when using <a class="el" href="group__client.html#gac30a7be106abd0cedfbb2e8b8fe3a2f5">lws_client_connect_via_info()</a> </p>
+</div><h2 class="groupheader">Field Documentation</h2>
+<a class="anchor" id="ad47f50d1633dc5df74548606c9a66d73"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void* lws_client_connect_info::_unused[4]</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>dummy </p>
+
+</div>
+</div>
+<a class="anchor" id="aa364094f94ef1bcaaabbd9161971d502"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const char* lws_client_connect_info::address</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>remote address to connect to </p>
+
+</div>
+</div>
+<a class="anchor" id="a7732b996e977393c3e1076be2a8ded6c"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const struct <a class="el" href="structlws__extension.html">lws_extension</a>* lws_client_connect_info::client_exts</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>array of extensions that may be used on connection </p>
+
+</div>
+</div>
+<a class="anchor" id="afe999d133cc240a0bfd02aade0514cfd"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">struct lws_context* lws_client_connect_info::context</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>lws context to create connection in </p>
+
+</div>
+</div>
+<a class="anchor" id="a9b36d47c3422329df32c21040a35ebc7"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const char* lws_client_connect_info::host</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>content of host header </p>
+
+</div>
+</div>
+<a class="anchor" id="a69abb5aeed755750b9755e5c91db6895"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">int lws_client_connect_info::ietf_version_or_minus_one</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>deprecated: currently leave at 0 or -1 </p>
+
+</div>
+</div>
+<a class="anchor" id="aa9e8e3da4e783a0651b0dea62c2dd1db"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const char* lws_client_connect_info::method</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>if non-NULL, do this http method instead of ws[s] upgrade. use "GET" to be a simple http client connection </p>
+
+</div>
+</div>
+<a class="anchor" id="a8595f83e64147cb687b6418cf500dd4c"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const char* lws_client_connect_info::origin</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>content of origin header </p>
+
+</div>
+</div>
+<a class="anchor" id="a6843a60e1050b10db9d98d7eeb45f587"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">struct lws* lws_client_connect_info::parent_wsi</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>if another wsi is responsible for this connection, give it here. this is used to make sure if the parent closes so do any child connections first. </p>
+
+</div>
+</div>
+<a class="anchor" id="a76a8388733f114fb8fd3643874781185"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const char* lws_client_connect_info::path</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>uri path </p>
+
+</div>
+</div>
+<a class="anchor" id="a1af124d81c3c22a46d39387c5bc3d6b9"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">int lws_client_connect_info::port</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>remote port to connect to </p>
+
+</div>
+</div>
+<a class="anchor" id="aba35adfb74845a5fd0c3dc141cbdddd2"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const char* lws_client_connect_info::protocol</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>list of ws protocols we could accept </p>
+
+</div>
+</div>
+<a class="anchor" id="a9862297827639238a7a0b4054c3ddf3d"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">int lws_client_connect_info::ssl_connection</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>nonzero for ssl </p>
+
+</div>
+</div>
+<a class="anchor" id="a03c305fdca809667b6a9a83b3edfd83a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const char* lws_client_connect_info::uri_replace_from</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>if non-NULL, when this string is found in URIs in text/html content-encoding, it's replaced with uri_replace_to </p>
+
+</div>
+</div>
+<a class="anchor" id="a9959ba103d3d2484e559a9f7879eebe3"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const char* lws_client_connect_info::uri_replace_to</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>see uri_replace_from </p>
+
+</div>
+</div>
+<a class="anchor" id="a9831b9f9ab54a1aec4bb15324f1c3836"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void* lws_client_connect_info::userdata</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>if non-NULL, use this as wsi user_data instead of malloc it </p>
+
+</div>
+</div>
+<a class="anchor" id="a3893181d728f326f9f5b47c1459cb8be"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">struct lws_vhost* lws_client_connect_info::vhost</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>vhost to bind to (used to determine related SSL_CTX) </p>
+
+</div>
+</div>
+<hr/>The documentation for this struct was generated from the following file:<ul>
+<li>lib/<a class="el" href="libwebsockets_8h_source.html">libwebsockets.h</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="structlws__client__connect__info.html">lws_client_connect_info</a></li>
+ <li class="footer">Generated by
+ <a href="http://www.doxygen.org/index.html">
+ <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.11 </li>
+ </ul>
+</div>
+</body>
+</html>
--- /dev/null
+var structlws__client__connect__info =
+[
+ [ "_unused", "structlws__client__connect__info.html#ad47f50d1633dc5df74548606c9a66d73", null ],
+ [ "address", "structlws__client__connect__info.html#aa364094f94ef1bcaaabbd9161971d502", null ],
+ [ "client_exts", "structlws__client__connect__info.html#a7732b996e977393c3e1076be2a8ded6c", null ],
+ [ "context", "structlws__client__connect__info.html#afe999d133cc240a0bfd02aade0514cfd", null ],
+ [ "host", "structlws__client__connect__info.html#a9b36d47c3422329df32c21040a35ebc7", null ],
+ [ "ietf_version_or_minus_one", "structlws__client__connect__info.html#a69abb5aeed755750b9755e5c91db6895", null ],
+ [ "method", "structlws__client__connect__info.html#aa9e8e3da4e783a0651b0dea62c2dd1db", null ],
+ [ "origin", "structlws__client__connect__info.html#a8595f83e64147cb687b6418cf500dd4c", null ],
+ [ "parent_wsi", "structlws__client__connect__info.html#a6843a60e1050b10db9d98d7eeb45f587", null ],
+ [ "path", "structlws__client__connect__info.html#a76a8388733f114fb8fd3643874781185", null ],
+ [ "port", "structlws__client__connect__info.html#a1af124d81c3c22a46d39387c5bc3d6b9", null ],
+ [ "protocol", "structlws__client__connect__info.html#aba35adfb74845a5fd0c3dc141cbdddd2", null ],
+ [ "ssl_connection", "structlws__client__connect__info.html#a9862297827639238a7a0b4054c3ddf3d", null ],
+ [ "uri_replace_from", "structlws__client__connect__info.html#a03c305fdca809667b6a9a83b3edfd83a", null ],
+ [ "uri_replace_to", "structlws__client__connect__info.html#a9959ba103d3d2484e559a9f7879eebe3", null ],
+ [ "userdata", "structlws__client__connect__info.html#a9831b9f9ab54a1aec4bb15324f1c3836", null ],
+ [ "vhost", "structlws__client__connect__info.html#a3893181d728f326f9f5b47c1459cb8be", null ]
+];
\ No newline at end of file
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.11"/>
+<title>libwebsockets: lws_context_creation_info Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="libwebsockets.org-logo.png"/></td>
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname">libwebsockets
+ </div>
+ <div id="projectbrief">Lightweight C library for HTML5 websockets</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.11 -->
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main Page</span></a></li>
+ <li><a href="pages.html"><span>Related Pages</span></a></li>
+ <li><a href="modules.html"><span>Modules</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Data Structures</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Data Structures</span></a></li>
+ <li><a href="classes.html"><span>Data Structure Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Data Fields</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('structlws__context__creation__info.html','');});
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#pub-attribs">Data Fields</a> </div>
+ <div class="headertitle">
+<div class="title">lws_context_creation_info Struct Reference<div class="ingroups"><a class="el" href="group__context-and-vhost.html">Context-and-vhost</a></div></div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h_source.html">libwebsockets.h</a>></code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:a424a5ce268d6903e42243be94487ab85"><td class="memItemLeft" align="right" valign="top">int </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__context__creation__info.html#a424a5ce268d6903e42243be94487ab85">port</a></td></tr>
+<tr class="separator:a424a5ce268d6903e42243be94487ab85"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a75434932bb5df54665ea678eb8ac104a"><td class="memItemLeft" align="right" valign="top">const char * </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__context__creation__info.html#a75434932bb5df54665ea678eb8ac104a">iface</a></td></tr>
+<tr class="separator:a75434932bb5df54665ea678eb8ac104a"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:abb90ffb3e6d6db2db20f529d61bd9122"><td class="memItemLeft" align="right" valign="top">const struct <a class="el" href="structlws__protocols.html">lws_protocols</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__context__creation__info.html#abb90ffb3e6d6db2db20f529d61bd9122">protocols</a></td></tr>
+<tr class="separator:abb90ffb3e6d6db2db20f529d61bd9122"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a4a3d1155fc52f5048b481884f6fb947c"><td class="memItemLeft" align="right" valign="top">const struct <a class="el" href="structlws__extension.html">lws_extension</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__context__creation__info.html#a4a3d1155fc52f5048b481884f6fb947c">extensions</a></td></tr>
+<tr class="separator:a4a3d1155fc52f5048b481884f6fb947c"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ac8a75b7b259a3c3a5fbb4219a3f06c29"><td class="memItemLeft" align="right" valign="top">const struct <a class="el" href="structlws__token__limits.html">lws_token_limits</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__context__creation__info.html#ac8a75b7b259a3c3a5fbb4219a3f06c29">token_limits</a></td></tr>
+<tr class="separator:ac8a75b7b259a3c3a5fbb4219a3f06c29"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:af3fb447be15c4fcb01d3285a6678ab54"><td class="memItemLeft" align="right" valign="top">const char * </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__context__creation__info.html#af3fb447be15c4fcb01d3285a6678ab54">ssl_private_key_password</a></td></tr>
+<tr class="separator:af3fb447be15c4fcb01d3285a6678ab54"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ac62b0f0e8e402412ba5011d15c244103"><td class="memItemLeft" align="right" valign="top">const char * </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__context__creation__info.html#ac62b0f0e8e402412ba5011d15c244103">ssl_cert_filepath</a></td></tr>
+<tr class="separator:ac62b0f0e8e402412ba5011d15c244103"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ab9ec8893e0f7843cf5d783d2f350ef14"><td class="memItemLeft" align="right" valign="top">const char * </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__context__creation__info.html#ab9ec8893e0f7843cf5d783d2f350ef14">ssl_private_key_filepath</a></td></tr>
+<tr class="separator:ab9ec8893e0f7843cf5d783d2f350ef14"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a4f8e65c3a059d3b586fafa9ef3282c29"><td class="memItemLeft" align="right" valign="top">const char * </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__context__creation__info.html#a4f8e65c3a059d3b586fafa9ef3282c29">ssl_ca_filepath</a></td></tr>
+<tr class="separator:a4f8e65c3a059d3b586fafa9ef3282c29"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a3e1516fd7fed26bfa77c0246ed26c2eb"><td class="memItemLeft" align="right" valign="top">const char * </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__context__creation__info.html#a3e1516fd7fed26bfa77c0246ed26c2eb">ssl_cipher_list</a></td></tr>
+<tr class="separator:a3e1516fd7fed26bfa77c0246ed26c2eb"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:aef917c0b23976a264d2474901b4f5aa3"><td class="memItemLeft" align="right" valign="top">const char * </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__context__creation__info.html#aef917c0b23976a264d2474901b4f5aa3">http_proxy_address</a></td></tr>
+<tr class="separator:aef917c0b23976a264d2474901b4f5aa3"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a7b59f2bdc869871e7bde232db94f5ca6"><td class="memItemLeft" align="right" valign="top">unsigned int </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__context__creation__info.html#a7b59f2bdc869871e7bde232db94f5ca6">http_proxy_port</a></td></tr>
+<tr class="separator:a7b59f2bdc869871e7bde232db94f5ca6"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a9c9d22437de92c197f3cee52912b2c03"><td class="memItemLeft" align="right" valign="top">int </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__context__creation__info.html#a9c9d22437de92c197f3cee52912b2c03">gid</a></td></tr>
+<tr class="separator:a9c9d22437de92c197f3cee52912b2c03"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ac105b4180008cb3e672d57beead8382e"><td class="memItemLeft" align="right" valign="top">int </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__context__creation__info.html#ac105b4180008cb3e672d57beead8382e">uid</a></td></tr>
+<tr class="separator:ac105b4180008cb3e672d57beead8382e"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a9d3b17a25e1fbc772f21eb4959a82724"><td class="memItemLeft" align="right" valign="top">unsigned int </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__context__creation__info.html#a9d3b17a25e1fbc772f21eb4959a82724">options</a></td></tr>
+<tr class="separator:a9d3b17a25e1fbc772f21eb4959a82724"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a0e9d94cdfb893d777b4a4db81e7b5ac0"><td class="memItemLeft" align="right" valign="top">void * </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__context__creation__info.html#a0e9d94cdfb893d777b4a4db81e7b5ac0">user</a></td></tr>
+<tr class="separator:a0e9d94cdfb893d777b4a4db81e7b5ac0"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ac583ce92b8e1c949cb6fef6bfe713d56"><td class="memItemLeft" align="right" valign="top">int </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__context__creation__info.html#ac583ce92b8e1c949cb6fef6bfe713d56">ka_time</a></td></tr>
+<tr class="separator:ac583ce92b8e1c949cb6fef6bfe713d56"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a3baab4285c679fbe027c2504621d7410"><td class="memItemLeft" align="right" valign="top">int </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__context__creation__info.html#a3baab4285c679fbe027c2504621d7410">ka_probes</a></td></tr>
+<tr class="separator:a3baab4285c679fbe027c2504621d7410"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a381342a398883d6204955ff3c1849ddd"><td class="memItemLeft" align="right" valign="top">int </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__context__creation__info.html#a381342a398883d6204955ff3c1849ddd">ka_interval</a></td></tr>
+<tr class="separator:a381342a398883d6204955ff3c1849ddd"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a1654d41bea6fb2f619b57e6a264b26a4"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structlws__polarssl__context.html">SSL_CTX</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__context__creation__info.html#a1654d41bea6fb2f619b57e6a264b26a4">provided_client_ssl_ctx</a></td></tr>
+<tr class="separator:a1654d41bea6fb2f619b57e6a264b26a4"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a0e790dda6202604f73a03b6149bc12bb"><td class="memItemLeft" align="right" valign="top">void * </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__context__creation__info.html#a0e790dda6202604f73a03b6149bc12bb">provided_client_ssl_ctx</a></td></tr>
+<tr class="separator:a0e790dda6202604f73a03b6149bc12bb"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a0cdfd3c484689ba6f0f2cc91b38ce948"><td class="memItemLeft" align="right" valign="top">short </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__context__creation__info.html#a0cdfd3c484689ba6f0f2cc91b38ce948">max_http_header_data</a></td></tr>
+<tr class="separator:a0cdfd3c484689ba6f0f2cc91b38ce948"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a0b154e79abc1167ba4ac3539f4af6720"><td class="memItemLeft" align="right" valign="top">short </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__context__creation__info.html#a0b154e79abc1167ba4ac3539f4af6720">max_http_header_pool</a></td></tr>
+<tr class="separator:a0b154e79abc1167ba4ac3539f4af6720"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ae52f3237e144e9ddcab5e2cf91d1e419"><td class="memItemLeft" align="right" valign="top">unsigned int </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__context__creation__info.html#ae52f3237e144e9ddcab5e2cf91d1e419">count_threads</a></td></tr>
+<tr class="separator:ae52f3237e144e9ddcab5e2cf91d1e419"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a45e63e24c88289e0c8352377ef4d3646"><td class="memItemLeft" align="right" valign="top">unsigned int </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__context__creation__info.html#a45e63e24c88289e0c8352377ef4d3646">fd_limit_per_thread</a></td></tr>
+<tr class="separator:a45e63e24c88289e0c8352377ef4d3646"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a6cfa3d51df2def3349a5cbf0d712822d"><td class="memItemLeft" align="right" valign="top">unsigned int </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__context__creation__info.html#a6cfa3d51df2def3349a5cbf0d712822d">timeout_secs</a></td></tr>
+<tr class="separator:a6cfa3d51df2def3349a5cbf0d712822d"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:afa5d4e7d9f86b58a1c6fac14f0a5f5f9"><td class="memItemLeft" align="right" valign="top">const char * </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__context__creation__info.html#afa5d4e7d9f86b58a1c6fac14f0a5f5f9">ecdh_curve</a></td></tr>
+<tr class="separator:afa5d4e7d9f86b58a1c6fac14f0a5f5f9"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ad50db098a208f045f7811207d2bee4b9"><td class="memItemLeft" align="right" valign="top">const char * </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__context__creation__info.html#ad50db098a208f045f7811207d2bee4b9">vhost_name</a></td></tr>
+<tr class="separator:ad50db098a208f045f7811207d2bee4b9"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a8122cfc0810bafe51edb3ba6bf9a1251"><td class="memItemLeft" align="right" valign="top">const char *const * </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__context__creation__info.html#a8122cfc0810bafe51edb3ba6bf9a1251">plugin_dirs</a></td></tr>
+<tr class="separator:a8122cfc0810bafe51edb3ba6bf9a1251"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a999866fcd15dbd621773436f97190458"><td class="memItemLeft" align="right" valign="top">const struct <a class="el" href="structlws__protocol__vhost__options.html">lws_protocol_vhost_options</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__context__creation__info.html#a999866fcd15dbd621773436f97190458">pvo</a></td></tr>
+<tr class="separator:a999866fcd15dbd621773436f97190458"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a81697c6b763b5ef3ee52862bc70b07d6"><td class="memItemLeft" align="right" valign="top">int </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__context__creation__info.html#a81697c6b763b5ef3ee52862bc70b07d6">keepalive_timeout</a></td></tr>
+<tr class="separator:a81697c6b763b5ef3ee52862bc70b07d6"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ad0e95ba721f7bd2b676719f8093c23a2"><td class="memItemLeft" align="right" valign="top">const char * </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__context__creation__info.html#ad0e95ba721f7bd2b676719f8093c23a2">log_filepath</a></td></tr>
+<tr class="separator:ad0e95ba721f7bd2b676719f8093c23a2"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a13ffbb0d010309669611f8c4eda7d7f8"><td class="memItemLeft" align="right" valign="top">const struct <a class="el" href="structlws__http__mount.html">lws_http_mount</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__context__creation__info.html#a13ffbb0d010309669611f8c4eda7d7f8">mounts</a></td></tr>
+<tr class="separator:a13ffbb0d010309669611f8c4eda7d7f8"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a137a9b9de4f6a7993fed8746d551e616"><td class="memItemLeft" align="right" valign="top">const char * </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__context__creation__info.html#a137a9b9de4f6a7993fed8746d551e616">server_string</a></td></tr>
+<tr class="separator:a137a9b9de4f6a7993fed8746d551e616"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a57f88c0745adbd1d6b9b619b8de30209"><td class="memItemLeft" align="right" valign="top">unsigned int </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__context__creation__info.html#a57f88c0745adbd1d6b9b619b8de30209">pt_serv_buf_size</a></td></tr>
+<tr class="separator:a57f88c0745adbd1d6b9b619b8de30209"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:aa8d9e85e137f35fb006f2e4a53f0887a"><td class="memItemLeft" align="right" valign="top">unsigned int </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__context__creation__info.html#aa8d9e85e137f35fb006f2e4a53f0887a">max_http_header_data2</a></td></tr>
+<tr class="separator:aa8d9e85e137f35fb006f2e4a53f0887a"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a704940261951ced6b5d8191bd8b9bb2d"><td class="memItemLeft" align="right" valign="top">long </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__context__creation__info.html#a704940261951ced6b5d8191bd8b9bb2d">ssl_options_set</a></td></tr>
+<tr class="separator:a704940261951ced6b5d8191bd8b9bb2d"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:adb0bc0b28cd7d90ab306723d8ffa96fa"><td class="memItemLeft" align="right" valign="top">long </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__context__creation__info.html#adb0bc0b28cd7d90ab306723d8ffa96fa">ssl_options_clear</a></td></tr>
+<tr class="separator:adb0bc0b28cd7d90ab306723d8ffa96fa"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:afce3b59950eca3203faa07381bbed5d7"><td class="memItemLeft" align="right" valign="top">void * </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__context__creation__info.html#afce3b59950eca3203faa07381bbed5d7">_unused</a> [8]</td></tr>
+<tr class="separator:afce3b59950eca3203faa07381bbed5d7"><td class="memSeparator" colspan="2"> </td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>struct <a class="el" href="structlws__context__creation__info.html">lws_context_creation_info</a> - parameters to create context and /or vhost with</p>
+<p>This is also used to create vhosts.... if LWS_SERVER_OPTION_EXPLICIT_VHOSTS is not given, then for backwards compatibility one vhost is created at context-creation time using the info from this struct.</p>
+<p>If LWS_SERVER_OPTION_EXPLICIT_VHOSTS is given, then no vhosts are created at the same time as the context, they are expected to be created afterwards. </p>
+</div><h2 class="groupheader">Field Documentation</h2>
+<a class="anchor" id="afce3b59950eca3203faa07381bbed5d7"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void* lws_context_creation_info::_unused[8]</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>dummy </p>
+
+</div>
+</div>
+<a class="anchor" id="ae52f3237e144e9ddcab5e2cf91d1e419"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">unsigned int lws_context_creation_info::count_threads</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>CONTEXT: how many contexts to create in an array, 0 = 1 </p>
+
+</div>
+</div>
+<a class="anchor" id="afa5d4e7d9f86b58a1c6fac14f0a5f5f9"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const char* lws_context_creation_info::ecdh_curve</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>VHOST: if NULL, defaults to initializing server with "prime256v1" </p>
+
+</div>
+</div>
+<a class="anchor" id="a4a3d1155fc52f5048b481884f6fb947c"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const struct <a class="el" href="structlws__extension.html">lws_extension</a>* lws_context_creation_info::extensions</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>VHOST: NULL or array of <a class="el" href="structlws__extension.html">lws_extension</a> structs listing the extensions this context supports. </p>
+
+</div>
+</div>
+<a class="anchor" id="a45e63e24c88289e0c8352377ef4d3646"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">unsigned int lws_context_creation_info::fd_limit_per_thread</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>CONTEXT: nonzero means restrict each service thread to this many fds, 0 means the default which is divide the process fd limit by the number of threads. </p>
+
+</div>
+</div>
+<a class="anchor" id="a9c9d22437de92c197f3cee52912b2c03"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">int lws_context_creation_info::gid</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>CONTEXT: group id to change to after setting listen socket, or -1. </p>
+
+</div>
+</div>
+<a class="anchor" id="aef917c0b23976a264d2474901b4f5aa3"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const char* lws_context_creation_info::http_proxy_address</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>VHOST: If non-NULL, attempts to proxy via the given address. If proxy auth is required, use format "username:password\@server:port" </p>
+
+</div>
+</div>
+<a class="anchor" id="a7b59f2bdc869871e7bde232db94f5ca6"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">unsigned int lws_context_creation_info::http_proxy_port</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>VHOST: If http_proxy_address was non-NULL, uses this port </p>
+
+</div>
+</div>
+<a class="anchor" id="a75434932bb5df54665ea678eb8ac104a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const char* lws_context_creation_info::iface</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>VHOST: NULL to bind the listen socket to all interfaces, or the interface name, eg, "eth2" If options specifies LWS_SERVER_OPTION_UNIX_SOCK, this member is the pathname of a UNIX domain socket. you can use the UNIX domain sockets in abstract namespace, by prepending an at symbol to the socket name. </p>
+
+</div>
+</div>
+<a class="anchor" id="a381342a398883d6204955ff3c1849ddd"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">int lws_context_creation_info::ka_interval</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>CONTEXT: if ka_time was nonzero, how long to wait before each ka_probes attempt </p>
+
+</div>
+</div>
+<a class="anchor" id="a3baab4285c679fbe027c2504621d7410"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">int lws_context_creation_info::ka_probes</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>CONTEXT: if ka_time was nonzero, after the timeout expires how many times to try to get a response from the peer before giving up and killing the connection </p>
+
+</div>
+</div>
+<a class="anchor" id="ac583ce92b8e1c949cb6fef6bfe713d56"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">int lws_context_creation_info::ka_time</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>CONTEXT: 0 for no TCP keepalive, otherwise apply this keepalive timeout to all libwebsocket sockets, client or server </p>
+
+</div>
+</div>
+<a class="anchor" id="a81697c6b763b5ef3ee52862bc70b07d6"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">int lws_context_creation_info::keepalive_timeout</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>VHOST: (default = 0 = 60s) seconds to allow remote client to hold on to an idle HTTP/1.1 connection </p>
+
+</div>
+</div>
+<a class="anchor" id="ad0e95ba721f7bd2b676719f8093c23a2"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const char* lws_context_creation_info::log_filepath</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>VHOST: filepath to append logs to... this is opened before any dropping of initial privileges </p>
+
+</div>
+</div>
+<a class="anchor" id="a0cdfd3c484689ba6f0f2cc91b38ce948"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">short lws_context_creation_info::max_http_header_data</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>CONTEXT: The max amount of header payload that can be handled in an http request (unrecognized header payload is dropped) </p>
+
+</div>
+</div>
+<a class="anchor" id="aa8d9e85e137f35fb006f2e4a53f0887a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">unsigned int lws_context_creation_info::max_http_header_data2</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>CONTEXT: if max_http_header_data is 0 and this is nonzero, this will be used in place of the default. It's like this for compatibility with the original short version, this is unsigned int length. </p>
+
+</div>
+</div>
+<a class="anchor" id="a0b154e79abc1167ba4ac3539f4af6720"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">short lws_context_creation_info::max_http_header_pool</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>CONTEXT: The max number of connections with http headers that can be processed simultaneously (the corresponding memory is allocated for the lifetime of the context). If the pool is busy new incoming connections must wait for accept until one becomes free. </p>
+
+</div>
+</div>
+<a class="anchor" id="a13ffbb0d010309669611f8c4eda7d7f8"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const struct <a class="el" href="structlws__http__mount.html">lws_http_mount</a>* lws_context_creation_info::mounts</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>VHOST: optional linked list of mounts for this vhost </p>
+
+</div>
+</div>
+<a class="anchor" id="a9d3b17a25e1fbc772f21eb4959a82724"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">unsigned int lws_context_creation_info::options</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>VHOST + CONTEXT: 0, or LWS_SERVER_OPTION_... bitfields </p>
+
+</div>
+</div>
+<a class="anchor" id="a8122cfc0810bafe51edb3ba6bf9a1251"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const char* const* lws_context_creation_info::plugin_dirs</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>CONTEXT: NULL, or NULL-terminated array of directories to scan for lws protocol plugins at context creation time </p>
+
+</div>
+</div>
+<a class="anchor" id="a424a5ce268d6903e42243be94487ab85"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">int lws_context_creation_info::port</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>VHOST: Port to listen on... you can use CONTEXT_PORT_NO_LISTEN to suppress listening on any port, that's what you want if you are not running a websocket server at all but just using it as a client </p>
+
+</div>
+</div>
+<a class="anchor" id="abb90ffb3e6d6db2db20f529d61bd9122"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const struct <a class="el" href="structlws__protocols.html">lws_protocols</a>* lws_context_creation_info::protocols</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>VHOST: Array of structures listing supported protocols and a protocol- specific callback for each one. The list is ended with an entry that has a NULL callback pointer. </p>
+
+</div>
+</div>
+<a class="anchor" id="a1654d41bea6fb2f619b57e6a264b26a4"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="structlws__polarssl__context.html">SSL_CTX</a>* lws_context_creation_info::provided_client_ssl_ctx</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>CONTEXT: If non-null, swap out libwebsockets ssl implementation for the one provided by provided_ssl_ctx. Libwebsockets no longer is responsible for freeing the context if this option is selected. </p>
+
+</div>
+</div>
+<a class="anchor" id="a0e790dda6202604f73a03b6149bc12bb"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void* lws_context_creation_info::provided_client_ssl_ctx</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>dummy if ssl disabled </p>
+
+</div>
+</div>
+<a class="anchor" id="a57f88c0745adbd1d6b9b619b8de30209"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">unsigned int lws_context_creation_info::pt_serv_buf_size</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>CONTEXT: 0 = default of 4096. This buffer is used by various service related features including file serving, it defines the max chunk of file that can be sent at once. At the risk of lws having to buffer failed large sends, it can be increased to, eg, 128KiB to improve throughput. </p>
+
+</div>
+</div>
+<a class="anchor" id="a999866fcd15dbd621773436f97190458"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const struct <a class="el" href="structlws__protocol__vhost__options.html">lws_protocol_vhost_options</a>* lws_context_creation_info::pvo</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>VHOST: pointer to optional linked list of per-vhost options made accessible to protocols </p>
+
+</div>
+</div>
+<a class="anchor" id="a137a9b9de4f6a7993fed8746d551e616"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const char* lws_context_creation_info::server_string</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>CONTEXT: string used in HTTP headers to identify server software, if NULL, "libwebsockets". </p>
+
+</div>
+</div>
+<a class="anchor" id="a4f8e65c3a059d3b586fafa9ef3282c29"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const char* lws_context_creation_info::ssl_ca_filepath</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>VHOST: CA certificate filepath or NULL </p>
+
+</div>
+</div>
+<a class="anchor" id="ac62b0f0e8e402412ba5011d15c244103"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const char* lws_context_creation_info::ssl_cert_filepath</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>VHOST: If libwebsockets was compiled to use ssl, and you want to listen using SSL, set to the filepath to fetch the server cert from, otherwise NULL for unencrypted </p>
+
+</div>
+</div>
+<a class="anchor" id="a3e1516fd7fed26bfa77c0246ed26c2eb"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const char* lws_context_creation_info::ssl_cipher_list</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>VHOST: List of valid ciphers to use (eg, "RC4-MD5:RC4-SHA:AES128-SHA:AES256-SHA:HIGH:!DSS:!aNULL" or you can leave it as NULL to get "DEFAULT" </p>
+
+</div>
+</div>
+<a class="anchor" id="adb0bc0b28cd7d90ab306723d8ffa96fa"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">long lws_context_creation_info::ssl_options_clear</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>VHOST: Any bits set here will be cleared as SSL options </p>
+
+</div>
+</div>
+<a class="anchor" id="a704940261951ced6b5d8191bd8b9bb2d"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">long lws_context_creation_info::ssl_options_set</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>VHOST: Any bits set here will be set as SSL options </p>
+
+</div>
+</div>
+<a class="anchor" id="ab9ec8893e0f7843cf5d783d2f350ef14"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const char* lws_context_creation_info::ssl_private_key_filepath</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>VHOST: filepath to private key if wanting SSL mode; if this is set to NULL but sll_cert_filepath is set, the OPENSSL_CONTEXT_REQUIRES_PRIVATE_KEY callback is called to allow setting of the private key directly via openSSL library calls </p>
+
+</div>
+</div>
+<a class="anchor" id="af3fb447be15c4fcb01d3285a6678ab54"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const char* lws_context_creation_info::ssl_private_key_password</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>VHOST: NULL or the passphrase needed for the private key </p>
+
+</div>
+</div>
+<a class="anchor" id="a6cfa3d51df2def3349a5cbf0d712822d"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">unsigned int lws_context_creation_info::timeout_secs</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>VHOST: various processes involving network roundtrips in the library are protected from hanging forever by timeouts. If nonzero, this member lets you set the timeout used in seconds. Otherwise a default timeout is used. </p>
+
+</div>
+</div>
+<a class="anchor" id="ac8a75b7b259a3c3a5fbb4219a3f06c29"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const struct <a class="el" href="structlws__token__limits.html">lws_token_limits</a>* lws_context_creation_info::token_limits</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>CONTEXT: NULL or struct <a class="el" href="structlws__token__limits.html">lws_token_limits</a> pointer which is initialized with a token length limit for each possible WSI_TOKEN_ </p>
+
+</div>
+</div>
+<a class="anchor" id="ac105b4180008cb3e672d57beead8382e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">int lws_context_creation_info::uid</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>CONTEXT: user id to change to after setting listen socket, or -1. </p>
+
+</div>
+</div>
+<a class="anchor" id="a0e9d94cdfb893d777b4a4db81e7b5ac0"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void* lws_context_creation_info::user</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>CONTEXT: optional user pointer that can be recovered via the context pointer using lws_context_user </p>
+
+</div>
+</div>
+<a class="anchor" id="ad50db098a208f045f7811207d2bee4b9"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const char* lws_context_creation_info::vhost_name</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>VHOST: name of vhost, must match external DNS name used to access the site, like "warmcat.com" as it's used to match Host: header and / or SNI name for SSL. </p>
+
+</div>
+</div>
+<hr/>The documentation for this struct was generated from the following file:<ul>
+<li>lib/<a class="el" href="libwebsockets_8h_source.html">libwebsockets.h</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="structlws__context__creation__info.html">lws_context_creation_info</a></li>
+ <li class="footer">Generated by
+ <a href="http://www.doxygen.org/index.html">
+ <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.11 </li>
+ </ul>
+</div>
+</body>
+</html>
--- /dev/null
+var structlws__context__creation__info =
+[
+ [ "_unused", "structlws__context__creation__info.html#afce3b59950eca3203faa07381bbed5d7", null ],
+ [ "count_threads", "structlws__context__creation__info.html#ae52f3237e144e9ddcab5e2cf91d1e419", null ],
+ [ "ecdh_curve", "structlws__context__creation__info.html#afa5d4e7d9f86b58a1c6fac14f0a5f5f9", null ],
+ [ "extensions", "structlws__context__creation__info.html#a4a3d1155fc52f5048b481884f6fb947c", null ],
+ [ "fd_limit_per_thread", "structlws__context__creation__info.html#a45e63e24c88289e0c8352377ef4d3646", null ],
+ [ "gid", "structlws__context__creation__info.html#a9c9d22437de92c197f3cee52912b2c03", null ],
+ [ "http_proxy_address", "structlws__context__creation__info.html#aef917c0b23976a264d2474901b4f5aa3", null ],
+ [ "http_proxy_port", "structlws__context__creation__info.html#a7b59f2bdc869871e7bde232db94f5ca6", null ],
+ [ "iface", "structlws__context__creation__info.html#a75434932bb5df54665ea678eb8ac104a", null ],
+ [ "ka_interval", "structlws__context__creation__info.html#a381342a398883d6204955ff3c1849ddd", null ],
+ [ "ka_probes", "structlws__context__creation__info.html#a3baab4285c679fbe027c2504621d7410", null ],
+ [ "ka_time", "structlws__context__creation__info.html#ac583ce92b8e1c949cb6fef6bfe713d56", null ],
+ [ "keepalive_timeout", "structlws__context__creation__info.html#a81697c6b763b5ef3ee52862bc70b07d6", null ],
+ [ "log_filepath", "structlws__context__creation__info.html#ad0e95ba721f7bd2b676719f8093c23a2", null ],
+ [ "max_http_header_data", "structlws__context__creation__info.html#a0cdfd3c484689ba6f0f2cc91b38ce948", null ],
+ [ "max_http_header_data2", "structlws__context__creation__info.html#aa8d9e85e137f35fb006f2e4a53f0887a", null ],
+ [ "max_http_header_pool", "structlws__context__creation__info.html#a0b154e79abc1167ba4ac3539f4af6720", null ],
+ [ "mounts", "structlws__context__creation__info.html#a13ffbb0d010309669611f8c4eda7d7f8", null ],
+ [ "options", "structlws__context__creation__info.html#a9d3b17a25e1fbc772f21eb4959a82724", null ],
+ [ "plugin_dirs", "structlws__context__creation__info.html#a8122cfc0810bafe51edb3ba6bf9a1251", null ],
+ [ "port", "structlws__context__creation__info.html#a424a5ce268d6903e42243be94487ab85", null ],
+ [ "protocols", "structlws__context__creation__info.html#abb90ffb3e6d6db2db20f529d61bd9122", null ],
+ [ "provided_client_ssl_ctx", "structlws__context__creation__info.html#a1654d41bea6fb2f619b57e6a264b26a4", null ],
+ [ "provided_client_ssl_ctx", "structlws__context__creation__info.html#a0e790dda6202604f73a03b6149bc12bb", null ],
+ [ "pt_serv_buf_size", "structlws__context__creation__info.html#a57f88c0745adbd1d6b9b619b8de30209", null ],
+ [ "pvo", "structlws__context__creation__info.html#a999866fcd15dbd621773436f97190458", null ],
+ [ "server_string", "structlws__context__creation__info.html#a137a9b9de4f6a7993fed8746d551e616", null ],
+ [ "ssl_ca_filepath", "structlws__context__creation__info.html#a4f8e65c3a059d3b586fafa9ef3282c29", null ],
+ [ "ssl_cert_filepath", "structlws__context__creation__info.html#ac62b0f0e8e402412ba5011d15c244103", null ],
+ [ "ssl_cipher_list", "structlws__context__creation__info.html#a3e1516fd7fed26bfa77c0246ed26c2eb", null ],
+ [ "ssl_options_clear", "structlws__context__creation__info.html#adb0bc0b28cd7d90ab306723d8ffa96fa", null ],
+ [ "ssl_options_set", "structlws__context__creation__info.html#a704940261951ced6b5d8191bd8b9bb2d", null ],
+ [ "ssl_private_key_filepath", "structlws__context__creation__info.html#ab9ec8893e0f7843cf5d783d2f350ef14", null ],
+ [ "ssl_private_key_password", "structlws__context__creation__info.html#af3fb447be15c4fcb01d3285a6678ab54", null ],
+ [ "timeout_secs", "structlws__context__creation__info.html#a6cfa3d51df2def3349a5cbf0d712822d", null ],
+ [ "token_limits", "structlws__context__creation__info.html#ac8a75b7b259a3c3a5fbb4219a3f06c29", null ],
+ [ "uid", "structlws__context__creation__info.html#ac105b4180008cb3e672d57beead8382e", null ],
+ [ "user", "structlws__context__creation__info.html#a0e9d94cdfb893d777b4a4db81e7b5ac0", null ],
+ [ "vhost_name", "structlws__context__creation__info.html#ad50db098a208f045f7811207d2bee4b9", null ]
+];
\ No newline at end of file
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.11"/>
+<title>libwebsockets: lws_email Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="libwebsockets.org-logo.png"/></td>
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname">libwebsockets
+ </div>
+ <div id="projectbrief">Lightweight C library for HTML5 websockets</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.11 -->
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main Page</span></a></li>
+ <li><a href="pages.html"><span>Related Pages</span></a></li>
+ <li><a href="modules.html"><span>Modules</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Data Structures</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Data Structures</span></a></li>
+ <li><a href="classes.html"><span>Data Structure Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Data Fields</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('structlws__email.html','');});
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#pub-attribs">Data Fields</a> </div>
+ <div class="headertitle">
+<div class="title">lws_email Struct Reference<div class="ingroups"><a class="el" href="group__smtp.html">Smtp</a></div></div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h_source.html">libwebsockets.h</a>></code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:add1341456045382c183f4c763bdea6bc"><td class="memItemLeft" align="right" valign="top">void * </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__email.html#add1341456045382c183f4c763bdea6bc">data</a></td></tr>
+<tr class="separator:add1341456045382c183f4c763bdea6bc"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ab5fbf121195a8e67509c78a42cfbe168"><td class="memItemLeft" align="right" valign="top">uv_loop_t * </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__email.html#ab5fbf121195a8e67509c78a42cfbe168">loop</a></td></tr>
+<tr class="separator:ab5fbf121195a8e67509c78a42cfbe168"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a472ae23fc9fca6599e5c512bc21458d2"><td class="memItemLeft" align="right" valign="top">char </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__email.html#a472ae23fc9fca6599e5c512bc21458d2">email_smtp_ip</a> [32]</td></tr>
+<tr class="separator:a472ae23fc9fca6599e5c512bc21458d2"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a939e5d7ee0339a16de73bde71ab4d4d9"><td class="memItemLeft" align="right" valign="top">char </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__email.html#a939e5d7ee0339a16de73bde71ab4d4d9">email_helo</a> [32]</td></tr>
+<tr class="separator:a939e5d7ee0339a16de73bde71ab4d4d9"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:af7f0ae934347d81071f63a963301f9e2"><td class="memItemLeft" align="right" valign="top">char </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__email.html#af7f0ae934347d81071f63a963301f9e2">email_from</a> [100]</td></tr>
+<tr class="separator:af7f0ae934347d81071f63a963301f9e2"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a6453a8b92b3de6d2c2101af3edce685e"><td class="memItemLeft" align="right" valign="top">char </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__email.html#a6453a8b92b3de6d2c2101af3edce685e">email_to</a> [100]</td></tr>
+<tr class="separator:a6453a8b92b3de6d2c2101af3edce685e"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a7bbc1964889c984b3da723c86a210e05"><td class="memItemLeft" align="right" valign="top">unsigned int </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__email.html#a7bbc1964889c984b3da723c86a210e05">max_content_size</a></td></tr>
+<tr class="separator:a7bbc1964889c984b3da723c86a210e05"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ad8dc60353ee246d84dd59ec0591e9719"><td class="memItemLeft" align="right" valign="top">int(* </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__email.html#ad8dc60353ee246d84dd59ec0591e9719">on_next</a> )(struct <a class="el" href="structlws__email.html">lws_email</a> *email)</td></tr>
+<tr class="separator:ad8dc60353ee246d84dd59ec0591e9719"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a39ef6263d58eb40cca417c8697b227d8"><td class="memItemLeft" align="right" valign="top">int(* </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__email.html#a39ef6263d58eb40cca417c8697b227d8">on_sent</a> )(struct <a class="el" href="structlws__email.html">lws_email</a> *email)</td></tr>
+<tr class="separator:a39ef6263d58eb40cca417c8697b227d8"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a2aff78c8e04db243052aa91b4d87e987"><td class="memItemLeft" align="right" valign="top">int(* </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__email.html#a2aff78c8e04db243052aa91b4d87e987">on_get_body</a> )(struct <a class="el" href="structlws__email.html">lws_email</a> *email, char *buf, int len)</td></tr>
+<tr class="separator:a2aff78c8e04db243052aa91b4d87e987"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a77723e2f2b940b1c879ef5e1cd88c2be"><td class="memItemLeft" align="right" valign="top">uv_timer_t </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__email.html#a77723e2f2b940b1c879ef5e1cd88c2be">timeout_email</a></td></tr>
+<tr class="separator:a77723e2f2b940b1c879ef5e1cd88c2be"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ac6115d3cbef2e8bac62cc00895bf5fd3"><td class="memItemLeft" align="right" valign="top">enum <a class="el" href="group__smtp.html#ga116be79bf44f9dc2a97f46e051fe4dc0">lwsgs_smtp_states</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__email.html#ac6115d3cbef2e8bac62cc00895bf5fd3">estate</a></td></tr>
+<tr class="separator:ac6115d3cbef2e8bac62cc00895bf5fd3"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a5f53d4c5a1e34b0dcaa8787e2eabb1b3"><td class="memItemLeft" align="right" valign="top">uv_connect_t </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__email.html#a5f53d4c5a1e34b0dcaa8787e2eabb1b3">email_connect_req</a></td></tr>
+<tr class="separator:a5f53d4c5a1e34b0dcaa8787e2eabb1b3"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a01f31934166dc6d01e8a375012f8ad1e"><td class="memItemLeft" align="right" valign="top">uv_tcp_t </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__email.html#a01f31934166dc6d01e8a375012f8ad1e">email_client</a></td></tr>
+<tr class="separator:a01f31934166dc6d01e8a375012f8ad1e"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a9747ca85597788c2d118d287df47b7c1"><td class="memItemLeft" align="right" valign="top">time_t </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__email.html#a9747ca85597788c2d118d287df47b7c1">email_connect_started</a></td></tr>
+<tr class="separator:a9747ca85597788c2d118d287df47b7c1"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a8f34ec0643a817be67ef4276aeb7fb82"><td class="memItemLeft" align="right" valign="top">char </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__email.html#a8f34ec0643a817be67ef4276aeb7fb82">email_buf</a> [256]</td></tr>
+<tr class="separator:a8f34ec0643a817be67ef4276aeb7fb82"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a6fff03c5a5d369a2aa3cab0c897b1bed"><td class="memItemLeft" align="right" valign="top">char * </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__email.html#a6fff03c5a5d369a2aa3cab0c897b1bed">content</a></td></tr>
+<tr class="separator:a6fff03c5a5d369a2aa3cab0c897b1bed"><td class="memSeparator" colspan="2"> </td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>struct <a class="el" href="structlws__email.html">lws_email</a> - abstract context for performing SMTP operations </p>
+</div><h2 class="groupheader">Field Documentation</h2>
+<a class="anchor" id="a6fff03c5a5d369a2aa3cab0c897b1bed"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">char* lws_email::content</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>private </p>
+
+</div>
+</div>
+<a class="anchor" id="add1341456045382c183f4c763bdea6bc"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void* lws_email::data</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>opaque pointer set by user code and available to the callbacks </p>
+
+</div>
+</div>
+<a class="anchor" id="a8f34ec0643a817be67ef4276aeb7fb82"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">char lws_email::email_buf[256]</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>private </p>
+
+</div>
+</div>
+<a class="anchor" id="a01f31934166dc6d01e8a375012f8ad1e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">uv_tcp_t lws_email::email_client</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>private </p>
+
+</div>
+</div>
+<a class="anchor" id="a5f53d4c5a1e34b0dcaa8787e2eabb1b3"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">uv_connect_t lws_email::email_connect_req</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>private </p>
+
+</div>
+</div>
+<a class="anchor" id="a9747ca85597788c2d118d287df47b7c1"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">time_t lws_email::email_connect_started</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>private </p>
+
+</div>
+</div>
+<a class="anchor" id="af7f0ae934347d81071f63a963301f9e2"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">char lws_email::email_from[100]</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Fill before init or on_next </p>
+
+</div>
+</div>
+<a class="anchor" id="a939e5d7ee0339a16de73bde71ab4d4d9"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">char lws_email::email_helo[32]</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Fill before init, eg, "myserver.com" </p>
+
+</div>
+</div>
+<a class="anchor" id="a472ae23fc9fca6599e5c512bc21458d2"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">char lws_email::email_smtp_ip[32]</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Fill before init, eg, "127.0.0.1" </p>
+
+</div>
+</div>
+<a class="anchor" id="a6453a8b92b3de6d2c2101af3edce685e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">char lws_email::email_to[100]</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Fill before init or on_next </p>
+
+</div>
+</div>
+<a class="anchor" id="ac6115d3cbef2e8bac62cc00895bf5fd3"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">enum <a class="el" href="group__smtp.html#ga116be79bf44f9dc2a97f46e051fe4dc0">lwsgs_smtp_states</a> lws_email::estate</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>private </p>
+
+</div>
+</div>
+<a class="anchor" id="ab5fbf121195a8e67509c78a42cfbe168"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">uv_loop_t* lws_email::loop</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>the libuv loop we will work on </p>
+
+</div>
+</div>
+<a class="anchor" id="a7bbc1964889c984b3da723c86a210e05"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">unsigned int lws_email::max_content_size</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>largest possible email body size </p>
+
+</div>
+</div>
+<a class="anchor" id="a2aff78c8e04db243052aa91b4d87e987"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">int(* lws_email::on_get_body) (struct <a class="el" href="structlws__email.html">lws_email</a> *email, char *buf, int len)</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>(Fill in before calling lws_email_init) called when the body part of the queued email is about to be sent to the SMTP server. </p>
+
+</div>
+</div>
+<a class="anchor" id="ad8dc60353ee246d84dd59ec0591e9719"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">int(* lws_email::on_next) (struct <a class="el" href="structlws__email.html">lws_email</a> *email)</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>(Fill in before calling lws_email_init) called when idle, 0 = another email to send, nonzero is idle. If you return 0, all of the email_* char arrays must be set to something useful. </p>
+
+</div>
+</div>
+<a class="anchor" id="a39ef6263d58eb40cca417c8697b227d8"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">int(* lws_email::on_sent) (struct <a class="el" href="structlws__email.html">lws_email</a> *email)</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>(Fill in before calling lws_email_init) called when transfer of the email to the SMTP server was successful, your callback would remove the current email from its queue </p>
+
+</div>
+</div>
+<a class="anchor" id="a77723e2f2b940b1c879ef5e1cd88c2be"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">uv_timer_t lws_email::timeout_email</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>private </p>
+
+</div>
+</div>
+<hr/>The documentation for this struct was generated from the following file:<ul>
+<li>lib/<a class="el" href="libwebsockets_8h_source.html">libwebsockets.h</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="structlws__email.html">lws_email</a></li>
+ <li class="footer">Generated by
+ <a href="http://www.doxygen.org/index.html">
+ <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.11 </li>
+ </ul>
+</div>
+</body>
+</html>
--- /dev/null
+var structlws__email =
+[
+ [ "content", "structlws__email.html#a6fff03c5a5d369a2aa3cab0c897b1bed", null ],
+ [ "data", "structlws__email.html#add1341456045382c183f4c763bdea6bc", null ],
+ [ "email_buf", "structlws__email.html#a8f34ec0643a817be67ef4276aeb7fb82", null ],
+ [ "email_client", "structlws__email.html#a01f31934166dc6d01e8a375012f8ad1e", null ],
+ [ "email_connect_req", "structlws__email.html#a5f53d4c5a1e34b0dcaa8787e2eabb1b3", null ],
+ [ "email_connect_started", "structlws__email.html#a9747ca85597788c2d118d287df47b7c1", null ],
+ [ "email_from", "structlws__email.html#af7f0ae934347d81071f63a963301f9e2", null ],
+ [ "email_helo", "structlws__email.html#a939e5d7ee0339a16de73bde71ab4d4d9", null ],
+ [ "email_smtp_ip", "structlws__email.html#a472ae23fc9fca6599e5c512bc21458d2", null ],
+ [ "email_to", "structlws__email.html#a6453a8b92b3de6d2c2101af3edce685e", null ],
+ [ "estate", "structlws__email.html#ac6115d3cbef2e8bac62cc00895bf5fd3", null ],
+ [ "loop", "structlws__email.html#ab5fbf121195a8e67509c78a42cfbe168", null ],
+ [ "max_content_size", "structlws__email.html#a7bbc1964889c984b3da723c86a210e05", null ],
+ [ "on_get_body", "structlws__email.html#a2aff78c8e04db243052aa91b4d87e987", null ],
+ [ "on_next", "structlws__email.html#ad8dc60353ee246d84dd59ec0591e9719", null ],
+ [ "on_sent", "structlws__email.html#a39ef6263d58eb40cca417c8697b227d8", null ],
+ [ "timeout_email", "structlws__email.html#a77723e2f2b940b1c879ef5e1cd88c2be", null ]
+];
\ No newline at end of file
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.11"/>
+<title>libwebsockets: lws_ext_option_arg Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="libwebsockets.org-logo.png"/></td>
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname">libwebsockets
+ </div>
+ <div id="projectbrief">Lightweight C library for HTML5 websockets</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.11 -->
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main Page</span></a></li>
+ <li><a href="pages.html"><span>Related Pages</span></a></li>
+ <li><a href="modules.html"><span>Modules</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Data Structures</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Data Structures</span></a></li>
+ <li><a href="classes.html"><span>Data Structure Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Data Fields</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('structlws__ext__option__arg.html','');});
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#pub-attribs">Data Fields</a> </div>
+ <div class="headertitle">
+<div class="title">lws_ext_option_arg Struct Reference<div class="ingroups"><a class="el" href="group__extensions.html">Extensions</a></div></div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h_source.html">libwebsockets.h</a>></code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:a0a320c56b79271b8f059eeaad9423ac9"><td class="memItemLeft" align="right" valign="top">const char * </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__ext__option__arg.html#a0a320c56b79271b8f059eeaad9423ac9">option_name</a></td></tr>
+<tr class="separator:a0a320c56b79271b8f059eeaad9423ac9"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:af57fffcfa253dfa8d98681ac1fb1785f"><td class="memItemLeft" align="right" valign="top">int </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__ext__option__arg.html#af57fffcfa253dfa8d98681ac1fb1785f">option_index</a></td></tr>
+<tr class="separator:af57fffcfa253dfa8d98681ac1fb1785f"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a0b1f7b30c3ceaf5f1bf9d105c24568d1"><td class="memItemLeft" align="right" valign="top">const char * </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__ext__option__arg.html#a0b1f7b30c3ceaf5f1bf9d105c24568d1">start</a></td></tr>
+<tr class="separator:a0b1f7b30c3ceaf5f1bf9d105c24568d1"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:af37f0b6caa7735af51a1ac12b68d5bc5"><td class="memItemLeft" align="right" valign="top">int </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__ext__option__arg.html#af37f0b6caa7735af51a1ac12b68d5bc5">len</a></td></tr>
+<tr class="separator:af37f0b6caa7735af51a1ac12b68d5bc5"><td class="memSeparator" colspan="2"> </td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>struct <a class="el" href="structlws__ext__option__arg.html">lws_ext_option_arg</a> </p>
+</div><h2 class="groupheader">Field Documentation</h2>
+<a class="anchor" id="af37f0b6caa7735af51a1ac12b68d5bc5"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">int lws_ext_option_arg::len</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>length of value </p>
+
+</div>
+</div>
+<a class="anchor" id="af57fffcfa253dfa8d98681ac1fb1785f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">int lws_ext_option_arg::option_index</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>argument ordinal to use if option_name missing </p>
+
+</div>
+</div>
+<a class="anchor" id="a0a320c56b79271b8f059eeaad9423ac9"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const char* lws_ext_option_arg::option_name</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>may be NULL, option_index used then </p>
+
+</div>
+</div>
+<a class="anchor" id="a0b1f7b30c3ceaf5f1bf9d105c24568d1"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const char* lws_ext_option_arg::start</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>value </p>
+
+</div>
+</div>
+<hr/>The documentation for this struct was generated from the following file:<ul>
+<li>lib/<a class="el" href="libwebsockets_8h_source.html">libwebsockets.h</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="structlws__ext__option__arg.html">lws_ext_option_arg</a></li>
+ <li class="footer">Generated by
+ <a href="http://www.doxygen.org/index.html">
+ <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.11 </li>
+ </ul>
+</div>
+</body>
+</html>
--- /dev/null
+var structlws__ext__option__arg =
+[
+ [ "len", "structlws__ext__option__arg.html#af37f0b6caa7735af51a1ac12b68d5bc5", null ],
+ [ "option_index", "structlws__ext__option__arg.html#af57fffcfa253dfa8d98681ac1fb1785f", null ],
+ [ "option_name", "structlws__ext__option__arg.html#a0a320c56b79271b8f059eeaad9423ac9", null ],
+ [ "start", "structlws__ext__option__arg.html#a0b1f7b30c3ceaf5f1bf9d105c24568d1", null ]
+];
\ No newline at end of file
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.11"/>
+<title>libwebsockets: lws_ext_options Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="libwebsockets.org-logo.png"/></td>
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname">libwebsockets
+ </div>
+ <div id="projectbrief">Lightweight C library for HTML5 websockets</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.11 -->
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main Page</span></a></li>
+ <li><a href="pages.html"><span>Related Pages</span></a></li>
+ <li><a href="modules.html"><span>Modules</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Data Structures</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Data Structures</span></a></li>
+ <li><a href="classes.html"><span>Data Structure Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Data Fields</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('structlws__ext__options.html','');});
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#pub-attribs">Data Fields</a> </div>
+ <div class="headertitle">
+<div class="title">lws_ext_options Struct Reference<div class="ingroups"><a class="el" href="group__extensions.html">Extensions</a></div></div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h_source.html">libwebsockets.h</a>></code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:a1769e4a9805bbdda227821e9578ddc7e"><td class="memItemLeft" align="right" valign="top">const char * </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__ext__options.html#a1769e4a9805bbdda227821e9578ddc7e">name</a></td></tr>
+<tr class="separator:a1769e4a9805bbdda227821e9578ddc7e"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a7c4dbd62dbeba63a9d50d2306bd1cc61"><td class="memItemLeft" align="right" valign="top">enum <a class="el" href="group__extensions.html#gacc9f55936dc165257a2e1f7d47bce89e">lws_ext_options_types</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__ext__options.html#a7c4dbd62dbeba63a9d50d2306bd1cc61">type</a></td></tr>
+<tr class="separator:a7c4dbd62dbeba63a9d50d2306bd1cc61"><td class="memSeparator" colspan="2"> </td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>struct <a class="el" href="structlws__ext__options.html">lws_ext_options</a> - Option arguments to the extension. These are used in the negotiation at ws upgrade time. The helper function <a class="el" href="group__extensions.html#ga6fb3e2c3dfb9d64dc87026a4e99c128b">lws_ext_parse_options()</a> uses these to generate callbacks </p>
+</div><h2 class="groupheader">Field Documentation</h2>
+<a class="anchor" id="a1769e4a9805bbdda227821e9578ddc7e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const char* lws_ext_options::name</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Option name, eg, "server_no_context_takeover" </p>
+
+</div>
+</div>
+<a class="anchor" id="a7c4dbd62dbeba63a9d50d2306bd1cc61"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">enum <a class="el" href="group__extensions.html#gacc9f55936dc165257a2e1f7d47bce89e">lws_ext_options_types</a> lws_ext_options::type</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>What kind of args the option can take </p>
+
+</div>
+</div>
+<hr/>The documentation for this struct was generated from the following file:<ul>
+<li>lib/<a class="el" href="libwebsockets_8h_source.html">libwebsockets.h</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="structlws__ext__options.html">lws_ext_options</a></li>
+ <li class="footer">Generated by
+ <a href="http://www.doxygen.org/index.html">
+ <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.11 </li>
+ </ul>
+</div>
+</body>
+</html>
--- /dev/null
+var structlws__ext__options =
+[
+ [ "name", "structlws__ext__options.html#a1769e4a9805bbdda227821e9578ddc7e", null ],
+ [ "type", "structlws__ext__options.html#a7c4dbd62dbeba63a9d50d2306bd1cc61", null ]
+];
\ No newline at end of file
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.11"/>
+<title>libwebsockets: lws_extension Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="libwebsockets.org-logo.png"/></td>
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname">libwebsockets
+ </div>
+ <div id="projectbrief">Lightweight C library for HTML5 websockets</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.11 -->
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main Page</span></a></li>
+ <li><a href="pages.html"><span>Related Pages</span></a></li>
+ <li><a href="modules.html"><span>Modules</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Data Structures</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Data Structures</span></a></li>
+ <li><a href="classes.html"><span>Data Structure Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Data Fields</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('structlws__extension.html','');});
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#pub-attribs">Data Fields</a> </div>
+ <div class="headertitle">
+<div class="title">lws_extension Struct Reference<div class="ingroups"><a class="el" href="group__extensions.html">Extensions</a></div></div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h_source.html">libwebsockets.h</a>></code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:a1e5018c883d85176f5c2152176843f9e"><td class="memItemLeft" align="right" valign="top">const char * </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__extension.html#a1e5018c883d85176f5c2152176843f9e">name</a></td></tr>
+<tr class="separator:a1e5018c883d85176f5c2152176843f9e"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:afa21f3b3c8c2c9212a276c52b680c3af"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__extensions.html#gaae7169b2cd346b34fa33d0250db2afd0">lws_extension_callback_function</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__extension.html#afa21f3b3c8c2c9212a276c52b680c3af">callback</a></td></tr>
+<tr class="separator:afa21f3b3c8c2c9212a276c52b680c3af"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a36b06c213aedb02bf9a402651751855b"><td class="memItemLeft" align="right" valign="top">const char * </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__extension.html#a36b06c213aedb02bf9a402651751855b">client_offer</a></td></tr>
+<tr class="separator:a36b06c213aedb02bf9a402651751855b"><td class="memSeparator" colspan="2"> </td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>struct <a class="el" href="structlws__extension.html">lws_extension</a> - An extension we support </p>
+</div><h2 class="groupheader">Field Documentation</h2>
+<a class="anchor" id="afa21f3b3c8c2c9212a276c52b680c3af"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="group__extensions.html#gaae7169b2cd346b34fa33d0250db2afd0">lws_extension_callback_function</a>* lws_extension::callback</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Service callback </p>
+
+</div>
+</div>
+<a class="anchor" id="a36b06c213aedb02bf9a402651751855b"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const char* lws_extension::client_offer</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>String containing exts and options client offers </p>
+
+</div>
+</div>
+<a class="anchor" id="a1e5018c883d85176f5c2152176843f9e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const char* lws_extension::name</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Formal extension name, eg, "permessage-deflate" </p>
+
+</div>
+</div>
+<hr/>The documentation for this struct was generated from the following file:<ul>
+<li>lib/<a class="el" href="libwebsockets_8h_source.html">libwebsockets.h</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="structlws__extension.html">lws_extension</a></li>
+ <li class="footer">Generated by
+ <a href="http://www.doxygen.org/index.html">
+ <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.11 </li>
+ </ul>
+</div>
+</body>
+</html>
--- /dev/null
+var structlws__extension =
+[
+ [ "callback", "structlws__extension.html#afa21f3b3c8c2c9212a276c52b680c3af", null ],
+ [ "client_offer", "structlws__extension.html#a36b06c213aedb02bf9a402651751855b", null ],
+ [ "name", "structlws__extension.html#a1e5018c883d85176f5c2152176843f9e", null ]
+];
\ No newline at end of file
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.11"/>
+<title>libwebsockets: lws_gs_event_args Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="libwebsockets.org-logo.png"/></td>
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname">libwebsockets
+ </div>
+ <div id="projectbrief">Lightweight C library for HTML5 websockets</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.11 -->
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main Page</span></a></li>
+ <li><a href="pages.html"><span>Related Pages</span></a></li>
+ <li><a href="modules.html"><span>Modules</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Data Structures</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Data Structures</span></a></li>
+ <li><a href="classes.html"><span>Data Structure Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Data Fields</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('structlws__gs__event__args.html','');});
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#pub-attribs">Data Fields</a> </div>
+ <div class="headertitle">
+<div class="title">lws_gs_event_args Struct Reference<div class="ingroups"><a class="el" href="group__Protocols-and-Plugins.html">Protocols and Plugins</a> » <a class="el" href="group__generic-sessions.html">plugin: generic-sessions</a></div></div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h_source.html">libwebsockets.h</a>></code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:a477274f8ca22ba7411b9285b9dc8dd06"><td class="memItemLeft" align="right" valign="top">enum <a class="el" href="group__generic-sessions.html#gaa93946b3d921072209d5cd8cdfa5332e">lws_gs_event</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__gs__event__args.html#a477274f8ca22ba7411b9285b9dc8dd06">event</a></td></tr>
+<tr class="separator:a477274f8ca22ba7411b9285b9dc8dd06"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a2bec693d8a43730d487004a44326178b"><td class="memItemLeft" align="right" valign="top">const char * </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__gs__event__args.html#a2bec693d8a43730d487004a44326178b">username</a></td></tr>
+<tr class="separator:a2bec693d8a43730d487004a44326178b"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:acd17e4f9f91f7f9a8f0fbf0744a3a463"><td class="memItemLeft" align="right" valign="top">const char * </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__gs__event__args.html#acd17e4f9f91f7f9a8f0fbf0744a3a463">email</a></td></tr>
+<tr class="separator:acd17e4f9f91f7f9a8f0fbf0744a3a463"><td class="memSeparator" colspan="2"> </td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>struct <a class="el" href="structlws__gs__event__args.html">lws_gs_event_args</a> </p>
+</div><h2 class="groupheader">Field Documentation</h2>
+<a class="anchor" id="acd17e4f9f91f7f9a8f0fbf0744a3a463"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const char* lws_gs_event_args::email</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>the email address of that user </p>
+
+</div>
+</div>
+<a class="anchor" id="a477274f8ca22ba7411b9285b9dc8dd06"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">enum <a class="el" href="group__generic-sessions.html#gaa93946b3d921072209d5cd8cdfa5332e">lws_gs_event</a> lws_gs_event_args::event</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>which event happened </p>
+
+</div>
+</div>
+<a class="anchor" id="a2bec693d8a43730d487004a44326178b"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const char* lws_gs_event_args::username</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>which username the event happened to </p>
+
+</div>
+</div>
+<hr/>The documentation for this struct was generated from the following file:<ul>
+<li>lib/<a class="el" href="libwebsockets_8h_source.html">libwebsockets.h</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="structlws__gs__event__args.html">lws_gs_event_args</a></li>
+ <li class="footer">Generated by
+ <a href="http://www.doxygen.org/index.html">
+ <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.11 </li>
+ </ul>
+</div>
+</body>
+</html>
--- /dev/null
+var structlws__gs__event__args =
+[
+ [ "email", "structlws__gs__event__args.html#acd17e4f9f91f7f9a8f0fbf0744a3a463", null ],
+ [ "event", "structlws__gs__event__args.html#a477274f8ca22ba7411b9285b9dc8dd06", null ],
+ [ "username", "structlws__gs__event__args.html#a2bec693d8a43730d487004a44326178b", null ]
+];
\ No newline at end of file
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.11"/>
+<title>libwebsockets: lws_http_mount Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="libwebsockets.org-logo.png"/></td>
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname">libwebsockets
+ </div>
+ <div id="projectbrief">Lightweight C library for HTML5 websockets</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.11 -->
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main Page</span></a></li>
+ <li><a href="pages.html"><span>Related Pages</span></a></li>
+ <li><a href="modules.html"><span>Modules</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Data Structures</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Data Structures</span></a></li>
+ <li><a href="classes.html"><span>Data Structure Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Data Fields</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('structlws__http__mount.html','');});
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#pub-attribs">Data Fields</a> </div>
+ <div class="headertitle">
+<div class="title">lws_http_mount Struct Reference<div class="ingroups"><a class="el" href="group__context-and-vhost.html">Context-and-vhost</a> » <a class="el" href="group__vhost-mounts.html">Vhost mounts and options</a></div></div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h_source.html">libwebsockets.h</a>></code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:ad878546ae1c399bbca7d7f8a0baf973d"><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structlws__http__mount.html">lws_http_mount</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__http__mount.html#ad878546ae1c399bbca7d7f8a0baf973d">mount_next</a></td></tr>
+<tr class="separator:ad878546ae1c399bbca7d7f8a0baf973d"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:aa2391bfcada0b7a290b3c6651f64586c"><td class="memItemLeft" align="right" valign="top">const char * </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__http__mount.html#aa2391bfcada0b7a290b3c6651f64586c">mountpoint</a></td></tr>
+<tr class="separator:aa2391bfcada0b7a290b3c6651f64586c"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a21d86fd6043ec00e121ababbc29af39a"><td class="memItemLeft" align="right" valign="top">const char * </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__http__mount.html#a21d86fd6043ec00e121ababbc29af39a">origin</a></td></tr>
+<tr class="separator:a21d86fd6043ec00e121ababbc29af39a"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ae90d1efe7178199fad39de2926902ee4"><td class="memItemLeft" align="right" valign="top">const char * </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__http__mount.html#ae90d1efe7178199fad39de2926902ee4">def</a></td></tr>
+<tr class="separator:ae90d1efe7178199fad39de2926902ee4"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a05347d92c3d379809564bd4f3eab259b"><td class="memItemLeft" align="right" valign="top">const char * </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__http__mount.html#a05347d92c3d379809564bd4f3eab259b">protocol</a></td></tr>
+<tr class="separator:a05347d92c3d379809564bd4f3eab259b"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ae7b5c0f4c5408061e6ea3a8d281f45af"><td class="memItemLeft" align="right" valign="top">const struct <a class="el" href="structlws__protocol__vhost__options.html">lws_protocol_vhost_options</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__http__mount.html#ae7b5c0f4c5408061e6ea3a8d281f45af">cgienv</a></td></tr>
+<tr class="separator:ae7b5c0f4c5408061e6ea3a8d281f45af"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a4437423df85ee3dbcae0e15974c89ec7"><td class="memItemLeft" align="right" valign="top">const struct <a class="el" href="structlws__protocol__vhost__options.html">lws_protocol_vhost_options</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__http__mount.html#a4437423df85ee3dbcae0e15974c89ec7">extra_mimetypes</a></td></tr>
+<tr class="separator:a4437423df85ee3dbcae0e15974c89ec7"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a11ea62b952710d59733dbcf9794a5773"><td class="memItemLeft" align="right" valign="top">const struct <a class="el" href="structlws__protocol__vhost__options.html">lws_protocol_vhost_options</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__http__mount.html#a11ea62b952710d59733dbcf9794a5773">interpret</a></td></tr>
+<tr class="separator:a11ea62b952710d59733dbcf9794a5773"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a4a7239d6d4c03986e6e1a72abb6c83aa"><td class="memItemLeft" align="right" valign="top">int </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__http__mount.html#a4a7239d6d4c03986e6e1a72abb6c83aa">cgi_timeout</a></td></tr>
+<tr class="separator:a4a7239d6d4c03986e6e1a72abb6c83aa"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a4283e30ea89d27ae7d061ad760d1d146"><td class="memItemLeft" align="right" valign="top">int </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__http__mount.html#a4283e30ea89d27ae7d061ad760d1d146">cache_max_age</a></td></tr>
+<tr class="separator:a4283e30ea89d27ae7d061ad760d1d146"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a614364c770b0bd4db464ad65cddab477"><td class="memItemLeft" align="right" valign="top">unsigned int </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__http__mount.html#a614364c770b0bd4db464ad65cddab477">auth_mask</a></td></tr>
+<tr class="separator:a614364c770b0bd4db464ad65cddab477"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a8316dd183ffbef50419a5a4968d35d84"><td class="memItemLeft" align="right" valign="top">unsigned int </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__http__mount.html#a8316dd183ffbef50419a5a4968d35d84">cache_reusable</a>:1</td></tr>
+<tr class="separator:a8316dd183ffbef50419a5a4968d35d84"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ae137203040c6153694bd88a708da5395"><td class="memItemLeft" align="right" valign="top">unsigned int </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__http__mount.html#ae137203040c6153694bd88a708da5395">cache_revalidate</a>:1</td></tr>
+<tr class="separator:ae137203040c6153694bd88a708da5395"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:aabec1a326780aafe11b977000983be0c"><td class="memItemLeft" align="right" valign="top">unsigned int </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__http__mount.html#aabec1a326780aafe11b977000983be0c">cache_intermediaries</a>:1</td></tr>
+<tr class="separator:aabec1a326780aafe11b977000983be0c"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a6a9b1492a0b9749e39bd19932717a0b7"><td class="memItemLeft" align="right" valign="top">unsigned char </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__http__mount.html#a6a9b1492a0b9749e39bd19932717a0b7">origin_protocol</a></td></tr>
+<tr class="separator:a6a9b1492a0b9749e39bd19932717a0b7"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ac8489b60b8f969eb19c9abbdeac90743"><td class="memItemLeft" align="right" valign="top">unsigned char </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__http__mount.html#ac8489b60b8f969eb19c9abbdeac90743">mountpoint_len</a></td></tr>
+<tr class="separator:ac8489b60b8f969eb19c9abbdeac90743"><td class="memSeparator" colspan="2"> </td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>struct <a class="el" href="structlws__http__mount.html">lws_http_mount</a></p>
+<p>arguments for mounting something in a vhost's url namespace </p>
+</div><h2 class="groupheader">Field Documentation</h2>
+<a class="anchor" id="a614364c770b0bd4db464ad65cddab477"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">unsigned int lws_http_mount::auth_mask</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>bits set here must be set for authorized client session </p>
+
+</div>
+</div>
+<a class="anchor" id="aabec1a326780aafe11b977000983be0c"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">unsigned int lws_http_mount::cache_intermediaries</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>set if intermediaries are allowed to cache </p>
+
+</div>
+</div>
+<a class="anchor" id="a4283e30ea89d27ae7d061ad760d1d146"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">int lws_http_mount::cache_max_age</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>max-age for reuse of client cache of files, seconds </p>
+
+</div>
+</div>
+<a class="anchor" id="a8316dd183ffbef50419a5a4968d35d84"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">unsigned int lws_http_mount::cache_reusable</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>set if client cache may reuse this </p>
+
+</div>
+</div>
+<a class="anchor" id="ae137203040c6153694bd88a708da5395"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">unsigned int lws_http_mount::cache_revalidate</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>set if client cache should revalidate on use </p>
+
+</div>
+</div>
+<a class="anchor" id="a4a7239d6d4c03986e6e1a72abb6c83aa"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">int lws_http_mount::cgi_timeout</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>seconds cgi is allowed to live, if cgi://mount type </p>
+
+</div>
+</div>
+<a class="anchor" id="ae7b5c0f4c5408061e6ea3a8d281f45af"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const struct <a class="el" href="structlws__protocol__vhost__options.html">lws_protocol_vhost_options</a>* lws_http_mount::cgienv</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>optional linked-list of cgi options. These are created as environment variables for the cgi process </p>
+
+</div>
+</div>
+<a class="anchor" id="ae90d1efe7178199fad39de2926902ee4"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const char* lws_http_mount::def</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>default target, eg, "index.html" </p>
+
+</div>
+</div>
+<a class="anchor" id="a4437423df85ee3dbcae0e15974c89ec7"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const struct <a class="el" href="structlws__protocol__vhost__options.html">lws_protocol_vhost_options</a>* lws_http_mount::extra_mimetypes</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>optional linked-list of mimetype mappings </p>
+
+</div>
+</div>
+<a class="anchor" id="a11ea62b952710d59733dbcf9794a5773"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const struct <a class="el" href="structlws__protocol__vhost__options.html">lws_protocol_vhost_options</a>* lws_http_mount::interpret</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>optional linked-list of files to be interpreted </p>
+
+</div>
+</div>
+<a class="anchor" id="ad878546ae1c399bbca7d7f8a0baf973d"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">struct <a class="el" href="structlws__http__mount.html">lws_http_mount</a>* lws_http_mount::mount_next</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>pointer to next struct <a class="el" href="structlws__http__mount.html">lws_http_mount</a> </p>
+
+</div>
+</div>
+<a class="anchor" id="aa2391bfcada0b7a290b3c6651f64586c"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const char* lws_http_mount::mountpoint</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>mountpoint in http pathspace, eg, "/" </p>
+
+</div>
+</div>
+<a class="anchor" id="ac8489b60b8f969eb19c9abbdeac90743"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">unsigned char lws_http_mount::mountpoint_len</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>length of mountpoint string </p>
+
+</div>
+</div>
+<a class="anchor" id="a21d86fd6043ec00e121ababbc29af39a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const char* lws_http_mount::origin</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>path to be mounted, eg, "/var/www/warmcat.com" </p>
+
+</div>
+</div>
+<a class="anchor" id="a6a9b1492a0b9749e39bd19932717a0b7"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">unsigned char lws_http_mount::origin_protocol</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>one of enum lws_mount_protocols </p>
+
+</div>
+</div>
+<a class="anchor" id="a05347d92c3d379809564bd4f3eab259b"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const char* lws_http_mount::protocol</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>"protocol-name" to handle mount </p>
+
+</div>
+</div>
+<hr/>The documentation for this struct was generated from the following file:<ul>
+<li>lib/<a class="el" href="libwebsockets_8h_source.html">libwebsockets.h</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="structlws__http__mount.html">lws_http_mount</a></li>
+ <li class="footer">Generated by
+ <a href="http://www.doxygen.org/index.html">
+ <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.11 </li>
+ </ul>
+</div>
+</body>
+</html>
--- /dev/null
+var structlws__http__mount =
+[
+ [ "auth_mask", "structlws__http__mount.html#a614364c770b0bd4db464ad65cddab477", null ],
+ [ "cache_intermediaries", "structlws__http__mount.html#aabec1a326780aafe11b977000983be0c", null ],
+ [ "cache_max_age", "structlws__http__mount.html#a4283e30ea89d27ae7d061ad760d1d146", null ],
+ [ "cache_reusable", "structlws__http__mount.html#a8316dd183ffbef50419a5a4968d35d84", null ],
+ [ "cache_revalidate", "structlws__http__mount.html#ae137203040c6153694bd88a708da5395", null ],
+ [ "cgi_timeout", "structlws__http__mount.html#a4a7239d6d4c03986e6e1a72abb6c83aa", null ],
+ [ "cgienv", "structlws__http__mount.html#ae7b5c0f4c5408061e6ea3a8d281f45af", null ],
+ [ "def", "structlws__http__mount.html#ae90d1efe7178199fad39de2926902ee4", null ],
+ [ "extra_mimetypes", "structlws__http__mount.html#a4437423df85ee3dbcae0e15974c89ec7", null ],
+ [ "interpret", "structlws__http__mount.html#a11ea62b952710d59733dbcf9794a5773", null ],
+ [ "mount_next", "structlws__http__mount.html#ad878546ae1c399bbca7d7f8a0baf973d", null ],
+ [ "mountpoint", "structlws__http__mount.html#aa2391bfcada0b7a290b3c6651f64586c", null ],
+ [ "mountpoint_len", "structlws__http__mount.html#ac8489b60b8f969eb19c9abbdeac90743", null ],
+ [ "origin", "structlws__http__mount.html#a21d86fd6043ec00e121ababbc29af39a", null ],
+ [ "origin_protocol", "structlws__http__mount.html#a6a9b1492a0b9749e39bd19932717a0b7", null ],
+ [ "protocol", "structlws__http__mount.html#a05347d92c3d379809564bd4f3eab259b", null ]
+];
\ No newline at end of file
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.11"/>
+<title>libwebsockets: lws_plat_file_ops Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="libwebsockets.org-logo.png"/></td>
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname">libwebsockets
+ </div>
+ <div id="projectbrief">Lightweight C library for HTML5 websockets</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.11 -->
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main Page</span></a></li>
+ <li><a href="pages.html"><span>Related Pages</span></a></li>
+ <li><a href="modules.html"><span>Modules</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Data Structures</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Data Structures</span></a></li>
+ <li><a href="classes.html"><span>Data Structure Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Data Fields</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('structlws__plat__file__ops.html','');});
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#pub-attribs">Data Fields</a> </div>
+ <div class="headertitle">
+<div class="title">lws_plat_file_ops Struct Reference<div class="ingroups"><a class="el" href="group__fops.html">file operation wrapping</a></div></div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h_source.html">libwebsockets.h</a>></code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:ad37a97abc68d0af967cef874f4d8df32"><td class="memItemLeft" align="right" valign="top">lws_filefd_type(* </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__plat__file__ops.html#ad37a97abc68d0af967cef874f4d8df32">open</a> )(struct lws *wsi, const char *filename, unsigned long *filelen, int flags)</td></tr>
+<tr class="separator:ad37a97abc68d0af967cef874f4d8df32"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a034ec96f2fbaf52b4aa3e82d20795f7b"><td class="memItemLeft" align="right" valign="top">int(* </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__plat__file__ops.html#a034ec96f2fbaf52b4aa3e82d20795f7b">close</a> )(struct lws *wsi, lws_filefd_type fd)</td></tr>
+<tr class="separator:a034ec96f2fbaf52b4aa3e82d20795f7b"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:abfcda19b003dcc13c61ff9e2bb4ff869"><td class="memItemLeft" align="right" valign="top">unsigned long(* </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__plat__file__ops.html#abfcda19b003dcc13c61ff9e2bb4ff869">seek_cur</a> )(struct lws *wsi, lws_filefd_type fd, long offset_from_cur_pos)</td></tr>
+<tr class="separator:abfcda19b003dcc13c61ff9e2bb4ff869"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a01f483807a9862736b17ba9ed5110c40"><td class="memItemLeft" align="right" valign="top">int(* </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__plat__file__ops.html#a01f483807a9862736b17ba9ed5110c40">read</a> )(struct lws *wsi, lws_filefd_type fd, unsigned long *amount, unsigned char *buf, unsigned long len)</td></tr>
+<tr class="separator:a01f483807a9862736b17ba9ed5110c40"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a1fae8330ee94649a3551e31a30809793"><td class="memItemLeft" align="right" valign="top">int(* </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__plat__file__ops.html#a1fae8330ee94649a3551e31a30809793">write</a> )(struct lws *wsi, lws_filefd_type fd, unsigned long *amount, unsigned char *buf, unsigned long len)</td></tr>
+<tr class="separator:a1fae8330ee94649a3551e31a30809793"><td class="memSeparator" colspan="2"> </td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>struct <a class="el" href="structlws__plat__file__ops.html">lws_plat_file_ops</a> - Platform-specific file operations</p>
+<p>These provide platform-agnostic ways to deal with filesystem access in the library and in the user code. </p>
+</div><h2 class="groupheader">Field Documentation</h2>
+<a class="anchor" id="a034ec96f2fbaf52b4aa3e82d20795f7b"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">int(* lws_plat_file_ops::close) (struct lws *wsi, lws_filefd_type fd)</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>close file </p>
+
+</div>
+</div>
+<a class="anchor" id="ad37a97abc68d0af967cef874f4d8df32"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">lws_filefd_type(* lws_plat_file_ops::open) (struct lws *wsi, const char *filename, unsigned long *filelen, int flags)</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Open file (always binary access if plat supports it) filelen is filled on exit to be the length of the file flags should be set to O_RDONLY or O_RDWR </p>
+
+</div>
+</div>
+<a class="anchor" id="a01f483807a9862736b17ba9ed5110c40"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">int(* lws_plat_file_ops::read) (struct lws *wsi, lws_filefd_type fd, unsigned long *amount, unsigned char *buf, unsigned long len)</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Read from file, on exit *amount is set to amount actually read </p>
+
+</div>
+</div>
+<a class="anchor" id="abfcda19b003dcc13c61ff9e2bb4ff869"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">unsigned long(* lws_plat_file_ops::seek_cur) (struct lws *wsi, lws_filefd_type fd, long offset_from_cur_pos)</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>seek from current position </p>
+
+</div>
+</div>
+<a class="anchor" id="a1fae8330ee94649a3551e31a30809793"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">int(* lws_plat_file_ops::write) (struct lws *wsi, lws_filefd_type fd, unsigned long *amount, unsigned char *buf, unsigned long len)</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Write to file, on exit *amount is set to amount actually written </p>
+
+</div>
+</div>
+<hr/>The documentation for this struct was generated from the following file:<ul>
+<li>lib/<a class="el" href="libwebsockets_8h_source.html">libwebsockets.h</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="structlws__plat__file__ops.html">lws_plat_file_ops</a></li>
+ <li class="footer">Generated by
+ <a href="http://www.doxygen.org/index.html">
+ <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.11 </li>
+ </ul>
+</div>
+</body>
+</html>
--- /dev/null
+var structlws__plat__file__ops =
+[
+ [ "close", "structlws__plat__file__ops.html#a034ec96f2fbaf52b4aa3e82d20795f7b", null ],
+ [ "open", "structlws__plat__file__ops.html#ad37a97abc68d0af967cef874f4d8df32", null ],
+ [ "read", "structlws__plat__file__ops.html#a01f483807a9862736b17ba9ed5110c40", null ],
+ [ "seek_cur", "structlws__plat__file__ops.html#abfcda19b003dcc13c61ff9e2bb4ff869", null ],
+ [ "write", "structlws__plat__file__ops.html#a1fae8330ee94649a3551e31a30809793", null ]
+];
\ No newline at end of file
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.11"/>
+<title>libwebsockets: lws_plugin Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="libwebsockets.org-logo.png"/></td>
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname">libwebsockets
+ </div>
+ <div id="projectbrief">Lightweight C library for HTML5 websockets</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.11 -->
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main Page</span></a></li>
+ <li><a href="pages.html"><span>Related Pages</span></a></li>
+ <li><a href="modules.html"><span>Modules</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Data Structures</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Data Structures</span></a></li>
+ <li><a href="classes.html"><span>Data Structure Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Data Fields</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('structlws__plugin.html','');});
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#pub-attribs">Data Fields</a> </div>
+ <div class="headertitle">
+<div class="title">lws_plugin Struct Reference<div class="ingroups"><a class="el" href="group__Protocols-and-Plugins.html">Protocols and Plugins</a></div></div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h_source.html">libwebsockets.h</a>></code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:a65dffd68fd267ce17b988790d1d35f22"><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structlws__plugin.html">lws_plugin</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__plugin.html#a65dffd68fd267ce17b988790d1d35f22">list</a></td></tr>
+<tr class="separator:a65dffd68fd267ce17b988790d1d35f22"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:af9e1042dc1de5b9d202c2f5fd1834330"><td class="memItemLeft" align="right" valign="top">uv_lib_t </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__plugin.html#af9e1042dc1de5b9d202c2f5fd1834330">lib</a></td></tr>
+<tr class="separator:af9e1042dc1de5b9d202c2f5fd1834330"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a4ef37a43653715b6c69cbf8a7be747f4"><td class="memItemLeft" align="right" valign="top">void * </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__plugin.html#a4ef37a43653715b6c69cbf8a7be747f4">l</a></td></tr>
+<tr class="separator:a4ef37a43653715b6c69cbf8a7be747f4"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:af4ac8fcb79e10e0c2d960e1804d98105"><td class="memItemLeft" align="right" valign="top">char </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__plugin.html#af4ac8fcb79e10e0c2d960e1804d98105">name</a> [64]</td></tr>
+<tr class="separator:af4ac8fcb79e10e0c2d960e1804d98105"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ac7f1fdfe8cf8a21f8ee9720c21934a3f"><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structlws__plugin__capability.html">lws_plugin_capability</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__plugin.html#ac7f1fdfe8cf8a21f8ee9720c21934a3f">caps</a></td></tr>
+<tr class="separator:ac7f1fdfe8cf8a21f8ee9720c21934a3f"><td class="memSeparator" colspan="2"> </td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>struct <a class="el" href="structlws__plugin.html">lws_plugin</a> </p>
+</div><h2 class="groupheader">Field Documentation</h2>
+<a class="anchor" id="ac7f1fdfe8cf8a21f8ee9720c21934a3f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">struct <a class="el" href="structlws__plugin__capability.html">lws_plugin_capability</a> lws_plugin::caps</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>plugin capabilities </p>
+
+</div>
+</div>
+<a class="anchor" id="a4ef37a43653715b6c69cbf8a7be747f4"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void* lws_plugin::l</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>so we can compile on ancient libuv </p>
+
+</div>
+</div>
+<a class="anchor" id="af9e1042dc1de5b9d202c2f5fd1834330"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">uv_lib_t lws_plugin::lib</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>shared library pointer </p>
+
+</div>
+</div>
+<a class="anchor" id="a65dffd68fd267ce17b988790d1d35f22"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">struct <a class="el" href="structlws__plugin.html">lws_plugin</a>* lws_plugin::list</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>linked list </p>
+
+</div>
+</div>
+<a class="anchor" id="af4ac8fcb79e10e0c2d960e1804d98105"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">char lws_plugin::name[64]</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>name of the plugin </p>
+
+</div>
+</div>
+<hr/>The documentation for this struct was generated from the following file:<ul>
+<li>lib/<a class="el" href="libwebsockets_8h_source.html">libwebsockets.h</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="structlws__plugin.html">lws_plugin</a></li>
+ <li class="footer">Generated by
+ <a href="http://www.doxygen.org/index.html">
+ <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.11 </li>
+ </ul>
+</div>
+</body>
+</html>
--- /dev/null
+var structlws__plugin =
+[
+ [ "caps", "structlws__plugin.html#ac7f1fdfe8cf8a21f8ee9720c21934a3f", null ],
+ [ "l", "structlws__plugin.html#a4ef37a43653715b6c69cbf8a7be747f4", null ],
+ [ "lib", "structlws__plugin.html#af9e1042dc1de5b9d202c2f5fd1834330", null ],
+ [ "list", "structlws__plugin.html#a65dffd68fd267ce17b988790d1d35f22", null ],
+ [ "name", "structlws__plugin.html#af4ac8fcb79e10e0c2d960e1804d98105", null ]
+];
\ No newline at end of file
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.11"/>
+<title>libwebsockets: lws_plugin_capability Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="libwebsockets.org-logo.png"/></td>
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname">libwebsockets
+ </div>
+ <div id="projectbrief">Lightweight C library for HTML5 websockets</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.11 -->
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main Page</span></a></li>
+ <li><a href="pages.html"><span>Related Pages</span></a></li>
+ <li><a href="modules.html"><span>Modules</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Data Structures</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Data Structures</span></a></li>
+ <li><a href="classes.html"><span>Data Structure Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Data Fields</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('structlws__plugin__capability.html','');});
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#pub-attribs">Data Fields</a> </div>
+ <div class="headertitle">
+<div class="title">lws_plugin_capability Struct Reference<div class="ingroups"><a class="el" href="group__Protocols-and-Plugins.html">Protocols and Plugins</a></div></div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h_source.html">libwebsockets.h</a>></code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:a523c7cde6f15bba345f56493dcf6b32a"><td class="memItemLeft" align="right" valign="top">unsigned int </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__plugin__capability.html#a523c7cde6f15bba345f56493dcf6b32a">api_magic</a></td></tr>
+<tr class="separator:a523c7cde6f15bba345f56493dcf6b32a"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a6a4d9d01e770f378ddadc77b37522033"><td class="memItemLeft" align="right" valign="top">const struct <a class="el" href="structlws__protocols.html">lws_protocols</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__plugin__capability.html#a6a4d9d01e770f378ddadc77b37522033">protocols</a></td></tr>
+<tr class="separator:a6a4d9d01e770f378ddadc77b37522033"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ae38f7cf1246b9ca3af3cbf9d46b7090f"><td class="memItemLeft" align="right" valign="top">int </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__plugin__capability.html#ae38f7cf1246b9ca3af3cbf9d46b7090f">count_protocols</a></td></tr>
+<tr class="separator:ae38f7cf1246b9ca3af3cbf9d46b7090f"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a7936f0eb93d79dea76b903d0f8a5f623"><td class="memItemLeft" align="right" valign="top">const struct <a class="el" href="structlws__extension.html">lws_extension</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__plugin__capability.html#a7936f0eb93d79dea76b903d0f8a5f623">extensions</a></td></tr>
+<tr class="separator:a7936f0eb93d79dea76b903d0f8a5f623"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:abcf51db969522fdda9aaf902e65739d3"><td class="memItemLeft" align="right" valign="top">int </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__plugin__capability.html#abcf51db969522fdda9aaf902e65739d3">count_extensions</a></td></tr>
+<tr class="separator:abcf51db969522fdda9aaf902e65739d3"><td class="memSeparator" colspan="2"> </td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>struct <a class="el" href="structlws__plugin__capability.html">lws_plugin_capability</a> - how a plugin introduces itself to lws </p>
+</div><h2 class="groupheader">Field Documentation</h2>
+<a class="anchor" id="a523c7cde6f15bba345f56493dcf6b32a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">unsigned int lws_plugin_capability::api_magic</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>caller fills this in, plugin fills rest </p>
+
+</div>
+</div>
+<a class="anchor" id="abcf51db969522fdda9aaf902e65739d3"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">int lws_plugin_capability::count_extensions</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>how many extensions </p>
+
+</div>
+</div>
+<a class="anchor" id="ae38f7cf1246b9ca3af3cbf9d46b7090f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">int lws_plugin_capability::count_protocols</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>how many protocols </p>
+
+</div>
+</div>
+<a class="anchor" id="a7936f0eb93d79dea76b903d0f8a5f623"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const struct <a class="el" href="structlws__extension.html">lws_extension</a>* lws_plugin_capability::extensions</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>array of extensions provided by plugin </p>
+
+</div>
+</div>
+<a class="anchor" id="a6a4d9d01e770f378ddadc77b37522033"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const struct <a class="el" href="structlws__protocols.html">lws_protocols</a>* lws_plugin_capability::protocols</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>array of supported protocols provided by plugin </p>
+
+</div>
+</div>
+<hr/>The documentation for this struct was generated from the following file:<ul>
+<li>lib/<a class="el" href="libwebsockets_8h_source.html">libwebsockets.h</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="structlws__plugin__capability.html">lws_plugin_capability</a></li>
+ <li class="footer">Generated by
+ <a href="http://www.doxygen.org/index.html">
+ <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.11 </li>
+ </ul>
+</div>
+</body>
+</html>
--- /dev/null
+var structlws__plugin__capability =
+[
+ [ "api_magic", "structlws__plugin__capability.html#a523c7cde6f15bba345f56493dcf6b32a", null ],
+ [ "count_extensions", "structlws__plugin__capability.html#abcf51db969522fdda9aaf902e65739d3", null ],
+ [ "count_protocols", "structlws__plugin__capability.html#ae38f7cf1246b9ca3af3cbf9d46b7090f", null ],
+ [ "extensions", "structlws__plugin__capability.html#a7936f0eb93d79dea76b903d0f8a5f623", null ],
+ [ "protocols", "structlws__plugin__capability.html#a6a4d9d01e770f378ddadc77b37522033", null ]
+];
\ No newline at end of file
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.11"/>
+<title>libwebsockets: lws_polarssl_context Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="libwebsockets.org-logo.png"/></td>
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname">libwebsockets
+ </div>
+ <div id="projectbrief">Lightweight C library for HTML5 websockets</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.11 -->
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main Page</span></a></li>
+ <li><a href="pages.html"><span>Related Pages</span></a></li>
+ <li><a href="modules.html"><span>Modules</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Data Structures</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Data Structures</span></a></li>
+ <li><a href="classes.html"><span>Data Structure Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Data Fields</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('structlws__polarssl__context.html','');});
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#pub-attribs">Data Fields</a> </div>
+ <div class="headertitle">
+<div class="title">lws_polarssl_context Struct Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:a1872f2ea24878d807ae20ca8513674af"><td class="memItemLeft" align="right" valign="top">x509_crt </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__polarssl__context.html#a1872f2ea24878d807ae20ca8513674af">ca</a></td></tr>
+<tr class="separator:a1872f2ea24878d807ae20ca8513674af"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ae7e11c9129ff71c7ee71b3b2e320ff27"><td class="memItemLeft" align="right" valign="top">x509_crt </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__polarssl__context.html#ae7e11c9129ff71c7ee71b3b2e320ff27">certificate</a></td></tr>
+<tr class="separator:ae7e11c9129ff71c7ee71b3b2e320ff27"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a919c33af37aab170f828d954de1fa270"><td class="memItemLeft" align="right" valign="top">rsa_context </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__polarssl__context.html#a919c33af37aab170f828d954de1fa270">key</a></td></tr>
+<tr class="separator:a919c33af37aab170f828d954de1fa270"><td class="memSeparator" colspan="2"> </td></tr>
+</table>
+<h2 class="groupheader">Field Documentation</h2>
+<a class="anchor" id="a1872f2ea24878d807ae20ca8513674af"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">x509_crt lws_polarssl_context::ca</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>ca </p>
+
+</div>
+</div>
+<a class="anchor" id="ae7e11c9129ff71c7ee71b3b2e320ff27"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">x509_crt lws_polarssl_context::certificate</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>cert </p>
+
+</div>
+</div>
+<a class="anchor" id="a919c33af37aab170f828d954de1fa270"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">rsa_context lws_polarssl_context::key</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>key </p>
+
+</div>
+</div>
+<hr/>The documentation for this struct was generated from the following file:<ul>
+<li>lib/<a class="el" href="libwebsockets_8h_source.html">libwebsockets.h</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="structlws__polarssl__context.html">lws_polarssl_context</a></li>
+ <li class="footer">Generated by
+ <a href="http://www.doxygen.org/index.html">
+ <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.11 </li>
+ </ul>
+</div>
+</body>
+</html>
--- /dev/null
+var structlws__polarssl__context =
+[
+ [ "ca", "structlws__polarssl__context.html#a1872f2ea24878d807ae20ca8513674af", null ],
+ [ "certificate", "structlws__polarssl__context.html#ae7e11c9129ff71c7ee71b3b2e320ff27", null ],
+ [ "key", "structlws__polarssl__context.html#a919c33af37aab170f828d954de1fa270", null ]
+];
\ No newline at end of file
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.11"/>
+<title>libwebsockets: lws_pollargs Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="libwebsockets.org-logo.png"/></td>
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname">libwebsockets
+ </div>
+ <div id="projectbrief">Lightweight C library for HTML5 websockets</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.11 -->
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main Page</span></a></li>
+ <li><a href="pages.html"><span>Related Pages</span></a></li>
+ <li><a href="modules.html"><span>Modules</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Data Structures</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Data Structures</span></a></li>
+ <li><a href="classes.html"><span>Data Structure Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Data Fields</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('structlws__pollargs.html','');});
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#pub-attribs">Data Fields</a> </div>
+ <div class="headertitle">
+<div class="title">lws_pollargs Struct Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h_source.html">libwebsockets.h</a>></code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:af14a48ef4e78128aef9a76902b104a81"><td class="memItemLeft" align="right" valign="top">lws_sockfd_type </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__pollargs.html#af14a48ef4e78128aef9a76902b104a81">fd</a></td></tr>
+<tr class="separator:af14a48ef4e78128aef9a76902b104a81"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a00bbffea9f55de342783e32d71ce1de6"><td class="memItemLeft" align="right" valign="top">int </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__pollargs.html#a00bbffea9f55de342783e32d71ce1de6">events</a></td></tr>
+<tr class="separator:a00bbffea9f55de342783e32d71ce1de6"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a437fec0de5cf264371e1ab5a401e86d8"><td class="memItemLeft" align="right" valign="top">int </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__pollargs.html#a437fec0de5cf264371e1ab5a401e86d8">prev_events</a></td></tr>
+<tr class="separator:a437fec0de5cf264371e1ab5a401e86d8"><td class="memSeparator" colspan="2"> </td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>struct <a class="el" href="structlws__pollargs.html">lws_pollargs</a> - argument structure for all external poll related calls passed in via 'in' </p>
+</div><h2 class="groupheader">Field Documentation</h2>
+<a class="anchor" id="a00bbffea9f55de342783e32d71ce1de6"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">int lws_pollargs::events</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>the new event mask </p>
+
+</div>
+</div>
+<a class="anchor" id="af14a48ef4e78128aef9a76902b104a81"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">lws_sockfd_type lws_pollargs::fd</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>applicable socket descriptor </p>
+
+</div>
+</div>
+<a class="anchor" id="a437fec0de5cf264371e1ab5a401e86d8"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">int lws_pollargs::prev_events</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>the previous event mask </p>
+
+</div>
+</div>
+<hr/>The documentation for this struct was generated from the following file:<ul>
+<li>lib/<a class="el" href="libwebsockets_8h_source.html">libwebsockets.h</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="structlws__pollargs.html">lws_pollargs</a></li>
+ <li class="footer">Generated by
+ <a href="http://www.doxygen.org/index.html">
+ <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.11 </li>
+ </ul>
+</div>
+</body>
+</html>
--- /dev/null
+var structlws__pollargs =
+[
+ [ "events", "structlws__pollargs.html#a00bbffea9f55de342783e32d71ce1de6", null ],
+ [ "fd", "structlws__pollargs.html#af14a48ef4e78128aef9a76902b104a81", null ],
+ [ "prev_events", "structlws__pollargs.html#a437fec0de5cf264371e1ab5a401e86d8", null ]
+];
\ No newline at end of file
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.11"/>
+<title>libwebsockets: lws_pollfd Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="libwebsockets.org-logo.png"/></td>
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname">libwebsockets
+ </div>
+ <div id="projectbrief">Lightweight C library for HTML5 websockets</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.11 -->
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main Page</span></a></li>
+ <li><a href="pages.html"><span>Related Pages</span></a></li>
+ <li><a href="modules.html"><span>Modules</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Data Structures</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Data Structures</span></a></li>
+ <li><a href="classes.html"><span>Data Structure Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Data Fields</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('structlws__pollfd.html','');});
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#pub-attribs">Data Fields</a> </div>
+ <div class="headertitle">
+<div class="title">lws_pollfd Struct Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:a714cf5ca90b41926117fdde9fa6542be"><td class="memItemLeft" align="right" valign="top">lws_sockfd_type </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__pollfd.html#a714cf5ca90b41926117fdde9fa6542be">fd</a></td></tr>
+<tr class="separator:a714cf5ca90b41926117fdde9fa6542be"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ac393db6fc7fb6ed8fe7ca20936908ee9"><td class="memItemLeft" align="right" valign="top">SHORT </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__pollfd.html#ac393db6fc7fb6ed8fe7ca20936908ee9">events</a></td></tr>
+<tr class="separator:ac393db6fc7fb6ed8fe7ca20936908ee9"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ae7cecfe7511c59d4a3a44f876d030932"><td class="memItemLeft" align="right" valign="top">SHORT </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__pollfd.html#ae7cecfe7511c59d4a3a44f876d030932">revents</a></td></tr>
+<tr class="separator:ae7cecfe7511c59d4a3a44f876d030932"><td class="memSeparator" colspan="2"> </td></tr>
+</table>
+<h2 class="groupheader">Field Documentation</h2>
+<a class="anchor" id="ac393db6fc7fb6ed8fe7ca20936908ee9"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">SHORT lws_pollfd::events</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>which events to respond to </p>
+
+</div>
+</div>
+<a class="anchor" id="a714cf5ca90b41926117fdde9fa6542be"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">lws_sockfd_type lws_pollfd::fd</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>file descriptor </p>
+
+</div>
+</div>
+<a class="anchor" id="ae7cecfe7511c59d4a3a44f876d030932"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">SHORT lws_pollfd::revents</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>which events happened </p>
+
+</div>
+</div>
+<hr/>The documentation for this struct was generated from the following file:<ul>
+<li>lib/<a class="el" href="libwebsockets_8h_source.html">libwebsockets.h</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="structlws__pollfd.html">lws_pollfd</a></li>
+ <li class="footer">Generated by
+ <a href="http://www.doxygen.org/index.html">
+ <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.11 </li>
+ </ul>
+</div>
+</body>
+</html>
--- /dev/null
+var structlws__pollfd =
+[
+ [ "events", "structlws__pollfd.html#ac393db6fc7fb6ed8fe7ca20936908ee9", null ],
+ [ "fd", "structlws__pollfd.html#a714cf5ca90b41926117fdde9fa6542be", null ],
+ [ "revents", "structlws__pollfd.html#ae7cecfe7511c59d4a3a44f876d030932", null ]
+];
\ No newline at end of file
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.11"/>
+<title>libwebsockets: lws_process_html_args Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="libwebsockets.org-logo.png"/></td>
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname">libwebsockets
+ </div>
+ <div id="projectbrief">Lightweight C library for HTML5 websockets</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.11 -->
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main Page</span></a></li>
+ <li><a href="pages.html"><span>Related Pages</span></a></li>
+ <li><a href="modules.html"><span>Modules</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Data Structures</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Data Structures</span></a></li>
+ <li><a href="classes.html"><span>Data Structure Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Data Fields</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('structlws__process__html__args.html','');});
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#pub-attribs">Data Fields</a> </div>
+ <div class="headertitle">
+<div class="title">lws_process_html_args Struct Reference<div class="ingroups"><a class="el" href="group__http.html">HTTP</a> » <a class="el" href="group__html-chunked-substitution.html">HTML Chunked Substitution</a></div></div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:a11859d8bedd379fbf64543b25c65fe14"><td class="memItemLeft" align="right" valign="top">char * </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__process__html__args.html#a11859d8bedd379fbf64543b25c65fe14">p</a></td></tr>
+<tr class="separator:a11859d8bedd379fbf64543b25c65fe14"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a754513f2311241cabb0cd1c90d7307ef"><td class="memItemLeft" align="right" valign="top">int </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__process__html__args.html#a754513f2311241cabb0cd1c90d7307ef">len</a></td></tr>
+<tr class="separator:a754513f2311241cabb0cd1c90d7307ef"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a8be7fd396a1942ea2449a2fda990ff99"><td class="memItemLeft" align="right" valign="top">int </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__process__html__args.html#a8be7fd396a1942ea2449a2fda990ff99">max_len</a></td></tr>
+<tr class="separator:a8be7fd396a1942ea2449a2fda990ff99"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a362547891ee0d693f3900a1f807ea475"><td class="memItemLeft" align="right" valign="top">int </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__process__html__args.html#a362547891ee0d693f3900a1f807ea475">final</a></td></tr>
+<tr class="separator:a362547891ee0d693f3900a1f807ea475"><td class="memSeparator" colspan="2"> </td></tr>
+</table>
+<h2 class="groupheader">Field Documentation</h2>
+<a class="anchor" id="a362547891ee0d693f3900a1f807ea475"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">int lws_process_html_args::final</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>set if this is the last chunk of the file </p>
+
+</div>
+</div>
+<a class="anchor" id="a754513f2311241cabb0cd1c90d7307ef"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">int lws_process_html_args::len</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>length of the original data at p </p>
+
+</div>
+</div>
+<a class="anchor" id="a8be7fd396a1942ea2449a2fda990ff99"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">int lws_process_html_args::max_len</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>maximum length we can grow the data to </p>
+
+</div>
+</div>
+<a class="anchor" id="a11859d8bedd379fbf64543b25c65fe14"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">char* lws_process_html_args::p</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>pointer to the buffer containing the data </p>
+
+</div>
+</div>
+<hr/>The documentation for this struct was generated from the following file:<ul>
+<li>lib/<a class="el" href="libwebsockets_8h_source.html">libwebsockets.h</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="structlws__process__html__args.html">lws_process_html_args</a></li>
+ <li class="footer">Generated by
+ <a href="http://www.doxygen.org/index.html">
+ <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.11 </li>
+ </ul>
+</div>
+</body>
+</html>
--- /dev/null
+var structlws__process__html__args =
+[
+ [ "final", "structlws__process__html__args.html#a362547891ee0d693f3900a1f807ea475", null ],
+ [ "len", "structlws__process__html__args.html#a754513f2311241cabb0cd1c90d7307ef", null ],
+ [ "max_len", "structlws__process__html__args.html#a8be7fd396a1942ea2449a2fda990ff99", null ],
+ [ "p", "structlws__process__html__args.html#a11859d8bedd379fbf64543b25c65fe14", null ]
+];
\ No newline at end of file
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.11"/>
+<title>libwebsockets: lws_process_html_state Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="libwebsockets.org-logo.png"/></td>
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname">libwebsockets
+ </div>
+ <div id="projectbrief">Lightweight C library for HTML5 websockets</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.11 -->
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main Page</span></a></li>
+ <li><a href="pages.html"><span>Related Pages</span></a></li>
+ <li><a href="modules.html"><span>Modules</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Data Structures</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Data Structures</span></a></li>
+ <li><a href="classes.html"><span>Data Structure Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Data Fields</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('structlws__process__html__state.html','');});
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#pub-attribs">Data Fields</a> </div>
+ <div class="headertitle">
+<div class="title">lws_process_html_state Struct Reference<div class="ingroups"><a class="el" href="group__http.html">HTTP</a> » <a class="el" href="group__html-chunked-substitution.html">HTML Chunked Substitution</a></div></div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:af0732884ef891e24fe5fa237ebaa21a3"><td class="memItemLeft" align="right" valign="top">char * </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__process__html__state.html#af0732884ef891e24fe5fa237ebaa21a3">start</a></td></tr>
+<tr class="separator:af0732884ef891e24fe5fa237ebaa21a3"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a71982bc1cbd8cf876ca0f545144404eb"><td class="memItemLeft" align="right" valign="top">char </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__process__html__state.html#a71982bc1cbd8cf876ca0f545144404eb">swallow</a> [16]</td></tr>
+<tr class="separator:a71982bc1cbd8cf876ca0f545144404eb"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a53234f2948812c7208a256f9f5b23c20"><td class="memItemLeft" align="right" valign="top">int </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__process__html__state.html#a53234f2948812c7208a256f9f5b23c20">pos</a></td></tr>
+<tr class="separator:a53234f2948812c7208a256f9f5b23c20"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:af21119890fdfebe28fb5c4dabfc1bdf5"><td class="memItemLeft" align="right" valign="top">void * </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__process__html__state.html#af21119890fdfebe28fb5c4dabfc1bdf5">data</a></td></tr>
+<tr class="separator:af21119890fdfebe28fb5c4dabfc1bdf5"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a3b113e00c03a2fded51b1c85ff5bf077"><td class="memItemLeft" align="right" valign="top">const char *const * </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__process__html__state.html#a3b113e00c03a2fded51b1c85ff5bf077">vars</a></td></tr>
+<tr class="separator:a3b113e00c03a2fded51b1c85ff5bf077"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:adcafd17704775b4bbeea9561fb340968"><td class="memItemLeft" align="right" valign="top">int </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__process__html__state.html#adcafd17704775b4bbeea9561fb340968">count_vars</a></td></tr>
+<tr class="separator:adcafd17704775b4bbeea9561fb340968"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a693d2fb45378afee5da29b539c1ea644"><td class="memItemLeft" align="right" valign="top">lws_process_html_state_cb </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__process__html__state.html#a693d2fb45378afee5da29b539c1ea644">replace</a></td></tr>
+<tr class="separator:a693d2fb45378afee5da29b539c1ea644"><td class="memSeparator" colspan="2"> </td></tr>
+</table>
+<h2 class="groupheader">Field Documentation</h2>
+<a class="anchor" id="adcafd17704775b4bbeea9561fb340968"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">int lws_process_html_state::count_vars</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>count of variable names </p>
+
+</div>
+</div>
+<a class="anchor" id="af21119890fdfebe28fb5c4dabfc1bdf5"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void* lws_process_html_state::data</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>opaque pointer </p>
+
+</div>
+</div>
+<a class="anchor" id="a53234f2948812c7208a256f9f5b23c20"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">int lws_process_html_state::pos</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>position in match </p>
+
+</div>
+</div>
+<a class="anchor" id="a693d2fb45378afee5da29b539c1ea644"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">lws_process_html_state_cb lws_process_html_state::replace</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>called on match to perform substitution </p>
+
+</div>
+</div>
+<a class="anchor" id="af0732884ef891e24fe5fa237ebaa21a3"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">char* lws_process_html_state::start</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>pointer to start of match </p>
+
+</div>
+</div>
+<a class="anchor" id="a71982bc1cbd8cf876ca0f545144404eb"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">char lws_process_html_state::swallow[16]</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>matched character buffer </p>
+
+</div>
+</div>
+<a class="anchor" id="a3b113e00c03a2fded51b1c85ff5bf077"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const char* const* lws_process_html_state::vars</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>list of variable names </p>
+
+</div>
+</div>
+<hr/>The documentation for this struct was generated from the following file:<ul>
+<li>lib/<a class="el" href="libwebsockets_8h_source.html">libwebsockets.h</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="structlws__process__html__state.html">lws_process_html_state</a></li>
+ <li class="footer">Generated by
+ <a href="http://www.doxygen.org/index.html">
+ <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.11 </li>
+ </ul>
+</div>
+</body>
+</html>
--- /dev/null
+var structlws__process__html__state =
+[
+ [ "count_vars", "structlws__process__html__state.html#adcafd17704775b4bbeea9561fb340968", null ],
+ [ "data", "structlws__process__html__state.html#af21119890fdfebe28fb5c4dabfc1bdf5", null ],
+ [ "pos", "structlws__process__html__state.html#a53234f2948812c7208a256f9f5b23c20", null ],
+ [ "replace", "structlws__process__html__state.html#a693d2fb45378afee5da29b539c1ea644", null ],
+ [ "start", "structlws__process__html__state.html#af0732884ef891e24fe5fa237ebaa21a3", null ],
+ [ "swallow", "structlws__process__html__state.html#a71982bc1cbd8cf876ca0f545144404eb", null ],
+ [ "vars", "structlws__process__html__state.html#a3b113e00c03a2fded51b1c85ff5bf077", null ]
+];
\ No newline at end of file
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.11"/>
+<title>libwebsockets: lws_protocol_vhost_options Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="libwebsockets.org-logo.png"/></td>
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname">libwebsockets
+ </div>
+ <div id="projectbrief">Lightweight C library for HTML5 websockets</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.11 -->
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main Page</span></a></li>
+ <li><a href="pages.html"><span>Related Pages</span></a></li>
+ <li><a href="modules.html"><span>Modules</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Data Structures</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Data Structures</span></a></li>
+ <li><a href="classes.html"><span>Data Structure Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Data Fields</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('structlws__protocol__vhost__options.html','');});
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#pub-attribs">Data Fields</a> </div>
+ <div class="headertitle">
+<div class="title">lws_protocol_vhost_options Struct Reference<div class="ingroups"><a class="el" href="group__context-and-vhost.html">Context-and-vhost</a><a class="el" href="group__context-and-vhost.html">Context-and-vhost</a> » | <a class="el" href="group__vhost-mounts.html">Vhost mounts and options</a></div></div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h_source.html">libwebsockets.h</a>></code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:abc714ddb4171756fc8196e9823a1e21c"><td class="memItemLeft" align="right" valign="top">const struct <a class="el" href="structlws__protocol__vhost__options.html">lws_protocol_vhost_options</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__protocol__vhost__options.html#abc714ddb4171756fc8196e9823a1e21c">next</a></td></tr>
+<tr class="separator:abc714ddb4171756fc8196e9823a1e21c"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:afd99fbc90be51ea2465b550c2ec47822"><td class="memItemLeft" align="right" valign="top">const struct <a class="el" href="structlws__protocol__vhost__options.html">lws_protocol_vhost_options</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__protocol__vhost__options.html#afd99fbc90be51ea2465b550c2ec47822">options</a></td></tr>
+<tr class="separator:afd99fbc90be51ea2465b550c2ec47822"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:acf9db77f8eb64cd4e314be9b43d8a8b9"><td class="memItemLeft" align="right" valign="top">const char * </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__protocol__vhost__options.html#acf9db77f8eb64cd4e314be9b43d8a8b9">name</a></td></tr>
+<tr class="separator:acf9db77f8eb64cd4e314be9b43d8a8b9"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a0640a92513c70ee6b9b295a9ad1658e7"><td class="memItemLeft" align="right" valign="top">const char * </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__protocol__vhost__options.html#a0640a92513c70ee6b9b295a9ad1658e7">value</a></td></tr>
+<tr class="separator:a0640a92513c70ee6b9b295a9ad1658e7"><td class="memSeparator" colspan="2"> </td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>struct <a class="el" href="structlws__protocol__vhost__options.html">lws_protocol_vhost_options</a> - linked list of per-vhost protocol name=value options</p>
+<p>This provides a general way to attach a linked-list of name=value pairs, which can also have an optional child link-list using the options member. </p>
+</div><h2 class="groupheader">Field Documentation</h2>
+<a class="anchor" id="acf9db77f8eb64cd4e314be9b43d8a8b9"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const char* lws_protocol_vhost_options::name</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>name of name=value pair </p>
+
+</div>
+</div>
+<a class="anchor" id="abc714ddb4171756fc8196e9823a1e21c"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const struct <a class="el" href="structlws__protocol__vhost__options.html">lws_protocol_vhost_options</a>* lws_protocol_vhost_options::next</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>linked list </p>
+
+</div>
+</div>
+<a class="anchor" id="afd99fbc90be51ea2465b550c2ec47822"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const struct <a class="el" href="structlws__protocol__vhost__options.html">lws_protocol_vhost_options</a>* lws_protocol_vhost_options::options</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>child linked-list of more options for this node </p>
+
+</div>
+</div>
+<a class="anchor" id="a0640a92513c70ee6b9b295a9ad1658e7"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const char* lws_protocol_vhost_options::value</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>value of name=value pair </p>
+
+</div>
+</div>
+<hr/>The documentation for this struct was generated from the following file:<ul>
+<li>lib/<a class="el" href="libwebsockets_8h_source.html">libwebsockets.h</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="structlws__protocol__vhost__options.html">lws_protocol_vhost_options</a></li>
+ <li class="footer">Generated by
+ <a href="http://www.doxygen.org/index.html">
+ <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.11 </li>
+ </ul>
+</div>
+</body>
+</html>
--- /dev/null
+var structlws__protocol__vhost__options =
+[
+ [ "name", "structlws__protocol__vhost__options.html#acf9db77f8eb64cd4e314be9b43d8a8b9", null ],
+ [ "next", "structlws__protocol__vhost__options.html#abc714ddb4171756fc8196e9823a1e21c", null ],
+ [ "options", "structlws__protocol__vhost__options.html#afd99fbc90be51ea2465b550c2ec47822", null ],
+ [ "value", "structlws__protocol__vhost__options.html#a0640a92513c70ee6b9b295a9ad1658e7", null ]
+];
\ No newline at end of file
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.11"/>
+<title>libwebsockets: lws_protocols Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="libwebsockets.org-logo.png"/></td>
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname">libwebsockets
+ </div>
+ <div id="projectbrief">Lightweight C library for HTML5 websockets</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.11 -->
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main Page</span></a></li>
+ <li><a href="pages.html"><span>Related Pages</span></a></li>
+ <li><a href="modules.html"><span>Modules</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Data Structures</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Data Structures</span></a></li>
+ <li><a href="classes.html"><span>Data Structure Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Data Fields</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('structlws__protocols.html','');});
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#pub-attribs">Data Fields</a> </div>
+ <div class="headertitle">
+<div class="title">lws_protocols Struct Reference<div class="ingroups"><a class="el" href="group__Protocols-and-Plugins.html">Protocols and Plugins</a></div></div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h_source.html">libwebsockets.h</a>></code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:a0e63edb457a613c3fa4271e0a8f19624"><td class="memItemLeft" align="right" valign="top">const char * </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__protocols.html#a0e63edb457a613c3fa4271e0a8f19624">name</a></td></tr>
+<tr class="separator:a0e63edb457a613c3fa4271e0a8f19624"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:acabf94c1a9bfe7be0387fbb0e0c56b2d"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__usercb.html#gad4fcb82e68d60ffacca61a3f783a0a2f">lws_callback_function</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__protocols.html#acabf94c1a9bfe7be0387fbb0e0c56b2d">callback</a></td></tr>
+<tr class="separator:acabf94c1a9bfe7be0387fbb0e0c56b2d"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a9bbd85f591ffb4259711cb5acbb05bea"><td class="memItemLeft" align="right" valign="top">size_t </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__protocols.html#a9bbd85f591ffb4259711cb5acbb05bea">per_session_data_size</a></td></tr>
+<tr class="separator:a9bbd85f591ffb4259711cb5acbb05bea"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a0d1d4996d81b2f5e125bcec981e461c5"><td class="memItemLeft" align="right" valign="top">size_t </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__protocols.html#a0d1d4996d81b2f5e125bcec981e461c5">rx_buffer_size</a></td></tr>
+<tr class="separator:a0d1d4996d81b2f5e125bcec981e461c5"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a6b632018590c2b1bbe43fbab6d5e6fac"><td class="memItemLeft" align="right" valign="top">unsigned int </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__protocols.html#a6b632018590c2b1bbe43fbab6d5e6fac">id</a></td></tr>
+<tr class="separator:a6b632018590c2b1bbe43fbab6d5e6fac"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a3cbd903ad076736ae934a54cae36580e"><td class="memItemLeft" align="right" valign="top">void * </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__protocols.html#a3cbd903ad076736ae934a54cae36580e">user</a></td></tr>
+<tr class="separator:a3cbd903ad076736ae934a54cae36580e"><td class="memSeparator" colspan="2"> </td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>struct <a class="el" href="structlws__protocols.html">lws_protocols</a> - List of protocols and handlers client or server supports. </p>
+</div><h2 class="groupheader">Field Documentation</h2>
+<a class="anchor" id="acabf94c1a9bfe7be0387fbb0e0c56b2d"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="group__usercb.html#gad4fcb82e68d60ffacca61a3f783a0a2f">lws_callback_function</a>* lws_protocols::callback</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>The service callback used for this protocol. It allows the service action for an entire protocol to be encapsulated in the protocol-specific callback </p>
+
+</div>
+</div>
+<a class="anchor" id="a6b632018590c2b1bbe43fbab6d5e6fac"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">unsigned int lws_protocols::id</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>ignored by lws, but useful to contain user information bound to the selected protocol. For example if this protocol was called "myprotocol-v2", you might set id to 2, and the user code that acts differently according to the version can do so by switch (wsi->protocol->id), user code might use some bits as capability flags based on selected protocol version, etc. </p>
+
+</div>
+</div>
+<a class="anchor" id="a0e63edb457a613c3fa4271e0a8f19624"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const char* lws_protocols::name</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Protocol name that must match the one given in the client Javascript new WebSocket(url, 'protocol') name. </p>
+
+</div>
+</div>
+<a class="anchor" id="a9bbd85f591ffb4259711cb5acbb05bea"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">size_t lws_protocols::per_session_data_size</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Each new connection using this protocol gets this much memory allocated on connection establishment and freed on connection takedown. A pointer to this per-connection allocation is passed into the callback in the 'user' parameter </p>
+
+</div>
+</div>
+<a class="anchor" id="a0d1d4996d81b2f5e125bcec981e461c5"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">size_t lws_protocols::rx_buffer_size</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>lws allocates this much space for rx data and informs callback when something came. Due to rx flow control, the callback may not be able to consume it all without having to return to the event loop. That is supported in lws.</p>
+<p>This also controls how much may be sent at once at the moment, although this is likely to change. </p>
+
+</div>
+</div>
+<a class="anchor" id="a3cbd903ad076736ae934a54cae36580e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void* lws_protocols::user</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>ignored by lws, but user code can pass a pointer here it can later access from the protocol callback </p>
+
+</div>
+</div>
+<hr/>The documentation for this struct was generated from the following file:<ul>
+<li>lib/<a class="el" href="libwebsockets_8h_source.html">libwebsockets.h</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="structlws__protocols.html">lws_protocols</a></li>
+ <li class="footer">Generated by
+ <a href="http://www.doxygen.org/index.html">
+ <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.11 </li>
+ </ul>
+</div>
+</body>
+</html>
--- /dev/null
+var structlws__protocols =
+[
+ [ "callback", "structlws__protocols.html#acabf94c1a9bfe7be0387fbb0e0c56b2d", null ],
+ [ "id", "structlws__protocols.html#a6b632018590c2b1bbe43fbab6d5e6fac", null ],
+ [ "name", "structlws__protocols.html#a0e63edb457a613c3fa4271e0a8f19624", null ],
+ [ "per_session_data_size", "structlws__protocols.html#a9bbd85f591ffb4259711cb5acbb05bea", null ],
+ [ "rx_buffer_size", "structlws__protocols.html#a0d1d4996d81b2f5e125bcec981e461c5", null ],
+ [ "user", "structlws__protocols.html#a3cbd903ad076736ae934a54cae36580e", null ]
+];
\ No newline at end of file
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.11"/>
+<title>libwebsockets: lws_session_info Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="libwebsockets.org-logo.png"/></td>
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname">libwebsockets
+ </div>
+ <div id="projectbrief">Lightweight C library for HTML5 websockets</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.11 -->
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main Page</span></a></li>
+ <li><a href="pages.html"><span>Related Pages</span></a></li>
+ <li><a href="modules.html"><span>Modules</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Data Structures</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Data Structures</span></a></li>
+ <li><a href="classes.html"><span>Data Structure Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Data Fields</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('structlws__session__info.html','');});
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#pub-attribs">Data Fields</a> </div>
+ <div class="headertitle">
+<div class="title">lws_session_info Struct Reference<div class="ingroups"><a class="el" href="group__Protocols-and-Plugins.html">Protocols and Plugins</a> » <a class="el" href="group__generic-sessions.html">plugin: generic-sessions</a></div></div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h_source.html">libwebsockets.h</a>></code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:a3d57a70b6e7181d95a8bec429b1a7697"><td class="memItemLeft" align="right" valign="top">char </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__session__info.html#a3d57a70b6e7181d95a8bec429b1a7697">username</a> [32]</td></tr>
+<tr class="separator:a3d57a70b6e7181d95a8bec429b1a7697"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a94b813cfc6b0da4b182659de30038ad3"><td class="memItemLeft" align="right" valign="top">char </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__session__info.html#a94b813cfc6b0da4b182659de30038ad3">email</a> [100]</td></tr>
+<tr class="separator:a94b813cfc6b0da4b182659de30038ad3"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a53eed02325e8717a53297391e3e98fac"><td class="memItemLeft" align="right" valign="top">char </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__session__info.html#a53eed02325e8717a53297391e3e98fac">ip</a> [72]</td></tr>
+<tr class="separator:a53eed02325e8717a53297391e3e98fac"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:afb924864b70f40372920688a5c1c895e"><td class="memItemLeft" align="right" valign="top">unsigned int </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__session__info.html#afb924864b70f40372920688a5c1c895e">mask</a></td></tr>
+<tr class="separator:afb924864b70f40372920688a5c1c895e"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a4353b5dd19400b2b15edfd7cee1e4cd5"><td class="memItemLeft" align="right" valign="top">char </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__session__info.html#a4353b5dd19400b2b15edfd7cee1e4cd5">session</a> [42]</td></tr>
+<tr class="separator:a4353b5dd19400b2b15edfd7cee1e4cd5"><td class="memSeparator" colspan="2"> </td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>struct <a class="el" href="structlws__session__info.html">lws_session_info</a> - information about user session status </p>
+</div><h2 class="groupheader">Field Documentation</h2>
+<a class="anchor" id="a94b813cfc6b0da4b182659de30038ad3"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">char lws_session_info::email[100]</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>email address associated with login, or empty string </p>
+
+</div>
+</div>
+<a class="anchor" id="a53eed02325e8717a53297391e3e98fac"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">char lws_session_info::ip[72]</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>ip address session was started from </p>
+
+</div>
+</div>
+<a class="anchor" id="afb924864b70f40372920688a5c1c895e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">unsigned int lws_session_info::mask</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>access rights mask associated with session see enum lwsgs_auth_bits </p>
+
+</div>
+</div>
+<a class="anchor" id="a4353b5dd19400b2b15edfd7cee1e4cd5"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">char lws_session_info::session[42]</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>session id string, usable as opaque uid when not logged in </p>
+
+</div>
+</div>
+<a class="anchor" id="a3d57a70b6e7181d95a8bec429b1a7697"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">char lws_session_info::username[32]</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>username logged in as, or empty string </p>
+
+</div>
+</div>
+<hr/>The documentation for this struct was generated from the following file:<ul>
+<li>lib/<a class="el" href="libwebsockets_8h_source.html">libwebsockets.h</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="structlws__session__info.html">lws_session_info</a></li>
+ <li class="footer">Generated by
+ <a href="http://www.doxygen.org/index.html">
+ <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.11 </li>
+ </ul>
+</div>
+</body>
+</html>
--- /dev/null
+var structlws__session__info =
+[
+ [ "email", "structlws__session__info.html#a94b813cfc6b0da4b182659de30038ad3", null ],
+ [ "ip", "structlws__session__info.html#a53eed02325e8717a53297391e3e98fac", null ],
+ [ "mask", "structlws__session__info.html#afb924864b70f40372920688a5c1c895e", null ],
+ [ "session", "structlws__session__info.html#a4353b5dd19400b2b15edfd7cee1e4cd5", null ],
+ [ "username", "structlws__session__info.html#a3d57a70b6e7181d95a8bec429b1a7697", null ]
+];
\ No newline at end of file
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.11"/>
+<title>libwebsockets: lws_token_limits Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="libwebsockets.org-logo.png"/></td>
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname">libwebsockets
+ </div>
+ <div id="projectbrief">Lightweight C library for HTML5 websockets</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.11 -->
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main Page</span></a></li>
+ <li><a href="pages.html"><span>Related Pages</span></a></li>
+ <li><a href="modules.html"><span>Modules</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Data Structures</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Data Structures</span></a></li>
+ <li><a href="classes.html"><span>Data Structure Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Data Fields</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('structlws__token__limits.html','');});
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#pub-attribs">Data Fields</a> </div>
+ <div class="headertitle">
+<div class="title">lws_token_limits Struct Reference<div class="ingroups"><a class="el" href="group__http.html">HTTP</a> » <a class="el" href="group__HTTP-headers-read.html">HTTP headers: read</a></div></div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:a6ec712306cbf8585bce7a56758a3ceff"><td class="memItemLeft" align="right" valign="top">unsigned short </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__token__limits.html#a6ec712306cbf8585bce7a56758a3ceff">token_limit</a> [WSI_TOKEN_COUNT]</td></tr>
+<tr class="separator:a6ec712306cbf8585bce7a56758a3ceff"><td class="memSeparator" colspan="2"> </td></tr>
+</table>
+<h2 class="groupheader">Field Documentation</h2>
+<a class="anchor" id="a6ec712306cbf8585bce7a56758a3ceff"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">unsigned short lws_token_limits::token_limit[WSI_TOKEN_COUNT]</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>max chars for this token </p>
+
+</div>
+</div>
+<hr/>The documentation for this struct was generated from the following file:<ul>
+<li>lib/<a class="el" href="libwebsockets_8h_source.html">libwebsockets.h</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="structlws__token__limits.html">lws_token_limits</a></li>
+ <li class="footer">Generated by
+ <a href="http://www.doxygen.org/index.html">
+ <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.11 </li>
+ </ul>
+</div>
+</body>
+</html>
--- /dev/null
+var structlws__token__limits =
+[
+ [ "token_limit", "structlws__token__limits.html#a6ec712306cbf8585bce7a56758a3ceff", null ]
+];
\ No newline at end of file
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.11"/>
+<title>libwebsockets: lws_tokens Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="libwebsockets.org-logo.png"/></td>
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname">libwebsockets
+ </div>
+ <div id="projectbrief">Lightweight C library for HTML5 websockets</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.11 -->
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main Page</span></a></li>
+ <li><a href="pages.html"><span>Related Pages</span></a></li>
+ <li><a href="modules.html"><span>Modules</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Data Structures</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Data Structures</span></a></li>
+ <li><a href="classes.html"><span>Data Structure Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Data Fields</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('structlws__tokens.html','');});
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#pub-attribs">Data Fields</a> </div>
+ <div class="headertitle">
+<div class="title">lws_tokens Struct Reference<div class="ingroups"><a class="el" href="group__http.html">HTTP</a><a class="el" href="group__http.html">HTTP</a> » | <a class="el" href="group__HTTP-headers-read.html">HTTP headers: read</a></div></div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h_source.html">libwebsockets.h</a>></code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:a9f3635412bc71a5cb78e9862b55f10cd"><td class="memItemLeft" align="right" valign="top">char * </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__tokens.html#a9f3635412bc71a5cb78e9862b55f10cd">token</a></td></tr>
+<tr class="separator:a9f3635412bc71a5cb78e9862b55f10cd"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a855b7375d1d58516c0ecd4b60e9a7766"><td class="memItemLeft" align="right" valign="top">int </td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__tokens.html#a855b7375d1d58516c0ecd4b60e9a7766">token_len</a></td></tr>
+<tr class="separator:a855b7375d1d58516c0ecd4b60e9a7766"><td class="memSeparator" colspan="2"> </td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>struct <a class="el" href="structlws__tokens.html">lws_tokens</a> you need these to look at headers that have been parsed if using the LWS_CALLBACK_FILTER_CONNECTION callback. If a header from the enum list below is absent, .token = NULL and token_len = 0. Otherwise .token points to .token_len chars containing that header content. </p>
+</div><h2 class="groupheader">Field Documentation</h2>
+<a class="anchor" id="a9f3635412bc71a5cb78e9862b55f10cd"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">char* lws_tokens::token</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>pointer to start of the token </p>
+
+</div>
+</div>
+<a class="anchor" id="a855b7375d1d58516c0ecd4b60e9a7766"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">int lws_tokens::token_len</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>length of the token's value </p>
+
+</div>
+</div>
+<hr/>The documentation for this struct was generated from the following file:<ul>
+<li>lib/<a class="el" href="libwebsockets_8h_source.html">libwebsockets.h</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="structlws__tokens.html">lws_tokens</a></li>
+ <li class="footer">Generated by
+ <a href="http://www.doxygen.org/index.html">
+ <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.11 </li>
+ </ul>
+</div>
+</body>
+</html>
--- /dev/null
+var structlws__tokens =
+[
+ [ "token", "structlws__tokens.html#a9f3635412bc71a5cb78e9862b55f10cd", null ],
+ [ "token_len", "structlws__tokens.html#a855b7375d1d58516c0ecd4b60e9a7766", null ]
+];
\ No newline at end of file
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.11"/>
+<title>libwebsockets: lwsgw_hash Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="libwebsockets.org-logo.png"/></td>
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname">libwebsockets
+ </div>
+ <div id="projectbrief">Lightweight C library for HTML5 websockets</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.11 -->
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main Page</span></a></li>
+ <li><a href="pages.html"><span>Related Pages</span></a></li>
+ <li><a href="modules.html"><span>Modules</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Data Structures</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Data Structures</span></a></li>
+ <li><a href="classes.html"><span>Data Structure Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Data Fields</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('structlwsgw__hash.html','');});
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#pub-attribs">Data Fields</a> </div>
+ <div class="headertitle">
+<div class="title">lwsgw_hash Struct Reference<div class="ingroups"><a class="el" href="group__Protocols-and-Plugins.html">Protocols and Plugins</a> » <a class="el" href="group__generic-sessions.html">plugin: generic-sessions</a></div></div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h_source.html">libwebsockets.h</a>></code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:a29435f5cf78747d4257695b0f141d164"><td class="memItemLeft" align="right" valign="top">char </td><td class="memItemRight" valign="bottom"><a class="el" href="structlwsgw__hash.html#a29435f5cf78747d4257695b0f141d164">id</a> [41]</td></tr>
+<tr class="separator:a29435f5cf78747d4257695b0f141d164"><td class="memSeparator" colspan="2"> </td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>typedef struct <a class="el" href="structlwsgw__hash.html">lwsgw_hash</a> </p>
+</div><h2 class="groupheader">Field Documentation</h2>
+<a class="anchor" id="a29435f5cf78747d4257695b0f141d164"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">char lwsgw_hash::id[41]</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>ascii hex representation of hash </p>
+
+</div>
+</div>
+<hr/>The documentation for this struct was generated from the following file:<ul>
+<li>lib/<a class="el" href="libwebsockets_8h_source.html">libwebsockets.h</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="structlwsgw__hash.html">lwsgw_hash</a></li>
+ <li class="footer">Generated by
+ <a href="http://www.doxygen.org/index.html">
+ <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.11 </li>
+ </ul>
+</div>
+</body>
+</html>
--- /dev/null
+var structlwsgw__hash =
+[
+ [ "id", "structlwsgw__hash.html#a29435f5cf78747d4257695b0f141d164", null ]
+];
\ No newline at end of file
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.11"/>
+<title>libwebsockets: lwsgw_hash_bin Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="libwebsockets.org-logo.png"/></td>
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname">libwebsockets
+ </div>
+ <div id="projectbrief">Lightweight C library for HTML5 websockets</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.11 -->
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main Page</span></a></li>
+ <li><a href="pages.html"><span>Related Pages</span></a></li>
+ <li><a href="modules.html"><span>Modules</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Data Structures</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Data Structures</span></a></li>
+ <li><a href="classes.html"><span>Data Structure Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Data Fields</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('structlwsgw__hash__bin.html','');});
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#pub-attribs">Data Fields</a> </div>
+ <div class="headertitle">
+<div class="title">lwsgw_hash_bin Struct Reference<div class="ingroups"><a class="el" href="group__Protocols-and-Plugins.html">Protocols and Plugins</a> » <a class="el" href="group__generic-sessions.html">plugin: generic-sessions</a></div></div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p><code>#include <<a class="el" href="libwebsockets_8h_source.html">libwebsockets.h</a>></code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:ac92f50d9471058525d110597a4e0de6b"><td class="memItemLeft" align="right" valign="top">unsigned char </td><td class="memItemRight" valign="bottom"><a class="el" href="structlwsgw__hash__bin.html#ac92f50d9471058525d110597a4e0de6b">bin</a> [20]</td></tr>
+<tr class="separator:ac92f50d9471058525d110597a4e0de6b"><td class="memSeparator" colspan="2"> </td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>typedef struct <a class="el" href="structlwsgw__hash__bin.html">lwsgw_hash_bin</a> </p>
+</div><h2 class="groupheader">Field Documentation</h2>
+<a class="anchor" id="ac92f50d9471058525d110597a4e0de6b"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">unsigned char lwsgw_hash_bin::bin[20]</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>binary representation of hash </p>
+
+</div>
+</div>
+<hr/>The documentation for this struct was generated from the following file:<ul>
+<li>lib/<a class="el" href="libwebsockets_8h_source.html">libwebsockets.h</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="structlwsgw__hash__bin.html">lwsgw_hash_bin</a></li>
+ <li class="footer">Generated by
+ <a href="http://www.doxygen.org/index.html">
+ <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.11 </li>
+ </ul>
+</div>
+</body>
+</html>
--- /dev/null
+var structlwsgw__hash__bin =
+[
+ [ "bin", "structlwsgw__hash__bin.html#ac92f50d9471058525d110597a4e0de6b", null ]
+];
\ No newline at end of file
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.11"/>
+<title>libwebsockets: pollfd Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="libwebsockets.org-logo.png"/></td>
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname">libwebsockets
+ </div>
+ <div id="projectbrief">Lightweight C library for HTML5 websockets</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.11 -->
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main Page</span></a></li>
+ <li><a href="pages.html"><span>Related Pages</span></a></li>
+ <li><a href="modules.html"><span>Modules</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Data Structures</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Data Structures</span></a></li>
+ <li><a href="classes.html"><span>Data Structure Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Data Fields</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('structpollfd.html','');});
+</script>
+<div id="doc-content">
+<div class="header">
+ <div class="summary">
+<a href="#pub-attribs">Data Fields</a> </div>
+ <div class="headertitle">
+<div class="title">pollfd Struct Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:af084f089bdece61d177f85782d6673d0"><td class="memItemLeft" align="right" valign="top">lws_sockfd_type </td><td class="memItemRight" valign="bottom"><a class="el" href="structpollfd.html#af084f089bdece61d177f85782d6673d0">fd</a></td></tr>
+<tr class="separator:af084f089bdece61d177f85782d6673d0"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ac9b2f2c5b1f9a7487eb57e67cd4960ef"><td class="memItemLeft" align="right" valign="top">short </td><td class="memItemRight" valign="bottom"><a class="el" href="structpollfd.html#ac9b2f2c5b1f9a7487eb57e67cd4960ef">events</a></td></tr>
+<tr class="separator:ac9b2f2c5b1f9a7487eb57e67cd4960ef"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:aafb457d11cac415faf0e1e2b825118c2"><td class="memItemLeft" align="right" valign="top">short </td><td class="memItemRight" valign="bottom"><a class="el" href="structpollfd.html#aafb457d11cac415faf0e1e2b825118c2">revents</a></td></tr>
+<tr class="separator:aafb457d11cac415faf0e1e2b825118c2"><td class="memSeparator" colspan="2"> </td></tr>
+</table>
+<h2 class="groupheader">Field Documentation</h2>
+<a class="anchor" id="ac9b2f2c5b1f9a7487eb57e67cd4960ef"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">short pollfd::events</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>which POLL... events to respond to </p>
+
+</div>
+</div>
+<a class="anchor" id="af084f089bdece61d177f85782d6673d0"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">lws_sockfd_type pollfd::fd</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>fd related to </p>
+
+</div>
+</div>
+<a class="anchor" id="aafb457d11cac415faf0e1e2b825118c2"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">short pollfd::revents</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>which POLL... events occurred </p>
+
+</div>
+</div>
+<hr/>The documentation for this struct was generated from the following file:<ul>
+<li>lib/<a class="el" href="libwebsockets_8h_source.html">libwebsockets.h</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="structpollfd.html">pollfd</a></li>
+ <li class="footer">Generated by
+ <a href="http://www.doxygen.org/index.html">
+ <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.11 </li>
+ </ul>
+</div>
+</body>
+</html>
--- /dev/null
+var structpollfd =
+[
+ [ "events", "structpollfd.html#ac9b2f2c5b1f9a7487eb57e67cd4960ef", null ],
+ [ "fd", "structpollfd.html#af084f089bdece61d177f85782d6673d0", null ],
+ [ "revents", "structpollfd.html#aafb457d11cac415faf0e1e2b825118c2", null ]
+];
\ No newline at end of file
--- /dev/null
+.tabs, .tabs2, .tabs3 {
+ background-image: url('tab_b.png');
+ width: 100%;
+ z-index: 101;
+ font-size: 13px;
+ font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif;
+}
+
+.tabs2 {
+ font-size: 10px;
+}
+.tabs3 {
+ font-size: 9px;
+}
+
+.tablist {
+ margin: 0;
+ padding: 0;
+ display: table;
+}
+
+.tablist li {
+ float: left;
+ display: table-cell;
+ background-image: url('tab_b.png');
+ line-height: 36px;
+ list-style: none;
+}
+
+.tablist a {
+ display: block;
+ padding: 0 20px;
+ font-weight: bold;
+ background-image:url('tab_s.png');
+ background-repeat:no-repeat;
+ background-position:right;
+ color: #283A5D;
+ text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9);
+ text-decoration: none;
+ outline: none;
+}
+
+.tabs3 .tablist a {
+ padding: 0 10px;
+}
+
+.tablist a:hover {
+ background-image: url('tab_h.png');
+ background-repeat:repeat-x;
+ color: #fff;
+ text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0);
+ text-decoration: none;
+}
+
+.tablist li.current a {
+ background-image: url('tab_a.png');
+ background-repeat:repeat-x;
+ color: #fff;
+ text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0);
+}
--- /dev/null
+\section{Data Structures}
+Here are the data structures with brief descriptions\+:\begin{DoxyCompactList}
+\item\contentsline{section}{\hyperlink{structlws__cgi__args}{lws\+\_\+cgi\+\_\+args} }{\pageref{structlws__cgi__args}}{}
+\item\contentsline{section}{\hyperlink{structlws__client__connect__info}{lws\+\_\+client\+\_\+connect\+\_\+info} }{\pageref{structlws__client__connect__info}}{}
+\item\contentsline{section}{\hyperlink{classlws__conn}{lws\+\_\+conn} }{\pageref{classlws__conn}}{}
+\item\contentsline{section}{\hyperlink{classlws__conn__listener}{lws\+\_\+conn\+\_\+listener} }{\pageref{classlws__conn__listener}}{}
+\item\contentsline{section}{\hyperlink{structlws__context__creation__info}{lws\+\_\+context\+\_\+creation\+\_\+info} }{\pageref{structlws__context__creation__info}}{}
+\item\contentsline{section}{\hyperlink{structlws__email}{lws\+\_\+email} }{\pageref{structlws__email}}{}
+\item\contentsline{section}{\hyperlink{structlws__ext__option__arg}{lws\+\_\+ext\+\_\+option\+\_\+arg} }{\pageref{structlws__ext__option__arg}}{}
+\item\contentsline{section}{\hyperlink{structlws__ext__options}{lws\+\_\+ext\+\_\+options} }{\pageref{structlws__ext__options}}{}
+\item\contentsline{section}{\hyperlink{structlws__extension}{lws\+\_\+extension} }{\pageref{structlws__extension}}{}
+\item\contentsline{section}{\hyperlink{structlws__gs__event__args}{lws\+\_\+gs\+\_\+event\+\_\+args} }{\pageref{structlws__gs__event__args}}{}
+\item\contentsline{section}{\hyperlink{structlws__http__mount}{lws\+\_\+http\+\_\+mount} }{\pageref{structlws__http__mount}}{}
+\item\contentsline{section}{\hyperlink{structlws__plat__file__ops}{lws\+\_\+plat\+\_\+file\+\_\+ops} }{\pageref{structlws__plat__file__ops}}{}
+\item\contentsline{section}{\hyperlink{structlws__plugin}{lws\+\_\+plugin} }{\pageref{structlws__plugin}}{}
+\item\contentsline{section}{\hyperlink{structlws__plugin__capability}{lws\+\_\+plugin\+\_\+capability} }{\pageref{structlws__plugin__capability}}{}
+\item\contentsline{section}{\hyperlink{structlws__polarssl__context}{lws\+\_\+polarssl\+\_\+context} }{\pageref{structlws__polarssl__context}}{}
+\item\contentsline{section}{\hyperlink{structlws__pollargs}{lws\+\_\+pollargs} }{\pageref{structlws__pollargs}}{}
+\item\contentsline{section}{\hyperlink{structlws__pollfd}{lws\+\_\+pollfd} }{\pageref{structlws__pollfd}}{}
+\item\contentsline{section}{\hyperlink{structlws__process__html__args}{lws\+\_\+process\+\_\+html\+\_\+args} }{\pageref{structlws__process__html__args}}{}
+\item\contentsline{section}{\hyperlink{structlws__process__html__state}{lws\+\_\+process\+\_\+html\+\_\+state} }{\pageref{structlws__process__html__state}}{}
+\item\contentsline{section}{\hyperlink{structlws__protocol__vhost__options}{lws\+\_\+protocol\+\_\+vhost\+\_\+options} }{\pageref{structlws__protocol__vhost__options}}{}
+\item\contentsline{section}{\hyperlink{structlws__protocols}{lws\+\_\+protocols} }{\pageref{structlws__protocols}}{}
+\item\contentsline{section}{\hyperlink{structlws__session__info}{lws\+\_\+session\+\_\+info} }{\pageref{structlws__session__info}}{}
+\item\contentsline{section}{\hyperlink{structlws__token__limits}{lws\+\_\+token\+\_\+limits} }{\pageref{structlws__token__limits}}{}
+\item\contentsline{section}{\hyperlink{structlws__tokens}{lws\+\_\+tokens} }{\pageref{structlws__tokens}}{}
+\item\contentsline{section}{\hyperlink{structlwsgw__hash}{lwsgw\+\_\+hash} }{\pageref{structlwsgw__hash}}{}
+\item\contentsline{section}{\hyperlink{structlwsgw__hash__bin}{lwsgw\+\_\+hash\+\_\+bin} }{\pageref{structlwsgw__hash__bin}}{}
+\item\contentsline{section}{\hyperlink{structpollfd}{pollfd} }{\pageref{structpollfd}}{}
+\end{DoxyCompactList}
--- /dev/null
+%!PS-Adobe-2.0 EPSF-2.0
+%%Title: ClassName
+%%Creator: Doxygen
+%%CreationDate: Time
+%%For:
+%Magnification: 1.00
+%%Orientation: Portrait
+%%BoundingBox: 0 0 500 330.578512
+%%Pages: 0
+%%BeginSetup
+%%EndSetup
+%%EndComments
+
+% ----- variables -----
+
+/boxwidth 0 def
+/boxheight 40 def
+/fontheight 24 def
+/marginwidth 10 def
+/distx 20 def
+/disty 40 def
+/boundaspect 1.512500 def % aspect ratio of the BoundingBox (width/height)
+/boundx 500 def
+/boundy boundx boundaspect div def
+/xspacing 0 def
+/yspacing 0 def
+/rows 2 def
+/cols 1 def
+/scalefactor 0 def
+/boxfont /Times-Roman findfont fontheight scalefont def
+
+% ----- procedures -----
+
+/dotted { [1 4] 0 setdash } def
+/dashed { [5] 0 setdash } def
+/solid { [] 0 setdash } def
+
+/max % result = MAX(arg1,arg2)
+{
+ /a exch def
+ /b exch def
+ a b gt {a} {b} ifelse
+} def
+
+/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2)
+{
+ 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max
+} def
+
+/cw % boxwidth = MAX(boxwidth, stringwidth(arg1))
+{
+ /str exch def
+ /boxwidth boxwidth str stringwidth pop max def
+} def
+
+/box % draws a box with text `arg1' at grid pos (arg2,arg3)
+{ gsave
+ 2 setlinewidth
+ newpath
+ exch xspacing mul xoffset add
+ exch yspacing mul
+ moveto
+ boxwidth 0 rlineto
+ 0 boxheight rlineto
+ boxwidth neg 0 rlineto
+ 0 boxheight neg rlineto
+ closepath
+ dup stringwidth pop neg boxwidth add 2 div
+ boxheight fontheight 2 div sub 2 div
+ rmoveto show stroke
+ grestore
+} def
+
+/mark
+{ newpath
+ exch xspacing mul xoffset add boxwidth add
+ exch yspacing mul
+ moveto
+ 0 boxheight 4 div rlineto
+ boxheight neg 4 div boxheight neg 4 div rlineto
+ closepath
+ eofill
+ stroke
+} def
+
+/arrow
+{ newpath
+ moveto
+ 3 -8 rlineto
+ -6 0 rlineto
+ 3 8 rlineto
+ closepath
+ eofill
+ stroke
+} def
+
+/out % draws an output connector for the block at (arg1,arg2)
+{
+ newpath
+ exch xspacing mul xoffset add boxwidth 2 div add
+ exch yspacing mul boxheight add
+ /y exch def
+ /x exch def
+ x y moveto
+ 0 disty 2 div rlineto
+ stroke
+ 1 eq { x y disty 2 div add arrow } if
+} def
+
+/in % draws an input connector for the block at (arg1,arg2)
+{
+ newpath
+ exch xspacing mul xoffset add boxwidth 2 div add
+ exch yspacing mul disty 2 div sub
+ /y exch def
+ /x exch def
+ x y moveto
+ 0 disty 2 div rlineto
+ stroke
+ 1 eq { x y disty 2 div add arrow } if
+} def
+
+/hedge
+{
+ exch xspacing mul xoffset add boxwidth 2 div add
+ exch yspacing mul boxheight 2 div sub
+ /y exch def
+ /x exch def
+ newpath
+ x y moveto
+ boxwidth 2 div distx add 0 rlineto
+ stroke
+ 1 eq
+ { newpath x boxwidth 2 div distx add add y moveto
+ -8 3 rlineto
+ 0 -6 rlineto
+ 8 3 rlineto
+ closepath
+ eofill
+ stroke
+ } if
+} def
+
+/vedge
+{
+ /ye exch def
+ /ys exch def
+ /xs exch def
+ newpath
+ xs xspacing mul xoffset add boxwidth 2 div add dup
+ ys yspacing mul boxheight 2 div sub
+ moveto
+ ye yspacing mul boxheight 2 div sub
+ lineto
+ stroke
+} def
+
+/conn % connections the blocks from col `arg1' to `arg2' of row `arg3'
+{
+ /ys exch def
+ /xe exch def
+ /xs exch def
+ newpath
+ xs xspacing mul xoffset add boxwidth 2 div add
+ ys yspacing mul disty 2 div sub
+ moveto
+ xspacing xe xs sub mul 0
+ rlineto
+ stroke
+} def
+
+% ----- main ------
+
+boxfont setfont
+1 boundaspect scale
+(lws_conn) cw
+(lws_conn_listener) cw
+/boxwidth boxwidth marginwidth 2 mul add def
+/xspacing boxwidth distx add def
+/yspacing boxheight disty add def
+/scalefactor
+ boxwidth cols mul distx cols 1 sub mul add
+ boxheight rows mul disty rows 1 sub mul add boundaspect mul
+ max def
+boundx scalefactor div boundy scalefactor div scale
+
+% ----- classes -----
+
+ (lws_conn) 0.000000 1.000000 box
+ (lws_conn_listener) 0.000000 0.000000 box
+
+% ----- relations -----
+
+dotted
+1 0.000000 0.250000 out
+dotted
+0 0.000000 0.750000 in
--- /dev/null
+\hypertarget{classlws__conn}{}\section{lws\+\_\+conn Class Reference}
+\label{classlws__conn}\index{lws\+\_\+conn@{lws\+\_\+conn}}
+Inheritance diagram for lws\+\_\+conn\+:\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[height=2.000000cm]{classlws__conn}
+\end{center}
+\end{figure}
+\subsection*{Public Member Functions}
+\begin{DoxyCompactItemize}
+\item
+void {\bfseries set\+\_\+wsi} (struct lws $\ast$\+\_\+wsi)\hypertarget{classlws__conn_afe73e53da2070f659ad6e7fd14878c7e}{}\label{classlws__conn_afe73e53da2070f659ad6e7fd14878c7e}
+
+\item
+int {\bfseries actual\+\_\+on\+RX} (Socket $\ast$s)\hypertarget{classlws__conn_aef530971372f55e862f2e09bc98f1029}{}\label{classlws__conn_aef530971372f55e862f2e09bc98f1029}
+
+\item
+void {\bfseries on\+RX} (Socket $\ast$s)\hypertarget{classlws__conn_aba42bdd763a36c3a331b62410969b6ba}{}\label{classlws__conn_aba42bdd763a36c3a331b62410969b6ba}
+
+\item
+void {\bfseries on\+Error} (Socket $\ast$s, socket\+\_\+error\+\_\+t err)\hypertarget{classlws__conn_a4fb477fad697ce1faf8ec7a884ea6c6b}{}\label{classlws__conn_a4fb477fad697ce1faf8ec7a884ea6c6b}
+
+\item
+void {\bfseries on\+Disconnect} (T\+C\+P\+Stream $\ast$s)\hypertarget{classlws__conn_a49f87612c6a3098cd1587f8382b8c85b}{}\label{classlws__conn_a49f87612c6a3098cd1587f8382b8c85b}
+
+\item
+void {\bfseries on\+Sent} (Socket $\ast$s, uint16\+\_\+t len)\hypertarget{classlws__conn_aad7d2406618e560114650a91c729a596}{}\label{classlws__conn_aad7d2406618e560114650a91c729a596}
+
+\item
+void {\bfseries serialized\+\_\+writeable} (struct lws $\ast$wsi)\hypertarget{classlws__conn_accc57581269c554291dac840ed135231}{}\label{classlws__conn_accc57581269c554291dac840ed135231}
+
+\end{DoxyCompactItemize}
+\subsection*{Data Fields}
+\begin{DoxyCompactItemize}
+\item
+T\+C\+P\+Stream $\ast$ {\bfseries ts}\hypertarget{classlws__conn_a5cad031b6b779da42b37f4007cae541b}{}\label{classlws__conn_a5cad031b6b779da42b37f4007cae541b}
+
+\item
+struct lws $\ast$ {\bfseries wsi}\hypertarget{classlws__conn_a7e504bd449ffb51c7ab1d2126613ebc3}{}\label{classlws__conn_a7e504bd449ffb51c7ab1d2126613ebc3}
+
+\item
+char {\bfseries writeable}\hypertarget{classlws__conn_a8e1fdd467b7f66fc438dc70ae979b938}{}\label{classlws__conn_a8e1fdd467b7f66fc438dc70ae979b938}
+
+\item
+char {\bfseries awaiting\+\_\+on\+\_\+writeable}\hypertarget{classlws__conn_a5226010afdf5421f279454e5cbb282a4}{}\label{classlws__conn_a5226010afdf5421f279454e5cbb282a4}
+
+\end{DoxyCompactItemize}
+
+
+The documentation for this class was generated from the following file\+:\begin{DoxyCompactItemize}
+\item
+lib/\hyperlink{libwebsockets_8h}{libwebsockets.\+h}\end{DoxyCompactItemize}
--- /dev/null
+%!PS-Adobe-2.0 EPSF-2.0
+%%Title: ClassName
+%%Creator: Doxygen
+%%CreationDate: Time
+%%For:
+%Magnification: 1.00
+%%Orientation: Portrait
+%%BoundingBox: 0 0 500 330.578512
+%%Pages: 0
+%%BeginSetup
+%%EndSetup
+%%EndComments
+
+% ----- variables -----
+
+/boxwidth 0 def
+/boxheight 40 def
+/fontheight 24 def
+/marginwidth 10 def
+/distx 20 def
+/disty 40 def
+/boundaspect 1.512500 def % aspect ratio of the BoundingBox (width/height)
+/boundx 500 def
+/boundy boundx boundaspect div def
+/xspacing 0 def
+/yspacing 0 def
+/rows 2 def
+/cols 1 def
+/scalefactor 0 def
+/boxfont /Times-Roman findfont fontheight scalefont def
+
+% ----- procedures -----
+
+/dotted { [1 4] 0 setdash } def
+/dashed { [5] 0 setdash } def
+/solid { [] 0 setdash } def
+
+/max % result = MAX(arg1,arg2)
+{
+ /a exch def
+ /b exch def
+ a b gt {a} {b} ifelse
+} def
+
+/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2)
+{
+ 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max
+} def
+
+/cw % boxwidth = MAX(boxwidth, stringwidth(arg1))
+{
+ /str exch def
+ /boxwidth boxwidth str stringwidth pop max def
+} def
+
+/box % draws a box with text `arg1' at grid pos (arg2,arg3)
+{ gsave
+ 2 setlinewidth
+ newpath
+ exch xspacing mul xoffset add
+ exch yspacing mul
+ moveto
+ boxwidth 0 rlineto
+ 0 boxheight rlineto
+ boxwidth neg 0 rlineto
+ 0 boxheight neg rlineto
+ closepath
+ dup stringwidth pop neg boxwidth add 2 div
+ boxheight fontheight 2 div sub 2 div
+ rmoveto show stroke
+ grestore
+} def
+
+/mark
+{ newpath
+ exch xspacing mul xoffset add boxwidth add
+ exch yspacing mul
+ moveto
+ 0 boxheight 4 div rlineto
+ boxheight neg 4 div boxheight neg 4 div rlineto
+ closepath
+ eofill
+ stroke
+} def
+
+/arrow
+{ newpath
+ moveto
+ 3 -8 rlineto
+ -6 0 rlineto
+ 3 8 rlineto
+ closepath
+ eofill
+ stroke
+} def
+
+/out % draws an output connector for the block at (arg1,arg2)
+{
+ newpath
+ exch xspacing mul xoffset add boxwidth 2 div add
+ exch yspacing mul boxheight add
+ /y exch def
+ /x exch def
+ x y moveto
+ 0 disty 2 div rlineto
+ stroke
+ 1 eq { x y disty 2 div add arrow } if
+} def
+
+/in % draws an input connector for the block at (arg1,arg2)
+{
+ newpath
+ exch xspacing mul xoffset add boxwidth 2 div add
+ exch yspacing mul disty 2 div sub
+ /y exch def
+ /x exch def
+ x y moveto
+ 0 disty 2 div rlineto
+ stroke
+ 1 eq { x y disty 2 div add arrow } if
+} def
+
+/hedge
+{
+ exch xspacing mul xoffset add boxwidth 2 div add
+ exch yspacing mul boxheight 2 div sub
+ /y exch def
+ /x exch def
+ newpath
+ x y moveto
+ boxwidth 2 div distx add 0 rlineto
+ stroke
+ 1 eq
+ { newpath x boxwidth 2 div distx add add y moveto
+ -8 3 rlineto
+ 0 -6 rlineto
+ 8 3 rlineto
+ closepath
+ eofill
+ stroke
+ } if
+} def
+
+/vedge
+{
+ /ye exch def
+ /ys exch def
+ /xs exch def
+ newpath
+ xs xspacing mul xoffset add boxwidth 2 div add dup
+ ys yspacing mul boxheight 2 div sub
+ moveto
+ ye yspacing mul boxheight 2 div sub
+ lineto
+ stroke
+} def
+
+/conn % connections the blocks from col `arg1' to `arg2' of row `arg3'
+{
+ /ys exch def
+ /xe exch def
+ /xs exch def
+ newpath
+ xs xspacing mul xoffset add boxwidth 2 div add
+ ys yspacing mul disty 2 div sub
+ moveto
+ xspacing xe xs sub mul 0
+ rlineto
+ stroke
+} def
+
+% ----- main ------
+
+boxfont setfont
+1 boundaspect scale
+(lws_conn_listener) cw
+(lws_conn) cw
+/boxwidth boxwidth marginwidth 2 mul add def
+/xspacing boxwidth distx add def
+/yspacing boxheight disty add def
+/scalefactor
+ boxwidth cols mul distx cols 1 sub mul add
+ boxheight rows mul disty rows 1 sub mul add boundaspect mul
+ max def
+boundx scalefactor div boundy scalefactor div scale
+
+% ----- classes -----
+
+ (lws_conn_listener) 0.000000 0.000000 box
+ (lws_conn) 0.000000 1.000000 box
+
+% ----- relations -----
+
+dotted
+0 0.000000 0.000000 out
+dotted
+1 0.000000 1.000000 in
--- /dev/null
+\hypertarget{classlws__conn__listener}{}\section{lws\+\_\+conn\+\_\+listener Class Reference}
+\label{classlws__conn__listener}\index{lws\+\_\+conn\+\_\+listener@{lws\+\_\+conn\+\_\+listener}}
+Inheritance diagram for lws\+\_\+conn\+\_\+listener\+:\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[height=2.000000cm]{classlws__conn__listener}
+\end{center}
+\end{figure}
+\subsection*{Public Member Functions}
+\begin{DoxyCompactItemize}
+\item
+void \hyperlink{classlws__conn__listener_a3c19c314f2ea2b758407b4041e4c4010}{start} (const uint16\+\_\+t port)
+\end{DoxyCompactItemize}
+\subsection*{Data Fields}
+\begin{DoxyCompactItemize}
+\item
+T\+C\+P\+Listener {\bfseries srv}\hypertarget{classlws__conn__listener_aa7076f8965bb9df268798fd9a0283374}{}\label{classlws__conn__listener_aa7076f8965bb9df268798fd9a0283374}
+
+\end{DoxyCompactItemize}
+\subsection*{Protected Member Functions}
+\begin{DoxyCompactItemize}
+\item
+void \hyperlink{classlws__conn__listener_ab3bc839797ba14554ac70ad09fd155c7}{on\+RX} (Socket $\ast$s)
+\item
+void \hyperlink{classlws__conn__listener_a271ac4f8ad5770b3bc96cce5b265b72c}{on\+Error} (Socket $\ast$s, socket\+\_\+error\+\_\+t err)
+\item
+void \hyperlink{classlws__conn__listener_ab432a456c3a961ec562e06141897806b}{on\+Incoming} (T\+C\+P\+Listener $\ast$s, void $\ast$impl)
+\item
+void \hyperlink{classlws__conn__listener_aab3c7bf550a8f15d20f1e093125c2e60}{on\+Disconnect} (T\+C\+P\+Stream $\ast$s)
+\end{DoxyCompactItemize}
+
+
+\subsection{Member Function Documentation}
+\index{lws\+\_\+conn\+\_\+listener@{lws\+\_\+conn\+\_\+listener}!on\+Disconnect@{on\+Disconnect}}
+\index{on\+Disconnect@{on\+Disconnect}!lws\+\_\+conn\+\_\+listener@{lws\+\_\+conn\+\_\+listener}}
+\subsubsection[{\texorpdfstring{on\+Disconnect(\+T\+C\+P\+Stream $\ast$s)}{onDisconnect(TCPStream *s)}}]{\setlength{\rightskip}{0pt plus 5cm}void lws\+\_\+conn\+\_\+listener\+::on\+Disconnect (
+\begin{DoxyParamCaption}
+\item[{T\+C\+P\+Stream $\ast$}]{s}
+\end{DoxyParamCaption}
+)\hspace{0.3cm}{\ttfamily [protected]}}\hypertarget{classlws__conn__listener_aab3c7bf550a8f15d20f1e093125c2e60}{}\label{classlws__conn__listener_aab3c7bf550a8f15d20f1e093125c2e60}
+disconnection \index{lws\+\_\+conn\+\_\+listener@{lws\+\_\+conn\+\_\+listener}!on\+Error@{on\+Error}}
+\index{on\+Error@{on\+Error}!lws\+\_\+conn\+\_\+listener@{lws\+\_\+conn\+\_\+listener}}
+\subsubsection[{\texorpdfstring{on\+Error(\+Socket $\ast$s, socket\+\_\+error\+\_\+t err)}{onError(Socket *s, socket\_error\_t err)}}]{\setlength{\rightskip}{0pt plus 5cm}void lws\+\_\+conn\+\_\+listener\+::on\+Error (
+\begin{DoxyParamCaption}
+\item[{Socket $\ast$}]{s, }
+\item[{socket\+\_\+error\+\_\+t}]{err}
+\end{DoxyParamCaption}
+)\hspace{0.3cm}{\ttfamily [protected]}}\hypertarget{classlws__conn__listener_a271ac4f8ad5770b3bc96cce5b265b72c}{}\label{classlws__conn__listener_a271ac4f8ad5770b3bc96cce5b265b72c}
+if error occurs \index{lws\+\_\+conn\+\_\+listener@{lws\+\_\+conn\+\_\+listener}!on\+Incoming@{on\+Incoming}}
+\index{on\+Incoming@{on\+Incoming}!lws\+\_\+conn\+\_\+listener@{lws\+\_\+conn\+\_\+listener}}
+\subsubsection[{\texorpdfstring{on\+Incoming(\+T\+C\+P\+Listener $\ast$s, void $\ast$impl)}{onIncoming(TCPListener *s, void *impl)}}]{\setlength{\rightskip}{0pt plus 5cm}void lws\+\_\+conn\+\_\+listener\+::on\+Incoming (
+\begin{DoxyParamCaption}
+\item[{T\+C\+P\+Listener $\ast$}]{s, }
+\item[{void $\ast$}]{impl}
+\end{DoxyParamCaption}
+)\hspace{0.3cm}{\ttfamily [protected]}}\hypertarget{classlws__conn__listener_ab432a456c3a961ec562e06141897806b}{}\label{classlws__conn__listener_ab432a456c3a961ec562e06141897806b}
+new connection \index{lws\+\_\+conn\+\_\+listener@{lws\+\_\+conn\+\_\+listener}!on\+RX@{on\+RX}}
+\index{on\+RX@{on\+RX}!lws\+\_\+conn\+\_\+listener@{lws\+\_\+conn\+\_\+listener}}
+\subsubsection[{\texorpdfstring{on\+R\+X(\+Socket $\ast$s)}{onRX(Socket *s)}}]{\setlength{\rightskip}{0pt plus 5cm}void lws\+\_\+conn\+\_\+listener\+::on\+RX (
+\begin{DoxyParamCaption}
+\item[{Socket $\ast$}]{s}
+\end{DoxyParamCaption}
+)\hspace{0.3cm}{\ttfamily [protected]}}\hypertarget{classlws__conn__listener_ab3bc839797ba14554ac70ad09fd155c7}{}\label{classlws__conn__listener_ab3bc839797ba14554ac70ad09fd155c7}
+incoming data ready \index{lws\+\_\+conn\+\_\+listener@{lws\+\_\+conn\+\_\+listener}!start@{start}}
+\index{start@{start}!lws\+\_\+conn\+\_\+listener@{lws\+\_\+conn\+\_\+listener}}
+\subsubsection[{\texorpdfstring{start(const uint16\+\_\+t port)}{start(const uint16\_t port)}}]{\setlength{\rightskip}{0pt plus 5cm}void lws\+\_\+conn\+\_\+listener\+::start (
+\begin{DoxyParamCaption}
+\item[{const uint16\+\_\+t}]{port}
+\end{DoxyParamCaption}
+)}\hypertarget{classlws__conn__listener_a3c19c314f2ea2b758407b4041e4c4010}{}\label{classlws__conn__listener_a3c19c314f2ea2b758407b4041e4c4010}
+start listening
+
+The documentation for this class was generated from the following file\+:\begin{DoxyCompactItemize}
+\item
+lib/\hyperlink{libwebsockets_8h}{libwebsockets.\+h}\end{DoxyCompactItemize}
--- /dev/null
+
+\begin{DoxyRefList}
+\item[\label{deprecated__deprecated000002}%
+\hypertarget{deprecated__deprecated000002}{}%
+Global \hyperlink{group__client_ga4af0a20108a95e8b6d94dd4d80055ff3}{lws\+\_\+client\+\_\+connect} (struct lws\+\_\+context $\ast$clients, const char $\ast$address, int port, int ssl\+\_\+connection, const char $\ast$path, const char $\ast$host, const char $\ast$origin, const char $\ast$protocol, int ietf\+\_\+version\+\_\+or\+\_\+minus\+\_\+one) L\+W\+S\+\_\+\+W\+A\+R\+N\+\_\+\+D\+E\+P\+R\+E\+C\+A\+T\+ED]D\+E\+P\+R\+E\+C\+A\+T\+ED use lws\+\_\+client\+\_\+connect\+\_\+via\+\_\+info
+\item[\label{deprecated__deprecated000003}%
+\hypertarget{deprecated__deprecated000003}{}%
+Global \hyperlink{group__client_gac6a8558b4410961a880241c2ac1271e2}{lws\+\_\+client\+\_\+connect\+\_\+extended} (struct lws\+\_\+context $\ast$clients, const char $\ast$address, int port, int ssl\+\_\+connection, const char $\ast$path, const char $\ast$host, const char $\ast$origin, const char $\ast$protocol, int ietf\+\_\+version\+\_\+or\+\_\+minus\+\_\+one, void $\ast$userdata) L\+W\+S\+\_\+\+W\+A\+R\+N\+\_\+\+D\+E\+P\+R\+E\+C\+A\+T\+ED]D\+E\+P\+R\+E\+C\+A\+T\+ED use lws\+\_\+client\+\_\+connect\+\_\+via\+\_\+info
+\item[\label{deprecated__deprecated000001}%
+\hypertarget{deprecated__deprecated000001}{}%
+Global \hyperlink{group__context-and-vhost_ga8db03e19a372e34ac25cf21af894a02c}{lws\+\_\+vhost\+\_\+get} (struct lws $\ast$wsi) L\+W\+S\+\_\+\+W\+A\+R\+N\+\_\+\+D\+E\+P\+R\+E\+C\+A\+T\+ED]deprecated\+: use \hyperlink{group__context-and-vhost_ga06e77ce2916f8bc9826ef8d9d68e3932}{lws\+\_\+get\+\_\+vhost()}
+\end{DoxyRefList}
\ No newline at end of file
--- /dev/null
+\hypertarget{dir_97aefd0d527b934f1d99a682da8fe6a9}{}\section{lib Directory Reference}
+\label{dir_97aefd0d527b934f1d99a682da8fe6a9}\index{lib Directory Reference@{lib Directory Reference}}
+\subsection*{Files}
+\begin{DoxyCompactItemize}
+\item
+file \hyperlink{libwebsockets_8h}{libwebsockets.\+h}
+\end{DoxyCompactItemize}
--- /dev/null
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{doxygen}
+
+% Packages used by this style file
+\RequirePackage{alltt}
+\RequirePackage{array}
+\RequirePackage{calc}
+\RequirePackage{float}
+\RequirePackage{ifthen}
+\RequirePackage{verbatim}
+\RequirePackage[table]{xcolor}
+\RequirePackage{longtable}
+\RequirePackage{tabu}
+\RequirePackage{tabularx}
+\RequirePackage{multirow}
+
+%---------- Internal commands used in this style file ----------------
+
+\newcommand{\ensurespace}[1]{%
+ \begingroup%
+ \setlength{\dimen@}{#1}%
+ \vskip\z@\@plus\dimen@%
+ \penalty -100\vskip\z@\@plus -\dimen@%
+ \vskip\dimen@%
+ \penalty 9999%
+ \vskip -\dimen@%
+ \vskip\z@skip% hide the previous |\vskip| from |\addvspace|
+ \endgroup%
+}
+
+\newcommand{\DoxyLabelFont}{}
+\newcommand{\entrylabel}[1]{%
+ {%
+ \parbox[b]{\labelwidth-4pt}{%
+ \makebox[0pt][l]{\DoxyLabelFont#1}%
+ \vspace{1.5\baselineskip}%
+ }%
+ }%
+}
+
+\newenvironment{DoxyDesc}[1]{%
+ \ensurespace{4\baselineskip}%
+ \begin{list}{}{%
+ \settowidth{\labelwidth}{20pt}%
+ \setlength{\parsep}{0pt}%
+ \setlength{\itemsep}{0pt}%
+ \setlength{\leftmargin}{\labelwidth+\labelsep}%
+ \renewcommand{\makelabel}{\entrylabel}%
+ }%
+ \item[#1]%
+}{%
+ \end{list}%
+}
+
+\newsavebox{\xrefbox}
+\newlength{\xreflength}
+\newcommand{\xreflabel}[1]{%
+ \sbox{\xrefbox}{#1}%
+ \setlength{\xreflength}{\wd\xrefbox}%
+ \ifthenelse{\xreflength>\labelwidth}{%
+ \begin{minipage}{\textwidth}%
+ \setlength{\parindent}{0pt}%
+ \hangindent=15pt\bfseries #1\vspace{1.2\itemsep}%
+ \end{minipage}%
+ }{%
+ \parbox[b]{\labelwidth}{\makebox[0pt][l]{\textbf{#1}}}%
+ }%
+}
+
+%---------- Commands used by doxygen LaTeX output generator ----------
+
+% Used by <pre> ... </pre>
+\newenvironment{DoxyPre}{%
+ \small%
+ \begin{alltt}%
+}{%
+ \end{alltt}%
+ \normalsize%
+}
+
+% Used by @code ... @endcode
+\newenvironment{DoxyCode}{%
+ \par%
+ \scriptsize%
+ \begin{alltt}%
+}{%
+ \end{alltt}%
+ \normalsize%
+}
+
+% Used by @example, @include, @includelineno and @dontinclude
+\newenvironment{DoxyCodeInclude}{%
+ \DoxyCode%
+}{%
+ \endDoxyCode%
+}
+
+% Used by @verbatim ... @endverbatim
+\newenvironment{DoxyVerb}{%
+ \footnotesize%
+ \verbatim%
+}{%
+ \endverbatim%
+ \normalsize%
+}
+
+% Used by @verbinclude
+\newenvironment{DoxyVerbInclude}{%
+ \DoxyVerb%
+}{%
+ \endDoxyVerb%
+}
+
+% Used by numbered lists (using '-#' or <ol> ... </ol>)
+\newenvironment{DoxyEnumerate}{%
+ \enumerate%
+}{%
+ \endenumerate%
+}
+
+% Used by bullet lists (using '-', @li, @arg, or <ul> ... </ul>)
+\newenvironment{DoxyItemize}{%
+ \itemize%
+}{%
+ \enditemize%
+}
+
+% Used by description lists (using <dl> ... </dl>)
+\newenvironment{DoxyDescription}{%
+ \description%
+}{%
+ \enddescription%
+}
+
+% Used by @image, @dotfile, @dot ... @enddot, and @msc ... @endmsc
+% (only if caption is specified)
+\newenvironment{DoxyImage}{%
+ \begin{figure}[H]%
+ \begin{center}%
+}{%
+ \end{center}%
+ \end{figure}%
+}
+
+% Used by @image, @dotfile, @dot ... @enddot, and @msc ... @endmsc
+% (only if no caption is specified)
+\newenvironment{DoxyImageNoCaption}{%
+ \begin{center}%
+}{%
+ \end{center}%
+}
+
+% Used by @attention
+\newenvironment{DoxyAttention}[1]{%
+ \begin{DoxyDesc}{#1}%
+}{%
+ \end{DoxyDesc}%
+}
+
+% Used by @author and @authors
+\newenvironment{DoxyAuthor}[1]{%
+ \begin{DoxyDesc}{#1}%
+}{%
+ \end{DoxyDesc}%
+}
+
+% Used by @date
+\newenvironment{DoxyDate}[1]{%
+ \begin{DoxyDesc}{#1}%
+}{%
+ \end{DoxyDesc}%
+}
+
+% Used by @invariant
+\newenvironment{DoxyInvariant}[1]{%
+ \begin{DoxyDesc}{#1}%
+}{%
+ \end{DoxyDesc}%
+}
+
+% Used by @note
+\newenvironment{DoxyNote}[1]{%
+ \begin{DoxyDesc}{#1}%
+}{%
+ \end{DoxyDesc}%
+}
+
+% Used by @post
+\newenvironment{DoxyPostcond}[1]{%
+ \begin{DoxyDesc}{#1}%
+}{%
+ \end{DoxyDesc}%
+}
+
+% Used by @pre
+\newenvironment{DoxyPrecond}[1]{%
+ \begin{DoxyDesc}{#1}%
+}{%
+ \end{DoxyDesc}%
+}
+
+% Used by @copyright
+\newenvironment{DoxyCopyright}[1]{%
+ \begin{DoxyDesc}{#1}%
+}{%
+ \end{DoxyDesc}%
+}
+
+% Used by @remark
+\newenvironment{DoxyRemark}[1]{%
+ \begin{DoxyDesc}{#1}%
+}{%
+ \end{DoxyDesc}%
+}
+
+% Used by @return and @returns
+\newenvironment{DoxyReturn}[1]{%
+ \begin{DoxyDesc}{#1}%
+}{%
+ \end{DoxyDesc}%
+}
+
+% Used by @since
+\newenvironment{DoxySince}[1]{%
+ \begin{DoxyDesc}{#1}%
+}{%
+ \end{DoxyDesc}%
+}
+
+% Used by @see
+\newenvironment{DoxySeeAlso}[1]{%
+ \begin{DoxyDesc}{#1}%
+}{%
+ \end{DoxyDesc}%
+}
+
+% Used by @version
+\newenvironment{DoxyVersion}[1]{%
+ \begin{DoxyDesc}{#1}%
+}{%
+ \end{DoxyDesc}%
+}
+
+% Used by @warning
+\newenvironment{DoxyWarning}[1]{%
+ \begin{DoxyDesc}{#1}%
+}{%
+ \end{DoxyDesc}%
+}
+
+% Used by @internal
+\newenvironment{DoxyInternal}[1]{%
+ \paragraph*{#1}%
+}{%
+}
+
+% Used by @par and @paragraph
+\newenvironment{DoxyParagraph}[1]{%
+ \begin{list}{}{%
+ \settowidth{\labelwidth}{40pt}%
+ \setlength{\leftmargin}{\labelwidth}%
+ \setlength{\parsep}{0pt}%
+ \setlength{\itemsep}{-4pt}%
+ \renewcommand{\makelabel}{\entrylabel}%
+ }%
+ \item[#1]%
+}{%
+ \end{list}%
+}
+
+% Used by parameter lists
+\newenvironment{DoxyParams}[2][]{%
+ \tabulinesep=1mm%
+ \par%
+ \ifthenelse{\equal{#1}{}}%
+ {\begin{longtabu} spread 0pt [l]{|X[-1,l]|X[-1,l]|}}% name + description
+ {\ifthenelse{\equal{#1}{1}}%
+ {\begin{longtabu} spread 0pt [l]{|X[-1,l]|X[-1,l]|X[-1,l]|}}% in/out + name + desc
+ {\begin{longtabu} spread 0pt [l]{|X[-1,l]|X[-1,l]|X[-1,l]|X[-1,l]|}}% in/out + type + name + desc
+ }
+ \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #2}\\[1ex]%
+ \hline%
+ \endfirsthead%
+ \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #2}\\[1ex]%
+ \hline%
+ \endhead%
+}{%
+ \end{longtabu}%
+ \vspace{6pt}%
+}
+
+% Used for fields of simple structs
+\newenvironment{DoxyFields}[1]{%
+ \tabulinesep=1mm%
+ \par%
+ \begin{longtabu} spread 0pt [l]{|X[-1,r]|X[-1,l]|X[-1,l]|}%
+ \multicolumn{3}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]%
+ \hline%
+ \endfirsthead%
+ \multicolumn{3}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]%
+ \hline%
+ \endhead%
+}{%
+ \end{longtabu}%
+ \vspace{6pt}%
+}
+
+% Used for parameters within a detailed function description
+\newenvironment{DoxyParamCaption}{%
+ \renewcommand{\item}[2][]{##1 {\em ##2}}%
+}{%
+}
+
+% Used by return value lists
+\newenvironment{DoxyRetVals}[1]{%
+ \tabulinesep=1mm%
+ \par%
+ \begin{longtabu} spread 0pt [l]{|X[-1,r]|X[-1,l]|}%
+ \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]%
+ \hline%
+ \endfirsthead%
+ \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]%
+ \hline%
+ \endhead%
+}{%
+ \end{longtabu}%
+ \vspace{6pt}%
+}
+
+% Used by exception lists
+\newenvironment{DoxyExceptions}[1]{%
+ \tabulinesep=1mm%
+ \par%
+ \begin{longtabu} spread 0pt [l]{|X[-1,r]|X[-1,l]|}%
+ \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]%
+ \hline%
+ \endfirsthead%
+ \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]%
+ \hline%
+ \endhead%
+}{%
+ \end{longtabu}%
+ \vspace{6pt}%
+}
+
+% Used by template parameter lists
+\newenvironment{DoxyTemplParams}[1]{%
+ \tabulinesep=1mm%
+ \par%
+ \begin{longtabu} spread 0pt [l]{|X[-1,r]|X[-1,l]|}%
+ \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]%
+ \hline%
+ \endfirsthead%
+ \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]%
+ \hline%
+ \endhead%
+}{%
+ \end{longtabu}%
+ \vspace{6pt}%
+}
+
+% Used for member lists
+\newenvironment{DoxyCompactItemize}{%
+ \begin{itemize}%
+ \setlength{\itemsep}{-3pt}%
+ \setlength{\parsep}{0pt}%
+ \setlength{\topsep}{0pt}%
+ \setlength{\partopsep}{0pt}%
+}{%
+ \end{itemize}%
+}
+
+% Used for member descriptions
+\newenvironment{DoxyCompactList}{%
+ \begin{list}{}{%
+ \setlength{\leftmargin}{0.5cm}%
+ \setlength{\itemsep}{0pt}%
+ \setlength{\parsep}{0pt}%
+ \setlength{\topsep}{0pt}%
+ \renewcommand{\makelabel}{\hfill}%
+ }%
+}{%
+ \end{list}%
+}
+
+% Used for reference lists (@bug, @deprecated, @todo, etc.)
+\newenvironment{DoxyRefList}{%
+ \begin{list}{}{%
+ \setlength{\labelwidth}{10pt}%
+ \setlength{\leftmargin}{\labelwidth}%
+ \addtolength{\leftmargin}{\labelsep}%
+ \renewcommand{\makelabel}{\xreflabel}%
+ }%
+}{%
+ \end{list}%
+}
+
+% Used by @bug, @deprecated, @todo, etc.
+\newenvironment{DoxyRefDesc}[1]{%
+ \begin{list}{}{%
+ \renewcommand\makelabel[1]{\textbf{##1}}%
+ \settowidth\labelwidth{\makelabel{#1}}%
+ \setlength\leftmargin{\labelwidth+\labelsep}%
+ }%
+}{%
+ \end{list}%
+}
+
+% Used by parameter lists and simple sections
+\newenvironment{Desc}
+{\begin{list}{}{%
+ \settowidth{\labelwidth}{20pt}%
+ \setlength{\parsep}{0pt}%
+ \setlength{\itemsep}{0pt}%
+ \setlength{\leftmargin}{\labelwidth+\labelsep}%
+ \renewcommand{\makelabel}{\entrylabel}%
+ }
+}{%
+ \end{list}%
+}
+
+% Used by tables
+\newcommand{\PBS}[1]{\let\temp=\\#1\let\\=\temp}%
+\newenvironment{TabularC}[1]%
+{\tabulinesep=1mm
+\begin{longtabu} spread 0pt [c]{*#1{|X[-1]}|}}%
+{\end{longtabu}\par}%
+
+\newenvironment{TabularNC}[1]%
+{\begin{tabu} spread 0pt [l]{*#1{|X[-1]}|}}%
+{\end{tabu}\par}%
+
+% Used for member group headers
+\newenvironment{Indent}{%
+ \begin{list}{}{%
+ \setlength{\leftmargin}{0.5cm}%
+ }%
+ \item[]\ignorespaces%
+}{%
+ \unskip%
+ \end{list}%
+}
+
+% Used when hyperlinks are turned off
+\newcommand{\doxyref}[3]{%
+ \textbf{#1} (\textnormal{#2}\,\pageref{#3})%
+}
+
+% Used to link to a table when hyperlinks are turned on
+\newcommand{\doxytablelink}[2]{%
+ \ref{#1}%
+}
+
+% Used to link to a table when hyperlinks are turned off
+\newcommand{\doxytableref}[3]{%
+ \ref{#3}%
+}
+
+% Used by @addindex
+\newcommand{\lcurly}{\{}
+\newcommand{\rcurly}{\}}
+
+% Colors used for syntax highlighting
+\definecolor{comment}{rgb}{0.5,0.0,0.0}
+\definecolor{keyword}{rgb}{0.0,0.5,0.0}
+\definecolor{keywordtype}{rgb}{0.38,0.25,0.125}
+\definecolor{keywordflow}{rgb}{0.88,0.5,0.0}
+\definecolor{preprocessor}{rgb}{0.5,0.38,0.125}
+\definecolor{stringliteral}{rgb}{0.0,0.125,0.25}
+\definecolor{charliteral}{rgb}{0.0,0.5,0.5}
+\definecolor{vhdldigit}{rgb}{1.0,0.0,1.0}
+\definecolor{vhdlkeyword}{rgb}{0.43,0.0,0.43}
+\definecolor{vhdllogic}{rgb}{1.0,0.0,0.0}
+\definecolor{vhdlchar}{rgb}{0.0,0.0,0.0}
+
+% Color used for table heading
+\newcommand{\tableheadbgcolor}{lightgray}%
--- /dev/null
+\section{File List}
+Here is a list of all documented files with brief descriptions\+:\begin{DoxyCompactList}
+\item\contentsline{section}{lib/\hyperlink{libwebsockets_8h}{libwebsockets.\+h} }{\pageref{libwebsockets_8h}}{}
+\end{DoxyCompactList}
--- /dev/null
+\hypertarget{group__HTTP-headers-create}{}\section{H\+T\+TP headers\+: create}
+\label{group__HTTP-headers-create}\index{H\+T\+T\+P headers\+: create@{H\+T\+T\+P headers\+: create}}
+\subsection*{Functions}
+\begin{DoxyCompactItemize}
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int L\+W\+S\+\_\+\+W\+A\+R\+N\+\_\+\+U\+N\+U\+S\+E\+D\+\_\+\+R\+E\+S\+U\+LT \hyperlink{group__HTTP-headers-create_ga29b7d6d2ddfdbaff3d8b607e7e3151b6}{lws\+\_\+add\+\_\+http\+\_\+header\+\_\+status} (struct lws $\ast$wsi, unsigned int code, unsigned char $\ast$$\ast$p, unsigned char $\ast$end)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int L\+W\+S\+\_\+\+W\+A\+R\+N\+\_\+\+U\+N\+U\+S\+E\+D\+\_\+\+R\+E\+S\+U\+LT \hyperlink{group__HTTP-headers-create_ga2b36bf44405755ff51c1939303b995a8}{lws\+\_\+add\+\_\+http\+\_\+header\+\_\+by\+\_\+name} (struct lws $\ast$wsi, const unsigned char $\ast$name, const unsigned char $\ast$value, int length, unsigned char $\ast$$\ast$p, unsigned char $\ast$end)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int L\+W\+S\+\_\+\+W\+A\+R\+N\+\_\+\+U\+N\+U\+S\+E\+D\+\_\+\+R\+E\+S\+U\+LT \hyperlink{group__HTTP-headers-create_gaf74adb761b22566ad70004882712dce1}{lws\+\_\+add\+\_\+http\+\_\+header\+\_\+by\+\_\+token} (struct lws $\ast$wsi, enum lws\+\_\+token\+\_\+indexes token, const unsigned char $\ast$value, int length, unsigned char $\ast$$\ast$p, unsigned char $\ast$end)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int L\+W\+S\+\_\+\+W\+A\+R\+N\+\_\+\+U\+N\+U\+S\+E\+D\+\_\+\+R\+E\+S\+U\+LT \hyperlink{group__HTTP-headers-create_gacc76a5babcb4dce1b01b1955aa7a2faf}{lws\+\_\+add\+\_\+http\+\_\+header\+\_\+content\+\_\+length} (struct lws $\ast$wsi, unsigned long content\+\_\+length, unsigned char $\ast$$\ast$p, unsigned char $\ast$end)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int L\+W\+S\+\_\+\+W\+A\+R\+N\+\_\+\+U\+N\+U\+S\+E\+D\+\_\+\+R\+E\+S\+U\+LT \hyperlink{group__HTTP-headers-create_ga4887605ff2242a54db3a7fa01f6f864b}{lws\+\_\+finalize\+\_\+http\+\_\+header} (struct lws $\ast$wsi, unsigned char $\ast$$\ast$p, unsigned char $\ast$end)
+\end{DoxyCompactItemize}
+
+
+\subsection{Detailed Description}
+\subsubsection*{H\+T\+TP headers\+: Create}
+
+These apis allow you to create H\+T\+TP response headers in a way compatible with both H\+T\+T\+P/1.\+x and H\+T\+T\+P/2.
+
+They each append to a buffer taking care about the buffer end, which is passed in as a pointer. When data is written to the buffer, the current position p is updated accordingly.
+
+All of these apis are L\+W\+S\+\_\+\+W\+A\+R\+N\+\_\+\+U\+N\+U\+S\+E\+D\+\_\+\+R\+E\+S\+U\+LT as they can run out of space and fail with nonzero return.
+
+\subsection{Function Documentation}
+\index{H\+T\+T\+P headers\+: create@{H\+T\+T\+P headers\+: create}!lws\+\_\+add\+\_\+http\+\_\+header\+\_\+by\+\_\+name@{lws\+\_\+add\+\_\+http\+\_\+header\+\_\+by\+\_\+name}}
+\index{lws\+\_\+add\+\_\+http\+\_\+header\+\_\+by\+\_\+name@{lws\+\_\+add\+\_\+http\+\_\+header\+\_\+by\+\_\+name}!H\+T\+T\+P headers\+: create@{H\+T\+T\+P headers\+: create}}
+\subsubsection[{\texorpdfstring{lws\+\_\+add\+\_\+http\+\_\+header\+\_\+by\+\_\+name(struct lws $\ast$wsi, const unsigned char $\ast$name, const unsigned char $\ast$value, int length, unsigned char $\ast$$\ast$p, unsigned char $\ast$end)}{lws\_add\_http\_header\_by\_name(struct lws *wsi, const unsigned char *name, const unsigned char *value, int length, unsigned char **p, unsigned char *end)}}]{\setlength{\rightskip}{0pt plus 5cm}L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int L\+W\+S\+\_\+\+W\+A\+R\+N\+\_\+\+U\+N\+U\+S\+E\+D\+\_\+\+R\+E\+S\+U\+LT lws\+\_\+add\+\_\+http\+\_\+header\+\_\+by\+\_\+name (
+\begin{DoxyParamCaption}
+\item[{struct lws $\ast$}]{wsi, }
+\item[{const unsigned char $\ast$}]{name, }
+\item[{const unsigned char $\ast$}]{value, }
+\item[{int}]{length, }
+\item[{unsigned char $\ast$$\ast$}]{p, }
+\item[{unsigned char $\ast$}]{end}
+\end{DoxyParamCaption}
+)}\hypertarget{group__HTTP-headers-create_ga2b36bf44405755ff51c1939303b995a8}{}\label{group__HTTP-headers-create_ga2b36bf44405755ff51c1939303b995a8}
+
+
+{\ttfamily \#include $<$\hyperlink{libwebsockets_8h}{lib/libwebsockets.\+h}$>$}
+
+\hyperlink{group__HTTP-headers-create_ga2b36bf44405755ff51c1939303b995a8}{lws\+\_\+add\+\_\+http\+\_\+header\+\_\+by\+\_\+name()} -\/ append named header and value
+
+
+\begin{DoxyParams}{Parameters}
+{\em wsi} & the connection to check \\
+\hline
+{\em name} & the hdr name, like \char`\"{}my-\/header\char`\"{} \\
+\hline
+{\em value} & the value after the = for this header \\
+\hline
+{\em length} & the length of the value \\
+\hline
+{\em p} & pointer to current position in buffer pointer \\
+\hline
+{\em end} & pointer to end of buffer\\
+\hline
+\end{DoxyParams}
+Appends name\+: value to the headers \index{H\+T\+T\+P headers\+: create@{H\+T\+T\+P headers\+: create}!lws\+\_\+add\+\_\+http\+\_\+header\+\_\+by\+\_\+token@{lws\+\_\+add\+\_\+http\+\_\+header\+\_\+by\+\_\+token}}
+\index{lws\+\_\+add\+\_\+http\+\_\+header\+\_\+by\+\_\+token@{lws\+\_\+add\+\_\+http\+\_\+header\+\_\+by\+\_\+token}!H\+T\+T\+P headers\+: create@{H\+T\+T\+P headers\+: create}}
+\subsubsection[{\texorpdfstring{lws\+\_\+add\+\_\+http\+\_\+header\+\_\+by\+\_\+token(struct lws $\ast$wsi, enum lws\+\_\+token\+\_\+indexes token, const unsigned char $\ast$value, int length, unsigned char $\ast$$\ast$p, unsigned char $\ast$end)}{lws\_add\_http\_header\_by\_token(struct lws *wsi, enum lws\_token\_indexes token, const unsigned char *value, int length, unsigned char **p, unsigned char *end)}}]{\setlength{\rightskip}{0pt plus 5cm}L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int L\+W\+S\+\_\+\+W\+A\+R\+N\+\_\+\+U\+N\+U\+S\+E\+D\+\_\+\+R\+E\+S\+U\+LT lws\+\_\+add\+\_\+http\+\_\+header\+\_\+by\+\_\+token (
+\begin{DoxyParamCaption}
+\item[{struct lws $\ast$}]{wsi, }
+\item[{enum lws\+\_\+token\+\_\+indexes}]{token, }
+\item[{const unsigned char $\ast$}]{value, }
+\item[{int}]{length, }
+\item[{unsigned char $\ast$$\ast$}]{p, }
+\item[{unsigned char $\ast$}]{end}
+\end{DoxyParamCaption}
+)}\hypertarget{group__HTTP-headers-create_gaf74adb761b22566ad70004882712dce1}{}\label{group__HTTP-headers-create_gaf74adb761b22566ad70004882712dce1}
+
+
+{\ttfamily \#include $<$\hyperlink{libwebsockets_8h}{lib/libwebsockets.\+h}$>$}
+
+\hyperlink{group__HTTP-headers-create_gaf74adb761b22566ad70004882712dce1}{lws\+\_\+add\+\_\+http\+\_\+header\+\_\+by\+\_\+token()} -\/ append given header and value
+
+
+\begin{DoxyParams}{Parameters}
+{\em wsi} & the connection to check \\
+\hline
+{\em token} & the token index for the hdr \\
+\hline
+{\em value} & the value after the = for this header \\
+\hline
+{\em length} & the length of the value \\
+\hline
+{\em p} & pointer to current position in buffer pointer \\
+\hline
+{\em end} & pointer to end of buffer\\
+\hline
+\end{DoxyParams}
+Appends name=value to the headers, but is able to take advantage of better H\+T\+T\+P/2 coding mechanisms where possible. \index{H\+T\+T\+P headers\+: create@{H\+T\+T\+P headers\+: create}!lws\+\_\+add\+\_\+http\+\_\+header\+\_\+content\+\_\+length@{lws\+\_\+add\+\_\+http\+\_\+header\+\_\+content\+\_\+length}}
+\index{lws\+\_\+add\+\_\+http\+\_\+header\+\_\+content\+\_\+length@{lws\+\_\+add\+\_\+http\+\_\+header\+\_\+content\+\_\+length}!H\+T\+T\+P headers\+: create@{H\+T\+T\+P headers\+: create}}
+\subsubsection[{\texorpdfstring{lws\+\_\+add\+\_\+http\+\_\+header\+\_\+content\+\_\+length(struct lws $\ast$wsi, unsigned long content\+\_\+length, unsigned char $\ast$$\ast$p, unsigned char $\ast$end)}{lws\_add\_http\_header\_content\_length(struct lws *wsi, unsigned long content\_length, unsigned char **p, unsigned char *end)}}]{\setlength{\rightskip}{0pt plus 5cm}L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int L\+W\+S\+\_\+\+W\+A\+R\+N\+\_\+\+U\+N\+U\+S\+E\+D\+\_\+\+R\+E\+S\+U\+LT lws\+\_\+add\+\_\+http\+\_\+header\+\_\+content\+\_\+length (
+\begin{DoxyParamCaption}
+\item[{struct lws $\ast$}]{wsi, }
+\item[{unsigned long}]{content\+\_\+length, }
+\item[{unsigned char $\ast$$\ast$}]{p, }
+\item[{unsigned char $\ast$}]{end}
+\end{DoxyParamCaption}
+)}\hypertarget{group__HTTP-headers-create_gacc76a5babcb4dce1b01b1955aa7a2faf}{}\label{group__HTTP-headers-create_gacc76a5babcb4dce1b01b1955aa7a2faf}
+
+
+{\ttfamily \#include $<$\hyperlink{libwebsockets_8h}{lib/libwebsockets.\+h}$>$}
+
+\hyperlink{group__HTTP-headers-create_ga2b36bf44405755ff51c1939303b995a8}{lws\+\_\+add\+\_\+http\+\_\+header\+\_\+by\+\_\+name()} -\/ append content-\/length helper
+
+
+\begin{DoxyParams}{Parameters}
+{\em wsi} & the connection to check \\
+\hline
+{\em content\+\_\+length} & the content length to use \\
+\hline
+{\em p} & pointer to current position in buffer pointer \\
+\hline
+{\em end} & pointer to end of buffer\\
+\hline
+\end{DoxyParams}
+Appends content-\/length\+: content\+\_\+length to the headers \index{H\+T\+T\+P headers\+: create@{H\+T\+T\+P headers\+: create}!lws\+\_\+add\+\_\+http\+\_\+header\+\_\+status@{lws\+\_\+add\+\_\+http\+\_\+header\+\_\+status}}
+\index{lws\+\_\+add\+\_\+http\+\_\+header\+\_\+status@{lws\+\_\+add\+\_\+http\+\_\+header\+\_\+status}!H\+T\+T\+P headers\+: create@{H\+T\+T\+P headers\+: create}}
+\subsubsection[{\texorpdfstring{lws\+\_\+add\+\_\+http\+\_\+header\+\_\+status(struct lws $\ast$wsi, unsigned int code, unsigned char $\ast$$\ast$p, unsigned char $\ast$end)}{lws\_add\_http\_header\_status(struct lws *wsi, unsigned int code, unsigned char **p, unsigned char *end)}}]{\setlength{\rightskip}{0pt plus 5cm}L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int L\+W\+S\+\_\+\+W\+A\+R\+N\+\_\+\+U\+N\+U\+S\+E\+D\+\_\+\+R\+E\+S\+U\+LT lws\+\_\+add\+\_\+http\+\_\+header\+\_\+status (
+\begin{DoxyParamCaption}
+\item[{struct lws $\ast$}]{wsi, }
+\item[{unsigned int}]{code, }
+\item[{unsigned char $\ast$$\ast$}]{p, }
+\item[{unsigned char $\ast$}]{end}
+\end{DoxyParamCaption}
+)}\hypertarget{group__HTTP-headers-create_ga29b7d6d2ddfdbaff3d8b607e7e3151b6}{}\label{group__HTTP-headers-create_ga29b7d6d2ddfdbaff3d8b607e7e3151b6}
+
+
+{\ttfamily \#include $<$\hyperlink{libwebsockets_8h}{lib/libwebsockets.\+h}$>$}
+
+\hyperlink{group__HTTP-headers-create_ga29b7d6d2ddfdbaff3d8b607e7e3151b6}{lws\+\_\+add\+\_\+http\+\_\+header\+\_\+status()} -\/ add the H\+T\+TP response status code
+
+
+\begin{DoxyParams}{Parameters}
+{\em wsi} & the connection to check \\
+\hline
+{\em code} & an H\+T\+TP code like 200, 404 etc (see enum http\+\_\+status) \\
+\hline
+{\em p} & pointer to current position in buffer pointer \\
+\hline
+{\em end} & pointer to end of buffer\\
+\hline
+\end{DoxyParams}
+Adds the initial response code, so should be called first \index{H\+T\+T\+P headers\+: create@{H\+T\+T\+P headers\+: create}!lws\+\_\+finalize\+\_\+http\+\_\+header@{lws\+\_\+finalize\+\_\+http\+\_\+header}}
+\index{lws\+\_\+finalize\+\_\+http\+\_\+header@{lws\+\_\+finalize\+\_\+http\+\_\+header}!H\+T\+T\+P headers\+: create@{H\+T\+T\+P headers\+: create}}
+\subsubsection[{\texorpdfstring{lws\+\_\+finalize\+\_\+http\+\_\+header(struct lws $\ast$wsi, unsigned char $\ast$$\ast$p, unsigned char $\ast$end)}{lws\_finalize\_http\_header(struct lws *wsi, unsigned char **p, unsigned char *end)}}]{\setlength{\rightskip}{0pt plus 5cm}L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int L\+W\+S\+\_\+\+W\+A\+R\+N\+\_\+\+U\+N\+U\+S\+E\+D\+\_\+\+R\+E\+S\+U\+LT lws\+\_\+finalize\+\_\+http\+\_\+header (
+\begin{DoxyParamCaption}
+\item[{struct lws $\ast$}]{wsi, }
+\item[{unsigned char $\ast$$\ast$}]{p, }
+\item[{unsigned char $\ast$}]{end}
+\end{DoxyParamCaption}
+)}\hypertarget{group__HTTP-headers-create_ga4887605ff2242a54db3a7fa01f6f864b}{}\label{group__HTTP-headers-create_ga4887605ff2242a54db3a7fa01f6f864b}
+
+
+{\ttfamily \#include $<$\hyperlink{libwebsockets_8h}{lib/libwebsockets.\+h}$>$}
+
+\hyperlink{group__HTTP-headers-create_ga4887605ff2242a54db3a7fa01f6f864b}{lws\+\_\+finalize\+\_\+http\+\_\+header()} -\/ terminate header block
+
+
+\begin{DoxyParams}{Parameters}
+{\em wsi} & the connection to check \\
+\hline
+{\em p} & pointer to current position in buffer pointer \\
+\hline
+{\em end} & pointer to end of buffer\\
+\hline
+\end{DoxyParams}
+Indicates no more headers will be added
\ No newline at end of file
--- /dev/null
+\hypertarget{group__HTTP-headers-read}{}\section{H\+T\+TP headers\+: read}
+\label{group__HTTP-headers-read}\index{H\+T\+T\+P headers\+: read@{H\+T\+T\+P headers\+: read}}
+\subsection*{Data Structures}
+\begin{DoxyCompactItemize}
+\item
+struct \hyperlink{structlws__tokens}{lws\+\_\+tokens}
+\item
+struct \hyperlink{structlws__token__limits}{lws\+\_\+token\+\_\+limits}
+\end{DoxyCompactItemize}
+\subsection*{Enumerations}
+\begin{DoxyCompactItemize}
+\item
+enum {\bfseries lws\+\_\+token\+\_\+indexes} \{ \\*
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+G\+E\+T\+\_\+\+U\+RI} = 0,
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+P\+O\+S\+T\+\_\+\+U\+RI} = 1,
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+O\+P\+T\+I\+O\+N\+S\+\_\+\+U\+RI} = 2,
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+H\+O\+ST} = 3,
+\\*
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+C\+O\+N\+N\+E\+C\+T\+I\+ON} = 4,
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+U\+P\+G\+R\+A\+DE} = 5,
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+O\+R\+I\+G\+IN} = 6,
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+D\+R\+A\+FT} = 7,
+\\*
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+C\+H\+A\+L\+L\+E\+N\+GE} = 8,
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+E\+X\+T\+E\+N\+S\+I\+O\+NS} = 9,
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+K\+E\+Y1} = 10,
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+K\+E\+Y2} = 11,
+\\*
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+P\+R\+O\+T\+O\+C\+OL} = 12,
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+A\+C\+C\+E\+PT} = 13,
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+N\+O\+N\+CE} = 14,
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+H\+T\+TP} = 15,
+\\*
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+H\+T\+T\+P2\+\_\+\+S\+E\+T\+T\+I\+N\+GS} = 16,
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+H\+T\+T\+P\+\_\+\+A\+C\+C\+E\+PT} = 17,
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+H\+T\+T\+P\+\_\+\+A\+C\+\_\+\+R\+E\+Q\+U\+E\+S\+T\+\_\+\+H\+E\+A\+D\+E\+RS} = 18,
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+H\+T\+T\+P\+\_\+\+I\+F\+\_\+\+M\+O\+D\+I\+F\+I\+E\+D\+\_\+\+S\+I\+N\+CE} = 19,
+\\*
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+H\+T\+T\+P\+\_\+\+I\+F\+\_\+\+N\+O\+N\+E\+\_\+\+M\+A\+T\+CH} = 20,
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+H\+T\+T\+P\+\_\+\+A\+C\+C\+E\+P\+T\+\_\+\+E\+N\+C\+O\+D\+I\+NG} = 21,
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+H\+T\+T\+P\+\_\+\+A\+C\+C\+E\+P\+T\+\_\+\+L\+A\+N\+G\+U\+A\+GE} = 22,
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+H\+T\+T\+P\+\_\+\+P\+R\+A\+G\+MA} = 23,
+\\*
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+H\+T\+T\+P\+\_\+\+C\+A\+C\+H\+E\+\_\+\+C\+O\+N\+T\+R\+OL} = 24,
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+H\+T\+T\+P\+\_\+\+A\+U\+T\+H\+O\+R\+I\+Z\+A\+T\+I\+ON} = 25,
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+H\+T\+T\+P\+\_\+\+C\+O\+O\+K\+IE} = 26,
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+H\+T\+T\+P\+\_\+\+C\+O\+N\+T\+E\+N\+T\+\_\+\+L\+E\+N\+G\+TH} = 27,
+\\*
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+H\+T\+T\+P\+\_\+\+C\+O\+N\+T\+E\+N\+T\+\_\+\+T\+Y\+PE} = 28,
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+H\+T\+T\+P\+\_\+\+D\+A\+TE} = 29,
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+H\+T\+T\+P\+\_\+\+R\+A\+N\+GE} = 30,
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+H\+T\+T\+P\+\_\+\+R\+E\+F\+E\+R\+ER} = 31,
+\\*
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+K\+EY} = 32,
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+V\+E\+R\+S\+I\+ON} = 33,
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+S\+W\+O\+R\+I\+G\+IN} = 34,
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+H\+T\+T\+P\+\_\+\+C\+O\+L\+O\+N\+\_\+\+A\+U\+T\+H\+O\+R\+I\+TY} = 35,
+\\*
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+H\+T\+T\+P\+\_\+\+C\+O\+L\+O\+N\+\_\+\+M\+E\+T\+H\+OD} = 36,
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+H\+T\+T\+P\+\_\+\+C\+O\+L\+O\+N\+\_\+\+P\+A\+TH} = 37,
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+H\+T\+T\+P\+\_\+\+C\+O\+L\+O\+N\+\_\+\+S\+C\+H\+E\+ME} = 38,
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+H\+T\+T\+P\+\_\+\+C\+O\+L\+O\+N\+\_\+\+S\+T\+A\+T\+US} = 39,
+\\*
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+H\+T\+T\+P\+\_\+\+A\+C\+C\+E\+P\+T\+\_\+\+C\+H\+A\+R\+S\+ET} = 40,
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+H\+T\+T\+P\+\_\+\+A\+C\+C\+E\+P\+T\+\_\+\+R\+A\+N\+G\+ES} = 41,
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+H\+T\+T\+P\+\_\+\+A\+C\+C\+E\+S\+S\+\_\+\+C\+O\+N\+T\+R\+O\+L\+\_\+\+A\+L\+L\+O\+W\+\_\+\+O\+R\+I\+G\+IN} = 42,
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+H\+T\+T\+P\+\_\+\+A\+GE} = 43,
+\\*
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+H\+T\+T\+P\+\_\+\+A\+L\+L\+OW} = 44,
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+H\+T\+T\+P\+\_\+\+C\+O\+N\+T\+E\+N\+T\+\_\+\+D\+I\+S\+P\+O\+S\+I\+T\+I\+ON} = 45,
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+H\+T\+T\+P\+\_\+\+C\+O\+N\+T\+E\+N\+T\+\_\+\+E\+N\+C\+O\+D\+I\+NG} = 46,
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+H\+T\+T\+P\+\_\+\+C\+O\+N\+T\+E\+N\+T\+\_\+\+L\+A\+N\+G\+U\+A\+GE} = 47,
+\\*
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+H\+T\+T\+P\+\_\+\+C\+O\+N\+T\+E\+N\+T\+\_\+\+L\+O\+C\+A\+T\+I\+ON} = 48,
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+H\+T\+T\+P\+\_\+\+C\+O\+N\+T\+E\+N\+T\+\_\+\+R\+A\+N\+GE} = 49,
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+H\+T\+T\+P\+\_\+\+E\+T\+AG} = 50,
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+H\+T\+T\+P\+\_\+\+E\+X\+P\+E\+CT} = 51,
+\\*
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+H\+T\+T\+P\+\_\+\+E\+X\+P\+I\+R\+ES} = 52,
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+H\+T\+T\+P\+\_\+\+F\+R\+OM} = 53,
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+H\+T\+T\+P\+\_\+\+I\+F\+\_\+\+M\+A\+T\+CH} = 54,
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+H\+T\+T\+P\+\_\+\+I\+F\+\_\+\+R\+A\+N\+GE} = 55,
+\\*
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+H\+T\+T\+P\+\_\+\+I\+F\+\_\+\+U\+N\+M\+O\+D\+I\+F\+I\+E\+D\+\_\+\+S\+I\+N\+CE} = 56,
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+H\+T\+T\+P\+\_\+\+L\+A\+S\+T\+\_\+\+M\+O\+D\+I\+F\+I\+ED} = 57,
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+H\+T\+T\+P\+\_\+\+L\+I\+NK} = 58,
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+H\+T\+T\+P\+\_\+\+L\+O\+C\+A\+T\+I\+ON} = 59,
+\\*
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+H\+T\+T\+P\+\_\+\+M\+A\+X\+\_\+\+F\+O\+R\+W\+A\+R\+DS} = 60,
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+H\+T\+T\+P\+\_\+\+P\+R\+O\+X\+Y\+\_\+\+A\+U\+T\+H\+E\+N\+T\+I\+C\+A\+TE} = 61,
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+H\+T\+T\+P\+\_\+\+P\+R\+O\+X\+Y\+\_\+\+A\+U\+T\+H\+O\+R\+I\+Z\+A\+T\+I\+ON} = 62,
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+H\+T\+T\+P\+\_\+\+R\+E\+F\+R\+E\+SH} = 63,
+\\*
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+H\+T\+T\+P\+\_\+\+R\+E\+T\+R\+Y\+\_\+\+A\+F\+T\+ER} = 64,
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+H\+T\+T\+P\+\_\+\+S\+E\+R\+V\+ER} = 65,
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+H\+T\+T\+P\+\_\+\+S\+E\+T\+\_\+\+C\+O\+O\+K\+IE} = 66,
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+H\+T\+T\+P\+\_\+\+S\+T\+R\+I\+C\+T\+\_\+\+T\+R\+A\+N\+S\+P\+O\+R\+T\+\_\+\+S\+E\+C\+U\+R\+I\+TY} = 67,
+\\*
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+H\+T\+T\+P\+\_\+\+T\+R\+A\+N\+S\+F\+E\+R\+\_\+\+E\+N\+C\+O\+D\+I\+NG} = 68,
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+H\+T\+T\+P\+\_\+\+U\+S\+E\+R\+\_\+\+A\+G\+E\+NT} = 69,
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+H\+T\+T\+P\+\_\+\+V\+A\+RY} = 70,
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+H\+T\+T\+P\+\_\+\+V\+IA} = 71,
+\\*
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+H\+T\+T\+P\+\_\+\+W\+W\+W\+\_\+\+A\+U\+T\+H\+E\+N\+T\+I\+C\+A\+TE} = 72,
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+P\+A\+T\+C\+H\+\_\+\+U\+RI} = 73,
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+P\+U\+T\+\_\+\+U\+RI} = 74,
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+D\+E\+L\+E\+T\+E\+\_\+\+U\+RI} = 75,
+\\*
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+H\+T\+T\+P\+\_\+\+U\+R\+I\+\_\+\+A\+R\+GS} = 76,
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+P\+R\+O\+XY} = 77,
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+H\+T\+T\+P\+\_\+\+X\+\_\+\+R\+E\+A\+L\+\_\+\+IP} = 78,
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+H\+T\+T\+P1\+\_\+0} = 79,
+\\*
+{\bfseries \+\_\+\+W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+S\+E\+N\+T\+\_\+\+P\+R\+O\+T\+O\+C\+O\+LS},
+{\bfseries \+\_\+\+W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+P\+E\+E\+R\+\_\+\+A\+D\+D\+R\+E\+SS},
+{\bfseries \+\_\+\+W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+U\+RI},
+{\bfseries \+\_\+\+W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+H\+O\+ST},
+\\*
+{\bfseries \+\_\+\+W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+O\+R\+I\+G\+IN},
+{\bfseries \+\_\+\+W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+M\+E\+T\+H\+OD},
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+C\+O\+U\+NT},
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+N\+A\+M\+E\+\_\+\+P\+A\+RT},
+\\*
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+S\+K\+I\+P\+P\+I\+NG},
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+S\+K\+I\+P\+P\+I\+N\+G\+\_\+\+S\+A\+W\+\_\+\+CR},
+{\bfseries W\+S\+I\+\_\+\+P\+A\+R\+S\+I\+N\+G\+\_\+\+C\+O\+M\+P\+L\+E\+TE},
+{\bfseries W\+S\+I\+\_\+\+I\+N\+I\+T\+\_\+\+T\+O\+K\+E\+N\+\_\+\+M\+U\+X\+U\+RL}
+ \}\hypertarget{group__HTTP-headers-read_ga6e747906f9d76532ec118d6ef418b82e}{}\label{group__HTTP-headers-read_ga6e747906f9d76532ec118d6ef418b82e}
+
+\end{DoxyCompactItemize}
+\subsection*{Functions}
+\begin{DoxyCompactItemize}
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN const unsigned char $\ast$ \hyperlink{group__HTTP-headers-read_ga2c0597b2ef1d2cee35736c338bcbd17b}{lws\+\_\+token\+\_\+to\+\_\+string} (enum lws\+\_\+token\+\_\+indexes token)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int L\+W\+S\+\_\+\+W\+A\+R\+N\+\_\+\+U\+N\+U\+S\+E\+D\+\_\+\+R\+E\+S\+U\+LT \hyperlink{group__HTTP-headers-read_ga8ade0e1ffb0da7e62b989d8d867bf6c8}{lws\+\_\+hdr\+\_\+total\+\_\+length} (struct lws $\ast$wsi, enum lws\+\_\+token\+\_\+indexes h)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int L\+W\+S\+\_\+\+W\+A\+R\+N\+\_\+\+U\+N\+U\+S\+E\+D\+\_\+\+R\+E\+S\+U\+LT \hyperlink{group__HTTP-headers-read_ga594f3d0ece5b09c2ccf9f98ea533bb4e}{lws\+\_\+hdr\+\_\+fragment\+\_\+length} (struct lws $\ast$wsi, enum lws\+\_\+token\+\_\+indexes h, int frag\+\_\+idx)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int \hyperlink{group__HTTP-headers-read_ga6ce6aa1c0155ea42b7708bed271d1c77}{lws\+\_\+hdr\+\_\+copy} (struct lws $\ast$wsi, char $\ast$dest, int len, enum lws\+\_\+token\+\_\+indexes h)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int \hyperlink{group__HTTP-headers-read_gaa427cad61a9a5e3004afd65c4527b5e9}{lws\+\_\+hdr\+\_\+copy\+\_\+fragment} (struct lws $\ast$wsi, char $\ast$dest, int len, enum lws\+\_\+token\+\_\+indexes h, int frag\+\_\+idx)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN const char $\ast$ \hyperlink{group__HTTP-headers-read_ga84e9ce5e71a77501a0998ac403a984c2}{lws\+\_\+get\+\_\+urlarg\+\_\+by\+\_\+name} (struct lws $\ast$wsi, const char $\ast$name, char $\ast$buf, int len)
+\end{DoxyCompactItemize}
+
+
+\subsection{Detailed Description}
+\subsubsection*{H\+T\+TP header releated functions}
+
+In lws the client http headers are temporarily stored in a pool, only for the duration of the http part of the handshake. It\textquotesingle{}s because in most cases, the header content is ignored for the whole rest of the connection lifetime and would then just be taking up space needlessly.
+
+During L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+H\+T\+TP when the U\+RI path is delivered is the last time the http headers are still allocated, you can use these apis then to look at and copy out interesting header content (cookies, etc)
+
+Notice that the header total length reported does not include a terminating \textquotesingle{}\textbackslash{}0\textquotesingle{}, however you must allocate for it when using the \+\_\+copy apis. So the length reported for a header containing \char`\"{}123\char`\"{} is 3, but you must provide a buffer of length 4 so that \char`\"{}123\textbackslash{}0\char`\"{} may be copied into it, or the copy will fail with a nonzero return code.
+
+In the special case of U\+RL arguments, like ?x=1\&y=2, the arguments are stored in a token named for the method, eg, W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+G\+E\+T\+\_\+\+U\+RI if it was a G\+ET or W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+P\+O\+S\+T\+\_\+\+U\+RI if P\+O\+ST. You can check the total length to confirm the method.
+
+For U\+RL arguments, each argument is stored urldecoded in a \char`\"{}fragment\char`\"{}, so you can use the fragment-\/aware api \hyperlink{group__HTTP-headers-read_gaa427cad61a9a5e3004afd65c4527b5e9}{lws\+\_\+hdr\+\_\+copy\+\_\+fragment()} to access each argument in turn\+: the fragments contain urldecoded strings like x=1 or y=2.
+
+As a convenience, lws has an api that will find the fragment with a given name= part, \hyperlink{group__HTTP-headers-read_ga84e9ce5e71a77501a0998ac403a984c2}{lws\+\_\+get\+\_\+urlarg\+\_\+by\+\_\+name()}.
+
+\subsection{Function Documentation}
+\index{H\+T\+T\+P headers\+: read@{H\+T\+T\+P headers\+: read}!lws\+\_\+get\+\_\+urlarg\+\_\+by\+\_\+name@{lws\+\_\+get\+\_\+urlarg\+\_\+by\+\_\+name}}
+\index{lws\+\_\+get\+\_\+urlarg\+\_\+by\+\_\+name@{lws\+\_\+get\+\_\+urlarg\+\_\+by\+\_\+name}!H\+T\+T\+P headers\+: read@{H\+T\+T\+P headers\+: read}}
+\subsubsection[{\texorpdfstring{lws\+\_\+get\+\_\+urlarg\+\_\+by\+\_\+name(struct lws $\ast$wsi, const char $\ast$name, char $\ast$buf, int len)}{lws\_get\_urlarg\_by\_name(struct lws *wsi, const char *name, char *buf, int len)}}]{\setlength{\rightskip}{0pt plus 5cm}L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN const char$\ast$ lws\+\_\+get\+\_\+urlarg\+\_\+by\+\_\+name (
+\begin{DoxyParamCaption}
+\item[{struct lws $\ast$}]{wsi, }
+\item[{const char $\ast$}]{name, }
+\item[{char $\ast$}]{buf, }
+\item[{int}]{len}
+\end{DoxyParamCaption}
+)}\hypertarget{group__HTTP-headers-read_ga84e9ce5e71a77501a0998ac403a984c2}{}\label{group__HTTP-headers-read_ga84e9ce5e71a77501a0998ac403a984c2}
+
+
+{\ttfamily \#include $<$\hyperlink{libwebsockets_8h}{lib/libwebsockets.\+h}$>$}
+
+\hyperlink{group__HTTP-headers-read_ga84e9ce5e71a77501a0998ac403a984c2}{lws\+\_\+get\+\_\+urlarg\+\_\+by\+\_\+name()} -\/ return pointer to arg value if present
+\begin{DoxyParams}{Parameters}
+{\em wsi} & the connection to check \\
+\hline
+{\em name} & the arg name, like \char`\"{}token=\char`\"{} \\
+\hline
+{\em buf} & the buffer to receive the urlarg (including the name= part) \\
+\hline
+{\em len} & the length of the buffer to receive the urlarg \begin{DoxyVerb}Returns NULL if not found or a pointer inside buf to just after the
+name= part.\end{DoxyVerb}
+ \\
+\hline
+\end{DoxyParams}
+\index{H\+T\+T\+P headers\+: read@{H\+T\+T\+P headers\+: read}!lws\+\_\+hdr\+\_\+copy@{lws\+\_\+hdr\+\_\+copy}}
+\index{lws\+\_\+hdr\+\_\+copy@{lws\+\_\+hdr\+\_\+copy}!H\+T\+T\+P headers\+: read@{H\+T\+T\+P headers\+: read}}
+\subsubsection[{\texorpdfstring{lws\+\_\+hdr\+\_\+copy(struct lws $\ast$wsi, char $\ast$dest, int len, enum lws\+\_\+token\+\_\+indexes h)}{lws\_hdr\_copy(struct lws *wsi, char *dest, int len, enum lws\_token\_indexes h)}}]{\setlength{\rightskip}{0pt plus 5cm}L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int lws\+\_\+hdr\+\_\+copy (
+\begin{DoxyParamCaption}
+\item[{struct lws $\ast$}]{wsi, }
+\item[{char $\ast$}]{dest, }
+\item[{int}]{len, }
+\item[{enum lws\+\_\+token\+\_\+indexes}]{h}
+\end{DoxyParamCaption}
+)}\hypertarget{group__HTTP-headers-read_ga6ce6aa1c0155ea42b7708bed271d1c77}{}\label{group__HTTP-headers-read_ga6ce6aa1c0155ea42b7708bed271d1c77}
+
+
+{\ttfamily \#include $<$\hyperlink{libwebsockets_8h}{lib/libwebsockets.\+h}$>$}
+
+\hyperlink{group__HTTP-headers-read_ga6ce6aa1c0155ea42b7708bed271d1c77}{lws\+\_\+hdr\+\_\+copy()} -\/ copy a single fragment of the given header to a buffer The buffer length len must include space for an additional terminating \textquotesingle{}\textbackslash{}0\textquotesingle{}, or it will fail returning -\/1.
+
+
+\begin{DoxyParams}{Parameters}
+{\em wsi} & websocket connection \\
+\hline
+{\em dest} & destination buffer \\
+\hline
+{\em len} & length of destination buffer \\
+\hline
+{\em h} & which header index we are interested in\\
+\hline
+\end{DoxyParams}
+copies the whole, aggregated header, even if it was delivered in several actual headers piece by piece \index{H\+T\+T\+P headers\+: read@{H\+T\+T\+P headers\+: read}!lws\+\_\+hdr\+\_\+copy\+\_\+fragment@{lws\+\_\+hdr\+\_\+copy\+\_\+fragment}}
+\index{lws\+\_\+hdr\+\_\+copy\+\_\+fragment@{lws\+\_\+hdr\+\_\+copy\+\_\+fragment}!H\+T\+T\+P headers\+: read@{H\+T\+T\+P headers\+: read}}
+\subsubsection[{\texorpdfstring{lws\+\_\+hdr\+\_\+copy\+\_\+fragment(struct lws $\ast$wsi, char $\ast$dest, int len, enum lws\+\_\+token\+\_\+indexes h, int frag\+\_\+idx)}{lws\_hdr\_copy\_fragment(struct lws *wsi, char *dest, int len, enum lws\_token\_indexes h, int frag\_idx)}}]{\setlength{\rightskip}{0pt plus 5cm}L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int lws\+\_\+hdr\+\_\+copy\+\_\+fragment (
+\begin{DoxyParamCaption}
+\item[{struct lws $\ast$}]{wsi, }
+\item[{char $\ast$}]{dest, }
+\item[{int}]{len, }
+\item[{enum lws\+\_\+token\+\_\+indexes}]{h, }
+\item[{int}]{frag\+\_\+idx}
+\end{DoxyParamCaption}
+)}\hypertarget{group__HTTP-headers-read_gaa427cad61a9a5e3004afd65c4527b5e9}{}\label{group__HTTP-headers-read_gaa427cad61a9a5e3004afd65c4527b5e9}
+
+
+{\ttfamily \#include $<$\hyperlink{libwebsockets_8h}{lib/libwebsockets.\+h}$>$}
+
+\hyperlink{group__HTTP-headers-read_gaa427cad61a9a5e3004afd65c4527b5e9}{lws\+\_\+hdr\+\_\+copy\+\_\+fragment()} -\/ copy a single fragment of the given header to a buffer The buffer length len must include space for an additional terminating \textquotesingle{}\textbackslash{}0\textquotesingle{}, or it will fail returning -\/1. If the requested fragment index is not present, it fails returning -\/1.
+
+
+\begin{DoxyParams}{Parameters}
+{\em wsi} & websocket connection \\
+\hline
+{\em dest} & destination buffer \\
+\hline
+{\em len} & length of destination buffer \\
+\hline
+{\em h} & which header index we are interested in \\
+\hline
+{\em frag\+\_\+idx} & which fragment of h we want to copy\\
+\hline
+\end{DoxyParams}
+Normally this is only useful to parse U\+RI arguments like ?x=1\&y=2, token index W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+H\+T\+T\+P\+\_\+\+U\+R\+I\+\_\+\+A\+R\+GS fragment 0 will contain \char`\"{}x=1\char`\"{} and fragment 1 \char`\"{}y=2\char`\"{} \index{H\+T\+T\+P headers\+: read@{H\+T\+T\+P headers\+: read}!lws\+\_\+hdr\+\_\+fragment\+\_\+length@{lws\+\_\+hdr\+\_\+fragment\+\_\+length}}
+\index{lws\+\_\+hdr\+\_\+fragment\+\_\+length@{lws\+\_\+hdr\+\_\+fragment\+\_\+length}!H\+T\+T\+P headers\+: read@{H\+T\+T\+P headers\+: read}}
+\subsubsection[{\texorpdfstring{lws\+\_\+hdr\+\_\+fragment\+\_\+length(struct lws $\ast$wsi, enum lws\+\_\+token\+\_\+indexes h, int frag\+\_\+idx)}{lws\_hdr\_fragment\_length(struct lws *wsi, enum lws\_token\_indexes h, int frag\_idx)}}]{\setlength{\rightskip}{0pt plus 5cm}L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int L\+W\+S\+\_\+\+W\+A\+R\+N\+\_\+\+U\+N\+U\+S\+E\+D\+\_\+\+R\+E\+S\+U\+LT lws\+\_\+hdr\+\_\+fragment\+\_\+length (
+\begin{DoxyParamCaption}
+\item[{struct lws $\ast$}]{wsi, }
+\item[{enum lws\+\_\+token\+\_\+indexes}]{h, }
+\item[{int}]{frag\+\_\+idx}
+\end{DoxyParamCaption}
+)}\hypertarget{group__HTTP-headers-read_ga594f3d0ece5b09c2ccf9f98ea533bb4e}{}\label{group__HTTP-headers-read_ga594f3d0ece5b09c2ccf9f98ea533bb4e}
+
+
+{\ttfamily \#include $<$\hyperlink{libwebsockets_8h}{lib/libwebsockets.\+h}$>$}
+
+lws\+\_\+hdr\+\_\+fragment\+\_\+length\+: report length of a single fragment of a header The returned length does not include the space for a terminating \textquotesingle{}\textbackslash{}0\textquotesingle{}
+
+
+\begin{DoxyParams}{Parameters}
+{\em wsi} & websocket connection \\
+\hline
+{\em h} & which header index we are interested in \\
+\hline
+{\em frag\+\_\+idx} & which fragment of h we want to get the length of \\
+\hline
+\end{DoxyParams}
+\index{H\+T\+T\+P headers\+: read@{H\+T\+T\+P headers\+: read}!lws\+\_\+hdr\+\_\+total\+\_\+length@{lws\+\_\+hdr\+\_\+total\+\_\+length}}
+\index{lws\+\_\+hdr\+\_\+total\+\_\+length@{lws\+\_\+hdr\+\_\+total\+\_\+length}!H\+T\+T\+P headers\+: read@{H\+T\+T\+P headers\+: read}}
+\subsubsection[{\texorpdfstring{lws\+\_\+hdr\+\_\+total\+\_\+length(struct lws $\ast$wsi, enum lws\+\_\+token\+\_\+indexes h)}{lws\_hdr\_total\_length(struct lws *wsi, enum lws\_token\_indexes h)}}]{\setlength{\rightskip}{0pt plus 5cm}L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int L\+W\+S\+\_\+\+W\+A\+R\+N\+\_\+\+U\+N\+U\+S\+E\+D\+\_\+\+R\+E\+S\+U\+LT lws\+\_\+hdr\+\_\+total\+\_\+length (
+\begin{DoxyParamCaption}
+\item[{struct lws $\ast$}]{wsi, }
+\item[{enum lws\+\_\+token\+\_\+indexes}]{h}
+\end{DoxyParamCaption}
+)}\hypertarget{group__HTTP-headers-read_ga8ade0e1ffb0da7e62b989d8d867bf6c8}{}\label{group__HTTP-headers-read_ga8ade0e1ffb0da7e62b989d8d867bf6c8}
+
+
+{\ttfamily \#include $<$\hyperlink{libwebsockets_8h}{lib/libwebsockets.\+h}$>$}
+
+lws\+\_\+hdr\+\_\+total\+\_\+length\+: report length of all fragments of a header totalled up The returned length does not include the space for a terminating \textquotesingle{}\textbackslash{}0\textquotesingle{}
+
+
+\begin{DoxyParams}{Parameters}
+{\em wsi} & websocket connection \\
+\hline
+{\em h} & which header index we are interested in \\
+\hline
+\end{DoxyParams}
+\index{H\+T\+T\+P headers\+: read@{H\+T\+T\+P headers\+: read}!lws\+\_\+token\+\_\+to\+\_\+string@{lws\+\_\+token\+\_\+to\+\_\+string}}
+\index{lws\+\_\+token\+\_\+to\+\_\+string@{lws\+\_\+token\+\_\+to\+\_\+string}!H\+T\+T\+P headers\+: read@{H\+T\+T\+P headers\+: read}}
+\subsubsection[{\texorpdfstring{lws\+\_\+token\+\_\+to\+\_\+string(enum lws\+\_\+token\+\_\+indexes token)}{lws\_token\_to\_string(enum lws\_token\_indexes token)}}]{\setlength{\rightskip}{0pt plus 5cm}L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN const unsigned char$\ast$ lws\+\_\+token\+\_\+to\+\_\+string (
+\begin{DoxyParamCaption}
+\item[{enum lws\+\_\+token\+\_\+indexes}]{token}
+\end{DoxyParamCaption}
+)}\hypertarget{group__HTTP-headers-read_ga2c0597b2ef1d2cee35736c338bcbd17b}{}\label{group__HTTP-headers-read_ga2c0597b2ef1d2cee35736c338bcbd17b}
+
+
+{\ttfamily \#include $<$\hyperlink{libwebsockets_8h}{lib/libwebsockets.\+h}$>$}
+
+\hyperlink{group__HTTP-headers-read_ga2c0597b2ef1d2cee35736c338bcbd17b}{lws\+\_\+token\+\_\+to\+\_\+string()} -\/ returns a textual representation of a hdr token index
+
+
+\begin{DoxyParams}{Parameters}
+{\em } & \\
+\hline
+\end{DoxyParams}
--- /dev/null
+\hypertarget{group__Protocols-and-Plugins}{}\section{Protocols and Plugins}
+\label{group__Protocols-and-Plugins}\index{Protocols and Plugins@{Protocols and Plugins}}
+\subsection*{Modules}
+\begin{DoxyCompactItemize}
+\item
+\hyperlink{group__generic-sessions}{plugin\+: generic-\/sessions}
+\end{DoxyCompactItemize}
+\subsection*{Data Structures}
+\begin{DoxyCompactItemize}
+\item
+struct \hyperlink{structlws__protocols}{lws\+\_\+protocols}
+\item
+struct \hyperlink{structlws__plugin__capability}{lws\+\_\+plugin\+\_\+capability}
+\item
+struct \hyperlink{structlws__plugin}{lws\+\_\+plugin}
+\end{DoxyCompactItemize}
+\subsection*{Typedefs}
+\begin{DoxyCompactItemize}
+\item
+typedef int($\ast$ {\bfseries lws\+\_\+plugin\+\_\+init\+\_\+func}) (struct lws\+\_\+context $\ast$, struct \hyperlink{structlws__plugin__capability}{lws\+\_\+plugin\+\_\+capability} $\ast$)\hypertarget{group__Protocols-and-Plugins_ga40994491e1567f91f579d2b444775266}{}\label{group__Protocols-and-Plugins_ga40994491e1567f91f579d2b444775266}
+
+\item
+typedef int($\ast$ {\bfseries lws\+\_\+plugin\+\_\+destroy\+\_\+func}) (struct lws\+\_\+context $\ast$)\hypertarget{group__Protocols-and-Plugins_ga83f7a924ba790fa273476075a59f08b0}{}\label{group__Protocols-and-Plugins_ga83f7a924ba790fa273476075a59f08b0}
+
+\end{DoxyCompactItemize}
+\subsection*{Functions}
+\begin{DoxyCompactItemize}
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN const struct \hyperlink{structlws__protocols}{lws\+\_\+protocols} $\ast$ \hyperlink{group__Protocols-and-Plugins_ga25754726d97c5f519d313e691a9fe29d}{lws\+\_\+vhost\+\_\+name\+\_\+to\+\_\+protocol} (struct lws\+\_\+vhost $\ast$vh, const char $\ast$name)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN const struct \hyperlink{structlws__protocols}{lws\+\_\+protocols} $\ast$ \hyperlink{group__Protocols-and-Plugins_ga72ad550786ca7976463589d347e62112}{lws\+\_\+get\+\_\+protocol} (struct lws $\ast$wsi)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN const struct \hyperlink{structlws__protocols}{lws\+\_\+protocols} $\ast$ \hyperlink{group__Protocols-and-Plugins_ga8bbe5e65faca068845704bab911a5030}{lws\+\_\+protocol\+\_\+get} (struct lws $\ast$wsi) L\+W\+S\+\_\+\+W\+A\+R\+N\+\_\+\+D\+E\+P\+R\+E\+C\+A\+T\+ED
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN void $\ast$ \hyperlink{group__Protocols-and-Plugins_gaec0c0477288ff3f83aff38d357b883d1}{lws\+\_\+protocol\+\_\+vh\+\_\+priv\+\_\+zalloc} (struct lws\+\_\+vhost $\ast$vhost, const struct \hyperlink{structlws__protocols}{lws\+\_\+protocols} $\ast$prot, int size)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN void $\ast$ \hyperlink{group__Protocols-and-Plugins_gaf3be4243443baac0f8be1fcfb4d25129}{lws\+\_\+protocol\+\_\+vh\+\_\+priv\+\_\+get} (struct lws\+\_\+vhost $\ast$vhost, const struct \hyperlink{structlws__protocols}{lws\+\_\+protocols} $\ast$prot)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int \hyperlink{group__Protocols-and-Plugins_ga106b37ae9c247e84d191ab09441adc43}{lws\+\_\+finalize\+\_\+startup} (struct lws\+\_\+context $\ast$context)
+\end{DoxyCompactItemize}
+
+
+\subsection{Detailed Description}
+\subsubsection*{Protocol and protocol plugin -\/related apis}
+
+Protocols bind ws protocol names to a custom callback specific to that protocol implementaion.
+
+A list of protocols can be passed in at context creation time, but it is also legal to leave that N\+U\+LL and add the protocols and their callback code using plugins.
+
+Plugins are much preferable compared to cut and pasting code into an application each time, since they can be used standalone.
+
+\subsection{Function Documentation}
+\index{Protocols and Plugins@{Protocols and Plugins}!lws\+\_\+finalize\+\_\+startup@{lws\+\_\+finalize\+\_\+startup}}
+\index{lws\+\_\+finalize\+\_\+startup@{lws\+\_\+finalize\+\_\+startup}!Protocols and Plugins@{Protocols and Plugins}}
+\subsubsection[{\texorpdfstring{lws\+\_\+finalize\+\_\+startup(struct lws\+\_\+context $\ast$context)}{lws\_finalize\_startup(struct lws\_context *context)}}]{\setlength{\rightskip}{0pt plus 5cm}L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int lws\+\_\+finalize\+\_\+startup (
+\begin{DoxyParamCaption}
+\item[{struct lws\+\_\+context $\ast$}]{context}
+\end{DoxyParamCaption}
+)}\hypertarget{group__Protocols-and-Plugins_ga106b37ae9c247e84d191ab09441adc43}{}\label{group__Protocols-and-Plugins_ga106b37ae9c247e84d191ab09441adc43}
+
+
+{\ttfamily \#include $<$\hyperlink{libwebsockets_8h}{lib/libwebsockets.\+h}$>$}
+
+\hyperlink{group__Protocols-and-Plugins_ga106b37ae9c247e84d191ab09441adc43}{lws\+\_\+finalize\+\_\+startup()} -\/ drop initial process privileges
+
+
+\begin{DoxyParams}{Parameters}
+{\em context} & lws context\\
+\hline
+\end{DoxyParams}
+This is called after the end of the vhost protocol initializations, but you may choose to call it earlier \index{Protocols and Plugins@{Protocols and Plugins}!lws\+\_\+get\+\_\+protocol@{lws\+\_\+get\+\_\+protocol}}
+\index{lws\+\_\+get\+\_\+protocol@{lws\+\_\+get\+\_\+protocol}!Protocols and Plugins@{Protocols and Plugins}}
+\subsubsection[{\texorpdfstring{lws\+\_\+get\+\_\+protocol(struct lws $\ast$wsi)}{lws\_get\_protocol(struct lws *wsi)}}]{\setlength{\rightskip}{0pt plus 5cm}L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN const struct {\bf lws\+\_\+protocols}$\ast$ lws\+\_\+get\+\_\+protocol (
+\begin{DoxyParamCaption}
+\item[{struct lws $\ast$}]{wsi}
+\end{DoxyParamCaption}
+)}\hypertarget{group__Protocols-and-Plugins_ga72ad550786ca7976463589d347e62112}{}\label{group__Protocols-and-Plugins_ga72ad550786ca7976463589d347e62112}
+
+
+{\ttfamily \#include $<$\hyperlink{libwebsockets_8h}{lib/libwebsockets.\+h}$>$}
+
+\hyperlink{group__Protocols-and-Plugins_ga72ad550786ca7976463589d347e62112}{lws\+\_\+get\+\_\+protocol()} -\/ Returns a protocol pointer from a websocket connection.
+\begin{DoxyParams}{Parameters}
+{\em wsi} & pointer to struct websocket you want to know the protocol of\\
+\hline
+\end{DoxyParams}
+\begin{DoxyVerb} Some apis can act on all live connections of a given protocol,
+ this is how you can get a pointer to the active protocol if needed.\end{DoxyVerb}
+ \index{Protocols and Plugins@{Protocols and Plugins}!lws\+\_\+protocol\+\_\+get@{lws\+\_\+protocol\+\_\+get}}
+\index{lws\+\_\+protocol\+\_\+get@{lws\+\_\+protocol\+\_\+get}!Protocols and Plugins@{Protocols and Plugins}}
+\subsubsection[{\texorpdfstring{lws\+\_\+protocol\+\_\+get(struct lws $\ast$wsi) L\+W\+S\+\_\+\+W\+A\+R\+N\+\_\+\+D\+E\+P\+R\+E\+C\+A\+T\+ED}{lws\_protocol\_get(struct lws *wsi) LWS\_WARN\_DEPRECATED}}]{\setlength{\rightskip}{0pt plus 5cm}L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN const struct {\bf lws\+\_\+protocols}$\ast$ lws\+\_\+protocol\+\_\+get (
+\begin{DoxyParamCaption}
+\item[{struct lws $\ast$}]{wsi}
+\end{DoxyParamCaption}
+)}\hypertarget{group__Protocols-and-Plugins_ga8bbe5e65faca068845704bab911a5030}{}\label{group__Protocols-and-Plugins_ga8bbe5e65faca068845704bab911a5030}
+
+
+{\ttfamily \#include $<$\hyperlink{libwebsockets_8h}{lib/libwebsockets.\+h}$>$}
+
+\hyperlink{group__Protocols-and-Plugins_ga8bbe5e65faca068845704bab911a5030}{lws\+\_\+protocol\+\_\+get()} -\/ deprecated\+: use lws\+\_\+get\+\_\+protocol \index{Protocols and Plugins@{Protocols and Plugins}!lws\+\_\+protocol\+\_\+vh\+\_\+priv\+\_\+get@{lws\+\_\+protocol\+\_\+vh\+\_\+priv\+\_\+get}}
+\index{lws\+\_\+protocol\+\_\+vh\+\_\+priv\+\_\+get@{lws\+\_\+protocol\+\_\+vh\+\_\+priv\+\_\+get}!Protocols and Plugins@{Protocols and Plugins}}
+\subsubsection[{\texorpdfstring{lws\+\_\+protocol\+\_\+vh\+\_\+priv\+\_\+get(struct lws\+\_\+vhost $\ast$vhost, const struct lws\+\_\+protocols $\ast$prot)}{lws\_protocol\_vh\_priv\_get(struct lws\_vhost *vhost, const struct lws\_protocols *prot)}}]{\setlength{\rightskip}{0pt plus 5cm}L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN void$\ast$ lws\+\_\+protocol\+\_\+vh\+\_\+priv\+\_\+get (
+\begin{DoxyParamCaption}
+\item[{struct lws\+\_\+vhost $\ast$}]{vhost, }
+\item[{const struct {\bf lws\+\_\+protocols} $\ast$}]{prot}
+\end{DoxyParamCaption}
+)}\hypertarget{group__Protocols-and-Plugins_gaf3be4243443baac0f8be1fcfb4d25129}{}\label{group__Protocols-and-Plugins_gaf3be4243443baac0f8be1fcfb4d25129}
+
+
+{\ttfamily \#include $<$\hyperlink{libwebsockets_8h}{lib/libwebsockets.\+h}$>$}
+
+\hyperlink{group__Protocols-and-Plugins_gaf3be4243443baac0f8be1fcfb4d25129}{lws\+\_\+protocol\+\_\+vh\+\_\+priv\+\_\+get()} -\/ retreive a protocol\textquotesingle{}s per-\/vhost storage
+
+
+\begin{DoxyParams}{Parameters}
+{\em vhost} & vhost the instance is related to \\
+\hline
+{\em prot} & protocol the instance is related to\\
+\hline
+\end{DoxyParams}
+Recover a pointer to the allocated per-\/vhost storage for the protocol created by \hyperlink{group__Protocols-and-Plugins_gaec0c0477288ff3f83aff38d357b883d1}{lws\+\_\+protocol\+\_\+vh\+\_\+priv\+\_\+zalloc()} earlier \index{Protocols and Plugins@{Protocols and Plugins}!lws\+\_\+protocol\+\_\+vh\+\_\+priv\+\_\+zalloc@{lws\+\_\+protocol\+\_\+vh\+\_\+priv\+\_\+zalloc}}
+\index{lws\+\_\+protocol\+\_\+vh\+\_\+priv\+\_\+zalloc@{lws\+\_\+protocol\+\_\+vh\+\_\+priv\+\_\+zalloc}!Protocols and Plugins@{Protocols and Plugins}}
+\subsubsection[{\texorpdfstring{lws\+\_\+protocol\+\_\+vh\+\_\+priv\+\_\+zalloc(struct lws\+\_\+vhost $\ast$vhost, const struct lws\+\_\+protocols $\ast$prot, int size)}{lws\_protocol\_vh\_priv\_zalloc(struct lws\_vhost *vhost, const struct lws\_protocols *prot, int size)}}]{\setlength{\rightskip}{0pt plus 5cm}L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN void$\ast$ lws\+\_\+protocol\+\_\+vh\+\_\+priv\+\_\+zalloc (
+\begin{DoxyParamCaption}
+\item[{struct lws\+\_\+vhost $\ast$}]{vhost, }
+\item[{const struct {\bf lws\+\_\+protocols} $\ast$}]{prot, }
+\item[{int}]{size}
+\end{DoxyParamCaption}
+)}\hypertarget{group__Protocols-and-Plugins_gaec0c0477288ff3f83aff38d357b883d1}{}\label{group__Protocols-and-Plugins_gaec0c0477288ff3f83aff38d357b883d1}
+
+
+{\ttfamily \#include $<$\hyperlink{libwebsockets_8h}{lib/libwebsockets.\+h}$>$}
+
+\hyperlink{group__Protocols-and-Plugins_gaec0c0477288ff3f83aff38d357b883d1}{lws\+\_\+protocol\+\_\+vh\+\_\+priv\+\_\+zalloc()} -\/ Allocate and zero down a protocol\textquotesingle{}s per-\/vhost storage
+\begin{DoxyParams}{Parameters}
+{\em vhost} & vhost the instance is related to \\
+\hline
+{\em prot} & protocol the instance is related to \\
+\hline
+{\em size} & bytes to allocate\\
+\hline
+\end{DoxyParams}
+Protocols often find it useful to allocate a per-\/vhost struct, this is a helper to be called in the per-\/vhost init L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+P\+R\+O\+T\+O\+C\+O\+L\+\_\+\+I\+N\+IT \index{Protocols and Plugins@{Protocols and Plugins}!lws\+\_\+vhost\+\_\+name\+\_\+to\+\_\+protocol@{lws\+\_\+vhost\+\_\+name\+\_\+to\+\_\+protocol}}
+\index{lws\+\_\+vhost\+\_\+name\+\_\+to\+\_\+protocol@{lws\+\_\+vhost\+\_\+name\+\_\+to\+\_\+protocol}!Protocols and Plugins@{Protocols and Plugins}}
+\subsubsection[{\texorpdfstring{lws\+\_\+vhost\+\_\+name\+\_\+to\+\_\+protocol(struct lws\+\_\+vhost $\ast$vh, const char $\ast$name)}{lws\_vhost\_name\_to\_protocol(struct lws\_vhost *vh, const char *name)}}]{\setlength{\rightskip}{0pt plus 5cm}L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN const struct {\bf lws\+\_\+protocols}$\ast$ lws\+\_\+vhost\+\_\+name\+\_\+to\+\_\+protocol (
+\begin{DoxyParamCaption}
+\item[{struct lws\+\_\+vhost $\ast$}]{vh, }
+\item[{const char $\ast$}]{name}
+\end{DoxyParamCaption}
+)}\hypertarget{group__Protocols-and-Plugins_ga25754726d97c5f519d313e691a9fe29d}{}\label{group__Protocols-and-Plugins_ga25754726d97c5f519d313e691a9fe29d}
+
+
+{\ttfamily \#include $<$\hyperlink{libwebsockets_8h}{lib/libwebsockets.\+h}$>$}
+
+\hyperlink{group__Protocols-and-Plugins_ga25754726d97c5f519d313e691a9fe29d}{lws\+\_\+vhost\+\_\+name\+\_\+to\+\_\+protocol()} -\/ get vhost\textquotesingle{}s protocol object from its name
+
+
+\begin{DoxyParams}{Parameters}
+{\em vh} & vhost to search \\
+\hline
+{\em name} & protocol name\\
+\hline
+\end{DoxyParams}
+Returns N\+U\+LL or a pointer to the vhost\textquotesingle{}s protocol of the requested name
\ No newline at end of file
--- /dev/null
+\hypertarget{group__callback-when-writeable}{}\section{Callback when writeable}
+\label{group__callback-when-writeable}\index{Callback when writeable@{Callback when writeable}}
+\subsection*{Functions}
+\begin{DoxyCompactItemize}
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int \hyperlink{group__callback-when-writeable_ga941caaa468bc507b1cae52275f58800d}{lws\+\_\+callback\+\_\+on\+\_\+writable} (struct lws $\ast$wsi)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int \hyperlink{group__callback-when-writeable_gabbe4655c7eeb3eb1671b2323ec6b3107}{lws\+\_\+callback\+\_\+on\+\_\+writable\+\_\+all\+\_\+protocol} (const struct lws\+\_\+context $\ast$context, const struct \hyperlink{structlws__protocols}{lws\+\_\+protocols} $\ast$protocol)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int \hyperlink{group__callback-when-writeable_ga8570860e191b62db264f2bac67354ea8}{lws\+\_\+callback\+\_\+on\+\_\+writable\+\_\+all\+\_\+protocol\+\_\+vhost} (const struct lws\+\_\+vhost $\ast$vhost, const struct \hyperlink{structlws__protocols}{lws\+\_\+protocols} $\ast$protocol)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int \hyperlink{group__callback-when-writeable_gacf04bbe089f47c971c6408c5efe2ac70}{lws\+\_\+callback\+\_\+all\+\_\+protocol} (struct lws\+\_\+context $\ast$context, const struct \hyperlink{structlws__protocols}{lws\+\_\+protocols} $\ast$protocol, int reason)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int \hyperlink{group__callback-when-writeable_ga13c984d8c5a44a745fd02bc2fba36053}{lws\+\_\+callback\+\_\+all\+\_\+protocol\+\_\+vhost} (struct lws\+\_\+vhost $\ast$vh, const struct \hyperlink{structlws__protocols}{lws\+\_\+protocols} $\ast$protocol, int reason)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int \hyperlink{group__callback-when-writeable_ga60939cf0c073d933fde3d17f3591caf5}{lws\+\_\+callback\+\_\+vhost\+\_\+protocols} (struct lws $\ast$wsi, int reason, void $\ast$in, int len)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int \hyperlink{group__callback-when-writeable_gaa709e02a10558753c851e58f1e2c16ba}{lws\+\_\+get\+\_\+socket\+\_\+fd} (struct lws $\ast$wsi)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN size\+\_\+t \hyperlink{group__callback-when-writeable_gac4643fe16b0940ae5b68b4ee6195cbde}{lws\+\_\+get\+\_\+peer\+\_\+write\+\_\+allowance} (struct lws $\ast$wsi)
+\end{DoxyCompactItemize}
+
+
+\subsection{Detailed Description}
+\subsubsection*{Callback When Writeable}
+
+lws can only write data on a connection when it is able to accept more data without blocking.
+
+So a basic requirement is we should only use the \hyperlink{group__sending-data_gafd5fdd285a0e25ba7e3e1051deec1001}{lws\+\_\+write()} apis when the connection we want to write on says that he can accept more data.
+
+When lws cannot complete your send at the time, it will buffer the data and send it in the background, suppressing any further W\+R\+I\+T\+E\+A\+B\+LE callbacks on that connection until it completes. So it is important to write new things in a new writeable callback.
+
+These apis reflect the various ways we can indicate we would like to be called back when one or more connections is writeable.
+
+\subsection{Function Documentation}
+\index{Callback when writeable@{Callback when writeable}!lws\+\_\+callback\+\_\+all\+\_\+protocol@{lws\+\_\+callback\+\_\+all\+\_\+protocol}}
+\index{lws\+\_\+callback\+\_\+all\+\_\+protocol@{lws\+\_\+callback\+\_\+all\+\_\+protocol}!Callback when writeable@{Callback when writeable}}
+\subsubsection[{\texorpdfstring{lws\+\_\+callback\+\_\+all\+\_\+protocol(struct lws\+\_\+context $\ast$context, const struct lws\+\_\+protocols $\ast$protocol, int reason)}{lws\_callback\_all\_protocol(struct lws\_context *context, const struct lws\_protocols *protocol, int reason)}}]{\setlength{\rightskip}{0pt plus 5cm}L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int lws\+\_\+callback\+\_\+all\+\_\+protocol (
+\begin{DoxyParamCaption}
+\item[{struct lws\+\_\+context $\ast$}]{context, }
+\item[{const struct {\bf lws\+\_\+protocols} $\ast$}]{protocol, }
+\item[{int}]{reason}
+\end{DoxyParamCaption}
+)}\hypertarget{group__callback-when-writeable_gacf04bbe089f47c971c6408c5efe2ac70}{}\label{group__callback-when-writeable_gacf04bbe089f47c971c6408c5efe2ac70}
+
+
+{\ttfamily \#include $<$\hyperlink{libwebsockets_8h}{lib/libwebsockets.\+h}$>$}
+
+\hyperlink{group__callback-when-writeable_gacf04bbe089f47c971c6408c5efe2ac70}{lws\+\_\+callback\+\_\+all\+\_\+protocol()} -\/ Callback all connections using the given protocol with the given reason
+
+
+\begin{DoxyParams}{Parameters}
+{\em context} & lws\+\_\+context \\
+\hline
+{\em protocol} & Protocol whose connections will get callbacks \\
+\hline
+{\em reason} & Callback reason index\\
+\hline
+\end{DoxyParams}
+
+\begin{DoxyItemize}
+\item Which\+: connections using this protocol on A\+LL V\+H\+O\+S\+TS
+\item When\+: when the individual connection becomes writeable
+\item What\+: reason
+\end{DoxyItemize}\index{Callback when writeable@{Callback when writeable}!lws\+\_\+callback\+\_\+all\+\_\+protocol\+\_\+vhost@{lws\+\_\+callback\+\_\+all\+\_\+protocol\+\_\+vhost}}
+\index{lws\+\_\+callback\+\_\+all\+\_\+protocol\+\_\+vhost@{lws\+\_\+callback\+\_\+all\+\_\+protocol\+\_\+vhost}!Callback when writeable@{Callback when writeable}}
+\subsubsection[{\texorpdfstring{lws\+\_\+callback\+\_\+all\+\_\+protocol\+\_\+vhost(struct lws\+\_\+vhost $\ast$vh, const struct lws\+\_\+protocols $\ast$protocol, int reason)}{lws\_callback\_all\_protocol\_vhost(struct lws\_vhost *vh, const struct lws\_protocols *protocol, int reason)}}]{\setlength{\rightskip}{0pt plus 5cm}L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int lws\+\_\+callback\+\_\+all\+\_\+protocol\+\_\+vhost (
+\begin{DoxyParamCaption}
+\item[{struct lws\+\_\+vhost $\ast$}]{vh, }
+\item[{const struct {\bf lws\+\_\+protocols} $\ast$}]{protocol, }
+\item[{int}]{reason}
+\end{DoxyParamCaption}
+)}\hypertarget{group__callback-when-writeable_ga13c984d8c5a44a745fd02bc2fba36053}{}\label{group__callback-when-writeable_ga13c984d8c5a44a745fd02bc2fba36053}
+
+
+{\ttfamily \#include $<$\hyperlink{libwebsockets_8h}{lib/libwebsockets.\+h}$>$}
+
+\hyperlink{group__callback-when-writeable_ga13c984d8c5a44a745fd02bc2fba36053}{lws\+\_\+callback\+\_\+all\+\_\+protocol\+\_\+vhost()} -\/ Callback all connections using the given protocol with the given reason
+
+
+\begin{DoxyParams}{Parameters}
+{\em vh} & Vhost whose connections will get callbacks \\
+\hline
+{\em protocol} & Which protocol to match \\
+\hline
+{\em reason} & Callback reason index\\
+\hline
+\end{DoxyParams}
+
+\begin{DoxyItemize}
+\item Which\+: connections using this protocol on G\+I\+V\+EN V\+H\+O\+ST O\+N\+LY
+\item When\+: now
+\item What\+: reason
+\end{DoxyItemize}\index{Callback when writeable@{Callback when writeable}!lws\+\_\+callback\+\_\+on\+\_\+writable@{lws\+\_\+callback\+\_\+on\+\_\+writable}}
+\index{lws\+\_\+callback\+\_\+on\+\_\+writable@{lws\+\_\+callback\+\_\+on\+\_\+writable}!Callback when writeable@{Callback when writeable}}
+\subsubsection[{\texorpdfstring{lws\+\_\+callback\+\_\+on\+\_\+writable(struct lws $\ast$wsi)}{lws\_callback\_on\_writable(struct lws *wsi)}}]{\setlength{\rightskip}{0pt plus 5cm}L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int lws\+\_\+callback\+\_\+on\+\_\+writable (
+\begin{DoxyParamCaption}
+\item[{struct lws $\ast$}]{wsi}
+\end{DoxyParamCaption}
+)}\hypertarget{group__callback-when-writeable_ga941caaa468bc507b1cae52275f58800d}{}\label{group__callback-when-writeable_ga941caaa468bc507b1cae52275f58800d}
+
+
+{\ttfamily \#include $<$\hyperlink{libwebsockets_8h}{lib/libwebsockets.\+h}$>$}
+
+\hyperlink{group__callback-when-writeable_ga941caaa468bc507b1cae52275f58800d}{lws\+\_\+callback\+\_\+on\+\_\+writable()} -\/ Request a callback when this socket becomes able to be written to without blocking
+
+
+\begin{DoxyParams}{Parameters}
+{\em wsi} & Websocket connection instance to get callback for\\
+\hline
+\end{DoxyParams}
+
+\begin{DoxyItemize}
+\item Which\+: only this wsi
+\item When\+: when the individual connection becomes writeable
+\item What\+: L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+$\ast$\+\_\+\+W\+R\+I\+T\+E\+A\+B\+LE
+\end{DoxyItemize}\index{Callback when writeable@{Callback when writeable}!lws\+\_\+callback\+\_\+on\+\_\+writable\+\_\+all\+\_\+protocol@{lws\+\_\+callback\+\_\+on\+\_\+writable\+\_\+all\+\_\+protocol}}
+\index{lws\+\_\+callback\+\_\+on\+\_\+writable\+\_\+all\+\_\+protocol@{lws\+\_\+callback\+\_\+on\+\_\+writable\+\_\+all\+\_\+protocol}!Callback when writeable@{Callback when writeable}}
+\subsubsection[{\texorpdfstring{lws\+\_\+callback\+\_\+on\+\_\+writable\+\_\+all\+\_\+protocol(const struct lws\+\_\+context $\ast$context, const struct lws\+\_\+protocols $\ast$protocol)}{lws\_callback\_on\_writable\_all\_protocol(const struct lws\_context *context, const struct lws\_protocols *protocol)}}]{\setlength{\rightskip}{0pt plus 5cm}L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int lws\+\_\+callback\+\_\+on\+\_\+writable\+\_\+all\+\_\+protocol (
+\begin{DoxyParamCaption}
+\item[{const struct lws\+\_\+context $\ast$}]{context, }
+\item[{const struct {\bf lws\+\_\+protocols} $\ast$}]{protocol}
+\end{DoxyParamCaption}
+)}\hypertarget{group__callback-when-writeable_gabbe4655c7eeb3eb1671b2323ec6b3107}{}\label{group__callback-when-writeable_gabbe4655c7eeb3eb1671b2323ec6b3107}
+
+
+{\ttfamily \#include $<$\hyperlink{libwebsockets_8h}{lib/libwebsockets.\+h}$>$}
+
+\hyperlink{group__callback-when-writeable_gabbe4655c7eeb3eb1671b2323ec6b3107}{lws\+\_\+callback\+\_\+on\+\_\+writable\+\_\+all\+\_\+protocol()} -\/ Request a callback for all connections on same vhost using the given protocol when it becomes possible to write to each socket without blocking in turn.
+
+
+\begin{DoxyParams}{Parameters}
+{\em context} & lws\+\_\+context \\
+\hline
+{\em protocol} & Protocol whose connections will get callbacks\\
+\hline
+\end{DoxyParams}
+
+\begin{DoxyItemize}
+\item Which\+: connections using this protocol on A\+NY V\+H\+O\+ST
+\item When\+: when the individual connection becomes writeable
+\item What\+: L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+$\ast$\+\_\+\+W\+R\+I\+T\+E\+A\+B\+LE
+\end{DoxyItemize}\index{Callback when writeable@{Callback when writeable}!lws\+\_\+callback\+\_\+on\+\_\+writable\+\_\+all\+\_\+protocol\+\_\+vhost@{lws\+\_\+callback\+\_\+on\+\_\+writable\+\_\+all\+\_\+protocol\+\_\+vhost}}
+\index{lws\+\_\+callback\+\_\+on\+\_\+writable\+\_\+all\+\_\+protocol\+\_\+vhost@{lws\+\_\+callback\+\_\+on\+\_\+writable\+\_\+all\+\_\+protocol\+\_\+vhost}!Callback when writeable@{Callback when writeable}}
+\subsubsection[{\texorpdfstring{lws\+\_\+callback\+\_\+on\+\_\+writable\+\_\+all\+\_\+protocol\+\_\+vhost(const struct lws\+\_\+vhost $\ast$vhost, const struct lws\+\_\+protocols $\ast$protocol)}{lws\_callback\_on\_writable\_all\_protocol\_vhost(const struct lws\_vhost *vhost, const struct lws\_protocols *protocol)}}]{\setlength{\rightskip}{0pt plus 5cm}L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int lws\+\_\+callback\+\_\+on\+\_\+writable\+\_\+all\+\_\+protocol\+\_\+vhost (
+\begin{DoxyParamCaption}
+\item[{const struct lws\+\_\+vhost $\ast$}]{vhost, }
+\item[{const struct {\bf lws\+\_\+protocols} $\ast$}]{protocol}
+\end{DoxyParamCaption}
+)}\hypertarget{group__callback-when-writeable_ga8570860e191b62db264f2bac67354ea8}{}\label{group__callback-when-writeable_ga8570860e191b62db264f2bac67354ea8}
+
+
+{\ttfamily \#include $<$\hyperlink{libwebsockets_8h}{lib/libwebsockets.\+h}$>$}
+
+\hyperlink{group__callback-when-writeable_ga8570860e191b62db264f2bac67354ea8}{lws\+\_\+callback\+\_\+on\+\_\+writable\+\_\+all\+\_\+protocol\+\_\+vhost()} -\/ Request a callback for all connections using the given protocol when it becomes possible to write to each socket without blocking in turn.
+
+
+\begin{DoxyParams}{Parameters}
+{\em vhost} & Only consider connections on this lws\+\_\+vhost \\
+\hline
+{\em protocol} & Protocol whose connections will get callbacks\\
+\hline
+\end{DoxyParams}
+
+\begin{DoxyItemize}
+\item Which\+: connections using this protocol on G\+I\+V\+EN V\+H\+O\+ST O\+N\+LY
+\item When\+: when the individual connection becomes writeable
+\item What\+: L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+$\ast$\+\_\+\+W\+R\+I\+T\+E\+A\+B\+LE
+\end{DoxyItemize}\index{Callback when writeable@{Callback when writeable}!lws\+\_\+callback\+\_\+vhost\+\_\+protocols@{lws\+\_\+callback\+\_\+vhost\+\_\+protocols}}
+\index{lws\+\_\+callback\+\_\+vhost\+\_\+protocols@{lws\+\_\+callback\+\_\+vhost\+\_\+protocols}!Callback when writeable@{Callback when writeable}}
+\subsubsection[{\texorpdfstring{lws\+\_\+callback\+\_\+vhost\+\_\+protocols(struct lws $\ast$wsi, int reason, void $\ast$in, int len)}{lws\_callback\_vhost\_protocols(struct lws *wsi, int reason, void *in, int len)}}]{\setlength{\rightskip}{0pt plus 5cm}L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int lws\+\_\+callback\+\_\+vhost\+\_\+protocols (
+\begin{DoxyParamCaption}
+\item[{struct lws $\ast$}]{wsi, }
+\item[{int}]{reason, }
+\item[{void $\ast$}]{in, }
+\item[{int}]{len}
+\end{DoxyParamCaption}
+)}\hypertarget{group__callback-when-writeable_ga60939cf0c073d933fde3d17f3591caf5}{}\label{group__callback-when-writeable_ga60939cf0c073d933fde3d17f3591caf5}
+
+
+{\ttfamily \#include $<$\hyperlink{libwebsockets_8h}{lib/libwebsockets.\+h}$>$}
+
+\hyperlink{group__callback-when-writeable_ga60939cf0c073d933fde3d17f3591caf5}{lws\+\_\+callback\+\_\+vhost\+\_\+protocols()} -\/ Callback all protocols enabled on a vhost with the given reason
+
+
+\begin{DoxyParams}{Parameters}
+{\em wsi} & wsi whose vhost will get callbacks \\
+\hline
+{\em reason} & Callback reason index \\
+\hline
+{\em in} & in argument to callback \\
+\hline
+{\em len} & len argument to callback\\
+\hline
+\end{DoxyParams}
+
+\begin{DoxyItemize}
+\item Which\+: connections using this protocol on same V\+H\+O\+ST as wsi O\+N\+LY
+\item When\+: now
+\item What\+: reason
+\end{DoxyItemize}\index{Callback when writeable@{Callback when writeable}!lws\+\_\+get\+\_\+peer\+\_\+write\+\_\+allowance@{lws\+\_\+get\+\_\+peer\+\_\+write\+\_\+allowance}}
+\index{lws\+\_\+get\+\_\+peer\+\_\+write\+\_\+allowance@{lws\+\_\+get\+\_\+peer\+\_\+write\+\_\+allowance}!Callback when writeable@{Callback when writeable}}
+\subsubsection[{\texorpdfstring{lws\+\_\+get\+\_\+peer\+\_\+write\+\_\+allowance(struct lws $\ast$wsi)}{lws\_get\_peer\_write\_allowance(struct lws *wsi)}}]{\setlength{\rightskip}{0pt plus 5cm}L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN size\+\_\+t lws\+\_\+get\+\_\+peer\+\_\+write\+\_\+allowance (
+\begin{DoxyParamCaption}
+\item[{struct lws $\ast$}]{wsi}
+\end{DoxyParamCaption}
+)}\hypertarget{group__callback-when-writeable_gac4643fe16b0940ae5b68b4ee6195cbde}{}\label{group__callback-when-writeable_gac4643fe16b0940ae5b68b4ee6195cbde}
+
+
+{\ttfamily \#include $<$\hyperlink{libwebsockets_8h}{lib/libwebsockets.\+h}$>$}
+
+\hyperlink{group__callback-when-writeable_gac4643fe16b0940ae5b68b4ee6195cbde}{lws\+\_\+get\+\_\+peer\+\_\+write\+\_\+allowance()} -\/ get the amount of data writeable to peer if known
+
+
+\begin{DoxyParams}{Parameters}
+{\em wsi} & Websocket connection instance\\
+\hline
+\end{DoxyParams}
+if the protocol does not have any guidance, returns -\/1. Currently only http2 connections get send window information from this A\+PI. But your code should use it so it can work properly with any protocol.
+
+If nonzero return is the amount of payload data the peer or intermediary has reported it has buffer space for. That has NO relationship with the amount of buffer space your OS can accept on this connection for a write action.
+
+This number represents the maximum you could send to the peer or intermediary on this connection right now without the protocol complaining.
+
+lws manages accounting for send window updates and payload writes automatically, so this number reflects the situation at the peer or intermediary dynamically. \index{Callback when writeable@{Callback when writeable}!lws\+\_\+get\+\_\+socket\+\_\+fd@{lws\+\_\+get\+\_\+socket\+\_\+fd}}
+\index{lws\+\_\+get\+\_\+socket\+\_\+fd@{lws\+\_\+get\+\_\+socket\+\_\+fd}!Callback when writeable@{Callback when writeable}}
+\subsubsection[{\texorpdfstring{lws\+\_\+get\+\_\+socket\+\_\+fd(struct lws $\ast$wsi)}{lws\_get\_socket\_fd(struct lws *wsi)}}]{\setlength{\rightskip}{0pt plus 5cm}L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int lws\+\_\+get\+\_\+socket\+\_\+fd (
+\begin{DoxyParamCaption}
+\item[{struct lws $\ast$}]{wsi}
+\end{DoxyParamCaption}
+)}\hypertarget{group__callback-when-writeable_gaa709e02a10558753c851e58f1e2c16ba}{}\label{group__callback-when-writeable_gaa709e02a10558753c851e58f1e2c16ba}
+
+
+{\ttfamily \#include $<$\hyperlink{libwebsockets_8h}{lib/libwebsockets.\+h}$>$}
+
+\hyperlink{group__callback-when-writeable_gaa709e02a10558753c851e58f1e2c16ba}{lws\+\_\+get\+\_\+socket\+\_\+fd()} -\/ returns the socket file descriptor
+
+You will not need this unless you are doing something special
+
+
+\begin{DoxyParams}{Parameters}
+{\em wsi} & Websocket connection instance \\
+\hline
+\end{DoxyParams}
--- /dev/null
+\hypertarget{group__cgi}{}\section{cgi handling}
+\label{group__cgi}\index{cgi handling@{cgi handling}}
+\subsubsection*{C\+GI handling}
+
+These functions allow low-\/level control over stdin/out/err of the cgi.
+
+However for most cases, binding the cgi to http in and out, the default lws implementation already does the right thing.
\ No newline at end of file
--- /dev/null
+\hypertarget{group__client}{}\section{Client}
+\label{group__client}\index{Client@{Client}}
+\subsection*{Data Structures}
+\begin{DoxyCompactItemize}
+\item
+struct \hyperlink{structlws__client__connect__info}{lws\+\_\+client\+\_\+connect\+\_\+info}
+\end{DoxyCompactItemize}
+\subsection*{Functions}
+\begin{DoxyCompactItemize}
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN struct lws $\ast$L\+W\+S\+\_\+\+W\+A\+R\+N\+\_\+\+U\+N\+U\+S\+E\+D\+\_\+\+R\+E\+S\+U\+LT \hyperlink{group__client_gac30a7be106abd0cedfbb2e8b8fe3a2f5}{lws\+\_\+client\+\_\+connect\+\_\+via\+\_\+info} (struct \hyperlink{structlws__client__connect__info}{lws\+\_\+client\+\_\+connect\+\_\+info} $\ast$ccinfo)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN struct lws $\ast$L\+W\+S\+\_\+\+W\+A\+R\+N\+\_\+\+U\+N\+U\+S\+E\+D\+\_\+\+R\+E\+S\+U\+LT \hyperlink{group__client_ga4af0a20108a95e8b6d94dd4d80055ff3}{lws\+\_\+client\+\_\+connect} (struct lws\+\_\+context $\ast$clients, const char $\ast$address, int port, int ssl\+\_\+connection, const char $\ast$path, const char $\ast$host, const char $\ast$origin, const char $\ast$protocol, int ietf\+\_\+version\+\_\+or\+\_\+minus\+\_\+one) L\+W\+S\+\_\+\+W\+A\+R\+N\+\_\+\+D\+E\+P\+R\+E\+C\+A\+T\+ED
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN struct lws $\ast$L\+W\+S\+\_\+\+W\+A\+R\+N\+\_\+\+U\+N\+U\+S\+E\+D\+\_\+\+R\+E\+S\+U\+LT \hyperlink{group__client_gac6a8558b4410961a880241c2ac1271e2}{lws\+\_\+client\+\_\+connect\+\_\+extended} (struct lws\+\_\+context $\ast$clients, const char $\ast$address, int port, int ssl\+\_\+connection, const char $\ast$path, const char $\ast$host, const char $\ast$origin, const char $\ast$protocol, int ietf\+\_\+version\+\_\+or\+\_\+minus\+\_\+one, void $\ast$userdata) L\+W\+S\+\_\+\+W\+A\+R\+N\+\_\+\+D\+E\+P\+R\+E\+C\+A\+T\+ED
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int \hyperlink{group__client_ga4f44b8230e6732816ca5cd8d1aaaf340}{lws\+\_\+init\+\_\+vhost\+\_\+client\+\_\+ssl} (const struct \hyperlink{structlws__context__creation__info}{lws\+\_\+context\+\_\+creation\+\_\+info} $\ast$info, struct lws\+\_\+vhost $\ast$vhost)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int {\bfseries lws\+\_\+http\+\_\+client\+\_\+read} (struct lws $\ast$wsi, char $\ast$$\ast$buf, int $\ast$len)\hypertarget{group__client_ga4450c34200bf9dab3beb90ef23221870}{}\label{group__client_ga4450c34200bf9dab3beb90ef23221870}
+
+\end{DoxyCompactItemize}
+
+
+\subsection{Detailed Description}
+\subsubsection*{Client releated functions}
+
+\subsection{Function Documentation}
+\index{Client@{Client}!lws\+\_\+client\+\_\+connect@{lws\+\_\+client\+\_\+connect}}
+\index{lws\+\_\+client\+\_\+connect@{lws\+\_\+client\+\_\+connect}!Client@{Client}}
+\subsubsection[{\texorpdfstring{lws\+\_\+client\+\_\+connect(struct lws\+\_\+context $\ast$clients, const char $\ast$address, int port, int ssl\+\_\+connection, const char $\ast$path, const char $\ast$host, const char $\ast$origin, const char $\ast$protocol, int ietf\+\_\+version\+\_\+or\+\_\+minus\+\_\+one) L\+W\+S\+\_\+\+W\+A\+R\+N\+\_\+\+D\+E\+P\+R\+E\+C\+A\+T\+ED}{lws\_client\_connect(struct lws\_context *clients, const char *address, int port, int ssl\_connection, const char *path, const char *host, const char *origin, const char *protocol, int ietf\_version\_or\_minus\_one) LWS\_WARN\_DEPRECATED}}]{\setlength{\rightskip}{0pt plus 5cm}L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN struct lws$\ast$ L\+W\+S\+\_\+\+W\+A\+R\+N\+\_\+\+U\+N\+U\+S\+E\+D\+\_\+\+R\+E\+S\+U\+LT lws\+\_\+client\+\_\+connect (
+\begin{DoxyParamCaption}
+\item[{struct lws\+\_\+context $\ast$}]{clients, }
+\item[{const char $\ast$}]{address, }
+\item[{int}]{port, }
+\item[{int}]{ssl\+\_\+connection, }
+\item[{const char $\ast$}]{path, }
+\item[{const char $\ast$}]{host, }
+\item[{const char $\ast$}]{origin, }
+\item[{const char $\ast$}]{protocol, }
+\item[{int}]{ietf\+\_\+version\+\_\+or\+\_\+minus\+\_\+one}
+\end{DoxyParamCaption}
+)}\hypertarget{group__client_ga4af0a20108a95e8b6d94dd4d80055ff3}{}\label{group__client_ga4af0a20108a95e8b6d94dd4d80055ff3}
+
+
+{\ttfamily \#include $<$\hyperlink{libwebsockets_8h}{lib/libwebsockets.\+h}$>$}
+
+\hyperlink{group__client_ga4af0a20108a95e8b6d94dd4d80055ff3}{lws\+\_\+client\+\_\+connect()} -\/ Connect to another websocket server \begin{DoxyRefDesc}{Deprecated}
+\item[\hyperlink{deprecated__deprecated000002}{Deprecated}]D\+E\+P\+R\+E\+C\+A\+T\+ED use lws\+\_\+client\+\_\+connect\+\_\+via\+\_\+info \end{DoxyRefDesc}
+
+\begin{DoxyParams}{Parameters}
+{\em clients} & Websocket context \\
+\hline
+{\em address} & Remote server address, eg, \char`\"{}myserver.\+com\char`\"{} \\
+\hline
+{\em port} & Port to connect to on the remote server, eg, 80 \\
+\hline
+{\em ssl\+\_\+connection} & 0 = ws\+://, 1 = wss\+:// encrypted, 2 = wss\+:// allow self signed certs \\
+\hline
+{\em path} & Websocket path on server \\
+\hline
+{\em host} & Hostname on server \\
+\hline
+{\em origin} & Socket origin name \\
+\hline
+{\em protocol} & Comma-\/separated list of protocols being asked for from the server, or just one. The server will pick the one it likes best. If you don\textquotesingle{}t want to specify a protocol, which is legal, use N\+U\+LL here. \\
+\hline
+{\em ietf\+\_\+version\+\_\+or\+\_\+minus\+\_\+one} & -\/1 to ask to connect using the default, latest protocol supported, or the specific protocol ordinal\\
+\hline
+\end{DoxyParams}
+This function creates a connection to a remote server \index{Client@{Client}!lws\+\_\+client\+\_\+connect\+\_\+extended@{lws\+\_\+client\+\_\+connect\+\_\+extended}}
+\index{lws\+\_\+client\+\_\+connect\+\_\+extended@{lws\+\_\+client\+\_\+connect\+\_\+extended}!Client@{Client}}
+\subsubsection[{\texorpdfstring{lws\+\_\+client\+\_\+connect\+\_\+extended(struct lws\+\_\+context $\ast$clients, const char $\ast$address, int port, int ssl\+\_\+connection, const char $\ast$path, const char $\ast$host, const char $\ast$origin, const char $\ast$protocol, int ietf\+\_\+version\+\_\+or\+\_\+minus\+\_\+one, void $\ast$userdata) L\+W\+S\+\_\+\+W\+A\+R\+N\+\_\+\+D\+E\+P\+R\+E\+C\+A\+T\+ED}{lws\_client\_connect\_extended(struct lws\_context *clients, const char *address, int port, int ssl\_connection, const char *path, const char *host, const char *origin, const char *protocol, int ietf\_version\_or\_minus\_one, void *userdata) LWS\_WARN\_DEPRECATED}}]{\setlength{\rightskip}{0pt plus 5cm}L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN struct lws$\ast$ L\+W\+S\+\_\+\+W\+A\+R\+N\+\_\+\+U\+N\+U\+S\+E\+D\+\_\+\+R\+E\+S\+U\+LT lws\+\_\+client\+\_\+connect\+\_\+extended (
+\begin{DoxyParamCaption}
+\item[{struct lws\+\_\+context $\ast$}]{clients, }
+\item[{const char $\ast$}]{address, }
+\item[{int}]{port, }
+\item[{int}]{ssl\+\_\+connection, }
+\item[{const char $\ast$}]{path, }
+\item[{const char $\ast$}]{host, }
+\item[{const char $\ast$}]{origin, }
+\item[{const char $\ast$}]{protocol, }
+\item[{int}]{ietf\+\_\+version\+\_\+or\+\_\+minus\+\_\+one, }
+\item[{void $\ast$}]{userdata}
+\end{DoxyParamCaption}
+)}\hypertarget{group__client_gac6a8558b4410961a880241c2ac1271e2}{}\label{group__client_gac6a8558b4410961a880241c2ac1271e2}
+
+
+{\ttfamily \#include $<$\hyperlink{libwebsockets_8h}{lib/libwebsockets.\+h}$>$}
+
+\hyperlink{group__client_gac6a8558b4410961a880241c2ac1271e2}{lws\+\_\+client\+\_\+connect\+\_\+extended()} -\/ Connect to another websocket server \begin{DoxyRefDesc}{Deprecated}
+\item[\hyperlink{deprecated__deprecated000003}{Deprecated}]D\+E\+P\+R\+E\+C\+A\+T\+ED use lws\+\_\+client\+\_\+connect\+\_\+via\+\_\+info \end{DoxyRefDesc}
+
+\begin{DoxyParams}{Parameters}
+{\em clients} & Websocket context \\
+\hline
+{\em address} & Remote server address, eg, \char`\"{}myserver.\+com\char`\"{} \\
+\hline
+{\em port} & Port to connect to on the remote server, eg, 80 \\
+\hline
+{\em ssl\+\_\+connection} & 0 = ws\+://, 1 = wss\+:// encrypted, 2 = wss\+:// allow self signed certs \\
+\hline
+{\em path} & Websocket path on server \\
+\hline
+{\em host} & Hostname on server \\
+\hline
+{\em origin} & Socket origin name \\
+\hline
+{\em protocol} & Comma-\/separated list of protocols being asked for from the server, or just one. The server will pick the one it likes best. \\
+\hline
+{\em ietf\+\_\+version\+\_\+or\+\_\+minus\+\_\+one} & -\/1 to ask to connect using the default, latest protocol supported, or the specific protocol ordinal \\
+\hline
+{\em userdata} & Pre-\/allocated user data \begin{DoxyVerb} This function creates a connection to a remote server\end{DoxyVerb}
+ \\
+\hline
+\end{DoxyParams}
+\index{Client@{Client}!lws\+\_\+client\+\_\+connect\+\_\+via\+\_\+info@{lws\+\_\+client\+\_\+connect\+\_\+via\+\_\+info}}
+\index{lws\+\_\+client\+\_\+connect\+\_\+via\+\_\+info@{lws\+\_\+client\+\_\+connect\+\_\+via\+\_\+info}!Client@{Client}}
+\subsubsection[{\texorpdfstring{lws\+\_\+client\+\_\+connect\+\_\+via\+\_\+info(struct lws\+\_\+client\+\_\+connect\+\_\+info $\ast$ccinfo)}{lws\_client\_connect\_via\_info(struct lws\_client\_connect\_info *ccinfo)}}]{\setlength{\rightskip}{0pt plus 5cm}L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN struct lws$\ast$ L\+W\+S\+\_\+\+W\+A\+R\+N\+\_\+\+U\+N\+U\+S\+E\+D\+\_\+\+R\+E\+S\+U\+LT lws\+\_\+client\+\_\+connect\+\_\+via\+\_\+info (
+\begin{DoxyParamCaption}
+\item[{struct {\bf lws\+\_\+client\+\_\+connect\+\_\+info} $\ast$}]{ccinfo}
+\end{DoxyParamCaption}
+)}\hypertarget{group__client_gac30a7be106abd0cedfbb2e8b8fe3a2f5}{}\label{group__client_gac30a7be106abd0cedfbb2e8b8fe3a2f5}
+
+
+{\ttfamily \#include $<$\hyperlink{libwebsockets_8h}{lib/libwebsockets.\+h}$>$}
+
+\hyperlink{group__client_gac30a7be106abd0cedfbb2e8b8fe3a2f5}{lws\+\_\+client\+\_\+connect\+\_\+via\+\_\+info()} -\/ Connect to another websocket server
+\begin{DoxyParams}{Parameters}
+{\em ccinfo} & pointer to \hyperlink{structlws__client__connect__info}{lws\+\_\+client\+\_\+connect\+\_\+info} struct \begin{DoxyVerb} This function creates a connection to a remote server\end{DoxyVerb}
+ \\
+\hline
+\end{DoxyParams}
+\index{Client@{Client}!lws\+\_\+init\+\_\+vhost\+\_\+client\+\_\+ssl@{lws\+\_\+init\+\_\+vhost\+\_\+client\+\_\+ssl}}
+\index{lws\+\_\+init\+\_\+vhost\+\_\+client\+\_\+ssl@{lws\+\_\+init\+\_\+vhost\+\_\+client\+\_\+ssl}!Client@{Client}}
+\subsubsection[{\texorpdfstring{lws\+\_\+init\+\_\+vhost\+\_\+client\+\_\+ssl(const struct lws\+\_\+context\+\_\+creation\+\_\+info $\ast$info, struct lws\+\_\+vhost $\ast$vhost)}{lws\_init\_vhost\_client\_ssl(const struct lws\_context\_creation\_info *info, struct lws\_vhost *vhost)}}]{\setlength{\rightskip}{0pt plus 5cm}L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int lws\+\_\+init\+\_\+vhost\+\_\+client\+\_\+ssl (
+\begin{DoxyParamCaption}
+\item[{const struct {\bf lws\+\_\+context\+\_\+creation\+\_\+info} $\ast$}]{info, }
+\item[{struct lws\+\_\+vhost $\ast$}]{vhost}
+\end{DoxyParamCaption}
+)}\hypertarget{group__client_ga4f44b8230e6732816ca5cd8d1aaaf340}{}\label{group__client_ga4f44b8230e6732816ca5cd8d1aaaf340}
+
+
+{\ttfamily \#include $<$\hyperlink{libwebsockets_8h}{lib/libwebsockets.\+h}$>$}
+
+\hyperlink{group__client_ga4f44b8230e6732816ca5cd8d1aaaf340}{lws\+\_\+init\+\_\+vhost\+\_\+client\+\_\+ssl()} -\/ also enable client S\+SL on an existing vhost
+
+
+\begin{DoxyParams}{Parameters}
+{\em info} & client ssl related info \\
+\hline
+{\em vhost} & which vhost to initialize client ssl operations on\\
+\hline
+\end{DoxyParams}
+You only need to call this if you plan on using S\+SL client connections on the vhost. For non-\/\+S\+SL client connections, it\textquotesingle{}s not necessary to call this.
+
+The following members of info are used during the call \begin{DoxyVerb} - options must have LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT set,
+ otherwise the call does nothing
+ - provided_client_ssl_ctx must be NULL to get a generated client
+ ssl context, otherwise you can pass a prepared one in by setting it
+ - ssl_cipher_list may be NULL or set to the client valid cipher list
+ - ssl_ca_filepath may be NULL or client cert filepath
+ - ssl_cert_filepath may be NULL or client cert filepath
+ - ssl_private_key_filepath may be NULL or client cert private key
+\end{DoxyVerb}
+
+
+You must create your vhost explicitly if you want to use this, so you have a pointer to the vhost. Create the context first with the option flag L\+W\+S\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+E\+X\+P\+L\+I\+C\+I\+T\+\_\+\+V\+H\+O\+S\+TS and then call \hyperlink{group__context-and-vhost_ga0c54c667ccd9b8b3dddcd123ca72f87c}{lws\+\_\+create\+\_\+vhost()} with the same info struct.
\ No newline at end of file
--- /dev/null
+\hypertarget{group__context-and-vhost}{}\section{Context-\/and-\/vhost}
+\label{group__context-and-vhost}\index{Context-\/and-\/vhost@{Context-\/and-\/vhost}}
+\subsection*{Modules}
+\begin{DoxyCompactItemize}
+\item
+\hyperlink{group__vhost-mounts}{Vhost mounts and options}
+\end{DoxyCompactItemize}
+\subsection*{Data Structures}
+\begin{DoxyCompactItemize}
+\item
+struct \hyperlink{structlws__context__creation__info}{lws\+\_\+context\+\_\+creation\+\_\+info}
+\item
+struct \hyperlink{structlws__protocol__vhost__options}{lws\+\_\+protocol\+\_\+vhost\+\_\+options}
+\end{DoxyCompactItemize}
+\subsection*{Enumerations}
+\begin{DoxyCompactItemize}
+\item
+enum \hyperlink{group__context-and-vhost_ga41c2d763f78cc248df3b9f8645dbd2a5}{lws\+\_\+context\+\_\+options} \{ \\*
+\hyperlink{group__context-and-vhost_gga41c2d763f78cc248df3b9f8645dbd2a5a274ed462a1a9239eb6ddf9007f5b7092}{L\+W\+S\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+R\+E\+Q\+U\+I\+R\+E\+\_\+\+V\+A\+L\+I\+D\+\_\+\+O\+P\+E\+N\+S\+S\+L\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+C\+E\+RT},
+\hyperlink{group__context-and-vhost_gga41c2d763f78cc248df3b9f8645dbd2a5a6582c985ee0ceaadc1d277030eae2d7c}{L\+W\+S\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+S\+K\+I\+P\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+C\+A\+N\+O\+N\+I\+C\+A\+L\+\_\+\+N\+A\+ME} = (1 $<$$<$ 2),
+\hyperlink{group__context-and-vhost_gga41c2d763f78cc248df3b9f8645dbd2a5a1cc4562d05cba52a6dfa0697a65ade0d}{L\+W\+S\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+A\+L\+L\+O\+W\+\_\+\+N\+O\+N\+\_\+\+S\+S\+L\+\_\+\+O\+N\+\_\+\+S\+S\+L\+\_\+\+P\+O\+RT},
+\hyperlink{group__context-and-vhost_gga41c2d763f78cc248df3b9f8645dbd2a5a273d9975675130de0c6dc937dde7c8a6}{L\+W\+S\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+L\+I\+B\+EV} = (1 $<$$<$ 4),
+\\*
+\hyperlink{group__context-and-vhost_gga41c2d763f78cc248df3b9f8645dbd2a5a34ab36e68c0d593b6f19b8d5ef1240a9}{L\+W\+S\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+D\+I\+S\+A\+B\+L\+E\+\_\+\+I\+P\+V6} = (1 $<$$<$ 5),
+\hyperlink{group__context-and-vhost_gga41c2d763f78cc248df3b9f8645dbd2a5a4933347a821e73c3f1e13fb6bfc7ad93}{L\+W\+S\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+D\+I\+S\+A\+B\+L\+E\+\_\+\+O\+S\+\_\+\+C\+A\+\_\+\+C\+E\+R\+TS} = (1 $<$$<$ 6),
+\hyperlink{group__context-and-vhost_gga41c2d763f78cc248df3b9f8645dbd2a5ac56a8a6590e74a8016d0fae09fb404fc}{L\+W\+S\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+P\+E\+E\+R\+\_\+\+C\+E\+R\+T\+\_\+\+N\+O\+T\+\_\+\+R\+E\+Q\+U\+I\+R\+ED} = (1 $<$$<$ 7),
+\hyperlink{group__context-and-vhost_gga41c2d763f78cc248df3b9f8645dbd2a5aa0158b4e85420811e6b0f1378c6ded0f}{L\+W\+S\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+V\+A\+L\+I\+D\+A\+T\+E\+\_\+\+U\+T\+F8} = (1 $<$$<$ 8),
+\\*
+\hyperlink{group__context-and-vhost_gga41c2d763f78cc248df3b9f8645dbd2a5a1b2f8bde0f62adc7ebe81b2043f34c0c}{L\+W\+S\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+S\+S\+L\+\_\+\+E\+C\+DH},
+\hyperlink{group__context-and-vhost_gga41c2d763f78cc248df3b9f8645dbd2a5aff121db04a10cf8b2c5df9d4f2b89f1e}{L\+W\+S\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+L\+I\+B\+UV} = (1 $<$$<$ 10),
+\hyperlink{group__context-and-vhost_gga41c2d763f78cc248df3b9f8645dbd2a5a4832187186c4d130c68051214cd42ada}{L\+W\+S\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+R\+E\+D\+I\+R\+E\+C\+T\+\_\+\+H\+T\+T\+P\+\_\+\+T\+O\+\_\+\+H\+T\+T\+PS},
+\hyperlink{group__context-and-vhost_gga41c2d763f78cc248df3b9f8645dbd2a5a7fed6a527c8d5e0acac1b4179644583a}{L\+W\+S\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+D\+O\+\_\+\+S\+S\+L\+\_\+\+G\+L\+O\+B\+A\+L\+\_\+\+I\+N\+IT} = (1 $<$$<$ 12),
+\\*
+\hyperlink{group__context-and-vhost_gga41c2d763f78cc248df3b9f8645dbd2a5accc9d0d11d1124a21659586164b0962e}{L\+W\+S\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+E\+X\+P\+L\+I\+C\+I\+T\+\_\+\+V\+H\+O\+S\+TS} = (1 $<$$<$ 13),
+\hyperlink{group__context-and-vhost_gga41c2d763f78cc248df3b9f8645dbd2a5a9637e9001d8c8b2521086bcafbd8a941}{L\+W\+S\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+U\+N\+I\+X\+\_\+\+S\+O\+CK} = (1 $<$$<$ 14),
+\hyperlink{group__context-and-vhost_gga41c2d763f78cc248df3b9f8645dbd2a5ac962efd35abf6c402f9fb14aa14f5016}{L\+W\+S\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+S\+TS} = (1 $<$$<$ 15),
+\hyperlink{group__context-and-vhost_gga41c2d763f78cc248df3b9f8645dbd2a5af62887536e25e053e68741006dba46d8}{L\+W\+S\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+I\+P\+V6\+\_\+\+V6\+O\+N\+L\+Y\+\_\+\+M\+O\+D\+I\+FY} = (1 $<$$<$ 16),
+\\*
+\hyperlink{group__context-and-vhost_gga41c2d763f78cc248df3b9f8645dbd2a5aca5d42820b65eac5618ec3f0bd8a1160}{L\+W\+S\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+I\+P\+V6\+\_\+\+V6\+O\+N\+L\+Y\+\_\+\+V\+A\+L\+UE} = (1 $<$$<$ 17)
+ \}
+\end{DoxyCompactItemize}
+\subsection*{Functions}
+\begin{DoxyCompactItemize}
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN struct lws\+\_\+context $\ast$ \hyperlink{group__context-and-vhost_gaf2fff58562caab7510c41eeac85a8648}{lws\+\_\+create\+\_\+context} (struct \hyperlink{structlws__context__creation__info}{lws\+\_\+context\+\_\+creation\+\_\+info} $\ast$info)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN void \hyperlink{group__context-and-vhost_ga8ee0314028755f1ddfa9428e09b4fddb}{lws\+\_\+context\+\_\+destroy} (struct lws\+\_\+context $\ast$context)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int \hyperlink{group__context-and-vhost_ga7e9d5405547a457d86e0b4f0ae2bb1c4}{lws\+\_\+set\+\_\+proxy} (struct lws\+\_\+vhost $\ast$vhost, const char $\ast$proxy)
+\item
+L\+W\+S\+\_\+\+E\+X\+T\+E\+RN L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE struct lws\+\_\+vhost $\ast$ \hyperlink{group__context-and-vhost_ga0c54c667ccd9b8b3dddcd123ca72f87c}{lws\+\_\+create\+\_\+vhost} (struct lws\+\_\+context $\ast$context, struct \hyperlink{structlws__context__creation__info}{lws\+\_\+context\+\_\+creation\+\_\+info} $\ast$info)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int \hyperlink{group__context-and-vhost_ga98d88c9080fd89c37114363a6474ea73}{lwsws\+\_\+get\+\_\+config\+\_\+globals} (struct \hyperlink{structlws__context__creation__info}{lws\+\_\+context\+\_\+creation\+\_\+info} $\ast$info, const char $\ast$d, char $\ast$$\ast$config\+\_\+strings, int $\ast$len)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int \hyperlink{group__context-and-vhost_ga341064721add2618ae1b29717493a212}{lwsws\+\_\+get\+\_\+config\+\_\+vhosts} (struct lws\+\_\+context $\ast$context, struct \hyperlink{structlws__context__creation__info}{lws\+\_\+context\+\_\+creation\+\_\+info} $\ast$info, const char $\ast$d, char $\ast$$\ast$config\+\_\+strings, int $\ast$len)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN struct lws\+\_\+vhost $\ast$ \hyperlink{group__context-and-vhost_ga8db03e19a372e34ac25cf21af894a02c}{lws\+\_\+vhost\+\_\+get} (struct lws $\ast$wsi) L\+W\+S\+\_\+\+W\+A\+R\+N\+\_\+\+D\+E\+P\+R\+E\+C\+A\+T\+ED
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN struct lws\+\_\+vhost $\ast$ \hyperlink{group__context-and-vhost_ga06e77ce2916f8bc9826ef8d9d68e3932}{lws\+\_\+get\+\_\+vhost} (struct lws $\ast$wsi)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int \hyperlink{group__context-and-vhost_ga94e6cc2223c4eec316b13bcebc3628b6}{lws\+\_\+json\+\_\+dump\+\_\+vhost} (const struct lws\+\_\+vhost $\ast$vh, char $\ast$buf, int len)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int \hyperlink{group__context-and-vhost_gae2134657cdd2ea7a59e13ad314e4c50d}{lws\+\_\+json\+\_\+dump\+\_\+context} (const struct lws\+\_\+context $\ast$context, char $\ast$buf, int len)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN void $\ast$ \hyperlink{group__context-and-vhost_gaeb12f934bfd178bd2132a9e73fc641da}{lws\+\_\+context\+\_\+user} (struct lws\+\_\+context $\ast$context)
+\end{DoxyCompactItemize}
+
+
+\subsection{Detailed Description}
+\subsubsection*{Context and Vhost releated functions}
+
+L\+WS requires that there is one context, in which you may define multiple vhosts. Each vhost is a virtual host, with either its own listen port or sharing an existing one. Each vhost has its own S\+SL context that can be set up individually or left disabled.
+
+If you don\textquotesingle{}t care about multiple \char`\"{}site\char`\"{} support, you can ignore it and lws will create a single default vhost at context creation time.
+
+\subsection{Enumeration Type Documentation}
+\index{Context-\/and-\/vhost@{Context-\/and-\/vhost}!lws\+\_\+context\+\_\+options@{lws\+\_\+context\+\_\+options}}
+\index{lws\+\_\+context\+\_\+options@{lws\+\_\+context\+\_\+options}!Context-\/and-\/vhost@{Context-\/and-\/vhost}}
+\subsubsection[{\texorpdfstring{lws\+\_\+context\+\_\+options}{lws\_context\_options}}]{\setlength{\rightskip}{0pt plus 5cm}enum {\bf lws\+\_\+context\+\_\+options}}\hypertarget{group__context-and-vhost_ga41c2d763f78cc248df3b9f8645dbd2a5}{}\label{group__context-and-vhost_ga41c2d763f78cc248df3b9f8645dbd2a5}
+
+
+{\ttfamily \#include $<$\hyperlink{libwebsockets_8h}{lib/libwebsockets.\+h}$>$}
+
+enum lws\+\_\+context\+\_\+options -\/ context and vhost options \begin{Desc}
+\item[Enumerator]\par
+\begin{description}
+\index{L\+W\+S\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+R\+E\+Q\+U\+I\+R\+E\+\_\+\+V\+A\+L\+I\+D\+\_\+\+O\+P\+E\+N\+S\+S\+L\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+C\+E\+RT@{L\+W\+S\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+R\+E\+Q\+U\+I\+R\+E\+\_\+\+V\+A\+L\+I\+D\+\_\+\+O\+P\+E\+N\+S\+S\+L\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+C\+E\+RT}!Context-\/and-\/vhost@{Context-\/and-\/vhost}}\index{Context-\/and-\/vhost@{Context-\/and-\/vhost}!L\+W\+S\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+R\+E\+Q\+U\+I\+R\+E\+\_\+\+V\+A\+L\+I\+D\+\_\+\+O\+P\+E\+N\+S\+S\+L\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+C\+E\+RT@{L\+W\+S\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+R\+E\+Q\+U\+I\+R\+E\+\_\+\+V\+A\+L\+I\+D\+\_\+\+O\+P\+E\+N\+S\+S\+L\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+C\+E\+RT}}\item[{\em
+L\+W\+S\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+R\+E\+Q\+U\+I\+R\+E\+\_\+\+V\+A\+L\+I\+D\+\_\+\+O\+P\+E\+N\+S\+S\+L\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+C\+E\+RT\hypertarget{group__context-and-vhost_gga41c2d763f78cc248df3b9f8645dbd2a5a274ed462a1a9239eb6ddf9007f5b7092}{}\label{group__context-and-vhost_gga41c2d763f78cc248df3b9f8645dbd2a5a274ed462a1a9239eb6ddf9007f5b7092}
+}](VH) Don\textquotesingle{}t allow the connection unless the client has a client cert that we recognize; provides L\+W\+S\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+D\+O\+\_\+\+S\+S\+L\+\_\+\+G\+L\+O\+B\+A\+L\+\_\+\+I\+N\+IT \index{L\+W\+S\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+S\+K\+I\+P\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+C\+A\+N\+O\+N\+I\+C\+A\+L\+\_\+\+N\+A\+ME@{L\+W\+S\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+S\+K\+I\+P\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+C\+A\+N\+O\+N\+I\+C\+A\+L\+\_\+\+N\+A\+ME}!Context-\/and-\/vhost@{Context-\/and-\/vhost}}\index{Context-\/and-\/vhost@{Context-\/and-\/vhost}!L\+W\+S\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+S\+K\+I\+P\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+C\+A\+N\+O\+N\+I\+C\+A\+L\+\_\+\+N\+A\+ME@{L\+W\+S\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+S\+K\+I\+P\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+C\+A\+N\+O\+N\+I\+C\+A\+L\+\_\+\+N\+A\+ME}}\item[{\em
+L\+W\+S\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+S\+K\+I\+P\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+C\+A\+N\+O\+N\+I\+C\+A\+L\+\_\+\+N\+A\+ME\hypertarget{group__context-and-vhost_gga41c2d763f78cc248df3b9f8645dbd2a5a6582c985ee0ceaadc1d277030eae2d7c}{}\label{group__context-and-vhost_gga41c2d763f78cc248df3b9f8645dbd2a5a6582c985ee0ceaadc1d277030eae2d7c}
+}](C\+TX) Don\textquotesingle{}t try to get the server\textquotesingle{}s hostname \index{L\+W\+S\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+A\+L\+L\+O\+W\+\_\+\+N\+O\+N\+\_\+\+S\+S\+L\+\_\+\+O\+N\+\_\+\+S\+S\+L\+\_\+\+P\+O\+RT@{L\+W\+S\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+A\+L\+L\+O\+W\+\_\+\+N\+O\+N\+\_\+\+S\+S\+L\+\_\+\+O\+N\+\_\+\+S\+S\+L\+\_\+\+P\+O\+RT}!Context-\/and-\/vhost@{Context-\/and-\/vhost}}\index{Context-\/and-\/vhost@{Context-\/and-\/vhost}!L\+W\+S\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+A\+L\+L\+O\+W\+\_\+\+N\+O\+N\+\_\+\+S\+S\+L\+\_\+\+O\+N\+\_\+\+S\+S\+L\+\_\+\+P\+O\+RT@{L\+W\+S\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+A\+L\+L\+O\+W\+\_\+\+N\+O\+N\+\_\+\+S\+S\+L\+\_\+\+O\+N\+\_\+\+S\+S\+L\+\_\+\+P\+O\+RT}}\item[{\em
+L\+W\+S\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+A\+L\+L\+O\+W\+\_\+\+N\+O\+N\+\_\+\+S\+S\+L\+\_\+\+O\+N\+\_\+\+S\+S\+L\+\_\+\+P\+O\+RT\hypertarget{group__context-and-vhost_gga41c2d763f78cc248df3b9f8645dbd2a5a1cc4562d05cba52a6dfa0697a65ade0d}{}\label{group__context-and-vhost_gga41c2d763f78cc248df3b9f8645dbd2a5a1cc4562d05cba52a6dfa0697a65ade0d}
+}](VH) Allow non-\/\+S\+SL (plaintext) connections on the same port as S\+SL is listening... undermines the security of S\+SL; provides L\+W\+S\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+D\+O\+\_\+\+S\+S\+L\+\_\+\+G\+L\+O\+B\+A\+L\+\_\+\+I\+N\+IT \index{L\+W\+S\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+L\+I\+B\+EV@{L\+W\+S\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+L\+I\+B\+EV}!Context-\/and-\/vhost@{Context-\/and-\/vhost}}\index{Context-\/and-\/vhost@{Context-\/and-\/vhost}!L\+W\+S\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+L\+I\+B\+EV@{L\+W\+S\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+L\+I\+B\+EV}}\item[{\em
+L\+W\+S\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+L\+I\+B\+EV\hypertarget{group__context-and-vhost_gga41c2d763f78cc248df3b9f8645dbd2a5a273d9975675130de0c6dc937dde7c8a6}{}\label{group__context-and-vhost_gga41c2d763f78cc248df3b9f8645dbd2a5a273d9975675130de0c6dc937dde7c8a6}
+}](C\+TX) Use libev event loop \index{L\+W\+S\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+D\+I\+S\+A\+B\+L\+E\+\_\+\+I\+P\+V6@{L\+W\+S\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+D\+I\+S\+A\+B\+L\+E\+\_\+\+I\+P\+V6}!Context-\/and-\/vhost@{Context-\/and-\/vhost}}\index{Context-\/and-\/vhost@{Context-\/and-\/vhost}!L\+W\+S\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+D\+I\+S\+A\+B\+L\+E\+\_\+\+I\+P\+V6@{L\+W\+S\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+D\+I\+S\+A\+B\+L\+E\+\_\+\+I\+P\+V6}}\item[{\em
+L\+W\+S\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+D\+I\+S\+A\+B\+L\+E\+\_\+\+I\+P\+V6\hypertarget{group__context-and-vhost_gga41c2d763f78cc248df3b9f8645dbd2a5a34ab36e68c0d593b6f19b8d5ef1240a9}{}\label{group__context-and-vhost_gga41c2d763f78cc248df3b9f8645dbd2a5a34ab36e68c0d593b6f19b8d5ef1240a9}
+}](VH) Disable I\+P\+V6 support \index{L\+W\+S\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+D\+I\+S\+A\+B\+L\+E\+\_\+\+O\+S\+\_\+\+C\+A\+\_\+\+C\+E\+R\+TS@{L\+W\+S\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+D\+I\+S\+A\+B\+L\+E\+\_\+\+O\+S\+\_\+\+C\+A\+\_\+\+C\+E\+R\+TS}!Context-\/and-\/vhost@{Context-\/and-\/vhost}}\index{Context-\/and-\/vhost@{Context-\/and-\/vhost}!L\+W\+S\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+D\+I\+S\+A\+B\+L\+E\+\_\+\+O\+S\+\_\+\+C\+A\+\_\+\+C\+E\+R\+TS@{L\+W\+S\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+D\+I\+S\+A\+B\+L\+E\+\_\+\+O\+S\+\_\+\+C\+A\+\_\+\+C\+E\+R\+TS}}\item[{\em
+L\+W\+S\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+D\+I\+S\+A\+B\+L\+E\+\_\+\+O\+S\+\_\+\+C\+A\+\_\+\+C\+E\+R\+TS\hypertarget{group__context-and-vhost_gga41c2d763f78cc248df3b9f8645dbd2a5a4933347a821e73c3f1e13fb6bfc7ad93}{}\label{group__context-and-vhost_gga41c2d763f78cc248df3b9f8645dbd2a5a4933347a821e73c3f1e13fb6bfc7ad93}
+}](VH) Don\textquotesingle{}t load OS CA certs, you will need to load your own CA cert(s) \index{L\+W\+S\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+P\+E\+E\+R\+\_\+\+C\+E\+R\+T\+\_\+\+N\+O\+T\+\_\+\+R\+E\+Q\+U\+I\+R\+ED@{L\+W\+S\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+P\+E\+E\+R\+\_\+\+C\+E\+R\+T\+\_\+\+N\+O\+T\+\_\+\+R\+E\+Q\+U\+I\+R\+ED}!Context-\/and-\/vhost@{Context-\/and-\/vhost}}\index{Context-\/and-\/vhost@{Context-\/and-\/vhost}!L\+W\+S\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+P\+E\+E\+R\+\_\+\+C\+E\+R\+T\+\_\+\+N\+O\+T\+\_\+\+R\+E\+Q\+U\+I\+R\+ED@{L\+W\+S\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+P\+E\+E\+R\+\_\+\+C\+E\+R\+T\+\_\+\+N\+O\+T\+\_\+\+R\+E\+Q\+U\+I\+R\+ED}}\item[{\em
+L\+W\+S\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+P\+E\+E\+R\+\_\+\+C\+E\+R\+T\+\_\+\+N\+O\+T\+\_\+\+R\+E\+Q\+U\+I\+R\+ED\hypertarget{group__context-and-vhost_gga41c2d763f78cc248df3b9f8645dbd2a5ac56a8a6590e74a8016d0fae09fb404fc}{}\label{group__context-and-vhost_gga41c2d763f78cc248df3b9f8645dbd2a5ac56a8a6590e74a8016d0fae09fb404fc}
+}](VH) Accept connections with no valid Cert (eg, selfsigned) \index{L\+W\+S\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+V\+A\+L\+I\+D\+A\+T\+E\+\_\+\+U\+T\+F8@{L\+W\+S\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+V\+A\+L\+I\+D\+A\+T\+E\+\_\+\+U\+T\+F8}!Context-\/and-\/vhost@{Context-\/and-\/vhost}}\index{Context-\/and-\/vhost@{Context-\/and-\/vhost}!L\+W\+S\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+V\+A\+L\+I\+D\+A\+T\+E\+\_\+\+U\+T\+F8@{L\+W\+S\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+V\+A\+L\+I\+D\+A\+T\+E\+\_\+\+U\+T\+F8}}\item[{\em
+L\+W\+S\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+V\+A\+L\+I\+D\+A\+T\+E\+\_\+\+U\+T\+F8\hypertarget{group__context-and-vhost_gga41c2d763f78cc248df3b9f8645dbd2a5aa0158b4e85420811e6b0f1378c6ded0f}{}\label{group__context-and-vhost_gga41c2d763f78cc248df3b9f8645dbd2a5aa0158b4e85420811e6b0f1378c6ded0f}
+}](VH) Check U\+T-\/8 correctness \index{L\+W\+S\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+S\+S\+L\+\_\+\+E\+C\+DH@{L\+W\+S\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+S\+S\+L\+\_\+\+E\+C\+DH}!Context-\/and-\/vhost@{Context-\/and-\/vhost}}\index{Context-\/and-\/vhost@{Context-\/and-\/vhost}!L\+W\+S\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+S\+S\+L\+\_\+\+E\+C\+DH@{L\+W\+S\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+S\+S\+L\+\_\+\+E\+C\+DH}}\item[{\em
+L\+W\+S\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+S\+S\+L\+\_\+\+E\+C\+DH\hypertarget{group__context-and-vhost_gga41c2d763f78cc248df3b9f8645dbd2a5a1b2f8bde0f62adc7ebe81b2043f34c0c}{}\label{group__context-and-vhost_gga41c2d763f78cc248df3b9f8645dbd2a5a1b2f8bde0f62adc7ebe81b2043f34c0c}
+}](VH) initialize E\+C\+DH ciphers \index{L\+W\+S\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+L\+I\+B\+UV@{L\+W\+S\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+L\+I\+B\+UV}!Context-\/and-\/vhost@{Context-\/and-\/vhost}}\index{Context-\/and-\/vhost@{Context-\/and-\/vhost}!L\+W\+S\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+L\+I\+B\+UV@{L\+W\+S\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+L\+I\+B\+UV}}\item[{\em
+L\+W\+S\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+L\+I\+B\+UV\hypertarget{group__context-and-vhost_gga41c2d763f78cc248df3b9f8645dbd2a5aff121db04a10cf8b2c5df9d4f2b89f1e}{}\label{group__context-and-vhost_gga41c2d763f78cc248df3b9f8645dbd2a5aff121db04a10cf8b2c5df9d4f2b89f1e}
+}](C\+TX) Use libuv event loop \index{L\+W\+S\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+R\+E\+D\+I\+R\+E\+C\+T\+\_\+\+H\+T\+T\+P\+\_\+\+T\+O\+\_\+\+H\+T\+T\+PS@{L\+W\+S\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+R\+E\+D\+I\+R\+E\+C\+T\+\_\+\+H\+T\+T\+P\+\_\+\+T\+O\+\_\+\+H\+T\+T\+PS}!Context-\/and-\/vhost@{Context-\/and-\/vhost}}\index{Context-\/and-\/vhost@{Context-\/and-\/vhost}!L\+W\+S\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+R\+E\+D\+I\+R\+E\+C\+T\+\_\+\+H\+T\+T\+P\+\_\+\+T\+O\+\_\+\+H\+T\+T\+PS@{L\+W\+S\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+R\+E\+D\+I\+R\+E\+C\+T\+\_\+\+H\+T\+T\+P\+\_\+\+T\+O\+\_\+\+H\+T\+T\+PS}}\item[{\em
+L\+W\+S\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+R\+E\+D\+I\+R\+E\+C\+T\+\_\+\+H\+T\+T\+P\+\_\+\+T\+O\+\_\+\+H\+T\+T\+PS\hypertarget{group__context-and-vhost_gga41c2d763f78cc248df3b9f8645dbd2a5a4832187186c4d130c68051214cd42ada}{}\label{group__context-and-vhost_gga41c2d763f78cc248df3b9f8645dbd2a5a4832187186c4d130c68051214cd42ada}
+}](VH) Use http redirect to force http to https (deprecated\+: use mount redirection) \index{L\+W\+S\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+D\+O\+\_\+\+S\+S\+L\+\_\+\+G\+L\+O\+B\+A\+L\+\_\+\+I\+N\+IT@{L\+W\+S\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+D\+O\+\_\+\+S\+S\+L\+\_\+\+G\+L\+O\+B\+A\+L\+\_\+\+I\+N\+IT}!Context-\/and-\/vhost@{Context-\/and-\/vhost}}\index{Context-\/and-\/vhost@{Context-\/and-\/vhost}!L\+W\+S\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+D\+O\+\_\+\+S\+S\+L\+\_\+\+G\+L\+O\+B\+A\+L\+\_\+\+I\+N\+IT@{L\+W\+S\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+D\+O\+\_\+\+S\+S\+L\+\_\+\+G\+L\+O\+B\+A\+L\+\_\+\+I\+N\+IT}}\item[{\em
+L\+W\+S\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+D\+O\+\_\+\+S\+S\+L\+\_\+\+G\+L\+O\+B\+A\+L\+\_\+\+I\+N\+IT\hypertarget{group__context-and-vhost_gga41c2d763f78cc248df3b9f8645dbd2a5a7fed6a527c8d5e0acac1b4179644583a}{}\label{group__context-and-vhost_gga41c2d763f78cc248df3b9f8645dbd2a5a7fed6a527c8d5e0acac1b4179644583a}
+}](C\+TX) Initialize the S\+SL library at all \index{L\+W\+S\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+E\+X\+P\+L\+I\+C\+I\+T\+\_\+\+V\+H\+O\+S\+TS@{L\+W\+S\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+E\+X\+P\+L\+I\+C\+I\+T\+\_\+\+V\+H\+O\+S\+TS}!Context-\/and-\/vhost@{Context-\/and-\/vhost}}\index{Context-\/and-\/vhost@{Context-\/and-\/vhost}!L\+W\+S\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+E\+X\+P\+L\+I\+C\+I\+T\+\_\+\+V\+H\+O\+S\+TS@{L\+W\+S\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+E\+X\+P\+L\+I\+C\+I\+T\+\_\+\+V\+H\+O\+S\+TS}}\item[{\em
+L\+W\+S\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+E\+X\+P\+L\+I\+C\+I\+T\+\_\+\+V\+H\+O\+S\+TS\hypertarget{group__context-and-vhost_gga41c2d763f78cc248df3b9f8645dbd2a5accc9d0d11d1124a21659586164b0962e}{}\label{group__context-and-vhost_gga41c2d763f78cc248df3b9f8645dbd2a5accc9d0d11d1124a21659586164b0962e}
+}](C\+TX) Only create the context when calling context create api, implies user code will create its own vhosts \index{L\+W\+S\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+U\+N\+I\+X\+\_\+\+S\+O\+CK@{L\+W\+S\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+U\+N\+I\+X\+\_\+\+S\+O\+CK}!Context-\/and-\/vhost@{Context-\/and-\/vhost}}\index{Context-\/and-\/vhost@{Context-\/and-\/vhost}!L\+W\+S\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+U\+N\+I\+X\+\_\+\+S\+O\+CK@{L\+W\+S\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+U\+N\+I\+X\+\_\+\+S\+O\+CK}}\item[{\em
+L\+W\+S\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+U\+N\+I\+X\+\_\+\+S\+O\+CK\hypertarget{group__context-and-vhost_gga41c2d763f78cc248df3b9f8645dbd2a5a9637e9001d8c8b2521086bcafbd8a941}{}\label{group__context-and-vhost_gga41c2d763f78cc248df3b9f8645dbd2a5a9637e9001d8c8b2521086bcafbd8a941}
+}](VH) Use Unix socket \index{L\+W\+S\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+S\+TS@{L\+W\+S\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+S\+TS}!Context-\/and-\/vhost@{Context-\/and-\/vhost}}\index{Context-\/and-\/vhost@{Context-\/and-\/vhost}!L\+W\+S\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+S\+TS@{L\+W\+S\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+S\+TS}}\item[{\em
+L\+W\+S\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+S\+TS\hypertarget{group__context-and-vhost_gga41c2d763f78cc248df3b9f8645dbd2a5ac962efd35abf6c402f9fb14aa14f5016}{}\label{group__context-and-vhost_gga41c2d763f78cc248df3b9f8645dbd2a5ac962efd35abf6c402f9fb14aa14f5016}
+}](VH) Send Strict Transport Security header, making clients subsequently go to https even if user asked for http \index{L\+W\+S\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+I\+P\+V6\+\_\+\+V6\+O\+N\+L\+Y\+\_\+\+M\+O\+D\+I\+FY@{L\+W\+S\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+I\+P\+V6\+\_\+\+V6\+O\+N\+L\+Y\+\_\+\+M\+O\+D\+I\+FY}!Context-\/and-\/vhost@{Context-\/and-\/vhost}}\index{Context-\/and-\/vhost@{Context-\/and-\/vhost}!L\+W\+S\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+I\+P\+V6\+\_\+\+V6\+O\+N\+L\+Y\+\_\+\+M\+O\+D\+I\+FY@{L\+W\+S\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+I\+P\+V6\+\_\+\+V6\+O\+N\+L\+Y\+\_\+\+M\+O\+D\+I\+FY}}\item[{\em
+L\+W\+S\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+I\+P\+V6\+\_\+\+V6\+O\+N\+L\+Y\+\_\+\+M\+O\+D\+I\+FY\hypertarget{group__context-and-vhost_gga41c2d763f78cc248df3b9f8645dbd2a5af62887536e25e053e68741006dba46d8}{}\label{group__context-and-vhost_gga41c2d763f78cc248df3b9f8645dbd2a5af62887536e25e053e68741006dba46d8}
+}](VH) Enable L\+W\+S\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+I\+P\+V6\+\_\+\+V6\+O\+N\+L\+Y\+\_\+\+V\+A\+L\+UE to take effect \index{L\+W\+S\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+I\+P\+V6\+\_\+\+V6\+O\+N\+L\+Y\+\_\+\+V\+A\+L\+UE@{L\+W\+S\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+I\+P\+V6\+\_\+\+V6\+O\+N\+L\+Y\+\_\+\+V\+A\+L\+UE}!Context-\/and-\/vhost@{Context-\/and-\/vhost}}\index{Context-\/and-\/vhost@{Context-\/and-\/vhost}!L\+W\+S\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+I\+P\+V6\+\_\+\+V6\+O\+N\+L\+Y\+\_\+\+V\+A\+L\+UE@{L\+W\+S\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+I\+P\+V6\+\_\+\+V6\+O\+N\+L\+Y\+\_\+\+V\+A\+L\+UE}}\item[{\em
+L\+W\+S\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+I\+P\+V6\+\_\+\+V6\+O\+N\+L\+Y\+\_\+\+V\+A\+L\+UE\hypertarget{group__context-and-vhost_gga41c2d763f78cc248df3b9f8645dbd2a5aca5d42820b65eac5618ec3f0bd8a1160}{}\label{group__context-and-vhost_gga41c2d763f78cc248df3b9f8645dbd2a5aca5d42820b65eac5618ec3f0bd8a1160}
+}](VH) if set, only ipv6 allowed on the vhost \end{description}
+\end{Desc}
+
+\begin{DoxyCode}
+1347 \{
+1348 \hyperlink{group__context-and-vhost_gga41c2d763f78cc248df3b9f8645dbd2a5a274ed462a1a9239eb6ddf9007f5b7092}{LWS\_SERVER\_OPTION\_REQUIRE\_VALID\_OPENSSL\_CLIENT\_CERT}
+ = (1 << 1) |
+1349 (1 << 12),
+1353 \hyperlink{group__context-and-vhost_gga41c2d763f78cc248df3b9f8645dbd2a5a6582c985ee0ceaadc1d277030eae2d7c}{LWS\_SERVER\_OPTION\_SKIP\_SERVER\_CANONICAL\_NAME}
+ = (1 << 2),
+1355 \hyperlink{group__context-and-vhost_gga41c2d763f78cc248df3b9f8645dbd2a5a1cc4562d05cba52a6dfa0697a65ade0d}{LWS\_SERVER\_OPTION\_ALLOW\_NON\_SSL\_ON\_SSL\_PORT} = (
+ 1 << 3) |
+1356 (1 << 12),
+1360 \hyperlink{group__context-and-vhost_gga41c2d763f78cc248df3b9f8645dbd2a5a273d9975675130de0c6dc937dde7c8a6}{LWS\_SERVER\_OPTION\_LIBEV} = (1 << 4),
+1362 \hyperlink{group__context-and-vhost_gga41c2d763f78cc248df3b9f8645dbd2a5a34ab36e68c0d593b6f19b8d5ef1240a9}{LWS\_SERVER\_OPTION\_DISABLE\_IPV6} = (1 << 5),
+1364 \hyperlink{group__context-and-vhost_gga41c2d763f78cc248df3b9f8645dbd2a5a4933347a821e73c3f1e13fb6bfc7ad93}{LWS\_SERVER\_OPTION\_DISABLE\_OS\_CA\_CERTS} = (
+ 1 << 6),
+1367 \hyperlink{group__context-and-vhost_gga41c2d763f78cc248df3b9f8645dbd2a5ac56a8a6590e74a8016d0fae09fb404fc}{LWS\_SERVER\_OPTION\_PEER\_CERT\_NOT\_REQUIRED} = (
+ 1 << 7),
+1369 \hyperlink{group__context-and-vhost_gga41c2d763f78cc248df3b9f8645dbd2a5aa0158b4e85420811e6b0f1378c6ded0f}{LWS\_SERVER\_OPTION\_VALIDATE\_UTF8} = (1 << 8),
+1371 \hyperlink{group__context-and-vhost_gga41c2d763f78cc248df3b9f8645dbd2a5a1b2f8bde0f62adc7ebe81b2043f34c0c}{LWS\_SERVER\_OPTION\_SSL\_ECDH} = (1 << 9) |
+1372 (1 << 12),
+1374 \hyperlink{group__context-and-vhost_gga41c2d763f78cc248df3b9f8645dbd2a5aff121db04a10cf8b2c5df9d4f2b89f1e}{LWS\_SERVER\_OPTION\_LIBUV} = (1 << 10),
+1376 \hyperlink{group__context-and-vhost_gga41c2d763f78cc248df3b9f8645dbd2a5a4832187186c4d130c68051214cd42ada}{LWS\_SERVER\_OPTION\_REDIRECT\_HTTP\_TO\_HTTPS} = (
+ 1 << 11) |
+1377 (1 << 3) |
+1378 (1 << 12),
+1381 \hyperlink{group__context-and-vhost_gga41c2d763f78cc248df3b9f8645dbd2a5a7fed6a527c8d5e0acac1b4179644583a}{LWS\_SERVER\_OPTION\_DO\_SSL\_GLOBAL\_INIT} = (
+ 1 << 12),
+1383 \hyperlink{group__context-and-vhost_gga41c2d763f78cc248df3b9f8645dbd2a5accc9d0d11d1124a21659586164b0962e}{LWS\_SERVER\_OPTION\_EXPLICIT\_VHOSTS} = (1 << 13)
+ ,
+1386 \hyperlink{group__context-and-vhost_gga41c2d763f78cc248df3b9f8645dbd2a5a9637e9001d8c8b2521086bcafbd8a941}{LWS\_SERVER\_OPTION\_UNIX\_SOCK} = (1 << 14),
+1388 \hyperlink{group__context-and-vhost_gga41c2d763f78cc248df3b9f8645dbd2a5ac962efd35abf6c402f9fb14aa14f5016}{LWS\_SERVER\_OPTION\_STS} = (1 << 15),
+1391 \hyperlink{group__context-and-vhost_gga41c2d763f78cc248df3b9f8645dbd2a5af62887536e25e053e68741006dba46d8}{LWS\_SERVER\_OPTION\_IPV6\_V6ONLY\_MODIFY} = (
+ 1 << 16),
+1393 \hyperlink{group__context-and-vhost_gga41c2d763f78cc248df3b9f8645dbd2a5aca5d42820b65eac5618ec3f0bd8a1160}{LWS\_SERVER\_OPTION\_IPV6\_V6ONLY\_VALUE} = (1 << 17)
+ ,
+1396 \textcolor{comment}{/****** add new things just above ---^ ******/}
+1397 \};
+\end{DoxyCode}
+
+
+\subsection{Function Documentation}
+\index{Context-\/and-\/vhost@{Context-\/and-\/vhost}!lws\+\_\+context\+\_\+destroy@{lws\+\_\+context\+\_\+destroy}}
+\index{lws\+\_\+context\+\_\+destroy@{lws\+\_\+context\+\_\+destroy}!Context-\/and-\/vhost@{Context-\/and-\/vhost}}
+\subsubsection[{\texorpdfstring{lws\+\_\+context\+\_\+destroy(struct lws\+\_\+context $\ast$context)}{lws\_context\_destroy(struct lws\_context *context)}}]{\setlength{\rightskip}{0pt plus 5cm}L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN void lws\+\_\+context\+\_\+destroy (
+\begin{DoxyParamCaption}
+\item[{struct lws\+\_\+context $\ast$}]{context}
+\end{DoxyParamCaption}
+)}\hypertarget{group__context-and-vhost_ga8ee0314028755f1ddfa9428e09b4fddb}{}\label{group__context-and-vhost_ga8ee0314028755f1ddfa9428e09b4fddb}
+
+
+{\ttfamily \#include $<$\hyperlink{libwebsockets_8h}{lib/libwebsockets.\+h}$>$}
+
+\hyperlink{group__context-and-vhost_ga8ee0314028755f1ddfa9428e09b4fddb}{lws\+\_\+context\+\_\+destroy()} -\/ Destroy the websocket context
+\begin{DoxyParams}{Parameters}
+{\em context} & Websocket context \begin{DoxyVerb} This function closes any active connections and then frees the
+ context. After calling this, any further use of the context is
+ undefined.\end{DoxyVerb}
+ \\
+\hline
+\end{DoxyParams}
+\index{Context-\/and-\/vhost@{Context-\/and-\/vhost}!lws\+\_\+context\+\_\+user@{lws\+\_\+context\+\_\+user}}
+\index{lws\+\_\+context\+\_\+user@{lws\+\_\+context\+\_\+user}!Context-\/and-\/vhost@{Context-\/and-\/vhost}}
+\subsubsection[{\texorpdfstring{lws\+\_\+context\+\_\+user(struct lws\+\_\+context $\ast$context)}{lws\_context\_user(struct lws\_context *context)}}]{\setlength{\rightskip}{0pt plus 5cm}L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN void$\ast$ lws\+\_\+context\+\_\+user (
+\begin{DoxyParamCaption}
+\item[{struct lws\+\_\+context $\ast$}]{context}
+\end{DoxyParamCaption}
+)}\hypertarget{group__context-and-vhost_gaeb12f934bfd178bd2132a9e73fc641da}{}\label{group__context-and-vhost_gaeb12f934bfd178bd2132a9e73fc641da}
+
+
+{\ttfamily \#include $<$\hyperlink{libwebsockets_8h}{lib/libwebsockets.\+h}$>$}
+
+\hyperlink{group__context-and-vhost_gaeb12f934bfd178bd2132a9e73fc641da}{lws\+\_\+context\+\_\+user()} -\/ get the user data associated with the context
+\begin{DoxyParams}{Parameters}
+{\em context} & Websocket context\\
+\hline
+\end{DoxyParams}
+This returns the optional user allocation that can be attached to the context the sockets live in at context\+\_\+create time. It\textquotesingle{}s a way to let all sockets serviced in the same context share data without using globals statics in the user code. \index{Context-\/and-\/vhost@{Context-\/and-\/vhost}!lws\+\_\+create\+\_\+context@{lws\+\_\+create\+\_\+context}}
+\index{lws\+\_\+create\+\_\+context@{lws\+\_\+create\+\_\+context}!Context-\/and-\/vhost@{Context-\/and-\/vhost}}
+\subsubsection[{\texorpdfstring{lws\+\_\+create\+\_\+context(struct lws\+\_\+context\+\_\+creation\+\_\+info $\ast$info)}{lws\_create\_context(struct lws\_context\_creation\_info *info)}}]{\setlength{\rightskip}{0pt plus 5cm}L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN struct lws\+\_\+context$\ast$ lws\+\_\+create\+\_\+context (
+\begin{DoxyParamCaption}
+\item[{struct {\bf lws\+\_\+context\+\_\+creation\+\_\+info} $\ast$}]{info}
+\end{DoxyParamCaption}
+)}\hypertarget{group__context-and-vhost_gaf2fff58562caab7510c41eeac85a8648}{}\label{group__context-and-vhost_gaf2fff58562caab7510c41eeac85a8648}
+
+
+{\ttfamily \#include $<$\hyperlink{libwebsockets_8h}{lib/libwebsockets.\+h}$>$}
+
+\hyperlink{group__context-and-vhost_gaf2fff58562caab7510c41eeac85a8648}{lws\+\_\+create\+\_\+context()} -\/ Create the websocket handler
+\begin{DoxyParams}{Parameters}
+{\em info} & pointer to struct with parameters \begin{DoxyVerb} This function creates the listening socket (if serving) and takes care
+ of all initialization in one step.
+
+ If option LWS_SERVER_OPTION_EXPLICIT_VHOSTS is given, no vhost is
+ created; you're expected to create your own vhosts afterwards using
+ lws_create_vhost(). Otherwise a vhost named "default" is also created
+ using the information in the vhost-related members, for compatibility.
+
+ After initialization, it returns a struct lws_context * that
+ represents this server. After calling, user code needs to take care
+ of calling lws_service() with the context pointer to get the
+ server's sockets serviced. This must be done in the same process
+ context as the initialization call.
+
+ The protocol callback functions are called for a handful of events
+ including http requests coming in, websocket connections becoming
+ established, and data arriving; it's also called periodically to allow
+ async transmission.
+
+ HTTP requests are sent always to the FIRST protocol in protocol, since
+ at that time websocket protocol has not been negotiated. Other
+ protocols after the first one never see any HTTP callack activity.
+
+ The server created is a simple http server by default; part of the
+ websocket standard is upgrading this http connection to a websocket one.
+
+ This allows the same server to provide files like scripts and favicon /
+ images or whatever over http and dynamic data over websockets all in
+ one place; they're all handled in the user callback.\end{DoxyVerb}
+ \\
+\hline
+\end{DoxyParams}
+\index{Context-\/and-\/vhost@{Context-\/and-\/vhost}!lws\+\_\+create\+\_\+vhost@{lws\+\_\+create\+\_\+vhost}}
+\index{lws\+\_\+create\+\_\+vhost@{lws\+\_\+create\+\_\+vhost}!Context-\/and-\/vhost@{Context-\/and-\/vhost}}
+\subsubsection[{\texorpdfstring{lws\+\_\+create\+\_\+vhost(struct lws\+\_\+context $\ast$context, struct lws\+\_\+context\+\_\+creation\+\_\+info $\ast$info)}{lws\_create\_vhost(struct lws\_context *context, struct lws\_context\_creation\_info *info)}}]{\setlength{\rightskip}{0pt plus 5cm}L\+W\+S\+\_\+\+E\+X\+T\+E\+RN L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE struct lws\+\_\+vhost$\ast$ lws\+\_\+create\+\_\+vhost (
+\begin{DoxyParamCaption}
+\item[{struct lws\+\_\+context $\ast$}]{context, }
+\item[{struct {\bf lws\+\_\+context\+\_\+creation\+\_\+info} $\ast$}]{info}
+\end{DoxyParamCaption}
+)}\hypertarget{group__context-and-vhost_ga0c54c667ccd9b8b3dddcd123ca72f87c}{}\label{group__context-and-vhost_ga0c54c667ccd9b8b3dddcd123ca72f87c}
+
+
+{\ttfamily \#include $<$\hyperlink{libwebsockets_8h}{lib/libwebsockets.\+h}$>$}
+
+\hyperlink{group__context-and-vhost_ga0c54c667ccd9b8b3dddcd123ca72f87c}{lws\+\_\+create\+\_\+vhost()} -\/ Create a vhost (virtual server context)
+\begin{DoxyParams}{Parameters}
+{\em context} & pointer to result of \hyperlink{group__context-and-vhost_gaf2fff58562caab7510c41eeac85a8648}{lws\+\_\+create\+\_\+context()} \\
+\hline
+{\em info} & pointer to struct with parameters\\
+\hline
+\end{DoxyParams}
+This function creates a virtual server (vhost) using the vhost-\/related members of the info struct. You can create many vhosts inside one context if you created the context with the option L\+W\+S\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+E\+X\+P\+L\+I\+C\+I\+T\+\_\+\+V\+H\+O\+S\+TS \index{Context-\/and-\/vhost@{Context-\/and-\/vhost}!lws\+\_\+get\+\_\+vhost@{lws\+\_\+get\+\_\+vhost}}
+\index{lws\+\_\+get\+\_\+vhost@{lws\+\_\+get\+\_\+vhost}!Context-\/and-\/vhost@{Context-\/and-\/vhost}}
+\subsubsection[{\texorpdfstring{lws\+\_\+get\+\_\+vhost(struct lws $\ast$wsi)}{lws\_get\_vhost(struct lws *wsi)}}]{\setlength{\rightskip}{0pt plus 5cm}L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN struct lws\+\_\+vhost$\ast$ lws\+\_\+get\+\_\+vhost (
+\begin{DoxyParamCaption}
+\item[{struct lws $\ast$}]{wsi}
+\end{DoxyParamCaption}
+)}\hypertarget{group__context-and-vhost_ga06e77ce2916f8bc9826ef8d9d68e3932}{}\label{group__context-and-vhost_ga06e77ce2916f8bc9826ef8d9d68e3932}
+
+
+{\ttfamily \#include $<$\hyperlink{libwebsockets_8h}{lib/libwebsockets.\+h}$>$}
+
+\hyperlink{group__context-and-vhost_ga06e77ce2916f8bc9826ef8d9d68e3932}{lws\+\_\+get\+\_\+vhost()} -\/ return the vhost a wsi belongs to
+
+
+\begin{DoxyParams}{Parameters}
+{\em wsi} & which connection \\
+\hline
+\end{DoxyParams}
+\index{Context-\/and-\/vhost@{Context-\/and-\/vhost}!lws\+\_\+json\+\_\+dump\+\_\+context@{lws\+\_\+json\+\_\+dump\+\_\+context}}
+\index{lws\+\_\+json\+\_\+dump\+\_\+context@{lws\+\_\+json\+\_\+dump\+\_\+context}!Context-\/and-\/vhost@{Context-\/and-\/vhost}}
+\subsubsection[{\texorpdfstring{lws\+\_\+json\+\_\+dump\+\_\+context(const struct lws\+\_\+context $\ast$context, char $\ast$buf, int len)}{lws\_json\_dump\_context(const struct lws\_context *context, char *buf, int len)}}]{\setlength{\rightskip}{0pt plus 5cm}L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int lws\+\_\+json\+\_\+dump\+\_\+context (
+\begin{DoxyParamCaption}
+\item[{const struct lws\+\_\+context $\ast$}]{context, }
+\item[{char $\ast$}]{buf, }
+\item[{int}]{len}
+\end{DoxyParamCaption}
+)}\hypertarget{group__context-and-vhost_gae2134657cdd2ea7a59e13ad314e4c50d}{}\label{group__context-and-vhost_gae2134657cdd2ea7a59e13ad314e4c50d}
+
+
+{\ttfamily \#include $<$\hyperlink{libwebsockets_8h}{lib/libwebsockets.\+h}$>$}
+
+\hyperlink{group__context-and-vhost_gae2134657cdd2ea7a59e13ad314e4c50d}{lws\+\_\+json\+\_\+dump\+\_\+context()} -\/ describe context state and stats in J\+S\+ON
+
+
+\begin{DoxyParams}{Parameters}
+{\em context} & the context \\
+\hline
+{\em buf} & buffer to fill with J\+S\+ON \\
+\hline
+{\em len} & max length of buf \\
+\hline
+\end{DoxyParams}
+\index{Context-\/and-\/vhost@{Context-\/and-\/vhost}!lws\+\_\+json\+\_\+dump\+\_\+vhost@{lws\+\_\+json\+\_\+dump\+\_\+vhost}}
+\index{lws\+\_\+json\+\_\+dump\+\_\+vhost@{lws\+\_\+json\+\_\+dump\+\_\+vhost}!Context-\/and-\/vhost@{Context-\/and-\/vhost}}
+\subsubsection[{\texorpdfstring{lws\+\_\+json\+\_\+dump\+\_\+vhost(const struct lws\+\_\+vhost $\ast$vh, char $\ast$buf, int len)}{lws\_json\_dump\_vhost(const struct lws\_vhost *vh, char *buf, int len)}}]{\setlength{\rightskip}{0pt plus 5cm}L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int lws\+\_\+json\+\_\+dump\+\_\+vhost (
+\begin{DoxyParamCaption}
+\item[{const struct lws\+\_\+vhost $\ast$}]{vh, }
+\item[{char $\ast$}]{buf, }
+\item[{int}]{len}
+\end{DoxyParamCaption}
+)}\hypertarget{group__context-and-vhost_ga94e6cc2223c4eec316b13bcebc3628b6}{}\label{group__context-and-vhost_ga94e6cc2223c4eec316b13bcebc3628b6}
+
+
+{\ttfamily \#include $<$\hyperlink{libwebsockets_8h}{lib/libwebsockets.\+h}$>$}
+
+\hyperlink{group__context-and-vhost_ga94e6cc2223c4eec316b13bcebc3628b6}{lws\+\_\+json\+\_\+dump\+\_\+vhost()} -\/ describe vhost state and stats in J\+S\+ON
+
+
+\begin{DoxyParams}{Parameters}
+{\em vh} & the vhost \\
+\hline
+{\em buf} & buffer to fill with J\+S\+ON \\
+\hline
+{\em len} & max length of buf \\
+\hline
+\end{DoxyParams}
+\index{Context-\/and-\/vhost@{Context-\/and-\/vhost}!lws\+\_\+set\+\_\+proxy@{lws\+\_\+set\+\_\+proxy}}
+\index{lws\+\_\+set\+\_\+proxy@{lws\+\_\+set\+\_\+proxy}!Context-\/and-\/vhost@{Context-\/and-\/vhost}}
+\subsubsection[{\texorpdfstring{lws\+\_\+set\+\_\+proxy(struct lws\+\_\+vhost $\ast$vhost, const char $\ast$proxy)}{lws\_set\_proxy(struct lws\_vhost *vhost, const char *proxy)}}]{\setlength{\rightskip}{0pt plus 5cm}L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int lws\+\_\+set\+\_\+proxy (
+\begin{DoxyParamCaption}
+\item[{struct lws\+\_\+vhost $\ast$}]{vhost, }
+\item[{const char $\ast$}]{proxy}
+\end{DoxyParamCaption}
+)}\hypertarget{group__context-and-vhost_ga7e9d5405547a457d86e0b4f0ae2bb1c4}{}\label{group__context-and-vhost_ga7e9d5405547a457d86e0b4f0ae2bb1c4}
+
+
+{\ttfamily \#include $<$\hyperlink{libwebsockets_8h}{lib/libwebsockets.\+h}$>$}
+
+\hyperlink{group__context-and-vhost_ga7e9d5405547a457d86e0b4f0ae2bb1c4}{lws\+\_\+set\+\_\+proxy()} -\/ Setups proxy to lws\+\_\+context.
+\begin{DoxyParams}{Parameters}
+{\em vhost} & pointer to struct lws\+\_\+vhost you want set proxy for \\
+\hline
+{\em proxy} & pointer to c string containing proxy in format address\+:port\\
+\hline
+\end{DoxyParams}
+Returns 0 if proxy string was parsed and proxy was setup. Returns -\/1 if proxy is N\+U\+LL or has incorrect format.
+
+This is only required if your OS does not provide the http\+\_\+proxy environment variable (eg, O\+SX)
+
+I\+M\+P\+O\+R\+T\+A\+N\+T! You should call this function right after creation of the lws\+\_\+context and before call to connect. If you call this function after connect behavior is undefined. This function will override proxy settings made on lws\+\_\+context creation with genenv() call. \index{Context-\/and-\/vhost@{Context-\/and-\/vhost}!lws\+\_\+vhost\+\_\+get@{lws\+\_\+vhost\+\_\+get}}
+\index{lws\+\_\+vhost\+\_\+get@{lws\+\_\+vhost\+\_\+get}!Context-\/and-\/vhost@{Context-\/and-\/vhost}}
+\subsubsection[{\texorpdfstring{lws\+\_\+vhost\+\_\+get(struct lws $\ast$wsi) L\+W\+S\+\_\+\+W\+A\+R\+N\+\_\+\+D\+E\+P\+R\+E\+C\+A\+T\+ED}{lws\_vhost\_get(struct lws *wsi) LWS\_WARN\_DEPRECATED}}]{\setlength{\rightskip}{0pt plus 5cm}L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN struct lws\+\_\+vhost$\ast$ lws\+\_\+vhost\+\_\+get (
+\begin{DoxyParamCaption}
+\item[{struct lws $\ast$}]{wsi}
+\end{DoxyParamCaption}
+)}\hypertarget{group__context-and-vhost_ga8db03e19a372e34ac25cf21af894a02c}{}\label{group__context-and-vhost_ga8db03e19a372e34ac25cf21af894a02c}
+
+
+{\ttfamily \#include $<$\hyperlink{libwebsockets_8h}{lib/libwebsockets.\+h}$>$}
+
+\hyperlink{group__context-and-vhost_ga8db03e19a372e34ac25cf21af894a02c}{lws\+\_\+vhost\+\_\+get()} -\/\begin{DoxyRefDesc}{Deprecated}
+\item[\hyperlink{deprecated__deprecated000001}{Deprecated}]deprecated\+: use \hyperlink{group__context-and-vhost_ga06e77ce2916f8bc9826ef8d9d68e3932}{lws\+\_\+get\+\_\+vhost()} \end{DoxyRefDesc}
+\index{Context-\/and-\/vhost@{Context-\/and-\/vhost}!lwsws\+\_\+get\+\_\+config\+\_\+globals@{lwsws\+\_\+get\+\_\+config\+\_\+globals}}
+\index{lwsws\+\_\+get\+\_\+config\+\_\+globals@{lwsws\+\_\+get\+\_\+config\+\_\+globals}!Context-\/and-\/vhost@{Context-\/and-\/vhost}}
+\subsubsection[{\texorpdfstring{lwsws\+\_\+get\+\_\+config\+\_\+globals(struct lws\+\_\+context\+\_\+creation\+\_\+info $\ast$info, const char $\ast$d, char $\ast$$\ast$config\+\_\+strings, int $\ast$len)}{lwsws\_get\_config\_globals(struct lws\_context\_creation\_info *info, const char *d, char **config\_strings, int *len)}}]{\setlength{\rightskip}{0pt plus 5cm}L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int lwsws\+\_\+get\+\_\+config\+\_\+globals (
+\begin{DoxyParamCaption}
+\item[{struct {\bf lws\+\_\+context\+\_\+creation\+\_\+info} $\ast$}]{info, }
+\item[{const char $\ast$}]{d, }
+\item[{char $\ast$$\ast$}]{config\+\_\+strings, }
+\item[{int $\ast$}]{len}
+\end{DoxyParamCaption}
+)}\hypertarget{group__context-and-vhost_ga98d88c9080fd89c37114363a6474ea73}{}\label{group__context-and-vhost_ga98d88c9080fd89c37114363a6474ea73}
+
+
+{\ttfamily \#include $<$\hyperlink{libwebsockets_8h}{lib/libwebsockets.\+h}$>$}
+
+\hyperlink{group__context-and-vhost_ga98d88c9080fd89c37114363a6474ea73}{lwsws\+\_\+get\+\_\+config\+\_\+globals()} -\/ Parse a J\+S\+ON server config file
+\begin{DoxyParams}{Parameters}
+{\em info} & pointer to struct with parameters \\
+\hline
+{\em d} & filepath of the config file \\
+\hline
+{\em config\+\_\+strings} & storage for the config strings extracted from J\+S\+ON, the pointer is incremented as strings are stored \\
+\hline
+{\em len} & pointer to the remaining length left in config\+\_\+strings the value is decremented as strings are stored\\
+\hline
+\end{DoxyParams}
+This function prepares a n \hyperlink{structlws__context__creation__info}{lws\+\_\+context\+\_\+creation\+\_\+info} struct with global settings from a file d.
+
+Requires C\+Make option L\+W\+S\+\_\+\+W\+I\+T\+H\+\_\+\+L\+E\+J\+P\+\_\+\+C\+O\+NF to have been enabled \index{Context-\/and-\/vhost@{Context-\/and-\/vhost}!lwsws\+\_\+get\+\_\+config\+\_\+vhosts@{lwsws\+\_\+get\+\_\+config\+\_\+vhosts}}
+\index{lwsws\+\_\+get\+\_\+config\+\_\+vhosts@{lwsws\+\_\+get\+\_\+config\+\_\+vhosts}!Context-\/and-\/vhost@{Context-\/and-\/vhost}}
+\subsubsection[{\texorpdfstring{lwsws\+\_\+get\+\_\+config\+\_\+vhosts(struct lws\+\_\+context $\ast$context, struct lws\+\_\+context\+\_\+creation\+\_\+info $\ast$info, const char $\ast$d, char $\ast$$\ast$config\+\_\+strings, int $\ast$len)}{lwsws\_get\_config\_vhosts(struct lws\_context *context, struct lws\_context\_creation\_info *info, const char *d, char **config\_strings, int *len)}}]{\setlength{\rightskip}{0pt plus 5cm}L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int lwsws\+\_\+get\+\_\+config\+\_\+vhosts (
+\begin{DoxyParamCaption}
+\item[{struct lws\+\_\+context $\ast$}]{context, }
+\item[{struct {\bf lws\+\_\+context\+\_\+creation\+\_\+info} $\ast$}]{info, }
+\item[{const char $\ast$}]{d, }
+\item[{char $\ast$$\ast$}]{config\+\_\+strings, }
+\item[{int $\ast$}]{len}
+\end{DoxyParamCaption}
+)}\hypertarget{group__context-and-vhost_ga341064721add2618ae1b29717493a212}{}\label{group__context-and-vhost_ga341064721add2618ae1b29717493a212}
+
+
+{\ttfamily \#include $<$\hyperlink{libwebsockets_8h}{lib/libwebsockets.\+h}$>$}
+
+\hyperlink{group__context-and-vhost_ga341064721add2618ae1b29717493a212}{lwsws\+\_\+get\+\_\+config\+\_\+vhosts()} -\/ Create vhosts from a J\+S\+ON server config file
+\begin{DoxyParams}{Parameters}
+{\em context} & pointer to result of \hyperlink{group__context-and-vhost_gaf2fff58562caab7510c41eeac85a8648}{lws\+\_\+create\+\_\+context()} \\
+\hline
+{\em info} & pointer to struct with parameters \\
+\hline
+{\em d} & filepath of the config file \\
+\hline
+{\em config\+\_\+strings} & storage for the config strings extracted from J\+S\+ON, the pointer is incremented as strings are stored \\
+\hline
+{\em len} & pointer to the remaining length left in config\+\_\+strings the value is decremented as strings are stored\\
+\hline
+\end{DoxyParams}
+This function creates vhosts into a context according to the settings in J\+S\+ON files found in directory d.
+
+Requires C\+Make option L\+W\+S\+\_\+\+W\+I\+T\+H\+\_\+\+L\+E\+J\+P\+\_\+\+C\+O\+NF to have been enabled
\ No newline at end of file
--- /dev/null
+\hypertarget{group__ev}{}\section{libev helpers}
+\label{group__ev}\index{libev helpers@{libev helpers}}
+\subsection*{Typedefs}
+\begin{DoxyCompactItemize}
+\item
+typedef void( {\bfseries lws\+\_\+ev\+\_\+signal\+\_\+cb\+\_\+t}) (E\+V\+\_\+\+P\+\_\+ struct ev\+\_\+signal $\ast$w, int revents)\hypertarget{group__ev_ga3b0ffd4d2b4fa791c0fd75353a330208}{}\label{group__ev_ga3b0ffd4d2b4fa791c0fd75353a330208}
+
+\end{DoxyCompactItemize}
+\subsection*{Functions}
+\begin{DoxyCompactItemize}
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int {\bfseries lws\+\_\+ev\+\_\+sigint\+\_\+cfg} (struct lws\+\_\+context $\ast$context, int use\+\_\+ev\+\_\+sigint, lws\+\_\+ev\+\_\+signal\+\_\+cb\+\_\+t $\ast$cb)\hypertarget{group__ev_ga5caf14a420a2a0bd687a1fc952f8d64e}{}\label{group__ev_ga5caf14a420a2a0bd687a1fc952f8d64e}
+
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int {\bfseries lws\+\_\+ev\+\_\+initloop} (struct lws\+\_\+context $\ast$context, struct ev\+\_\+loop $\ast$loop, int tsi)\hypertarget{group__ev_ga3fdd23ded693b21853356dc9eaef5ccc}{}\label{group__ev_ga3fdd23ded693b21853356dc9eaef5ccc}
+
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN void {\bfseries lws\+\_\+ev\+\_\+sigint\+\_\+cb} (struct ev\+\_\+loop $\ast$loop, struct ev\+\_\+signal $\ast$watcher, int revents)\hypertarget{group__ev_gaabfc0880d6a98133550c61aa01ef3563}{}\label{group__ev_gaabfc0880d6a98133550c61aa01ef3563}
+
+\end{DoxyCompactItemize}
+
+
+\subsection{Detailed Description}
+\subsubsection*{libev helpers}
+
+A\+P\+Is specific to libev event loop itegration
\ No newline at end of file
--- /dev/null
+\hypertarget{group__extensions}{}\section{Extensions}
+\label{group__extensions}\index{Extensions@{Extensions}}
+\subsection*{Data Structures}
+\begin{DoxyCompactItemize}
+\item
+struct \hyperlink{structlws__ext__options}{lws\+\_\+ext\+\_\+options}
+\item
+struct \hyperlink{structlws__ext__option__arg}{lws\+\_\+ext\+\_\+option\+\_\+arg}
+\item
+struct \hyperlink{structlws__extension}{lws\+\_\+extension}
+\end{DoxyCompactItemize}
+\subsection*{Typedefs}
+\begin{DoxyCompactItemize}
+\item
+typedef int \hyperlink{group__extensions_gaae7169b2cd346b34fa33d0250db2afd0}{lws\+\_\+extension\+\_\+callback\+\_\+function}(struct lws\+\_\+context $\ast$context, const struct \hyperlink{structlws__extension}{lws\+\_\+extension} $\ast$ext, struct lws $\ast$wsi, enum lws\+\_\+extension\+\_\+callback\+\_\+reasons reason, void $\ast$user, void $\ast$in, size\+\_\+t len)
+\end{DoxyCompactItemize}
+\subsection*{Enumerations}
+\begin{DoxyCompactItemize}
+\item
+enum {\bfseries lws\+\_\+extension\+\_\+callback\+\_\+reasons} \{ \\*
+{\bfseries L\+W\+S\+\_\+\+E\+X\+T\+\_\+\+C\+B\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+C\+O\+N\+T\+E\+X\+T\+\_\+\+C\+O\+N\+S\+T\+R\+U\+CT} = 0,
+{\bfseries L\+W\+S\+\_\+\+E\+X\+T\+\_\+\+C\+B\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+C\+O\+N\+T\+E\+X\+T\+\_\+\+C\+O\+N\+S\+T\+R\+U\+CT} = 1,
+{\bfseries L\+W\+S\+\_\+\+E\+X\+T\+\_\+\+C\+B\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+C\+O\+N\+T\+E\+X\+T\+\_\+\+D\+E\+S\+T\+R\+U\+CT} = 2,
+{\bfseries L\+W\+S\+\_\+\+E\+X\+T\+\_\+\+C\+B\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+C\+O\+N\+T\+E\+X\+T\+\_\+\+D\+E\+S\+T\+R\+U\+CT} = 3,
+\\*
+{\bfseries L\+W\+S\+\_\+\+E\+X\+T\+\_\+\+C\+B\+\_\+\+C\+O\+N\+S\+T\+R\+U\+CT} = 4,
+{\bfseries L\+W\+S\+\_\+\+E\+X\+T\+\_\+\+C\+B\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+C\+O\+N\+S\+T\+R\+U\+CT} = 5,
+{\bfseries L\+W\+S\+\_\+\+E\+X\+T\+\_\+\+C\+B\+\_\+\+C\+H\+E\+C\+K\+\_\+\+O\+K\+\_\+\+T\+O\+\_\+\+R\+E\+A\+L\+L\+Y\+\_\+\+C\+L\+O\+SE} = 6,
+{\bfseries L\+W\+S\+\_\+\+E\+X\+T\+\_\+\+C\+B\+\_\+\+C\+H\+E\+C\+K\+\_\+\+O\+K\+\_\+\+T\+O\+\_\+\+P\+R\+O\+P\+O\+S\+E\+\_\+\+E\+X\+T\+E\+N\+S\+I\+ON} = 7,
+\\*
+{\bfseries L\+W\+S\+\_\+\+E\+X\+T\+\_\+\+C\+B\+\_\+\+D\+E\+S\+T\+R\+OY} = 8,
+{\bfseries L\+W\+S\+\_\+\+E\+X\+T\+\_\+\+C\+B\+\_\+\+D\+E\+S\+T\+R\+O\+Y\+\_\+\+A\+N\+Y\+\_\+\+W\+S\+I\+\_\+\+C\+L\+O\+S\+I\+NG} = 9,
+{\bfseries L\+W\+S\+\_\+\+E\+X\+T\+\_\+\+C\+B\+\_\+\+A\+N\+Y\+\_\+\+W\+S\+I\+\_\+\+E\+S\+T\+A\+B\+L\+I\+S\+H\+ED} = 10,
+{\bfseries L\+W\+S\+\_\+\+E\+X\+T\+\_\+\+C\+B\+\_\+\+P\+A\+C\+K\+E\+T\+\_\+\+R\+X\+\_\+\+P\+R\+E\+P\+A\+R\+SE} = 11,
+\\*
+{\bfseries L\+W\+S\+\_\+\+E\+X\+T\+\_\+\+C\+B\+\_\+\+P\+A\+C\+K\+E\+T\+\_\+\+T\+X\+\_\+\+P\+R\+E\+S\+E\+ND} = 12,
+{\bfseries L\+W\+S\+\_\+\+E\+X\+T\+\_\+\+C\+B\+\_\+\+P\+A\+C\+K\+E\+T\+\_\+\+T\+X\+\_\+\+D\+O\+\_\+\+S\+E\+ND} = 13,
+{\bfseries L\+W\+S\+\_\+\+E\+X\+T\+\_\+\+C\+B\+\_\+\+H\+A\+N\+D\+S\+H\+A\+K\+E\+\_\+\+R\+E\+P\+L\+Y\+\_\+\+TX} = 14,
+{\bfseries L\+W\+S\+\_\+\+E\+X\+T\+\_\+\+C\+B\+\_\+\+F\+L\+U\+S\+H\+\_\+\+P\+E\+N\+D\+I\+N\+G\+\_\+\+TX} = 15,
+\\*
+{\bfseries L\+W\+S\+\_\+\+E\+X\+T\+\_\+\+C\+B\+\_\+\+E\+X\+T\+E\+N\+D\+E\+D\+\_\+\+P\+A\+Y\+L\+O\+A\+D\+\_\+\+RX} = 16,
+{\bfseries L\+W\+S\+\_\+\+E\+X\+T\+\_\+\+C\+B\+\_\+\+C\+A\+N\+\_\+\+P\+R\+O\+X\+Y\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+C\+O\+N\+N\+E\+C\+T\+I\+ON} = 17,
+{\bfseries L\+W\+S\+\_\+\+E\+X\+T\+\_\+\+C\+B\+\_\+1\+HZ} = 18,
+{\bfseries L\+W\+S\+\_\+\+E\+X\+T\+\_\+\+C\+B\+\_\+\+R\+E\+Q\+U\+E\+S\+T\+\_\+\+O\+N\+\_\+\+W\+R\+I\+T\+E\+A\+B\+LE} = 19,
+\\*
+{\bfseries L\+W\+S\+\_\+\+E\+X\+T\+\_\+\+C\+B\+\_\+\+I\+S\+\_\+\+W\+R\+I\+T\+E\+A\+B\+LE} = 20,
+{\bfseries L\+W\+S\+\_\+\+E\+X\+T\+\_\+\+C\+B\+\_\+\+P\+A\+Y\+L\+O\+A\+D\+\_\+\+TX} = 21,
+{\bfseries L\+W\+S\+\_\+\+E\+X\+T\+\_\+\+C\+B\+\_\+\+P\+A\+Y\+L\+O\+A\+D\+\_\+\+RX} = 22,
+{\bfseries L\+W\+S\+\_\+\+E\+X\+T\+\_\+\+C\+B\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+D\+E\+F\+A\+U\+LT} = 23,
+\\*
+{\bfseries L\+W\+S\+\_\+\+E\+X\+T\+\_\+\+C\+B\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+S\+ET} = 24,
+{\bfseries L\+W\+S\+\_\+\+E\+X\+T\+\_\+\+C\+B\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+C\+O\+N\+F\+I\+RM} = 25,
+{\bfseries L\+W\+S\+\_\+\+E\+X\+T\+\_\+\+C\+B\+\_\+\+N\+A\+M\+E\+D\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+S\+ET} = 26
+ \}\hypertarget{group__extensions_gae9993815eee72c6070300a0ae2f022d7}{}\label{group__extensions_gae9993815eee72c6070300a0ae2f022d7}
+
+\item
+enum \hyperlink{group__extensions_gacc9f55936dc165257a2e1f7d47bce89e}{lws\+\_\+ext\+\_\+options\+\_\+types} \{ \hyperlink{group__extensions_ggacc9f55936dc165257a2e1f7d47bce89eaabcf56c456c1ff6e81dc82586a16f14c}{E\+X\+T\+A\+R\+G\+\_\+\+N\+O\+NE},
+\hyperlink{group__extensions_ggacc9f55936dc165257a2e1f7d47bce89ea1c86adf924c8786a12bee9687094673e}{E\+X\+T\+A\+R\+G\+\_\+\+D\+EC},
+\hyperlink{group__extensions_ggacc9f55936dc165257a2e1f7d47bce89ea5265abe3e1c3f64412f2affe7bffd880}{E\+X\+T\+A\+R\+G\+\_\+\+O\+P\+T\+\_\+\+D\+EC}
+ \}
+\end{DoxyCompactItemize}
+\subsection*{Functions}
+\begin{DoxyCompactItemize}
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int \hyperlink{group__extensions_gae0e24e1768f83a7fb07896ce975704b9}{lws\+\_\+set\+\_\+extension\+\_\+option} (struct lws $\ast$wsi, const char $\ast$ext\+\_\+name, const char $\ast$opt\+\_\+name, const char $\ast$opt\+\_\+val)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int L\+W\+S\+\_\+\+W\+A\+R\+N\+\_\+\+U\+N\+U\+S\+E\+D\+\_\+\+R\+E\+S\+U\+LT \hyperlink{group__extensions_ga6fb3e2c3dfb9d64dc87026a4e99c128b}{lws\+\_\+ext\+\_\+parse\+\_\+options} (const struct \hyperlink{structlws__extension}{lws\+\_\+extension} $\ast$ext, struct lws $\ast$wsi, void $\ast$ext\+\_\+user, const struct \hyperlink{structlws__ext__options}{lws\+\_\+ext\+\_\+options} $\ast$opts, const char $\ast$o, int len)
+\item
+L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int \hyperlink{group__extensions_ga4cdbe42d872e21a448a947714d6c607e}{lws\+\_\+extension\+\_\+callback\+\_\+pm\+\_\+deflate} (struct lws\+\_\+context $\ast$context, const struct \hyperlink{structlws__extension}{lws\+\_\+extension} $\ast$ext, struct lws $\ast$wsi, enum lws\+\_\+extension\+\_\+callback\+\_\+reasons reason, void $\ast$user, void $\ast$in, size\+\_\+t len)
+\end{DoxyCompactItemize}
+
+
+\subsection{Detailed Description}
+\subsubsection*{Extension releated functions}
+
+Ws defines optional extensions, lws provides the ability to implement these in user code if so desired.
+
+We provide one extensions permessage-\/deflate.
+
+\subsection{Typedef Documentation}
+\index{Extensions@{Extensions}!lws\+\_\+extension\+\_\+callback\+\_\+function@{lws\+\_\+extension\+\_\+callback\+\_\+function}}
+\index{lws\+\_\+extension\+\_\+callback\+\_\+function@{lws\+\_\+extension\+\_\+callback\+\_\+function}!Extensions@{Extensions}}
+\subsubsection[{\texorpdfstring{lws\+\_\+extension\+\_\+callback\+\_\+function}{lws\_extension\_callback\_function}}]{\setlength{\rightskip}{0pt plus 5cm}typedef int lws\+\_\+extension\+\_\+callback\+\_\+function(struct lws\+\_\+context $\ast$context, const struct {\bf lws\+\_\+extension} $\ast$ext, struct lws $\ast$wsi, enum lws\+\_\+extension\+\_\+callback\+\_\+reasons reason, void $\ast$user, void $\ast$in, size\+\_\+t len)}\hypertarget{group__extensions_gaae7169b2cd346b34fa33d0250db2afd0}{}\label{group__extensions_gaae7169b2cd346b34fa33d0250db2afd0}
+
+
+{\ttfamily \#include $<$\hyperlink{libwebsockets_8h}{lib/libwebsockets.\+h}$>$}
+
+typedef \hyperlink{group__extensions_gaae7169b2cd346b34fa33d0250db2afd0}{lws\+\_\+extension\+\_\+callback\+\_\+function()} -\/ Hooks to allow extensions to operate
+\begin{DoxyParams}{Parameters}
+{\em context} & Websockets context \\
+\hline
+{\em ext} & This extension \\
+\hline
+{\em wsi} & Opaque websocket instance pointer \\
+\hline
+{\em reason} & The reason for the call \\
+\hline
+{\em user} & Pointer to ptr to per-\/session user data allocated by library \\
+\hline
+{\em in} & Pointer used for some callback reasons \\
+\hline
+{\em len} & Length set for some callback reasons \begin{DoxyVerb} Each extension that is active on a particular connection receives
+ callbacks during the connection lifetime to allow the extension to
+ operate on websocket data and manage itself.
+
+ Libwebsockets takes care of allocating and freeing "user" memory for
+ each active extension on each connection. That is what is pointed to
+ by the user parameter.
+
+ LWS_EXT_CB_CONSTRUCT: called when the server has decided to
+ select this extension from the list provided by the client,
+ just before the server will send back the handshake accepting
+ the connection with this extension active. This gives the
+ extension a chance to initialize its connection context found
+ in user.
+
+ LWS_EXT_CB_CLIENT_CONSTRUCT: same as LWS_EXT_CB_CONSTRUCT
+ but called when client is instantiating this extension. Some
+ extensions will work the same on client and server side and then
+ you can just merge handlers for both CONSTRUCTS.
+
+ LWS_EXT_CB_DESTROY: called when the connection the extension was
+ being used on is about to be closed and deallocated. It's the
+ last chance for the extension to deallocate anything it has
+ allocated in the user data (pointed to by user) before the
+ user data is deleted. This same callback is used whether you
+ are in client or server instantiation context.
+
+ LWS_EXT_CB_PACKET_RX_PREPARSE: when this extension was active on
+ a connection, and a packet of data arrived at the connection,
+ it is passed to this callback to give the extension a chance to
+ change the data, eg, decompress it. user is pointing to the
+ extension's private connection context data, in is pointing
+ to an lws_tokens struct, it consists of a char * pointer called
+ token, and an int called token_len. At entry, these are
+ set to point to the received buffer and set to the content
+ length. If the extension will grow the content, it should use
+ a new buffer allocated in its private user context data and
+ set the pointed-to lws_tokens members to point to its buffer.
+
+ LWS_EXT_CB_PACKET_TX_PRESEND: this works the same way as
+ LWS_EXT_CB_PACKET_RX_PREPARSE above, except it gives the
+ extension a chance to change websocket data just before it will
+ be sent out. Using the same lws_token pointer scheme in in,
+ the extension can change the buffer and the length to be
+ transmitted how it likes. Again if it wants to grow the
+ buffer safely, it should copy the data into its own buffer and
+ set the lws_tokens token pointer to it.
+
+ LWS_EXT_CB_ARGS_VALIDATE:\end{DoxyVerb}
+ \\
+\hline
+\end{DoxyParams}
+
+
+\subsection{Enumeration Type Documentation}
+\index{Extensions@{Extensions}!lws\+\_\+ext\+\_\+options\+\_\+types@{lws\+\_\+ext\+\_\+options\+\_\+types}}
+\index{lws\+\_\+ext\+\_\+options\+\_\+types@{lws\+\_\+ext\+\_\+options\+\_\+types}!Extensions@{Extensions}}
+\subsubsection[{\texorpdfstring{lws\+\_\+ext\+\_\+options\+\_\+types}{lws\_ext\_options\_types}}]{\setlength{\rightskip}{0pt plus 5cm}enum {\bf lws\+\_\+ext\+\_\+options\+\_\+types}}\hypertarget{group__extensions_gacc9f55936dc165257a2e1f7d47bce89e}{}\label{group__extensions_gacc9f55936dc165257a2e1f7d47bce89e}
+
+
+{\ttfamily \#include $<$\hyperlink{libwebsockets_8h}{lib/libwebsockets.\+h}$>$}
+
+enum lws\+\_\+ext\+\_\+options\+\_\+types \begin{Desc}
+\item[Enumerator]\par
+\begin{description}
+\index{E\+X\+T\+A\+R\+G\+\_\+\+N\+O\+NE@{E\+X\+T\+A\+R\+G\+\_\+\+N\+O\+NE}!Extensions@{Extensions}}\index{Extensions@{Extensions}!E\+X\+T\+A\+R\+G\+\_\+\+N\+O\+NE@{E\+X\+T\+A\+R\+G\+\_\+\+N\+O\+NE}}\item[{\em
+E\+X\+T\+A\+R\+G\+\_\+\+N\+O\+NE\hypertarget{group__extensions_ggacc9f55936dc165257a2e1f7d47bce89eaabcf56c456c1ff6e81dc82586a16f14c}{}\label{group__extensions_ggacc9f55936dc165257a2e1f7d47bce89eaabcf56c456c1ff6e81dc82586a16f14c}
+}]does not take an argument \index{E\+X\+T\+A\+R\+G\+\_\+\+D\+EC@{E\+X\+T\+A\+R\+G\+\_\+\+D\+EC}!Extensions@{Extensions}}\index{Extensions@{Extensions}!E\+X\+T\+A\+R\+G\+\_\+\+D\+EC@{E\+X\+T\+A\+R\+G\+\_\+\+D\+EC}}\item[{\em
+E\+X\+T\+A\+R\+G\+\_\+\+D\+EC\hypertarget{group__extensions_ggacc9f55936dc165257a2e1f7d47bce89ea1c86adf924c8786a12bee9687094673e}{}\label{group__extensions_ggacc9f55936dc165257a2e1f7d47bce89ea1c86adf924c8786a12bee9687094673e}
+}]requires a decimal argument \index{E\+X\+T\+A\+R\+G\+\_\+\+O\+P\+T\+\_\+\+D\+EC@{E\+X\+T\+A\+R\+G\+\_\+\+O\+P\+T\+\_\+\+D\+EC}!Extensions@{Extensions}}\index{Extensions@{Extensions}!E\+X\+T\+A\+R\+G\+\_\+\+O\+P\+T\+\_\+\+D\+EC@{E\+X\+T\+A\+R\+G\+\_\+\+O\+P\+T\+\_\+\+D\+EC}}\item[{\em
+E\+X\+T\+A\+R\+G\+\_\+\+O\+P\+T\+\_\+\+D\+EC\hypertarget{group__extensions_ggacc9f55936dc165257a2e1f7d47bce89ea5265abe3e1c3f64412f2affe7bffd880}{}\label{group__extensions_ggacc9f55936dc165257a2e1f7d47bce89ea5265abe3e1c3f64412f2affe7bffd880}
+}]may have an optional decimal argument \end{description}
+\end{Desc}
+
+\begin{DoxyCode}
+949 \{
+950 \hyperlink{group__extensions_ggacc9f55936dc165257a2e1f7d47bce89eaabcf56c456c1ff6e81dc82586a16f14c}{EXTARG\_NONE},
+951 \hyperlink{group__extensions_ggacc9f55936dc165257a2e1f7d47bce89ea1c86adf924c8786a12bee9687094673e}{EXTARG\_DEC},
+952 \hyperlink{group__extensions_ggacc9f55936dc165257a2e1f7d47bce89ea5265abe3e1c3f64412f2affe7bffd880}{EXTARG\_OPT\_DEC}
+954 \textcolor{comment}{/* Add new things just above here ---^}
+955 \textcolor{comment}{ * This is part of the ABI, don't needlessly break compatibility */}
+956 \};
+\end{DoxyCode}
+
+
+\subsection{Function Documentation}
+\index{Extensions@{Extensions}!lws\+\_\+ext\+\_\+parse\+\_\+options@{lws\+\_\+ext\+\_\+parse\+\_\+options}}
+\index{lws\+\_\+ext\+\_\+parse\+\_\+options@{lws\+\_\+ext\+\_\+parse\+\_\+options}!Extensions@{Extensions}}
+\subsubsection[{\texorpdfstring{lws\+\_\+ext\+\_\+parse\+\_\+options(const struct lws\+\_\+extension $\ast$ext, struct lws $\ast$wsi, void $\ast$ext\+\_\+user, const struct lws\+\_\+ext\+\_\+options $\ast$opts, const char $\ast$o, int len)}{lws\_ext\_parse\_options(const struct lws\_extension *ext, struct lws *wsi, void *ext\_user, const struct lws\_ext\_options *opts, const char *o, int len)}}]{\setlength{\rightskip}{0pt plus 5cm}L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int L\+W\+S\+\_\+\+W\+A\+R\+N\+\_\+\+U\+N\+U\+S\+E\+D\+\_\+\+R\+E\+S\+U\+LT lws\+\_\+ext\+\_\+parse\+\_\+options (
+\begin{DoxyParamCaption}
+\item[{const struct {\bf lws\+\_\+extension} $\ast$}]{ext, }
+\item[{struct lws $\ast$}]{wsi, }
+\item[{void $\ast$}]{ext\+\_\+user, }
+\item[{const struct {\bf lws\+\_\+ext\+\_\+options} $\ast$}]{opts, }
+\item[{const char $\ast$}]{o, }
+\item[{int}]{len}
+\end{DoxyParamCaption}
+)}\hypertarget{group__extensions_ga6fb3e2c3dfb9d64dc87026a4e99c128b}{}\label{group__extensions_ga6fb3e2c3dfb9d64dc87026a4e99c128b}
+
+
+{\ttfamily \#include $<$\hyperlink{libwebsockets_8h}{lib/libwebsockets.\+h}$>$}
+
+\hyperlink{group__extensions_ga6fb3e2c3dfb9d64dc87026a4e99c128b}{lws\+\_\+ext\+\_\+parse\+\_\+options()} -\/ deal with parsing negotiated extension options
+
+
+\begin{DoxyParams}{Parameters}
+{\em ext} & related extension struct \\
+\hline
+{\em wsi} & websocket connection \\
+\hline
+{\em ext\+\_\+user} & per-\/connection extension private data \\
+\hline
+{\em opts} & list of supported options \\
+\hline
+{\em o} & option string to parse \\
+\hline
+{\em len} & length \\
+\hline
+\end{DoxyParams}
+\index{Extensions@{Extensions}!lws\+\_\+extension\+\_\+callback\+\_\+pm\+\_\+deflate@{lws\+\_\+extension\+\_\+callback\+\_\+pm\+\_\+deflate}}
+\index{lws\+\_\+extension\+\_\+callback\+\_\+pm\+\_\+deflate@{lws\+\_\+extension\+\_\+callback\+\_\+pm\+\_\+deflate}!Extensions@{Extensions}}
+\subsubsection[{\texorpdfstring{lws\+\_\+extension\+\_\+callback\+\_\+pm\+\_\+deflate(struct lws\+\_\+context $\ast$context, const struct lws\+\_\+extension $\ast$ext, struct lws $\ast$wsi, enum lws\+\_\+extension\+\_\+callback\+\_\+reasons reason, void $\ast$user, void $\ast$in, size\+\_\+t len)}{lws\_extension\_callback\_pm\_deflate(struct lws\_context *context, const struct lws\_extension *ext, struct lws *wsi, enum lws\_extension\_callback\_reasons reason, void *user, void *in, size\_t len)}}]{\setlength{\rightskip}{0pt plus 5cm}L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int lws\+\_\+extension\+\_\+callback\+\_\+pm\+\_\+deflate (
+\begin{DoxyParamCaption}
+\item[{struct lws\+\_\+context $\ast$}]{context, }
+\item[{const struct {\bf lws\+\_\+extension} $\ast$}]{ext, }
+\item[{struct lws $\ast$}]{wsi, }
+\item[{enum lws\+\_\+extension\+\_\+callback\+\_\+reasons}]{reason, }
+\item[{void $\ast$}]{user, }
+\item[{void $\ast$}]{in, }
+\item[{size\+\_\+t}]{len}
+\end{DoxyParamCaption}
+)}\hypertarget{group__extensions_ga4cdbe42d872e21a448a947714d6c607e}{}\label{group__extensions_ga4cdbe42d872e21a448a947714d6c607e}
+
+
+{\ttfamily \#include $<$\hyperlink{libwebsockets_8h}{lib/libwebsockets.\+h}$>$}
+
+\hyperlink{group__extensions_ga4cdbe42d872e21a448a947714d6c607e}{lws\+\_\+extension\+\_\+callback\+\_\+pm\+\_\+deflate()} -\/ extension for R\+F\+C7692
+
+
+\begin{DoxyParams}{Parameters}
+{\em context} & lws context \\
+\hline
+{\em ext} & related \hyperlink{structlws__extension}{lws\+\_\+extension} struct \\
+\hline
+{\em wsi} & websocket connection \\
+\hline
+{\em reason} & incoming callback reason \\
+\hline
+{\em user} & per-\/connection extension private data \\
+\hline
+{\em in} & pointer parameter \\
+\hline
+{\em len} & length parameter\\
+\hline
+\end{DoxyParams}
+Built-\/in callback implementing R\+F\+C7692 permessage-\/deflate \index{Extensions@{Extensions}!lws\+\_\+set\+\_\+extension\+\_\+option@{lws\+\_\+set\+\_\+extension\+\_\+option}}
+\index{lws\+\_\+set\+\_\+extension\+\_\+option@{lws\+\_\+set\+\_\+extension\+\_\+option}!Extensions@{Extensions}}
+\subsubsection[{\texorpdfstring{lws\+\_\+set\+\_\+extension\+\_\+option(struct lws $\ast$wsi, const char $\ast$ext\+\_\+name, const char $\ast$opt\+\_\+name, const char $\ast$opt\+\_\+val)}{lws\_set\_extension\_option(struct lws *wsi, const char *ext\_name, const char *opt\_name, const char *opt\_val)}}]{\setlength{\rightskip}{0pt plus 5cm}L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int lws\+\_\+set\+\_\+extension\+\_\+option (
+\begin{DoxyParamCaption}
+\item[{struct lws $\ast$}]{wsi, }
+\item[{const char $\ast$}]{ext\+\_\+name, }
+\item[{const char $\ast$}]{opt\+\_\+name, }
+\item[{const char $\ast$}]{opt\+\_\+val}
+\end{DoxyParamCaption}
+)}\hypertarget{group__extensions_gae0e24e1768f83a7fb07896ce975704b9}{}\label{group__extensions_gae0e24e1768f83a7fb07896ce975704b9}
+
+
+{\ttfamily \#include $<$\hyperlink{libwebsockets_8h}{lib/libwebsockets.\+h}$>$}
+
+\hyperlink{group__extensions_gae0e24e1768f83a7fb07896ce975704b9}{lws\+\_\+set\+\_\+extension\+\_\+option()}\+: set extension option if possible
+
+
+\begin{DoxyParams}{Parameters}
+{\em wsi} & websocket connection \\
+\hline
+{\em ext\+\_\+name} & name of ext, like \char`\"{}permessage-\/deflate\char`\"{} \\
+\hline
+{\em opt\+\_\+name} & name of option, like \char`\"{}rx\+\_\+buf\+\_\+size\char`\"{} \\
+\hline
+{\em opt\+\_\+val} & value to set option to \\
+\hline
+\end{DoxyParams}
--- /dev/null
+\hypertarget{group__fops}{}\section{file operation wrapping}
+\label{group__fops}\index{file operation wrapping@{file operation wrapping}}
+\subsection*{Data Structures}
+\begin{DoxyCompactItemize}
+\item
+struct \hyperlink{structlws__plat__file__ops}{lws\+\_\+plat\+\_\+file\+\_\+ops}
+\end{DoxyCompactItemize}
+\subsection*{Functions}
+\begin{DoxyCompactItemize}
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN struct \hyperlink{structlws__plat__file__ops}{lws\+\_\+plat\+\_\+file\+\_\+ops} $\ast$L\+W\+S\+\_\+\+W\+A\+R\+N\+\_\+\+U\+N\+U\+S\+E\+D\+\_\+\+R\+E\+S\+U\+LT \hyperlink{group__fops_gac08aef64c4c34647ed699b24759b6b0e}{lws\+\_\+get\+\_\+fops} (struct lws\+\_\+context $\ast$context)
+\end{DoxyCompactItemize}
+
+
+\subsection{Detailed Description}
+\subsubsection*{File operation wrapping}
+
+Use these helper functions if you want to access a file from the perspective of a specific wsi, which is usually the case. If you just want contextless file access, use the fops callbacks directly with N\+U\+LL wsi instead of these helpers.
+
+If so, then it calls the platform handler or user overrides where present (as defined in info-\/$>$fops)
+
+The advantage from all this is user code can be portable for file operations without having to deal with differences between platforms.
+
+\subsection{Function Documentation}
+\index{file operation wrapping@{file operation wrapping}!lws\+\_\+get\+\_\+fops@{lws\+\_\+get\+\_\+fops}}
+\index{lws\+\_\+get\+\_\+fops@{lws\+\_\+get\+\_\+fops}!file operation wrapping@{file operation wrapping}}
+\subsubsection[{\texorpdfstring{lws\+\_\+get\+\_\+fops(struct lws\+\_\+context $\ast$context)}{lws\_get\_fops(struct lws\_context *context)}}]{\setlength{\rightskip}{0pt plus 5cm}L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN struct {\bf lws\+\_\+plat\+\_\+file\+\_\+ops}$\ast$ L\+W\+S\+\_\+\+W\+A\+R\+N\+\_\+\+U\+N\+U\+S\+E\+D\+\_\+\+R\+E\+S\+U\+LT lws\+\_\+get\+\_\+fops (
+\begin{DoxyParamCaption}
+\item[{struct lws\+\_\+context $\ast$}]{context}
+\end{DoxyParamCaption}
+)}\hypertarget{group__fops_gac08aef64c4c34647ed699b24759b6b0e}{}\label{group__fops_gac08aef64c4c34647ed699b24759b6b0e}
+
+
+{\ttfamily \#include $<$\hyperlink{libwebsockets_8h}{lib/libwebsockets.\+h}$>$}
+
+\hyperlink{group__fops_gac08aef64c4c34647ed699b24759b6b0e}{lws\+\_\+get\+\_\+fops()} -\/ get current file ops
+
+
+\begin{DoxyParams}{Parameters}
+{\em context} & context \\
+\hline
+\end{DoxyParams}
--- /dev/null
+\hypertarget{group__form-parsing}{}\section{Form Parsing}
+\label{group__form-parsing}\index{Form Parsing@{Form Parsing}}
+\subsection*{Typedefs}
+\begin{DoxyCompactItemize}
+\item
+typedef int($\ast$ \hyperlink{group__form-parsing_ga5a70527c0861c2ffa3d29333a6aa7f8e}{lws\+\_\+spa\+\_\+fileupload\+\_\+cb}) (void $\ast$data, const char $\ast$name, const char $\ast$filename, char $\ast$buf, int len, enum \hyperlink{group__form-parsing_ga41a74a822771d3dce89751aa3bce28ae}{lws\+\_\+spa\+\_\+fileupload\+\_\+states} state)
+\end{DoxyCompactItemize}
+\subsection*{Enumerations}
+\begin{DoxyCompactItemize}
+\item
+enum \hyperlink{group__form-parsing_ga41a74a822771d3dce89751aa3bce28ae}{lws\+\_\+spa\+\_\+fileupload\+\_\+states} \{ \hyperlink{group__form-parsing_gga41a74a822771d3dce89751aa3bce28aead3a958e7719ac273c3ba4f684f00c87f}{L\+W\+S\+\_\+\+U\+F\+S\+\_\+\+C\+O\+N\+T\+E\+NT},
+\hyperlink{group__form-parsing_gga41a74a822771d3dce89751aa3bce28aea6ce2a55a4c3695cdb640c893d95bd3a7}{L\+W\+S\+\_\+\+U\+F\+S\+\_\+\+F\+I\+N\+A\+L\+\_\+\+C\+O\+N\+T\+E\+NT},
+\hyperlink{group__form-parsing_gga41a74a822771d3dce89751aa3bce28aea2d25de44865bd44e5a3903a2bab9ca83}{L\+W\+S\+\_\+\+U\+F\+S\+\_\+\+O\+P\+EN}
+ \}
+\end{DoxyCompactItemize}
+\subsection*{Functions}
+\begin{DoxyCompactItemize}
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN struct lws\+\_\+spa $\ast$ \hyperlink{group__form-parsing_ga162f86762173a2bc8c28497941d74815}{lws\+\_\+spa\+\_\+create} (struct lws $\ast$wsi, const char $\ast$const $\ast$param\+\_\+names, int count\+\_\+params, int max\+\_\+storage, \hyperlink{group__form-parsing_ga5a70527c0861c2ffa3d29333a6aa7f8e}{lws\+\_\+spa\+\_\+fileupload\+\_\+cb} opt\+\_\+cb, void $\ast$opt\+\_\+data)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int \hyperlink{group__form-parsing_ga9ad9ebf5ea1a7108415ed7e04cb231d2}{lws\+\_\+spa\+\_\+process} (struct lws\+\_\+spa $\ast$spa, const char $\ast$in, int len)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int \hyperlink{group__form-parsing_ga83835bf250ee3d4a60f36a182f2b8d24}{lws\+\_\+spa\+\_\+finalize} (struct lws\+\_\+spa $\ast$spa)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int \hyperlink{group__form-parsing_ga3fbe378632f85ec9a14cc2c1687bf05f}{lws\+\_\+spa\+\_\+get\+\_\+length} (struct lws\+\_\+spa $\ast$spa, int n)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN const char $\ast$ \hyperlink{group__form-parsing_ga2da476217166da02704b90d3a8d4f3cd}{lws\+\_\+spa\+\_\+get\+\_\+string} (struct lws\+\_\+spa $\ast$spa, int n)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int \hyperlink{group__form-parsing_gaaa482f07dad3f04b391cccf0a814e13b}{lws\+\_\+spa\+\_\+destroy} (struct lws\+\_\+spa $\ast$spa)
+\end{DoxyCompactItemize}
+
+
+\subsection{Detailed Description}
+\subsubsection*{P\+O\+S\+Ted form parsing functions}
+
+These lws\+\_\+spa (stateful post arguments) apis let you parse and urldecode P\+O\+S\+Ted form arguments, both using simple urlencoded and multipart transfer encoding.
+
+It\textquotesingle{}s capable of handling file uploads as well a named input parsing, and the apis are the same for both form upload styles.
+
+You feed it a list of parameter names and it creates pointers to the urldecoded arguments\+: file upload parameters pass the file data in chunks to a user-\/supplied callback as they come.
+
+Since it\textquotesingle{}s stateful, it handles the incoming data needing more than one P\+O\+S\+T\+\_\+\+B\+O\+DY callback and has no limit on uploaded file size.
+
+\subsection{Typedef Documentation}
+\index{Form Parsing@{Form Parsing}!lws\+\_\+spa\+\_\+fileupload\+\_\+cb@{lws\+\_\+spa\+\_\+fileupload\+\_\+cb}}
+\index{lws\+\_\+spa\+\_\+fileupload\+\_\+cb@{lws\+\_\+spa\+\_\+fileupload\+\_\+cb}!Form Parsing@{Form Parsing}}
+\subsubsection[{\texorpdfstring{lws\+\_\+spa\+\_\+fileupload\+\_\+cb}{lws\_spa\_fileupload\_cb}}]{\setlength{\rightskip}{0pt plus 5cm}typedef int($\ast$ lws\+\_\+spa\+\_\+fileupload\+\_\+cb) (void $\ast$data, const char $\ast$name, const char $\ast$filename, char $\ast$buf, int len, enum {\bf lws\+\_\+spa\+\_\+fileupload\+\_\+states} state)}\hypertarget{group__form-parsing_ga5a70527c0861c2ffa3d29333a6aa7f8e}{}\label{group__form-parsing_ga5a70527c0861c2ffa3d29333a6aa7f8e}
+
+
+{\ttfamily \#include $<$\hyperlink{libwebsockets_8h}{lib/libwebsockets.\+h}$>$}
+
+\hyperlink{group__form-parsing_ga5a70527c0861c2ffa3d29333a6aa7f8e}{lws\+\_\+spa\+\_\+fileupload\+\_\+cb()} -\/ callback to receive file upload data
+
+
+\begin{DoxyParams}{Parameters}
+{\em data} & opt\+\_\+data pointer set in lws\+\_\+spa\+\_\+create \\
+\hline
+{\em name} & name of the form field being uploaded \\
+\hline
+{\em filename} & original filename from client \\
+\hline
+{\em buf} & start of data to receive \\
+\hline
+{\em len} & length of data to receive \\
+\hline
+{\em state} & information about how this call relates to file\\
+\hline
+\end{DoxyParams}
+Notice name and filename shouldn\textquotesingle{}t be trusted, as they are passed from H\+T\+TP provided by the client.
+
+\subsection{Enumeration Type Documentation}
+\index{Form Parsing@{Form Parsing}!lws\+\_\+spa\+\_\+fileupload\+\_\+states@{lws\+\_\+spa\+\_\+fileupload\+\_\+states}}
+\index{lws\+\_\+spa\+\_\+fileupload\+\_\+states@{lws\+\_\+spa\+\_\+fileupload\+\_\+states}!Form Parsing@{Form Parsing}}
+\subsubsection[{\texorpdfstring{lws\+\_\+spa\+\_\+fileupload\+\_\+states}{lws\_spa\_fileupload\_states}}]{\setlength{\rightskip}{0pt plus 5cm}enum {\bf lws\+\_\+spa\+\_\+fileupload\+\_\+states}}\hypertarget{group__form-parsing_ga41a74a822771d3dce89751aa3bce28ae}{}\label{group__form-parsing_ga41a74a822771d3dce89751aa3bce28ae}
+
+
+{\ttfamily \#include $<$\hyperlink{libwebsockets_8h}{lib/libwebsockets.\+h}$>$}
+
+enum lws\+\_\+spa\+\_\+fileupload\+\_\+states \begin{Desc}
+\item[Enumerator]\par
+\begin{description}
+\index{L\+W\+S\+\_\+\+U\+F\+S\+\_\+\+C\+O\+N\+T\+E\+NT@{L\+W\+S\+\_\+\+U\+F\+S\+\_\+\+C\+O\+N\+T\+E\+NT}!Form Parsing@{Form Parsing}}\index{Form Parsing@{Form Parsing}!L\+W\+S\+\_\+\+U\+F\+S\+\_\+\+C\+O\+N\+T\+E\+NT@{L\+W\+S\+\_\+\+U\+F\+S\+\_\+\+C\+O\+N\+T\+E\+NT}}\item[{\em
+L\+W\+S\+\_\+\+U\+F\+S\+\_\+\+C\+O\+N\+T\+E\+NT\hypertarget{group__form-parsing_gga41a74a822771d3dce89751aa3bce28aead3a958e7719ac273c3ba4f684f00c87f}{}\label{group__form-parsing_gga41a74a822771d3dce89751aa3bce28aead3a958e7719ac273c3ba4f684f00c87f}
+}]a chunk of file content has arrived \index{L\+W\+S\+\_\+\+U\+F\+S\+\_\+\+F\+I\+N\+A\+L\+\_\+\+C\+O\+N\+T\+E\+NT@{L\+W\+S\+\_\+\+U\+F\+S\+\_\+\+F\+I\+N\+A\+L\+\_\+\+C\+O\+N\+T\+E\+NT}!Form Parsing@{Form Parsing}}\index{Form Parsing@{Form Parsing}!L\+W\+S\+\_\+\+U\+F\+S\+\_\+\+F\+I\+N\+A\+L\+\_\+\+C\+O\+N\+T\+E\+NT@{L\+W\+S\+\_\+\+U\+F\+S\+\_\+\+F\+I\+N\+A\+L\+\_\+\+C\+O\+N\+T\+E\+NT}}\item[{\em
+L\+W\+S\+\_\+\+U\+F\+S\+\_\+\+F\+I\+N\+A\+L\+\_\+\+C\+O\+N\+T\+E\+NT\hypertarget{group__form-parsing_gga41a74a822771d3dce89751aa3bce28aea6ce2a55a4c3695cdb640c893d95bd3a7}{}\label{group__form-parsing_gga41a74a822771d3dce89751aa3bce28aea6ce2a55a4c3695cdb640c893d95bd3a7}
+}]the last chunk (possibly zero length) of file content has arrived \index{L\+W\+S\+\_\+\+U\+F\+S\+\_\+\+O\+P\+EN@{L\+W\+S\+\_\+\+U\+F\+S\+\_\+\+O\+P\+EN}!Form Parsing@{Form Parsing}}\index{Form Parsing@{Form Parsing}!L\+W\+S\+\_\+\+U\+F\+S\+\_\+\+O\+P\+EN@{L\+W\+S\+\_\+\+U\+F\+S\+\_\+\+O\+P\+EN}}\item[{\em
+L\+W\+S\+\_\+\+U\+F\+S\+\_\+\+O\+P\+EN\hypertarget{group__form-parsing_gga41a74a822771d3dce89751aa3bce28aea2d25de44865bd44e5a3903a2bab9ca83}{}\label{group__form-parsing_gga41a74a822771d3dce89751aa3bce28aea2d25de44865bd44e5a3903a2bab9ca83}
+}]a new file is starting to arrive \end{description}
+\end{Desc}
+
+\begin{DoxyCode}
+2552 \{
+2553 \hyperlink{group__form-parsing_gga41a74a822771d3dce89751aa3bce28aead3a958e7719ac273c3ba4f684f00c87f}{LWS\_UFS\_CONTENT},
+2555 \hyperlink{group__form-parsing_gga41a74a822771d3dce89751aa3bce28aea6ce2a55a4c3695cdb640c893d95bd3a7}{LWS\_UFS\_FINAL\_CONTENT},
+2557 \hyperlink{group__form-parsing_gga41a74a822771d3dce89751aa3bce28aea2d25de44865bd44e5a3903a2bab9ca83}{LWS\_UFS\_OPEN}
+2559 \};
+\end{DoxyCode}
+
+
+\subsection{Function Documentation}
+\index{Form Parsing@{Form Parsing}!lws\+\_\+spa\+\_\+create@{lws\+\_\+spa\+\_\+create}}
+\index{lws\+\_\+spa\+\_\+create@{lws\+\_\+spa\+\_\+create}!Form Parsing@{Form Parsing}}
+\subsubsection[{\texorpdfstring{lws\+\_\+spa\+\_\+create(struct lws $\ast$wsi, const char $\ast$const $\ast$param\+\_\+names, int count\+\_\+params, int max\+\_\+storage, lws\+\_\+spa\+\_\+fileupload\+\_\+cb opt\+\_\+cb, void $\ast$opt\+\_\+data)}{lws\_spa\_create(struct lws *wsi, const char *const *param\_names, int count\_params, int max\_storage, lws\_spa\_fileupload\_cb opt\_cb, void *opt\_data)}}]{\setlength{\rightskip}{0pt plus 5cm}L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN struct lws\+\_\+spa$\ast$ lws\+\_\+spa\+\_\+create (
+\begin{DoxyParamCaption}
+\item[{struct lws $\ast$}]{wsi, }
+\item[{const char $\ast$const $\ast$}]{param\+\_\+names, }
+\item[{int}]{count\+\_\+params, }
+\item[{int}]{max\+\_\+storage, }
+\item[{{\bf lws\+\_\+spa\+\_\+fileupload\+\_\+cb}}]{opt\+\_\+cb, }
+\item[{void $\ast$}]{opt\+\_\+data}
+\end{DoxyParamCaption}
+)}\hypertarget{group__form-parsing_ga162f86762173a2bc8c28497941d74815}{}\label{group__form-parsing_ga162f86762173a2bc8c28497941d74815}
+
+
+{\ttfamily \#include $<$\hyperlink{libwebsockets_8h}{lib/libwebsockets.\+h}$>$}
+
+\hyperlink{group__form-parsing_ga162f86762173a2bc8c28497941d74815}{lws\+\_\+spa\+\_\+create()} -\/ create urldecode parser
+
+
+\begin{DoxyParams}{Parameters}
+{\em wsi} & lws connection (used to find Content Type) \\
+\hline
+{\em param\+\_\+names} & array of form parameter names, like \char`\"{}username\char`\"{} \\
+\hline
+{\em count\+\_\+params} & count of param\+\_\+names \\
+\hline
+{\em max\+\_\+storage} & total amount of form parameter values we can store \\
+\hline
+{\em opt\+\_\+cb} & N\+U\+LL, or callback to receive file upload data. \\
+\hline
+{\em opt\+\_\+data} & N\+U\+LL, or user pointer provided to opt\+\_\+cb.\\
+\hline
+\end{DoxyParams}
+Creates a urldecode parser and initializes it.
+
+opt\+\_\+cb can be N\+U\+LL if you just want normal name=value parsing, however if one or more entries in your form are bulk data (file transfer), you can provide this callback and filter on the name callback parameter to treat that urldecoded data separately. The callback should return -\/1 in case of fatal error, and 0 if OK. \index{Form Parsing@{Form Parsing}!lws\+\_\+spa\+\_\+destroy@{lws\+\_\+spa\+\_\+destroy}}
+\index{lws\+\_\+spa\+\_\+destroy@{lws\+\_\+spa\+\_\+destroy}!Form Parsing@{Form Parsing}}
+\subsubsection[{\texorpdfstring{lws\+\_\+spa\+\_\+destroy(struct lws\+\_\+spa $\ast$spa)}{lws\_spa\_destroy(struct lws\_spa *spa)}}]{\setlength{\rightskip}{0pt plus 5cm}L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int lws\+\_\+spa\+\_\+destroy (
+\begin{DoxyParamCaption}
+\item[{struct lws\+\_\+spa $\ast$}]{spa}
+\end{DoxyParamCaption}
+)}\hypertarget{group__form-parsing_gaaa482f07dad3f04b391cccf0a814e13b}{}\label{group__form-parsing_gaaa482f07dad3f04b391cccf0a814e13b}
+
+
+{\ttfamily \#include $<$\hyperlink{libwebsockets_8h}{lib/libwebsockets.\+h}$>$}
+
+\hyperlink{group__form-parsing_gaaa482f07dad3f04b391cccf0a814e13b}{lws\+\_\+spa\+\_\+destroy()} -\/ destroy parser object
+
+
+\begin{DoxyParams}{Parameters}
+{\em spa} & the parser object previously created \\
+\hline
+\end{DoxyParams}
+\index{Form Parsing@{Form Parsing}!lws\+\_\+spa\+\_\+finalize@{lws\+\_\+spa\+\_\+finalize}}
+\index{lws\+\_\+spa\+\_\+finalize@{lws\+\_\+spa\+\_\+finalize}!Form Parsing@{Form Parsing}}
+\subsubsection[{\texorpdfstring{lws\+\_\+spa\+\_\+finalize(struct lws\+\_\+spa $\ast$spa)}{lws\_spa\_finalize(struct lws\_spa *spa)}}]{\setlength{\rightskip}{0pt plus 5cm}L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int lws\+\_\+spa\+\_\+finalize (
+\begin{DoxyParamCaption}
+\item[{struct lws\+\_\+spa $\ast$}]{spa}
+\end{DoxyParamCaption}
+)}\hypertarget{group__form-parsing_ga83835bf250ee3d4a60f36a182f2b8d24}{}\label{group__form-parsing_ga83835bf250ee3d4a60f36a182f2b8d24}
+
+
+{\ttfamily \#include $<$\hyperlink{libwebsockets_8h}{lib/libwebsockets.\+h}$>$}
+
+\hyperlink{group__form-parsing_ga83835bf250ee3d4a60f36a182f2b8d24}{lws\+\_\+spa\+\_\+finalize()} -\/ indicate incoming data completed
+
+
+\begin{DoxyParams}{Parameters}
+{\em spa} & the parser object previously created \\
+\hline
+\end{DoxyParams}
+\index{Form Parsing@{Form Parsing}!lws\+\_\+spa\+\_\+get\+\_\+length@{lws\+\_\+spa\+\_\+get\+\_\+length}}
+\index{lws\+\_\+spa\+\_\+get\+\_\+length@{lws\+\_\+spa\+\_\+get\+\_\+length}!Form Parsing@{Form Parsing}}
+\subsubsection[{\texorpdfstring{lws\+\_\+spa\+\_\+get\+\_\+length(struct lws\+\_\+spa $\ast$spa, int n)}{lws\_spa\_get\_length(struct lws\_spa *spa, int n)}}]{\setlength{\rightskip}{0pt plus 5cm}L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int lws\+\_\+spa\+\_\+get\+\_\+length (
+\begin{DoxyParamCaption}
+\item[{struct lws\+\_\+spa $\ast$}]{spa, }
+\item[{int}]{n}
+\end{DoxyParamCaption}
+)}\hypertarget{group__form-parsing_ga3fbe378632f85ec9a14cc2c1687bf05f}{}\label{group__form-parsing_ga3fbe378632f85ec9a14cc2c1687bf05f}
+
+
+{\ttfamily \#include $<$\hyperlink{libwebsockets_8h}{lib/libwebsockets.\+h}$>$}
+
+\hyperlink{group__form-parsing_ga3fbe378632f85ec9a14cc2c1687bf05f}{lws\+\_\+spa\+\_\+get\+\_\+length()} -\/ return length of parameter value
+
+
+\begin{DoxyParams}{Parameters}
+{\em spa} & the parser object previously created \\
+\hline
+{\em n} & parameter ordinal to return length of value for \\
+\hline
+\end{DoxyParams}
+\index{Form Parsing@{Form Parsing}!lws\+\_\+spa\+\_\+get\+\_\+string@{lws\+\_\+spa\+\_\+get\+\_\+string}}
+\index{lws\+\_\+spa\+\_\+get\+\_\+string@{lws\+\_\+spa\+\_\+get\+\_\+string}!Form Parsing@{Form Parsing}}
+\subsubsection[{\texorpdfstring{lws\+\_\+spa\+\_\+get\+\_\+string(struct lws\+\_\+spa $\ast$spa, int n)}{lws\_spa\_get\_string(struct lws\_spa *spa, int n)}}]{\setlength{\rightskip}{0pt plus 5cm}L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN const char$\ast$ lws\+\_\+spa\+\_\+get\+\_\+string (
+\begin{DoxyParamCaption}
+\item[{struct lws\+\_\+spa $\ast$}]{spa, }
+\item[{int}]{n}
+\end{DoxyParamCaption}
+)}\hypertarget{group__form-parsing_ga2da476217166da02704b90d3a8d4f3cd}{}\label{group__form-parsing_ga2da476217166da02704b90d3a8d4f3cd}
+
+
+{\ttfamily \#include $<$\hyperlink{libwebsockets_8h}{lib/libwebsockets.\+h}$>$}
+
+\hyperlink{group__form-parsing_ga2da476217166da02704b90d3a8d4f3cd}{lws\+\_\+spa\+\_\+get\+\_\+string()} -\/ return pointer to parameter value
+\begin{DoxyParams}{Parameters}
+{\em spa} & the parser object previously created \\
+\hline
+{\em n} & parameter ordinal to return pointer to value for \\
+\hline
+\end{DoxyParams}
+\index{Form Parsing@{Form Parsing}!lws\+\_\+spa\+\_\+process@{lws\+\_\+spa\+\_\+process}}
+\index{lws\+\_\+spa\+\_\+process@{lws\+\_\+spa\+\_\+process}!Form Parsing@{Form Parsing}}
+\subsubsection[{\texorpdfstring{lws\+\_\+spa\+\_\+process(struct lws\+\_\+spa $\ast$spa, const char $\ast$in, int len)}{lws\_spa\_process(struct lws\_spa *spa, const char *in, int len)}}]{\setlength{\rightskip}{0pt plus 5cm}L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int lws\+\_\+spa\+\_\+process (
+\begin{DoxyParamCaption}
+\item[{struct lws\+\_\+spa $\ast$}]{spa, }
+\item[{const char $\ast$}]{in, }
+\item[{int}]{len}
+\end{DoxyParamCaption}
+)}\hypertarget{group__form-parsing_ga9ad9ebf5ea1a7108415ed7e04cb231d2}{}\label{group__form-parsing_ga9ad9ebf5ea1a7108415ed7e04cb231d2}
+
+
+{\ttfamily \#include $<$\hyperlink{libwebsockets_8h}{lib/libwebsockets.\+h}$>$}
+
+\hyperlink{group__form-parsing_ga9ad9ebf5ea1a7108415ed7e04cb231d2}{lws\+\_\+spa\+\_\+process()} -\/ parses a chunk of input data
+
+
+\begin{DoxyParams}{Parameters}
+{\em spa} & the parser object previously created \\
+\hline
+{\em in} & incoming, urlencoded data \\
+\hline
+{\em len} & count of bytes valid at \\
+\hline
+{\em in} & \\
+\hline
+\end{DoxyParams}
--- /dev/null
+\hypertarget{group__generic-sessions}{}\section{plugin\+: generic-\/sessions}
+\label{group__generic-sessions}\index{plugin\+: generic-\/sessions@{plugin\+: generic-\/sessions}}
+\subsection*{Data Structures}
+\begin{DoxyCompactItemize}
+\item
+struct \hyperlink{structlwsgw__hash__bin}{lwsgw\+\_\+hash\+\_\+bin}
+\item
+struct \hyperlink{structlwsgw__hash}{lwsgw\+\_\+hash}
+\item
+struct \hyperlink{structlws__session__info}{lws\+\_\+session\+\_\+info}
+\item
+struct \hyperlink{structlws__gs__event__args}{lws\+\_\+gs\+\_\+event\+\_\+args}
+\end{DoxyCompactItemize}
+\subsection*{Enumerations}
+\begin{DoxyCompactItemize}
+\item
+enum \hyperlink{group__generic-sessions_ga7c2dc7bfb4ccb91c5d771f9e9ea237e1}{lwsgs\+\_\+auth\+\_\+bits} \{ \hyperlink{group__generic-sessions_gga7c2dc7bfb4ccb91c5d771f9e9ea237e1a81e63075115dedd150265d81b8f7fa57}{L\+W\+S\+G\+S\+\_\+\+A\+U\+T\+H\+\_\+\+L\+O\+G\+G\+E\+D\+\_\+\+IN} = 1,
+\hyperlink{group__generic-sessions_gga7c2dc7bfb4ccb91c5d771f9e9ea237e1a0657a9e846814781b128c397fe4b10bf}{L\+W\+S\+G\+S\+\_\+\+A\+U\+T\+H\+\_\+\+A\+D\+M\+IN} = 2,
+\hyperlink{group__generic-sessions_gga7c2dc7bfb4ccb91c5d771f9e9ea237e1a5a607e4668d20cadada62c4b8007f887}{L\+W\+S\+G\+S\+\_\+\+A\+U\+T\+H\+\_\+\+V\+E\+R\+I\+F\+I\+ED} = 4,
+\hyperlink{group__generic-sessions_gga7c2dc7bfb4ccb91c5d771f9e9ea237e1a2cd8fb86e3b85c106e7711c03f0ddd0a}{L\+W\+S\+G\+S\+\_\+\+A\+U\+T\+H\+\_\+\+F\+O\+R\+G\+O\+T\+\_\+\+F\+L\+OW} = 8
+ \}
+\item
+enum \hyperlink{group__generic-sessions_gaa93946b3d921072209d5cd8cdfa5332e}{lws\+\_\+gs\+\_\+event} \{ \hyperlink{group__generic-sessions_ggaa93946b3d921072209d5cd8cdfa5332ea596010a165bf13473c5eea3a34cd4308}{L\+W\+S\+G\+S\+E\+\_\+\+C\+R\+E\+A\+T\+ED},
+\hyperlink{group__generic-sessions_ggaa93946b3d921072209d5cd8cdfa5332ead908cdc5689c5d22c9d3c8934e94dcde}{L\+W\+S\+G\+S\+E\+\_\+\+D\+E\+L\+E\+T\+ED}
+ \}
+\end{DoxyCompactItemize}
+
+
+\subsection{Detailed Description}
+\subsubsection*{Plugin Generic-\/sessions related}
+
+generic-\/sessions plugin provides a reusable, generic session and login / register / forgot password framework including email verification.
+
+\subsection{Enumeration Type Documentation}
+\index{plugin\+: generic-\/sessions@{plugin\+: generic-\/sessions}!lws\+\_\+gs\+\_\+event@{lws\+\_\+gs\+\_\+event}}
+\index{lws\+\_\+gs\+\_\+event@{lws\+\_\+gs\+\_\+event}!plugin\+: generic-\/sessions@{plugin\+: generic-\/sessions}}
+\subsubsection[{\texorpdfstring{lws\+\_\+gs\+\_\+event}{lws\_gs\_event}}]{\setlength{\rightskip}{0pt plus 5cm}enum {\bf lws\+\_\+gs\+\_\+event}}\hypertarget{group__generic-sessions_gaa93946b3d921072209d5cd8cdfa5332e}{}\label{group__generic-sessions_gaa93946b3d921072209d5cd8cdfa5332e}
+
+
+{\ttfamily \#include $<$\hyperlink{libwebsockets_8h}{lib/libwebsockets.\+h}$>$}
+
+enum lws\+\_\+gs\+\_\+event \begin{Desc}
+\item[Enumerator]\par
+\begin{description}
+\index{L\+W\+S\+G\+S\+E\+\_\+\+C\+R\+E\+A\+T\+ED@{L\+W\+S\+G\+S\+E\+\_\+\+C\+R\+E\+A\+T\+ED}!plugin\+: generic-\/sessions@{plugin\+: generic-\/sessions}}\index{plugin\+: generic-\/sessions@{plugin\+: generic-\/sessions}!L\+W\+S\+G\+S\+E\+\_\+\+C\+R\+E\+A\+T\+ED@{L\+W\+S\+G\+S\+E\+\_\+\+C\+R\+E\+A\+T\+ED}}\item[{\em
+L\+W\+S\+G\+S\+E\+\_\+\+C\+R\+E\+A\+T\+ED\hypertarget{group__generic-sessions_ggaa93946b3d921072209d5cd8cdfa5332ea596010a165bf13473c5eea3a34cd4308}{}\label{group__generic-sessions_ggaa93946b3d921072209d5cd8cdfa5332ea596010a165bf13473c5eea3a34cd4308}
+}]a new user was created \index{L\+W\+S\+G\+S\+E\+\_\+\+D\+E\+L\+E\+T\+ED@{L\+W\+S\+G\+S\+E\+\_\+\+D\+E\+L\+E\+T\+ED}!plugin\+: generic-\/sessions@{plugin\+: generic-\/sessions}}\index{plugin\+: generic-\/sessions@{plugin\+: generic-\/sessions}!L\+W\+S\+G\+S\+E\+\_\+\+D\+E\+L\+E\+T\+ED@{L\+W\+S\+G\+S\+E\+\_\+\+D\+E\+L\+E\+T\+ED}}\item[{\em
+L\+W\+S\+G\+S\+E\+\_\+\+D\+E\+L\+E\+T\+ED\hypertarget{group__generic-sessions_ggaa93946b3d921072209d5cd8cdfa5332ead908cdc5689c5d22c9d3c8934e94dcde}{}\label{group__generic-sessions_ggaa93946b3d921072209d5cd8cdfa5332ead908cdc5689c5d22c9d3c8934e94dcde}
+}]an existing user was deleted \end{description}
+\end{Desc}
+
+\begin{DoxyCode}
+1311 \{
+1312 \hyperlink{group__generic-sessions_ggaa93946b3d921072209d5cd8cdfa5332ea596010a165bf13473c5eea3a34cd4308}{LWSGSE\_CREATED},
+1313 \hyperlink{group__generic-sessions_ggaa93946b3d921072209d5cd8cdfa5332ead908cdc5689c5d22c9d3c8934e94dcde}{LWSGSE\_DELETED}
+1314 \};
+\end{DoxyCode}
+\index{plugin\+: generic-\/sessions@{plugin\+: generic-\/sessions}!lwsgs\+\_\+auth\+\_\+bits@{lwsgs\+\_\+auth\+\_\+bits}}
+\index{lwsgs\+\_\+auth\+\_\+bits@{lwsgs\+\_\+auth\+\_\+bits}!plugin\+: generic-\/sessions@{plugin\+: generic-\/sessions}}
+\subsubsection[{\texorpdfstring{lwsgs\+\_\+auth\+\_\+bits}{lwsgs\_auth\_bits}}]{\setlength{\rightskip}{0pt plus 5cm}enum {\bf lwsgs\+\_\+auth\+\_\+bits}}\hypertarget{group__generic-sessions_ga7c2dc7bfb4ccb91c5d771f9e9ea237e1}{}\label{group__generic-sessions_ga7c2dc7bfb4ccb91c5d771f9e9ea237e1}
+
+
+{\ttfamily \#include $<$\hyperlink{libwebsockets_8h}{lib/libwebsockets.\+h}$>$}
+
+enum lwsgs\+\_\+auth\+\_\+bits \begin{Desc}
+\item[Enumerator]\par
+\begin{description}
+\index{L\+W\+S\+G\+S\+\_\+\+A\+U\+T\+H\+\_\+\+L\+O\+G\+G\+E\+D\+\_\+\+IN@{L\+W\+S\+G\+S\+\_\+\+A\+U\+T\+H\+\_\+\+L\+O\+G\+G\+E\+D\+\_\+\+IN}!plugin\+: generic-\/sessions@{plugin\+: generic-\/sessions}}\index{plugin\+: generic-\/sessions@{plugin\+: generic-\/sessions}!L\+W\+S\+G\+S\+\_\+\+A\+U\+T\+H\+\_\+\+L\+O\+G\+G\+E\+D\+\_\+\+IN@{L\+W\+S\+G\+S\+\_\+\+A\+U\+T\+H\+\_\+\+L\+O\+G\+G\+E\+D\+\_\+\+IN}}\item[{\em
+L\+W\+S\+G\+S\+\_\+\+A\+U\+T\+H\+\_\+\+L\+O\+G\+G\+E\+D\+\_\+\+IN\hypertarget{group__generic-sessions_gga7c2dc7bfb4ccb91c5d771f9e9ea237e1a81e63075115dedd150265d81b8f7fa57}{}\label{group__generic-sessions_gga7c2dc7bfb4ccb91c5d771f9e9ea237e1a81e63075115dedd150265d81b8f7fa57}
+}]user is logged in as somebody \index{L\+W\+S\+G\+S\+\_\+\+A\+U\+T\+H\+\_\+\+A\+D\+M\+IN@{L\+W\+S\+G\+S\+\_\+\+A\+U\+T\+H\+\_\+\+A\+D\+M\+IN}!plugin\+: generic-\/sessions@{plugin\+: generic-\/sessions}}\index{plugin\+: generic-\/sessions@{plugin\+: generic-\/sessions}!L\+W\+S\+G\+S\+\_\+\+A\+U\+T\+H\+\_\+\+A\+D\+M\+IN@{L\+W\+S\+G\+S\+\_\+\+A\+U\+T\+H\+\_\+\+A\+D\+M\+IN}}\item[{\em
+L\+W\+S\+G\+S\+\_\+\+A\+U\+T\+H\+\_\+\+A\+D\+M\+IN\hypertarget{group__generic-sessions_gga7c2dc7bfb4ccb91c5d771f9e9ea237e1a0657a9e846814781b128c397fe4b10bf}{}\label{group__generic-sessions_gga7c2dc7bfb4ccb91c5d771f9e9ea237e1a0657a9e846814781b128c397fe4b10bf}
+}]logged in as the admin user \index{L\+W\+S\+G\+S\+\_\+\+A\+U\+T\+H\+\_\+\+V\+E\+R\+I\+F\+I\+ED@{L\+W\+S\+G\+S\+\_\+\+A\+U\+T\+H\+\_\+\+V\+E\+R\+I\+F\+I\+ED}!plugin\+: generic-\/sessions@{plugin\+: generic-\/sessions}}\index{plugin\+: generic-\/sessions@{plugin\+: generic-\/sessions}!L\+W\+S\+G\+S\+\_\+\+A\+U\+T\+H\+\_\+\+V\+E\+R\+I\+F\+I\+ED@{L\+W\+S\+G\+S\+\_\+\+A\+U\+T\+H\+\_\+\+V\+E\+R\+I\+F\+I\+ED}}\item[{\em
+L\+W\+S\+G\+S\+\_\+\+A\+U\+T\+H\+\_\+\+V\+E\+R\+I\+F\+I\+ED\hypertarget{group__generic-sessions_gga7c2dc7bfb4ccb91c5d771f9e9ea237e1a5a607e4668d20cadada62c4b8007f887}{}\label{group__generic-sessions_gga7c2dc7bfb4ccb91c5d771f9e9ea237e1a5a607e4668d20cadada62c4b8007f887}
+}]user has verified his email \index{L\+W\+S\+G\+S\+\_\+\+A\+U\+T\+H\+\_\+\+F\+O\+R\+G\+O\+T\+\_\+\+F\+L\+OW@{L\+W\+S\+G\+S\+\_\+\+A\+U\+T\+H\+\_\+\+F\+O\+R\+G\+O\+T\+\_\+\+F\+L\+OW}!plugin\+: generic-\/sessions@{plugin\+: generic-\/sessions}}\index{plugin\+: generic-\/sessions@{plugin\+: generic-\/sessions}!L\+W\+S\+G\+S\+\_\+\+A\+U\+T\+H\+\_\+\+F\+O\+R\+G\+O\+T\+\_\+\+F\+L\+OW@{L\+W\+S\+G\+S\+\_\+\+A\+U\+T\+H\+\_\+\+F\+O\+R\+G\+O\+T\+\_\+\+F\+L\+OW}}\item[{\em
+L\+W\+S\+G\+S\+\_\+\+A\+U\+T\+H\+\_\+\+F\+O\+R\+G\+O\+T\+\_\+\+F\+L\+OW\hypertarget{group__generic-sessions_gga7c2dc7bfb4ccb91c5d771f9e9ea237e1a2cd8fb86e3b85c106e7711c03f0ddd0a}{}\label{group__generic-sessions_gga7c2dc7bfb4ccb91c5d771f9e9ea237e1a2cd8fb86e3b85c106e7711c03f0ddd0a}
+}]he just completed \char`\"{}forgot password\char`\"{} flow \end{description}
+\end{Desc}
+
+\begin{DoxyCode}
+1293 \{
+1294 \hyperlink{group__generic-sessions_gga7c2dc7bfb4ccb91c5d771f9e9ea237e1a81e63075115dedd150265d81b8f7fa57}{LWSGS\_AUTH\_LOGGED\_IN} = 1,
+1295 \hyperlink{group__generic-sessions_gga7c2dc7bfb4ccb91c5d771f9e9ea237e1a0657a9e846814781b128c397fe4b10bf}{LWSGS\_AUTH\_ADMIN} = 2,
+1296 \hyperlink{group__generic-sessions_gga7c2dc7bfb4ccb91c5d771f9e9ea237e1a5a607e4668d20cadada62c4b8007f887}{LWSGS\_AUTH\_VERIFIED} = 4,
+1297 \hyperlink{group__generic-sessions_gga7c2dc7bfb4ccb91c5d771f9e9ea237e1a2cd8fb86e3b85c106e7711c03f0ddd0a}{LWSGS\_AUTH\_FORGOT\_FLOW} = 8,
+1298 \};
+\end{DoxyCode}
--- /dev/null
+\hypertarget{group__html-chunked-substitution}{}\section{H\+T\+ML Chunked Substitution}
+\label{group__html-chunked-substitution}\index{H\+T\+M\+L Chunked Substitution@{H\+T\+M\+L Chunked Substitution}}
+\subsection*{Data Structures}
+\begin{DoxyCompactItemize}
+\item
+struct \hyperlink{structlws__process__html__args}{lws\+\_\+process\+\_\+html\+\_\+args}
+\item
+struct \hyperlink{structlws__process__html__state}{lws\+\_\+process\+\_\+html\+\_\+state}
+\end{DoxyCompactItemize}
+\subsection*{Typedefs}
+\begin{DoxyCompactItemize}
+\item
+typedef const char $\ast$($\ast$ {\bfseries lws\+\_\+process\+\_\+html\+\_\+state\+\_\+cb}) (void $\ast$data, int index)\hypertarget{group__html-chunked-substitution_ga669d3d7ce2d5f193473f649a89b3e7ac}{}\label{group__html-chunked-substitution_ga669d3d7ce2d5f193473f649a89b3e7ac}
+
+\end{DoxyCompactItemize}
+\subsection*{Enumerations}
+\begin{DoxyCompactItemize}
+\item
+enum {\bfseries http\+\_\+status} \{ \\*
+{\bfseries H\+T\+T\+P\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+OK} = 200,
+{\bfseries H\+T\+T\+P\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+N\+O\+\_\+\+C\+O\+N\+T\+E\+NT} = 204,
+{\bfseries H\+T\+T\+P\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+M\+O\+V\+E\+D\+\_\+\+P\+E\+R\+M\+A\+N\+E\+N\+T\+LY} = 301,
+{\bfseries H\+T\+T\+P\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+F\+O\+U\+ND} = 302,
+\\*
+{\bfseries H\+T\+T\+P\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+S\+E\+E\+\_\+\+O\+T\+H\+ER} = 303,
+{\bfseries H\+T\+T\+P\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+B\+A\+D\+\_\+\+R\+E\+Q\+U\+E\+ST} = 400,
+{\bfseries H\+T\+T\+P\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+U\+N\+A\+U\+T\+H\+O\+R\+I\+Z\+ED},
+{\bfseries H\+T\+T\+P\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+P\+A\+Y\+M\+E\+N\+T\+\_\+\+R\+E\+Q\+U\+I\+R\+ED},
+\\*
+{\bfseries H\+T\+T\+P\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+F\+O\+R\+B\+I\+D\+D\+EN},
+{\bfseries H\+T\+T\+P\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+N\+O\+T\+\_\+\+F\+O\+U\+ND},
+{\bfseries H\+T\+T\+P\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+M\+E\+T\+H\+O\+D\+\_\+\+N\+O\+T\+\_\+\+A\+L\+L\+O\+W\+ED},
+{\bfseries H\+T\+T\+P\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+N\+O\+T\+\_\+\+A\+C\+C\+E\+P\+T\+A\+B\+LE},
+\\*
+{\bfseries H\+T\+T\+P\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+P\+R\+O\+X\+Y\+\_\+\+A\+U\+T\+H\+\_\+\+R\+E\+Q\+U\+I\+R\+ED},
+{\bfseries H\+T\+T\+P\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+R\+E\+Q\+U\+E\+S\+T\+\_\+\+T\+I\+M\+E\+O\+UT},
+{\bfseries H\+T\+T\+P\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+C\+O\+N\+F\+L\+I\+CT},
+{\bfseries H\+T\+T\+P\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+G\+O\+NE},
+\\*
+{\bfseries H\+T\+T\+P\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+L\+E\+N\+G\+T\+H\+\_\+\+R\+E\+Q\+U\+I\+R\+ED},
+{\bfseries H\+T\+T\+P\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+P\+R\+E\+C\+O\+N\+D\+I\+T\+I\+O\+N\+\_\+\+F\+A\+I\+L\+ED},
+{\bfseries H\+T\+T\+P\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+R\+E\+Q\+\_\+\+E\+N\+T\+I\+T\+Y\+\_\+\+T\+O\+O\+\_\+\+L\+A\+R\+GE},
+{\bfseries H\+T\+T\+P\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+R\+E\+Q\+\_\+\+U\+R\+I\+\_\+\+T\+O\+O\+\_\+\+L\+O\+NG},
+\\*
+{\bfseries H\+T\+T\+P\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+U\+N\+S\+U\+P\+P\+O\+R\+T\+E\+D\+\_\+\+M\+E\+D\+I\+A\+\_\+\+T\+Y\+PE},
+{\bfseries H\+T\+T\+P\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+R\+E\+Q\+\_\+\+R\+A\+N\+G\+E\+\_\+\+N\+O\+T\+\_\+\+S\+A\+T\+I\+S\+F\+I\+A\+B\+LE},
+{\bfseries H\+T\+T\+P\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+E\+X\+P\+E\+C\+T\+A\+T\+I\+O\+N\+\_\+\+F\+A\+I\+L\+ED},
+{\bfseries H\+T\+T\+P\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+I\+N\+T\+E\+R\+N\+A\+L\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+E\+R\+R\+OR} = 500,
+\\*
+{\bfseries H\+T\+T\+P\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+N\+O\+T\+\_\+\+I\+M\+P\+L\+E\+M\+E\+N\+T\+ED},
+{\bfseries H\+T\+T\+P\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+B\+A\+D\+\_\+\+G\+A\+T\+E\+W\+AY},
+{\bfseries H\+T\+T\+P\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+S\+E\+R\+V\+I\+C\+E\+\_\+\+U\+N\+A\+V\+A\+I\+L\+A\+B\+LE},
+{\bfseries H\+T\+T\+P\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+G\+A\+T\+E\+W\+A\+Y\+\_\+\+T\+I\+M\+E\+O\+UT},
+\\*
+{\bfseries H\+T\+T\+P\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+H\+T\+T\+P\+\_\+\+V\+E\+R\+S\+I\+O\+N\+\_\+\+N\+O\+T\+\_\+\+S\+U\+P\+P\+O\+R\+T\+ED}
+ \}\hypertarget{group__html-chunked-substitution_gabc3b93f68c8bdd857ad32913628dfa8d}{}\label{group__html-chunked-substitution_gabc3b93f68c8bdd857ad32913628dfa8d}
+
+\end{DoxyCompactItemize}
+\subsection*{Functions}
+\begin{DoxyCompactItemize}
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int \hyperlink{group__html-chunked-substitution_ga643073f918c0a7016b690aae9793fd60}{lws\+\_\+chunked\+\_\+html\+\_\+process} (struct \hyperlink{structlws__process__html__args}{lws\+\_\+process\+\_\+html\+\_\+args} $\ast$args, struct \hyperlink{structlws__process__html__state}{lws\+\_\+process\+\_\+html\+\_\+state} $\ast$s)
+\end{DoxyCompactItemize}
+
+
+\subsection{Detailed Description}
+\subsubsection*{H\+T\+ML chunked Substitution}
+
+A\+P\+Is for receiving chunks of text, replacing a set of variable names via a callback, and then prepending and appending H\+T\+ML chunked encoding headers.
+
+\subsection{Function Documentation}
+\index{H\+T\+M\+L Chunked Substitution@{H\+T\+M\+L Chunked Substitution}!lws\+\_\+chunked\+\_\+html\+\_\+process@{lws\+\_\+chunked\+\_\+html\+\_\+process}}
+\index{lws\+\_\+chunked\+\_\+html\+\_\+process@{lws\+\_\+chunked\+\_\+html\+\_\+process}!H\+T\+M\+L Chunked Substitution@{H\+T\+M\+L Chunked Substitution}}
+\subsubsection[{\texorpdfstring{lws\+\_\+chunked\+\_\+html\+\_\+process(struct lws\+\_\+process\+\_\+html\+\_\+args $\ast$args, struct lws\+\_\+process\+\_\+html\+\_\+state $\ast$s)}{lws\_chunked\_html\_process(struct lws\_process\_html\_args *args, struct lws\_process\_html\_state *s)}}]{\setlength{\rightskip}{0pt plus 5cm}L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int lws\+\_\+chunked\+\_\+html\+\_\+process (
+\begin{DoxyParamCaption}
+\item[{struct {\bf lws\+\_\+process\+\_\+html\+\_\+args} $\ast$}]{args, }
+\item[{struct {\bf lws\+\_\+process\+\_\+html\+\_\+state} $\ast$}]{s}
+\end{DoxyParamCaption}
+)}\hypertarget{group__html-chunked-substitution_ga643073f918c0a7016b690aae9793fd60}{}\label{group__html-chunked-substitution_ga643073f918c0a7016b690aae9793fd60}
+
+
+{\ttfamily \#include $<$\hyperlink{libwebsockets_8h}{lib/libwebsockets.\+h}$>$}
+
+\hyperlink{group__html-chunked-substitution_ga643073f918c0a7016b690aae9793fd60}{lws\+\_\+chunked\+\_\+html\+\_\+process()} -\/ generic chunked substitution
+\begin{DoxyParams}{Parameters}
+{\em args} & buffer to process using chunked encoding \\
+\hline
+{\em s} & current processing state \\
+\hline
+\end{DoxyParams}
--- /dev/null
+\hypertarget{group__http}{}\section{H\+T\+TP}
+\label{group__http}\index{H\+T\+TP@{H\+T\+TP}}
+\subsection*{Modules}
+\begin{DoxyCompactItemize}
+\item
+\hyperlink{group__form-parsing}{Form Parsing}
+\item
+\hyperlink{group__html-chunked-substitution}{H\+T\+M\+L Chunked Substitution}
+\item
+\hyperlink{group__httpft}{H\+T\+T\+P File transfer}
+\item
+\hyperlink{group__HTTP-headers-create}{H\+T\+T\+P headers\+: create}
+\item
+\hyperlink{group__HTTP-headers-read}{H\+T\+T\+P headers\+: read}
+\item
+\hyperlink{group__urlendec}{Urlencode and Urldecode}
+\end{DoxyCompactItemize}
+\subsection*{Data Structures}
+\begin{DoxyCompactItemize}
+\item
+struct \hyperlink{structlws__tokens}{lws\+\_\+tokens}
+\end{DoxyCompactItemize}
+\subsection*{Functions}
+\begin{DoxyCompactItemize}
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int \hyperlink{group__http_gac8a4a71240857dc6b2ed70456b6923f4}{lws\+\_\+return\+\_\+http\+\_\+status} (struct lws $\ast$wsi, unsigned int code, const char $\ast$html\+\_\+body)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int L\+W\+S\+\_\+\+W\+A\+R\+N\+\_\+\+U\+N\+U\+S\+E\+D\+\_\+\+R\+E\+S\+U\+LT \hyperlink{group__http_ga8fbf01e473ac421fc33ad9f8da8b8a25}{lws\+\_\+http\+\_\+redirect} (struct lws $\ast$wsi, int code, const unsigned char $\ast$loc, int len, unsigned char $\ast$$\ast$p, unsigned char $\ast$end)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int L\+W\+S\+\_\+\+W\+A\+R\+N\+\_\+\+U\+N\+U\+S\+E\+D\+\_\+\+R\+E\+S\+U\+LT \hyperlink{group__http_gad27aed6c66a41b2b89ffe4da2a309e8a}{lws\+\_\+http\+\_\+transaction\+\_\+completed} (struct lws $\ast$wsi)
+\end{DoxyCompactItemize}
+
+
+\subsection{Detailed Description}
+Modules related to handling H\+T\+TP
+
+\subsection{Function Documentation}
+\index{H\+T\+TP@{H\+T\+TP}!lws\+\_\+http\+\_\+redirect@{lws\+\_\+http\+\_\+redirect}}
+\index{lws\+\_\+http\+\_\+redirect@{lws\+\_\+http\+\_\+redirect}!H\+T\+TP@{H\+T\+TP}}
+\subsubsection[{\texorpdfstring{lws\+\_\+http\+\_\+redirect(struct lws $\ast$wsi, int code, const unsigned char $\ast$loc, int len, unsigned char $\ast$$\ast$p, unsigned char $\ast$end)}{lws\_http\_redirect(struct lws *wsi, int code, const unsigned char *loc, int len, unsigned char **p, unsigned char *end)}}]{\setlength{\rightskip}{0pt plus 5cm}L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int L\+W\+S\+\_\+\+W\+A\+R\+N\+\_\+\+U\+N\+U\+S\+E\+D\+\_\+\+R\+E\+S\+U\+LT lws\+\_\+http\+\_\+redirect (
+\begin{DoxyParamCaption}
+\item[{struct lws $\ast$}]{wsi, }
+\item[{int}]{code, }
+\item[{const unsigned char $\ast$}]{loc, }
+\item[{int}]{len, }
+\item[{unsigned char $\ast$$\ast$}]{p, }
+\item[{unsigned char $\ast$}]{end}
+\end{DoxyParamCaption}
+)}\hypertarget{group__http_ga8fbf01e473ac421fc33ad9f8da8b8a25}{}\label{group__http_ga8fbf01e473ac421fc33ad9f8da8b8a25}
+
+
+{\ttfamily \#include $<$\hyperlink{libwebsockets_8h}{lib/libwebsockets.\+h}$>$}
+
+\hyperlink{group__http_ga8fbf01e473ac421fc33ad9f8da8b8a25}{lws\+\_\+http\+\_\+redirect()} -\/ write http redirect into buffer
+
+
+\begin{DoxyParams}{Parameters}
+{\em wsi} & websocket connection \\
+\hline
+{\em code} & H\+T\+TP response code (eg, 301) \\
+\hline
+{\em loc} & where to redirect to \\
+\hline
+{\em len} & length of loc \\
+\hline
+{\em p} & pointer current position in buffer (updated as we write) \\
+\hline
+{\em end} & pointer to end of buffer \\
+\hline
+\end{DoxyParams}
+\index{H\+T\+TP@{H\+T\+TP}!lws\+\_\+http\+\_\+transaction\+\_\+completed@{lws\+\_\+http\+\_\+transaction\+\_\+completed}}
+\index{lws\+\_\+http\+\_\+transaction\+\_\+completed@{lws\+\_\+http\+\_\+transaction\+\_\+completed}!H\+T\+TP@{H\+T\+TP}}
+\subsubsection[{\texorpdfstring{lws\+\_\+http\+\_\+transaction\+\_\+completed(struct lws $\ast$wsi)}{lws\_http\_transaction\_completed(struct lws *wsi)}}]{\setlength{\rightskip}{0pt plus 5cm}L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int L\+W\+S\+\_\+\+W\+A\+R\+N\+\_\+\+U\+N\+U\+S\+E\+D\+\_\+\+R\+E\+S\+U\+LT lws\+\_\+http\+\_\+transaction\+\_\+completed (
+\begin{DoxyParamCaption}
+\item[{struct lws $\ast$}]{wsi}
+\end{DoxyParamCaption}
+)}\hypertarget{group__http_gad27aed6c66a41b2b89ffe4da2a309e8a}{}\label{group__http_gad27aed6c66a41b2b89ffe4da2a309e8a}
+
+
+{\ttfamily \#include $<$\hyperlink{libwebsockets_8h}{lib/libwebsockets.\+h}$>$}
+
+\hyperlink{group__http_gad27aed6c66a41b2b89ffe4da2a309e8a}{lws\+\_\+http\+\_\+transaction\+\_\+completed()} -\/ wait for new http transaction or close
+\begin{DoxyParams}{Parameters}
+{\em wsi} & websocket connection \begin{DoxyVerb} Returns 1 if the HTTP connection must close now
+ Returns 0 and resets connection to wait for new HTTP header /
+ transaction if possible\end{DoxyVerb}
+ \\
+\hline
+\end{DoxyParams}
+\index{H\+T\+TP@{H\+T\+TP}!lws\+\_\+return\+\_\+http\+\_\+status@{lws\+\_\+return\+\_\+http\+\_\+status}}
+\index{lws\+\_\+return\+\_\+http\+\_\+status@{lws\+\_\+return\+\_\+http\+\_\+status}!H\+T\+TP@{H\+T\+TP}}
+\subsubsection[{\texorpdfstring{lws\+\_\+return\+\_\+http\+\_\+status(struct lws $\ast$wsi, unsigned int code, const char $\ast$html\+\_\+body)}{lws\_return\_http\_status(struct lws *wsi, unsigned int code, const char *html\_body)}}]{\setlength{\rightskip}{0pt plus 5cm}L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int lws\+\_\+return\+\_\+http\+\_\+status (
+\begin{DoxyParamCaption}
+\item[{struct lws $\ast$}]{wsi, }
+\item[{unsigned int}]{code, }
+\item[{const char $\ast$}]{html\+\_\+body}
+\end{DoxyParamCaption}
+)}\hypertarget{group__http_gac8a4a71240857dc6b2ed70456b6923f4}{}\label{group__http_gac8a4a71240857dc6b2ed70456b6923f4}
+
+
+{\ttfamily \#include $<$\hyperlink{libwebsockets_8h}{lib/libwebsockets.\+h}$>$}
+
+\hyperlink{group__http_gac8a4a71240857dc6b2ed70456b6923f4}{lws\+\_\+return\+\_\+http\+\_\+status()} -\/ Return simple http status
+\begin{DoxyParams}{Parameters}
+{\em wsi} & Websocket instance (available from user callback) \\
+\hline
+{\em code} & Status index, eg, 404 \\
+\hline
+{\em html\+\_\+body} & User-\/readable H\+T\+ML description $<$ 1\+KB, or N\+U\+LL \begin{DoxyVerb} Helper to report HTTP errors back to the client cleanly and
+ consistently\end{DoxyVerb}
+ \\
+\hline
+\end{DoxyParams}
--- /dev/null
+\hypertarget{group__httpft}{}\section{H\+T\+TP File transfer}
+\label{group__httpft}\index{H\+T\+T\+P File transfer@{H\+T\+T\+P File transfer}}
+\subsection*{Functions}
+\begin{DoxyCompactItemize}
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int \hyperlink{group__httpft_gab393a06d3d2722af4c3f8b06842c80d7}{lws\+\_\+serve\+\_\+http\+\_\+file} (struct lws $\ast$wsi, const char $\ast$file, const char $\ast$content\+\_\+type, const char $\ast$other\+\_\+headers, int other\+\_\+headers\+\_\+len)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int {\bfseries lws\+\_\+serve\+\_\+http\+\_\+file\+\_\+fragment} (struct lws $\ast$wsi)\hypertarget{group__httpft_ga29e1123f6d56cd777b3e5bf9ca40f9e5}{}\label{group__httpft_ga29e1123f6d56cd777b3e5bf9ca40f9e5}
+
+\end{DoxyCompactItemize}
+
+
+\subsection{Detailed Description}
+A\+P\+Is for sending local files in response to H\+T\+TP requests
+
+\subsection{Function Documentation}
+\index{H\+T\+T\+P File transfer@{H\+T\+T\+P File transfer}!lws\+\_\+serve\+\_\+http\+\_\+file@{lws\+\_\+serve\+\_\+http\+\_\+file}}
+\index{lws\+\_\+serve\+\_\+http\+\_\+file@{lws\+\_\+serve\+\_\+http\+\_\+file}!H\+T\+T\+P File transfer@{H\+T\+T\+P File transfer}}
+\subsubsection[{\texorpdfstring{lws\+\_\+serve\+\_\+http\+\_\+file(struct lws $\ast$wsi, const char $\ast$file, const char $\ast$content\+\_\+type, const char $\ast$other\+\_\+headers, int other\+\_\+headers\+\_\+len)}{lws\_serve\_http\_file(struct lws *wsi, const char *file, const char *content\_type, const char *other\_headers, int other\_headers\_len)}}]{\setlength{\rightskip}{0pt plus 5cm}L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int lws\+\_\+serve\+\_\+http\+\_\+file (
+\begin{DoxyParamCaption}
+\item[{struct lws $\ast$}]{wsi, }
+\item[{const char $\ast$}]{file, }
+\item[{const char $\ast$}]{content\+\_\+type, }
+\item[{const char $\ast$}]{other\+\_\+headers, }
+\item[{int}]{other\+\_\+headers\+\_\+len}
+\end{DoxyParamCaption}
+)}\hypertarget{group__httpft_gab393a06d3d2722af4c3f8b06842c80d7}{}\label{group__httpft_gab393a06d3d2722af4c3f8b06842c80d7}
+
+
+{\ttfamily \#include $<$\hyperlink{libwebsockets_8h}{lib/libwebsockets.\+h}$>$}
+
+\hyperlink{group__httpft_gab393a06d3d2722af4c3f8b06842c80d7}{lws\+\_\+serve\+\_\+http\+\_\+file()} -\/ Send a file back to the client using http
+\begin{DoxyParams}{Parameters}
+{\em wsi} & Websocket instance (available from user callback) \\
+\hline
+{\em file} & The file to issue over http \\
+\hline
+{\em content\+\_\+type} & The http content type, eg, text/html \\
+\hline
+{\em other\+\_\+headers} & N\+U\+LL or pointer to header string \\
+\hline
+{\em other\+\_\+headers\+\_\+len} & length of the other headers if non-\/\+N\+U\+LL \begin{DoxyVerb} This function is intended to be called from the callback in response
+ to http requests from the client. It allows the callback to issue
+ local files down the http link in a single step.
+
+ Returning <0 indicates error and the wsi should be closed. Returning
+ >0 indicates the file was completely sent and
+ lws_http_transaction_completed() called on the wsi (and close if != 0)
+ ==0 indicates the file transfer is started and needs more service later,
+ the wsi should be left alone.\end{DoxyVerb}
+ \\
+\hline
+\end{DoxyParams}
--- /dev/null
+\hypertarget{group__log}{}\section{Logging}
+\label{group__log}\index{Logging@{Logging}}
+\subsection*{Enumerations}
+\begin{DoxyCompactItemize}
+\item
+enum {\bfseries lws\+\_\+log\+\_\+levels} \{ \\*
+{\bfseries L\+L\+L\+\_\+\+E\+RR} = 1 $<$$<$ 0,
+{\bfseries L\+L\+L\+\_\+\+W\+A\+RN} = 1 $<$$<$ 1,
+{\bfseries L\+L\+L\+\_\+\+N\+O\+T\+I\+CE} = 1 $<$$<$ 2,
+{\bfseries L\+L\+L\+\_\+\+I\+N\+FO} = 1 $<$$<$ 3,
+\\*
+{\bfseries L\+L\+L\+\_\+\+D\+E\+B\+UG} = 1 $<$$<$ 4,
+{\bfseries L\+L\+L\+\_\+\+P\+A\+R\+S\+ER} = 1 $<$$<$ 5,
+{\bfseries L\+L\+L\+\_\+\+H\+E\+A\+D\+ER} = 1 $<$$<$ 6,
+{\bfseries L\+L\+L\+\_\+\+E\+XT} = 1 $<$$<$ 7,
+\\*
+{\bfseries L\+L\+L\+\_\+\+C\+L\+I\+E\+NT} = 1 $<$$<$ 8,
+{\bfseries L\+L\+L\+\_\+\+L\+A\+T\+E\+N\+CY} = 1 $<$$<$ 9,
+{\bfseries L\+L\+L\+\_\+\+C\+O\+U\+NT} = 10
+ \}\hypertarget{group__log_ga14542b84d2c76efa7814124bb10f9c5f}{}\label{group__log_ga14542b84d2c76efa7814124bb10f9c5f}
+
+\end{DoxyCompactItemize}
+\subsection*{Functions}
+\begin{DoxyCompactItemize}
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN void {\bfseries \+\_\+lws\+\_\+log} (int filter, const char $\ast$format,...)\hypertarget{group__log_gaf5f07837692b2f231a79da8a058288aa}{}\label{group__log_gaf5f07837692b2f231a79da8a058288aa}
+
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN void {\bfseries \+\_\+lws\+\_\+logv} (int filter, const char $\ast$format, va\+\_\+list vl)\hypertarget{group__log_ga74eb146969f0595e12ea835851b4588e}{}\label{group__log_ga74eb146969f0595e12ea835851b4588e}
+
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int \hyperlink{group__log_ga42e39775c6b69b7251bdbf5a2cdd5dcd}{lwsl\+\_\+timestamp} (int level, char $\ast$p, int len)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN void \hyperlink{group__log_ga898b1f03872ad019f507d4e35bbefa90}{lwsl\+\_\+hexdump} (void $\ast$buf, size\+\_\+t len)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN void \hyperlink{group__log_ga244647f9e1bf0097ccdde66d74f41e26}{lws\+\_\+set\+\_\+log\+\_\+level} (int level, void($\ast$log\+\_\+emit\+\_\+function)(int level, const char $\ast$line))
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN void \hyperlink{group__log_gab7c0fc936cc9f1eb58e2bb234c15147c}{lwsl\+\_\+emit\+\_\+syslog} (int level, const char $\ast$line)
+\end{DoxyCompactItemize}
+
+
+\subsection{Detailed Description}
+\subsubsection*{Logging}
+
+Lws provides flexible and filterable logging facilities, which can be used inside lws and in user code.
+
+Log categories may be individually filtered bitwise, and directed to built-\/in sinks for syslog-\/compatible logging, or a user-\/defined function.
+
+\subsection{Function Documentation}
+\index{Logging@{Logging}!lws\+\_\+set\+\_\+log\+\_\+level@{lws\+\_\+set\+\_\+log\+\_\+level}}
+\index{lws\+\_\+set\+\_\+log\+\_\+level@{lws\+\_\+set\+\_\+log\+\_\+level}!Logging@{Logging}}
+\subsubsection[{\texorpdfstring{lws\+\_\+set\+\_\+log\+\_\+level(int level, void($\ast$log\+\_\+emit\+\_\+function)(int level, const char $\ast$line))}{lws\_set\_log\_level(int level, void(*log\_emit\_function)(int level, const char *line))}}]{\setlength{\rightskip}{0pt plus 5cm}L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN void lws\+\_\+set\+\_\+log\+\_\+level (
+\begin{DoxyParamCaption}
+\item[{int}]{level, }
+\item[{void($\ast$)(int level, const char $\ast$line)}]{log\+\_\+emit\+\_\+function}
+\end{DoxyParamCaption}
+)}\hypertarget{group__log_ga244647f9e1bf0097ccdde66d74f41e26}{}\label{group__log_ga244647f9e1bf0097ccdde66d74f41e26}
+
+
+{\ttfamily \#include $<$\hyperlink{libwebsockets_8h}{lib/libwebsockets.\+h}$>$}
+
+\hyperlink{group__log_ga244647f9e1bf0097ccdde66d74f41e26}{lws\+\_\+set\+\_\+log\+\_\+level()} -\/ Set the logging bitfield
+\begin{DoxyParams}{Parameters}
+{\em level} & OR together the L\+L\+L\+\_\+ debug contexts you want output from \\
+\hline
+{\em log\+\_\+emit\+\_\+function} & N\+U\+LL to leave it as it is, or a user-\/supplied function to perform log string emission instead of the default stderr one.\\
+\hline
+\end{DoxyParams}
+log level defaults to \char`\"{}err\char`\"{}, \char`\"{}warn\char`\"{} and \char`\"{}notice\char`\"{} contexts enabled and emission on stderr. \index{Logging@{Logging}!lwsl\+\_\+emit\+\_\+syslog@{lwsl\+\_\+emit\+\_\+syslog}}
+\index{lwsl\+\_\+emit\+\_\+syslog@{lwsl\+\_\+emit\+\_\+syslog}!Logging@{Logging}}
+\subsubsection[{\texorpdfstring{lwsl\+\_\+emit\+\_\+syslog(int level, const char $\ast$line)}{lwsl\_emit\_syslog(int level, const char *line)}}]{\setlength{\rightskip}{0pt plus 5cm}L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN void lwsl\+\_\+emit\+\_\+syslog (
+\begin{DoxyParamCaption}
+\item[{int}]{level, }
+\item[{const char $\ast$}]{line}
+\end{DoxyParamCaption}
+)}\hypertarget{group__log_gab7c0fc936cc9f1eb58e2bb234c15147c}{}\label{group__log_gab7c0fc936cc9f1eb58e2bb234c15147c}
+
+
+{\ttfamily \#include $<$\hyperlink{libwebsockets_8h}{lib/libwebsockets.\+h}$>$}
+
+\hyperlink{group__log_gab7c0fc936cc9f1eb58e2bb234c15147c}{lwsl\+\_\+emit\+\_\+syslog()} -\/ helper log emit function writes to system log
+
+
+\begin{DoxyParams}{Parameters}
+{\em level} & one of L\+L\+L\+\_\+ log level indexes \\
+\hline
+{\em line} & log string\\
+\hline
+\end{DoxyParams}
+You use this by passing the function pointer to \hyperlink{group__log_ga244647f9e1bf0097ccdde66d74f41e26}{lws\+\_\+set\+\_\+log\+\_\+level()}, to set it as the log emit function, it is not called directly. \index{Logging@{Logging}!lwsl\+\_\+hexdump@{lwsl\+\_\+hexdump}}
+\index{lwsl\+\_\+hexdump@{lwsl\+\_\+hexdump}!Logging@{Logging}}
+\subsubsection[{\texorpdfstring{lwsl\+\_\+hexdump(void $\ast$buf, size\+\_\+t len)}{lwsl\_hexdump(void *buf, size\_t len)}}]{\setlength{\rightskip}{0pt plus 5cm}L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN void lwsl\+\_\+hexdump (
+\begin{DoxyParamCaption}
+\item[{void $\ast$}]{buf, }
+\item[{size\+\_\+t}]{len}
+\end{DoxyParamCaption}
+)}\hypertarget{group__log_ga898b1f03872ad019f507d4e35bbefa90}{}\label{group__log_ga898b1f03872ad019f507d4e35bbefa90}
+
+
+{\ttfamily \#include $<$\hyperlink{libwebsockets_8h}{lib/libwebsockets.\+h}$>$}
+
+\hyperlink{group__log_ga898b1f03872ad019f507d4e35bbefa90}{lwsl\+\_\+hexdump()} -\/ helper to hexdump a buffer (D\+E\+B\+UG builds only)
+
+
+\begin{DoxyParams}{Parameters}
+{\em buf} & buffer start to dump \\
+\hline
+{\em len} & length of buffer to dump \\
+\hline
+\end{DoxyParams}
+\index{Logging@{Logging}!lwsl\+\_\+timestamp@{lwsl\+\_\+timestamp}}
+\index{lwsl\+\_\+timestamp@{lwsl\+\_\+timestamp}!Logging@{Logging}}
+\subsubsection[{\texorpdfstring{lwsl\+\_\+timestamp(int level, char $\ast$p, int len)}{lwsl\_timestamp(int level, char *p, int len)}}]{\setlength{\rightskip}{0pt plus 5cm}L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int lwsl\+\_\+timestamp (
+\begin{DoxyParamCaption}
+\item[{int}]{level, }
+\item[{char $\ast$}]{p, }
+\item[{int}]{len}
+\end{DoxyParamCaption}
+)}\hypertarget{group__log_ga42e39775c6b69b7251bdbf5a2cdd5dcd}{}\label{group__log_ga42e39775c6b69b7251bdbf5a2cdd5dcd}
+
+
+{\ttfamily \#include $<$\hyperlink{libwebsockets_8h}{lib/libwebsockets.\+h}$>$}
+
+lwsl\+\_\+timestamp\+: generate logging timestamp string
+
+
+\begin{DoxyParams}{Parameters}
+{\em level} & logging level \\
+\hline
+{\em p} & char $\ast$ buffer to take timestamp \\
+\hline
+{\em len} & length of p\\
+\hline
+\end{DoxyParams}
+returns length written in p
\ No newline at end of file
--- /dev/null
+\hypertarget{group__misc}{}\section{Miscellaneous A\+P\+Is}
+\label{group__misc}\index{Miscellaneous A\+P\+Is@{Miscellaneous A\+P\+Is}}
+\subsection*{Functions}
+\begin{DoxyCompactItemize}
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int \hyperlink{group__misc_ga58f906c6be0ca80efd813f694569dd4a}{lws\+\_\+get\+\_\+random} (struct lws\+\_\+context $\ast$context, void $\ast$buf, int len)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int L\+W\+S\+\_\+\+W\+A\+R\+N\+\_\+\+U\+N\+U\+S\+E\+D\+\_\+\+R\+E\+S\+U\+LT \hyperlink{group__misc_gace5171b1dbbc03ec89a98f8afdb5c9af}{lws\+\_\+daemonize} (const char $\ast$\+\_\+lock\+\_\+path)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN const char $\ast$L\+W\+S\+\_\+\+W\+A\+R\+N\+\_\+\+U\+N\+U\+S\+E\+D\+\_\+\+R\+E\+S\+U\+LT \hyperlink{group__misc_gac6abfc0b2bd5b2f09281a4432bb2f5f0}{lws\+\_\+get\+\_\+library\+\_\+version} (void)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN void $\ast$ \hyperlink{group__misc_gaa194584fff9698f3b280658f770ccd0f}{lws\+\_\+wsi\+\_\+user} (struct lws $\ast$wsi)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int L\+W\+S\+\_\+\+W\+A\+R\+N\+\_\+\+U\+N\+U\+S\+E\+D\+\_\+\+R\+E\+S\+U\+LT \hyperlink{group__misc_ga1ec0d9faac5d3a5824d765c287c043aa}{lws\+\_\+parse\+\_\+uri} (char $\ast$p, const char $\ast$$\ast$prot, const char $\ast$$\ast$ads, int $\ast$port, const char $\ast$$\ast$path)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN unsigned long \hyperlink{group__misc_ga33bf2635033710b25f931b57ed663e1e}{lws\+\_\+now\+\_\+secs} (void)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN struct lws\+\_\+context $\ast$L\+W\+S\+\_\+\+W\+A\+R\+N\+\_\+\+U\+N\+U\+S\+E\+D\+\_\+\+R\+E\+S\+U\+LT \hyperlink{group__misc_ga0af4f7d2dd375aeedcfa7eb0e1101c4b}{lws\+\_\+get\+\_\+context} (const struct lws $\ast$wsi)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int L\+W\+S\+\_\+\+W\+A\+R\+N\+\_\+\+U\+N\+U\+S\+E\+D\+\_\+\+R\+E\+S\+U\+LT \hyperlink{group__misc_ga629f48268fd1856b54b11172991b97d9}{lws\+\_\+get\+\_\+count\+\_\+threads} (struct lws\+\_\+context $\ast$context)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN struct lws $\ast$L\+W\+S\+\_\+\+W\+A\+R\+N\+\_\+\+U\+N\+U\+S\+E\+D\+\_\+\+R\+E\+S\+U\+LT \hyperlink{group__misc_ga8930fe36a3f3eefe4a6a4fd499d8e899}{lws\+\_\+get\+\_\+parent} (const struct lws $\ast$wsi)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN struct lws $\ast$L\+W\+S\+\_\+\+W\+A\+R\+N\+\_\+\+U\+N\+U\+S\+E\+D\+\_\+\+R\+E\+S\+U\+LT \hyperlink{group__misc_gacae4d7b6a8d22e4c2d82ff8b12c1e234}{lws\+\_\+get\+\_\+child} (const struct lws $\ast$wsi)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int {\bfseries lws\+\_\+read} (struct lws $\ast$wsi, unsigned char $\ast$buf, size\+\_\+t len)\hypertarget{group__misc_ga0e705d498e8c8500649a26ba30a1e106}{}\label{group__misc_ga0e705d498e8c8500649a26ba30a1e106}
+
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN void \hyperlink{group__misc_gab321ed812f46f6dc7ef9e3ca6f00cf1b}{lws\+\_\+set\+\_\+allocator} (void $\ast$($\ast$realloc)(void $\ast$ptr, size\+\_\+t size))
+\end{DoxyCompactItemize}
+
+
+\subsection{Detailed Description}
+\subsubsection*{Miscellaneous A\+P\+Is}
+
+Various A\+P\+Is outside of other categories
+
+\subsection{Function Documentation}
+\index{Miscellaneous A\+P\+Is@{Miscellaneous A\+P\+Is}!lws\+\_\+daemonize@{lws\+\_\+daemonize}}
+\index{lws\+\_\+daemonize@{lws\+\_\+daemonize}!Miscellaneous A\+P\+Is@{Miscellaneous A\+P\+Is}}
+\subsubsection[{\texorpdfstring{lws\+\_\+daemonize(const char $\ast$\+\_\+lock\+\_\+path)}{lws\_daemonize(const char *\_lock\_path)}}]{\setlength{\rightskip}{0pt plus 5cm}L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int L\+W\+S\+\_\+\+W\+A\+R\+N\+\_\+\+U\+N\+U\+S\+E\+D\+\_\+\+R\+E\+S\+U\+LT lws\+\_\+daemonize (
+\begin{DoxyParamCaption}
+\item[{const char $\ast$}]{\+\_\+lock\+\_\+path}
+\end{DoxyParamCaption}
+)}\hypertarget{group__misc_gace5171b1dbbc03ec89a98f8afdb5c9af}{}\label{group__misc_gace5171b1dbbc03ec89a98f8afdb5c9af}
+
+
+{\ttfamily \#include $<$\hyperlink{libwebsockets_8h}{lib/libwebsockets.\+h}$>$}
+
+\hyperlink{group__misc_gace5171b1dbbc03ec89a98f8afdb5c9af}{lws\+\_\+daemonize()}\+: fill a buffer with platform random data
+
+
+\begin{DoxyParams}{Parameters}
+{\em \+\_\+lock\+\_\+path} & the filepath to write the lock file\\
+\hline
+\end{DoxyParams}
+Spawn lws as a background process, taking care of various things \index{Miscellaneous A\+P\+Is@{Miscellaneous A\+P\+Is}!lws\+\_\+get\+\_\+child@{lws\+\_\+get\+\_\+child}}
+\index{lws\+\_\+get\+\_\+child@{lws\+\_\+get\+\_\+child}!Miscellaneous A\+P\+Is@{Miscellaneous A\+P\+Is}}
+\subsubsection[{\texorpdfstring{lws\+\_\+get\+\_\+child(const struct lws $\ast$wsi)}{lws\_get\_child(const struct lws *wsi)}}]{\setlength{\rightskip}{0pt plus 5cm}L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN struct lws$\ast$ L\+W\+S\+\_\+\+W\+A\+R\+N\+\_\+\+U\+N\+U\+S\+E\+D\+\_\+\+R\+E\+S\+U\+LT lws\+\_\+get\+\_\+child (
+\begin{DoxyParamCaption}
+\item[{const struct lws $\ast$}]{wsi}
+\end{DoxyParamCaption}
+)}\hypertarget{group__misc_gacae4d7b6a8d22e4c2d82ff8b12c1e234}{}\label{group__misc_gacae4d7b6a8d22e4c2d82ff8b12c1e234}
+
+
+{\ttfamily \#include $<$\hyperlink{libwebsockets_8h}{lib/libwebsockets.\+h}$>$}
+
+\hyperlink{group__misc_gacae4d7b6a8d22e4c2d82ff8b12c1e234}{lws\+\_\+get\+\_\+child()} -\/ get child wsi or N\+U\+LL
+\begin{DoxyParams}{Parameters}
+{\em wsi} & lws connection\\
+\hline
+\end{DoxyParams}
+Allows you to find a related wsi from the parent wsi. \index{Miscellaneous A\+P\+Is@{Miscellaneous A\+P\+Is}!lws\+\_\+get\+\_\+context@{lws\+\_\+get\+\_\+context}}
+\index{lws\+\_\+get\+\_\+context@{lws\+\_\+get\+\_\+context}!Miscellaneous A\+P\+Is@{Miscellaneous A\+P\+Is}}
+\subsubsection[{\texorpdfstring{lws\+\_\+get\+\_\+context(const struct lws $\ast$wsi)}{lws\_get\_context(const struct lws *wsi)}}]{\setlength{\rightskip}{0pt plus 5cm}L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN struct lws\+\_\+context$\ast$ L\+W\+S\+\_\+\+W\+A\+R\+N\+\_\+\+U\+N\+U\+S\+E\+D\+\_\+\+R\+E\+S\+U\+LT lws\+\_\+get\+\_\+context (
+\begin{DoxyParamCaption}
+\item[{const struct lws $\ast$}]{wsi}
+\end{DoxyParamCaption}
+)}\hypertarget{group__misc_ga0af4f7d2dd375aeedcfa7eb0e1101c4b}{}\label{group__misc_ga0af4f7d2dd375aeedcfa7eb0e1101c4b}
+
+
+{\ttfamily \#include $<$\hyperlink{libwebsockets_8h}{lib/libwebsockets.\+h}$>$}
+
+lws\+\_\+get\+\_\+context -\/ Allow geting lws\+\_\+context from a Websocket connection instance
+
+With this function, users can access context in the callback function. Otherwise users may have to declare context as a global variable.
+
+
+\begin{DoxyParams}{Parameters}
+{\em wsi} & Websocket connection instance \\
+\hline
+\end{DoxyParams}
+\index{Miscellaneous A\+P\+Is@{Miscellaneous A\+P\+Is}!lws\+\_\+get\+\_\+count\+\_\+threads@{lws\+\_\+get\+\_\+count\+\_\+threads}}
+\index{lws\+\_\+get\+\_\+count\+\_\+threads@{lws\+\_\+get\+\_\+count\+\_\+threads}!Miscellaneous A\+P\+Is@{Miscellaneous A\+P\+Is}}
+\subsubsection[{\texorpdfstring{lws\+\_\+get\+\_\+count\+\_\+threads(struct lws\+\_\+context $\ast$context)}{lws\_get\_count\_threads(struct lws\_context *context)}}]{\setlength{\rightskip}{0pt plus 5cm}L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int L\+W\+S\+\_\+\+W\+A\+R\+N\+\_\+\+U\+N\+U\+S\+E\+D\+\_\+\+R\+E\+S\+U\+LT lws\+\_\+get\+\_\+count\+\_\+threads (
+\begin{DoxyParamCaption}
+\item[{struct lws\+\_\+context $\ast$}]{context}
+\end{DoxyParamCaption}
+)}\hypertarget{group__misc_ga629f48268fd1856b54b11172991b97d9}{}\label{group__misc_ga629f48268fd1856b54b11172991b97d9}
+
+
+{\ttfamily \#include $<$\hyperlink{libwebsockets_8h}{lib/libwebsockets.\+h}$>$}
+
+\hyperlink{group__misc_ga629f48268fd1856b54b11172991b97d9}{lws\+\_\+get\+\_\+count\+\_\+threads()}\+: how many service threads the context uses
+
+
+\begin{DoxyParams}{Parameters}
+{\em context} & the lws context\\
+\hline
+\end{DoxyParams}
+By default this is always 1, if you asked for more than lws can handle it will clip the number of threads. So you can use this to find out how many threads are actually in use. \index{Miscellaneous A\+P\+Is@{Miscellaneous A\+P\+Is}!lws\+\_\+get\+\_\+library\+\_\+version@{lws\+\_\+get\+\_\+library\+\_\+version}}
+\index{lws\+\_\+get\+\_\+library\+\_\+version@{lws\+\_\+get\+\_\+library\+\_\+version}!Miscellaneous A\+P\+Is@{Miscellaneous A\+P\+Is}}
+\subsubsection[{\texorpdfstring{lws\+\_\+get\+\_\+library\+\_\+version(void)}{lws\_get\_library\_version(void)}}]{\setlength{\rightskip}{0pt plus 5cm}L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN const char$\ast$ L\+W\+S\+\_\+\+W\+A\+R\+N\+\_\+\+U\+N\+U\+S\+E\+D\+\_\+\+R\+E\+S\+U\+LT lws\+\_\+get\+\_\+library\+\_\+version (
+\begin{DoxyParamCaption}
+\item[{void}]{}
+\end{DoxyParamCaption}
+)}\hypertarget{group__misc_gac6abfc0b2bd5b2f09281a4432bb2f5f0}{}\label{group__misc_gac6abfc0b2bd5b2f09281a4432bb2f5f0}
+
+
+{\ttfamily \#include $<$\hyperlink{libwebsockets_8h}{lib/libwebsockets.\+h}$>$}
+
+\hyperlink{group__misc_gac6abfc0b2bd5b2f09281a4432bb2f5f0}{lws\+\_\+get\+\_\+library\+\_\+version()}\+: return string describing the version of lws
+
+On unix, also includes the git describe \index{Miscellaneous A\+P\+Is@{Miscellaneous A\+P\+Is}!lws\+\_\+get\+\_\+parent@{lws\+\_\+get\+\_\+parent}}
+\index{lws\+\_\+get\+\_\+parent@{lws\+\_\+get\+\_\+parent}!Miscellaneous A\+P\+Is@{Miscellaneous A\+P\+Is}}
+\subsubsection[{\texorpdfstring{lws\+\_\+get\+\_\+parent(const struct lws $\ast$wsi)}{lws\_get\_parent(const struct lws *wsi)}}]{\setlength{\rightskip}{0pt plus 5cm}L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN struct lws$\ast$ L\+W\+S\+\_\+\+W\+A\+R\+N\+\_\+\+U\+N\+U\+S\+E\+D\+\_\+\+R\+E\+S\+U\+LT lws\+\_\+get\+\_\+parent (
+\begin{DoxyParamCaption}
+\item[{const struct lws $\ast$}]{wsi}
+\end{DoxyParamCaption}
+)}\hypertarget{group__misc_ga8930fe36a3f3eefe4a6a4fd499d8e899}{}\label{group__misc_ga8930fe36a3f3eefe4a6a4fd499d8e899}
+
+
+{\ttfamily \#include $<$\hyperlink{libwebsockets_8h}{lib/libwebsockets.\+h}$>$}
+
+\hyperlink{group__misc_ga8930fe36a3f3eefe4a6a4fd499d8e899}{lws\+\_\+get\+\_\+parent()} -\/ get parent wsi or N\+U\+LL
+\begin{DoxyParams}{Parameters}
+{\em wsi} & lws connection\\
+\hline
+\end{DoxyParams}
+Specialized wsi like cgi stdin/out/err are associated to a parent wsi, this allows you to get their parent. \index{Miscellaneous A\+P\+Is@{Miscellaneous A\+P\+Is}!lws\+\_\+get\+\_\+random@{lws\+\_\+get\+\_\+random}}
+\index{lws\+\_\+get\+\_\+random@{lws\+\_\+get\+\_\+random}!Miscellaneous A\+P\+Is@{Miscellaneous A\+P\+Is}}
+\subsubsection[{\texorpdfstring{lws\+\_\+get\+\_\+random(struct lws\+\_\+context $\ast$context, void $\ast$buf, int len)}{lws\_get\_random(struct lws\_context *context, void *buf, int len)}}]{\setlength{\rightskip}{0pt plus 5cm}L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int lws\+\_\+get\+\_\+random (
+\begin{DoxyParamCaption}
+\item[{struct lws\+\_\+context $\ast$}]{context, }
+\item[{void $\ast$}]{buf, }
+\item[{int}]{len}
+\end{DoxyParamCaption}
+)}\hypertarget{group__misc_ga58f906c6be0ca80efd813f694569dd4a}{}\label{group__misc_ga58f906c6be0ca80efd813f694569dd4a}
+
+
+{\ttfamily \#include $<$\hyperlink{libwebsockets_8h}{lib/libwebsockets.\+h}$>$}
+
+\hyperlink{group__misc_ga58f906c6be0ca80efd813f694569dd4a}{lws\+\_\+get\+\_\+random()}\+: fill a buffer with platform random data
+
+
+\begin{DoxyParams}{Parameters}
+{\em context} & the lws context \\
+\hline
+{\em buf} & buffer to fill \\
+\hline
+{\em len} & how much to fill\\
+\hline
+\end{DoxyParams}
+This is intended to be called from the L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+R\+E\+C\+E\+I\+VE callback if it\textquotesingle{}s interested to see if the frame it\textquotesingle{}s dealing with was sent in binary mode. \index{Miscellaneous A\+P\+Is@{Miscellaneous A\+P\+Is}!lws\+\_\+now\+\_\+secs@{lws\+\_\+now\+\_\+secs}}
+\index{lws\+\_\+now\+\_\+secs@{lws\+\_\+now\+\_\+secs}!Miscellaneous A\+P\+Is@{Miscellaneous A\+P\+Is}}
+\subsubsection[{\texorpdfstring{lws\+\_\+now\+\_\+secs(void)}{lws\_now\_secs(void)}}]{\setlength{\rightskip}{0pt plus 5cm}L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN unsigned long lws\+\_\+now\+\_\+secs (
+\begin{DoxyParamCaption}
+\item[{void}]{}
+\end{DoxyParamCaption}
+)}\hypertarget{group__misc_ga33bf2635033710b25f931b57ed663e1e}{}\label{group__misc_ga33bf2635033710b25f931b57ed663e1e}
+
+
+{\ttfamily \#include $<$\hyperlink{libwebsockets_8h}{lib/libwebsockets.\+h}$>$}
+
+\hyperlink{group__misc_ga33bf2635033710b25f931b57ed663e1e}{lws\+\_\+now\+\_\+secs()}\+: return seconds since 1970-\/1-\/1 \index{Miscellaneous A\+P\+Is@{Miscellaneous A\+P\+Is}!lws\+\_\+parse\+\_\+uri@{lws\+\_\+parse\+\_\+uri}}
+\index{lws\+\_\+parse\+\_\+uri@{lws\+\_\+parse\+\_\+uri}!Miscellaneous A\+P\+Is@{Miscellaneous A\+P\+Is}}
+\subsubsection[{\texorpdfstring{lws\+\_\+parse\+\_\+uri(char $\ast$p, const char $\ast$$\ast$prot, const char $\ast$$\ast$ads, int $\ast$port, const char $\ast$$\ast$path)}{lws\_parse\_uri(char *p, const char **prot, const char **ads, int *port, const char **path)}}]{\setlength{\rightskip}{0pt plus 5cm}L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int L\+W\+S\+\_\+\+W\+A\+R\+N\+\_\+\+U\+N\+U\+S\+E\+D\+\_\+\+R\+E\+S\+U\+LT lws\+\_\+parse\+\_\+uri (
+\begin{DoxyParamCaption}
+\item[{char $\ast$}]{p, }
+\item[{const char $\ast$$\ast$}]{prot, }
+\item[{const char $\ast$$\ast$}]{ads, }
+\item[{int $\ast$}]{port, }
+\item[{const char $\ast$$\ast$}]{path}
+\end{DoxyParamCaption}
+)}\hypertarget{group__misc_ga1ec0d9faac5d3a5824d765c287c043aa}{}\label{group__misc_ga1ec0d9faac5d3a5824d765c287c043aa}
+
+
+{\ttfamily \#include $<$\hyperlink{libwebsockets_8h}{lib/libwebsockets.\+h}$>$}
+
+lws\+\_\+parse\+\_\+uri\+: cut up prot\+:/ads\+:port/path into pieces Notice it does so by dropping \textquotesingle{}\textbackslash{}0\textquotesingle{} into input string and the leading / on the path is consequently lost
+
+
+\begin{DoxyParams}{Parameters}
+{\em p} & incoming uri string.. will get written to \\
+\hline
+{\em prot} & result pointer for protocol part (\href{https://}{\tt https\+://}) \\
+\hline
+{\em ads} & result pointer for address part \\
+\hline
+{\em port} & result pointer for port part \\
+\hline
+{\em path} & result pointer for path part \\
+\hline
+\end{DoxyParams}
+\index{Miscellaneous A\+P\+Is@{Miscellaneous A\+P\+Is}!lws\+\_\+set\+\_\+allocator@{lws\+\_\+set\+\_\+allocator}}
+\index{lws\+\_\+set\+\_\+allocator@{lws\+\_\+set\+\_\+allocator}!Miscellaneous A\+P\+Is@{Miscellaneous A\+P\+Is}}
+\subsubsection[{\texorpdfstring{lws\+\_\+set\+\_\+allocator(void $\ast$($\ast$realloc)(void $\ast$ptr, size\+\_\+t size))}{lws\_set\_allocator(void *(*realloc)(void *ptr, size\_t size))}}]{\setlength{\rightskip}{0pt plus 5cm}L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN void lws\+\_\+set\+\_\+allocator (
+\begin{DoxyParamCaption}
+\item[{void $\ast$($\ast$)(void $\ast$ptr, size\+\_\+t size)}]{realloc}
+\end{DoxyParamCaption}
+)}\hypertarget{group__misc_gab321ed812f46f6dc7ef9e3ca6f00cf1b}{}\label{group__misc_gab321ed812f46f6dc7ef9e3ca6f00cf1b}
+
+
+{\ttfamily \#include $<$\hyperlink{libwebsockets_8h}{lib/libwebsockets.\+h}$>$}
+
+\hyperlink{group__misc_gab321ed812f46f6dc7ef9e3ca6f00cf1b}{lws\+\_\+set\+\_\+allocator()} -\/ custom allocator support
+
+
+\begin{DoxyParams}{Parameters}
+{\em realloc} & Allows you to replace the allocator (and deallocator) used by lws \\
+\hline
+\end{DoxyParams}
+\index{Miscellaneous A\+P\+Is@{Miscellaneous A\+P\+Is}!lws\+\_\+wsi\+\_\+user@{lws\+\_\+wsi\+\_\+user}}
+\index{lws\+\_\+wsi\+\_\+user@{lws\+\_\+wsi\+\_\+user}!Miscellaneous A\+P\+Is@{Miscellaneous A\+P\+Is}}
+\subsubsection[{\texorpdfstring{lws\+\_\+wsi\+\_\+user(struct lws $\ast$wsi)}{lws\_wsi\_user(struct lws *wsi)}}]{\setlength{\rightskip}{0pt plus 5cm}L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN void$\ast$ lws\+\_\+wsi\+\_\+user (
+\begin{DoxyParamCaption}
+\item[{struct lws $\ast$}]{wsi}
+\end{DoxyParamCaption}
+)}\hypertarget{group__misc_gaa194584fff9698f3b280658f770ccd0f}{}\label{group__misc_gaa194584fff9698f3b280658f770ccd0f}
+
+
+{\ttfamily \#include $<$\hyperlink{libwebsockets_8h}{lib/libwebsockets.\+h}$>$}
+
+\hyperlink{group__misc_gaa194584fff9698f3b280658f770ccd0f}{lws\+\_\+wsi\+\_\+user()} -\/ get the user data associated with the connection
+\begin{DoxyParams}{Parameters}
+{\em wsi} & lws connection\\
+\hline
+\end{DoxyParams}
+Not normally needed since it\textquotesingle{}s passed into the callback
\ No newline at end of file
--- /dev/null
+\hypertarget{group__net}{}\section{Network related helper A\+P\+Is}
+\label{group__net}\index{Network related helper A\+P\+Is@{Network related helper A\+P\+Is}}
+\subsection*{Functions}
+\begin{DoxyCompactItemize}
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN const char $\ast$L\+W\+S\+\_\+\+W\+A\+R\+N\+\_\+\+U\+N\+U\+S\+E\+D\+\_\+\+R\+E\+S\+U\+LT \hyperlink{group__net_gad0df22db2be9fc65a667a1e83f9a92a4}{lws\+\_\+canonical\+\_\+hostname} (struct lws\+\_\+context $\ast$context)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN void \hyperlink{group__net_ga092e5f473b3347f03ffeef8a950080f3}{lws\+\_\+get\+\_\+peer\+\_\+addresses} (struct lws $\ast$wsi, lws\+\_\+sockfd\+\_\+type fd, char $\ast$name, int name\+\_\+len, char $\ast$rip, int rip\+\_\+len)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN const char $\ast$ \hyperlink{group__net_gad01014fed09759741b6d23afccfdaacc}{lws\+\_\+get\+\_\+peer\+\_\+simple} (struct lws $\ast$wsi, char $\ast$name, int namelen)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int \hyperlink{group__net_ga869d8bdffb0f2a7ce08e3ce10d6be3d8}{lws\+\_\+interface\+\_\+to\+\_\+sa} (int ipv6, const char $\ast$ifname, struct sockaddr\+\_\+in $\ast$addr, size\+\_\+t addrlen)
+\end{DoxyCompactItemize}
+
+
+\subsection{Detailed Description}
+\subsubsection*{Network related helper A\+P\+Is}
+
+These wrap miscellaneous useful network-\/related functions
+
+\subsection{Function Documentation}
+\index{Network related helper A\+P\+Is@{Network related helper A\+P\+Is}!lws\+\_\+canonical\+\_\+hostname@{lws\+\_\+canonical\+\_\+hostname}}
+\index{lws\+\_\+canonical\+\_\+hostname@{lws\+\_\+canonical\+\_\+hostname}!Network related helper A\+P\+Is@{Network related helper A\+P\+Is}}
+\subsubsection[{\texorpdfstring{lws\+\_\+canonical\+\_\+hostname(struct lws\+\_\+context $\ast$context)}{lws\_canonical\_hostname(struct lws\_context *context)}}]{\setlength{\rightskip}{0pt plus 5cm}L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN const char$\ast$ L\+W\+S\+\_\+\+W\+A\+R\+N\+\_\+\+U\+N\+U\+S\+E\+D\+\_\+\+R\+E\+S\+U\+LT lws\+\_\+canonical\+\_\+hostname (
+\begin{DoxyParamCaption}
+\item[{struct lws\+\_\+context $\ast$}]{context}
+\end{DoxyParamCaption}
+)}\hypertarget{group__net_gad0df22db2be9fc65a667a1e83f9a92a4}{}\label{group__net_gad0df22db2be9fc65a667a1e83f9a92a4}
+
+
+{\ttfamily \#include $<$\hyperlink{libwebsockets_8h}{lib/libwebsockets.\+h}$>$}
+
+\hyperlink{group__net_gad0df22db2be9fc65a667a1e83f9a92a4}{lws\+\_\+canonical\+\_\+hostname()} -\/ returns this host\textquotesingle{}s hostname
+
+This is typically used by client code to fill in the host parameter when making a client connection. You can only call it after the context has been created.
+
+
+\begin{DoxyParams}{Parameters}
+{\em context} & Websocket context \\
+\hline
+\end{DoxyParams}
+\index{Network related helper A\+P\+Is@{Network related helper A\+P\+Is}!lws\+\_\+get\+\_\+peer\+\_\+addresses@{lws\+\_\+get\+\_\+peer\+\_\+addresses}}
+\index{lws\+\_\+get\+\_\+peer\+\_\+addresses@{lws\+\_\+get\+\_\+peer\+\_\+addresses}!Network related helper A\+P\+Is@{Network related helper A\+P\+Is}}
+\subsubsection[{\texorpdfstring{lws\+\_\+get\+\_\+peer\+\_\+addresses(struct lws $\ast$wsi, lws\+\_\+sockfd\+\_\+type fd, char $\ast$name, int name\+\_\+len, char $\ast$rip, int rip\+\_\+len)}{lws\_get\_peer\_addresses(struct lws *wsi, lws\_sockfd\_type fd, char *name, int name\_len, char *rip, int rip\_len)}}]{\setlength{\rightskip}{0pt plus 5cm}L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN void lws\+\_\+get\+\_\+peer\+\_\+addresses (
+\begin{DoxyParamCaption}
+\item[{struct lws $\ast$}]{wsi, }
+\item[{lws\+\_\+sockfd\+\_\+type}]{fd, }
+\item[{char $\ast$}]{name, }
+\item[{int}]{name\+\_\+len, }
+\item[{char $\ast$}]{rip, }
+\item[{int}]{rip\+\_\+len}
+\end{DoxyParamCaption}
+)}\hypertarget{group__net_ga092e5f473b3347f03ffeef8a950080f3}{}\label{group__net_ga092e5f473b3347f03ffeef8a950080f3}
+
+
+{\ttfamily \#include $<$\hyperlink{libwebsockets_8h}{lib/libwebsockets.\+h}$>$}
+
+\hyperlink{group__net_ga092e5f473b3347f03ffeef8a950080f3}{lws\+\_\+get\+\_\+peer\+\_\+addresses()} -\/ Get client address information
+\begin{DoxyParams}{Parameters}
+{\em wsi} & Local struct lws associated with \\
+\hline
+{\em fd} & Connection socket descriptor \\
+\hline
+{\em name} & Buffer to take client address name \\
+\hline
+{\em name\+\_\+len} & Length of client address name buffer \\
+\hline
+{\em rip} & Buffer to take client address IP dotted quad \\
+\hline
+{\em rip\+\_\+len} & Length of client address IP buffer \begin{DoxyVerb} This function fills in name and rip with the name and IP of
+ the client connected with socket descriptor fd. Names may be
+ truncated if there is not enough room. If either cannot be
+ determined, they will be returned as valid zero-length strings.\end{DoxyVerb}
+ \\
+\hline
+\end{DoxyParams}
+\index{Network related helper A\+P\+Is@{Network related helper A\+P\+Is}!lws\+\_\+get\+\_\+peer\+\_\+simple@{lws\+\_\+get\+\_\+peer\+\_\+simple}}
+\index{lws\+\_\+get\+\_\+peer\+\_\+simple@{lws\+\_\+get\+\_\+peer\+\_\+simple}!Network related helper A\+P\+Is@{Network related helper A\+P\+Is}}
+\subsubsection[{\texorpdfstring{lws\+\_\+get\+\_\+peer\+\_\+simple(struct lws $\ast$wsi, char $\ast$name, int namelen)}{lws\_get\_peer\_simple(struct lws *wsi, char *name, int namelen)}}]{\setlength{\rightskip}{0pt plus 5cm}L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN const char$\ast$ lws\+\_\+get\+\_\+peer\+\_\+simple (
+\begin{DoxyParamCaption}
+\item[{struct lws $\ast$}]{wsi, }
+\item[{char $\ast$}]{name, }
+\item[{int}]{namelen}
+\end{DoxyParamCaption}
+)}\hypertarget{group__net_gad01014fed09759741b6d23afccfdaacc}{}\label{group__net_gad01014fed09759741b6d23afccfdaacc}
+
+
+{\ttfamily \#include $<$\hyperlink{libwebsockets_8h}{lib/libwebsockets.\+h}$>$}
+
+\hyperlink{group__net_gad01014fed09759741b6d23afccfdaacc}{lws\+\_\+get\+\_\+peer\+\_\+simple()} -\/ Get client address information without R\+D\+NS
+
+
+\begin{DoxyParams}{Parameters}
+{\em wsi} & Local struct lws associated with \\
+\hline
+{\em name} & Buffer to take client address name \\
+\hline
+{\em namelen} & Length of client address name buffer\\
+\hline
+\end{DoxyParams}
+This provides a 123.\+123.\+123.\+123 type IP address in name from the peer that has connected to wsi \index{Network related helper A\+P\+Is@{Network related helper A\+P\+Is}!lws\+\_\+interface\+\_\+to\+\_\+sa@{lws\+\_\+interface\+\_\+to\+\_\+sa}}
+\index{lws\+\_\+interface\+\_\+to\+\_\+sa@{lws\+\_\+interface\+\_\+to\+\_\+sa}!Network related helper A\+P\+Is@{Network related helper A\+P\+Is}}
+\subsubsection[{\texorpdfstring{lws\+\_\+interface\+\_\+to\+\_\+sa(int ipv6, const char $\ast$ifname, struct sockaddr\+\_\+in $\ast$addr, size\+\_\+t addrlen)}{lws\_interface\_to\_sa(int ipv6, const char *ifname, struct sockaddr\_in *addr, size\_t addrlen)}}]{\setlength{\rightskip}{0pt plus 5cm}L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int lws\+\_\+interface\+\_\+to\+\_\+sa (
+\begin{DoxyParamCaption}
+\item[{int}]{ipv6, }
+\item[{const char $\ast$}]{ifname, }
+\item[{struct sockaddr\+\_\+in $\ast$}]{addr, }
+\item[{size\+\_\+t}]{addrlen}
+\end{DoxyParamCaption}
+)}\hypertarget{group__net_ga869d8bdffb0f2a7ce08e3ce10d6be3d8}{}\label{group__net_ga869d8bdffb0f2a7ce08e3ce10d6be3d8}
+
+
+{\ttfamily \#include $<$\hyperlink{libwebsockets_8h}{lib/libwebsockets.\+h}$>$}
+
+\hyperlink{group__net_ga869d8bdffb0f2a7ce08e3ce10d6be3d8}{lws\+\_\+interface\+\_\+to\+\_\+sa()} -\/ Convert interface name or IP to sockaddr struct
+
+
+\begin{DoxyParams}{Parameters}
+{\em ipv6} & Allow I\+P\+V6 addresses \\
+\hline
+{\em ifname} & Interface name or IP \\
+\hline
+{\em addr} & struct sockaddr\+\_\+in $\ast$ to be written \\
+\hline
+{\em addrlen} & Length of addr\\
+\hline
+\end{DoxyParams}
+This converts a textual network interface name to a sockaddr usable by other network functions
\ No newline at end of file
--- /dev/null
+\hypertarget{group__pur}{}\section{Sanitize / purify S\+QL and J\+S\+ON helpers}
+\label{group__pur}\index{Sanitize / purify S\+Q\+L and J\+S\+O\+N helpers@{Sanitize / purify S\+Q\+L and J\+S\+O\+N helpers}}
+\subsection*{Functions}
+\begin{DoxyCompactItemize}
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN const char $\ast$ \hyperlink{group__pur_ga9cc82f06e5ae7e71458626d7a39a5865}{lws\+\_\+sql\+\_\+purify} (char $\ast$escaped, const char $\ast$string, int len)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN const char $\ast$ \hyperlink{group__pur_gab15187efcfa256b7c928562c182b92a3}{lws\+\_\+json\+\_\+purify} (char $\ast$escaped, const char $\ast$string, int len)
+\end{DoxyCompactItemize}
+
+
+\subsection{Detailed Description}
+\subsubsection*{Sanitize / purify S\+QL and J\+S\+ON helpers}
+
+A\+P\+Is for escaping untrusted J\+S\+ON and S\+QL safely before use
+
+\subsection{Function Documentation}
+\index{Sanitize / purify S\+Q\+L and J\+S\+O\+N helpers@{Sanitize / purify S\+Q\+L and J\+S\+O\+N helpers}!lws\+\_\+json\+\_\+purify@{lws\+\_\+json\+\_\+purify}}
+\index{lws\+\_\+json\+\_\+purify@{lws\+\_\+json\+\_\+purify}!Sanitize / purify S\+Q\+L and J\+S\+O\+N helpers@{Sanitize / purify S\+Q\+L and J\+S\+O\+N helpers}}
+\subsubsection[{\texorpdfstring{lws\+\_\+json\+\_\+purify(char $\ast$escaped, const char $\ast$string, int len)}{lws\_json\_purify(char *escaped, const char *string, int len)}}]{\setlength{\rightskip}{0pt plus 5cm}L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN const char$\ast$ lws\+\_\+json\+\_\+purify (
+\begin{DoxyParamCaption}
+\item[{char $\ast$}]{escaped, }
+\item[{const char $\ast$}]{string, }
+\item[{int}]{len}
+\end{DoxyParamCaption}
+)}\hypertarget{group__pur_gab15187efcfa256b7c928562c182b92a3}{}\label{group__pur_gab15187efcfa256b7c928562c182b92a3}
+
+
+{\ttfamily \#include $<$\hyperlink{libwebsockets_8h}{lib/libwebsockets.\+h}$>$}
+
+\hyperlink{group__pur_gab15187efcfa256b7c928562c182b92a3}{lws\+\_\+json\+\_\+purify()} -\/ like strncpy but with escaping for json chars
+
+
+\begin{DoxyParams}{Parameters}
+{\em escaped} & output buffer \\
+\hline
+{\em string} & input buffer (\textquotesingle{}/0\textquotesingle{} terminated) \\
+\hline
+{\em len} & output buffer max length\\
+\hline
+\end{DoxyParams}
+Because escaping expands the output string, it\textquotesingle{}s not possible to do it in-\/place, ie, with escaped == string \index{Sanitize / purify S\+Q\+L and J\+S\+O\+N helpers@{Sanitize / purify S\+Q\+L and J\+S\+O\+N helpers}!lws\+\_\+sql\+\_\+purify@{lws\+\_\+sql\+\_\+purify}}
+\index{lws\+\_\+sql\+\_\+purify@{lws\+\_\+sql\+\_\+purify}!Sanitize / purify S\+Q\+L and J\+S\+O\+N helpers@{Sanitize / purify S\+Q\+L and J\+S\+O\+N helpers}}
+\subsubsection[{\texorpdfstring{lws\+\_\+sql\+\_\+purify(char $\ast$escaped, const char $\ast$string, int len)}{lws\_sql\_purify(char *escaped, const char *string, int len)}}]{\setlength{\rightskip}{0pt plus 5cm}L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN const char$\ast$ lws\+\_\+sql\+\_\+purify (
+\begin{DoxyParamCaption}
+\item[{char $\ast$}]{escaped, }
+\item[{const char $\ast$}]{string, }
+\item[{int}]{len}
+\end{DoxyParamCaption}
+)}\hypertarget{group__pur_ga9cc82f06e5ae7e71458626d7a39a5865}{}\label{group__pur_ga9cc82f06e5ae7e71458626d7a39a5865}
+
+
+{\ttfamily \#include $<$\hyperlink{libwebsockets_8h}{lib/libwebsockets.\+h}$>$}
+
+\hyperlink{group__pur_ga9cc82f06e5ae7e71458626d7a39a5865}{lws\+\_\+sql\+\_\+purify()} -\/ like strncpy but with escaping for sql quotes
+
+
+\begin{DoxyParams}{Parameters}
+{\em escaped} & output buffer \\
+\hline
+{\em string} & input buffer (\textquotesingle{}/0\textquotesingle{} terminated) \\
+\hline
+{\em len} & output buffer max length\\
+\hline
+\end{DoxyParams}
+Because escaping expands the output string, it\textquotesingle{}s not possible to do it in-\/place, ie, with escaped == string
\ No newline at end of file
--- /dev/null
+\hypertarget{group__sending-data}{}\section{Sending data}
+\label{group__sending-data}\index{Sending data@{Sending data}}
+\subsection*{Enumerations}
+\begin{DoxyCompactItemize}
+\item
+enum \hyperlink{group__sending-data_ga98b099cf8c1c7e38ad78501f270e193d}{lws\+\_\+write\+\_\+protocol} \{ \\*
+\hyperlink{group__sending-data_gga98b099cf8c1c7e38ad78501f270e193da80e8f169fda236c56bfb795ed62903db}{L\+W\+S\+\_\+\+W\+R\+I\+T\+E\+\_\+\+T\+E\+XT} = 0,
+\hyperlink{group__sending-data_gga98b099cf8c1c7e38ad78501f270e193daf6486c0dba50c44198100717721d9ab2}{L\+W\+S\+\_\+\+W\+R\+I\+T\+E\+\_\+\+B\+I\+N\+A\+RY} = 1,
+\hyperlink{group__sending-data_gga98b099cf8c1c7e38ad78501f270e193da10047eb05b5e1c298151dc47a5b44826}{L\+W\+S\+\_\+\+W\+R\+I\+T\+E\+\_\+\+C\+O\+N\+T\+I\+N\+U\+A\+T\+I\+ON} = 2,
+\hyperlink{group__sending-data_gga98b099cf8c1c7e38ad78501f270e193dabb6705e1d1327cdda5025be28f07712e}{L\+W\+S\+\_\+\+W\+R\+I\+T\+E\+\_\+\+H\+T\+TP} = 3,
+\\*
+{\bfseries L\+W\+S\+\_\+\+W\+R\+I\+T\+E\+\_\+\+P\+I\+NG} = 5,
+{\bfseries L\+W\+S\+\_\+\+W\+R\+I\+T\+E\+\_\+\+P\+O\+NG} = 6,
+{\bfseries L\+W\+S\+\_\+\+W\+R\+I\+T\+E\+\_\+\+H\+T\+T\+P\+\_\+\+F\+I\+N\+AL} = 7,
+\hyperlink{group__sending-data_gga98b099cf8c1c7e38ad78501f270e193dafe5a38e940ce56708ac814627e9c0917}{L\+W\+S\+\_\+\+W\+R\+I\+T\+E\+\_\+\+H\+T\+T\+P\+\_\+\+H\+E\+A\+D\+E\+RS} = 8,
+\\*
+\hyperlink{group__sending-data_gga98b099cf8c1c7e38ad78501f270e193da115440f272a5d55518adfc8099acfee3}{L\+W\+S\+\_\+\+W\+R\+I\+T\+E\+\_\+\+N\+O\+\_\+\+F\+IN} = 0x40,
+\hyperlink{group__sending-data_gga98b099cf8c1c7e38ad78501f270e193da220d8e8652d9b97fb66e476e2a60ffce}{L\+W\+S\+\_\+\+W\+R\+I\+T\+E\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+I\+G\+N\+O\+R\+E\+\_\+\+X\+O\+R\+\_\+\+M\+A\+SK} = 0x80
+ \}
+\end{DoxyCompactItemize}
+\subsection*{Functions}
+\begin{DoxyCompactItemize}
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int \hyperlink{group__sending-data_gafd5fdd285a0e25ba7e3e1051deec1001}{lws\+\_\+write} (struct lws $\ast$wsi, unsigned char $\ast$buf, size\+\_\+t len, enum \hyperlink{group__sending-data_ga98b099cf8c1c7e38ad78501f270e193d}{lws\+\_\+write\+\_\+protocol} protocol)
+\end{DoxyCompactItemize}
+
+
+\subsection{Detailed Description}
+A\+P\+Is related to writing data on a connection
+
+\subsection{Enumeration Type Documentation}
+\index{Sending data@{Sending data}!lws\+\_\+write\+\_\+protocol@{lws\+\_\+write\+\_\+protocol}}
+\index{lws\+\_\+write\+\_\+protocol@{lws\+\_\+write\+\_\+protocol}!Sending data@{Sending data}}
+\subsubsection[{\texorpdfstring{lws\+\_\+write\+\_\+protocol}{lws\_write\_protocol}}]{\setlength{\rightskip}{0pt plus 5cm}enum {\bf lws\+\_\+write\+\_\+protocol}}\hypertarget{group__sending-data_ga98b099cf8c1c7e38ad78501f270e193d}{}\label{group__sending-data_ga98b099cf8c1c7e38ad78501f270e193d}
+
+
+{\ttfamily \#include $<$\hyperlink{libwebsockets_8h}{lib/libwebsockets.\+h}$>$}
+
+\begin{Desc}
+\item[Enumerator]\par
+\begin{description}
+\index{L\+W\+S\+\_\+\+W\+R\+I\+T\+E\+\_\+\+T\+E\+XT@{L\+W\+S\+\_\+\+W\+R\+I\+T\+E\+\_\+\+T\+E\+XT}!Sending data@{Sending data}}\index{Sending data@{Sending data}!L\+W\+S\+\_\+\+W\+R\+I\+T\+E\+\_\+\+T\+E\+XT@{L\+W\+S\+\_\+\+W\+R\+I\+T\+E\+\_\+\+T\+E\+XT}}\item[{\em
+L\+W\+S\+\_\+\+W\+R\+I\+T\+E\+\_\+\+T\+E\+XT\hypertarget{group__sending-data_gga98b099cf8c1c7e38ad78501f270e193da80e8f169fda236c56bfb795ed62903db}{}\label{group__sending-data_gga98b099cf8c1c7e38ad78501f270e193da80e8f169fda236c56bfb795ed62903db}
+}]Send a ws T\+E\+XT message,the pointer must have L\+W\+S\+\_\+\+P\+RE valid memory behind it. The receiver expects only valid utf-\/8 in the payload \index{L\+W\+S\+\_\+\+W\+R\+I\+T\+E\+\_\+\+B\+I\+N\+A\+RY@{L\+W\+S\+\_\+\+W\+R\+I\+T\+E\+\_\+\+B\+I\+N\+A\+RY}!Sending data@{Sending data}}\index{Sending data@{Sending data}!L\+W\+S\+\_\+\+W\+R\+I\+T\+E\+\_\+\+B\+I\+N\+A\+RY@{L\+W\+S\+\_\+\+W\+R\+I\+T\+E\+\_\+\+B\+I\+N\+A\+RY}}\item[{\em
+L\+W\+S\+\_\+\+W\+R\+I\+T\+E\+\_\+\+B\+I\+N\+A\+RY\hypertarget{group__sending-data_gga98b099cf8c1c7e38ad78501f270e193daf6486c0dba50c44198100717721d9ab2}{}\label{group__sending-data_gga98b099cf8c1c7e38ad78501f270e193daf6486c0dba50c44198100717721d9ab2}
+}]Send a ws B\+I\+N\+A\+RY message, the pointer must have L\+W\+S\+\_\+\+P\+RE valid memory behind it. Any sequence of bytes is valid \index{L\+W\+S\+\_\+\+W\+R\+I\+T\+E\+\_\+\+C\+O\+N\+T\+I\+N\+U\+A\+T\+I\+ON@{L\+W\+S\+\_\+\+W\+R\+I\+T\+E\+\_\+\+C\+O\+N\+T\+I\+N\+U\+A\+T\+I\+ON}!Sending data@{Sending data}}\index{Sending data@{Sending data}!L\+W\+S\+\_\+\+W\+R\+I\+T\+E\+\_\+\+C\+O\+N\+T\+I\+N\+U\+A\+T\+I\+ON@{L\+W\+S\+\_\+\+W\+R\+I\+T\+E\+\_\+\+C\+O\+N\+T\+I\+N\+U\+A\+T\+I\+ON}}\item[{\em
+L\+W\+S\+\_\+\+W\+R\+I\+T\+E\+\_\+\+C\+O\+N\+T\+I\+N\+U\+A\+T\+I\+ON\hypertarget{group__sending-data_gga98b099cf8c1c7e38ad78501f270e193da10047eb05b5e1c298151dc47a5b44826}{}\label{group__sending-data_gga98b099cf8c1c7e38ad78501f270e193da10047eb05b5e1c298151dc47a5b44826}
+}]Continue a previous ws message, the pointer must have L\+W\+S\+\_\+\+P\+RE valid memory behind it \index{L\+W\+S\+\_\+\+W\+R\+I\+T\+E\+\_\+\+H\+T\+TP@{L\+W\+S\+\_\+\+W\+R\+I\+T\+E\+\_\+\+H\+T\+TP}!Sending data@{Sending data}}\index{Sending data@{Sending data}!L\+W\+S\+\_\+\+W\+R\+I\+T\+E\+\_\+\+H\+T\+TP@{L\+W\+S\+\_\+\+W\+R\+I\+T\+E\+\_\+\+H\+T\+TP}}\item[{\em
+L\+W\+S\+\_\+\+W\+R\+I\+T\+E\+\_\+\+H\+T\+TP\hypertarget{group__sending-data_gga98b099cf8c1c7e38ad78501f270e193dabb6705e1d1327cdda5025be28f07712e}{}\label{group__sending-data_gga98b099cf8c1c7e38ad78501f270e193dabb6705e1d1327cdda5025be28f07712e}
+}]Send H\+T\+TP content \index{L\+W\+S\+\_\+\+W\+R\+I\+T\+E\+\_\+\+H\+T\+T\+P\+\_\+\+H\+E\+A\+D\+E\+RS@{L\+W\+S\+\_\+\+W\+R\+I\+T\+E\+\_\+\+H\+T\+T\+P\+\_\+\+H\+E\+A\+D\+E\+RS}!Sending data@{Sending data}}\index{Sending data@{Sending data}!L\+W\+S\+\_\+\+W\+R\+I\+T\+E\+\_\+\+H\+T\+T\+P\+\_\+\+H\+E\+A\+D\+E\+RS@{L\+W\+S\+\_\+\+W\+R\+I\+T\+E\+\_\+\+H\+T\+T\+P\+\_\+\+H\+E\+A\+D\+E\+RS}}\item[{\em
+L\+W\+S\+\_\+\+W\+R\+I\+T\+E\+\_\+\+H\+T\+T\+P\+\_\+\+H\+E\+A\+D\+E\+RS\hypertarget{group__sending-data_gga98b099cf8c1c7e38ad78501f270e193dafe5a38e940ce56708ac814627e9c0917}{}\label{group__sending-data_gga98b099cf8c1c7e38ad78501f270e193dafe5a38e940ce56708ac814627e9c0917}
+}]Send http headers (http2 encodes this payload and L\+W\+S\+\_\+\+W\+R\+I\+T\+E\+\_\+\+H\+T\+TP payload differently, http 1.\+x links also handle this correctly. so to be compatible with both in the future,header response part should be sent using this regardless of http version expected) \index{L\+W\+S\+\_\+\+W\+R\+I\+T\+E\+\_\+\+N\+O\+\_\+\+F\+IN@{L\+W\+S\+\_\+\+W\+R\+I\+T\+E\+\_\+\+N\+O\+\_\+\+F\+IN}!Sending data@{Sending data}}\index{Sending data@{Sending data}!L\+W\+S\+\_\+\+W\+R\+I\+T\+E\+\_\+\+N\+O\+\_\+\+F\+IN@{L\+W\+S\+\_\+\+W\+R\+I\+T\+E\+\_\+\+N\+O\+\_\+\+F\+IN}}\item[{\em
+L\+W\+S\+\_\+\+W\+R\+I\+T\+E\+\_\+\+N\+O\+\_\+\+F\+IN\hypertarget{group__sending-data_gga98b099cf8c1c7e38ad78501f270e193da115440f272a5d55518adfc8099acfee3}{}\label{group__sending-data_gga98b099cf8c1c7e38ad78501f270e193da115440f272a5d55518adfc8099acfee3}
+}]This part of the message is not the end of the message \index{L\+W\+S\+\_\+\+W\+R\+I\+T\+E\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+I\+G\+N\+O\+R\+E\+\_\+\+X\+O\+R\+\_\+\+M\+A\+SK@{L\+W\+S\+\_\+\+W\+R\+I\+T\+E\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+I\+G\+N\+O\+R\+E\+\_\+\+X\+O\+R\+\_\+\+M\+A\+SK}!Sending data@{Sending data}}\index{Sending data@{Sending data}!L\+W\+S\+\_\+\+W\+R\+I\+T\+E\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+I\+G\+N\+O\+R\+E\+\_\+\+X\+O\+R\+\_\+\+M\+A\+SK@{L\+W\+S\+\_\+\+W\+R\+I\+T\+E\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+I\+G\+N\+O\+R\+E\+\_\+\+X\+O\+R\+\_\+\+M\+A\+SK}}\item[{\em
+L\+W\+S\+\_\+\+W\+R\+I\+T\+E\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+I\+G\+N\+O\+R\+E\+\_\+\+X\+O\+R\+\_\+\+M\+A\+SK\hypertarget{group__sending-data_gga98b099cf8c1c7e38ad78501f270e193da220d8e8652d9b97fb66e476e2a60ffce}{}\label{group__sending-data_gga98b099cf8c1c7e38ad78501f270e193da220d8e8652d9b97fb66e476e2a60ffce}
+}]client packet payload goes out on wire unmunged only useful for security tests since normal servers cannot decode the content if used \end{description}
+\end{Desc}
+
+\begin{DoxyCode}
+2893 \{
+2894 \hyperlink{group__sending-data_gga98b099cf8c1c7e38ad78501f270e193da80e8f169fda236c56bfb795ed62903db}{LWS\_WRITE\_TEXT} = 0,
+2898 \hyperlink{group__sending-data_gga98b099cf8c1c7e38ad78501f270e193daf6486c0dba50c44198100717721d9ab2}{LWS\_WRITE\_BINARY} = 1,
+2901 \hyperlink{group__sending-data_gga98b099cf8c1c7e38ad78501f270e193da10047eb05b5e1c298151dc47a5b44826}{LWS\_WRITE\_CONTINUATION} = 2,
+2904 \hyperlink{group__sending-data_gga98b099cf8c1c7e38ad78501f270e193dabb6705e1d1327cdda5025be28f07712e}{LWS\_WRITE\_HTTP} = 3,
+2907 \textcolor{comment}{/* LWS\_WRITE\_CLOSE is handled by lws\_close\_reason() */}
+2908 LWS\_WRITE\_PING = 5,
+2909 LWS\_WRITE\_PONG = 6,
+2910
+2911 \textcolor{comment}{/* Same as write\_http but we know this write ends the transaction */}
+2912 LWS\_WRITE\_HTTP\_FINAL = 7,
+2913
+2914 \textcolor{comment}{/* HTTP2 */}
+2915
+2916 \hyperlink{group__sending-data_gga98b099cf8c1c7e38ad78501f270e193dafe5a38e940ce56708ac814627e9c0917}{LWS\_WRITE\_HTTP\_HEADERS} = 8,
+2923 \textcolor{comment}{/****** add new things just above ---^ ******/}
+2924
+2925 \textcolor{comment}{/* flags */}
+2926
+2927 \hyperlink{group__sending-data_gga98b099cf8c1c7e38ad78501f270e193da115440f272a5d55518adfc8099acfee3}{LWS\_WRITE\_NO\_FIN} = 0x40,
+2930 \hyperlink{group__sending-data_gga98b099cf8c1c7e38ad78501f270e193da220d8e8652d9b97fb66e476e2a60ffce}{LWS\_WRITE\_CLIENT\_IGNORE\_XOR\_MASK} = 0x80
+2934 \};
+\end{DoxyCode}
+
+
+\subsection{Function Documentation}
+\index{Sending data@{Sending data}!lws\+\_\+write@{lws\+\_\+write}}
+\index{lws\+\_\+write@{lws\+\_\+write}!Sending data@{Sending data}}
+\subsubsection[{\texorpdfstring{lws\+\_\+write(struct lws $\ast$wsi, unsigned char $\ast$buf, size\+\_\+t len, enum lws\+\_\+write\+\_\+protocol protocol)}{lws\_write(struct lws *wsi, unsigned char *buf, size\_t len, enum lws\_write\_protocol protocol)}}]{\setlength{\rightskip}{0pt plus 5cm}L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int lws\+\_\+write (
+\begin{DoxyParamCaption}
+\item[{struct lws $\ast$}]{wsi, }
+\item[{unsigned char $\ast$}]{buf, }
+\item[{size\+\_\+t}]{len, }
+\item[{enum {\bf lws\+\_\+write\+\_\+protocol}}]{protocol}
+\end{DoxyParamCaption}
+)}\hypertarget{group__sending-data_gafd5fdd285a0e25ba7e3e1051deec1001}{}\label{group__sending-data_gafd5fdd285a0e25ba7e3e1051deec1001}
+
+
+{\ttfamily \#include $<$\hyperlink{libwebsockets_8h}{lib/libwebsockets.\+h}$>$}
+
+\hyperlink{group__sending-data_gafd5fdd285a0e25ba7e3e1051deec1001}{lws\+\_\+write()} -\/ Apply protocol then write data to client
+\begin{DoxyParams}{Parameters}
+{\em wsi} & Websocket instance (available from user callback) \\
+\hline
+{\em buf} & The data to send. For data being sent on a websocket connection (ie, not default http), this buffer M\+U\+ST have L\+W\+S\+\_\+\+P\+RE bytes valid B\+E\+F\+O\+RE the pointer. This is so the protocol header data can be added in-\/situ. \\
+\hline
+{\em len} & Count of the data bytes in the payload starting from buf \\
+\hline
+{\em protocol} & Use L\+W\+S\+\_\+\+W\+R\+I\+T\+E\+\_\+\+H\+T\+TP to reply to an http connection, and one of L\+W\+S\+\_\+\+W\+R\+I\+T\+E\+\_\+\+B\+I\+N\+A\+RY or L\+W\+S\+\_\+\+W\+R\+I\+T\+E\+\_\+\+T\+E\+XT to send appropriate data on a websockets connection. Remember to allow the extra bytes before and after buf if L\+W\+S\+\_\+\+W\+R\+I\+T\+E\+\_\+\+B\+I\+N\+A\+RY or L\+W\+S\+\_\+\+W\+R\+I\+T\+E\+\_\+\+T\+E\+XT are used.\\
+\hline
+\end{DoxyParams}
+This function provides the way to issue data back to the client for both http and websocket protocols.
+
+I\+M\+P\+O\+R\+T\+A\+NT N\+O\+T\+I\+C\+E!
+
+When sending with websocket protocol
+
+L\+W\+S\+\_\+\+W\+R\+I\+T\+E\+\_\+\+T\+E\+XT, L\+W\+S\+\_\+\+W\+R\+I\+T\+E\+\_\+\+B\+I\+N\+A\+RY, L\+W\+S\+\_\+\+W\+R\+I\+T\+E\+\_\+\+C\+O\+N\+T\+I\+N\+U\+A\+T\+I\+ON, L\+W\+S\+\_\+\+W\+R\+I\+T\+E\+\_\+\+P\+I\+NG, L\+W\+S\+\_\+\+W\+R\+I\+T\+E\+\_\+\+P\+O\+NG
+
+the send buffer has to have L\+W\+S\+\_\+\+P\+RE bytes valid B\+E\+F\+O\+RE the buffer pointer you pass to \hyperlink{group__sending-data_gafd5fdd285a0e25ba7e3e1051deec1001}{lws\+\_\+write()}.
+
+This allows us to add protocol info before and after the data, and send as one packet on the network without payload copying, for maximum efficiency.
+
+So for example you need this kind of code to use lws\+\_\+write with a 128-\/byte payload
+
+char buf\mbox{[}L\+W\+S\+\_\+\+P\+RE + 128\mbox{]};
+
+// fill your part of the buffer... for example here it\textquotesingle{}s all zeros memset(\&buf\mbox{[}\+L\+W\+S\+\_\+\+P\+R\+E\mbox{]}, 0, 128);
+
+lws\+\_\+write(wsi, \&buf\mbox{[}\+L\+W\+S\+\_\+\+P\+R\+E\mbox{]}, 128, L\+W\+S\+\_\+\+W\+R\+I\+T\+E\+\_\+\+T\+E\+X\+T);
+
+When sending H\+T\+TP, with
+
+L\+W\+S\+\_\+\+W\+R\+I\+T\+E\+\_\+\+H\+T\+TP, L\+W\+S\+\_\+\+W\+R\+I\+T\+E\+\_\+\+H\+T\+T\+P\+\_\+\+H\+E\+A\+D\+E\+RS L\+W\+S\+\_\+\+W\+R\+I\+T\+E\+\_\+\+H\+T\+T\+P\+\_\+\+F\+I\+N\+AL
+
+there is no protocol data prepended, and don\textquotesingle{}t need to take care about the L\+W\+S\+\_\+\+P\+RE bytes valid before the buffer pointer.
+
+L\+W\+S\+\_\+\+P\+RE is at least the frame nonce + 2 header + 8 length L\+W\+S\+\_\+\+S\+E\+N\+D\+\_\+\+B\+U\+F\+F\+E\+R\+\_\+\+P\+O\+S\+T\+\_\+\+P\+A\+D\+D\+I\+NG is deprecated, it\textquotesingle{}s now 0 and can be left off. The example apps no longer use it.
+
+Pad L\+W\+S\+\_\+\+P\+RE to the C\+PU word size, so that word references to the address immediately after the padding won\textquotesingle{}t cause an unaligned access error. Sometimes for performance reasons the recommended padding is even larger than sizeof(void $\ast$). \begin{DoxyVerb} In the case of sending using websocket protocol, be sure to allocate
+ valid storage before and after buf as explained above. This scheme
+ allows maximum efficiency of sending data and protocol in a single
+ packet while not burdening the user code with any protocol knowledge.
+
+ Return may be -1 for a fatal error needing connection close, or a
+ positive number reflecting the amount of bytes actually sent. This
+ can be less than the requested number of bytes due to OS memory
+ pressure at any given time.\end{DoxyVerb}
+
\ No newline at end of file
--- /dev/null
+\hypertarget{group__service}{}\section{Built-\/in service loop entry}
+\label{group__service}\index{Built-\/in service loop entry@{Built-\/in service loop entry}}
+\subsection*{Functions}
+\begin{DoxyCompactItemize}
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int \hyperlink{group__service_gaf95bd0c663d6516a0c80047d9b1167a8}{lws\+\_\+service} (struct lws\+\_\+context $\ast$context, int timeout\+\_\+ms)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int \hyperlink{group__service_ga9b3cc4473fd8848e5bbee7f310712939}{lws\+\_\+service\+\_\+tsi} (struct lws\+\_\+context $\ast$context, int timeout\+\_\+ms, int tsi)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN void \hyperlink{group__service_ga29c246707997ab7a466aa709aecd2d7b}{lws\+\_\+cancel\+\_\+service\+\_\+pt} (struct lws $\ast$wsi)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN void \hyperlink{group__service_ga53e3d0801dfda7960a7249dd559e68a2}{lws\+\_\+cancel\+\_\+service} (struct lws\+\_\+context $\ast$context)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int \hyperlink{group__service_gad82efa5466d14a9f05aa06416375b28d}{lws\+\_\+service\+\_\+fd} (struct lws\+\_\+context $\ast$context, struct \hyperlink{structlws__pollfd}{lws\+\_\+pollfd} $\ast$\hyperlink{structpollfd}{pollfd})
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int \hyperlink{group__service_gaebf426eda371ba23642fc11d8e0ace6b}{lws\+\_\+service\+\_\+fd\+\_\+tsi} (struct lws\+\_\+context $\ast$context, struct \hyperlink{structlws__pollfd}{lws\+\_\+pollfd} $\ast$\hyperlink{structpollfd}{pollfd}, int tsi)
+\end{DoxyCompactItemize}
+
+
+\subsection{Detailed Description}
+\subsubsection*{Built-\/in service loop entry}
+
+If you\textquotesingle{}re not using libev / libuv, these apis are needed to enter the poll() wait in lws and service any connections with pending events.
+
+\subsection{Function Documentation}
+\index{Built-\/in service loop entry@{Built-\/in service loop entry}!lws\+\_\+cancel\+\_\+service@{lws\+\_\+cancel\+\_\+service}}
+\index{lws\+\_\+cancel\+\_\+service@{lws\+\_\+cancel\+\_\+service}!Built-\/in service loop entry@{Built-\/in service loop entry}}
+\subsubsection[{\texorpdfstring{lws\+\_\+cancel\+\_\+service(struct lws\+\_\+context $\ast$context)}{lws\_cancel\_service(struct lws\_context *context)}}]{\setlength{\rightskip}{0pt plus 5cm}L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN void lws\+\_\+cancel\+\_\+service (
+\begin{DoxyParamCaption}
+\item[{struct lws\+\_\+context $\ast$}]{context}
+\end{DoxyParamCaption}
+)}\hypertarget{group__service_ga53e3d0801dfda7960a7249dd559e68a2}{}\label{group__service_ga53e3d0801dfda7960a7249dd559e68a2}
+
+
+{\ttfamily \#include $<$\hyperlink{libwebsockets_8h}{lib/libwebsockets.\+h}$>$}
+
+\hyperlink{group__service_ga53e3d0801dfda7960a7249dd559e68a2}{lws\+\_\+cancel\+\_\+service()} -\/ Cancel wait for new pending socket activity
+\begin{DoxyParams}{Parameters}
+{\em context} & Websocket context \begin{DoxyVerb} This function let a call to lws_service() waiting for a timeout
+ immediately return.
+
+ What it basically does is provide a fake event that will be swallowed,
+ so the wait in poll() is ended. That's useful because poll() doesn't
+ attend to changes in POLLIN/OUT/ERR until it re-enters the wait.\end{DoxyVerb}
+ \\
+\hline
+\end{DoxyParams}
+\index{Built-\/in service loop entry@{Built-\/in service loop entry}!lws\+\_\+cancel\+\_\+service\+\_\+pt@{lws\+\_\+cancel\+\_\+service\+\_\+pt}}
+\index{lws\+\_\+cancel\+\_\+service\+\_\+pt@{lws\+\_\+cancel\+\_\+service\+\_\+pt}!Built-\/in service loop entry@{Built-\/in service loop entry}}
+\subsubsection[{\texorpdfstring{lws\+\_\+cancel\+\_\+service\+\_\+pt(struct lws $\ast$wsi)}{lws\_cancel\_service\_pt(struct lws *wsi)}}]{\setlength{\rightskip}{0pt plus 5cm}L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN void lws\+\_\+cancel\+\_\+service\+\_\+pt (
+\begin{DoxyParamCaption}
+\item[{struct lws $\ast$}]{wsi}
+\end{DoxyParamCaption}
+)}\hypertarget{group__service_ga29c246707997ab7a466aa709aecd2d7b}{}\label{group__service_ga29c246707997ab7a466aa709aecd2d7b}
+
+
+{\ttfamily \#include $<$\hyperlink{libwebsockets_8h}{lib/libwebsockets.\+h}$>$}
+
+\hyperlink{group__service_ga29c246707997ab7a466aa709aecd2d7b}{lws\+\_\+cancel\+\_\+service\+\_\+pt()} -\/ Cancel servicing of pending socket activity on one thread
+\begin{DoxyParams}{Parameters}
+{\em wsi} & Cancel service on the thread this wsi is serviced by \begin{DoxyVerb} This function lets a call to lws_service() waiting for a timeout
+ immediately return.
+
+ It works by creating a phony event and then swallowing it silently.
+
+ The reason it may be needed is when waiting in poll(), changes to
+ the event masks are ignored by the OS until poll() is reentered. This
+ lets you halt the poll() wait and make the reentry happen immediately
+ instead of having the wait out the rest of the poll timeout.\end{DoxyVerb}
+ \\
+\hline
+\end{DoxyParams}
+\index{Built-\/in service loop entry@{Built-\/in service loop entry}!lws\+\_\+service@{lws\+\_\+service}}
+\index{lws\+\_\+service@{lws\+\_\+service}!Built-\/in service loop entry@{Built-\/in service loop entry}}
+\subsubsection[{\texorpdfstring{lws\+\_\+service(struct lws\+\_\+context $\ast$context, int timeout\+\_\+ms)}{lws\_service(struct lws\_context *context, int timeout\_ms)}}]{\setlength{\rightskip}{0pt plus 5cm}L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int lws\+\_\+service (
+\begin{DoxyParamCaption}
+\item[{struct lws\+\_\+context $\ast$}]{context, }
+\item[{int}]{timeout\+\_\+ms}
+\end{DoxyParamCaption}
+)}\hypertarget{group__service_gaf95bd0c663d6516a0c80047d9b1167a8}{}\label{group__service_gaf95bd0c663d6516a0c80047d9b1167a8}
+
+
+{\ttfamily \#include $<$\hyperlink{libwebsockets_8h}{lib/libwebsockets.\+h}$>$}
+
+\hyperlink{group__service_gaf95bd0c663d6516a0c80047d9b1167a8}{lws\+\_\+service()} -\/ Service any pending websocket activity
+\begin{DoxyParams}{Parameters}
+{\em context} & Websocket context \\
+\hline
+{\em timeout\+\_\+ms} & Timeout for poll; 0 means return immediately if nothing needed service otherwise block and service immediately, returning after the timeout if nothing needed service.\\
+\hline
+\end{DoxyParams}
+This function deals with any pending websocket traffic, for three kinds of event. It handles these events on both server and client types of connection the same.
+
+1) Accept new connections to our context\textquotesingle{}s server
+
+2) Call the receive callback for incoming frame data received by server or client connections.
+
+You need to call this service function periodically to all the above functions to happen; if your application is single-\/threaded you can just call it in your main event loop.
+
+Alternatively you can fork a new process that asynchronously handles calling this service in a loop. In that case you are happy if this call blocks your thread until it needs to take care of something and would call it with a large nonzero timeout. Your loop then takes no C\+PU while there is nothing happening.
+
+If you are calling it in a single-\/threaded app, you don\textquotesingle{}t want it to wait around blocking other things in your loop from happening, so you would call it with a timeout\+\_\+ms of 0, so it returns immediately if nothing is pending, or as soon as it services whatever was pending. \index{Built-\/in service loop entry@{Built-\/in service loop entry}!lws\+\_\+service\+\_\+fd@{lws\+\_\+service\+\_\+fd}}
+\index{lws\+\_\+service\+\_\+fd@{lws\+\_\+service\+\_\+fd}!Built-\/in service loop entry@{Built-\/in service loop entry}}
+\subsubsection[{\texorpdfstring{lws\+\_\+service\+\_\+fd(struct lws\+\_\+context $\ast$context, struct lws\+\_\+pollfd $\ast$pollfd)}{lws\_service\_fd(struct lws\_context *context, struct lws\_pollfd *pollfd)}}]{\setlength{\rightskip}{0pt plus 5cm}L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int lws\+\_\+service\+\_\+fd (
+\begin{DoxyParamCaption}
+\item[{struct lws\+\_\+context $\ast$}]{context, }
+\item[{struct {\bf lws\+\_\+pollfd} $\ast$}]{pollfd}
+\end{DoxyParamCaption}
+)}\hypertarget{group__service_gad82efa5466d14a9f05aa06416375b28d}{}\label{group__service_gad82efa5466d14a9f05aa06416375b28d}
+
+
+{\ttfamily \#include $<$\hyperlink{libwebsockets_8h}{lib/libwebsockets.\+h}$>$}
+
+\hyperlink{group__service_gad82efa5466d14a9f05aa06416375b28d}{lws\+\_\+service\+\_\+fd()} -\/ Service polled socket with something waiting
+\begin{DoxyParams}{Parameters}
+{\em context} & Websocket context \\
+\hline
+{\em pollfd} & The pollfd entry describing the socket fd and which events happened.\\
+\hline
+\end{DoxyParams}
+This function takes a pollfd that has P\+O\+L\+L\+IN or P\+O\+L\+L\+O\+UT activity and services it according to the state of the associated struct lws.
+
+The one call deals with all \char`\"{}service\char`\"{} that might happen on a socket including listen accepts, http files as well as websocket protocol.
+
+If a pollfd says it has something, you can just pass it to \hyperlink{group__service_gad82efa5466d14a9f05aa06416375b28d}{lws\+\_\+service\+\_\+fd()} whether it is a socket handled by lws or not. If it sees it is a lws socket, the traffic will be handled and pollfd-\/$>$revents will be zeroed now.
+
+If the socket is foreign to lws, it leaves revents alone. So you can see if you should service yourself by checking the pollfd revents after letting lws try to service it. \index{Built-\/in service loop entry@{Built-\/in service loop entry}!lws\+\_\+service\+\_\+fd\+\_\+tsi@{lws\+\_\+service\+\_\+fd\+\_\+tsi}}
+\index{lws\+\_\+service\+\_\+fd\+\_\+tsi@{lws\+\_\+service\+\_\+fd\+\_\+tsi}!Built-\/in service loop entry@{Built-\/in service loop entry}}
+\subsubsection[{\texorpdfstring{lws\+\_\+service\+\_\+fd\+\_\+tsi(struct lws\+\_\+context $\ast$context, struct lws\+\_\+pollfd $\ast$pollfd, int tsi)}{lws\_service\_fd\_tsi(struct lws\_context *context, struct lws\_pollfd *pollfd, int tsi)}}]{\setlength{\rightskip}{0pt plus 5cm}L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int lws\+\_\+service\+\_\+fd\+\_\+tsi (
+\begin{DoxyParamCaption}
+\item[{struct lws\+\_\+context $\ast$}]{context, }
+\item[{struct {\bf lws\+\_\+pollfd} $\ast$}]{pollfd, }
+\item[{int}]{tsi}
+\end{DoxyParamCaption}
+)}\hypertarget{group__service_gaebf426eda371ba23642fc11d8e0ace6b}{}\label{group__service_gaebf426eda371ba23642fc11d8e0ace6b}
+
+
+{\ttfamily \#include $<$\hyperlink{libwebsockets_8h}{lib/libwebsockets.\+h}$>$}
+
+\hyperlink{group__service_gaebf426eda371ba23642fc11d8e0ace6b}{lws\+\_\+service\+\_\+fd\+\_\+tsi()} -\/ Service polled socket in specific service thread
+\begin{DoxyParams}{Parameters}
+{\em context} & Websocket context \\
+\hline
+{\em pollfd} & The pollfd entry describing the socket fd and which events happened. \\
+\hline
+{\em tsi} & thread service index\\
+\hline
+\end{DoxyParams}
+Same as \hyperlink{group__service_gad82efa5466d14a9f05aa06416375b28d}{lws\+\_\+service\+\_\+fd()} but used with multiple service threads \index{Built-\/in service loop entry@{Built-\/in service loop entry}!lws\+\_\+service\+\_\+tsi@{lws\+\_\+service\+\_\+tsi}}
+\index{lws\+\_\+service\+\_\+tsi@{lws\+\_\+service\+\_\+tsi}!Built-\/in service loop entry@{Built-\/in service loop entry}}
+\subsubsection[{\texorpdfstring{lws\+\_\+service\+\_\+tsi(struct lws\+\_\+context $\ast$context, int timeout\+\_\+ms, int tsi)}{lws\_service\_tsi(struct lws\_context *context, int timeout\_ms, int tsi)}}]{\setlength{\rightskip}{0pt plus 5cm}L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int lws\+\_\+service\+\_\+tsi (
+\begin{DoxyParamCaption}
+\item[{struct lws\+\_\+context $\ast$}]{context, }
+\item[{int}]{timeout\+\_\+ms, }
+\item[{int}]{tsi}
+\end{DoxyParamCaption}
+)}\hypertarget{group__service_ga9b3cc4473fd8848e5bbee7f310712939}{}\label{group__service_ga9b3cc4473fd8848e5bbee7f310712939}
+
+
+{\ttfamily \#include $<$\hyperlink{libwebsockets_8h}{lib/libwebsockets.\+h}$>$}
+
+\hyperlink{group__service_gaf95bd0c663d6516a0c80047d9b1167a8}{lws\+\_\+service()} -\/ Service any pending websocket activity
+
+
+\begin{DoxyParams}{Parameters}
+{\em context} & Websocket context \\
+\hline
+{\em timeout\+\_\+ms} & Timeout for poll; 0 means return immediately if nothing needed service otherwise block and service immediately, returning after the timeout if nothing needed service.\\
+\hline
+\end{DoxyParams}
+Same as \hyperlink{group__service_gaf95bd0c663d6516a0c80047d9b1167a8}{lws\+\_\+service()}, but for a specific thread service index. Only needed if you are spawning multiple service threads.
\ No newline at end of file
--- /dev/null
+\hypertarget{group__sha}{}\section{S\+HA and B64 helpers}
+\label{group__sha}\index{S\+H\+A and B64 helpers@{S\+H\+A and B64 helpers}}
+\subsection*{Functions}
+\begin{DoxyCompactItemize}
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN unsigned char $\ast$ \hyperlink{group__sha_ga7b09ab74646266f0b555103b3bb8dfe5}{lws\+\_\+\+S\+H\+A1} (const unsigned char $\ast$d, size\+\_\+t n, unsigned char $\ast$md)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int \hyperlink{group__sha_gaf39765e4a3b413efb65e4698b2ec3575}{lws\+\_\+b64\+\_\+encode\+\_\+string} (const char $\ast$in, int in\+\_\+len, char $\ast$out, int out\+\_\+size)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int \hyperlink{group__sha_ga66316e6a5a0644a09d5a10e919dfdd8d}{lws\+\_\+b64\+\_\+decode\+\_\+string} (const char $\ast$in, char $\ast$out, int out\+\_\+size)
+\end{DoxyCompactItemize}
+
+
+\subsection{Detailed Description}
+\subsubsection*{S\+HA and B64 helpers}
+
+These provide S\+H\+A-\/1 and B64 helper apis
+
+\subsection{Function Documentation}
+\index{S\+H\+A and B64 helpers@{S\+H\+A and B64 helpers}!lws\+\_\+b64\+\_\+decode\+\_\+string@{lws\+\_\+b64\+\_\+decode\+\_\+string}}
+\index{lws\+\_\+b64\+\_\+decode\+\_\+string@{lws\+\_\+b64\+\_\+decode\+\_\+string}!S\+H\+A and B64 helpers@{S\+H\+A and B64 helpers}}
+\subsubsection[{\texorpdfstring{lws\+\_\+b64\+\_\+decode\+\_\+string(const char $\ast$in, char $\ast$out, int out\+\_\+size)}{lws\_b64\_decode\_string(const char *in, char *out, int out\_size)}}]{\setlength{\rightskip}{0pt plus 5cm}L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int lws\+\_\+b64\+\_\+decode\+\_\+string (
+\begin{DoxyParamCaption}
+\item[{const char $\ast$}]{in, }
+\item[{char $\ast$}]{out, }
+\item[{int}]{out\+\_\+size}
+\end{DoxyParamCaption}
+)}\hypertarget{group__sha_ga66316e6a5a0644a09d5a10e919dfdd8d}{}\label{group__sha_ga66316e6a5a0644a09d5a10e919dfdd8d}
+
+
+{\ttfamily \#include $<$\hyperlink{libwebsockets_8h}{lib/libwebsockets.\+h}$>$}
+
+\hyperlink{group__sha_ga66316e6a5a0644a09d5a10e919dfdd8d}{lws\+\_\+b64\+\_\+decode\+\_\+string()}\+: decode a string from base 64
+
+
+\begin{DoxyParams}{Parameters}
+{\em in} & incoming buffer \\
+\hline
+{\em out} & result buffer \\
+\hline
+{\em out\+\_\+size} & length of result buffer\\
+\hline
+\end{DoxyParams}
+Decodes a string using b64 \index{S\+H\+A and B64 helpers@{S\+H\+A and B64 helpers}!lws\+\_\+b64\+\_\+encode\+\_\+string@{lws\+\_\+b64\+\_\+encode\+\_\+string}}
+\index{lws\+\_\+b64\+\_\+encode\+\_\+string@{lws\+\_\+b64\+\_\+encode\+\_\+string}!S\+H\+A and B64 helpers@{S\+H\+A and B64 helpers}}
+\subsubsection[{\texorpdfstring{lws\+\_\+b64\+\_\+encode\+\_\+string(const char $\ast$in, int in\+\_\+len, char $\ast$out, int out\+\_\+size)}{lws\_b64\_encode\_string(const char *in, int in\_len, char *out, int out\_size)}}]{\setlength{\rightskip}{0pt plus 5cm}L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int lws\+\_\+b64\+\_\+encode\+\_\+string (
+\begin{DoxyParamCaption}
+\item[{const char $\ast$}]{in, }
+\item[{int}]{in\+\_\+len, }
+\item[{char $\ast$}]{out, }
+\item[{int}]{out\+\_\+size}
+\end{DoxyParamCaption}
+)}\hypertarget{group__sha_gaf39765e4a3b413efb65e4698b2ec3575}{}\label{group__sha_gaf39765e4a3b413efb65e4698b2ec3575}
+
+
+{\ttfamily \#include $<$\hyperlink{libwebsockets_8h}{lib/libwebsockets.\+h}$>$}
+
+\hyperlink{group__sha_gaf39765e4a3b413efb65e4698b2ec3575}{lws\+\_\+b64\+\_\+encode\+\_\+string()}\+: encode a string into base 64
+
+
+\begin{DoxyParams}{Parameters}
+{\em in} & incoming buffer \\
+\hline
+{\em in\+\_\+len} & length of incoming buffer \\
+\hline
+{\em out} & result buffer \\
+\hline
+{\em out\+\_\+size} & length of result buffer\\
+\hline
+\end{DoxyParams}
+Encodes a string using b64 \index{S\+H\+A and B64 helpers@{S\+H\+A and B64 helpers}!lws\+\_\+\+S\+H\+A1@{lws\+\_\+\+S\+H\+A1}}
+\index{lws\+\_\+\+S\+H\+A1@{lws\+\_\+\+S\+H\+A1}!S\+H\+A and B64 helpers@{S\+H\+A and B64 helpers}}
+\subsubsection[{\texorpdfstring{lws\+\_\+\+S\+H\+A1(const unsigned char $\ast$d, size\+\_\+t n, unsigned char $\ast$md)}{lws\_SHA1(const unsigned char *d, size\_t n, unsigned char *md)}}]{\setlength{\rightskip}{0pt plus 5cm}L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN unsigned char$\ast$ lws\+\_\+\+S\+H\+A1 (
+\begin{DoxyParamCaption}
+\item[{const unsigned char $\ast$}]{d, }
+\item[{size\+\_\+t}]{n, }
+\item[{unsigned char $\ast$}]{md}
+\end{DoxyParamCaption}
+)}\hypertarget{group__sha_ga7b09ab74646266f0b555103b3bb8dfe5}{}\label{group__sha_ga7b09ab74646266f0b555103b3bb8dfe5}
+
+
+{\ttfamily \#include $<$\hyperlink{libwebsockets_8h}{lib/libwebsockets.\+h}$>$}
+
+\hyperlink{group__sha_ga7b09ab74646266f0b555103b3bb8dfe5}{lws\+\_\+\+S\+H\+A1()}\+: make a S\+H\+A-\/1 digest of a buffer
+
+
+\begin{DoxyParams}{Parameters}
+{\em d} & incoming buffer \\
+\hline
+{\em n} & length of incoming buffer \\
+\hline
+{\em md} & buffer for message digest (must be $>$= 20 bytes)\\
+\hline
+\end{DoxyParams}
+Reduces any size buffer into a 20-\/byte S\+H\+A-\/1 hash.
\ No newline at end of file
--- /dev/null
+\hypertarget{group__smtp}{}\section{Smtp}
+\label{group__smtp}\index{Smtp@{Smtp}}
+\subsection*{Data Structures}
+\begin{DoxyCompactItemize}
+\item
+struct \hyperlink{structlws__email}{lws\+\_\+email}
+\end{DoxyCompactItemize}
+\subsection*{Enumerations}
+\begin{DoxyCompactItemize}
+\item
+enum \hyperlink{group__smtp_ga116be79bf44f9dc2a97f46e051fe4dc0}{lwsgs\+\_\+smtp\+\_\+states} \{ \\*
+\hyperlink{group__smtp_gga116be79bf44f9dc2a97f46e051fe4dc0a29e5b0ecf75375b5a643faa3d6222b7c}{L\+G\+S\+S\+M\+T\+P\+\_\+\+I\+D\+LE},
+\hyperlink{group__smtp_gga116be79bf44f9dc2a97f46e051fe4dc0ab89442b7a3ca2b94c3cdcf33756eb933}{L\+G\+S\+S\+M\+T\+P\+\_\+\+C\+O\+N\+N\+E\+C\+T\+I\+NG},
+\hyperlink{group__smtp_gga116be79bf44f9dc2a97f46e051fe4dc0ab61778f70ecac007b334bb14942eb41d}{L\+G\+S\+S\+M\+T\+P\+\_\+\+C\+O\+N\+N\+E\+C\+T\+ED},
+\hyperlink{group__smtp_gga116be79bf44f9dc2a97f46e051fe4dc0a1dfec948a864205cec875f63cbe0d4ad}{L\+G\+S\+S\+M\+T\+P\+\_\+\+S\+E\+N\+T\+\_\+\+H\+E\+LO},
+\\*
+\hyperlink{group__smtp_gga116be79bf44f9dc2a97f46e051fe4dc0a929bb4623ff3f585108aba2a1b047fab}{L\+G\+S\+S\+M\+T\+P\+\_\+\+S\+E\+N\+T\+\_\+\+F\+R\+OM},
+\hyperlink{group__smtp_gga116be79bf44f9dc2a97f46e051fe4dc0aae20a0cb95b97a70f6b45d0ed2d5be83}{L\+G\+S\+S\+M\+T\+P\+\_\+\+S\+E\+N\+T\+\_\+\+TO},
+\hyperlink{group__smtp_gga116be79bf44f9dc2a97f46e051fe4dc0a85e3c452950c09a79086bff4b9be5c14}{L\+G\+S\+S\+M\+T\+P\+\_\+\+S\+E\+N\+T\+\_\+\+D\+A\+TA},
+\hyperlink{group__smtp_gga116be79bf44f9dc2a97f46e051fe4dc0a38fba41f28d754e38079b31418a86a69}{L\+G\+S\+S\+M\+T\+P\+\_\+\+S\+E\+N\+T\+\_\+\+B\+O\+DY},
+\\*
+\hyperlink{group__smtp_gga116be79bf44f9dc2a97f46e051fe4dc0a2c2ed16ffc572326e3040684084b21d5}{L\+G\+S\+S\+M\+T\+P\+\_\+\+S\+E\+N\+T\+\_\+\+Q\+U\+IT}
+ \}
+\end{DoxyCompactItemize}
+\subsection*{Functions}
+\begin{DoxyCompactItemize}
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int \hyperlink{group__smtp_ga77fc9b56a1bb39484844981ec375fc29}{lws\+\_\+email\+\_\+init} (struct \hyperlink{structlws__email}{lws\+\_\+email} $\ast$email, uv\+\_\+loop\+\_\+t $\ast$loop, int max\+\_\+content)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN void \hyperlink{group__smtp_ga5e535e346d92a9daf00be33abf79d4eb}{lws\+\_\+email\+\_\+check} (struct \hyperlink{structlws__email}{lws\+\_\+email} $\ast$email)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN void \hyperlink{group__smtp_ga25298a5afc1074e13b2d5711a86432b2}{lws\+\_\+email\+\_\+destroy} (struct \hyperlink{structlws__email}{lws\+\_\+email} $\ast$email)
+\end{DoxyCompactItemize}
+
+
+\subsection{Detailed Description}
+\subsubsection*{S\+M\+TP related functions}
+
+These apis let you communicate with a local S\+M\+TP server to send email from lws. It handles all the S\+M\+TP sequencing and protocol actions.
+
+Your system should have postfix, sendmail or another M\+TA listening on port 25 and able to send email using the \char`\"{}mail\char`\"{} commandline app. Usually distro M\+T\+As are configured for this by default.
+
+It runs via its own libuv events if initialized (which requires giving it a libuv loop to attach to).
+
+It operates using three callbacks, on\+\_\+next() queries if there is a new email to send, on\+\_\+get\+\_\+body() asks for the body of the email, and on\+\_\+sent() is called after the email is successfully sent.
+
+To use it
+
+
+\begin{DoxyItemize}
+\item create an \hyperlink{structlws__email}{lws\+\_\+email} struct
+\item initialize data, loop, the email\+\_\+$\ast$ strings, max\+\_\+content\+\_\+size and the callbacks
+\item call \hyperlink{group__smtp_ga77fc9b56a1bb39484844981ec375fc29}{lws\+\_\+email\+\_\+init()}
+\end{DoxyItemize}
+
+When you have at least one email to send, call \hyperlink{group__smtp_ga5e535e346d92a9daf00be33abf79d4eb}{lws\+\_\+email\+\_\+check()} to schedule starting to send it.
+
+\subsection{Enumeration Type Documentation}
+\index{Smtp@{Smtp}!lwsgs\+\_\+smtp\+\_\+states@{lwsgs\+\_\+smtp\+\_\+states}}
+\index{lwsgs\+\_\+smtp\+\_\+states@{lwsgs\+\_\+smtp\+\_\+states}!Smtp@{Smtp}}
+\subsubsection[{\texorpdfstring{lwsgs\+\_\+smtp\+\_\+states}{lwsgs\_smtp\_states}}]{\setlength{\rightskip}{0pt plus 5cm}enum {\bf lwsgs\+\_\+smtp\+\_\+states}}\hypertarget{group__smtp_ga116be79bf44f9dc2a97f46e051fe4dc0}{}\label{group__smtp_ga116be79bf44f9dc2a97f46e051fe4dc0}
+
+
+{\ttfamily \#include $<$\hyperlink{libwebsockets_8h}{lib/libwebsockets.\+h}$>$}
+
+enum lwsgs\+\_\+smtp\+\_\+states -\/ where we are in S\+M\+TP protocol sequence \begin{Desc}
+\item[Enumerator]\par
+\begin{description}
+\index{L\+G\+S\+S\+M\+T\+P\+\_\+\+I\+D\+LE@{L\+G\+S\+S\+M\+T\+P\+\_\+\+I\+D\+LE}!Smtp@{Smtp}}\index{Smtp@{Smtp}!L\+G\+S\+S\+M\+T\+P\+\_\+\+I\+D\+LE@{L\+G\+S\+S\+M\+T\+P\+\_\+\+I\+D\+LE}}\item[{\em
+L\+G\+S\+S\+M\+T\+P\+\_\+\+I\+D\+LE\hypertarget{group__smtp_gga116be79bf44f9dc2a97f46e051fe4dc0a29e5b0ecf75375b5a643faa3d6222b7c}{}\label{group__smtp_gga116be79bf44f9dc2a97f46e051fe4dc0a29e5b0ecf75375b5a643faa3d6222b7c}
+}]awaiting new email \index{L\+G\+S\+S\+M\+T\+P\+\_\+\+C\+O\+N\+N\+E\+C\+T\+I\+NG@{L\+G\+S\+S\+M\+T\+P\+\_\+\+C\+O\+N\+N\+E\+C\+T\+I\+NG}!Smtp@{Smtp}}\index{Smtp@{Smtp}!L\+G\+S\+S\+M\+T\+P\+\_\+\+C\+O\+N\+N\+E\+C\+T\+I\+NG@{L\+G\+S\+S\+M\+T\+P\+\_\+\+C\+O\+N\+N\+E\+C\+T\+I\+NG}}\item[{\em
+L\+G\+S\+S\+M\+T\+P\+\_\+\+C\+O\+N\+N\+E\+C\+T\+I\+NG\hypertarget{group__smtp_gga116be79bf44f9dc2a97f46e051fe4dc0ab89442b7a3ca2b94c3cdcf33756eb933}{}\label{group__smtp_gga116be79bf44f9dc2a97f46e051fe4dc0ab89442b7a3ca2b94c3cdcf33756eb933}
+}]opening tcp connection to M\+TA \index{L\+G\+S\+S\+M\+T\+P\+\_\+\+C\+O\+N\+N\+E\+C\+T\+ED@{L\+G\+S\+S\+M\+T\+P\+\_\+\+C\+O\+N\+N\+E\+C\+T\+ED}!Smtp@{Smtp}}\index{Smtp@{Smtp}!L\+G\+S\+S\+M\+T\+P\+\_\+\+C\+O\+N\+N\+E\+C\+T\+ED@{L\+G\+S\+S\+M\+T\+P\+\_\+\+C\+O\+N\+N\+E\+C\+T\+ED}}\item[{\em
+L\+G\+S\+S\+M\+T\+P\+\_\+\+C\+O\+N\+N\+E\+C\+T\+ED\hypertarget{group__smtp_gga116be79bf44f9dc2a97f46e051fe4dc0ab61778f70ecac007b334bb14942eb41d}{}\label{group__smtp_gga116be79bf44f9dc2a97f46e051fe4dc0ab61778f70ecac007b334bb14942eb41d}
+}]tcp connection to M\+TA is connected \index{L\+G\+S\+S\+M\+T\+P\+\_\+\+S\+E\+N\+T\+\_\+\+H\+E\+LO@{L\+G\+S\+S\+M\+T\+P\+\_\+\+S\+E\+N\+T\+\_\+\+H\+E\+LO}!Smtp@{Smtp}}\index{Smtp@{Smtp}!L\+G\+S\+S\+M\+T\+P\+\_\+\+S\+E\+N\+T\+\_\+\+H\+E\+LO@{L\+G\+S\+S\+M\+T\+P\+\_\+\+S\+E\+N\+T\+\_\+\+H\+E\+LO}}\item[{\em
+L\+G\+S\+S\+M\+T\+P\+\_\+\+S\+E\+N\+T\+\_\+\+H\+E\+LO\hypertarget{group__smtp_gga116be79bf44f9dc2a97f46e051fe4dc0a1dfec948a864205cec875f63cbe0d4ad}{}\label{group__smtp_gga116be79bf44f9dc2a97f46e051fe4dc0a1dfec948a864205cec875f63cbe0d4ad}
+}]sent the H\+E\+LO \index{L\+G\+S\+S\+M\+T\+P\+\_\+\+S\+E\+N\+T\+\_\+\+F\+R\+OM@{L\+G\+S\+S\+M\+T\+P\+\_\+\+S\+E\+N\+T\+\_\+\+F\+R\+OM}!Smtp@{Smtp}}\index{Smtp@{Smtp}!L\+G\+S\+S\+M\+T\+P\+\_\+\+S\+E\+N\+T\+\_\+\+F\+R\+OM@{L\+G\+S\+S\+M\+T\+P\+\_\+\+S\+E\+N\+T\+\_\+\+F\+R\+OM}}\item[{\em
+L\+G\+S\+S\+M\+T\+P\+\_\+\+S\+E\+N\+T\+\_\+\+F\+R\+OM\hypertarget{group__smtp_gga116be79bf44f9dc2a97f46e051fe4dc0a929bb4623ff3f585108aba2a1b047fab}{}\label{group__smtp_gga116be79bf44f9dc2a97f46e051fe4dc0a929bb4623ff3f585108aba2a1b047fab}
+}]sent F\+R\+OM \index{L\+G\+S\+S\+M\+T\+P\+\_\+\+S\+E\+N\+T\+\_\+\+TO@{L\+G\+S\+S\+M\+T\+P\+\_\+\+S\+E\+N\+T\+\_\+\+TO}!Smtp@{Smtp}}\index{Smtp@{Smtp}!L\+G\+S\+S\+M\+T\+P\+\_\+\+S\+E\+N\+T\+\_\+\+TO@{L\+G\+S\+S\+M\+T\+P\+\_\+\+S\+E\+N\+T\+\_\+\+TO}}\item[{\em
+L\+G\+S\+S\+M\+T\+P\+\_\+\+S\+E\+N\+T\+\_\+\+TO\hypertarget{group__smtp_gga116be79bf44f9dc2a97f46e051fe4dc0aae20a0cb95b97a70f6b45d0ed2d5be83}{}\label{group__smtp_gga116be79bf44f9dc2a97f46e051fe4dc0aae20a0cb95b97a70f6b45d0ed2d5be83}
+}]sent TO \index{L\+G\+S\+S\+M\+T\+P\+\_\+\+S\+E\+N\+T\+\_\+\+D\+A\+TA@{L\+G\+S\+S\+M\+T\+P\+\_\+\+S\+E\+N\+T\+\_\+\+D\+A\+TA}!Smtp@{Smtp}}\index{Smtp@{Smtp}!L\+G\+S\+S\+M\+T\+P\+\_\+\+S\+E\+N\+T\+\_\+\+D\+A\+TA@{L\+G\+S\+S\+M\+T\+P\+\_\+\+S\+E\+N\+T\+\_\+\+D\+A\+TA}}\item[{\em
+L\+G\+S\+S\+M\+T\+P\+\_\+\+S\+E\+N\+T\+\_\+\+D\+A\+TA\hypertarget{group__smtp_gga116be79bf44f9dc2a97f46e051fe4dc0a85e3c452950c09a79086bff4b9be5c14}{}\label{group__smtp_gga116be79bf44f9dc2a97f46e051fe4dc0a85e3c452950c09a79086bff4b9be5c14}
+}]sent D\+A\+TA request \index{L\+G\+S\+S\+M\+T\+P\+\_\+\+S\+E\+N\+T\+\_\+\+B\+O\+DY@{L\+G\+S\+S\+M\+T\+P\+\_\+\+S\+E\+N\+T\+\_\+\+B\+O\+DY}!Smtp@{Smtp}}\index{Smtp@{Smtp}!L\+G\+S\+S\+M\+T\+P\+\_\+\+S\+E\+N\+T\+\_\+\+B\+O\+DY@{L\+G\+S\+S\+M\+T\+P\+\_\+\+S\+E\+N\+T\+\_\+\+B\+O\+DY}}\item[{\em
+L\+G\+S\+S\+M\+T\+P\+\_\+\+S\+E\+N\+T\+\_\+\+B\+O\+DY\hypertarget{group__smtp_gga116be79bf44f9dc2a97f46e051fe4dc0a38fba41f28d754e38079b31418a86a69}{}\label{group__smtp_gga116be79bf44f9dc2a97f46e051fe4dc0a38fba41f28d754e38079b31418a86a69}
+}]sent the email body \index{L\+G\+S\+S\+M\+T\+P\+\_\+\+S\+E\+N\+T\+\_\+\+Q\+U\+IT@{L\+G\+S\+S\+M\+T\+P\+\_\+\+S\+E\+N\+T\+\_\+\+Q\+U\+IT}!Smtp@{Smtp}}\index{Smtp@{Smtp}!L\+G\+S\+S\+M\+T\+P\+\_\+\+S\+E\+N\+T\+\_\+\+Q\+U\+IT@{L\+G\+S\+S\+M\+T\+P\+\_\+\+S\+E\+N\+T\+\_\+\+Q\+U\+IT}}\item[{\em
+L\+G\+S\+S\+M\+T\+P\+\_\+\+S\+E\+N\+T\+\_\+\+Q\+U\+IT\hypertarget{group__smtp_gga116be79bf44f9dc2a97f46e051fe4dc0a2c2ed16ffc572326e3040684084b21d5}{}\label{group__smtp_gga116be79bf44f9dc2a97f46e051fe4dc0a2c2ed16ffc572326e3040684084b21d5}
+}]sent the session quit \end{description}
+\end{Desc}
+
+\begin{DoxyCode}
+3815 \{
+3816 \hyperlink{group__smtp_gga116be79bf44f9dc2a97f46e051fe4dc0a29e5b0ecf75375b5a643faa3d6222b7c}{LGSSMTP\_IDLE},
+3817 \hyperlink{group__smtp_gga116be79bf44f9dc2a97f46e051fe4dc0ab89442b7a3ca2b94c3cdcf33756eb933}{LGSSMTP\_CONNECTING},
+3818 \hyperlink{group__smtp_gga116be79bf44f9dc2a97f46e051fe4dc0ab61778f70ecac007b334bb14942eb41d}{LGSSMTP\_CONNECTED},
+3819 \hyperlink{group__smtp_gga116be79bf44f9dc2a97f46e051fe4dc0a1dfec948a864205cec875f63cbe0d4ad}{LGSSMTP\_SENT\_HELO},
+3820 \hyperlink{group__smtp_gga116be79bf44f9dc2a97f46e051fe4dc0a929bb4623ff3f585108aba2a1b047fab}{LGSSMTP\_SENT\_FROM},
+3821 \hyperlink{group__smtp_gga116be79bf44f9dc2a97f46e051fe4dc0aae20a0cb95b97a70f6b45d0ed2d5be83}{LGSSMTP\_SENT\_TO},
+3822 \hyperlink{group__smtp_gga116be79bf44f9dc2a97f46e051fe4dc0a85e3c452950c09a79086bff4b9be5c14}{LGSSMTP\_SENT\_DATA},
+3823 \hyperlink{group__smtp_gga116be79bf44f9dc2a97f46e051fe4dc0a38fba41f28d754e38079b31418a86a69}{LGSSMTP\_SENT\_BODY},
+3824 \hyperlink{group__smtp_gga116be79bf44f9dc2a97f46e051fe4dc0a2c2ed16ffc572326e3040684084b21d5}{LGSSMTP\_SENT\_QUIT},
+3825 \};
+\end{DoxyCode}
+
+
+\subsection{Function Documentation}
+\index{Smtp@{Smtp}!lws\+\_\+email\+\_\+check@{lws\+\_\+email\+\_\+check}}
+\index{lws\+\_\+email\+\_\+check@{lws\+\_\+email\+\_\+check}!Smtp@{Smtp}}
+\subsubsection[{\texorpdfstring{lws\+\_\+email\+\_\+check(struct lws\+\_\+email $\ast$email)}{lws\_email\_check(struct lws\_email *email)}}]{\setlength{\rightskip}{0pt plus 5cm}L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN void lws\+\_\+email\+\_\+check (
+\begin{DoxyParamCaption}
+\item[{struct {\bf lws\+\_\+email} $\ast$}]{email}
+\end{DoxyParamCaption}
+)}\hypertarget{group__smtp_ga5e535e346d92a9daf00be33abf79d4eb}{}\label{group__smtp_ga5e535e346d92a9daf00be33abf79d4eb}
+
+
+{\ttfamily \#include $<$\hyperlink{libwebsockets_8h}{lib/libwebsockets.\+h}$>$}
+
+\hyperlink{group__smtp_ga5e535e346d92a9daf00be33abf79d4eb}{lws\+\_\+email\+\_\+check()} -\/ Request check for new email
+
+
+\begin{DoxyParams}{Parameters}
+{\em email} & struct \hyperlink{structlws__email}{lws\+\_\+email} context to check\\
+\hline
+\end{DoxyParams}
+Schedules a check for new emails in 1s... call this when you have queued an email for send. \index{Smtp@{Smtp}!lws\+\_\+email\+\_\+destroy@{lws\+\_\+email\+\_\+destroy}}
+\index{lws\+\_\+email\+\_\+destroy@{lws\+\_\+email\+\_\+destroy}!Smtp@{Smtp}}
+\subsubsection[{\texorpdfstring{lws\+\_\+email\+\_\+destroy(struct lws\+\_\+email $\ast$email)}{lws\_email\_destroy(struct lws\_email *email)}}]{\setlength{\rightskip}{0pt plus 5cm}L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN void lws\+\_\+email\+\_\+destroy (
+\begin{DoxyParamCaption}
+\item[{struct {\bf lws\+\_\+email} $\ast$}]{email}
+\end{DoxyParamCaption}
+)}\hypertarget{group__smtp_ga25298a5afc1074e13b2d5711a86432b2}{}\label{group__smtp_ga25298a5afc1074e13b2d5711a86432b2}
+
+
+{\ttfamily \#include $<$\hyperlink{libwebsockets_8h}{lib/libwebsockets.\+h}$>$}
+
+\hyperlink{group__smtp_ga25298a5afc1074e13b2d5711a86432b2}{lws\+\_\+email\+\_\+destroy()} -\/ stop using the struct \hyperlink{structlws__email}{lws\+\_\+email}
+
+
+\begin{DoxyParams}{Parameters}
+{\em email} & the struct \hyperlink{structlws__email}{lws\+\_\+email} context\\
+\hline
+\end{DoxyParams}
+Stop sending email using email and free allocations \index{Smtp@{Smtp}!lws\+\_\+email\+\_\+init@{lws\+\_\+email\+\_\+init}}
+\index{lws\+\_\+email\+\_\+init@{lws\+\_\+email\+\_\+init}!Smtp@{Smtp}}
+\subsubsection[{\texorpdfstring{lws\+\_\+email\+\_\+init(struct lws\+\_\+email $\ast$email, uv\+\_\+loop\+\_\+t $\ast$loop, int max\+\_\+content)}{lws\_email\_init(struct lws\_email *email, uv\_loop\_t *loop, int max\_content)}}]{\setlength{\rightskip}{0pt plus 5cm}L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int lws\+\_\+email\+\_\+init (
+\begin{DoxyParamCaption}
+\item[{struct {\bf lws\+\_\+email} $\ast$}]{email, }
+\item[{uv\+\_\+loop\+\_\+t $\ast$}]{loop, }
+\item[{int}]{max\+\_\+content}
+\end{DoxyParamCaption}
+)}\hypertarget{group__smtp_ga77fc9b56a1bb39484844981ec375fc29}{}\label{group__smtp_ga77fc9b56a1bb39484844981ec375fc29}
+
+
+{\ttfamily \#include $<$\hyperlink{libwebsockets_8h}{lib/libwebsockets.\+h}$>$}
+
+\hyperlink{group__smtp_ga77fc9b56a1bb39484844981ec375fc29}{lws\+\_\+email\+\_\+init()} -\/ Initialize a struct \hyperlink{structlws__email}{lws\+\_\+email}
+
+
+\begin{DoxyParams}{Parameters}
+{\em email} & struct \hyperlink{structlws__email}{lws\+\_\+email} to init \\
+\hline
+{\em loop} & libuv loop to use \\
+\hline
+{\em max\+\_\+content} & max email content size\\
+\hline
+\end{DoxyParams}
+Prepares a struct \hyperlink{structlws__email}{lws\+\_\+email} for use ending S\+M\+TP
\ No newline at end of file
--- /dev/null
+\hypertarget{group__sock-adopt}{}\section{Socket adoption helpers}
+\label{group__sock-adopt}\index{Socket adoption helpers@{Socket adoption helpers}}
+\subsection*{Functions}
+\begin{DoxyCompactItemize}
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN struct lws $\ast$ \hyperlink{group__sock-adopt_gabe71b7462afb21c767bdc67334f305af}{lws\+\_\+adopt\+\_\+socket} (struct lws\+\_\+context $\ast$context, lws\+\_\+sockfd\+\_\+type accept\+\_\+fd)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN struct lws $\ast$ \hyperlink{group__sock-adopt_gab2d045df0f81afe00891aaed312d552b}{lws\+\_\+adopt\+\_\+socket\+\_\+readbuf} (struct lws\+\_\+context $\ast$context, lws\+\_\+sockfd\+\_\+type accept\+\_\+fd, const char $\ast$readbuf, size\+\_\+t len)
+\end{DoxyCompactItemize}
+
+
+\subsection{Detailed Description}
+\subsubsection*{Socket adoption helpers}
+
+When integrating with an external app with its own event loop, these can be used to accept connections from someone else\textquotesingle{}s listening socket.
+
+When using lws own event loop, these are not needed.
+
+\subsection{Function Documentation}
+\index{Socket adoption helpers@{Socket adoption helpers}!lws\+\_\+adopt\+\_\+socket@{lws\+\_\+adopt\+\_\+socket}}
+\index{lws\+\_\+adopt\+\_\+socket@{lws\+\_\+adopt\+\_\+socket}!Socket adoption helpers@{Socket adoption helpers}}
+\subsubsection[{\texorpdfstring{lws\+\_\+adopt\+\_\+socket(struct lws\+\_\+context $\ast$context, lws\+\_\+sockfd\+\_\+type accept\+\_\+fd)}{lws\_adopt\_socket(struct lws\_context *context, lws\_sockfd\_type accept\_fd)}}]{\setlength{\rightskip}{0pt plus 5cm}L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN struct lws$\ast$ lws\+\_\+adopt\+\_\+socket (
+\begin{DoxyParamCaption}
+\item[{struct lws\+\_\+context $\ast$}]{context, }
+\item[{lws\+\_\+sockfd\+\_\+type}]{accept\+\_\+fd}
+\end{DoxyParamCaption}
+)}\hypertarget{group__sock-adopt_gabe71b7462afb21c767bdc67334f305af}{}\label{group__sock-adopt_gabe71b7462afb21c767bdc67334f305af}
+
+
+{\ttfamily \#include $<$\hyperlink{libwebsockets_8h}{lib/libwebsockets.\+h}$>$}
+
+\hyperlink{group__sock-adopt_gabe71b7462afb21c767bdc67334f305af}{lws\+\_\+adopt\+\_\+socket()} -\/ adopt foreign socket as if listen socket accepted it
+\begin{DoxyParams}{Parameters}
+{\em context} & lws context \\
+\hline
+{\em accept\+\_\+fd} & fd of already-\/accepted socket to adopt\\
+\hline
+\end{DoxyParams}
+Either returns new wsi bound to accept\+\_\+fd, or closes accept\+\_\+fd and returns N\+U\+LL, having cleaned up any new wsi pieces.
+
+L\+WS adopts the socket in http serving mode, it\textquotesingle{}s ready to accept an upgrade to ws or just serve http. \index{Socket adoption helpers@{Socket adoption helpers}!lws\+\_\+adopt\+\_\+socket\+\_\+readbuf@{lws\+\_\+adopt\+\_\+socket\+\_\+readbuf}}
+\index{lws\+\_\+adopt\+\_\+socket\+\_\+readbuf@{lws\+\_\+adopt\+\_\+socket\+\_\+readbuf}!Socket adoption helpers@{Socket adoption helpers}}
+\subsubsection[{\texorpdfstring{lws\+\_\+adopt\+\_\+socket\+\_\+readbuf(struct lws\+\_\+context $\ast$context, lws\+\_\+sockfd\+\_\+type accept\+\_\+fd, const char $\ast$readbuf, size\+\_\+t len)}{lws\_adopt\_socket\_readbuf(struct lws\_context *context, lws\_sockfd\_type accept\_fd, const char *readbuf, size\_t len)}}]{\setlength{\rightskip}{0pt plus 5cm}L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN struct lws$\ast$ lws\+\_\+adopt\+\_\+socket\+\_\+readbuf (
+\begin{DoxyParamCaption}
+\item[{struct lws\+\_\+context $\ast$}]{context, }
+\item[{lws\+\_\+sockfd\+\_\+type}]{accept\+\_\+fd, }
+\item[{const char $\ast$}]{readbuf, }
+\item[{size\+\_\+t}]{len}
+\end{DoxyParamCaption}
+)}\hypertarget{group__sock-adopt_gab2d045df0f81afe00891aaed312d552b}{}\label{group__sock-adopt_gab2d045df0f81afe00891aaed312d552b}
+
+
+{\ttfamily \#include $<$\hyperlink{libwebsockets_8h}{lib/libwebsockets.\+h}$>$}
+
+\hyperlink{group__sock-adopt_gab2d045df0f81afe00891aaed312d552b}{lws\+\_\+adopt\+\_\+socket\+\_\+readbuf()} -\/ adopt foreign socket and first rx as if listen socket accepted it
+\begin{DoxyParams}{Parameters}
+{\em context} & lws context \\
+\hline
+{\em accept\+\_\+fd} & fd of already-\/accepted socket to adopt \\
+\hline
+{\em readbuf} & N\+U\+LL or pointer to data that must be drained before reading from accept\+\_\+fd \\
+\hline
+{\em len} & The length of the data held at \\
+\hline
+{\em readbuf} & Either returns new wsi bound to accept\+\_\+fd, or closes accept\+\_\+fd and returns N\+U\+LL, having cleaned up any new wsi pieces.\\
+\hline
+\end{DoxyParams}
+L\+WS adopts the socket in http serving mode, it\textquotesingle{}s ready to accept an upgrade to ws or just serve http.
+
+If your external code did not already read from the socket, you can use \hyperlink{group__sock-adopt_gabe71b7462afb21c767bdc67334f305af}{lws\+\_\+adopt\+\_\+socket()} instead.
+
+This api is guaranteed to use the data at
+\begin{DoxyParams}{Parameters}
+{\em readbuf} & first, before reading from the socket.\\
+\hline
+\end{DoxyParams}
+readbuf is limited to the size of the ah rx buf, currently 2048 bytes.
\ No newline at end of file
--- /dev/null
+\hypertarget{group__timeout}{}\section{Connection timeouts}
+\label{group__timeout}\index{Connection timeouts@{Connection timeouts}}
+\subsection*{Enumerations}
+\begin{DoxyCompactItemize}
+\item
+enum {\bfseries pending\+\_\+timeout} \{ \\*
+{\bfseries N\+O\+\_\+\+P\+E\+N\+D\+I\+N\+G\+\_\+\+T\+I\+M\+E\+O\+UT} = 0,
+{\bfseries P\+E\+N\+D\+I\+N\+G\+\_\+\+T\+I\+M\+E\+O\+U\+T\+\_\+\+A\+W\+A\+I\+T\+I\+N\+G\+\_\+\+P\+R\+O\+X\+Y\+\_\+\+R\+E\+S\+P\+O\+N\+SE} = 1,
+{\bfseries P\+E\+N\+D\+I\+N\+G\+\_\+\+T\+I\+M\+E\+O\+U\+T\+\_\+\+A\+W\+A\+I\+T\+I\+N\+G\+\_\+\+C\+O\+N\+N\+E\+C\+T\+\_\+\+R\+E\+S\+P\+O\+N\+SE} = 2,
+{\bfseries P\+E\+N\+D\+I\+N\+G\+\_\+\+T\+I\+M\+E\+O\+U\+T\+\_\+\+E\+S\+T\+A\+B\+L\+I\+S\+H\+\_\+\+W\+I\+T\+H\+\_\+\+S\+E\+R\+V\+ER} = 3,
+\\*
+{\bfseries P\+E\+N\+D\+I\+N\+G\+\_\+\+T\+I\+M\+E\+O\+U\+T\+\_\+\+A\+W\+A\+I\+T\+I\+N\+G\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+R\+E\+S\+P\+O\+N\+SE} = 4,
+{\bfseries P\+E\+N\+D\+I\+N\+G\+\_\+\+T\+I\+M\+E\+O\+U\+T\+\_\+\+A\+W\+A\+I\+T\+I\+N\+G\+\_\+\+P\+I\+NG} = 5,
+{\bfseries P\+E\+N\+D\+I\+N\+G\+\_\+\+T\+I\+M\+E\+O\+U\+T\+\_\+\+C\+L\+O\+S\+E\+\_\+\+A\+CK} = 6,
+{\bfseries P\+E\+N\+D\+I\+N\+G\+\_\+\+T\+I\+M\+E\+O\+U\+T\+\_\+\+A\+W\+A\+I\+T\+I\+N\+G\+\_\+\+E\+X\+T\+E\+N\+S\+I\+O\+N\+\_\+\+C\+O\+N\+N\+E\+C\+T\+\_\+\+R\+E\+S\+P\+O\+N\+SE} = 7,
+\\*
+{\bfseries P\+E\+N\+D\+I\+N\+G\+\_\+\+T\+I\+M\+E\+O\+U\+T\+\_\+\+S\+E\+N\+T\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+H\+A\+N\+D\+S\+H\+A\+KE} = 8,
+{\bfseries P\+E\+N\+D\+I\+N\+G\+\_\+\+T\+I\+M\+E\+O\+U\+T\+\_\+\+S\+S\+L\+\_\+\+A\+C\+C\+E\+PT} = 9,
+{\bfseries P\+E\+N\+D\+I\+N\+G\+\_\+\+T\+I\+M\+E\+O\+U\+T\+\_\+\+H\+T\+T\+P\+\_\+\+C\+O\+N\+T\+E\+NT} = 10,
+{\bfseries P\+E\+N\+D\+I\+N\+G\+\_\+\+T\+I\+M\+E\+O\+U\+T\+\_\+\+A\+W\+A\+I\+T\+I\+N\+G\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+H\+S\+\_\+\+S\+E\+ND} = 11,
+\\*
+{\bfseries P\+E\+N\+D\+I\+N\+G\+\_\+\+F\+L\+U\+S\+H\+\_\+\+S\+T\+O\+R\+E\+D\+\_\+\+S\+E\+N\+D\+\_\+\+B\+E\+F\+O\+R\+E\+\_\+\+C\+L\+O\+SE} = 12,
+{\bfseries P\+E\+N\+D\+I\+N\+G\+\_\+\+T\+I\+M\+E\+O\+U\+T\+\_\+\+S\+H\+U\+T\+D\+O\+W\+N\+\_\+\+F\+L\+U\+SH} = 13,
+{\bfseries P\+E\+N\+D\+I\+N\+G\+\_\+\+T\+I\+M\+E\+O\+U\+T\+\_\+\+C\+GI} = 14,
+{\bfseries P\+E\+N\+D\+I\+N\+G\+\_\+\+T\+I\+M\+E\+O\+U\+T\+\_\+\+H\+T\+T\+P\+\_\+\+K\+E\+E\+P\+A\+L\+I\+V\+E\+\_\+\+I\+D\+LE} = 15
+ \}\hypertarget{group__timeout_ga2c0aa4b9c3c55bae7b35cbfac3246c87}{}\label{group__timeout_ga2c0aa4b9c3c55bae7b35cbfac3246c87}
+
+\end{DoxyCompactItemize}
+\subsection*{Functions}
+\begin{DoxyCompactItemize}
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN void \hyperlink{group__timeout_gaced9f9237f6172fed9f730a2af51345a}{lws\+\_\+set\+\_\+timeout} (struct lws $\ast$wsi, enum pending\+\_\+timeout reason, int secs)
+\end{DoxyCompactItemize}
+
+
+\subsection{Detailed Description}
+A\+P\+Is related to setting connection timeouts
+
+\subsection{Function Documentation}
+\index{Connection timeouts@{Connection timeouts}!lws\+\_\+set\+\_\+timeout@{lws\+\_\+set\+\_\+timeout}}
+\index{lws\+\_\+set\+\_\+timeout@{lws\+\_\+set\+\_\+timeout}!Connection timeouts@{Connection timeouts}}
+\subsubsection[{\texorpdfstring{lws\+\_\+set\+\_\+timeout(struct lws $\ast$wsi, enum pending\+\_\+timeout reason, int secs)}{lws\_set\_timeout(struct lws *wsi, enum pending\_timeout reason, int secs)}}]{\setlength{\rightskip}{0pt plus 5cm}L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN void lws\+\_\+set\+\_\+timeout (
+\begin{DoxyParamCaption}
+\item[{struct lws $\ast$}]{wsi, }
+\item[{enum pending\+\_\+timeout}]{reason, }
+\item[{int}]{secs}
+\end{DoxyParamCaption}
+)}\hypertarget{group__timeout_gaced9f9237f6172fed9f730a2af51345a}{}\label{group__timeout_gaced9f9237f6172fed9f730a2af51345a}
+
+
+{\ttfamily \#include $<$\hyperlink{libwebsockets_8h}{lib/libwebsockets.\+h}$>$}
+
+\hyperlink{group__timeout_gaced9f9237f6172fed9f730a2af51345a}{lws\+\_\+set\+\_\+timeout()} -\/ marks the wsi as subject to a timeout
+
+You will not need this unless you are doing something special
+
+
+\begin{DoxyParams}{Parameters}
+{\em wsi} & Websocket connection instance \\
+\hline
+{\em reason} & timeout reason \\
+\hline
+{\em secs} & how many seconds \\
+\hline
+\end{DoxyParams}
--- /dev/null
+\hypertarget{group__urlendec}{}\section{Urlencode and Urldecode}
+\label{group__urlendec}\index{Urlencode and Urldecode@{Urlencode and Urldecode}}
+\subsection*{Functions}
+\begin{DoxyCompactItemize}
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN const char $\ast$ \hyperlink{group__urlendec_gabc2888476e50e001c875c1a8abf455b7}{lws\+\_\+urlencode} (char $\ast$escaped, const char $\ast$string, int len)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int \hyperlink{group__urlendec_gaa373a9c16acdd96c395af61ab915ece3}{lws\+\_\+urldecode} (char $\ast$string, const char $\ast$escaped, int len)
+\end{DoxyCompactItemize}
+
+
+\subsection{Detailed Description}
+\subsubsection*{H\+T\+ML chunked Substitution}
+
+A\+P\+Is for receiving chunks of text, replacing a set of variable names via a callback, and then prepending and appending H\+T\+ML chunked encoding headers.
+
+\subsection{Function Documentation}
+\index{Urlencode and Urldecode@{Urlencode and Urldecode}!lws\+\_\+urldecode@{lws\+\_\+urldecode}}
+\index{lws\+\_\+urldecode@{lws\+\_\+urldecode}!Urlencode and Urldecode@{Urlencode and Urldecode}}
+\subsubsection[{\texorpdfstring{lws\+\_\+urldecode(char $\ast$string, const char $\ast$escaped, int len)}{lws\_urldecode(char *string, const char *escaped, int len)}}]{\setlength{\rightskip}{0pt plus 5cm}L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int lws\+\_\+urldecode (
+\begin{DoxyParamCaption}
+\item[{char $\ast$}]{string, }
+\item[{const char $\ast$}]{escaped, }
+\item[{int}]{len}
+\end{DoxyParamCaption}
+)}\hypertarget{group__urlendec_gaa373a9c16acdd96c395af61ab915ece3}{}\label{group__urlendec_gaa373a9c16acdd96c395af61ab915ece3}
+
+
+{\ttfamily \#include $<$\hyperlink{libwebsockets_8h}{lib/libwebsockets.\+h}$>$}
+
+\hyperlink{group__urlendec_gaa373a9c16acdd96c395af61ab915ece3}{lws\+\_\+urldecode()} -\/ like strncpy but with urldecoding
+
+
+\begin{DoxyParams}{Parameters}
+{\em string} & output buffer \\
+\hline
+{\em escaped} & input buffer (\textquotesingle{}\textbackslash{}0\textquotesingle{} terminated) \\
+\hline
+{\em len} & output buffer max length\\
+\hline
+\end{DoxyParams}
+This is only useful for \textquotesingle{}\textbackslash{}0\textquotesingle{} terminated strings
+
+Since urldecoding only shrinks the output string, it is possible to do it in-\/place, ie, string == escaped \index{Urlencode and Urldecode@{Urlencode and Urldecode}!lws\+\_\+urlencode@{lws\+\_\+urlencode}}
+\index{lws\+\_\+urlencode@{lws\+\_\+urlencode}!Urlencode and Urldecode@{Urlencode and Urldecode}}
+\subsubsection[{\texorpdfstring{lws\+\_\+urlencode(char $\ast$escaped, const char $\ast$string, int len)}{lws\_urlencode(char *escaped, const char *string, int len)}}]{\setlength{\rightskip}{0pt plus 5cm}L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN const char$\ast$ lws\+\_\+urlencode (
+\begin{DoxyParamCaption}
+\item[{char $\ast$}]{escaped, }
+\item[{const char $\ast$}]{string, }
+\item[{int}]{len}
+\end{DoxyParamCaption}
+)}\hypertarget{group__urlendec_gabc2888476e50e001c875c1a8abf455b7}{}\label{group__urlendec_gabc2888476e50e001c875c1a8abf455b7}
+
+
+{\ttfamily \#include $<$\hyperlink{libwebsockets_8h}{lib/libwebsockets.\+h}$>$}
+
+\hyperlink{group__urlendec_gabc2888476e50e001c875c1a8abf455b7}{lws\+\_\+urlencode()} -\/ like strncpy but with urlencoding
+
+
+\begin{DoxyParams}{Parameters}
+{\em escaped} & output buffer \\
+\hline
+{\em string} & input buffer (\textquotesingle{}/0\textquotesingle{} terminated) \\
+\hline
+{\em len} & output buffer max length\\
+\hline
+\end{DoxyParams}
+Because urlencoding expands the output string, it\textquotesingle{}s not possible to do it in-\/place, ie, with escaped == string
\ No newline at end of file
--- /dev/null
+\hypertarget{group__usercb}{}\section{User Callback}
+\label{group__usercb}\index{User Callback@{User Callback}}
+\subsection*{Typedefs}
+\begin{DoxyCompactItemize}
+\item
+typedef int \hyperlink{group__usercb_gad4fcb82e68d60ffacca61a3f783a0a2f}{lws\+\_\+callback\+\_\+function}(struct lws $\ast$wsi, enum \hyperlink{group__usercb_gad62860e19975ba4c4af401c3cdb6abf7}{lws\+\_\+callback\+\_\+reasons} reason, void $\ast$user, void $\ast$in, size\+\_\+t len)
+\end{DoxyCompactItemize}
+\subsection*{Enumerations}
+\begin{DoxyCompactItemize}
+\item
+enum \hyperlink{group__usercb_gad62860e19975ba4c4af401c3cdb6abf7}{lws\+\_\+callback\+\_\+reasons} \{ \\*
+\hyperlink{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7a24d39bf1cfc0bad9d92da9ac1717e439}{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+E\+S\+T\+A\+B\+L\+I\+S\+H\+ED} = 0,
+\hyperlink{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7ad8c6207b0c4e732f3d507f0fb79370e8}{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+C\+O\+N\+N\+E\+C\+T\+I\+O\+N\+\_\+\+E\+R\+R\+OR} = 1,
+\hyperlink{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7aa536e574a642ff3ab9e12bff7ba2c6a2}{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+F\+I\+L\+T\+E\+R\+\_\+\+P\+R\+E\+\_\+\+E\+S\+T\+A\+B\+L\+I\+SH} = 2,
+\hyperlink{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7a7e12418eec9bce85735e6460176ab604}{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+E\+S\+T\+A\+B\+L\+I\+S\+H\+ED} = 3,
+\\*
+\hyperlink{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7a48a9590e5e18c7920282e094a0bfd9d8}{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+C\+L\+O\+S\+ED} = 4,
+\hyperlink{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7a838b18d255c1b94a533287ba302a2eba}{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+C\+L\+O\+S\+E\+D\+\_\+\+H\+T\+TP} = 5,
+\hyperlink{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7a492c1b1c0ac0ed980042ee732fe2990c}{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+R\+E\+C\+E\+I\+VE} = 6,
+\hyperlink{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7a2db02fc6e1c17ab62b52109d1aa9d738}{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+R\+E\+C\+E\+I\+V\+E\+\_\+\+P\+O\+NG} = 7,
+\\*
+\hyperlink{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7abbbe7a0a67c5866ca9109d46823fc5b1}{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+R\+E\+C\+E\+I\+VE} = 8,
+\hyperlink{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7a136a7cec11c3afd13245623bd84e76c9}{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+R\+E\+C\+E\+I\+V\+E\+\_\+\+P\+O\+NG} = 9,
+\hyperlink{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7a8e8b2e6dbeac76d8d126947d2166a514}{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+W\+R\+I\+T\+E\+A\+B\+LE} = 10,
+\hyperlink{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7a7ec8e2e9557ee02a4fc9f7dec7e2babc}{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+W\+R\+I\+T\+E\+A\+B\+LE} = 11,
+\\*
+\hyperlink{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7ae8d1de0bb56e03aa58cb4d44b18edd2e}{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+H\+T\+TP} = 12,
+\hyperlink{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7ac4c68e00efcf1ff7bda7ada462aff8ae}{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+H\+T\+T\+P\+\_\+\+B\+O\+DY} = 13,
+\hyperlink{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7a2fce9a8608220f32abbf1422a5498804}{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+H\+T\+T\+P\+\_\+\+B\+O\+D\+Y\+\_\+\+C\+O\+M\+P\+L\+E\+T\+I\+ON} = 14,
+\hyperlink{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7aa627548e1296e654fcfab463ec3c9587}{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+H\+T\+T\+P\+\_\+\+F\+I\+L\+E\+\_\+\+C\+O\+M\+P\+L\+E\+T\+I\+ON} = 15,
+\\*
+\hyperlink{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7afedadfb3cde37a8ea4c84ed535f26d09}{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+H\+T\+T\+P\+\_\+\+W\+R\+I\+T\+E\+A\+B\+LE} = 16,
+\hyperlink{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7a026502768778b8d79d62dd0fe4375fc6}{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+F\+I\+L\+T\+E\+R\+\_\+\+N\+E\+T\+W\+O\+R\+K\+\_\+\+C\+O\+N\+N\+E\+C\+T\+I\+ON} = 17,
+\hyperlink{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7a75199176c82c1a56e4a6bbf1cc30c12c}{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+F\+I\+L\+T\+E\+R\+\_\+\+H\+T\+T\+P\+\_\+\+C\+O\+N\+N\+E\+C\+T\+I\+ON} = 18,
+\hyperlink{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7ae9734e1d7af2abf291665ce9e4a728d3}{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+N\+E\+W\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+I\+N\+S\+T\+A\+N\+T\+I\+A\+T\+ED} = 19,
+\\*
+\hyperlink{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7accd8753672d319a30b4b4c2fb775e84d}{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+F\+I\+L\+T\+E\+R\+\_\+\+P\+R\+O\+T\+O\+C\+O\+L\+\_\+\+C\+O\+N\+N\+E\+C\+T\+I\+ON} = 20,
+\hyperlink{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7ae4986291b7a810fe290851d73bebeb1c}{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+O\+P\+E\+N\+S\+S\+L\+\_\+\+L\+O\+A\+D\+\_\+\+E\+X\+T\+R\+A\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+V\+E\+R\+I\+F\+Y\+\_\+\+C\+E\+R\+TS} = 21,
+\hyperlink{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7a06006e98d27e1e884364d88317f83493}{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+O\+P\+E\+N\+S\+S\+L\+\_\+\+L\+O\+A\+D\+\_\+\+E\+X\+T\+R\+A\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+V\+E\+R\+I\+F\+Y\+\_\+\+C\+E\+R\+TS} = 22,
+\hyperlink{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7ae5ad65d779b7eab32ab67ceff91a3bac}{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+O\+P\+E\+N\+S\+S\+L\+\_\+\+P\+E\+R\+F\+O\+R\+M\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+C\+E\+R\+T\+\_\+\+V\+E\+R\+I\+F\+I\+C\+A\+T\+I\+ON} = 23,
+\\*
+\hyperlink{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7a909cc2a7018864b0b71abacc4058fd8f}{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+A\+P\+P\+E\+N\+D\+\_\+\+H\+A\+N\+D\+S\+H\+A\+K\+E\+\_\+\+H\+E\+A\+D\+ER} = 24,
+\hyperlink{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7a390da3639296660a78cc1a5dcb19037e}{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+C\+O\+N\+F\+I\+R\+M\+\_\+\+E\+X\+T\+E\+N\+S\+I\+O\+N\+\_\+\+O\+K\+AY} = 25,
+\hyperlink{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7a1ce5b22039ca37ee224d00047596ea46}{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+C\+O\+N\+F\+I\+R\+M\+\_\+\+E\+X\+T\+E\+N\+S\+I\+O\+N\+\_\+\+S\+U\+P\+P\+O\+R\+T\+ED} = 26,
+\hyperlink{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7ad5d34583e3556e153eda91620b48cc49}{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+P\+R\+O\+T\+O\+C\+O\+L\+\_\+\+I\+N\+IT} = 27,
+\\*
+\hyperlink{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7a54269ca88508e6efd3afdb9d360a9caa}{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+P\+R\+O\+T\+O\+C\+O\+L\+\_\+\+D\+E\+S\+T\+R\+OY} = 28,
+\hyperlink{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7afd8fd77a1cc9405fcb4f26915d7f2d01}{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+W\+S\+I\+\_\+\+C\+R\+E\+A\+TE} = 29,
+\hyperlink{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7aca834dc035b7f7486f9ce40fde54fe9e}{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+W\+S\+I\+\_\+\+D\+E\+S\+T\+R\+OY} = 30,
+\hyperlink{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7adfb41c92e2522712207ef7f2462b5e34}{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+G\+E\+T\+\_\+\+T\+H\+R\+E\+A\+D\+\_\+\+ID} = 31,
+\\*
+\hyperlink{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7ab69783a9fbf2ca71ad70706bda77b412}{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+A\+D\+D\+\_\+\+P\+O\+L\+L\+\_\+\+FD} = 32,
+\hyperlink{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7a1df60f314710236f9b53efbf468da768}{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+D\+E\+L\+\_\+\+P\+O\+L\+L\+\_\+\+FD} = 33,
+\hyperlink{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7aa87d2e82fffa42c3680c7403ef94216e}{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+C\+H\+A\+N\+G\+E\+\_\+\+M\+O\+D\+E\+\_\+\+P\+O\+L\+L\+\_\+\+FD} = 34,
+\hyperlink{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7a8909732521d379179003d97ab7a05428}{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+L\+O\+C\+K\+\_\+\+P\+O\+LL} = 35,
+\\*
+\hyperlink{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7a0e9e3dd667c0c42cdbe1a3d921f4fd79}{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+U\+N\+L\+O\+C\+K\+\_\+\+P\+O\+LL} = 36,
+\hyperlink{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7aa46f705dcf97502e95627ffde614f98b}{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+O\+P\+E\+N\+S\+S\+L\+\_\+\+C\+O\+N\+T\+E\+X\+T\+\_\+\+R\+E\+Q\+U\+I\+R\+E\+S\+\_\+\+P\+R\+I\+V\+A\+T\+E\+\_\+\+K\+EY} = 37,
+\hyperlink{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7ac3fc5bbb55e69f90396526287ee84a51}{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+W\+S\+\_\+\+P\+E\+E\+R\+\_\+\+I\+N\+I\+T\+I\+A\+T\+E\+D\+\_\+\+C\+L\+O\+SE} = 38,
+{\bfseries L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+W\+S\+\_\+\+E\+X\+T\+\_\+\+D\+E\+F\+A\+U\+L\+TS} = 39,
+\\*
+{\bfseries L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+C\+GI} = 40,
+{\bfseries L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+C\+G\+I\+\_\+\+T\+E\+R\+M\+I\+N\+A\+T\+ED} = 41,
+{\bfseries L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+C\+G\+I\+\_\+\+S\+T\+D\+I\+N\+\_\+\+D\+A\+TA} = 42,
+{\bfseries L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+C\+G\+I\+\_\+\+S\+T\+D\+I\+N\+\_\+\+C\+O\+M\+P\+L\+E\+T\+ED} = 43,
+\\*
+{\bfseries L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+E\+S\+T\+A\+B\+L\+I\+S\+H\+E\+D\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+H\+T\+TP} = 44,
+{\bfseries L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+C\+L\+O\+S\+E\+D\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+H\+T\+TP} = 45,
+{\bfseries L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+R\+E\+C\+E\+I\+V\+E\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+H\+T\+TP} = 46,
+{\bfseries L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+C\+O\+M\+P\+L\+E\+T\+E\+D\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+H\+T\+TP} = 47,
+\\*
+{\bfseries L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+R\+E\+C\+E\+I\+V\+E\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+H\+T\+T\+P\+\_\+\+R\+E\+AD} = 48,
+{\bfseries L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+H\+T\+T\+P\+\_\+\+B\+I\+N\+D\+\_\+\+P\+R\+O\+T\+O\+C\+OL} = 49,
+{\bfseries L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+H\+T\+T\+P\+\_\+\+D\+R\+O\+P\+\_\+\+P\+R\+O\+T\+O\+C\+OL} = 50,
+{\bfseries L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+C\+H\+E\+C\+K\+\_\+\+A\+C\+C\+E\+S\+S\+\_\+\+R\+I\+G\+H\+TS} = 51,
+\\*
+{\bfseries L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+P\+R\+O\+C\+E\+S\+S\+\_\+\+H\+T\+ML} = 52,
+{\bfseries L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+A\+D\+D\+\_\+\+H\+E\+A\+D\+E\+RS} = 53,
+{\bfseries L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+S\+E\+S\+S\+I\+O\+N\+\_\+\+I\+N\+FO} = 54,
+{\bfseries L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+G\+S\+\_\+\+E\+V\+E\+NT} = 55,
+\\*
+\hyperlink{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7a982579753e70e59a9ea13ce628ac891a}{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+U\+S\+ER} = 1000
+ \}
+\end{DoxyCompactItemize}
+
+
+\subsection{Detailed Description}
+\subsubsection*{User protocol callback}
+
+The protocol callback is the primary way lws interacts with user code. For one of a list of a few dozen reasons the callback gets called at some event to be handled.
+
+All of the events can be ignored, returning 0 is taken as \char`\"{}\+O\+K\char`\"{} and returning nonzero in most cases indicates that the connection should be closed.
+
+\subsection{Typedef Documentation}
+\index{User Callback@{User Callback}!lws\+\_\+callback\+\_\+function@{lws\+\_\+callback\+\_\+function}}
+\index{lws\+\_\+callback\+\_\+function@{lws\+\_\+callback\+\_\+function}!User Callback@{User Callback}}
+\subsubsection[{\texorpdfstring{lws\+\_\+callback\+\_\+function}{lws\_callback\_function}}]{\setlength{\rightskip}{0pt plus 5cm}typedef int lws\+\_\+callback\+\_\+function(struct lws $\ast$wsi, enum {\bf lws\+\_\+callback\+\_\+reasons} reason, void $\ast$user, void $\ast$in, size\+\_\+t len)}\hypertarget{group__usercb_gad4fcb82e68d60ffacca61a3f783a0a2f}{}\label{group__usercb_gad4fcb82e68d60ffacca61a3f783a0a2f}
+
+
+{\ttfamily \#include $<$\hyperlink{libwebsockets_8h}{lib/libwebsockets.\+h}$>$}
+
+typedef \hyperlink{group__usercb_gad4fcb82e68d60ffacca61a3f783a0a2f}{lws\+\_\+callback\+\_\+function()} -\/ User server actions
+\begin{DoxyParams}{Parameters}
+{\em wsi} & Opaque websocket instance pointer \\
+\hline
+{\em reason} & The reason for the call \\
+\hline
+{\em user} & Pointer to per-\/session user data allocated by library \\
+\hline
+{\em in} & Pointer used for some callback reasons \\
+\hline
+{\em len} & Length set for some callback reasons \begin{DoxyVerb} This callback is the way the user controls what is served. All the
+ protocol detail is hidden and handled by the library.
+
+ For each connection / session there is user data allocated that is
+ pointed to by "user". You set the size of this user data area when
+ the library is initialized with lws_create_server.\end{DoxyVerb}
+ \\
+\hline
+\end{DoxyParams}
+
+
+\subsection{Enumeration Type Documentation}
+\index{User Callback@{User Callback}!lws\+\_\+callback\+\_\+reasons@{lws\+\_\+callback\+\_\+reasons}}
+\index{lws\+\_\+callback\+\_\+reasons@{lws\+\_\+callback\+\_\+reasons}!User Callback@{User Callback}}
+\subsubsection[{\texorpdfstring{lws\+\_\+callback\+\_\+reasons}{lws\_callback\_reasons}}]{\setlength{\rightskip}{0pt plus 5cm}enum {\bf lws\+\_\+callback\+\_\+reasons}}\hypertarget{group__usercb_gad62860e19975ba4c4af401c3cdb6abf7}{}\label{group__usercb_gad62860e19975ba4c4af401c3cdb6abf7}
+
+
+{\ttfamily \#include $<$\hyperlink{libwebsockets_8h}{lib/libwebsockets.\+h}$>$}
+
+enum lws\+\_\+callback\+\_\+reasons -\/ reason you\textquotesingle{}re getting a protocol callback \begin{Desc}
+\item[Enumerator]\par
+\begin{description}
+\index{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+E\+S\+T\+A\+B\+L\+I\+S\+H\+ED@{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+E\+S\+T\+A\+B\+L\+I\+S\+H\+ED}!User Callback@{User Callback}}\index{User Callback@{User Callback}!L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+E\+S\+T\+A\+B\+L\+I\+S\+H\+ED@{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+E\+S\+T\+A\+B\+L\+I\+S\+H\+ED}}\item[{\em
+L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+E\+S\+T\+A\+B\+L\+I\+S\+H\+ED\hypertarget{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7a24d39bf1cfc0bad9d92da9ac1717e439}{}\label{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7a24d39bf1cfc0bad9d92da9ac1717e439}
+}](VH) after the server completes a handshake with an incoming client. If you built the library with ssl support, in is a pointer to the ssl struct associated with the connection or N\+U\+LL. \index{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+C\+O\+N\+N\+E\+C\+T\+I\+O\+N\+\_\+\+E\+R\+R\+OR@{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+C\+O\+N\+N\+E\+C\+T\+I\+O\+N\+\_\+\+E\+R\+R\+OR}!User Callback@{User Callback}}\index{User Callback@{User Callback}!L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+C\+O\+N\+N\+E\+C\+T\+I\+O\+N\+\_\+\+E\+R\+R\+OR@{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+C\+O\+N\+N\+E\+C\+T\+I\+O\+N\+\_\+\+E\+R\+R\+OR}}\item[{\em
+L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+C\+O\+N\+N\+E\+C\+T\+I\+O\+N\+\_\+\+E\+R\+R\+OR\hypertarget{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7ad8c6207b0c4e732f3d507f0fb79370e8}{}\label{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7ad8c6207b0c4e732f3d507f0fb79370e8}
+}]the request client connection has been unable to complete a handshake with the remote server. If in is non-\/\+N\+U\+LL, you can find an error string of length len where it points to. \index{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+F\+I\+L\+T\+E\+R\+\_\+\+P\+R\+E\+\_\+\+E\+S\+T\+A\+B\+L\+I\+SH@{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+F\+I\+L\+T\+E\+R\+\_\+\+P\+R\+E\+\_\+\+E\+S\+T\+A\+B\+L\+I\+SH}!User Callback@{User Callback}}\index{User Callback@{User Callback}!L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+F\+I\+L\+T\+E\+R\+\_\+\+P\+R\+E\+\_\+\+E\+S\+T\+A\+B\+L\+I\+SH@{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+F\+I\+L\+T\+E\+R\+\_\+\+P\+R\+E\+\_\+\+E\+S\+T\+A\+B\+L\+I\+SH}}\item[{\em
+L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+F\+I\+L\+T\+E\+R\+\_\+\+P\+R\+E\+\_\+\+E\+S\+T\+A\+B\+L\+I\+SH\hypertarget{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7aa536e574a642ff3ab9e12bff7ba2c6a2}{}\label{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7aa536e574a642ff3ab9e12bff7ba2c6a2}
+}]this is the last chance for the client user code to examine the http headers and decide to reject the connection. If the content in the headers is interesting to the client (url, etc) it needs to copy it out at this point since it will be destroyed before the C\+L\+I\+E\+N\+T\+\_\+\+E\+S\+T\+A\+B\+L\+I\+S\+H\+ED call \index{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+E\+S\+T\+A\+B\+L\+I\+S\+H\+ED@{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+E\+S\+T\+A\+B\+L\+I\+S\+H\+ED}!User Callback@{User Callback}}\index{User Callback@{User Callback}!L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+E\+S\+T\+A\+B\+L\+I\+S\+H\+ED@{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+E\+S\+T\+A\+B\+L\+I\+S\+H\+ED}}\item[{\em
+L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+E\+S\+T\+A\+B\+L\+I\+S\+H\+ED\hypertarget{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7a7e12418eec9bce85735e6460176ab604}{}\label{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7a7e12418eec9bce85735e6460176ab604}
+}]after your client connection completed a handshake with the remote server \index{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+C\+L\+O\+S\+ED@{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+C\+L\+O\+S\+ED}!User Callback@{User Callback}}\index{User Callback@{User Callback}!L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+C\+L\+O\+S\+ED@{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+C\+L\+O\+S\+ED}}\item[{\em
+L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+C\+L\+O\+S\+ED\hypertarget{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7a48a9590e5e18c7920282e094a0bfd9d8}{}\label{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7a48a9590e5e18c7920282e094a0bfd9d8}
+}]when the websocket session ends \index{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+C\+L\+O\+S\+E\+D\+\_\+\+H\+T\+TP@{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+C\+L\+O\+S\+E\+D\+\_\+\+H\+T\+TP}!User Callback@{User Callback}}\index{User Callback@{User Callback}!L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+C\+L\+O\+S\+E\+D\+\_\+\+H\+T\+TP@{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+C\+L\+O\+S\+E\+D\+\_\+\+H\+T\+TP}}\item[{\em
+L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+C\+L\+O\+S\+E\+D\+\_\+\+H\+T\+TP\hypertarget{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7a838b18d255c1b94a533287ba302a2eba}{}\label{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7a838b18d255c1b94a533287ba302a2eba}
+}]when a H\+T\+TP (non-\/websocket) session ends \index{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+R\+E\+C\+E\+I\+VE@{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+R\+E\+C\+E\+I\+VE}!User Callback@{User Callback}}\index{User Callback@{User Callback}!L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+R\+E\+C\+E\+I\+VE@{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+R\+E\+C\+E\+I\+VE}}\item[{\em
+L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+R\+E\+C\+E\+I\+VE\hypertarget{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7a492c1b1c0ac0ed980042ee732fe2990c}{}\label{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7a492c1b1c0ac0ed980042ee732fe2990c}
+}]data has appeared for this server endpoint from a remote client, it can be found at $\ast$in and is len bytes long \index{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+R\+E\+C\+E\+I\+V\+E\+\_\+\+P\+O\+NG@{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+R\+E\+C\+E\+I\+V\+E\+\_\+\+P\+O\+NG}!User Callback@{User Callback}}\index{User Callback@{User Callback}!L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+R\+E\+C\+E\+I\+V\+E\+\_\+\+P\+O\+NG@{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+R\+E\+C\+E\+I\+V\+E\+\_\+\+P\+O\+NG}}\item[{\em
+L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+R\+E\+C\+E\+I\+V\+E\+\_\+\+P\+O\+NG\hypertarget{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7a2db02fc6e1c17ab62b52109d1aa9d738}{}\label{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7a2db02fc6e1c17ab62b52109d1aa9d738}
+}]servers receive P\+O\+NG packets with this callback reason \index{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+R\+E\+C\+E\+I\+VE@{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+R\+E\+C\+E\+I\+VE}!User Callback@{User Callback}}\index{User Callback@{User Callback}!L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+R\+E\+C\+E\+I\+VE@{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+R\+E\+C\+E\+I\+VE}}\item[{\em
+L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+R\+E\+C\+E\+I\+VE\hypertarget{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7abbbe7a0a67c5866ca9109d46823fc5b1}{}\label{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7abbbe7a0a67c5866ca9109d46823fc5b1}
+}]data has appeared from the server for the client connection, it can be found at $\ast$in and is len bytes long \index{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+R\+E\+C\+E\+I\+V\+E\+\_\+\+P\+O\+NG@{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+R\+E\+C\+E\+I\+V\+E\+\_\+\+P\+O\+NG}!User Callback@{User Callback}}\index{User Callback@{User Callback}!L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+R\+E\+C\+E\+I\+V\+E\+\_\+\+P\+O\+NG@{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+R\+E\+C\+E\+I\+V\+E\+\_\+\+P\+O\+NG}}\item[{\em
+L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+R\+E\+C\+E\+I\+V\+E\+\_\+\+P\+O\+NG\hypertarget{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7a136a7cec11c3afd13245623bd84e76c9}{}\label{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7a136a7cec11c3afd13245623bd84e76c9}
+}]clients receive P\+O\+NG packets with this callback reason \index{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+W\+R\+I\+T\+E\+A\+B\+LE@{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+W\+R\+I\+T\+E\+A\+B\+LE}!User Callback@{User Callback}}\index{User Callback@{User Callback}!L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+W\+R\+I\+T\+E\+A\+B\+LE@{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+W\+R\+I\+T\+E\+A\+B\+LE}}\item[{\em
+L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+W\+R\+I\+T\+E\+A\+B\+LE\hypertarget{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7a8e8b2e6dbeac76d8d126947d2166a514}{}\label{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7a8e8b2e6dbeac76d8d126947d2166a514}
+}]If you call \hyperlink{group__callback-when-writeable_ga941caaa468bc507b1cae52275f58800d}{lws\+\_\+callback\+\_\+on\+\_\+writable()} on a connection, you will get one of these callbacks coming when the connection socket is able to accept another write packet without blocking. If it already was able to take another packet without blocking, you\textquotesingle{}ll get this callback at the next call to the service loop function. Notice that C\+L\+I\+E\+N\+Ts get L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+W\+R\+I\+T\+E\+A\+B\+LE and servers get L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+W\+R\+I\+T\+E\+A\+B\+LE. \index{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+W\+R\+I\+T\+E\+A\+B\+LE@{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+W\+R\+I\+T\+E\+A\+B\+LE}!User Callback@{User Callback}}\index{User Callback@{User Callback}!L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+W\+R\+I\+T\+E\+A\+B\+LE@{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+W\+R\+I\+T\+E\+A\+B\+LE}}\item[{\em
+L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+W\+R\+I\+T\+E\+A\+B\+LE\hypertarget{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7a7ec8e2e9557ee02a4fc9f7dec7e2babc}{}\label{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7a7ec8e2e9557ee02a4fc9f7dec7e2babc}
+}]See L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+W\+R\+I\+T\+E\+A\+B\+LE \index{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+H\+T\+TP@{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+H\+T\+TP}!User Callback@{User Callback}}\index{User Callback@{User Callback}!L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+H\+T\+TP@{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+H\+T\+TP}}\item[{\em
+L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+H\+T\+TP\hypertarget{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7ae8d1de0bb56e03aa58cb4d44b18edd2e}{}\label{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7ae8d1de0bb56e03aa58cb4d44b18edd2e}
+}]an http request has come from a client that is not asking to upgrade the connection to a websocket one. This is a chance to serve http content, for example, to send a script to the client which will then open the websockets connection. in points to the U\+RI path requested and \hyperlink{group__httpft_gab393a06d3d2722af4c3f8b06842c80d7}{lws\+\_\+serve\+\_\+http\+\_\+file()} makes it very simple to send back a file to the client. Normally after sending the file you are done with the http connection, since the rest of the activity will come by websockets from the script that was delivered by http, so you will want to return 1; to close and free up the connection. \index{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+H\+T\+T\+P\+\_\+\+B\+O\+DY@{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+H\+T\+T\+P\+\_\+\+B\+O\+DY}!User Callback@{User Callback}}\index{User Callback@{User Callback}!L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+H\+T\+T\+P\+\_\+\+B\+O\+DY@{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+H\+T\+T\+P\+\_\+\+B\+O\+DY}}\item[{\em
+L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+H\+T\+T\+P\+\_\+\+B\+O\+DY\hypertarget{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7ac4c68e00efcf1ff7bda7ada462aff8ae}{}\label{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7ac4c68e00efcf1ff7bda7ada462aff8ae}
+}]the next len bytes data from the http request body H\+T\+TP connection is now available in in. \index{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+H\+T\+T\+P\+\_\+\+B\+O\+D\+Y\+\_\+\+C\+O\+M\+P\+L\+E\+T\+I\+ON@{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+H\+T\+T\+P\+\_\+\+B\+O\+D\+Y\+\_\+\+C\+O\+M\+P\+L\+E\+T\+I\+ON}!User Callback@{User Callback}}\index{User Callback@{User Callback}!L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+H\+T\+T\+P\+\_\+\+B\+O\+D\+Y\+\_\+\+C\+O\+M\+P\+L\+E\+T\+I\+ON@{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+H\+T\+T\+P\+\_\+\+B\+O\+D\+Y\+\_\+\+C\+O\+M\+P\+L\+E\+T\+I\+ON}}\item[{\em
+L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+H\+T\+T\+P\+\_\+\+B\+O\+D\+Y\+\_\+\+C\+O\+M\+P\+L\+E\+T\+I\+ON\hypertarget{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7a2fce9a8608220f32abbf1422a5498804}{}\label{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7a2fce9a8608220f32abbf1422a5498804}
+}]the expected amount of http request body has been delivered \index{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+H\+T\+T\+P\+\_\+\+F\+I\+L\+E\+\_\+\+C\+O\+M\+P\+L\+E\+T\+I\+ON@{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+H\+T\+T\+P\+\_\+\+F\+I\+L\+E\+\_\+\+C\+O\+M\+P\+L\+E\+T\+I\+ON}!User Callback@{User Callback}}\index{User Callback@{User Callback}!L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+H\+T\+T\+P\+\_\+\+F\+I\+L\+E\+\_\+\+C\+O\+M\+P\+L\+E\+T\+I\+ON@{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+H\+T\+T\+P\+\_\+\+F\+I\+L\+E\+\_\+\+C\+O\+M\+P\+L\+E\+T\+I\+ON}}\item[{\em
+L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+H\+T\+T\+P\+\_\+\+F\+I\+L\+E\+\_\+\+C\+O\+M\+P\+L\+E\+T\+I\+ON\hypertarget{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7aa627548e1296e654fcfab463ec3c9587}{}\label{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7aa627548e1296e654fcfab463ec3c9587}
+}]a file requested to be sent down http link has completed. \index{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+H\+T\+T\+P\+\_\+\+W\+R\+I\+T\+E\+A\+B\+LE@{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+H\+T\+T\+P\+\_\+\+W\+R\+I\+T\+E\+A\+B\+LE}!User Callback@{User Callback}}\index{User Callback@{User Callback}!L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+H\+T\+T\+P\+\_\+\+W\+R\+I\+T\+E\+A\+B\+LE@{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+H\+T\+T\+P\+\_\+\+W\+R\+I\+T\+E\+A\+B\+LE}}\item[{\em
+L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+H\+T\+T\+P\+\_\+\+W\+R\+I\+T\+E\+A\+B\+LE\hypertarget{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7afedadfb3cde37a8ea4c84ed535f26d09}{}\label{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7afedadfb3cde37a8ea4c84ed535f26d09}
+}]you can write more down the http protocol link now. \index{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+F\+I\+L\+T\+E\+R\+\_\+\+N\+E\+T\+W\+O\+R\+K\+\_\+\+C\+O\+N\+N\+E\+C\+T\+I\+ON@{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+F\+I\+L\+T\+E\+R\+\_\+\+N\+E\+T\+W\+O\+R\+K\+\_\+\+C\+O\+N\+N\+E\+C\+T\+I\+ON}!User Callback@{User Callback}}\index{User Callback@{User Callback}!L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+F\+I\+L\+T\+E\+R\+\_\+\+N\+E\+T\+W\+O\+R\+K\+\_\+\+C\+O\+N\+N\+E\+C\+T\+I\+ON@{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+F\+I\+L\+T\+E\+R\+\_\+\+N\+E\+T\+W\+O\+R\+K\+\_\+\+C\+O\+N\+N\+E\+C\+T\+I\+ON}}\item[{\em
+L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+F\+I\+L\+T\+E\+R\+\_\+\+N\+E\+T\+W\+O\+R\+K\+\_\+\+C\+O\+N\+N\+E\+C\+T\+I\+ON\hypertarget{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7a026502768778b8d79d62dd0fe4375fc6}{}\label{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7a026502768778b8d79d62dd0fe4375fc6}
+}]called when a client connects to the server at network level; the connection is accepted but then passed to this callback to decide whether to hang up immediately or not, based on the client IP. in contains the connection socket\textquotesingle{}s descriptor. Since the client connection information is not available yet, wsi still pointing to the main server socket. Return non-\/zero to terminate the connection before sending or receiving anything. Because this happens immediately after the network connection from the client, there\textquotesingle{}s no websocket protocol selected yet so this callback is issued only to protocol 0. \index{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+F\+I\+L\+T\+E\+R\+\_\+\+H\+T\+T\+P\+\_\+\+C\+O\+N\+N\+E\+C\+T\+I\+ON@{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+F\+I\+L\+T\+E\+R\+\_\+\+H\+T\+T\+P\+\_\+\+C\+O\+N\+N\+E\+C\+T\+I\+ON}!User Callback@{User Callback}}\index{User Callback@{User Callback}!L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+F\+I\+L\+T\+E\+R\+\_\+\+H\+T\+T\+P\+\_\+\+C\+O\+N\+N\+E\+C\+T\+I\+ON@{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+F\+I\+L\+T\+E\+R\+\_\+\+H\+T\+T\+P\+\_\+\+C\+O\+N\+N\+E\+C\+T\+I\+ON}}\item[{\em
+L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+F\+I\+L\+T\+E\+R\+\_\+\+H\+T\+T\+P\+\_\+\+C\+O\+N\+N\+E\+C\+T\+I\+ON\hypertarget{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7a75199176c82c1a56e4a6bbf1cc30c12c}{}\label{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7a75199176c82c1a56e4a6bbf1cc30c12c}
+}]called when the request has been received and parsed from the client, but the response is not sent yet. Return non-\/zero to disallow the connection. user is a pointer to the connection user space allocation, in is the U\+RI, eg, \char`\"{}/\char`\"{} In your handler you can use the public A\+P\+Is \hyperlink{group__HTTP-headers-read_ga8ade0e1ffb0da7e62b989d8d867bf6c8}{lws\+\_\+hdr\+\_\+total\+\_\+length()} / \hyperlink{group__HTTP-headers-read_ga6ce6aa1c0155ea42b7708bed271d1c77}{lws\+\_\+hdr\+\_\+copy()} to access all of the headers using the header enums lws\+\_\+token\+\_\+indexes from \hyperlink{libwebsockets_8h}{libwebsockets.\+h} to check for and read the supported header presence and content before deciding to allow the http connection to proceed or to kill the connection. \index{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+N\+E\+W\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+I\+N\+S\+T\+A\+N\+T\+I\+A\+T\+ED@{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+N\+E\+W\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+I\+N\+S\+T\+A\+N\+T\+I\+A\+T\+ED}!User Callback@{User Callback}}\index{User Callback@{User Callback}!L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+N\+E\+W\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+I\+N\+S\+T\+A\+N\+T\+I\+A\+T\+ED@{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+N\+E\+W\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+I\+N\+S\+T\+A\+N\+T\+I\+A\+T\+ED}}\item[{\em
+L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+N\+E\+W\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+I\+N\+S\+T\+A\+N\+T\+I\+A\+T\+ED\hypertarget{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7ae9734e1d7af2abf291665ce9e4a728d3}{}\label{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7ae9734e1d7af2abf291665ce9e4a728d3}
+}]A new client just had been connected, accepted, and instantiated into the pool. This callback allows setting any relevant property to it. Because this happens immediately after the instantiation of a new client, there\textquotesingle{}s no websocket protocol selected yet so this callback is issued only to protocol 0. Only wsi is defined, pointing to the new client, and the return value is ignored. \index{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+F\+I\+L\+T\+E\+R\+\_\+\+P\+R\+O\+T\+O\+C\+O\+L\+\_\+\+C\+O\+N\+N\+E\+C\+T\+I\+ON@{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+F\+I\+L\+T\+E\+R\+\_\+\+P\+R\+O\+T\+O\+C\+O\+L\+\_\+\+C\+O\+N\+N\+E\+C\+T\+I\+ON}!User Callback@{User Callback}}\index{User Callback@{User Callback}!L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+F\+I\+L\+T\+E\+R\+\_\+\+P\+R\+O\+T\+O\+C\+O\+L\+\_\+\+C\+O\+N\+N\+E\+C\+T\+I\+ON@{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+F\+I\+L\+T\+E\+R\+\_\+\+P\+R\+O\+T\+O\+C\+O\+L\+\_\+\+C\+O\+N\+N\+E\+C\+T\+I\+ON}}\item[{\em
+L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+F\+I\+L\+T\+E\+R\+\_\+\+P\+R\+O\+T\+O\+C\+O\+L\+\_\+\+C\+O\+N\+N\+E\+C\+T\+I\+ON\hypertarget{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7accd8753672d319a30b4b4c2fb775e84d}{}\label{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7accd8753672d319a30b4b4c2fb775e84d}
+}]called when the handshake has been received and parsed from the client, but the response is not sent yet. Return non-\/zero to disallow the connection. user is a pointer to the connection user space allocation, in is the requested protocol name In your handler you can use the public A\+P\+Is \hyperlink{group__HTTP-headers-read_ga8ade0e1ffb0da7e62b989d8d867bf6c8}{lws\+\_\+hdr\+\_\+total\+\_\+length()} / \hyperlink{group__HTTP-headers-read_ga6ce6aa1c0155ea42b7708bed271d1c77}{lws\+\_\+hdr\+\_\+copy()} to access all of the headers using the header enums lws\+\_\+token\+\_\+indexes from \hyperlink{libwebsockets_8h}{libwebsockets.\+h} to check for and read the supported header presence and content before deciding to allow the handshake to proceed or to kill the connection. \index{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+O\+P\+E\+N\+S\+S\+L\+\_\+\+L\+O\+A\+D\+\_\+\+E\+X\+T\+R\+A\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+V\+E\+R\+I\+F\+Y\+\_\+\+C\+E\+R\+TS@{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+O\+P\+E\+N\+S\+S\+L\+\_\+\+L\+O\+A\+D\+\_\+\+E\+X\+T\+R\+A\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+V\+E\+R\+I\+F\+Y\+\_\+\+C\+E\+R\+TS}!User Callback@{User Callback}}\index{User Callback@{User Callback}!L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+O\+P\+E\+N\+S\+S\+L\+\_\+\+L\+O\+A\+D\+\_\+\+E\+X\+T\+R\+A\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+V\+E\+R\+I\+F\+Y\+\_\+\+C\+E\+R\+TS@{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+O\+P\+E\+N\+S\+S\+L\+\_\+\+L\+O\+A\+D\+\_\+\+E\+X\+T\+R\+A\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+V\+E\+R\+I\+F\+Y\+\_\+\+C\+E\+R\+TS}}\item[{\em
+L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+O\+P\+E\+N\+S\+S\+L\+\_\+\+L\+O\+A\+D\+\_\+\+E\+X\+T\+R\+A\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+V\+E\+R\+I\+F\+Y\+\_\+\+C\+E\+R\+TS\hypertarget{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7ae4986291b7a810fe290851d73bebeb1c}{}\label{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7ae4986291b7a810fe290851d73bebeb1c}
+}]if configured for including Open\+S\+SL support, this callback allows your user code to perform extra S\+S\+L\+\_\+\+C\+T\+X\+\_\+load\+\_\+verify\+\_\+locations() or similar calls to direct Open\+S\+SL where to find certificates the client can use to confirm the remote server identity. user is the Open\+S\+SL S\+S\+L\+\_\+\+C\+T\+X$\ast$ \index{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+O\+P\+E\+N\+S\+S\+L\+\_\+\+L\+O\+A\+D\+\_\+\+E\+X\+T\+R\+A\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+V\+E\+R\+I\+F\+Y\+\_\+\+C\+E\+R\+TS@{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+O\+P\+E\+N\+S\+S\+L\+\_\+\+L\+O\+A\+D\+\_\+\+E\+X\+T\+R\+A\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+V\+E\+R\+I\+F\+Y\+\_\+\+C\+E\+R\+TS}!User Callback@{User Callback}}\index{User Callback@{User Callback}!L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+O\+P\+E\+N\+S\+S\+L\+\_\+\+L\+O\+A\+D\+\_\+\+E\+X\+T\+R\+A\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+V\+E\+R\+I\+F\+Y\+\_\+\+C\+E\+R\+TS@{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+O\+P\+E\+N\+S\+S\+L\+\_\+\+L\+O\+A\+D\+\_\+\+E\+X\+T\+R\+A\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+V\+E\+R\+I\+F\+Y\+\_\+\+C\+E\+R\+TS}}\item[{\em
+L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+O\+P\+E\+N\+S\+S\+L\+\_\+\+L\+O\+A\+D\+\_\+\+E\+X\+T\+R\+A\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+V\+E\+R\+I\+F\+Y\+\_\+\+C\+E\+R\+TS\hypertarget{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7a06006e98d27e1e884364d88317f83493}{}\label{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7a06006e98d27e1e884364d88317f83493}
+}]if configured for including Open\+S\+SL support, this callback allows your user code to load extra certifcates into the server which allow it to verify the validity of certificates returned by clients. user is the server\textquotesingle{}s Open\+S\+SL S\+S\+L\+\_\+\+C\+T\+X$\ast$ \index{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+O\+P\+E\+N\+S\+S\+L\+\_\+\+P\+E\+R\+F\+O\+R\+M\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+C\+E\+R\+T\+\_\+\+V\+E\+R\+I\+F\+I\+C\+A\+T\+I\+ON@{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+O\+P\+E\+N\+S\+S\+L\+\_\+\+P\+E\+R\+F\+O\+R\+M\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+C\+E\+R\+T\+\_\+\+V\+E\+R\+I\+F\+I\+C\+A\+T\+I\+ON}!User Callback@{User Callback}}\index{User Callback@{User Callback}!L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+O\+P\+E\+N\+S\+S\+L\+\_\+\+P\+E\+R\+F\+O\+R\+M\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+C\+E\+R\+T\+\_\+\+V\+E\+R\+I\+F\+I\+C\+A\+T\+I\+ON@{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+O\+P\+E\+N\+S\+S\+L\+\_\+\+P\+E\+R\+F\+O\+R\+M\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+C\+E\+R\+T\+\_\+\+V\+E\+R\+I\+F\+I\+C\+A\+T\+I\+ON}}\item[{\em
+L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+O\+P\+E\+N\+S\+S\+L\+\_\+\+P\+E\+R\+F\+O\+R\+M\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+C\+E\+R\+T\+\_\+\+V\+E\+R\+I\+F\+I\+C\+A\+T\+I\+ON\hypertarget{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7ae5ad65d779b7eab32ab67ceff91a3bac}{}\label{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7ae5ad65d779b7eab32ab67ceff91a3bac}
+}]if the libwebsockets vhost was created with the option L\+W\+S\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+R\+E\+Q\+U\+I\+R\+E\+\_\+\+V\+A\+L\+I\+D\+\_\+\+O\+P\+E\+N\+S\+S\+L\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+C\+E\+RT, then this callback is generated during Open\+S\+SL verification of the cert sent from the client. It is sent to protocol\mbox{[}0\mbox{]} callback as no protocol has been negotiated on the connection yet. Notice that the libwebsockets context and wsi are both N\+U\+LL during this callback. See \href{http://www.openssl.org/docs/ssl/SSL_CTX_set_verify.html}{\tt http\+://www.\+openssl.\+org/docs/ssl/\+S\+S\+L\+\_\+\+C\+T\+X\+\_\+set\+\_\+verify.\+html} to understand more detail about the Open\+S\+SL callback that generates this libwebsockets callback and the meanings of the arguments passed. In this callback, user is the x509\+\_\+ctx, in is the ssl pointer and len is preverify\+\_\+ok Notice that this callback maintains libwebsocket return conventions, return 0 to mean the cert is OK or 1 to fail it. This also means that if you don\textquotesingle{}t handle this callback then the default callback action of returning 0 allows the client certificates. \index{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+A\+P\+P\+E\+N\+D\+\_\+\+H\+A\+N\+D\+S\+H\+A\+K\+E\+\_\+\+H\+E\+A\+D\+ER@{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+A\+P\+P\+E\+N\+D\+\_\+\+H\+A\+N\+D\+S\+H\+A\+K\+E\+\_\+\+H\+E\+A\+D\+ER}!User Callback@{User Callback}}\index{User Callback@{User Callback}!L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+A\+P\+P\+E\+N\+D\+\_\+\+H\+A\+N\+D\+S\+H\+A\+K\+E\+\_\+\+H\+E\+A\+D\+ER@{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+A\+P\+P\+E\+N\+D\+\_\+\+H\+A\+N\+D\+S\+H\+A\+K\+E\+\_\+\+H\+E\+A\+D\+ER}}\item[{\em
+L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+A\+P\+P\+E\+N\+D\+\_\+\+H\+A\+N\+D\+S\+H\+A\+K\+E\+\_\+\+H\+E\+A\+D\+ER\hypertarget{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7a909cc2a7018864b0b71abacc4058fd8f}{}\label{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7a909cc2a7018864b0b71abacc4058fd8f}
+}]this callback happens when a client handshake is being compiled. user is N\+U\+LL, in is a char $\ast$$\ast$, it\textquotesingle{}s pointing to a char $\ast$ which holds the next location in the header buffer where you can add headers, and len is the remaining space in the header buffer, which is typically some hundreds of bytes. So, to add a canned cookie, your handler code might look similar to\+: \begin{DoxyVerb} char **p = (char **)in;
+
+ if (len < 100)
+ return 1;
+
+ *p += sprintf(*p, "Cookie: a=b\x0d\x0a");
+
+ return 0;
+\end{DoxyVerb}
+
+
+Notice if you add anything, you just have to take care about the C\+R\+LF on the line you added. Obviously this callback is optional, if you don\textquotesingle{}t handle it everything is fine.
+
+Notice the callback is coming to protocols\mbox{[}0\mbox{]} all the time, because there is no specific protocol negotiated yet. \index{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+C\+O\+N\+F\+I\+R\+M\+\_\+\+E\+X\+T\+E\+N\+S\+I\+O\+N\+\_\+\+O\+K\+AY@{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+C\+O\+N\+F\+I\+R\+M\+\_\+\+E\+X\+T\+E\+N\+S\+I\+O\+N\+\_\+\+O\+K\+AY}!User Callback@{User Callback}}\index{User Callback@{User Callback}!L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+C\+O\+N\+F\+I\+R\+M\+\_\+\+E\+X\+T\+E\+N\+S\+I\+O\+N\+\_\+\+O\+K\+AY@{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+C\+O\+N\+F\+I\+R\+M\+\_\+\+E\+X\+T\+E\+N\+S\+I\+O\+N\+\_\+\+O\+K\+AY}}\item[{\em
+L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+C\+O\+N\+F\+I\+R\+M\+\_\+\+E\+X\+T\+E\+N\+S\+I\+O\+N\+\_\+\+O\+K\+AY\hypertarget{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7a390da3639296660a78cc1a5dcb19037e}{}\label{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7a390da3639296660a78cc1a5dcb19037e}
+}]When the server handshake code sees that it does support a requested extension, before accepting the extension by additing to the list sent back to the client it gives this callback just to check that it\textquotesingle{}s okay to use that extension. It calls back to the requested protocol and with in being the extension name, len is 0 and user is valid. Note though at this time the E\+S\+T\+A\+B\+L\+I\+S\+H\+ED callback hasn\textquotesingle{}t happened yet so if you initialize user content there, user content during this callback might not be useful for anything. Notice this callback comes to protocols\mbox{[}0\mbox{]}. \index{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+C\+O\+N\+F\+I\+R\+M\+\_\+\+E\+X\+T\+E\+N\+S\+I\+O\+N\+\_\+\+S\+U\+P\+P\+O\+R\+T\+ED@{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+C\+O\+N\+F\+I\+R\+M\+\_\+\+E\+X\+T\+E\+N\+S\+I\+O\+N\+\_\+\+S\+U\+P\+P\+O\+R\+T\+ED}!User Callback@{User Callback}}\index{User Callback@{User Callback}!L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+C\+O\+N\+F\+I\+R\+M\+\_\+\+E\+X\+T\+E\+N\+S\+I\+O\+N\+\_\+\+S\+U\+P\+P\+O\+R\+T\+ED@{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+C\+O\+N\+F\+I\+R\+M\+\_\+\+E\+X\+T\+E\+N\+S\+I\+O\+N\+\_\+\+S\+U\+P\+P\+O\+R\+T\+ED}}\item[{\em
+L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+C\+O\+N\+F\+I\+R\+M\+\_\+\+E\+X\+T\+E\+N\+S\+I\+O\+N\+\_\+\+S\+U\+P\+P\+O\+R\+T\+ED\hypertarget{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7a1ce5b22039ca37ee224d00047596ea46}{}\label{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7a1ce5b22039ca37ee224d00047596ea46}
+}]When a client connection is being prepared to start a handshake to a server, each supported extension is checked with protocols\mbox{[}0\mbox{]} callback with this reason, giving the user code a chance to suppress the claim to support that extension by returning non-\/zero. If unhandled, by default 0 will be returned and the extension support included in the header to the server. Notice this callback comes to protocols\mbox{[}0\mbox{]}. \index{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+P\+R\+O\+T\+O\+C\+O\+L\+\_\+\+I\+N\+IT@{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+P\+R\+O\+T\+O\+C\+O\+L\+\_\+\+I\+N\+IT}!User Callback@{User Callback}}\index{User Callback@{User Callback}!L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+P\+R\+O\+T\+O\+C\+O\+L\+\_\+\+I\+N\+IT@{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+P\+R\+O\+T\+O\+C\+O\+L\+\_\+\+I\+N\+IT}}\item[{\em
+L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+P\+R\+O\+T\+O\+C\+O\+L\+\_\+\+I\+N\+IT\hypertarget{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7ad5d34583e3556e153eda91620b48cc49}{}\label{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7ad5d34583e3556e153eda91620b48cc49}
+}]One-\/time call per protocol, per-\/vhost using it, so it can do initial setup / allocations etc \index{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+P\+R\+O\+T\+O\+C\+O\+L\+\_\+\+D\+E\+S\+T\+R\+OY@{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+P\+R\+O\+T\+O\+C\+O\+L\+\_\+\+D\+E\+S\+T\+R\+OY}!User Callback@{User Callback}}\index{User Callback@{User Callback}!L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+P\+R\+O\+T\+O\+C\+O\+L\+\_\+\+D\+E\+S\+T\+R\+OY@{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+P\+R\+O\+T\+O\+C\+O\+L\+\_\+\+D\+E\+S\+T\+R\+OY}}\item[{\em
+L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+P\+R\+O\+T\+O\+C\+O\+L\+\_\+\+D\+E\+S\+T\+R\+OY\hypertarget{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7a54269ca88508e6efd3afdb9d360a9caa}{}\label{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7a54269ca88508e6efd3afdb9d360a9caa}
+}]One-\/time call per protocol, per-\/vhost using it, indicating this protocol won\textquotesingle{}t get used at all after this callback, the vhost is getting destroyed. Take the opportunity to deallocate everything that was allocated by the protocol. \index{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+W\+S\+I\+\_\+\+C\+R\+E\+A\+TE@{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+W\+S\+I\+\_\+\+C\+R\+E\+A\+TE}!User Callback@{User Callback}}\index{User Callback@{User Callback}!L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+W\+S\+I\+\_\+\+C\+R\+E\+A\+TE@{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+W\+S\+I\+\_\+\+C\+R\+E\+A\+TE}}\item[{\em
+L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+W\+S\+I\+\_\+\+C\+R\+E\+A\+TE\hypertarget{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7afd8fd77a1cc9405fcb4f26915d7f2d01}{}\label{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7afd8fd77a1cc9405fcb4f26915d7f2d01}
+}]outermost (earliest) wsi create notification to protocols\mbox{[}0\mbox{]} \index{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+W\+S\+I\+\_\+\+D\+E\+S\+T\+R\+OY@{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+W\+S\+I\+\_\+\+D\+E\+S\+T\+R\+OY}!User Callback@{User Callback}}\index{User Callback@{User Callback}!L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+W\+S\+I\+\_\+\+D\+E\+S\+T\+R\+OY@{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+W\+S\+I\+\_\+\+D\+E\+S\+T\+R\+OY}}\item[{\em
+L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+W\+S\+I\+\_\+\+D\+E\+S\+T\+R\+OY\hypertarget{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7aca834dc035b7f7486f9ce40fde54fe9e}{}\label{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7aca834dc035b7f7486f9ce40fde54fe9e}
+}]outermost (latest) wsi destroy notification to protocols\mbox{[}0\mbox{]} \index{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+G\+E\+T\+\_\+\+T\+H\+R\+E\+A\+D\+\_\+\+ID@{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+G\+E\+T\+\_\+\+T\+H\+R\+E\+A\+D\+\_\+\+ID}!User Callback@{User Callback}}\index{User Callback@{User Callback}!L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+G\+E\+T\+\_\+\+T\+H\+R\+E\+A\+D\+\_\+\+ID@{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+G\+E\+T\+\_\+\+T\+H\+R\+E\+A\+D\+\_\+\+ID}}\item[{\em
+L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+G\+E\+T\+\_\+\+T\+H\+R\+E\+A\+D\+\_\+\+ID\hypertarget{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7adfb41c92e2522712207ef7f2462b5e34}{}\label{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7adfb41c92e2522712207ef7f2462b5e34}
+}]lws can accept callback when writable requests from other threads, if you implement this callback and return an opaque current thread ID integer. \index{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+A\+D\+D\+\_\+\+P\+O\+L\+L\+\_\+\+FD@{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+A\+D\+D\+\_\+\+P\+O\+L\+L\+\_\+\+FD}!User Callback@{User Callback}}\index{User Callback@{User Callback}!L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+A\+D\+D\+\_\+\+P\+O\+L\+L\+\_\+\+FD@{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+A\+D\+D\+\_\+\+P\+O\+L\+L\+\_\+\+FD}}\item[{\em
+L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+A\+D\+D\+\_\+\+P\+O\+L\+L\+\_\+\+FD\hypertarget{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7ab69783a9fbf2ca71ad70706bda77b412}{}\label{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7ab69783a9fbf2ca71ad70706bda77b412}
+}]lws normally deals with its poll() or other event loop internally, but in the case you are integrating with another server you will need to have lws sockets share a polling array with the other server. This and the other P\+O\+L\+L\+\_\+\+FD related callbacks let you put your specialized poll array interface code in the callback for protocol 0, the first protocol you support, usually the H\+T\+TP protocol in the serving case. This callback happens when a socket needs to be added to the polling loop\+: in points to a struct \hyperlink{structlws__pollargs}{lws\+\_\+pollargs}; the fd member of the struct is the file descriptor, and events contains the active events
+
+If you are using the internal lws polling / event loop you can just ignore these callbacks. \index{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+D\+E\+L\+\_\+\+P\+O\+L\+L\+\_\+\+FD@{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+D\+E\+L\+\_\+\+P\+O\+L\+L\+\_\+\+FD}!User Callback@{User Callback}}\index{User Callback@{User Callback}!L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+D\+E\+L\+\_\+\+P\+O\+L\+L\+\_\+\+FD@{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+D\+E\+L\+\_\+\+P\+O\+L\+L\+\_\+\+FD}}\item[{\em
+L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+D\+E\+L\+\_\+\+P\+O\+L\+L\+\_\+\+FD\hypertarget{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7a1df60f314710236f9b53efbf468da768}{}\label{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7a1df60f314710236f9b53efbf468da768}
+}]This callback happens when a socket descriptor needs to be removed from an external polling array. in is again the struct \hyperlink{structlws__pollargs}{lws\+\_\+pollargs} containing the fd member to be removed. If you are using the internal polling loop, you can just ignore it. \index{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+C\+H\+A\+N\+G\+E\+\_\+\+M\+O\+D\+E\+\_\+\+P\+O\+L\+L\+\_\+\+FD@{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+C\+H\+A\+N\+G\+E\+\_\+\+M\+O\+D\+E\+\_\+\+P\+O\+L\+L\+\_\+\+FD}!User Callback@{User Callback}}\index{User Callback@{User Callback}!L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+C\+H\+A\+N\+G\+E\+\_\+\+M\+O\+D\+E\+\_\+\+P\+O\+L\+L\+\_\+\+FD@{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+C\+H\+A\+N\+G\+E\+\_\+\+M\+O\+D\+E\+\_\+\+P\+O\+L\+L\+\_\+\+FD}}\item[{\em
+L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+C\+H\+A\+N\+G\+E\+\_\+\+M\+O\+D\+E\+\_\+\+P\+O\+L\+L\+\_\+\+FD\hypertarget{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7aa87d2e82fffa42c3680c7403ef94216e}{}\label{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7aa87d2e82fffa42c3680c7403ef94216e}
+}]This callback happens when lws wants to modify the events for a connection. in is the struct \hyperlink{structlws__pollargs}{lws\+\_\+pollargs} with the fd to change. The new event mask is in events member and the old mask is in the prev\+\_\+events member. If you are using the internal polling loop, you can just ignore it. \index{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+L\+O\+C\+K\+\_\+\+P\+O\+LL@{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+L\+O\+C\+K\+\_\+\+P\+O\+LL}!User Callback@{User Callback}}\index{User Callback@{User Callback}!L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+L\+O\+C\+K\+\_\+\+P\+O\+LL@{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+L\+O\+C\+K\+\_\+\+P\+O\+LL}}\item[{\em
+L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+L\+O\+C\+K\+\_\+\+P\+O\+LL\hypertarget{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7a8909732521d379179003d97ab7a05428}{}\label{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7a8909732521d379179003d97ab7a05428}
+}]These allow the external poll changes driven by lws to participate in an external thread locking scheme around the changes, so the whole thing is threadsafe. These are called around three activities in the library,
+\begin{DoxyItemize}
+\item inserting a new wsi in the wsi / fd table (len=1)
+\item deleting a wsi from the wsi / fd table (len=1)
+\item changing a wsi\textquotesingle{}s P\+O\+L\+L\+I\+N/\+O\+UT state (len=0) Locking and unlocking external synchronization objects when len == 1 allows external threads to be synchronized against wsi lifecycle changes if it acquires the same lock for the duration of wsi dereference from the other thread context.
+\end{DoxyItemize}\index{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+U\+N\+L\+O\+C\+K\+\_\+\+P\+O\+LL@{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+U\+N\+L\+O\+C\+K\+\_\+\+P\+O\+LL}!User Callback@{User Callback}}\index{User Callback@{User Callback}!L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+U\+N\+L\+O\+C\+K\+\_\+\+P\+O\+LL@{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+U\+N\+L\+O\+C\+K\+\_\+\+P\+O\+LL}}\item[{\em
+L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+U\+N\+L\+O\+C\+K\+\_\+\+P\+O\+LL\hypertarget{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7a0e9e3dd667c0c42cdbe1a3d921f4fd79}{}\label{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7a0e9e3dd667c0c42cdbe1a3d921f4fd79}
+}]See L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+L\+O\+C\+K\+\_\+\+P\+O\+LL, ignore if using lws internal poll \index{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+O\+P\+E\+N\+S\+S\+L\+\_\+\+C\+O\+N\+T\+E\+X\+T\+\_\+\+R\+E\+Q\+U\+I\+R\+E\+S\+\_\+\+P\+R\+I\+V\+A\+T\+E\+\_\+\+K\+EY@{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+O\+P\+E\+N\+S\+S\+L\+\_\+\+C\+O\+N\+T\+E\+X\+T\+\_\+\+R\+E\+Q\+U\+I\+R\+E\+S\+\_\+\+P\+R\+I\+V\+A\+T\+E\+\_\+\+K\+EY}!User Callback@{User Callback}}\index{User Callback@{User Callback}!L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+O\+P\+E\+N\+S\+S\+L\+\_\+\+C\+O\+N\+T\+E\+X\+T\+\_\+\+R\+E\+Q\+U\+I\+R\+E\+S\+\_\+\+P\+R\+I\+V\+A\+T\+E\+\_\+\+K\+EY@{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+O\+P\+E\+N\+S\+S\+L\+\_\+\+C\+O\+N\+T\+E\+X\+T\+\_\+\+R\+E\+Q\+U\+I\+R\+E\+S\+\_\+\+P\+R\+I\+V\+A\+T\+E\+\_\+\+K\+EY}}\item[{\em
+L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+O\+P\+E\+N\+S\+S\+L\+\_\+\+C\+O\+N\+T\+E\+X\+T\+\_\+\+R\+E\+Q\+U\+I\+R\+E\+S\+\_\+\+P\+R\+I\+V\+A\+T\+E\+\_\+\+K\+EY\hypertarget{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7aa46f705dcf97502e95627ffde614f98b}{}\label{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7aa46f705dcf97502e95627ffde614f98b}
+}]if configured for including Open\+S\+SL support but no private key file has been specified (ssl\+\_\+private\+\_\+key\+\_\+filepath is N\+U\+LL), this is called to allow the user to set the private key directly via libopenssl and perform further operations if required; this might be useful in situations where the private key is not directly accessible by the OS, for example if it is stored on a smartcard. user is the server\textquotesingle{}s Open\+S\+SL S\+S\+L\+\_\+\+C\+T\+X$\ast$ \index{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+W\+S\+\_\+\+P\+E\+E\+R\+\_\+\+I\+N\+I\+T\+I\+A\+T\+E\+D\+\_\+\+C\+L\+O\+SE@{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+W\+S\+\_\+\+P\+E\+E\+R\+\_\+\+I\+N\+I\+T\+I\+A\+T\+E\+D\+\_\+\+C\+L\+O\+SE}!User Callback@{User Callback}}\index{User Callback@{User Callback}!L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+W\+S\+\_\+\+P\+E\+E\+R\+\_\+\+I\+N\+I\+T\+I\+A\+T\+E\+D\+\_\+\+C\+L\+O\+SE@{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+W\+S\+\_\+\+P\+E\+E\+R\+\_\+\+I\+N\+I\+T\+I\+A\+T\+E\+D\+\_\+\+C\+L\+O\+SE}}\item[{\em
+L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+W\+S\+\_\+\+P\+E\+E\+R\+\_\+\+I\+N\+I\+T\+I\+A\+T\+E\+D\+\_\+\+C\+L\+O\+SE\hypertarget{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7ac3fc5bbb55e69f90396526287ee84a51}{}\label{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7ac3fc5bbb55e69f90396526287ee84a51}
+}]The peer has sent an unsolicited Close WS packet. in and len are the optional close code (first 2 bytes, network order) and the optional additional information which is not defined in the standard, and may be a string or non-\/human-\/ readable data. If you return 0 lws will echo the close and then close the connection. If you return nonzero lws will just close the connection. \index{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+U\+S\+ER@{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+U\+S\+ER}!User Callback@{User Callback}}\index{User Callback@{User Callback}!L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+U\+S\+ER@{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+U\+S\+ER}}\item[{\em
+L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+U\+S\+ER\hypertarget{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7a982579753e70e59a9ea13ce628ac891a}{}\label{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7a982579753e70e59a9ea13ce628ac891a}
+}]user code can use any including / above without fear of clashes \end{description}
+\end{Desc}
+
+\begin{DoxyCode}
+571 \{
+572 \hyperlink{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7a24d39bf1cfc0bad9d92da9ac1717e439}{LWS\_CALLBACK\_ESTABLISHED} = 0,
+576 \hyperlink{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7ad8c6207b0c4e732f3d507f0fb79370e8}{LWS\_CALLBACK\_CLIENT\_CONNECTION\_ERROR} =
+ 1,
+580 \hyperlink{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7aa536e574a642ff3ab9e12bff7ba2c6a2}{LWS\_CALLBACK\_CLIENT\_FILTER\_PRE\_ESTABLISH} =
+ 2,
+587 \hyperlink{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7a7e12418eec9bce85735e6460176ab604}{LWS\_CALLBACK\_CLIENT\_ESTABLISHED} = 3,
+590 \hyperlink{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7a48a9590e5e18c7920282e094a0bfd9d8}{LWS\_CALLBACK\_CLOSED} = 4,
+592 \hyperlink{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7a838b18d255c1b94a533287ba302a2eba}{LWS\_CALLBACK\_CLOSED\_HTTP} = 5,
+594 \hyperlink{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7a492c1b1c0ac0ed980042ee732fe2990c}{LWS\_CALLBACK\_RECEIVE} = 6,
+598 \hyperlink{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7a2db02fc6e1c17ab62b52109d1aa9d738}{LWS\_CALLBACK\_RECEIVE\_PONG} = 7,
+600 \hyperlink{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7abbbe7a0a67c5866ca9109d46823fc5b1}{LWS\_CALLBACK\_CLIENT\_RECEIVE} = 8,
+603 \hyperlink{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7a136a7cec11c3afd13245623bd84e76c9}{LWS\_CALLBACK\_CLIENT\_RECEIVE\_PONG} = 9,
+605 \hyperlink{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7a8e8b2e6dbeac76d8d126947d2166a514}{LWS\_CALLBACK\_CLIENT\_WRITEABLE} = 10,
+613 \hyperlink{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7a7ec8e2e9557ee02a4fc9f7dec7e2babc}{LWS\_CALLBACK\_SERVER\_WRITEABLE} = 11,
+615 \hyperlink{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7ae8d1de0bb56e03aa58cb4d44b18edd2e}{LWS\_CALLBACK\_HTTP} = 12,
+629 \hyperlink{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7ac4c68e00efcf1ff7bda7ada462aff8ae}{LWS\_CALLBACK\_HTTP\_BODY} = 13,
+632 \hyperlink{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7a2fce9a8608220f32abbf1422a5498804}{LWS\_CALLBACK\_HTTP\_BODY\_COMPLETION} = 14,
+634 \hyperlink{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7aa627548e1296e654fcfab463ec3c9587}{LWS\_CALLBACK\_HTTP\_FILE\_COMPLETION} = 15,
+636 \hyperlink{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7afedadfb3cde37a8ea4c84ed535f26d09}{LWS\_CALLBACK\_HTTP\_WRITEABLE} = 16,
+638 \hyperlink{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7a026502768778b8d79d62dd0fe4375fc6}{LWS\_CALLBACK\_FILTER\_NETWORK\_CONNECTION} =
+ 17,
+649 \hyperlink{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7a75199176c82c1a56e4a6bbf1cc30c12c}{LWS\_CALLBACK\_FILTER\_HTTP\_CONNECTION} = 18,
+661 \hyperlink{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7ae9734e1d7af2abf291665ce9e4a728d3}{LWS\_CALLBACK\_SERVER\_NEW\_CLIENT\_INSTANTIATED} =
+ 19,
+669 \hyperlink{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7accd8753672d319a30b4b4c2fb775e84d}{LWS\_CALLBACK\_FILTER\_PROTOCOL\_CONNECTION} =
+ 20,
+681 \hyperlink{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7ae4986291b7a810fe290851d73bebeb1c}{LWS\_CALLBACK\_OPENSSL\_LOAD\_EXTRA\_CLIENT\_VERIFY\_CERTS}
+ = 21,
+688 \hyperlink{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7a06006e98d27e1e884364d88317f83493}{LWS\_CALLBACK\_OPENSSL\_LOAD\_EXTRA\_SERVER\_VERIFY\_CERTS}
+ = 22,
+694 \hyperlink{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7ae5ad65d779b7eab32ab67ceff91a3bac}{LWS\_CALLBACK\_OPENSSL\_PERFORM\_CLIENT\_CERT\_VERIFICATION}
+ = 23,
+712 \hyperlink{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7a909cc2a7018864b0b71abacc4058fd8f}{LWS\_CALLBACK\_CLIENT\_APPEND\_HANDSHAKE\_HEADER} =
+ 24,
+736 \hyperlink{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7a390da3639296660a78cc1a5dcb19037e}{LWS\_CALLBACK\_CONFIRM\_EXTENSION\_OKAY} = 25,
+747 \hyperlink{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7a1ce5b22039ca37ee224d00047596ea46}{LWS\_CALLBACK\_CLIENT\_CONFIRM\_EXTENSION\_SUPPORTED}
+ = 26,
+756 \hyperlink{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7ad5d34583e3556e153eda91620b48cc49}{LWS\_CALLBACK\_PROTOCOL\_INIT} = 27,
+759 \hyperlink{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7a54269ca88508e6efd3afdb9d360a9caa}{LWS\_CALLBACK\_PROTOCOL\_DESTROY} = 28,
+764 \hyperlink{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7afd8fd77a1cc9405fcb4f26915d7f2d01}{LWS\_CALLBACK\_WSI\_CREATE} = 29,
+766 \hyperlink{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7aca834dc035b7f7486f9ce40fde54fe9e}{LWS\_CALLBACK\_WSI\_DESTROY} = 30,
+768 \hyperlink{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7adfb41c92e2522712207ef7f2462b5e34}{LWS\_CALLBACK\_GET\_THREAD\_ID} = 31,
+773 \textcolor{comment}{/* external poll() management support */}
+774 \hyperlink{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7ab69783a9fbf2ca71ad70706bda77b412}{LWS\_CALLBACK\_ADD\_POLL\_FD} = 32,
+790 \hyperlink{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7a1df60f314710236f9b53efbf468da768}{LWS\_CALLBACK\_DEL\_POLL\_FD} = 33,
+796 \hyperlink{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7aa87d2e82fffa42c3680c7403ef94216e}{LWS\_CALLBACK\_CHANGE\_MODE\_POLL\_FD} = 34,
+804 \hyperlink{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7a8909732521d379179003d97ab7a05428}{LWS\_CALLBACK\_LOCK\_POLL} = 35,
+816 \hyperlink{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7a0e9e3dd667c0c42cdbe1a3d921f4fd79}{LWS\_CALLBACK\_UNLOCK\_POLL} = 36,
+819 \hyperlink{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7aa46f705dcf97502e95627ffde614f98b}{LWS\_CALLBACK\_OPENSSL\_CONTEXT\_REQUIRES\_PRIVATE\_KEY}
+ = 37,
+827 \hyperlink{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7ac3fc5bbb55e69f90396526287ee84a51}{LWS\_CALLBACK\_WS\_PEER\_INITIATED\_CLOSE} =
+ 38,
+836 LWS\_CALLBACK\_WS\_EXT\_DEFAULTS = 39,
+839 LWS\_CALLBACK\_CGI = 40,
+841 LWS\_CALLBACK\_CGI\_TERMINATED = 41,
+843 LWS\_CALLBACK\_CGI\_STDIN\_DATA = 42,
+845 LWS\_CALLBACK\_CGI\_STDIN\_COMPLETED = 43,
+847 LWS\_CALLBACK\_ESTABLISHED\_CLIENT\_HTTP = 44,
+849 LWS\_CALLBACK\_CLOSED\_CLIENT\_HTTP = 45,
+851 LWS\_CALLBACK\_RECEIVE\_CLIENT\_HTTP = 46,
+853 LWS\_CALLBACK\_COMPLETED\_CLIENT\_HTTP = 47,
+855 LWS\_CALLBACK\_RECEIVE\_CLIENT\_HTTP\_READ = 48,
+857 LWS\_CALLBACK\_HTTP\_BIND\_PROTOCOL = 49,
+859 LWS\_CALLBACK\_HTTP\_DROP\_PROTOCOL = 50,
+861 LWS\_CALLBACK\_CHECK\_ACCESS\_RIGHTS = 51,
+863 LWS\_CALLBACK\_PROCESS\_HTML = 52,
+865 LWS\_CALLBACK\_ADD\_HEADERS = 53,
+867 LWS\_CALLBACK\_SESSION\_INFO = 54,
+870 LWS\_CALLBACK\_GS\_EVENT = 55,
+873 \textcolor{comment}{/****** add new things just above ---^ ******/}
+874
+875 \hyperlink{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7a982579753e70e59a9ea13ce628ac891a}{LWS\_CALLBACK\_USER} = 1000,
+877 \};
+\end{DoxyCode}
--- /dev/null
+\hypertarget{group__uv}{}\section{libuv helpers}
+\label{group__uv}\index{libuv helpers@{libuv helpers}}
+\subsection*{Functions}
+\begin{DoxyCompactItemize}
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int {\bfseries lws\+\_\+uv\+\_\+sigint\+\_\+cfg} (struct lws\+\_\+context $\ast$context, int use\+\_\+uv\+\_\+sigint, uv\+\_\+signal\+\_\+cb cb)\hypertarget{group__uv_ga99099e045993383f251a8026e1e40414}{}\label{group__uv_ga99099e045993383f251a8026e1e40414}
+
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN void {\bfseries lws\+\_\+libuv\+\_\+run} (const struct lws\+\_\+context $\ast$context, int tsi)\hypertarget{group__uv_ga097c89497824d4de225a85a00661fc89}{}\label{group__uv_ga097c89497824d4de225a85a00661fc89}
+
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN void {\bfseries lws\+\_\+libuv\+\_\+stop} (struct lws\+\_\+context $\ast$context)\hypertarget{group__uv_ga3c75cd6ec3f80fc0a0c8ead4c4e71a15}{}\label{group__uv_ga3c75cd6ec3f80fc0a0c8ead4c4e71a15}
+
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int {\bfseries lws\+\_\+uv\+\_\+initloop} (struct lws\+\_\+context $\ast$context, uv\+\_\+loop\+\_\+t $\ast$loop, int tsi)\hypertarget{group__uv_gad85ce3bfc53ff754988d36bf5de39e21}{}\label{group__uv_gad85ce3bfc53ff754988d36bf5de39e21}
+
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN uv\+\_\+loop\+\_\+t $\ast$ {\bfseries lws\+\_\+uv\+\_\+getloop} (struct lws\+\_\+context $\ast$context, int tsi)\hypertarget{group__uv_gaa5e3593c94f91910d9d928dfa0c18f6c}{}\label{group__uv_gaa5e3593c94f91910d9d928dfa0c18f6c}
+
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN void {\bfseries lws\+\_\+uv\+\_\+sigint\+\_\+cb} (uv\+\_\+signal\+\_\+t $\ast$watcher, int signum)\hypertarget{group__uv_gac5f60dba13a45e5d554b4fb7df7b9610}{}\label{group__uv_gac5f60dba13a45e5d554b4fb7df7b9610}
+
+\end{DoxyCompactItemize}
+
+
+\subsection{Detailed Description}
+\subsubsection*{libuv helpers}
+
+A\+P\+Is specific to libuv event loop itegration
\ No newline at end of file
--- /dev/null
+\hypertarget{group__vhost-mounts}{}\section{Vhost mounts and options}
+\label{group__vhost-mounts}\index{Vhost mounts and options@{Vhost mounts and options}}
+\subsection*{Data Structures}
+\begin{DoxyCompactItemize}
+\item
+struct \hyperlink{structlws__protocol__vhost__options}{lws\+\_\+protocol\+\_\+vhost\+\_\+options}
+\item
+struct \hyperlink{structlws__http__mount}{lws\+\_\+http\+\_\+mount}
+\end{DoxyCompactItemize}
+\subsection*{Enumerations}
+\begin{DoxyCompactItemize}
+\item
+enum \hyperlink{group__vhost-mounts_ga31eca18e50cb4357480f2fcad36ff437}{lws\+\_\+mount\+\_\+protocols} \{ \\*
+\hyperlink{group__vhost-mounts_gga31eca18e50cb4357480f2fcad36ff437a1e9f0842b0e85db50fe648ed4ba9a4b0}{L\+W\+S\+M\+P\+R\+O\+\_\+\+H\+T\+TP} = 0,
+\hyperlink{group__vhost-mounts_gga31eca18e50cb4357480f2fcad36ff437afbd10eb4777517ed1f6bfdcf3b9ea1d1}{L\+W\+S\+M\+P\+R\+O\+\_\+\+H\+T\+T\+PS} = 1,
+\hyperlink{group__vhost-mounts_gga31eca18e50cb4357480f2fcad36ff437a42f2361cfe76cd287fa8fcfc502357e2}{L\+W\+S\+M\+P\+R\+O\+\_\+\+F\+I\+LE} = 2,
+\hyperlink{group__vhost-mounts_gga31eca18e50cb4357480f2fcad36ff437a13ab58b01ac6e05f595977f1e0f0db69}{L\+W\+S\+M\+P\+R\+O\+\_\+\+C\+GI} = 3,
+\\*
+\hyperlink{group__vhost-mounts_gga31eca18e50cb4357480f2fcad36ff437aec137a2434851bd856ceebfb697b9970}{L\+W\+S\+M\+P\+R\+O\+\_\+\+R\+E\+D\+I\+R\+\_\+\+H\+T\+TP} = 4,
+\hyperlink{group__vhost-mounts_gga31eca18e50cb4357480f2fcad36ff437a8894d16316863077dfe530963ca59f67}{L\+W\+S\+M\+P\+R\+O\+\_\+\+R\+E\+D\+I\+R\+\_\+\+H\+T\+T\+PS} = 5,
+\hyperlink{group__vhost-mounts_gga31eca18e50cb4357480f2fcad36ff437a946a88cf9c852eed2c0317f4115d19da}{L\+W\+S\+M\+P\+R\+O\+\_\+\+C\+A\+L\+L\+B\+A\+CK} = 6
+ \}
+\end{DoxyCompactItemize}
+
+
+\subsection{Detailed Description}
+\subsubsection*{Vhost mounts and options}
+
+\subsection{Enumeration Type Documentation}
+\index{Vhost mounts and options@{Vhost mounts and options}!lws\+\_\+mount\+\_\+protocols@{lws\+\_\+mount\+\_\+protocols}}
+\index{lws\+\_\+mount\+\_\+protocols@{lws\+\_\+mount\+\_\+protocols}!Vhost mounts and options@{Vhost mounts and options}}
+\subsubsection[{\texorpdfstring{lws\+\_\+mount\+\_\+protocols}{lws\_mount\_protocols}}]{\setlength{\rightskip}{0pt plus 5cm}enum {\bf lws\+\_\+mount\+\_\+protocols}}\hypertarget{group__vhost-mounts_ga31eca18e50cb4357480f2fcad36ff437}{}\label{group__vhost-mounts_ga31eca18e50cb4357480f2fcad36ff437}
+
+
+{\ttfamily \#include $<$\hyperlink{libwebsockets_8h}{lib/libwebsockets.\+h}$>$}
+
+enum lws\+\_\+mount\+\_\+protocols This specifies the mount protocol for a mountpoint, whether it is to be served from a filesystem, or it is a cgi etc. \begin{Desc}
+\item[Enumerator]\par
+\begin{description}
+\index{L\+W\+S\+M\+P\+R\+O\+\_\+\+H\+T\+TP@{L\+W\+S\+M\+P\+R\+O\+\_\+\+H\+T\+TP}!Vhost mounts and options@{Vhost mounts and options}}\index{Vhost mounts and options@{Vhost mounts and options}!L\+W\+S\+M\+P\+R\+O\+\_\+\+H\+T\+TP@{L\+W\+S\+M\+P\+R\+O\+\_\+\+H\+T\+TP}}\item[{\em
+L\+W\+S\+M\+P\+R\+O\+\_\+\+H\+T\+TP\hypertarget{group__vhost-mounts_gga31eca18e50cb4357480f2fcad36ff437a1e9f0842b0e85db50fe648ed4ba9a4b0}{}\label{group__vhost-mounts_gga31eca18e50cb4357480f2fcad36ff437a1e9f0842b0e85db50fe648ed4ba9a4b0}
+}]not supported yet \index{L\+W\+S\+M\+P\+R\+O\+\_\+\+H\+T\+T\+PS@{L\+W\+S\+M\+P\+R\+O\+\_\+\+H\+T\+T\+PS}!Vhost mounts and options@{Vhost mounts and options}}\index{Vhost mounts and options@{Vhost mounts and options}!L\+W\+S\+M\+P\+R\+O\+\_\+\+H\+T\+T\+PS@{L\+W\+S\+M\+P\+R\+O\+\_\+\+H\+T\+T\+PS}}\item[{\em
+L\+W\+S\+M\+P\+R\+O\+\_\+\+H\+T\+T\+PS\hypertarget{group__vhost-mounts_gga31eca18e50cb4357480f2fcad36ff437afbd10eb4777517ed1f6bfdcf3b9ea1d1}{}\label{group__vhost-mounts_gga31eca18e50cb4357480f2fcad36ff437afbd10eb4777517ed1f6bfdcf3b9ea1d1}
+}]not supported yet \index{L\+W\+S\+M\+P\+R\+O\+\_\+\+F\+I\+LE@{L\+W\+S\+M\+P\+R\+O\+\_\+\+F\+I\+LE}!Vhost mounts and options@{Vhost mounts and options}}\index{Vhost mounts and options@{Vhost mounts and options}!L\+W\+S\+M\+P\+R\+O\+\_\+\+F\+I\+LE@{L\+W\+S\+M\+P\+R\+O\+\_\+\+F\+I\+LE}}\item[{\em
+L\+W\+S\+M\+P\+R\+O\+\_\+\+F\+I\+LE\hypertarget{group__vhost-mounts_gga31eca18e50cb4357480f2fcad36ff437a42f2361cfe76cd287fa8fcfc502357e2}{}\label{group__vhost-mounts_gga31eca18e50cb4357480f2fcad36ff437a42f2361cfe76cd287fa8fcfc502357e2}
+}]serve from filesystem directory \index{L\+W\+S\+M\+P\+R\+O\+\_\+\+C\+GI@{L\+W\+S\+M\+P\+R\+O\+\_\+\+C\+GI}!Vhost mounts and options@{Vhost mounts and options}}\index{Vhost mounts and options@{Vhost mounts and options}!L\+W\+S\+M\+P\+R\+O\+\_\+\+C\+GI@{L\+W\+S\+M\+P\+R\+O\+\_\+\+C\+GI}}\item[{\em
+L\+W\+S\+M\+P\+R\+O\+\_\+\+C\+GI\hypertarget{group__vhost-mounts_gga31eca18e50cb4357480f2fcad36ff437a13ab58b01ac6e05f595977f1e0f0db69}{}\label{group__vhost-mounts_gga31eca18e50cb4357480f2fcad36ff437a13ab58b01ac6e05f595977f1e0f0db69}
+}]pass to C\+GI to handle \index{L\+W\+S\+M\+P\+R\+O\+\_\+\+R\+E\+D\+I\+R\+\_\+\+H\+T\+TP@{L\+W\+S\+M\+P\+R\+O\+\_\+\+R\+E\+D\+I\+R\+\_\+\+H\+T\+TP}!Vhost mounts and options@{Vhost mounts and options}}\index{Vhost mounts and options@{Vhost mounts and options}!L\+W\+S\+M\+P\+R\+O\+\_\+\+R\+E\+D\+I\+R\+\_\+\+H\+T\+TP@{L\+W\+S\+M\+P\+R\+O\+\_\+\+R\+E\+D\+I\+R\+\_\+\+H\+T\+TP}}\item[{\em
+L\+W\+S\+M\+P\+R\+O\+\_\+\+R\+E\+D\+I\+R\+\_\+\+H\+T\+TP\hypertarget{group__vhost-mounts_gga31eca18e50cb4357480f2fcad36ff437aec137a2434851bd856ceebfb697b9970}{}\label{group__vhost-mounts_gga31eca18e50cb4357480f2fcad36ff437aec137a2434851bd856ceebfb697b9970}
+}]redirect to \href{http://}{\tt http\+://} url \index{L\+W\+S\+M\+P\+R\+O\+\_\+\+R\+E\+D\+I\+R\+\_\+\+H\+T\+T\+PS@{L\+W\+S\+M\+P\+R\+O\+\_\+\+R\+E\+D\+I\+R\+\_\+\+H\+T\+T\+PS}!Vhost mounts and options@{Vhost mounts and options}}\index{Vhost mounts and options@{Vhost mounts and options}!L\+W\+S\+M\+P\+R\+O\+\_\+\+R\+E\+D\+I\+R\+\_\+\+H\+T\+T\+PS@{L\+W\+S\+M\+P\+R\+O\+\_\+\+R\+E\+D\+I\+R\+\_\+\+H\+T\+T\+PS}}\item[{\em
+L\+W\+S\+M\+P\+R\+O\+\_\+\+R\+E\+D\+I\+R\+\_\+\+H\+T\+T\+PS\hypertarget{group__vhost-mounts_gga31eca18e50cb4357480f2fcad36ff437a8894d16316863077dfe530963ca59f67}{}\label{group__vhost-mounts_gga31eca18e50cb4357480f2fcad36ff437a8894d16316863077dfe530963ca59f67}
+}]redirect to \href{https://}{\tt https\+://} url \index{L\+W\+S\+M\+P\+R\+O\+\_\+\+C\+A\+L\+L\+B\+A\+CK@{L\+W\+S\+M\+P\+R\+O\+\_\+\+C\+A\+L\+L\+B\+A\+CK}!Vhost mounts and options@{Vhost mounts and options}}\index{Vhost mounts and options@{Vhost mounts and options}!L\+W\+S\+M\+P\+R\+O\+\_\+\+C\+A\+L\+L\+B\+A\+CK@{L\+W\+S\+M\+P\+R\+O\+\_\+\+C\+A\+L\+L\+B\+A\+CK}}\item[{\em
+L\+W\+S\+M\+P\+R\+O\+\_\+\+C\+A\+L\+L\+B\+A\+CK\hypertarget{group__vhost-mounts_gga31eca18e50cb4357480f2fcad36ff437a946a88cf9c852eed2c0317f4115d19da}{}\label{group__vhost-mounts_gga31eca18e50cb4357480f2fcad36ff437a946a88cf9c852eed2c0317f4115d19da}
+}]hand by named protocol\textquotesingle{}s callback \end{description}
+\end{Desc}
+
+\begin{DoxyCode}
+1745 \{
+1746 \hyperlink{group__vhost-mounts_gga31eca18e50cb4357480f2fcad36ff437a1e9f0842b0e85db50fe648ed4ba9a4b0}{LWSMPRO\_HTTP} = 0,
+1747 \hyperlink{group__vhost-mounts_gga31eca18e50cb4357480f2fcad36ff437afbd10eb4777517ed1f6bfdcf3b9ea1d1}{LWSMPRO\_HTTPS} = 1,
+1748 \hyperlink{group__vhost-mounts_gga31eca18e50cb4357480f2fcad36ff437a42f2361cfe76cd287fa8fcfc502357e2}{LWSMPRO\_FILE} = 2,
+1749 \hyperlink{group__vhost-mounts_gga31eca18e50cb4357480f2fcad36ff437a13ab58b01ac6e05f595977f1e0f0db69}{LWSMPRO\_CGI} = 3,
+1750 \hyperlink{group__vhost-mounts_gga31eca18e50cb4357480f2fcad36ff437aec137a2434851bd856ceebfb697b9970}{LWSMPRO\_REDIR\_HTTP} = 4,
+1751 \hyperlink{group__vhost-mounts_gga31eca18e50cb4357480f2fcad36ff437a8894d16316863077dfe530963ca59f67}{LWSMPRO\_REDIR\_HTTPS} = 5,
+1752 \hyperlink{group__vhost-mounts_gga31eca18e50cb4357480f2fcad36ff437a946a88cf9c852eed2c0317f4115d19da}{LWSMPRO\_CALLBACK} = 6,
+1753 \};
+\end{DoxyCode}
--- /dev/null
+\hypertarget{group__wsclose}{}\section{Websocket Close}
+\label{group__wsclose}\index{Websocket Close@{Websocket Close}}
+\subsection*{Enumerations}
+\begin{DoxyCompactItemize}
+\item
+enum \hyperlink{group__wsclose_gae399c571df32ba532c0ca67da9284985}{lws\+\_\+close\+\_\+status} \{ \\*
+{\bfseries L\+W\+S\+\_\+\+C\+L\+O\+S\+E\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+N\+O\+S\+T\+A\+T\+US} = 0,
+\hyperlink{group__wsclose_ggae399c571df32ba532c0ca67da9284985a3ffa38d5081b85fb739e02a747ccf2c4}{L\+W\+S\+\_\+\+C\+L\+O\+S\+E\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+N\+O\+R\+M\+AL} = 1000,
+\hyperlink{group__wsclose_ggae399c571df32ba532c0ca67da9284985a9737a68759e739856b150ff9dfa30218}{L\+W\+S\+\_\+\+C\+L\+O\+S\+E\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+G\+O\+I\+N\+G\+A\+W\+AY} = 1001,
+\hyperlink{group__wsclose_ggae399c571df32ba532c0ca67da9284985a1bb501d212fa4d57053db681b1dfab98}{L\+W\+S\+\_\+\+C\+L\+O\+S\+E\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+P\+R\+O\+T\+O\+C\+O\+L\+\_\+\+E\+RR} = 1002,
+\\*
+\hyperlink{group__wsclose_ggae399c571df32ba532c0ca67da9284985a462c99b05459df700919cfd3f53c8276}{L\+W\+S\+\_\+\+C\+L\+O\+S\+E\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+U\+N\+A\+C\+C\+E\+P\+T\+A\+B\+L\+E\+\_\+\+O\+P\+C\+O\+DE} = 1003,
+\hyperlink{group__wsclose_ggae399c571df32ba532c0ca67da9284985af90cb98d983ad3d4c79df9b6f3d4a4d2}{L\+W\+S\+\_\+\+C\+L\+O\+S\+E\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+R\+E\+S\+E\+R\+V\+ED} = 1004,
+\hyperlink{group__wsclose_ggae399c571df32ba532c0ca67da9284985a4b8a3b7ce6f731e5248e4b0fb64a5044}{L\+W\+S\+\_\+\+C\+L\+O\+S\+E\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+N\+O\+\_\+\+S\+T\+A\+T\+US} = 1005,
+\hyperlink{group__wsclose_ggae399c571df32ba532c0ca67da9284985a68b3d34bebd88547dcfa5cadba0acd6c}{L\+W\+S\+\_\+\+C\+L\+O\+S\+E\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+A\+B\+N\+O\+R\+M\+A\+L\+\_\+\+C\+L\+O\+SE} = 1006,
+\\*
+\hyperlink{group__wsclose_ggae399c571df32ba532c0ca67da9284985a7aef2da0062da606eeb35aaca5cf9050}{L\+W\+S\+\_\+\+C\+L\+O\+S\+E\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+I\+N\+V\+A\+L\+I\+D\+\_\+\+P\+A\+Y\+L\+O\+AD} = 1007,
+\hyperlink{group__wsclose_ggae399c571df32ba532c0ca67da9284985ad09e68295eabdddcba4e332fbea70ae5}{L\+W\+S\+\_\+\+C\+L\+O\+S\+E\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+P\+O\+L\+I\+C\+Y\+\_\+\+V\+I\+O\+L\+A\+T\+I\+ON} = 1008,
+\hyperlink{group__wsclose_ggae399c571df32ba532c0ca67da9284985a2e1f0113494a58e762eed3d22e7080d8}{L\+W\+S\+\_\+\+C\+L\+O\+S\+E\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+M\+E\+S\+S\+A\+G\+E\+\_\+\+T\+O\+O\+\_\+\+L\+A\+R\+GE} = 1009,
+\hyperlink{group__wsclose_ggae399c571df32ba532c0ca67da9284985ac6a161822783ee873be1c66f48d14e0e}{L\+W\+S\+\_\+\+C\+L\+O\+S\+E\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+E\+X\+T\+E\+N\+S\+I\+O\+N\+\_\+\+R\+E\+Q\+U\+I\+R\+ED} = 1010,
+\\*
+\hyperlink{group__wsclose_ggae399c571df32ba532c0ca67da9284985ad0869604d79e13700ae5d196a431b350}{L\+W\+S\+\_\+\+C\+L\+O\+S\+E\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+U\+N\+E\+X\+P\+E\+C\+T\+E\+D\+\_\+\+C\+O\+N\+D\+I\+T\+I\+ON} = 1011,
+\hyperlink{group__wsclose_ggae399c571df32ba532c0ca67da9284985ad2b477a91c8445bf34ecd43977f9b390}{L\+W\+S\+\_\+\+C\+L\+O\+S\+E\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+T\+L\+S\+\_\+\+F\+A\+I\+L\+U\+RE} = 1015,
+{\bfseries L\+W\+S\+\_\+\+C\+L\+O\+S\+E\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+N\+O\+S\+T\+A\+T\+U\+S\+\_\+\+C\+O\+N\+T\+E\+X\+T\+\_\+\+D\+E\+S\+T\+R\+OY} = 9999
+ \}
+\end{DoxyCompactItemize}
+\subsection*{Functions}
+\begin{DoxyCompactItemize}
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN void \hyperlink{group__wsclose_gaa1c863415d1783cd8de7938aa6efa262}{lws\+\_\+close\+\_\+reason} (struct lws $\ast$wsi, enum \hyperlink{group__wsclose_gae399c571df32ba532c0ca67da9284985}{lws\+\_\+close\+\_\+status} status, unsigned char $\ast$buf, size\+\_\+t len)
+\end{DoxyCompactItemize}
+
+
+\subsection{Detailed Description}
+\subsubsection*{Websocket close frame control}
+
+When we close a ws connection, we can send a reason code and a short U\+T\+F-\/8 description back with the close packet.
+
+\subsection{Enumeration Type Documentation}
+\index{Websocket Close@{Websocket Close}!lws\+\_\+close\+\_\+status@{lws\+\_\+close\+\_\+status}}
+\index{lws\+\_\+close\+\_\+status@{lws\+\_\+close\+\_\+status}!Websocket Close@{Websocket Close}}
+\subsubsection[{\texorpdfstring{lws\+\_\+close\+\_\+status}{lws\_close\_status}}]{\setlength{\rightskip}{0pt plus 5cm}enum {\bf lws\+\_\+close\+\_\+status}}\hypertarget{group__wsclose_gae399c571df32ba532c0ca67da9284985}{}\label{group__wsclose_gae399c571df32ba532c0ca67da9284985}
+
+
+{\ttfamily \#include $<$\hyperlink{libwebsockets_8h}{lib/libwebsockets.\+h}$>$}
+
+enum lws\+\_\+close\+\_\+status -\/ R\+F\+C6455 close status codes \begin{Desc}
+\item[Enumerator]\par
+\begin{description}
+\index{L\+W\+S\+\_\+\+C\+L\+O\+S\+E\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+N\+O\+R\+M\+AL@{L\+W\+S\+\_\+\+C\+L\+O\+S\+E\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+N\+O\+R\+M\+AL}!Websocket Close@{Websocket Close}}\index{Websocket Close@{Websocket Close}!L\+W\+S\+\_\+\+C\+L\+O\+S\+E\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+N\+O\+R\+M\+AL@{L\+W\+S\+\_\+\+C\+L\+O\+S\+E\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+N\+O\+R\+M\+AL}}\item[{\em
+L\+W\+S\+\_\+\+C\+L\+O\+S\+E\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+N\+O\+R\+M\+AL\hypertarget{group__wsclose_ggae399c571df32ba532c0ca67da9284985a3ffa38d5081b85fb739e02a747ccf2c4}{}\label{group__wsclose_ggae399c571df32ba532c0ca67da9284985a3ffa38d5081b85fb739e02a747ccf2c4}
+}]1000 indicates a normal closure, meaning that the purpose for which the connection was established has been fulfilled. \index{L\+W\+S\+\_\+\+C\+L\+O\+S\+E\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+G\+O\+I\+N\+G\+A\+W\+AY@{L\+W\+S\+\_\+\+C\+L\+O\+S\+E\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+G\+O\+I\+N\+G\+A\+W\+AY}!Websocket Close@{Websocket Close}}\index{Websocket Close@{Websocket Close}!L\+W\+S\+\_\+\+C\+L\+O\+S\+E\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+G\+O\+I\+N\+G\+A\+W\+AY@{L\+W\+S\+\_\+\+C\+L\+O\+S\+E\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+G\+O\+I\+N\+G\+A\+W\+AY}}\item[{\em
+L\+W\+S\+\_\+\+C\+L\+O\+S\+E\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+G\+O\+I\+N\+G\+A\+W\+AY\hypertarget{group__wsclose_ggae399c571df32ba532c0ca67da9284985a9737a68759e739856b150ff9dfa30218}{}\label{group__wsclose_ggae399c571df32ba532c0ca67da9284985a9737a68759e739856b150ff9dfa30218}
+}]1001 indicates that an endpoint is \char`\"{}going away\char`\"{}, such as a server going down or a browser having navigated away from a page. \index{L\+W\+S\+\_\+\+C\+L\+O\+S\+E\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+P\+R\+O\+T\+O\+C\+O\+L\+\_\+\+E\+RR@{L\+W\+S\+\_\+\+C\+L\+O\+S\+E\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+P\+R\+O\+T\+O\+C\+O\+L\+\_\+\+E\+RR}!Websocket Close@{Websocket Close}}\index{Websocket Close@{Websocket Close}!L\+W\+S\+\_\+\+C\+L\+O\+S\+E\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+P\+R\+O\+T\+O\+C\+O\+L\+\_\+\+E\+RR@{L\+W\+S\+\_\+\+C\+L\+O\+S\+E\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+P\+R\+O\+T\+O\+C\+O\+L\+\_\+\+E\+RR}}\item[{\em
+L\+W\+S\+\_\+\+C\+L\+O\+S\+E\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+P\+R\+O\+T\+O\+C\+O\+L\+\_\+\+E\+RR\hypertarget{group__wsclose_ggae399c571df32ba532c0ca67da9284985a1bb501d212fa4d57053db681b1dfab98}{}\label{group__wsclose_ggae399c571df32ba532c0ca67da9284985a1bb501d212fa4d57053db681b1dfab98}
+}]1002 indicates that an endpoint is terminating the connection due to a protocol error. \index{L\+W\+S\+\_\+\+C\+L\+O\+S\+E\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+U\+N\+A\+C\+C\+E\+P\+T\+A\+B\+L\+E\+\_\+\+O\+P\+C\+O\+DE@{L\+W\+S\+\_\+\+C\+L\+O\+S\+E\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+U\+N\+A\+C\+C\+E\+P\+T\+A\+B\+L\+E\+\_\+\+O\+P\+C\+O\+DE}!Websocket Close@{Websocket Close}}\index{Websocket Close@{Websocket Close}!L\+W\+S\+\_\+\+C\+L\+O\+S\+E\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+U\+N\+A\+C\+C\+E\+P\+T\+A\+B\+L\+E\+\_\+\+O\+P\+C\+O\+DE@{L\+W\+S\+\_\+\+C\+L\+O\+S\+E\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+U\+N\+A\+C\+C\+E\+P\+T\+A\+B\+L\+E\+\_\+\+O\+P\+C\+O\+DE}}\item[{\em
+L\+W\+S\+\_\+\+C\+L\+O\+S\+E\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+U\+N\+A\+C\+C\+E\+P\+T\+A\+B\+L\+E\+\_\+\+O\+P\+C\+O\+DE\hypertarget{group__wsclose_ggae399c571df32ba532c0ca67da9284985a462c99b05459df700919cfd3f53c8276}{}\label{group__wsclose_ggae399c571df32ba532c0ca67da9284985a462c99b05459df700919cfd3f53c8276}
+}]1003 indicates that an endpoint is terminating the connection because it has received a type of data it cannot accept (e.\+g., an endpoint that understands only text data M\+AY send this if it receives a binary message). \index{L\+W\+S\+\_\+\+C\+L\+O\+S\+E\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+R\+E\+S\+E\+R\+V\+ED@{L\+W\+S\+\_\+\+C\+L\+O\+S\+E\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+R\+E\+S\+E\+R\+V\+ED}!Websocket Close@{Websocket Close}}\index{Websocket Close@{Websocket Close}!L\+W\+S\+\_\+\+C\+L\+O\+S\+E\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+R\+E\+S\+E\+R\+V\+ED@{L\+W\+S\+\_\+\+C\+L\+O\+S\+E\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+R\+E\+S\+E\+R\+V\+ED}}\item[{\em
+L\+W\+S\+\_\+\+C\+L\+O\+S\+E\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+R\+E\+S\+E\+R\+V\+ED\hypertarget{group__wsclose_ggae399c571df32ba532c0ca67da9284985af90cb98d983ad3d4c79df9b6f3d4a4d2}{}\label{group__wsclose_ggae399c571df32ba532c0ca67da9284985af90cb98d983ad3d4c79df9b6f3d4a4d2}
+}]Reserved. The specific meaning might be defined in the future. \index{L\+W\+S\+\_\+\+C\+L\+O\+S\+E\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+N\+O\+\_\+\+S\+T\+A\+T\+US@{L\+W\+S\+\_\+\+C\+L\+O\+S\+E\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+N\+O\+\_\+\+S\+T\+A\+T\+US}!Websocket Close@{Websocket Close}}\index{Websocket Close@{Websocket Close}!L\+W\+S\+\_\+\+C\+L\+O\+S\+E\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+N\+O\+\_\+\+S\+T\+A\+T\+US@{L\+W\+S\+\_\+\+C\+L\+O\+S\+E\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+N\+O\+\_\+\+S\+T\+A\+T\+US}}\item[{\em
+L\+W\+S\+\_\+\+C\+L\+O\+S\+E\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+N\+O\+\_\+\+S\+T\+A\+T\+US\hypertarget{group__wsclose_ggae399c571df32ba532c0ca67da9284985a4b8a3b7ce6f731e5248e4b0fb64a5044}{}\label{group__wsclose_ggae399c571df32ba532c0ca67da9284985a4b8a3b7ce6f731e5248e4b0fb64a5044}
+}]1005 is a reserved value and M\+U\+ST N\+OT be set as a status code in a Close control frame by an endpoint. It is designated for use in applications expecting a status code to indicate that no status code was actually present. \index{L\+W\+S\+\_\+\+C\+L\+O\+S\+E\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+A\+B\+N\+O\+R\+M\+A\+L\+\_\+\+C\+L\+O\+SE@{L\+W\+S\+\_\+\+C\+L\+O\+S\+E\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+A\+B\+N\+O\+R\+M\+A\+L\+\_\+\+C\+L\+O\+SE}!Websocket Close@{Websocket Close}}\index{Websocket Close@{Websocket Close}!L\+W\+S\+\_\+\+C\+L\+O\+S\+E\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+A\+B\+N\+O\+R\+M\+A\+L\+\_\+\+C\+L\+O\+SE@{L\+W\+S\+\_\+\+C\+L\+O\+S\+E\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+A\+B\+N\+O\+R\+M\+A\+L\+\_\+\+C\+L\+O\+SE}}\item[{\em
+L\+W\+S\+\_\+\+C\+L\+O\+S\+E\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+A\+B\+N\+O\+R\+M\+A\+L\+\_\+\+C\+L\+O\+SE\hypertarget{group__wsclose_ggae399c571df32ba532c0ca67da9284985a68b3d34bebd88547dcfa5cadba0acd6c}{}\label{group__wsclose_ggae399c571df32ba532c0ca67da9284985a68b3d34bebd88547dcfa5cadba0acd6c}
+}]1006 is a reserved value and M\+U\+ST N\+OT be set as a status code in a Close control frame by an endpoint. It is designated for use in applications expecting a status code to indicate that the connection was closed abnormally, e.\+g., without sending or receiving a Close control frame. \index{L\+W\+S\+\_\+\+C\+L\+O\+S\+E\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+I\+N\+V\+A\+L\+I\+D\+\_\+\+P\+A\+Y\+L\+O\+AD@{L\+W\+S\+\_\+\+C\+L\+O\+S\+E\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+I\+N\+V\+A\+L\+I\+D\+\_\+\+P\+A\+Y\+L\+O\+AD}!Websocket Close@{Websocket Close}}\index{Websocket Close@{Websocket Close}!L\+W\+S\+\_\+\+C\+L\+O\+S\+E\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+I\+N\+V\+A\+L\+I\+D\+\_\+\+P\+A\+Y\+L\+O\+AD@{L\+W\+S\+\_\+\+C\+L\+O\+S\+E\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+I\+N\+V\+A\+L\+I\+D\+\_\+\+P\+A\+Y\+L\+O\+AD}}\item[{\em
+L\+W\+S\+\_\+\+C\+L\+O\+S\+E\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+I\+N\+V\+A\+L\+I\+D\+\_\+\+P\+A\+Y\+L\+O\+AD\hypertarget{group__wsclose_ggae399c571df32ba532c0ca67da9284985a7aef2da0062da606eeb35aaca5cf9050}{}\label{group__wsclose_ggae399c571df32ba532c0ca67da9284985a7aef2da0062da606eeb35aaca5cf9050}
+}]1007 indicates that an endpoint is terminating the connection because it has received data within a message that was not consistent with the type of the message (e.\+g., non-\/\+U\+T\+F-\/8 \mbox{[}R\+F\+C3629\mbox{]} data within a text message). \index{L\+W\+S\+\_\+\+C\+L\+O\+S\+E\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+P\+O\+L\+I\+C\+Y\+\_\+\+V\+I\+O\+L\+A\+T\+I\+ON@{L\+W\+S\+\_\+\+C\+L\+O\+S\+E\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+P\+O\+L\+I\+C\+Y\+\_\+\+V\+I\+O\+L\+A\+T\+I\+ON}!Websocket Close@{Websocket Close}}\index{Websocket Close@{Websocket Close}!L\+W\+S\+\_\+\+C\+L\+O\+S\+E\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+P\+O\+L\+I\+C\+Y\+\_\+\+V\+I\+O\+L\+A\+T\+I\+ON@{L\+W\+S\+\_\+\+C\+L\+O\+S\+E\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+P\+O\+L\+I\+C\+Y\+\_\+\+V\+I\+O\+L\+A\+T\+I\+ON}}\item[{\em
+L\+W\+S\+\_\+\+C\+L\+O\+S\+E\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+P\+O\+L\+I\+C\+Y\+\_\+\+V\+I\+O\+L\+A\+T\+I\+ON\hypertarget{group__wsclose_ggae399c571df32ba532c0ca67da9284985ad09e68295eabdddcba4e332fbea70ae5}{}\label{group__wsclose_ggae399c571df32ba532c0ca67da9284985ad09e68295eabdddcba4e332fbea70ae5}
+}]1008 indicates that an endpoint is terminating the connection because it has received a message that violates its policy. This is a generic status code that can be returned when there is no other more suitable status code (e.\+g., 1003 or 1009) or if there is a need to hide specific details about the policy. \index{L\+W\+S\+\_\+\+C\+L\+O\+S\+E\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+M\+E\+S\+S\+A\+G\+E\+\_\+\+T\+O\+O\+\_\+\+L\+A\+R\+GE@{L\+W\+S\+\_\+\+C\+L\+O\+S\+E\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+M\+E\+S\+S\+A\+G\+E\+\_\+\+T\+O\+O\+\_\+\+L\+A\+R\+GE}!Websocket Close@{Websocket Close}}\index{Websocket Close@{Websocket Close}!L\+W\+S\+\_\+\+C\+L\+O\+S\+E\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+M\+E\+S\+S\+A\+G\+E\+\_\+\+T\+O\+O\+\_\+\+L\+A\+R\+GE@{L\+W\+S\+\_\+\+C\+L\+O\+S\+E\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+M\+E\+S\+S\+A\+G\+E\+\_\+\+T\+O\+O\+\_\+\+L\+A\+R\+GE}}\item[{\em
+L\+W\+S\+\_\+\+C\+L\+O\+S\+E\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+M\+E\+S\+S\+A\+G\+E\+\_\+\+T\+O\+O\+\_\+\+L\+A\+R\+GE\hypertarget{group__wsclose_ggae399c571df32ba532c0ca67da9284985a2e1f0113494a58e762eed3d22e7080d8}{}\label{group__wsclose_ggae399c571df32ba532c0ca67da9284985a2e1f0113494a58e762eed3d22e7080d8}
+}]1009 indicates that an endpoint is terminating the connection because it has received a message that is too big for it to process. \index{L\+W\+S\+\_\+\+C\+L\+O\+S\+E\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+E\+X\+T\+E\+N\+S\+I\+O\+N\+\_\+\+R\+E\+Q\+U\+I\+R\+ED@{L\+W\+S\+\_\+\+C\+L\+O\+S\+E\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+E\+X\+T\+E\+N\+S\+I\+O\+N\+\_\+\+R\+E\+Q\+U\+I\+R\+ED}!Websocket Close@{Websocket Close}}\index{Websocket Close@{Websocket Close}!L\+W\+S\+\_\+\+C\+L\+O\+S\+E\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+E\+X\+T\+E\+N\+S\+I\+O\+N\+\_\+\+R\+E\+Q\+U\+I\+R\+ED@{L\+W\+S\+\_\+\+C\+L\+O\+S\+E\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+E\+X\+T\+E\+N\+S\+I\+O\+N\+\_\+\+R\+E\+Q\+U\+I\+R\+ED}}\item[{\em
+L\+W\+S\+\_\+\+C\+L\+O\+S\+E\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+E\+X\+T\+E\+N\+S\+I\+O\+N\+\_\+\+R\+E\+Q\+U\+I\+R\+ED\hypertarget{group__wsclose_ggae399c571df32ba532c0ca67da9284985ac6a161822783ee873be1c66f48d14e0e}{}\label{group__wsclose_ggae399c571df32ba532c0ca67da9284985ac6a161822783ee873be1c66f48d14e0e}
+}]1010 indicates that an endpoint (client) is terminating the connection because it has expected the server to negotiate one or more extension, but the server didn\textquotesingle{}t return them in the response message of the Web\+Socket handshake. The list of extensions that are needed S\+H\+O\+U\+LD appear in the /reason/ part of the Close frame. Note that this status code is not used by the server, because it can fail the Web\+Socket handshake instead \index{L\+W\+S\+\_\+\+C\+L\+O\+S\+E\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+U\+N\+E\+X\+P\+E\+C\+T\+E\+D\+\_\+\+C\+O\+N\+D\+I\+T\+I\+ON@{L\+W\+S\+\_\+\+C\+L\+O\+S\+E\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+U\+N\+E\+X\+P\+E\+C\+T\+E\+D\+\_\+\+C\+O\+N\+D\+I\+T\+I\+ON}!Websocket Close@{Websocket Close}}\index{Websocket Close@{Websocket Close}!L\+W\+S\+\_\+\+C\+L\+O\+S\+E\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+U\+N\+E\+X\+P\+E\+C\+T\+E\+D\+\_\+\+C\+O\+N\+D\+I\+T\+I\+ON@{L\+W\+S\+\_\+\+C\+L\+O\+S\+E\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+U\+N\+E\+X\+P\+E\+C\+T\+E\+D\+\_\+\+C\+O\+N\+D\+I\+T\+I\+ON}}\item[{\em
+L\+W\+S\+\_\+\+C\+L\+O\+S\+E\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+U\+N\+E\+X\+P\+E\+C\+T\+E\+D\+\_\+\+C\+O\+N\+D\+I\+T\+I\+ON\hypertarget{group__wsclose_ggae399c571df32ba532c0ca67da9284985ad0869604d79e13700ae5d196a431b350}{}\label{group__wsclose_ggae399c571df32ba532c0ca67da9284985ad0869604d79e13700ae5d196a431b350}
+}]1011 indicates that a server is terminating the connection because it encountered an unexpected condition that prevented it from fulfilling the request. \index{L\+W\+S\+\_\+\+C\+L\+O\+S\+E\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+T\+L\+S\+\_\+\+F\+A\+I\+L\+U\+RE@{L\+W\+S\+\_\+\+C\+L\+O\+S\+E\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+T\+L\+S\+\_\+\+F\+A\+I\+L\+U\+RE}!Websocket Close@{Websocket Close}}\index{Websocket Close@{Websocket Close}!L\+W\+S\+\_\+\+C\+L\+O\+S\+E\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+T\+L\+S\+\_\+\+F\+A\+I\+L\+U\+RE@{L\+W\+S\+\_\+\+C\+L\+O\+S\+E\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+T\+L\+S\+\_\+\+F\+A\+I\+L\+U\+RE}}\item[{\em
+L\+W\+S\+\_\+\+C\+L\+O\+S\+E\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+T\+L\+S\+\_\+\+F\+A\+I\+L\+U\+RE\hypertarget{group__wsclose_ggae399c571df32ba532c0ca67da9284985ad2b477a91c8445bf34ecd43977f9b390}{}\label{group__wsclose_ggae399c571df32ba532c0ca67da9284985ad2b477a91c8445bf34ecd43977f9b390}
+}]1015 is a reserved value and M\+U\+ST N\+OT be set as a status code in a Close control frame by an endpoint. It is designated for use in applications expecting a status code to indicate that the connection was closed due to a failure to perform a T\+LS handshake (e.\+g., the server certificate can\textquotesingle{}t be verified). \end{description}
+\end{Desc}
+
+\begin{DoxyCode}
+461 \{
+462 LWS\_CLOSE\_STATUS\_NOSTATUS = 0,
+463 \hyperlink{group__wsclose_ggae399c571df32ba532c0ca67da9284985a3ffa38d5081b85fb739e02a747ccf2c4}{LWS\_CLOSE\_STATUS\_NORMAL} = 1000,
+466 \hyperlink{group__wsclose_ggae399c571df32ba532c0ca67da9284985a9737a68759e739856b150ff9dfa30218}{LWS\_CLOSE\_STATUS\_GOINGAWAY} = 1001,
+469 \hyperlink{group__wsclose_ggae399c571df32ba532c0ca67da9284985a1bb501d212fa4d57053db681b1dfab98}{LWS\_CLOSE\_STATUS\_PROTOCOL\_ERR} = 1002,
+472 \hyperlink{group__wsclose_ggae399c571df32ba532c0ca67da9284985a462c99b05459df700919cfd3f53c8276}{LWS\_CLOSE\_STATUS\_UNACCEPTABLE\_OPCODE} =
+ 1003,
+477 \hyperlink{group__wsclose_ggae399c571df32ba532c0ca67da9284985af90cb98d983ad3d4c79df9b6f3d4a4d2}{LWS\_CLOSE\_STATUS\_RESERVED} = 1004,
+479 \hyperlink{group__wsclose_ggae399c571df32ba532c0ca67da9284985a4b8a3b7ce6f731e5248e4b0fb64a5044}{LWS\_CLOSE\_STATUS\_NO\_STATUS} = 1005,
+484 \hyperlink{group__wsclose_ggae399c571df32ba532c0ca67da9284985a68b3d34bebd88547dcfa5cadba0acd6c}{LWS\_CLOSE\_STATUS\_ABNORMAL\_CLOSE} = 1006,
+490 \hyperlink{group__wsclose_ggae399c571df32ba532c0ca67da9284985a7aef2da0062da606eeb35aaca5cf9050}{LWS\_CLOSE\_STATUS\_INVALID\_PAYLOAD} = 1007,
+495 \hyperlink{group__wsclose_ggae399c571df32ba532c0ca67da9284985ad09e68295eabdddcba4e332fbea70ae5}{LWS\_CLOSE\_STATUS\_POLICY\_VIOLATION} = 1008,
+501 \hyperlink{group__wsclose_ggae399c571df32ba532c0ca67da9284985a2e1f0113494a58e762eed3d22e7080d8}{LWS\_CLOSE\_STATUS\_MESSAGE\_TOO\_LARGE} = 1009,
+505 \hyperlink{group__wsclose_ggae399c571df32ba532c0ca67da9284985ac6a161822783ee873be1c66f48d14e0e}{LWS\_CLOSE\_STATUS\_EXTENSION\_REQUIRED} = 1010,
+513 \hyperlink{group__wsclose_ggae399c571df32ba532c0ca67da9284985ad0869604d79e13700ae5d196a431b350}{LWS\_CLOSE\_STATUS\_UNEXPECTED\_CONDITION} =
+ 1011,
+517 \hyperlink{group__wsclose_ggae399c571df32ba532c0ca67da9284985ad2b477a91c8445bf34ecd43977f9b390}{LWS\_CLOSE\_STATUS\_TLS\_FAILURE} = 1015,
+524 \textcolor{comment}{/****** add new things just above ---^ ******/}
+525
+526 LWS\_CLOSE\_STATUS\_NOSTATUS\_CONTEXT\_DESTROY = 9999,
+527 \};
+\end{DoxyCode}
+
+
+\subsection{Function Documentation}
+\index{Websocket Close@{Websocket Close}!lws\+\_\+close\+\_\+reason@{lws\+\_\+close\+\_\+reason}}
+\index{lws\+\_\+close\+\_\+reason@{lws\+\_\+close\+\_\+reason}!Websocket Close@{Websocket Close}}
+\subsubsection[{\texorpdfstring{lws\+\_\+close\+\_\+reason(struct lws $\ast$wsi, enum lws\+\_\+close\+\_\+status status, unsigned char $\ast$buf, size\+\_\+t len)}{lws\_close\_reason(struct lws *wsi, enum lws\_close\_status status, unsigned char *buf, size\_t len)}}]{\setlength{\rightskip}{0pt plus 5cm}L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN void lws\+\_\+close\+\_\+reason (
+\begin{DoxyParamCaption}
+\item[{struct lws $\ast$}]{wsi, }
+\item[{enum {\bf lws\+\_\+close\+\_\+status}}]{status, }
+\item[{unsigned char $\ast$}]{buf, }
+\item[{size\+\_\+t}]{len}
+\end{DoxyParamCaption}
+)}\hypertarget{group__wsclose_gaa1c863415d1783cd8de7938aa6efa262}{}\label{group__wsclose_gaa1c863415d1783cd8de7938aa6efa262}
+
+
+{\ttfamily \#include $<$\hyperlink{libwebsockets_8h}{lib/libwebsockets.\+h}$>$}
+
+lws\+\_\+close\+\_\+reason -\/ Set reason and aux data to send with Close packet If you are going to return nonzero from the callback requesting the connection to close, you can optionally call this to set the reason the peer will be told if possible.
+
+
+\begin{DoxyParams}{Parameters}
+{\em wsi} & The websocket connection to set the close reason on \\
+\hline
+{\em status} & A valid close status from websocket standard \\
+\hline
+{\em buf} & N\+U\+LL or buffer containing up to 124 bytes of auxiliary data \\
+\hline
+{\em len} & Length of data in \\
+\hline
+{\em buf} & to send \\
+\hline
+\end{DoxyParams}
--- /dev/null
+\hypertarget{group__wsstatus}{}\section{Websocket status A\+P\+Is}
+\label{group__wsstatus}\index{Websocket status A\+P\+Is@{Websocket status A\+P\+Is}}
+\subsection*{Functions}
+\begin{DoxyCompactItemize}
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int L\+W\+S\+\_\+\+W\+A\+R\+N\+\_\+\+U\+N\+U\+S\+E\+D\+\_\+\+R\+E\+S\+U\+LT \hyperlink{group__wsstatus_ga2bb3655329b4651cd06f79ee3a764421}{lws\+\_\+send\+\_\+pipe\+\_\+choked} (struct lws $\ast$wsi)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int \hyperlink{group__wsstatus_ga08e9ee165fca503fd9427d55cfecac37}{lws\+\_\+is\+\_\+final\+\_\+fragment} (struct lws $\ast$wsi)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN unsigned char \hyperlink{group__wsstatus_ga3df5045656dfb6b0e63a38de2dca79d2}{lws\+\_\+get\+\_\+reserved\+\_\+bits} (struct lws $\ast$wsi)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int L\+W\+S\+\_\+\+W\+A\+R\+N\+\_\+\+U\+N\+U\+S\+E\+D\+\_\+\+R\+E\+S\+U\+LT \hyperlink{group__wsstatus_gaeca4afc94b1f026034f99cbba37e2f85}{lws\+\_\+partial\+\_\+buffered} (struct lws $\ast$wsi)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int L\+W\+S\+\_\+\+W\+A\+R\+N\+\_\+\+U\+N\+U\+S\+E\+D\+\_\+\+R\+E\+S\+U\+LT \hyperlink{group__wsstatus_gaccd9c59336efad8af0554f79cc5966fd}{lws\+\_\+frame\+\_\+is\+\_\+binary} (struct lws $\ast$wsi)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int \hyperlink{group__wsstatus_ga26a140623d202dd2bf2004deb6994baa}{lws\+\_\+is\+\_\+ssl} (struct lws $\ast$wsi)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int \hyperlink{group__wsstatus_ga4ad226d5e01024b4046f4a5a37199aa1}{lws\+\_\+is\+\_\+cgi} (struct lws $\ast$wsi)
+\end{DoxyCompactItemize}
+
+
+\subsection{Detailed Description}
+\subsubsection*{Websocket connection status A\+P\+Is}
+
+These provide information about ws connection or message status
+
+\subsection{Function Documentation}
+\index{Websocket status A\+P\+Is@{Websocket status A\+P\+Is}!lws\+\_\+frame\+\_\+is\+\_\+binary@{lws\+\_\+frame\+\_\+is\+\_\+binary}}
+\index{lws\+\_\+frame\+\_\+is\+\_\+binary@{lws\+\_\+frame\+\_\+is\+\_\+binary}!Websocket status A\+P\+Is@{Websocket status A\+P\+Is}}
+\subsubsection[{\texorpdfstring{lws\+\_\+frame\+\_\+is\+\_\+binary(struct lws $\ast$wsi)}{lws\_frame\_is\_binary(struct lws *wsi)}}]{\setlength{\rightskip}{0pt plus 5cm}L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int L\+W\+S\+\_\+\+W\+A\+R\+N\+\_\+\+U\+N\+U\+S\+E\+D\+\_\+\+R\+E\+S\+U\+LT lws\+\_\+frame\+\_\+is\+\_\+binary (
+\begin{DoxyParamCaption}
+\item[{struct lws $\ast$}]{wsi}
+\end{DoxyParamCaption}
+)}\hypertarget{group__wsstatus_gaccd9c59336efad8af0554f79cc5966fd}{}\label{group__wsstatus_gaccd9c59336efad8af0554f79cc5966fd}
+
+
+{\ttfamily \#include $<$\hyperlink{libwebsockets_8h}{lib/libwebsockets.\+h}$>$}
+
+\hyperlink{group__wsstatus_gaccd9c59336efad8af0554f79cc5966fd}{lws\+\_\+frame\+\_\+is\+\_\+binary()}\+: true if the current frame was sent in binary mode
+
+
+\begin{DoxyParams}{Parameters}
+{\em wsi} & the connection we are inquiring about\\
+\hline
+\end{DoxyParams}
+This is intended to be called from the L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+R\+E\+C\+E\+I\+VE callback if it\textquotesingle{}s interested to see if the frame it\textquotesingle{}s dealing with was sent in binary mode. \index{Websocket status A\+P\+Is@{Websocket status A\+P\+Is}!lws\+\_\+get\+\_\+reserved\+\_\+bits@{lws\+\_\+get\+\_\+reserved\+\_\+bits}}
+\index{lws\+\_\+get\+\_\+reserved\+\_\+bits@{lws\+\_\+get\+\_\+reserved\+\_\+bits}!Websocket status A\+P\+Is@{Websocket status A\+P\+Is}}
+\subsubsection[{\texorpdfstring{lws\+\_\+get\+\_\+reserved\+\_\+bits(struct lws $\ast$wsi)}{lws\_get\_reserved\_bits(struct lws *wsi)}}]{\setlength{\rightskip}{0pt plus 5cm}L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN unsigned char lws\+\_\+get\+\_\+reserved\+\_\+bits (
+\begin{DoxyParamCaption}
+\item[{struct lws $\ast$}]{wsi}
+\end{DoxyParamCaption}
+)}\hypertarget{group__wsstatus_ga3df5045656dfb6b0e63a38de2dca79d2}{}\label{group__wsstatus_ga3df5045656dfb6b0e63a38de2dca79d2}
+
+
+{\ttfamily \#include $<$\hyperlink{libwebsockets_8h}{lib/libwebsockets.\+h}$>$}
+
+\hyperlink{group__wsstatus_ga3df5045656dfb6b0e63a38de2dca79d2}{lws\+\_\+get\+\_\+reserved\+\_\+bits()} -\/ access reserved bits of ws frame
+\begin{DoxyParams}{Parameters}
+{\em wsi} & lws connection \\
+\hline
+\end{DoxyParams}
+\index{Websocket status A\+P\+Is@{Websocket status A\+P\+Is}!lws\+\_\+is\+\_\+cgi@{lws\+\_\+is\+\_\+cgi}}
+\index{lws\+\_\+is\+\_\+cgi@{lws\+\_\+is\+\_\+cgi}!Websocket status A\+P\+Is@{Websocket status A\+P\+Is}}
+\subsubsection[{\texorpdfstring{lws\+\_\+is\+\_\+cgi(struct lws $\ast$wsi)}{lws\_is\_cgi(struct lws *wsi)}}]{\setlength{\rightskip}{0pt plus 5cm}L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int lws\+\_\+is\+\_\+cgi (
+\begin{DoxyParamCaption}
+\item[{struct lws $\ast$}]{wsi}
+\end{DoxyParamCaption}
+)}\hypertarget{group__wsstatus_ga4ad226d5e01024b4046f4a5a37199aa1}{}\label{group__wsstatus_ga4ad226d5e01024b4046f4a5a37199aa1}
+
+
+{\ttfamily \#include $<$\hyperlink{libwebsockets_8h}{lib/libwebsockets.\+h}$>$}
+
+\hyperlink{group__wsstatus_ga4ad226d5e01024b4046f4a5a37199aa1}{lws\+\_\+is\+\_\+cgi()} -\/ find out if this wsi is running a cgi process
+\begin{DoxyParams}{Parameters}
+{\em wsi} & lws connection \\
+\hline
+\end{DoxyParams}
+\index{Websocket status A\+P\+Is@{Websocket status A\+P\+Is}!lws\+\_\+is\+\_\+final\+\_\+fragment@{lws\+\_\+is\+\_\+final\+\_\+fragment}}
+\index{lws\+\_\+is\+\_\+final\+\_\+fragment@{lws\+\_\+is\+\_\+final\+\_\+fragment}!Websocket status A\+P\+Is@{Websocket status A\+P\+Is}}
+\subsubsection[{\texorpdfstring{lws\+\_\+is\+\_\+final\+\_\+fragment(struct lws $\ast$wsi)}{lws\_is\_final\_fragment(struct lws *wsi)}}]{\setlength{\rightskip}{0pt plus 5cm}L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int lws\+\_\+is\+\_\+final\+\_\+fragment (
+\begin{DoxyParamCaption}
+\item[{struct lws $\ast$}]{wsi}
+\end{DoxyParamCaption}
+)}\hypertarget{group__wsstatus_ga08e9ee165fca503fd9427d55cfecac37}{}\label{group__wsstatus_ga08e9ee165fca503fd9427d55cfecac37}
+
+
+{\ttfamily \#include $<$\hyperlink{libwebsockets_8h}{lib/libwebsockets.\+h}$>$}
+
+\hyperlink{group__wsstatus_ga08e9ee165fca503fd9427d55cfecac37}{lws\+\_\+is\+\_\+final\+\_\+fragment()} -\/ tests if last part of ws message
+\begin{DoxyParams}{Parameters}
+{\em wsi} & lws connection \\
+\hline
+\end{DoxyParams}
+\index{Websocket status A\+P\+Is@{Websocket status A\+P\+Is}!lws\+\_\+is\+\_\+ssl@{lws\+\_\+is\+\_\+ssl}}
+\index{lws\+\_\+is\+\_\+ssl@{lws\+\_\+is\+\_\+ssl}!Websocket status A\+P\+Is@{Websocket status A\+P\+Is}}
+\subsubsection[{\texorpdfstring{lws\+\_\+is\+\_\+ssl(struct lws $\ast$wsi)}{lws\_is\_ssl(struct lws *wsi)}}]{\setlength{\rightskip}{0pt plus 5cm}L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int lws\+\_\+is\+\_\+ssl (
+\begin{DoxyParamCaption}
+\item[{struct lws $\ast$}]{wsi}
+\end{DoxyParamCaption}
+)}\hypertarget{group__wsstatus_ga26a140623d202dd2bf2004deb6994baa}{}\label{group__wsstatus_ga26a140623d202dd2bf2004deb6994baa}
+
+
+{\ttfamily \#include $<$\hyperlink{libwebsockets_8h}{lib/libwebsockets.\+h}$>$}
+
+\hyperlink{group__wsstatus_ga26a140623d202dd2bf2004deb6994baa}{lws\+\_\+is\+\_\+ssl()} -\/ Find out if connection is using S\+SL
+\begin{DoxyParams}{Parameters}
+{\em wsi} & websocket connection to check \begin{DoxyVerb} Returns 0 if the connection is not using SSL, 1 if using SSL and
+ using verified cert, and 2 if using SSL but the cert was not
+ checked (appears for client wsi told to skip check on connection)\end{DoxyVerb}
+ \\
+\hline
+\end{DoxyParams}
+\index{Websocket status A\+P\+Is@{Websocket status A\+P\+Is}!lws\+\_\+partial\+\_\+buffered@{lws\+\_\+partial\+\_\+buffered}}
+\index{lws\+\_\+partial\+\_\+buffered@{lws\+\_\+partial\+\_\+buffered}!Websocket status A\+P\+Is@{Websocket status A\+P\+Is}}
+\subsubsection[{\texorpdfstring{lws\+\_\+partial\+\_\+buffered(struct lws $\ast$wsi)}{lws\_partial\_buffered(struct lws *wsi)}}]{\setlength{\rightskip}{0pt plus 5cm}L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int L\+W\+S\+\_\+\+W\+A\+R\+N\+\_\+\+U\+N\+U\+S\+E\+D\+\_\+\+R\+E\+S\+U\+LT lws\+\_\+partial\+\_\+buffered (
+\begin{DoxyParamCaption}
+\item[{struct lws $\ast$}]{wsi}
+\end{DoxyParamCaption}
+)}\hypertarget{group__wsstatus_gaeca4afc94b1f026034f99cbba37e2f85}{}\label{group__wsstatus_gaeca4afc94b1f026034f99cbba37e2f85}
+
+
+{\ttfamily \#include $<$\hyperlink{libwebsockets_8h}{lib/libwebsockets.\+h}$>$}
+
+\hyperlink{group__wsstatus_gaeca4afc94b1f026034f99cbba37e2f85}{lws\+\_\+partial\+\_\+buffered()} -\/ find out if lws buffered the last write
+\begin{DoxyParams}{Parameters}
+{\em wsi} & websocket connection to check\\
+\hline
+\end{DoxyParams}
+Returns 1 if you cannot use lws\+\_\+write because the last write on this connection is still buffered, and can\textquotesingle{}t be cleared without returning to the service loop and waiting for the connection to be writeable again.
+
+If you will try to do $>$1 lws\+\_\+write call inside a single W\+R\+I\+T\+E\+A\+B\+LE callback, you must check this after every write and bail if set, ask for a new writeable callback and continue writing from there.
+
+This is never set at the start of a writeable callback, but any write may set it. \index{Websocket status A\+P\+Is@{Websocket status A\+P\+Is}!lws\+\_\+send\+\_\+pipe\+\_\+choked@{lws\+\_\+send\+\_\+pipe\+\_\+choked}}
+\index{lws\+\_\+send\+\_\+pipe\+\_\+choked@{lws\+\_\+send\+\_\+pipe\+\_\+choked}!Websocket status A\+P\+Is@{Websocket status A\+P\+Is}}
+\subsubsection[{\texorpdfstring{lws\+\_\+send\+\_\+pipe\+\_\+choked(struct lws $\ast$wsi)}{lws\_send\_pipe\_choked(struct lws *wsi)}}]{\setlength{\rightskip}{0pt plus 5cm}L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int L\+W\+S\+\_\+\+W\+A\+R\+N\+\_\+\+U\+N\+U\+S\+E\+D\+\_\+\+R\+E\+S\+U\+LT lws\+\_\+send\+\_\+pipe\+\_\+choked (
+\begin{DoxyParamCaption}
+\item[{struct lws $\ast$}]{wsi}
+\end{DoxyParamCaption}
+)}\hypertarget{group__wsstatus_ga2bb3655329b4651cd06f79ee3a764421}{}\label{group__wsstatus_ga2bb3655329b4651cd06f79ee3a764421}
+
+
+{\ttfamily \#include $<$\hyperlink{libwebsockets_8h}{lib/libwebsockets.\+h}$>$}
+
+\hyperlink{group__wsstatus_ga2bb3655329b4651cd06f79ee3a764421}{lws\+\_\+send\+\_\+pipe\+\_\+choked()} -\/ tests if socket is writable or not
+\begin{DoxyParams}{Parameters}
+{\em wsi} & lws connection\\
+\hline
+\end{DoxyParams}
+Allows you to check if you can write more on the socket
\ No newline at end of file
--- /dev/null
+\section{Class Hierarchy}
+This inheritance list is sorted roughly, but not completely, alphabetically\+:\begin{DoxyCompactList}
+\item \contentsline{section}{lws\+\_\+cgi\+\_\+args}{\pageref{structlws__cgi__args}}{}
+\item \contentsline{section}{lws\+\_\+client\+\_\+connect\+\_\+info}{\pageref{structlws__client__connect__info}}{}
+\item \contentsline{section}{lws\+\_\+conn}{\pageref{classlws__conn}}{}
+\begin{DoxyCompactList}
+\item \contentsline{section}{lws\+\_\+conn\+\_\+listener}{\pageref{classlws__conn__listener}}{}
+\end{DoxyCompactList}
+\item \contentsline{section}{lws\+\_\+context\+\_\+creation\+\_\+info}{\pageref{structlws__context__creation__info}}{}
+\item \contentsline{section}{lws\+\_\+email}{\pageref{structlws__email}}{}
+\item \contentsline{section}{lws\+\_\+ext\+\_\+option\+\_\+arg}{\pageref{structlws__ext__option__arg}}{}
+\item \contentsline{section}{lws\+\_\+ext\+\_\+options}{\pageref{structlws__ext__options}}{}
+\item \contentsline{section}{lws\+\_\+extension}{\pageref{structlws__extension}}{}
+\item \contentsline{section}{lws\+\_\+gs\+\_\+event\+\_\+args}{\pageref{structlws__gs__event__args}}{}
+\item \contentsline{section}{lws\+\_\+http\+\_\+mount}{\pageref{structlws__http__mount}}{}
+\item \contentsline{section}{lws\+\_\+plat\+\_\+file\+\_\+ops}{\pageref{structlws__plat__file__ops}}{}
+\item \contentsline{section}{lws\+\_\+plugin}{\pageref{structlws__plugin}}{}
+\item \contentsline{section}{lws\+\_\+plugin\+\_\+capability}{\pageref{structlws__plugin__capability}}{}
+\item \contentsline{section}{lws\+\_\+polarssl\+\_\+context}{\pageref{structlws__polarssl__context}}{}
+\item \contentsline{section}{lws\+\_\+pollargs}{\pageref{structlws__pollargs}}{}
+\item \contentsline{section}{lws\+\_\+pollfd}{\pageref{structlws__pollfd}}{}
+\item \contentsline{section}{lws\+\_\+process\+\_\+html\+\_\+args}{\pageref{structlws__process__html__args}}{}
+\item \contentsline{section}{lws\+\_\+process\+\_\+html\+\_\+state}{\pageref{structlws__process__html__state}}{}
+\item \contentsline{section}{lws\+\_\+protocol\+\_\+vhost\+\_\+options}{\pageref{structlws__protocol__vhost__options}}{}
+\item \contentsline{section}{lws\+\_\+protocols}{\pageref{structlws__protocols}}{}
+\item \contentsline{section}{lws\+\_\+session\+\_\+info}{\pageref{structlws__session__info}}{}
+\item \contentsline{section}{lws\+\_\+token\+\_\+limits}{\pageref{structlws__token__limits}}{}
+\item \contentsline{section}{lws\+\_\+tokens}{\pageref{structlws__tokens}}{}
+\item \contentsline{section}{lwsgw\+\_\+hash}{\pageref{structlwsgw__hash}}{}
+\item \contentsline{section}{lwsgw\+\_\+hash\+\_\+bin}{\pageref{structlwsgw__hash__bin}}{}
+\item \contentsline{section}{pollfd}{\pageref{structpollfd}}{}
+\end{DoxyCompactList}
--- /dev/null
+Libwebsockets covers a lot of interesting features for people making embedded servers or clients
+
+
+\begin{DoxyItemize}
+\item http(s) serving and client operation
+\item ws(s) serving and client operation
+\item http(s) apis for file transfer and upload
+\item http P\+O\+ST form handling (including multipart)
+\item cookie-\/based sessions
+\item account management (including registration, email verification, lost pw etc)
+\item strong ssl P\+FS support (A+ on S\+S\+Llabs test)
+\end{DoxyItemize}
+
+You can browse by api category \href{modules.html}{\tt here}.
\ No newline at end of file
--- /dev/null
+\hypertarget{libwebsockets_8h}{}\section{lib/libwebsockets.h File Reference}
+\label{libwebsockets_8h}\index{lib/libwebsockets.\+h@{lib/libwebsockets.\+h}}
+\subsection*{Data Structures}
+\begin{DoxyCompactItemize}
+\item
+class \hyperlink{classlws__conn}{lws\+\_\+conn}
+\item
+class \hyperlink{classlws__conn__listener}{lws\+\_\+conn\+\_\+listener}
+\item
+struct \hyperlink{structlws__polarssl__context}{lws\+\_\+polarssl\+\_\+context}
+\item
+struct \hyperlink{structlws__pollfd}{lws\+\_\+pollfd}
+\item
+struct \hyperlink{structpollfd}{pollfd}
+\item
+struct \hyperlink{structlws__pollargs}{lws\+\_\+pollargs}
+\item
+struct \hyperlink{structlws__ext__options}{lws\+\_\+ext\+\_\+options}
+\item
+struct \hyperlink{structlws__ext__option__arg}{lws\+\_\+ext\+\_\+option\+\_\+arg}
+\item
+struct \hyperlink{structlws__extension}{lws\+\_\+extension}
+\item
+struct \hyperlink{structlws__protocols}{lws\+\_\+protocols}
+\item
+struct \hyperlink{structlws__plugin__capability}{lws\+\_\+plugin\+\_\+capability}
+\item
+struct \hyperlink{structlws__plugin}{lws\+\_\+plugin}
+\item
+struct \hyperlink{structlwsgw__hash__bin}{lwsgw\+\_\+hash\+\_\+bin}
+\item
+struct \hyperlink{structlwsgw__hash}{lwsgw\+\_\+hash}
+\item
+struct \hyperlink{structlws__session__info}{lws\+\_\+session\+\_\+info}
+\item
+struct \hyperlink{structlws__gs__event__args}{lws\+\_\+gs\+\_\+event\+\_\+args}
+\item
+struct \hyperlink{structlws__context__creation__info}{lws\+\_\+context\+\_\+creation\+\_\+info}
+\item
+struct \hyperlink{structlws__protocol__vhost__options}{lws\+\_\+protocol\+\_\+vhost\+\_\+options}
+\item
+struct \hyperlink{structlws__http__mount}{lws\+\_\+http\+\_\+mount}
+\item
+struct \hyperlink{structlws__client__connect__info}{lws\+\_\+client\+\_\+connect\+\_\+info}
+\item
+struct \hyperlink{structlws__process__html__args}{lws\+\_\+process\+\_\+html\+\_\+args}
+\item
+struct \hyperlink{structlws__process__html__state}{lws\+\_\+process\+\_\+html\+\_\+state}
+\item
+struct \hyperlink{structlws__tokens}{lws\+\_\+tokens}
+\item
+struct \hyperlink{structlws__token__limits}{lws\+\_\+token\+\_\+limits}
+\item
+struct \hyperlink{structlws__cgi__args}{lws\+\_\+cgi\+\_\+args}
+\item
+struct \hyperlink{structlws__plat__file__ops}{lws\+\_\+plat\+\_\+file\+\_\+ops}
+\item
+struct \hyperlink{structlws__email}{lws\+\_\+email}
+\end{DoxyCompactItemize}
+\subsection*{Typedefs}
+\begin{DoxyCompactItemize}
+\item
+typedef struct \hyperlink{structlws__polarssl__context}{lws\+\_\+polarssl\+\_\+context} {\bfseries S\+S\+L\+\_\+\+C\+TX}\hypertarget{libwebsockets_8h_abddb8d337fb2692586d892b494739003}{}\label{libwebsockets_8h_abddb8d337fb2692586d892b494739003}
+
+\item
+typedef ssl\+\_\+context {\bfseries S\+SL}\hypertarget{libwebsockets_8h_ac3abb8b7e6d29a0292797230e4031681}{}\label{libwebsockets_8h_ac3abb8b7e6d29a0292797230e4031681}
+
+\item
+typedef S\+O\+C\+K\+ET {\bfseries lws\+\_\+sockfd\+\_\+type}\hypertarget{libwebsockets_8h_adedbc79528b71a5c7f27cde87100c9aa}{}\label{libwebsockets_8h_adedbc79528b71a5c7f27cde87100c9aa}
+
+\item
+typedef H\+A\+N\+D\+LE {\bfseries lws\+\_\+filefd\+\_\+type}\hypertarget{libwebsockets_8h_aff42d53861afdc1a6edfb999ba688ecb}{}\label{libwebsockets_8h_aff42d53861afdc1a6edfb999ba688ecb}
+
+\item
+typedef int \hyperlink{group__usercb_gad4fcb82e68d60ffacca61a3f783a0a2f}{lws\+\_\+callback\+\_\+function}(struct lws $\ast$wsi, enum \hyperlink{group__usercb_gad62860e19975ba4c4af401c3cdb6abf7}{lws\+\_\+callback\+\_\+reasons} reason, void $\ast$user, void $\ast$in, size\+\_\+t len)
+\item
+typedef int \hyperlink{group__extensions_gaae7169b2cd346b34fa33d0250db2afd0}{lws\+\_\+extension\+\_\+callback\+\_\+function}(struct lws\+\_\+context $\ast$context, const struct \hyperlink{structlws__extension}{lws\+\_\+extension} $\ast$ext, struct lws $\ast$wsi, enum lws\+\_\+extension\+\_\+callback\+\_\+reasons reason, void $\ast$user, void $\ast$in, size\+\_\+t len)
+\item
+typedef int($\ast$ {\bfseries lws\+\_\+plugin\+\_\+init\+\_\+func}) (struct lws\+\_\+context $\ast$, struct \hyperlink{structlws__plugin__capability}{lws\+\_\+plugin\+\_\+capability} $\ast$)
+\item
+typedef int($\ast$ {\bfseries lws\+\_\+plugin\+\_\+destroy\+\_\+func}) (struct lws\+\_\+context $\ast$)
+\item
+typedef const char $\ast$($\ast$ {\bfseries lws\+\_\+process\+\_\+html\+\_\+state\+\_\+cb}) (void $\ast$data, int index)
+\item
+typedef int($\ast$ \hyperlink{group__form-parsing_ga5a70527c0861c2ffa3d29333a6aa7f8e}{lws\+\_\+spa\+\_\+fileupload\+\_\+cb}) (void $\ast$data, const char $\ast$name, const char $\ast$filename, char $\ast$buf, int len, enum \hyperlink{group__form-parsing_ga41a74a822771d3dce89751aa3bce28ae}{lws\+\_\+spa\+\_\+fileupload\+\_\+states} state)
+\item
+typedef void( {\bfseries lws\+\_\+ev\+\_\+signal\+\_\+cb\+\_\+t}) (E\+V\+\_\+\+P\+\_\+ struct ev\+\_\+signal $\ast$w, int revents)
+\end{DoxyCompactItemize}
+\subsection*{Enumerations}
+\begin{DoxyCompactItemize}
+\item
+enum {\bfseries lws\+\_\+log\+\_\+levels} \{ \\*
+{\bfseries L\+L\+L\+\_\+\+E\+RR} = 1 $<$$<$ 0,
+{\bfseries L\+L\+L\+\_\+\+W\+A\+RN} = 1 $<$$<$ 1,
+{\bfseries L\+L\+L\+\_\+\+N\+O\+T\+I\+CE} = 1 $<$$<$ 2,
+{\bfseries L\+L\+L\+\_\+\+I\+N\+FO} = 1 $<$$<$ 3,
+\\*
+{\bfseries L\+L\+L\+\_\+\+D\+E\+B\+UG} = 1 $<$$<$ 4,
+{\bfseries L\+L\+L\+\_\+\+P\+A\+R\+S\+ER} = 1 $<$$<$ 5,
+{\bfseries L\+L\+L\+\_\+\+H\+E\+A\+D\+ER} = 1 $<$$<$ 6,
+{\bfseries L\+L\+L\+\_\+\+E\+XT} = 1 $<$$<$ 7,
+\\*
+{\bfseries L\+L\+L\+\_\+\+C\+L\+I\+E\+NT} = 1 $<$$<$ 8,
+{\bfseries L\+L\+L\+\_\+\+L\+A\+T\+E\+N\+CY} = 1 $<$$<$ 9,
+{\bfseries L\+L\+L\+\_\+\+C\+O\+U\+NT} = 10
+ \}\hypertarget{group__log_ga14542b84d2c76efa7814124bb10f9c5f}{}\label{group__log_ga14542b84d2c76efa7814124bb10f9c5f}
+
+\item
+enum \hyperlink{group__wsclose_gae399c571df32ba532c0ca67da9284985}{lws\+\_\+close\+\_\+status} \{ \\*
+{\bfseries L\+W\+S\+\_\+\+C\+L\+O\+S\+E\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+N\+O\+S\+T\+A\+T\+US} = 0,
+\hyperlink{group__wsclose_ggae399c571df32ba532c0ca67da9284985a3ffa38d5081b85fb739e02a747ccf2c4}{L\+W\+S\+\_\+\+C\+L\+O\+S\+E\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+N\+O\+R\+M\+AL} = 1000,
+\hyperlink{group__wsclose_ggae399c571df32ba532c0ca67da9284985a9737a68759e739856b150ff9dfa30218}{L\+W\+S\+\_\+\+C\+L\+O\+S\+E\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+G\+O\+I\+N\+G\+A\+W\+AY} = 1001,
+\hyperlink{group__wsclose_ggae399c571df32ba532c0ca67da9284985a1bb501d212fa4d57053db681b1dfab98}{L\+W\+S\+\_\+\+C\+L\+O\+S\+E\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+P\+R\+O\+T\+O\+C\+O\+L\+\_\+\+E\+RR} = 1002,
+\\*
+\hyperlink{group__wsclose_ggae399c571df32ba532c0ca67da9284985a462c99b05459df700919cfd3f53c8276}{L\+W\+S\+\_\+\+C\+L\+O\+S\+E\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+U\+N\+A\+C\+C\+E\+P\+T\+A\+B\+L\+E\+\_\+\+O\+P\+C\+O\+DE} = 1003,
+\hyperlink{group__wsclose_ggae399c571df32ba532c0ca67da9284985af90cb98d983ad3d4c79df9b6f3d4a4d2}{L\+W\+S\+\_\+\+C\+L\+O\+S\+E\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+R\+E\+S\+E\+R\+V\+ED} = 1004,
+\hyperlink{group__wsclose_ggae399c571df32ba532c0ca67da9284985a4b8a3b7ce6f731e5248e4b0fb64a5044}{L\+W\+S\+\_\+\+C\+L\+O\+S\+E\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+N\+O\+\_\+\+S\+T\+A\+T\+US} = 1005,
+\hyperlink{group__wsclose_ggae399c571df32ba532c0ca67da9284985a68b3d34bebd88547dcfa5cadba0acd6c}{L\+W\+S\+\_\+\+C\+L\+O\+S\+E\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+A\+B\+N\+O\+R\+M\+A\+L\+\_\+\+C\+L\+O\+SE} = 1006,
+\\*
+\hyperlink{group__wsclose_ggae399c571df32ba532c0ca67da9284985a7aef2da0062da606eeb35aaca5cf9050}{L\+W\+S\+\_\+\+C\+L\+O\+S\+E\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+I\+N\+V\+A\+L\+I\+D\+\_\+\+P\+A\+Y\+L\+O\+AD} = 1007,
+\hyperlink{group__wsclose_ggae399c571df32ba532c0ca67da9284985ad09e68295eabdddcba4e332fbea70ae5}{L\+W\+S\+\_\+\+C\+L\+O\+S\+E\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+P\+O\+L\+I\+C\+Y\+\_\+\+V\+I\+O\+L\+A\+T\+I\+ON} = 1008,
+\hyperlink{group__wsclose_ggae399c571df32ba532c0ca67da9284985a2e1f0113494a58e762eed3d22e7080d8}{L\+W\+S\+\_\+\+C\+L\+O\+S\+E\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+M\+E\+S\+S\+A\+G\+E\+\_\+\+T\+O\+O\+\_\+\+L\+A\+R\+GE} = 1009,
+\hyperlink{group__wsclose_ggae399c571df32ba532c0ca67da9284985ac6a161822783ee873be1c66f48d14e0e}{L\+W\+S\+\_\+\+C\+L\+O\+S\+E\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+E\+X\+T\+E\+N\+S\+I\+O\+N\+\_\+\+R\+E\+Q\+U\+I\+R\+ED} = 1010,
+\\*
+\hyperlink{group__wsclose_ggae399c571df32ba532c0ca67da9284985ad0869604d79e13700ae5d196a431b350}{L\+W\+S\+\_\+\+C\+L\+O\+S\+E\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+U\+N\+E\+X\+P\+E\+C\+T\+E\+D\+\_\+\+C\+O\+N\+D\+I\+T\+I\+ON} = 1011,
+\hyperlink{group__wsclose_ggae399c571df32ba532c0ca67da9284985ad2b477a91c8445bf34ecd43977f9b390}{L\+W\+S\+\_\+\+C\+L\+O\+S\+E\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+T\+L\+S\+\_\+\+F\+A\+I\+L\+U\+RE} = 1015,
+{\bfseries L\+W\+S\+\_\+\+C\+L\+O\+S\+E\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+N\+O\+S\+T\+A\+T\+U\+S\+\_\+\+C\+O\+N\+T\+E\+X\+T\+\_\+\+D\+E\+S\+T\+R\+OY} = 9999
+ \}
+\item
+enum \hyperlink{group__usercb_gad62860e19975ba4c4af401c3cdb6abf7}{lws\+\_\+callback\+\_\+reasons} \{ \\*
+\hyperlink{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7a24d39bf1cfc0bad9d92da9ac1717e439}{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+E\+S\+T\+A\+B\+L\+I\+S\+H\+ED} = 0,
+\hyperlink{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7ad8c6207b0c4e732f3d507f0fb79370e8}{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+C\+O\+N\+N\+E\+C\+T\+I\+O\+N\+\_\+\+E\+R\+R\+OR} = 1,
+\hyperlink{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7aa536e574a642ff3ab9e12bff7ba2c6a2}{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+F\+I\+L\+T\+E\+R\+\_\+\+P\+R\+E\+\_\+\+E\+S\+T\+A\+B\+L\+I\+SH} = 2,
+\hyperlink{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7a7e12418eec9bce85735e6460176ab604}{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+E\+S\+T\+A\+B\+L\+I\+S\+H\+ED} = 3,
+\\*
+\hyperlink{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7a48a9590e5e18c7920282e094a0bfd9d8}{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+C\+L\+O\+S\+ED} = 4,
+\hyperlink{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7a838b18d255c1b94a533287ba302a2eba}{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+C\+L\+O\+S\+E\+D\+\_\+\+H\+T\+TP} = 5,
+\hyperlink{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7a492c1b1c0ac0ed980042ee732fe2990c}{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+R\+E\+C\+E\+I\+VE} = 6,
+\hyperlink{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7a2db02fc6e1c17ab62b52109d1aa9d738}{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+R\+E\+C\+E\+I\+V\+E\+\_\+\+P\+O\+NG} = 7,
+\\*
+\hyperlink{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7abbbe7a0a67c5866ca9109d46823fc5b1}{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+R\+E\+C\+E\+I\+VE} = 8,
+\hyperlink{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7a136a7cec11c3afd13245623bd84e76c9}{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+R\+E\+C\+E\+I\+V\+E\+\_\+\+P\+O\+NG} = 9,
+\hyperlink{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7a8e8b2e6dbeac76d8d126947d2166a514}{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+W\+R\+I\+T\+E\+A\+B\+LE} = 10,
+\hyperlink{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7a7ec8e2e9557ee02a4fc9f7dec7e2babc}{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+W\+R\+I\+T\+E\+A\+B\+LE} = 11,
+\\*
+\hyperlink{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7ae8d1de0bb56e03aa58cb4d44b18edd2e}{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+H\+T\+TP} = 12,
+\hyperlink{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7ac4c68e00efcf1ff7bda7ada462aff8ae}{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+H\+T\+T\+P\+\_\+\+B\+O\+DY} = 13,
+\hyperlink{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7a2fce9a8608220f32abbf1422a5498804}{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+H\+T\+T\+P\+\_\+\+B\+O\+D\+Y\+\_\+\+C\+O\+M\+P\+L\+E\+T\+I\+ON} = 14,
+\hyperlink{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7aa627548e1296e654fcfab463ec3c9587}{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+H\+T\+T\+P\+\_\+\+F\+I\+L\+E\+\_\+\+C\+O\+M\+P\+L\+E\+T\+I\+ON} = 15,
+\\*
+\hyperlink{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7afedadfb3cde37a8ea4c84ed535f26d09}{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+H\+T\+T\+P\+\_\+\+W\+R\+I\+T\+E\+A\+B\+LE} = 16,
+\hyperlink{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7a026502768778b8d79d62dd0fe4375fc6}{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+F\+I\+L\+T\+E\+R\+\_\+\+N\+E\+T\+W\+O\+R\+K\+\_\+\+C\+O\+N\+N\+E\+C\+T\+I\+ON} = 17,
+\hyperlink{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7a75199176c82c1a56e4a6bbf1cc30c12c}{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+F\+I\+L\+T\+E\+R\+\_\+\+H\+T\+T\+P\+\_\+\+C\+O\+N\+N\+E\+C\+T\+I\+ON} = 18,
+\hyperlink{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7ae9734e1d7af2abf291665ce9e4a728d3}{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+N\+E\+W\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+I\+N\+S\+T\+A\+N\+T\+I\+A\+T\+ED} = 19,
+\\*
+\hyperlink{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7accd8753672d319a30b4b4c2fb775e84d}{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+F\+I\+L\+T\+E\+R\+\_\+\+P\+R\+O\+T\+O\+C\+O\+L\+\_\+\+C\+O\+N\+N\+E\+C\+T\+I\+ON} = 20,
+\hyperlink{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7ae4986291b7a810fe290851d73bebeb1c}{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+O\+P\+E\+N\+S\+S\+L\+\_\+\+L\+O\+A\+D\+\_\+\+E\+X\+T\+R\+A\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+V\+E\+R\+I\+F\+Y\+\_\+\+C\+E\+R\+TS} = 21,
+\hyperlink{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7a06006e98d27e1e884364d88317f83493}{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+O\+P\+E\+N\+S\+S\+L\+\_\+\+L\+O\+A\+D\+\_\+\+E\+X\+T\+R\+A\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+V\+E\+R\+I\+F\+Y\+\_\+\+C\+E\+R\+TS} = 22,
+\hyperlink{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7ae5ad65d779b7eab32ab67ceff91a3bac}{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+O\+P\+E\+N\+S\+S\+L\+\_\+\+P\+E\+R\+F\+O\+R\+M\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+C\+E\+R\+T\+\_\+\+V\+E\+R\+I\+F\+I\+C\+A\+T\+I\+ON} = 23,
+\\*
+\hyperlink{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7a909cc2a7018864b0b71abacc4058fd8f}{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+A\+P\+P\+E\+N\+D\+\_\+\+H\+A\+N\+D\+S\+H\+A\+K\+E\+\_\+\+H\+E\+A\+D\+ER} = 24,
+\hyperlink{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7a390da3639296660a78cc1a5dcb19037e}{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+C\+O\+N\+F\+I\+R\+M\+\_\+\+E\+X\+T\+E\+N\+S\+I\+O\+N\+\_\+\+O\+K\+AY} = 25,
+\hyperlink{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7a1ce5b22039ca37ee224d00047596ea46}{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+C\+O\+N\+F\+I\+R\+M\+\_\+\+E\+X\+T\+E\+N\+S\+I\+O\+N\+\_\+\+S\+U\+P\+P\+O\+R\+T\+ED} = 26,
+\hyperlink{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7ad5d34583e3556e153eda91620b48cc49}{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+P\+R\+O\+T\+O\+C\+O\+L\+\_\+\+I\+N\+IT} = 27,
+\\*
+\hyperlink{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7a54269ca88508e6efd3afdb9d360a9caa}{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+P\+R\+O\+T\+O\+C\+O\+L\+\_\+\+D\+E\+S\+T\+R\+OY} = 28,
+\hyperlink{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7afd8fd77a1cc9405fcb4f26915d7f2d01}{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+W\+S\+I\+\_\+\+C\+R\+E\+A\+TE} = 29,
+\hyperlink{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7aca834dc035b7f7486f9ce40fde54fe9e}{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+W\+S\+I\+\_\+\+D\+E\+S\+T\+R\+OY} = 30,
+\hyperlink{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7adfb41c92e2522712207ef7f2462b5e34}{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+G\+E\+T\+\_\+\+T\+H\+R\+E\+A\+D\+\_\+\+ID} = 31,
+\\*
+\hyperlink{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7ab69783a9fbf2ca71ad70706bda77b412}{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+A\+D\+D\+\_\+\+P\+O\+L\+L\+\_\+\+FD} = 32,
+\hyperlink{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7a1df60f314710236f9b53efbf468da768}{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+D\+E\+L\+\_\+\+P\+O\+L\+L\+\_\+\+FD} = 33,
+\hyperlink{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7aa87d2e82fffa42c3680c7403ef94216e}{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+C\+H\+A\+N\+G\+E\+\_\+\+M\+O\+D\+E\+\_\+\+P\+O\+L\+L\+\_\+\+FD} = 34,
+\hyperlink{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7a8909732521d379179003d97ab7a05428}{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+L\+O\+C\+K\+\_\+\+P\+O\+LL} = 35,
+\\*
+\hyperlink{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7a0e9e3dd667c0c42cdbe1a3d921f4fd79}{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+U\+N\+L\+O\+C\+K\+\_\+\+P\+O\+LL} = 36,
+\hyperlink{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7aa46f705dcf97502e95627ffde614f98b}{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+O\+P\+E\+N\+S\+S\+L\+\_\+\+C\+O\+N\+T\+E\+X\+T\+\_\+\+R\+E\+Q\+U\+I\+R\+E\+S\+\_\+\+P\+R\+I\+V\+A\+T\+E\+\_\+\+K\+EY} = 37,
+\hyperlink{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7ac3fc5bbb55e69f90396526287ee84a51}{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+W\+S\+\_\+\+P\+E\+E\+R\+\_\+\+I\+N\+I\+T\+I\+A\+T\+E\+D\+\_\+\+C\+L\+O\+SE} = 38,
+{\bfseries L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+W\+S\+\_\+\+E\+X\+T\+\_\+\+D\+E\+F\+A\+U\+L\+TS} = 39,
+\\*
+{\bfseries L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+C\+GI} = 40,
+{\bfseries L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+C\+G\+I\+\_\+\+T\+E\+R\+M\+I\+N\+A\+T\+ED} = 41,
+{\bfseries L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+C\+G\+I\+\_\+\+S\+T\+D\+I\+N\+\_\+\+D\+A\+TA} = 42,
+{\bfseries L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+C\+G\+I\+\_\+\+S\+T\+D\+I\+N\+\_\+\+C\+O\+M\+P\+L\+E\+T\+ED} = 43,
+\\*
+{\bfseries L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+E\+S\+T\+A\+B\+L\+I\+S\+H\+E\+D\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+H\+T\+TP} = 44,
+{\bfseries L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+C\+L\+O\+S\+E\+D\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+H\+T\+TP} = 45,
+{\bfseries L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+R\+E\+C\+E\+I\+V\+E\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+H\+T\+TP} = 46,
+{\bfseries L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+C\+O\+M\+P\+L\+E\+T\+E\+D\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+H\+T\+TP} = 47,
+\\*
+{\bfseries L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+R\+E\+C\+E\+I\+V\+E\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+H\+T\+T\+P\+\_\+\+R\+E\+AD} = 48,
+{\bfseries L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+H\+T\+T\+P\+\_\+\+B\+I\+N\+D\+\_\+\+P\+R\+O\+T\+O\+C\+OL} = 49,
+{\bfseries L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+H\+T\+T\+P\+\_\+\+D\+R\+O\+P\+\_\+\+P\+R\+O\+T\+O\+C\+OL} = 50,
+{\bfseries L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+C\+H\+E\+C\+K\+\_\+\+A\+C\+C\+E\+S\+S\+\_\+\+R\+I\+G\+H\+TS} = 51,
+\\*
+{\bfseries L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+P\+R\+O\+C\+E\+S\+S\+\_\+\+H\+T\+ML} = 52,
+{\bfseries L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+A\+D\+D\+\_\+\+H\+E\+A\+D\+E\+RS} = 53,
+{\bfseries L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+S\+E\+S\+S\+I\+O\+N\+\_\+\+I\+N\+FO} = 54,
+{\bfseries L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+G\+S\+\_\+\+E\+V\+E\+NT} = 55,
+\\*
+\hyperlink{group__usercb_ggad62860e19975ba4c4af401c3cdb6abf7a982579753e70e59a9ea13ce628ac891a}{L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+U\+S\+ER} = 1000
+ \}
+\item
+enum {\bfseries lws\+\_\+extension\+\_\+callback\+\_\+reasons} \{ \\*
+{\bfseries L\+W\+S\+\_\+\+E\+X\+T\+\_\+\+C\+B\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+C\+O\+N\+T\+E\+X\+T\+\_\+\+C\+O\+N\+S\+T\+R\+U\+CT} = 0,
+{\bfseries L\+W\+S\+\_\+\+E\+X\+T\+\_\+\+C\+B\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+C\+O\+N\+T\+E\+X\+T\+\_\+\+C\+O\+N\+S\+T\+R\+U\+CT} = 1,
+{\bfseries L\+W\+S\+\_\+\+E\+X\+T\+\_\+\+C\+B\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+C\+O\+N\+T\+E\+X\+T\+\_\+\+D\+E\+S\+T\+R\+U\+CT} = 2,
+{\bfseries L\+W\+S\+\_\+\+E\+X\+T\+\_\+\+C\+B\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+C\+O\+N\+T\+E\+X\+T\+\_\+\+D\+E\+S\+T\+R\+U\+CT} = 3,
+\\*
+{\bfseries L\+W\+S\+\_\+\+E\+X\+T\+\_\+\+C\+B\+\_\+\+C\+O\+N\+S\+T\+R\+U\+CT} = 4,
+{\bfseries L\+W\+S\+\_\+\+E\+X\+T\+\_\+\+C\+B\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+C\+O\+N\+S\+T\+R\+U\+CT} = 5,
+{\bfseries L\+W\+S\+\_\+\+E\+X\+T\+\_\+\+C\+B\+\_\+\+C\+H\+E\+C\+K\+\_\+\+O\+K\+\_\+\+T\+O\+\_\+\+R\+E\+A\+L\+L\+Y\+\_\+\+C\+L\+O\+SE} = 6,
+{\bfseries L\+W\+S\+\_\+\+E\+X\+T\+\_\+\+C\+B\+\_\+\+C\+H\+E\+C\+K\+\_\+\+O\+K\+\_\+\+T\+O\+\_\+\+P\+R\+O\+P\+O\+S\+E\+\_\+\+E\+X\+T\+E\+N\+S\+I\+ON} = 7,
+\\*
+{\bfseries L\+W\+S\+\_\+\+E\+X\+T\+\_\+\+C\+B\+\_\+\+D\+E\+S\+T\+R\+OY} = 8,
+{\bfseries L\+W\+S\+\_\+\+E\+X\+T\+\_\+\+C\+B\+\_\+\+D\+E\+S\+T\+R\+O\+Y\+\_\+\+A\+N\+Y\+\_\+\+W\+S\+I\+\_\+\+C\+L\+O\+S\+I\+NG} = 9,
+{\bfseries L\+W\+S\+\_\+\+E\+X\+T\+\_\+\+C\+B\+\_\+\+A\+N\+Y\+\_\+\+W\+S\+I\+\_\+\+E\+S\+T\+A\+B\+L\+I\+S\+H\+ED} = 10,
+{\bfseries L\+W\+S\+\_\+\+E\+X\+T\+\_\+\+C\+B\+\_\+\+P\+A\+C\+K\+E\+T\+\_\+\+R\+X\+\_\+\+P\+R\+E\+P\+A\+R\+SE} = 11,
+\\*
+{\bfseries L\+W\+S\+\_\+\+E\+X\+T\+\_\+\+C\+B\+\_\+\+P\+A\+C\+K\+E\+T\+\_\+\+T\+X\+\_\+\+P\+R\+E\+S\+E\+ND} = 12,
+{\bfseries L\+W\+S\+\_\+\+E\+X\+T\+\_\+\+C\+B\+\_\+\+P\+A\+C\+K\+E\+T\+\_\+\+T\+X\+\_\+\+D\+O\+\_\+\+S\+E\+ND} = 13,
+{\bfseries L\+W\+S\+\_\+\+E\+X\+T\+\_\+\+C\+B\+\_\+\+H\+A\+N\+D\+S\+H\+A\+K\+E\+\_\+\+R\+E\+P\+L\+Y\+\_\+\+TX} = 14,
+{\bfseries L\+W\+S\+\_\+\+E\+X\+T\+\_\+\+C\+B\+\_\+\+F\+L\+U\+S\+H\+\_\+\+P\+E\+N\+D\+I\+N\+G\+\_\+\+TX} = 15,
+\\*
+{\bfseries L\+W\+S\+\_\+\+E\+X\+T\+\_\+\+C\+B\+\_\+\+E\+X\+T\+E\+N\+D\+E\+D\+\_\+\+P\+A\+Y\+L\+O\+A\+D\+\_\+\+RX} = 16,
+{\bfseries L\+W\+S\+\_\+\+E\+X\+T\+\_\+\+C\+B\+\_\+\+C\+A\+N\+\_\+\+P\+R\+O\+X\+Y\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+C\+O\+N\+N\+E\+C\+T\+I\+ON} = 17,
+{\bfseries L\+W\+S\+\_\+\+E\+X\+T\+\_\+\+C\+B\+\_\+1\+HZ} = 18,
+{\bfseries L\+W\+S\+\_\+\+E\+X\+T\+\_\+\+C\+B\+\_\+\+R\+E\+Q\+U\+E\+S\+T\+\_\+\+O\+N\+\_\+\+W\+R\+I\+T\+E\+A\+B\+LE} = 19,
+\\*
+{\bfseries L\+W\+S\+\_\+\+E\+X\+T\+\_\+\+C\+B\+\_\+\+I\+S\+\_\+\+W\+R\+I\+T\+E\+A\+B\+LE} = 20,
+{\bfseries L\+W\+S\+\_\+\+E\+X\+T\+\_\+\+C\+B\+\_\+\+P\+A\+Y\+L\+O\+A\+D\+\_\+\+TX} = 21,
+{\bfseries L\+W\+S\+\_\+\+E\+X\+T\+\_\+\+C\+B\+\_\+\+P\+A\+Y\+L\+O\+A\+D\+\_\+\+RX} = 22,
+{\bfseries L\+W\+S\+\_\+\+E\+X\+T\+\_\+\+C\+B\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+D\+E\+F\+A\+U\+LT} = 23,
+\\*
+{\bfseries L\+W\+S\+\_\+\+E\+X\+T\+\_\+\+C\+B\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+S\+ET} = 24,
+{\bfseries L\+W\+S\+\_\+\+E\+X\+T\+\_\+\+C\+B\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+C\+O\+N\+F\+I\+RM} = 25,
+{\bfseries L\+W\+S\+\_\+\+E\+X\+T\+\_\+\+C\+B\+\_\+\+N\+A\+M\+E\+D\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+S\+ET} = 26
+ \}\hypertarget{group__extensions_gae9993815eee72c6070300a0ae2f022d7}{}\label{group__extensions_gae9993815eee72c6070300a0ae2f022d7}
+
+\item
+enum \hyperlink{group__extensions_gacc9f55936dc165257a2e1f7d47bce89e}{lws\+\_\+ext\+\_\+options\+\_\+types} \{ \hyperlink{group__extensions_ggacc9f55936dc165257a2e1f7d47bce89eaabcf56c456c1ff6e81dc82586a16f14c}{E\+X\+T\+A\+R\+G\+\_\+\+N\+O\+NE},
+\hyperlink{group__extensions_ggacc9f55936dc165257a2e1f7d47bce89ea1c86adf924c8786a12bee9687094673e}{E\+X\+T\+A\+R\+G\+\_\+\+D\+EC},
+\hyperlink{group__extensions_ggacc9f55936dc165257a2e1f7d47bce89ea5265abe3e1c3f64412f2affe7bffd880}{E\+X\+T\+A\+R\+G\+\_\+\+O\+P\+T\+\_\+\+D\+EC}
+ \}
+\item
+enum \hyperlink{group__generic-sessions_ga7c2dc7bfb4ccb91c5d771f9e9ea237e1}{lwsgs\+\_\+auth\+\_\+bits} \{ \hyperlink{group__generic-sessions_gga7c2dc7bfb4ccb91c5d771f9e9ea237e1a81e63075115dedd150265d81b8f7fa57}{L\+W\+S\+G\+S\+\_\+\+A\+U\+T\+H\+\_\+\+L\+O\+G\+G\+E\+D\+\_\+\+IN} = 1,
+\hyperlink{group__generic-sessions_gga7c2dc7bfb4ccb91c5d771f9e9ea237e1a0657a9e846814781b128c397fe4b10bf}{L\+W\+S\+G\+S\+\_\+\+A\+U\+T\+H\+\_\+\+A\+D\+M\+IN} = 2,
+\hyperlink{group__generic-sessions_gga7c2dc7bfb4ccb91c5d771f9e9ea237e1a5a607e4668d20cadada62c4b8007f887}{L\+W\+S\+G\+S\+\_\+\+A\+U\+T\+H\+\_\+\+V\+E\+R\+I\+F\+I\+ED} = 4,
+\hyperlink{group__generic-sessions_gga7c2dc7bfb4ccb91c5d771f9e9ea237e1a2cd8fb86e3b85c106e7711c03f0ddd0a}{L\+W\+S\+G\+S\+\_\+\+A\+U\+T\+H\+\_\+\+F\+O\+R\+G\+O\+T\+\_\+\+F\+L\+OW} = 8
+ \}
+\item
+enum \hyperlink{group__generic-sessions_gaa93946b3d921072209d5cd8cdfa5332e}{lws\+\_\+gs\+\_\+event} \{ \hyperlink{group__generic-sessions_ggaa93946b3d921072209d5cd8cdfa5332ea596010a165bf13473c5eea3a34cd4308}{L\+W\+S\+G\+S\+E\+\_\+\+C\+R\+E\+A\+T\+ED},
+\hyperlink{group__generic-sessions_ggaa93946b3d921072209d5cd8cdfa5332ead908cdc5689c5d22c9d3c8934e94dcde}{L\+W\+S\+G\+S\+E\+\_\+\+D\+E\+L\+E\+T\+ED}
+ \}
+\item
+enum \hyperlink{group__context-and-vhost_ga41c2d763f78cc248df3b9f8645dbd2a5}{lws\+\_\+context\+\_\+options} \{ \\*
+\hyperlink{group__context-and-vhost_gga41c2d763f78cc248df3b9f8645dbd2a5a274ed462a1a9239eb6ddf9007f5b7092}{L\+W\+S\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+R\+E\+Q\+U\+I\+R\+E\+\_\+\+V\+A\+L\+I\+D\+\_\+\+O\+P\+E\+N\+S\+S\+L\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+C\+E\+RT},
+\hyperlink{group__context-and-vhost_gga41c2d763f78cc248df3b9f8645dbd2a5a6582c985ee0ceaadc1d277030eae2d7c}{L\+W\+S\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+S\+K\+I\+P\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+C\+A\+N\+O\+N\+I\+C\+A\+L\+\_\+\+N\+A\+ME} = (1 $<$$<$ 2),
+\hyperlink{group__context-and-vhost_gga41c2d763f78cc248df3b9f8645dbd2a5a1cc4562d05cba52a6dfa0697a65ade0d}{L\+W\+S\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+A\+L\+L\+O\+W\+\_\+\+N\+O\+N\+\_\+\+S\+S\+L\+\_\+\+O\+N\+\_\+\+S\+S\+L\+\_\+\+P\+O\+RT},
+\hyperlink{group__context-and-vhost_gga41c2d763f78cc248df3b9f8645dbd2a5a273d9975675130de0c6dc937dde7c8a6}{L\+W\+S\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+L\+I\+B\+EV} = (1 $<$$<$ 4),
+\\*
+\hyperlink{group__context-and-vhost_gga41c2d763f78cc248df3b9f8645dbd2a5a34ab36e68c0d593b6f19b8d5ef1240a9}{L\+W\+S\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+D\+I\+S\+A\+B\+L\+E\+\_\+\+I\+P\+V6} = (1 $<$$<$ 5),
+\hyperlink{group__context-and-vhost_gga41c2d763f78cc248df3b9f8645dbd2a5a4933347a821e73c3f1e13fb6bfc7ad93}{L\+W\+S\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+D\+I\+S\+A\+B\+L\+E\+\_\+\+O\+S\+\_\+\+C\+A\+\_\+\+C\+E\+R\+TS} = (1 $<$$<$ 6),
+\hyperlink{group__context-and-vhost_gga41c2d763f78cc248df3b9f8645dbd2a5ac56a8a6590e74a8016d0fae09fb404fc}{L\+W\+S\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+P\+E\+E\+R\+\_\+\+C\+E\+R\+T\+\_\+\+N\+O\+T\+\_\+\+R\+E\+Q\+U\+I\+R\+ED} = (1 $<$$<$ 7),
+\hyperlink{group__context-and-vhost_gga41c2d763f78cc248df3b9f8645dbd2a5aa0158b4e85420811e6b0f1378c6ded0f}{L\+W\+S\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+V\+A\+L\+I\+D\+A\+T\+E\+\_\+\+U\+T\+F8} = (1 $<$$<$ 8),
+\\*
+\hyperlink{group__context-and-vhost_gga41c2d763f78cc248df3b9f8645dbd2a5a1b2f8bde0f62adc7ebe81b2043f34c0c}{L\+W\+S\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+S\+S\+L\+\_\+\+E\+C\+DH},
+\hyperlink{group__context-and-vhost_gga41c2d763f78cc248df3b9f8645dbd2a5aff121db04a10cf8b2c5df9d4f2b89f1e}{L\+W\+S\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+L\+I\+B\+UV} = (1 $<$$<$ 10),
+\hyperlink{group__context-and-vhost_gga41c2d763f78cc248df3b9f8645dbd2a5a4832187186c4d130c68051214cd42ada}{L\+W\+S\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+R\+E\+D\+I\+R\+E\+C\+T\+\_\+\+H\+T\+T\+P\+\_\+\+T\+O\+\_\+\+H\+T\+T\+PS},
+\hyperlink{group__context-and-vhost_gga41c2d763f78cc248df3b9f8645dbd2a5a7fed6a527c8d5e0acac1b4179644583a}{L\+W\+S\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+D\+O\+\_\+\+S\+S\+L\+\_\+\+G\+L\+O\+B\+A\+L\+\_\+\+I\+N\+IT} = (1 $<$$<$ 12),
+\\*
+\hyperlink{group__context-and-vhost_gga41c2d763f78cc248df3b9f8645dbd2a5accc9d0d11d1124a21659586164b0962e}{L\+W\+S\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+E\+X\+P\+L\+I\+C\+I\+T\+\_\+\+V\+H\+O\+S\+TS} = (1 $<$$<$ 13),
+\hyperlink{group__context-and-vhost_gga41c2d763f78cc248df3b9f8645dbd2a5a9637e9001d8c8b2521086bcafbd8a941}{L\+W\+S\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+U\+N\+I\+X\+\_\+\+S\+O\+CK} = (1 $<$$<$ 14),
+\hyperlink{group__context-and-vhost_gga41c2d763f78cc248df3b9f8645dbd2a5ac962efd35abf6c402f9fb14aa14f5016}{L\+W\+S\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+S\+TS} = (1 $<$$<$ 15),
+\hyperlink{group__context-and-vhost_gga41c2d763f78cc248df3b9f8645dbd2a5af62887536e25e053e68741006dba46d8}{L\+W\+S\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+I\+P\+V6\+\_\+\+V6\+O\+N\+L\+Y\+\_\+\+M\+O\+D\+I\+FY} = (1 $<$$<$ 16),
+\\*
+\hyperlink{group__context-and-vhost_gga41c2d763f78cc248df3b9f8645dbd2a5aca5d42820b65eac5618ec3f0bd8a1160}{L\+W\+S\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+I\+P\+V6\+\_\+\+V6\+O\+N\+L\+Y\+\_\+\+V\+A\+L\+UE} = (1 $<$$<$ 17)
+ \}
+\item
+enum \hyperlink{group__vhost-mounts_ga31eca18e50cb4357480f2fcad36ff437}{lws\+\_\+mount\+\_\+protocols} \{ \\*
+\hyperlink{group__vhost-mounts_gga31eca18e50cb4357480f2fcad36ff437a1e9f0842b0e85db50fe648ed4ba9a4b0}{L\+W\+S\+M\+P\+R\+O\+\_\+\+H\+T\+TP} = 0,
+\hyperlink{group__vhost-mounts_gga31eca18e50cb4357480f2fcad36ff437afbd10eb4777517ed1f6bfdcf3b9ea1d1}{L\+W\+S\+M\+P\+R\+O\+\_\+\+H\+T\+T\+PS} = 1,
+\hyperlink{group__vhost-mounts_gga31eca18e50cb4357480f2fcad36ff437a42f2361cfe76cd287fa8fcfc502357e2}{L\+W\+S\+M\+P\+R\+O\+\_\+\+F\+I\+LE} = 2,
+\hyperlink{group__vhost-mounts_gga31eca18e50cb4357480f2fcad36ff437a13ab58b01ac6e05f595977f1e0f0db69}{L\+W\+S\+M\+P\+R\+O\+\_\+\+C\+GI} = 3,
+\\*
+\hyperlink{group__vhost-mounts_gga31eca18e50cb4357480f2fcad36ff437aec137a2434851bd856ceebfb697b9970}{L\+W\+S\+M\+P\+R\+O\+\_\+\+R\+E\+D\+I\+R\+\_\+\+H\+T\+TP} = 4,
+\hyperlink{group__vhost-mounts_gga31eca18e50cb4357480f2fcad36ff437a8894d16316863077dfe530963ca59f67}{L\+W\+S\+M\+P\+R\+O\+\_\+\+R\+E\+D\+I\+R\+\_\+\+H\+T\+T\+PS} = 5,
+\hyperlink{group__vhost-mounts_gga31eca18e50cb4357480f2fcad36ff437a946a88cf9c852eed2c0317f4115d19da}{L\+W\+S\+M\+P\+R\+O\+\_\+\+C\+A\+L\+L\+B\+A\+CK} = 6
+ \}
+\item
+enum {\bfseries http\+\_\+status} \{ \\*
+{\bfseries H\+T\+T\+P\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+OK} = 200,
+{\bfseries H\+T\+T\+P\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+N\+O\+\_\+\+C\+O\+N\+T\+E\+NT} = 204,
+{\bfseries H\+T\+T\+P\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+M\+O\+V\+E\+D\+\_\+\+P\+E\+R\+M\+A\+N\+E\+N\+T\+LY} = 301,
+{\bfseries H\+T\+T\+P\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+F\+O\+U\+ND} = 302,
+\\*
+{\bfseries H\+T\+T\+P\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+S\+E\+E\+\_\+\+O\+T\+H\+ER} = 303,
+{\bfseries H\+T\+T\+P\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+B\+A\+D\+\_\+\+R\+E\+Q\+U\+E\+ST} = 400,
+{\bfseries H\+T\+T\+P\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+U\+N\+A\+U\+T\+H\+O\+R\+I\+Z\+ED},
+{\bfseries H\+T\+T\+P\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+P\+A\+Y\+M\+E\+N\+T\+\_\+\+R\+E\+Q\+U\+I\+R\+ED},
+\\*
+{\bfseries H\+T\+T\+P\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+F\+O\+R\+B\+I\+D\+D\+EN},
+{\bfseries H\+T\+T\+P\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+N\+O\+T\+\_\+\+F\+O\+U\+ND},
+{\bfseries H\+T\+T\+P\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+M\+E\+T\+H\+O\+D\+\_\+\+N\+O\+T\+\_\+\+A\+L\+L\+O\+W\+ED},
+{\bfseries H\+T\+T\+P\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+N\+O\+T\+\_\+\+A\+C\+C\+E\+P\+T\+A\+B\+LE},
+\\*
+{\bfseries H\+T\+T\+P\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+P\+R\+O\+X\+Y\+\_\+\+A\+U\+T\+H\+\_\+\+R\+E\+Q\+U\+I\+R\+ED},
+{\bfseries H\+T\+T\+P\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+R\+E\+Q\+U\+E\+S\+T\+\_\+\+T\+I\+M\+E\+O\+UT},
+{\bfseries H\+T\+T\+P\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+C\+O\+N\+F\+L\+I\+CT},
+{\bfseries H\+T\+T\+P\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+G\+O\+NE},
+\\*
+{\bfseries H\+T\+T\+P\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+L\+E\+N\+G\+T\+H\+\_\+\+R\+E\+Q\+U\+I\+R\+ED},
+{\bfseries H\+T\+T\+P\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+P\+R\+E\+C\+O\+N\+D\+I\+T\+I\+O\+N\+\_\+\+F\+A\+I\+L\+ED},
+{\bfseries H\+T\+T\+P\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+R\+E\+Q\+\_\+\+E\+N\+T\+I\+T\+Y\+\_\+\+T\+O\+O\+\_\+\+L\+A\+R\+GE},
+{\bfseries H\+T\+T\+P\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+R\+E\+Q\+\_\+\+U\+R\+I\+\_\+\+T\+O\+O\+\_\+\+L\+O\+NG},
+\\*
+{\bfseries H\+T\+T\+P\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+U\+N\+S\+U\+P\+P\+O\+R\+T\+E\+D\+\_\+\+M\+E\+D\+I\+A\+\_\+\+T\+Y\+PE},
+{\bfseries H\+T\+T\+P\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+R\+E\+Q\+\_\+\+R\+A\+N\+G\+E\+\_\+\+N\+O\+T\+\_\+\+S\+A\+T\+I\+S\+F\+I\+A\+B\+LE},
+{\bfseries H\+T\+T\+P\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+E\+X\+P\+E\+C\+T\+A\+T\+I\+O\+N\+\_\+\+F\+A\+I\+L\+ED},
+{\bfseries H\+T\+T\+P\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+I\+N\+T\+E\+R\+N\+A\+L\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+E\+R\+R\+OR} = 500,
+\\*
+{\bfseries H\+T\+T\+P\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+N\+O\+T\+\_\+\+I\+M\+P\+L\+E\+M\+E\+N\+T\+ED},
+{\bfseries H\+T\+T\+P\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+B\+A\+D\+\_\+\+G\+A\+T\+E\+W\+AY},
+{\bfseries H\+T\+T\+P\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+S\+E\+R\+V\+I\+C\+E\+\_\+\+U\+N\+A\+V\+A\+I\+L\+A\+B\+LE},
+{\bfseries H\+T\+T\+P\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+G\+A\+T\+E\+W\+A\+Y\+\_\+\+T\+I\+M\+E\+O\+UT},
+\\*
+{\bfseries H\+T\+T\+P\+\_\+\+S\+T\+A\+T\+U\+S\+\_\+\+H\+T\+T\+P\+\_\+\+V\+E\+R\+S\+I\+O\+N\+\_\+\+N\+O\+T\+\_\+\+S\+U\+P\+P\+O\+R\+T\+ED}
+ \}\hypertarget{group__html-chunked-substitution_gabc3b93f68c8bdd857ad32913628dfa8d}{}\label{group__html-chunked-substitution_gabc3b93f68c8bdd857ad32913628dfa8d}
+
+\item
+enum {\bfseries lws\+\_\+token\+\_\+indexes} \{ \\*
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+G\+E\+T\+\_\+\+U\+RI} = 0,
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+P\+O\+S\+T\+\_\+\+U\+RI} = 1,
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+O\+P\+T\+I\+O\+N\+S\+\_\+\+U\+RI} = 2,
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+H\+O\+ST} = 3,
+\\*
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+C\+O\+N\+N\+E\+C\+T\+I\+ON} = 4,
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+U\+P\+G\+R\+A\+DE} = 5,
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+O\+R\+I\+G\+IN} = 6,
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+D\+R\+A\+FT} = 7,
+\\*
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+C\+H\+A\+L\+L\+E\+N\+GE} = 8,
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+E\+X\+T\+E\+N\+S\+I\+O\+NS} = 9,
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+K\+E\+Y1} = 10,
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+K\+E\+Y2} = 11,
+\\*
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+P\+R\+O\+T\+O\+C\+OL} = 12,
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+A\+C\+C\+E\+PT} = 13,
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+N\+O\+N\+CE} = 14,
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+H\+T\+TP} = 15,
+\\*
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+H\+T\+T\+P2\+\_\+\+S\+E\+T\+T\+I\+N\+GS} = 16,
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+H\+T\+T\+P\+\_\+\+A\+C\+C\+E\+PT} = 17,
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+H\+T\+T\+P\+\_\+\+A\+C\+\_\+\+R\+E\+Q\+U\+E\+S\+T\+\_\+\+H\+E\+A\+D\+E\+RS} = 18,
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+H\+T\+T\+P\+\_\+\+I\+F\+\_\+\+M\+O\+D\+I\+F\+I\+E\+D\+\_\+\+S\+I\+N\+CE} = 19,
+\\*
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+H\+T\+T\+P\+\_\+\+I\+F\+\_\+\+N\+O\+N\+E\+\_\+\+M\+A\+T\+CH} = 20,
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+H\+T\+T\+P\+\_\+\+A\+C\+C\+E\+P\+T\+\_\+\+E\+N\+C\+O\+D\+I\+NG} = 21,
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+H\+T\+T\+P\+\_\+\+A\+C\+C\+E\+P\+T\+\_\+\+L\+A\+N\+G\+U\+A\+GE} = 22,
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+H\+T\+T\+P\+\_\+\+P\+R\+A\+G\+MA} = 23,
+\\*
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+H\+T\+T\+P\+\_\+\+C\+A\+C\+H\+E\+\_\+\+C\+O\+N\+T\+R\+OL} = 24,
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+H\+T\+T\+P\+\_\+\+A\+U\+T\+H\+O\+R\+I\+Z\+A\+T\+I\+ON} = 25,
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+H\+T\+T\+P\+\_\+\+C\+O\+O\+K\+IE} = 26,
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+H\+T\+T\+P\+\_\+\+C\+O\+N\+T\+E\+N\+T\+\_\+\+L\+E\+N\+G\+TH} = 27,
+\\*
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+H\+T\+T\+P\+\_\+\+C\+O\+N\+T\+E\+N\+T\+\_\+\+T\+Y\+PE} = 28,
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+H\+T\+T\+P\+\_\+\+D\+A\+TE} = 29,
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+H\+T\+T\+P\+\_\+\+R\+A\+N\+GE} = 30,
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+H\+T\+T\+P\+\_\+\+R\+E\+F\+E\+R\+ER} = 31,
+\\*
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+K\+EY} = 32,
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+V\+E\+R\+S\+I\+ON} = 33,
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+S\+W\+O\+R\+I\+G\+IN} = 34,
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+H\+T\+T\+P\+\_\+\+C\+O\+L\+O\+N\+\_\+\+A\+U\+T\+H\+O\+R\+I\+TY} = 35,
+\\*
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+H\+T\+T\+P\+\_\+\+C\+O\+L\+O\+N\+\_\+\+M\+E\+T\+H\+OD} = 36,
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+H\+T\+T\+P\+\_\+\+C\+O\+L\+O\+N\+\_\+\+P\+A\+TH} = 37,
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+H\+T\+T\+P\+\_\+\+C\+O\+L\+O\+N\+\_\+\+S\+C\+H\+E\+ME} = 38,
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+H\+T\+T\+P\+\_\+\+C\+O\+L\+O\+N\+\_\+\+S\+T\+A\+T\+US} = 39,
+\\*
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+H\+T\+T\+P\+\_\+\+A\+C\+C\+E\+P\+T\+\_\+\+C\+H\+A\+R\+S\+ET} = 40,
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+H\+T\+T\+P\+\_\+\+A\+C\+C\+E\+P\+T\+\_\+\+R\+A\+N\+G\+ES} = 41,
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+H\+T\+T\+P\+\_\+\+A\+C\+C\+E\+S\+S\+\_\+\+C\+O\+N\+T\+R\+O\+L\+\_\+\+A\+L\+L\+O\+W\+\_\+\+O\+R\+I\+G\+IN} = 42,
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+H\+T\+T\+P\+\_\+\+A\+GE} = 43,
+\\*
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+H\+T\+T\+P\+\_\+\+A\+L\+L\+OW} = 44,
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+H\+T\+T\+P\+\_\+\+C\+O\+N\+T\+E\+N\+T\+\_\+\+D\+I\+S\+P\+O\+S\+I\+T\+I\+ON} = 45,
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+H\+T\+T\+P\+\_\+\+C\+O\+N\+T\+E\+N\+T\+\_\+\+E\+N\+C\+O\+D\+I\+NG} = 46,
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+H\+T\+T\+P\+\_\+\+C\+O\+N\+T\+E\+N\+T\+\_\+\+L\+A\+N\+G\+U\+A\+GE} = 47,
+\\*
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+H\+T\+T\+P\+\_\+\+C\+O\+N\+T\+E\+N\+T\+\_\+\+L\+O\+C\+A\+T\+I\+ON} = 48,
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+H\+T\+T\+P\+\_\+\+C\+O\+N\+T\+E\+N\+T\+\_\+\+R\+A\+N\+GE} = 49,
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+H\+T\+T\+P\+\_\+\+E\+T\+AG} = 50,
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+H\+T\+T\+P\+\_\+\+E\+X\+P\+E\+CT} = 51,
+\\*
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+H\+T\+T\+P\+\_\+\+E\+X\+P\+I\+R\+ES} = 52,
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+H\+T\+T\+P\+\_\+\+F\+R\+OM} = 53,
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+H\+T\+T\+P\+\_\+\+I\+F\+\_\+\+M\+A\+T\+CH} = 54,
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+H\+T\+T\+P\+\_\+\+I\+F\+\_\+\+R\+A\+N\+GE} = 55,
+\\*
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+H\+T\+T\+P\+\_\+\+I\+F\+\_\+\+U\+N\+M\+O\+D\+I\+F\+I\+E\+D\+\_\+\+S\+I\+N\+CE} = 56,
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+H\+T\+T\+P\+\_\+\+L\+A\+S\+T\+\_\+\+M\+O\+D\+I\+F\+I\+ED} = 57,
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+H\+T\+T\+P\+\_\+\+L\+I\+NK} = 58,
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+H\+T\+T\+P\+\_\+\+L\+O\+C\+A\+T\+I\+ON} = 59,
+\\*
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+H\+T\+T\+P\+\_\+\+M\+A\+X\+\_\+\+F\+O\+R\+W\+A\+R\+DS} = 60,
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+H\+T\+T\+P\+\_\+\+P\+R\+O\+X\+Y\+\_\+\+A\+U\+T\+H\+E\+N\+T\+I\+C\+A\+TE} = 61,
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+H\+T\+T\+P\+\_\+\+P\+R\+O\+X\+Y\+\_\+\+A\+U\+T\+H\+O\+R\+I\+Z\+A\+T\+I\+ON} = 62,
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+H\+T\+T\+P\+\_\+\+R\+E\+F\+R\+E\+SH} = 63,
+\\*
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+H\+T\+T\+P\+\_\+\+R\+E\+T\+R\+Y\+\_\+\+A\+F\+T\+ER} = 64,
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+H\+T\+T\+P\+\_\+\+S\+E\+R\+V\+ER} = 65,
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+H\+T\+T\+P\+\_\+\+S\+E\+T\+\_\+\+C\+O\+O\+K\+IE} = 66,
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+H\+T\+T\+P\+\_\+\+S\+T\+R\+I\+C\+T\+\_\+\+T\+R\+A\+N\+S\+P\+O\+R\+T\+\_\+\+S\+E\+C\+U\+R\+I\+TY} = 67,
+\\*
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+H\+T\+T\+P\+\_\+\+T\+R\+A\+N\+S\+F\+E\+R\+\_\+\+E\+N\+C\+O\+D\+I\+NG} = 68,
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+H\+T\+T\+P\+\_\+\+U\+S\+E\+R\+\_\+\+A\+G\+E\+NT} = 69,
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+H\+T\+T\+P\+\_\+\+V\+A\+RY} = 70,
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+H\+T\+T\+P\+\_\+\+V\+IA} = 71,
+\\*
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+H\+T\+T\+P\+\_\+\+W\+W\+W\+\_\+\+A\+U\+T\+H\+E\+N\+T\+I\+C\+A\+TE} = 72,
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+P\+A\+T\+C\+H\+\_\+\+U\+RI} = 73,
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+P\+U\+T\+\_\+\+U\+RI} = 74,
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+D\+E\+L\+E\+T\+E\+\_\+\+U\+RI} = 75,
+\\*
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+H\+T\+T\+P\+\_\+\+U\+R\+I\+\_\+\+A\+R\+GS} = 76,
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+P\+R\+O\+XY} = 77,
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+H\+T\+T\+P\+\_\+\+X\+\_\+\+R\+E\+A\+L\+\_\+\+IP} = 78,
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+H\+T\+T\+P1\+\_\+0} = 79,
+\\*
+{\bfseries \+\_\+\+W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+S\+E\+N\+T\+\_\+\+P\+R\+O\+T\+O\+C\+O\+LS},
+{\bfseries \+\_\+\+W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+P\+E\+E\+R\+\_\+\+A\+D\+D\+R\+E\+SS},
+{\bfseries \+\_\+\+W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+U\+RI},
+{\bfseries \+\_\+\+W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+H\+O\+ST},
+\\*
+{\bfseries \+\_\+\+W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+O\+R\+I\+G\+IN},
+{\bfseries \+\_\+\+W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+M\+E\+T\+H\+OD},
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+C\+O\+U\+NT},
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+N\+A\+M\+E\+\_\+\+P\+A\+RT},
+\\*
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+S\+K\+I\+P\+P\+I\+NG},
+{\bfseries W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+S\+K\+I\+P\+P\+I\+N\+G\+\_\+\+S\+A\+W\+\_\+\+CR},
+{\bfseries W\+S\+I\+\_\+\+P\+A\+R\+S\+I\+N\+G\+\_\+\+C\+O\+M\+P\+L\+E\+TE},
+{\bfseries W\+S\+I\+\_\+\+I\+N\+I\+T\+\_\+\+T\+O\+K\+E\+N\+\_\+\+M\+U\+X\+U\+RL}
+ \}\hypertarget{group__HTTP-headers-read_ga6e747906f9d76532ec118d6ef418b82e}{}\label{group__HTTP-headers-read_ga6e747906f9d76532ec118d6ef418b82e}
+
+\item
+enum \hyperlink{group__form-parsing_ga41a74a822771d3dce89751aa3bce28ae}{lws\+\_\+spa\+\_\+fileupload\+\_\+states} \{ \hyperlink{group__form-parsing_gga41a74a822771d3dce89751aa3bce28aead3a958e7719ac273c3ba4f684f00c87f}{L\+W\+S\+\_\+\+U\+F\+S\+\_\+\+C\+O\+N\+T\+E\+NT},
+\hyperlink{group__form-parsing_gga41a74a822771d3dce89751aa3bce28aea6ce2a55a4c3695cdb640c893d95bd3a7}{L\+W\+S\+\_\+\+U\+F\+S\+\_\+\+F\+I\+N\+A\+L\+\_\+\+C\+O\+N\+T\+E\+NT},
+\hyperlink{group__form-parsing_gga41a74a822771d3dce89751aa3bce28aea2d25de44865bd44e5a3903a2bab9ca83}{L\+W\+S\+\_\+\+U\+F\+S\+\_\+\+O\+P\+EN}
+ \}
+\item
+enum {\bfseries pending\+\_\+timeout} \{ \\*
+{\bfseries N\+O\+\_\+\+P\+E\+N\+D\+I\+N\+G\+\_\+\+T\+I\+M\+E\+O\+UT} = 0,
+{\bfseries P\+E\+N\+D\+I\+N\+G\+\_\+\+T\+I\+M\+E\+O\+U\+T\+\_\+\+A\+W\+A\+I\+T\+I\+N\+G\+\_\+\+P\+R\+O\+X\+Y\+\_\+\+R\+E\+S\+P\+O\+N\+SE} = 1,
+{\bfseries P\+E\+N\+D\+I\+N\+G\+\_\+\+T\+I\+M\+E\+O\+U\+T\+\_\+\+A\+W\+A\+I\+T\+I\+N\+G\+\_\+\+C\+O\+N\+N\+E\+C\+T\+\_\+\+R\+E\+S\+P\+O\+N\+SE} = 2,
+{\bfseries P\+E\+N\+D\+I\+N\+G\+\_\+\+T\+I\+M\+E\+O\+U\+T\+\_\+\+E\+S\+T\+A\+B\+L\+I\+S\+H\+\_\+\+W\+I\+T\+H\+\_\+\+S\+E\+R\+V\+ER} = 3,
+\\*
+{\bfseries P\+E\+N\+D\+I\+N\+G\+\_\+\+T\+I\+M\+E\+O\+U\+T\+\_\+\+A\+W\+A\+I\+T\+I\+N\+G\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+R\+E\+S\+P\+O\+N\+SE} = 4,
+{\bfseries P\+E\+N\+D\+I\+N\+G\+\_\+\+T\+I\+M\+E\+O\+U\+T\+\_\+\+A\+W\+A\+I\+T\+I\+N\+G\+\_\+\+P\+I\+NG} = 5,
+{\bfseries P\+E\+N\+D\+I\+N\+G\+\_\+\+T\+I\+M\+E\+O\+U\+T\+\_\+\+C\+L\+O\+S\+E\+\_\+\+A\+CK} = 6,
+{\bfseries P\+E\+N\+D\+I\+N\+G\+\_\+\+T\+I\+M\+E\+O\+U\+T\+\_\+\+A\+W\+A\+I\+T\+I\+N\+G\+\_\+\+E\+X\+T\+E\+N\+S\+I\+O\+N\+\_\+\+C\+O\+N\+N\+E\+C\+T\+\_\+\+R\+E\+S\+P\+O\+N\+SE} = 7,
+\\*
+{\bfseries P\+E\+N\+D\+I\+N\+G\+\_\+\+T\+I\+M\+E\+O\+U\+T\+\_\+\+S\+E\+N\+T\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+H\+A\+N\+D\+S\+H\+A\+KE} = 8,
+{\bfseries P\+E\+N\+D\+I\+N\+G\+\_\+\+T\+I\+M\+E\+O\+U\+T\+\_\+\+S\+S\+L\+\_\+\+A\+C\+C\+E\+PT} = 9,
+{\bfseries P\+E\+N\+D\+I\+N\+G\+\_\+\+T\+I\+M\+E\+O\+U\+T\+\_\+\+H\+T\+T\+P\+\_\+\+C\+O\+N\+T\+E\+NT} = 10,
+{\bfseries P\+E\+N\+D\+I\+N\+G\+\_\+\+T\+I\+M\+E\+O\+U\+T\+\_\+\+A\+W\+A\+I\+T\+I\+N\+G\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+H\+S\+\_\+\+S\+E\+ND} = 11,
+\\*
+{\bfseries P\+E\+N\+D\+I\+N\+G\+\_\+\+F\+L\+U\+S\+H\+\_\+\+S\+T\+O\+R\+E\+D\+\_\+\+S\+E\+N\+D\+\_\+\+B\+E\+F\+O\+R\+E\+\_\+\+C\+L\+O\+SE} = 12,
+{\bfseries P\+E\+N\+D\+I\+N\+G\+\_\+\+T\+I\+M\+E\+O\+U\+T\+\_\+\+S\+H\+U\+T\+D\+O\+W\+N\+\_\+\+F\+L\+U\+SH} = 13,
+{\bfseries P\+E\+N\+D\+I\+N\+G\+\_\+\+T\+I\+M\+E\+O\+U\+T\+\_\+\+C\+GI} = 14,
+{\bfseries P\+E\+N\+D\+I\+N\+G\+\_\+\+T\+I\+M\+E\+O\+U\+T\+\_\+\+H\+T\+T\+P\+\_\+\+K\+E\+E\+P\+A\+L\+I\+V\+E\+\_\+\+I\+D\+LE} = 15
+ \}\hypertarget{group__timeout_ga2c0aa4b9c3c55bae7b35cbfac3246c87}{}\label{group__timeout_ga2c0aa4b9c3c55bae7b35cbfac3246c87}
+
+\item
+enum \hyperlink{group__sending-data_ga98b099cf8c1c7e38ad78501f270e193d}{lws\+\_\+write\+\_\+protocol} \{ \\*
+\hyperlink{group__sending-data_gga98b099cf8c1c7e38ad78501f270e193da80e8f169fda236c56bfb795ed62903db}{L\+W\+S\+\_\+\+W\+R\+I\+T\+E\+\_\+\+T\+E\+XT} = 0,
+\hyperlink{group__sending-data_gga98b099cf8c1c7e38ad78501f270e193daf6486c0dba50c44198100717721d9ab2}{L\+W\+S\+\_\+\+W\+R\+I\+T\+E\+\_\+\+B\+I\+N\+A\+RY} = 1,
+\hyperlink{group__sending-data_gga98b099cf8c1c7e38ad78501f270e193da10047eb05b5e1c298151dc47a5b44826}{L\+W\+S\+\_\+\+W\+R\+I\+T\+E\+\_\+\+C\+O\+N\+T\+I\+N\+U\+A\+T\+I\+ON} = 2,
+\hyperlink{group__sending-data_gga98b099cf8c1c7e38ad78501f270e193dabb6705e1d1327cdda5025be28f07712e}{L\+W\+S\+\_\+\+W\+R\+I\+T\+E\+\_\+\+H\+T\+TP} = 3,
+\\*
+{\bfseries L\+W\+S\+\_\+\+W\+R\+I\+T\+E\+\_\+\+P\+I\+NG} = 5,
+{\bfseries L\+W\+S\+\_\+\+W\+R\+I\+T\+E\+\_\+\+P\+O\+NG} = 6,
+{\bfseries L\+W\+S\+\_\+\+W\+R\+I\+T\+E\+\_\+\+H\+T\+T\+P\+\_\+\+F\+I\+N\+AL} = 7,
+\hyperlink{group__sending-data_gga98b099cf8c1c7e38ad78501f270e193dafe5a38e940ce56708ac814627e9c0917}{L\+W\+S\+\_\+\+W\+R\+I\+T\+E\+\_\+\+H\+T\+T\+P\+\_\+\+H\+E\+A\+D\+E\+RS} = 8,
+\\*
+\hyperlink{group__sending-data_gga98b099cf8c1c7e38ad78501f270e193da115440f272a5d55518adfc8099acfee3}{L\+W\+S\+\_\+\+W\+R\+I\+T\+E\+\_\+\+N\+O\+\_\+\+F\+IN} = 0x40,
+\hyperlink{group__sending-data_gga98b099cf8c1c7e38ad78501f270e193da220d8e8652d9b97fb66e476e2a60ffce}{L\+W\+S\+\_\+\+W\+R\+I\+T\+E\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+I\+G\+N\+O\+R\+E\+\_\+\+X\+O\+R\+\_\+\+M\+A\+SK} = 0x80
+ \}
+\item
+enum {\bfseries lws\+\_\+enum\+\_\+stdinouterr} \{ {\bfseries L\+W\+S\+\_\+\+S\+T\+D\+IN} = 0,
+{\bfseries L\+W\+S\+\_\+\+S\+T\+D\+O\+UT} = 1,
+{\bfseries L\+W\+S\+\_\+\+S\+T\+D\+E\+RR} = 2
+ \}\hypertarget{libwebsockets_8h_a2271141d8be8d72b47ba327130b4905f}{}\label{libwebsockets_8h_a2271141d8be8d72b47ba327130b4905f}
+
+\item
+enum {\bfseries lws\+\_\+cgi\+\_\+hdr\+\_\+state} \{ \\*
+{\bfseries L\+C\+H\+S\+\_\+\+H\+E\+A\+D\+ER},
+{\bfseries L\+C\+H\+S\+\_\+\+C\+R1},
+{\bfseries L\+C\+H\+S\+\_\+\+L\+F1},
+{\bfseries L\+C\+H\+S\+\_\+\+C\+R2},
+\\*
+{\bfseries L\+C\+H\+S\+\_\+\+L\+F2},
+{\bfseries L\+H\+C\+S\+\_\+\+P\+A\+Y\+L\+O\+AD},
+{\bfseries L\+C\+H\+S\+\_\+\+S\+I\+N\+G\+L\+E\+\_\+0A}
+ \}\hypertarget{libwebsockets_8h_a42394a38f08a97420c98127358cfeedb}{}\label{libwebsockets_8h_a42394a38f08a97420c98127358cfeedb}
+
+\item
+enum \hyperlink{group__smtp_ga116be79bf44f9dc2a97f46e051fe4dc0}{lwsgs\+\_\+smtp\+\_\+states} \{ \\*
+\hyperlink{group__smtp_gga116be79bf44f9dc2a97f46e051fe4dc0a29e5b0ecf75375b5a643faa3d6222b7c}{L\+G\+S\+S\+M\+T\+P\+\_\+\+I\+D\+LE},
+\hyperlink{group__smtp_gga116be79bf44f9dc2a97f46e051fe4dc0ab89442b7a3ca2b94c3cdcf33756eb933}{L\+G\+S\+S\+M\+T\+P\+\_\+\+C\+O\+N\+N\+E\+C\+T\+I\+NG},
+\hyperlink{group__smtp_gga116be79bf44f9dc2a97f46e051fe4dc0ab61778f70ecac007b334bb14942eb41d}{L\+G\+S\+S\+M\+T\+P\+\_\+\+C\+O\+N\+N\+E\+C\+T\+ED},
+\hyperlink{group__smtp_gga116be79bf44f9dc2a97f46e051fe4dc0a1dfec948a864205cec875f63cbe0d4ad}{L\+G\+S\+S\+M\+T\+P\+\_\+\+S\+E\+N\+T\+\_\+\+H\+E\+LO},
+\\*
+\hyperlink{group__smtp_gga116be79bf44f9dc2a97f46e051fe4dc0a929bb4623ff3f585108aba2a1b047fab}{L\+G\+S\+S\+M\+T\+P\+\_\+\+S\+E\+N\+T\+\_\+\+F\+R\+OM},
+\hyperlink{group__smtp_gga116be79bf44f9dc2a97f46e051fe4dc0aae20a0cb95b97a70f6b45d0ed2d5be83}{L\+G\+S\+S\+M\+T\+P\+\_\+\+S\+E\+N\+T\+\_\+\+TO},
+\hyperlink{group__smtp_gga116be79bf44f9dc2a97f46e051fe4dc0a85e3c452950c09a79086bff4b9be5c14}{L\+G\+S\+S\+M\+T\+P\+\_\+\+S\+E\+N\+T\+\_\+\+D\+A\+TA},
+\hyperlink{group__smtp_gga116be79bf44f9dc2a97f46e051fe4dc0a38fba41f28d754e38079b31418a86a69}{L\+G\+S\+S\+M\+T\+P\+\_\+\+S\+E\+N\+T\+\_\+\+B\+O\+DY},
+\\*
+\hyperlink{group__smtp_gga116be79bf44f9dc2a97f46e051fe4dc0a2c2ed16ffc572326e3040684084b21d5}{L\+G\+S\+S\+M\+T\+P\+\_\+\+S\+E\+N\+T\+\_\+\+Q\+U\+IT}
+ \}
+\end{DoxyCompactItemize}
+\subsection*{Functions}
+\begin{DoxyCompactItemize}
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN void {\bfseries \+\_\+lws\+\_\+log} (int filter, const char $\ast$format,...)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN void {\bfseries \+\_\+lws\+\_\+logv} (int filter, const char $\ast$format, va\+\_\+list vl)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int \hyperlink{group__log_ga42e39775c6b69b7251bdbf5a2cdd5dcd}{lwsl\+\_\+timestamp} (int level, char $\ast$p, int len)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN void \hyperlink{group__log_ga898b1f03872ad019f507d4e35bbefa90}{lwsl\+\_\+hexdump} (void $\ast$buf, size\+\_\+t len)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN void \hyperlink{group__log_ga244647f9e1bf0097ccdde66d74f41e26}{lws\+\_\+set\+\_\+log\+\_\+level} (int level, void($\ast$log\+\_\+emit\+\_\+function)(int level, const char $\ast$line))
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN void \hyperlink{group__log_gab7c0fc936cc9f1eb58e2bb234c15147c}{lwsl\+\_\+emit\+\_\+syslog} (int level, const char $\ast$line)
+\item
+void $\ast$ {\bfseries mbed3\+\_\+create\+\_\+tcp\+\_\+stream\+\_\+socket} (void)\hypertarget{libwebsockets_8h_a0b056fdcf949a838ff82209b4a627dd9}{}\label{libwebsockets_8h_a0b056fdcf949a838ff82209b4a627dd9}
+
+\item
+void {\bfseries mbed3\+\_\+delete\+\_\+tcp\+\_\+stream\+\_\+socket} (void $\ast$sockfd)\hypertarget{libwebsockets_8h_aefb2f20fe5bb29d79701a399838ef4ce}{}\label{libwebsockets_8h_aefb2f20fe5bb29d79701a399838ef4ce}
+
+\item
+void {\bfseries mbed3\+\_\+tcp\+\_\+stream\+\_\+bind} (void $\ast$sock, int port, struct lws $\ast$)\hypertarget{libwebsockets_8h_a9f2a8506fd963db95a5103823c60fb0a}{}\label{libwebsockets_8h_a9f2a8506fd963db95a5103823c60fb0a}
+
+\item
+void {\bfseries mbed3\+\_\+tcp\+\_\+stream\+\_\+accept} (void $\ast$sock, struct lws $\ast$)\hypertarget{libwebsockets_8h_a9032a3062641d334161c29adcc4fa15d}{}\label{libwebsockets_8h_a9032a3062641d334161c29adcc4fa15d}
+
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN void \hyperlink{group__wsclose_gaa1c863415d1783cd8de7938aa6efa262}{lws\+\_\+close\+\_\+reason} (struct lws $\ast$wsi, enum \hyperlink{group__wsclose_gae399c571df32ba532c0ca67da9284985}{lws\+\_\+close\+\_\+status} status, unsigned char $\ast$buf, size\+\_\+t len)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int \hyperlink{group__extensions_gae0e24e1768f83a7fb07896ce975704b9}{lws\+\_\+set\+\_\+extension\+\_\+option} (struct lws $\ast$wsi, const char $\ast$ext\+\_\+name, const char $\ast$opt\+\_\+name, const char $\ast$opt\+\_\+val)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int L\+W\+S\+\_\+\+W\+A\+R\+N\+\_\+\+U\+N\+U\+S\+E\+D\+\_\+\+R\+E\+S\+U\+LT \hyperlink{group__extensions_ga6fb3e2c3dfb9d64dc87026a4e99c128b}{lws\+\_\+ext\+\_\+parse\+\_\+options} (const struct \hyperlink{structlws__extension}{lws\+\_\+extension} $\ast$ext, struct lws $\ast$wsi, void $\ast$ext\+\_\+user, const struct \hyperlink{structlws__ext__options}{lws\+\_\+ext\+\_\+options} $\ast$opts, const char $\ast$o, int len)
+\item
+L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int \hyperlink{group__extensions_ga4cdbe42d872e21a448a947714d6c607e}{lws\+\_\+extension\+\_\+callback\+\_\+pm\+\_\+deflate} (struct lws\+\_\+context $\ast$context, const struct \hyperlink{structlws__extension}{lws\+\_\+extension} $\ast$ext, struct lws $\ast$wsi, enum lws\+\_\+extension\+\_\+callback\+\_\+reasons reason, void $\ast$user, void $\ast$in, size\+\_\+t len)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN const struct \hyperlink{structlws__protocols}{lws\+\_\+protocols} $\ast$ \hyperlink{group__Protocols-and-Plugins_ga25754726d97c5f519d313e691a9fe29d}{lws\+\_\+vhost\+\_\+name\+\_\+to\+\_\+protocol} (struct lws\+\_\+vhost $\ast$vh, const char $\ast$name)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN const struct \hyperlink{structlws__protocols}{lws\+\_\+protocols} $\ast$ \hyperlink{group__Protocols-and-Plugins_ga72ad550786ca7976463589d347e62112}{lws\+\_\+get\+\_\+protocol} (struct lws $\ast$wsi)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN const struct \hyperlink{structlws__protocols}{lws\+\_\+protocols} $\ast$ \hyperlink{group__Protocols-and-Plugins_ga8bbe5e65faca068845704bab911a5030}{lws\+\_\+protocol\+\_\+get} (struct lws $\ast$wsi) L\+W\+S\+\_\+\+W\+A\+R\+N\+\_\+\+D\+E\+P\+R\+E\+C\+A\+T\+ED
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN void $\ast$ \hyperlink{group__Protocols-and-Plugins_gaec0c0477288ff3f83aff38d357b883d1}{lws\+\_\+protocol\+\_\+vh\+\_\+priv\+\_\+zalloc} (struct lws\+\_\+vhost $\ast$vhost, const struct \hyperlink{structlws__protocols}{lws\+\_\+protocols} $\ast$prot, int size)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN void $\ast$ \hyperlink{group__Protocols-and-Plugins_gaf3be4243443baac0f8be1fcfb4d25129}{lws\+\_\+protocol\+\_\+vh\+\_\+priv\+\_\+get} (struct lws\+\_\+vhost $\ast$vhost, const struct \hyperlink{structlws__protocols}{lws\+\_\+protocols} $\ast$prot)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int \hyperlink{group__Protocols-and-Plugins_ga106b37ae9c247e84d191ab09441adc43}{lws\+\_\+finalize\+\_\+startup} (struct lws\+\_\+context $\ast$context)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN struct lws\+\_\+context $\ast$ \hyperlink{group__context-and-vhost_gaf2fff58562caab7510c41eeac85a8648}{lws\+\_\+create\+\_\+context} (struct \hyperlink{structlws__context__creation__info}{lws\+\_\+context\+\_\+creation\+\_\+info} $\ast$info)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN void \hyperlink{group__context-and-vhost_ga8ee0314028755f1ddfa9428e09b4fddb}{lws\+\_\+context\+\_\+destroy} (struct lws\+\_\+context $\ast$context)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int \hyperlink{group__context-and-vhost_ga7e9d5405547a457d86e0b4f0ae2bb1c4}{lws\+\_\+set\+\_\+proxy} (struct lws\+\_\+vhost $\ast$vhost, const char $\ast$proxy)
+\item
+L\+W\+S\+\_\+\+E\+X\+T\+E\+RN L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE struct lws\+\_\+vhost $\ast$ \hyperlink{group__context-and-vhost_ga0c54c667ccd9b8b3dddcd123ca72f87c}{lws\+\_\+create\+\_\+vhost} (struct lws\+\_\+context $\ast$context, struct \hyperlink{structlws__context__creation__info}{lws\+\_\+context\+\_\+creation\+\_\+info} $\ast$info)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int \hyperlink{group__context-and-vhost_ga98d88c9080fd89c37114363a6474ea73}{lwsws\+\_\+get\+\_\+config\+\_\+globals} (struct \hyperlink{structlws__context__creation__info}{lws\+\_\+context\+\_\+creation\+\_\+info} $\ast$info, const char $\ast$d, char $\ast$$\ast$config\+\_\+strings, int $\ast$len)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int \hyperlink{group__context-and-vhost_ga341064721add2618ae1b29717493a212}{lwsws\+\_\+get\+\_\+config\+\_\+vhosts} (struct lws\+\_\+context $\ast$context, struct \hyperlink{structlws__context__creation__info}{lws\+\_\+context\+\_\+creation\+\_\+info} $\ast$info, const char $\ast$d, char $\ast$$\ast$config\+\_\+strings, int $\ast$len)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN struct lws\+\_\+vhost $\ast$ \hyperlink{group__context-and-vhost_ga8db03e19a372e34ac25cf21af894a02c}{lws\+\_\+vhost\+\_\+get} (struct lws $\ast$wsi) L\+W\+S\+\_\+\+W\+A\+R\+N\+\_\+\+D\+E\+P\+R\+E\+C\+A\+T\+ED
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN struct lws\+\_\+vhost $\ast$ \hyperlink{group__context-and-vhost_ga06e77ce2916f8bc9826ef8d9d68e3932}{lws\+\_\+get\+\_\+vhost} (struct lws $\ast$wsi)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int \hyperlink{group__context-and-vhost_ga94e6cc2223c4eec316b13bcebc3628b6}{lws\+\_\+json\+\_\+dump\+\_\+vhost} (const struct lws\+\_\+vhost $\ast$vh, char $\ast$buf, int len)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int \hyperlink{group__context-and-vhost_gae2134657cdd2ea7a59e13ad314e4c50d}{lws\+\_\+json\+\_\+dump\+\_\+context} (const struct lws\+\_\+context $\ast$context, char $\ast$buf, int len)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN void $\ast$ \hyperlink{group__context-and-vhost_gaeb12f934bfd178bd2132a9e73fc641da}{lws\+\_\+context\+\_\+user} (struct lws\+\_\+context $\ast$context)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN struct lws $\ast$L\+W\+S\+\_\+\+W\+A\+R\+N\+\_\+\+U\+N\+U\+S\+E\+D\+\_\+\+R\+E\+S\+U\+LT \hyperlink{group__client_gac30a7be106abd0cedfbb2e8b8fe3a2f5}{lws\+\_\+client\+\_\+connect\+\_\+via\+\_\+info} (struct \hyperlink{structlws__client__connect__info}{lws\+\_\+client\+\_\+connect\+\_\+info} $\ast$ccinfo)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN struct lws $\ast$L\+W\+S\+\_\+\+W\+A\+R\+N\+\_\+\+U\+N\+U\+S\+E\+D\+\_\+\+R\+E\+S\+U\+LT \hyperlink{group__client_ga4af0a20108a95e8b6d94dd4d80055ff3}{lws\+\_\+client\+\_\+connect} (struct lws\+\_\+context $\ast$clients, const char $\ast$address, int port, int ssl\+\_\+connection, const char $\ast$path, const char $\ast$host, const char $\ast$origin, const char $\ast$protocol, int ietf\+\_\+version\+\_\+or\+\_\+minus\+\_\+one) L\+W\+S\+\_\+\+W\+A\+R\+N\+\_\+\+D\+E\+P\+R\+E\+C\+A\+T\+ED
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN struct lws $\ast$L\+W\+S\+\_\+\+W\+A\+R\+N\+\_\+\+U\+N\+U\+S\+E\+D\+\_\+\+R\+E\+S\+U\+LT \hyperlink{group__client_gac6a8558b4410961a880241c2ac1271e2}{lws\+\_\+client\+\_\+connect\+\_\+extended} (struct lws\+\_\+context $\ast$clients, const char $\ast$address, int port, int ssl\+\_\+connection, const char $\ast$path, const char $\ast$host, const char $\ast$origin, const char $\ast$protocol, int ietf\+\_\+version\+\_\+or\+\_\+minus\+\_\+one, void $\ast$userdata) L\+W\+S\+\_\+\+W\+A\+R\+N\+\_\+\+D\+E\+P\+R\+E\+C\+A\+T\+ED
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int \hyperlink{group__client_ga4f44b8230e6732816ca5cd8d1aaaf340}{lws\+\_\+init\+\_\+vhost\+\_\+client\+\_\+ssl} (const struct \hyperlink{structlws__context__creation__info}{lws\+\_\+context\+\_\+creation\+\_\+info} $\ast$info, struct lws\+\_\+vhost $\ast$vhost)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int {\bfseries lws\+\_\+http\+\_\+client\+\_\+read} (struct lws $\ast$wsi, char $\ast$$\ast$buf, int $\ast$len)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int \hyperlink{group__service_gaf95bd0c663d6516a0c80047d9b1167a8}{lws\+\_\+service} (struct lws\+\_\+context $\ast$context, int timeout\+\_\+ms)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int \hyperlink{group__service_ga9b3cc4473fd8848e5bbee7f310712939}{lws\+\_\+service\+\_\+tsi} (struct lws\+\_\+context $\ast$context, int timeout\+\_\+ms, int tsi)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN void \hyperlink{group__service_ga29c246707997ab7a466aa709aecd2d7b}{lws\+\_\+cancel\+\_\+service\+\_\+pt} (struct lws $\ast$wsi)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN void \hyperlink{group__service_ga53e3d0801dfda7960a7249dd559e68a2}{lws\+\_\+cancel\+\_\+service} (struct lws\+\_\+context $\ast$context)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int \hyperlink{group__service_gad82efa5466d14a9f05aa06416375b28d}{lws\+\_\+service\+\_\+fd} (struct lws\+\_\+context $\ast$context, struct \hyperlink{structlws__pollfd}{lws\+\_\+pollfd} $\ast$\hyperlink{structpollfd}{pollfd})
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int \hyperlink{group__service_gaebf426eda371ba23642fc11d8e0ace6b}{lws\+\_\+service\+\_\+fd\+\_\+tsi} (struct lws\+\_\+context $\ast$context, struct \hyperlink{structlws__pollfd}{lws\+\_\+pollfd} $\ast$\hyperlink{structpollfd}{pollfd}, int tsi)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int \hyperlink{group__httpft_gab393a06d3d2722af4c3f8b06842c80d7}{lws\+\_\+serve\+\_\+http\+\_\+file} (struct lws $\ast$wsi, const char $\ast$file, const char $\ast$content\+\_\+type, const char $\ast$other\+\_\+headers, int other\+\_\+headers\+\_\+len)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int {\bfseries lws\+\_\+serve\+\_\+http\+\_\+file\+\_\+fragment} (struct lws $\ast$wsi)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int \hyperlink{group__html-chunked-substitution_ga643073f918c0a7016b690aae9793fd60}{lws\+\_\+chunked\+\_\+html\+\_\+process} (struct \hyperlink{structlws__process__html__args}{lws\+\_\+process\+\_\+html\+\_\+args} $\ast$args, struct \hyperlink{structlws__process__html__state}{lws\+\_\+process\+\_\+html\+\_\+state} $\ast$s)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN const unsigned char $\ast$ \hyperlink{group__HTTP-headers-read_ga2c0597b2ef1d2cee35736c338bcbd17b}{lws\+\_\+token\+\_\+to\+\_\+string} (enum lws\+\_\+token\+\_\+indexes token)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int L\+W\+S\+\_\+\+W\+A\+R\+N\+\_\+\+U\+N\+U\+S\+E\+D\+\_\+\+R\+E\+S\+U\+LT \hyperlink{group__HTTP-headers-read_ga8ade0e1ffb0da7e62b989d8d867bf6c8}{lws\+\_\+hdr\+\_\+total\+\_\+length} (struct lws $\ast$wsi, enum lws\+\_\+token\+\_\+indexes h)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int L\+W\+S\+\_\+\+W\+A\+R\+N\+\_\+\+U\+N\+U\+S\+E\+D\+\_\+\+R\+E\+S\+U\+LT \hyperlink{group__HTTP-headers-read_ga594f3d0ece5b09c2ccf9f98ea533bb4e}{lws\+\_\+hdr\+\_\+fragment\+\_\+length} (struct lws $\ast$wsi, enum lws\+\_\+token\+\_\+indexes h, int frag\+\_\+idx)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int \hyperlink{group__HTTP-headers-read_ga6ce6aa1c0155ea42b7708bed271d1c77}{lws\+\_\+hdr\+\_\+copy} (struct lws $\ast$wsi, char $\ast$dest, int len, enum lws\+\_\+token\+\_\+indexes h)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int \hyperlink{group__HTTP-headers-read_gaa427cad61a9a5e3004afd65c4527b5e9}{lws\+\_\+hdr\+\_\+copy\+\_\+fragment} (struct lws $\ast$wsi, char $\ast$dest, int len, enum lws\+\_\+token\+\_\+indexes h, int frag\+\_\+idx)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN const char $\ast$ \hyperlink{group__HTTP-headers-read_ga84e9ce5e71a77501a0998ac403a984c2}{lws\+\_\+get\+\_\+urlarg\+\_\+by\+\_\+name} (struct lws $\ast$wsi, const char $\ast$name, char $\ast$buf, int len)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int L\+W\+S\+\_\+\+W\+A\+R\+N\+\_\+\+U\+N\+U\+S\+E\+D\+\_\+\+R\+E\+S\+U\+LT \hyperlink{group__HTTP-headers-create_ga29b7d6d2ddfdbaff3d8b607e7e3151b6}{lws\+\_\+add\+\_\+http\+\_\+header\+\_\+status} (struct lws $\ast$wsi, unsigned int code, unsigned char $\ast$$\ast$p, unsigned char $\ast$end)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int L\+W\+S\+\_\+\+W\+A\+R\+N\+\_\+\+U\+N\+U\+S\+E\+D\+\_\+\+R\+E\+S\+U\+LT \hyperlink{group__HTTP-headers-create_ga2b36bf44405755ff51c1939303b995a8}{lws\+\_\+add\+\_\+http\+\_\+header\+\_\+by\+\_\+name} (struct lws $\ast$wsi, const unsigned char $\ast$name, const unsigned char $\ast$value, int length, unsigned char $\ast$$\ast$p, unsigned char $\ast$end)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int L\+W\+S\+\_\+\+W\+A\+R\+N\+\_\+\+U\+N\+U\+S\+E\+D\+\_\+\+R\+E\+S\+U\+LT \hyperlink{group__HTTP-headers-create_gaf74adb761b22566ad70004882712dce1}{lws\+\_\+add\+\_\+http\+\_\+header\+\_\+by\+\_\+token} (struct lws $\ast$wsi, enum lws\+\_\+token\+\_\+indexes token, const unsigned char $\ast$value, int length, unsigned char $\ast$$\ast$p, unsigned char $\ast$end)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int L\+W\+S\+\_\+\+W\+A\+R\+N\+\_\+\+U\+N\+U\+S\+E\+D\+\_\+\+R\+E\+S\+U\+LT \hyperlink{group__HTTP-headers-create_gacc76a5babcb4dce1b01b1955aa7a2faf}{lws\+\_\+add\+\_\+http\+\_\+header\+\_\+content\+\_\+length} (struct lws $\ast$wsi, unsigned long content\+\_\+length, unsigned char $\ast$$\ast$p, unsigned char $\ast$end)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int L\+W\+S\+\_\+\+W\+A\+R\+N\+\_\+\+U\+N\+U\+S\+E\+D\+\_\+\+R\+E\+S\+U\+LT \hyperlink{group__HTTP-headers-create_ga4887605ff2242a54db3a7fa01f6f864b}{lws\+\_\+finalize\+\_\+http\+\_\+header} (struct lws $\ast$wsi, unsigned char $\ast$$\ast$p, unsigned char $\ast$end)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN struct lws\+\_\+spa $\ast$ \hyperlink{group__form-parsing_ga162f86762173a2bc8c28497941d74815}{lws\+\_\+spa\+\_\+create} (struct lws $\ast$wsi, const char $\ast$const $\ast$param\+\_\+names, int count\+\_\+params, int max\+\_\+storage, \hyperlink{group__form-parsing_ga5a70527c0861c2ffa3d29333a6aa7f8e}{lws\+\_\+spa\+\_\+fileupload\+\_\+cb} opt\+\_\+cb, void $\ast$opt\+\_\+data)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int \hyperlink{group__form-parsing_ga9ad9ebf5ea1a7108415ed7e04cb231d2}{lws\+\_\+spa\+\_\+process} (struct lws\+\_\+spa $\ast$spa, const char $\ast$in, int len)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int \hyperlink{group__form-parsing_ga83835bf250ee3d4a60f36a182f2b8d24}{lws\+\_\+spa\+\_\+finalize} (struct lws\+\_\+spa $\ast$spa)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int \hyperlink{group__form-parsing_ga3fbe378632f85ec9a14cc2c1687bf05f}{lws\+\_\+spa\+\_\+get\+\_\+length} (struct lws\+\_\+spa $\ast$spa, int n)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN const char $\ast$ \hyperlink{group__form-parsing_ga2da476217166da02704b90d3a8d4f3cd}{lws\+\_\+spa\+\_\+get\+\_\+string} (struct lws\+\_\+spa $\ast$spa, int n)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int \hyperlink{group__form-parsing_gaaa482f07dad3f04b391cccf0a814e13b}{lws\+\_\+spa\+\_\+destroy} (struct lws\+\_\+spa $\ast$spa)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN const char $\ast$ \hyperlink{group__urlendec_gabc2888476e50e001c875c1a8abf455b7}{lws\+\_\+urlencode} (char $\ast$escaped, const char $\ast$string, int len)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int \hyperlink{group__urlendec_gaa373a9c16acdd96c395af61ab915ece3}{lws\+\_\+urldecode} (char $\ast$string, const char $\ast$escaped, int len)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int \hyperlink{group__http_gac8a4a71240857dc6b2ed70456b6923f4}{lws\+\_\+return\+\_\+http\+\_\+status} (struct lws $\ast$wsi, unsigned int code, const char $\ast$html\+\_\+body)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int L\+W\+S\+\_\+\+W\+A\+R\+N\+\_\+\+U\+N\+U\+S\+E\+D\+\_\+\+R\+E\+S\+U\+LT \hyperlink{group__http_ga8fbf01e473ac421fc33ad9f8da8b8a25}{lws\+\_\+http\+\_\+redirect} (struct lws $\ast$wsi, int code, const unsigned char $\ast$loc, int len, unsigned char $\ast$$\ast$p, unsigned char $\ast$end)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int L\+W\+S\+\_\+\+W\+A\+R\+N\+\_\+\+U\+N\+U\+S\+E\+D\+\_\+\+R\+E\+S\+U\+LT \hyperlink{group__http_gad27aed6c66a41b2b89ffe4da2a309e8a}{lws\+\_\+http\+\_\+transaction\+\_\+completed} (struct lws $\ast$wsi)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN const char $\ast$ \hyperlink{group__pur_ga9cc82f06e5ae7e71458626d7a39a5865}{lws\+\_\+sql\+\_\+purify} (char $\ast$escaped, const char $\ast$string, int len)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN const char $\ast$ \hyperlink{group__pur_gab15187efcfa256b7c928562c182b92a3}{lws\+\_\+json\+\_\+purify} (char $\ast$escaped, const char $\ast$string, int len)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int {\bfseries lws\+\_\+ev\+\_\+sigint\+\_\+cfg} (struct lws\+\_\+context $\ast$context, int use\+\_\+ev\+\_\+sigint, lws\+\_\+ev\+\_\+signal\+\_\+cb\+\_\+t $\ast$cb)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int {\bfseries lws\+\_\+ev\+\_\+initloop} (struct lws\+\_\+context $\ast$context, struct ev\+\_\+loop $\ast$loop, int tsi)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN void {\bfseries lws\+\_\+ev\+\_\+sigint\+\_\+cb} (struct ev\+\_\+loop $\ast$loop, struct ev\+\_\+signal $\ast$watcher, int revents)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int {\bfseries lws\+\_\+uv\+\_\+sigint\+\_\+cfg} (struct lws\+\_\+context $\ast$context, int use\+\_\+uv\+\_\+sigint, uv\+\_\+signal\+\_\+cb cb)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN void {\bfseries lws\+\_\+libuv\+\_\+run} (const struct lws\+\_\+context $\ast$context, int tsi)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN void {\bfseries lws\+\_\+libuv\+\_\+stop} (struct lws\+\_\+context $\ast$context)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int {\bfseries lws\+\_\+uv\+\_\+initloop} (struct lws\+\_\+context $\ast$context, uv\+\_\+loop\+\_\+t $\ast$loop, int tsi)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN uv\+\_\+loop\+\_\+t $\ast$ {\bfseries lws\+\_\+uv\+\_\+getloop} (struct lws\+\_\+context $\ast$context, int tsi)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN void {\bfseries lws\+\_\+uv\+\_\+sigint\+\_\+cb} (uv\+\_\+signal\+\_\+t $\ast$watcher, int signum)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN void \hyperlink{group__timeout_gaced9f9237f6172fed9f730a2af51345a}{lws\+\_\+set\+\_\+timeout} (struct lws $\ast$wsi, enum pending\+\_\+timeout reason, int secs)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int \hyperlink{group__sending-data_gafd5fdd285a0e25ba7e3e1051deec1001}{lws\+\_\+write} (struct lws $\ast$wsi, unsigned char $\ast$buf, size\+\_\+t len, enum \hyperlink{group__sending-data_ga98b099cf8c1c7e38ad78501f270e193d}{lws\+\_\+write\+\_\+protocol} protocol)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int \hyperlink{group__callback-when-writeable_ga941caaa468bc507b1cae52275f58800d}{lws\+\_\+callback\+\_\+on\+\_\+writable} (struct lws $\ast$wsi)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int \hyperlink{group__callback-when-writeable_gabbe4655c7eeb3eb1671b2323ec6b3107}{lws\+\_\+callback\+\_\+on\+\_\+writable\+\_\+all\+\_\+protocol} (const struct lws\+\_\+context $\ast$context, const struct \hyperlink{structlws__protocols}{lws\+\_\+protocols} $\ast$protocol)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int \hyperlink{group__callback-when-writeable_ga8570860e191b62db264f2bac67354ea8}{lws\+\_\+callback\+\_\+on\+\_\+writable\+\_\+all\+\_\+protocol\+\_\+vhost} (const struct lws\+\_\+vhost $\ast$vhost, const struct \hyperlink{structlws__protocols}{lws\+\_\+protocols} $\ast$protocol)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int \hyperlink{group__callback-when-writeable_gacf04bbe089f47c971c6408c5efe2ac70}{lws\+\_\+callback\+\_\+all\+\_\+protocol} (struct lws\+\_\+context $\ast$context, const struct \hyperlink{structlws__protocols}{lws\+\_\+protocols} $\ast$protocol, int reason)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int \hyperlink{group__callback-when-writeable_ga13c984d8c5a44a745fd02bc2fba36053}{lws\+\_\+callback\+\_\+all\+\_\+protocol\+\_\+vhost} (struct lws\+\_\+vhost $\ast$vh, const struct \hyperlink{structlws__protocols}{lws\+\_\+protocols} $\ast$protocol, int reason)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int \hyperlink{group__callback-when-writeable_ga60939cf0c073d933fde3d17f3591caf5}{lws\+\_\+callback\+\_\+vhost\+\_\+protocols} (struct lws $\ast$wsi, int reason, void $\ast$in, int len)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int \hyperlink{group__callback-when-writeable_gaa709e02a10558753c851e58f1e2c16ba}{lws\+\_\+get\+\_\+socket\+\_\+fd} (struct lws $\ast$wsi)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN size\+\_\+t \hyperlink{group__callback-when-writeable_gac4643fe16b0940ae5b68b4ee6195cbde}{lws\+\_\+get\+\_\+peer\+\_\+write\+\_\+allowance} (struct lws $\ast$wsi)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int \hyperlink{libwebsockets_8h_adf4abd01e8c43f07c6e498ce13590c3e}{lws\+\_\+rx\+\_\+flow\+\_\+control} (struct lws $\ast$wsi, int enable)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN void \hyperlink{libwebsockets_8h_a5e627dbf1db48170ef486edbaf268672}{lws\+\_\+rx\+\_\+flow\+\_\+allow\+\_\+all\+\_\+protocol} (const struct lws\+\_\+context $\ast$context, const struct \hyperlink{structlws__protocols}{lws\+\_\+protocols} $\ast$protocol)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN size\+\_\+t \hyperlink{libwebsockets_8h_a72fe65e83b8bb03f904a1a256c673536}{lws\+\_\+remaining\+\_\+packet\+\_\+payload} (struct lws $\ast$wsi)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN struct lws $\ast$ \hyperlink{group__sock-adopt_gabe71b7462afb21c767bdc67334f305af}{lws\+\_\+adopt\+\_\+socket} (struct lws\+\_\+context $\ast$context, lws\+\_\+sockfd\+\_\+type accept\+\_\+fd)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN struct lws $\ast$ \hyperlink{group__sock-adopt_gab2d045df0f81afe00891aaed312d552b}{lws\+\_\+adopt\+\_\+socket\+\_\+readbuf} (struct lws\+\_\+context $\ast$context, lws\+\_\+sockfd\+\_\+type accept\+\_\+fd, const char $\ast$readbuf, size\+\_\+t len)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN const char $\ast$L\+W\+S\+\_\+\+W\+A\+R\+N\+\_\+\+U\+N\+U\+S\+E\+D\+\_\+\+R\+E\+S\+U\+LT \hyperlink{group__net_gad0df22db2be9fc65a667a1e83f9a92a4}{lws\+\_\+canonical\+\_\+hostname} (struct lws\+\_\+context $\ast$context)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN void \hyperlink{group__net_ga092e5f473b3347f03ffeef8a950080f3}{lws\+\_\+get\+\_\+peer\+\_\+addresses} (struct lws $\ast$wsi, lws\+\_\+sockfd\+\_\+type fd, char $\ast$name, int name\+\_\+len, char $\ast$rip, int rip\+\_\+len)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN const char $\ast$ \hyperlink{group__net_gad01014fed09759741b6d23afccfdaacc}{lws\+\_\+get\+\_\+peer\+\_\+simple} (struct lws $\ast$wsi, char $\ast$name, int namelen)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int \hyperlink{group__net_ga869d8bdffb0f2a7ce08e3ce10d6be3d8}{lws\+\_\+interface\+\_\+to\+\_\+sa} (int ipv6, const char $\ast$ifname, struct sockaddr\+\_\+in $\ast$addr, size\+\_\+t addrlen)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int \hyperlink{group__misc_ga58f906c6be0ca80efd813f694569dd4a}{lws\+\_\+get\+\_\+random} (struct lws\+\_\+context $\ast$context, void $\ast$buf, int len)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int L\+W\+S\+\_\+\+W\+A\+R\+N\+\_\+\+U\+N\+U\+S\+E\+D\+\_\+\+R\+E\+S\+U\+LT \hyperlink{group__misc_gace5171b1dbbc03ec89a98f8afdb5c9af}{lws\+\_\+daemonize} (const char $\ast$\+\_\+lock\+\_\+path)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN const char $\ast$L\+W\+S\+\_\+\+W\+A\+R\+N\+\_\+\+U\+N\+U\+S\+E\+D\+\_\+\+R\+E\+S\+U\+LT \hyperlink{group__misc_gac6abfc0b2bd5b2f09281a4432bb2f5f0}{lws\+\_\+get\+\_\+library\+\_\+version} (void)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN void $\ast$ \hyperlink{group__misc_gaa194584fff9698f3b280658f770ccd0f}{lws\+\_\+wsi\+\_\+user} (struct lws $\ast$wsi)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int L\+W\+S\+\_\+\+W\+A\+R\+N\+\_\+\+U\+N\+U\+S\+E\+D\+\_\+\+R\+E\+S\+U\+LT \hyperlink{group__misc_ga1ec0d9faac5d3a5824d765c287c043aa}{lws\+\_\+parse\+\_\+uri} (char $\ast$p, const char $\ast$$\ast$prot, const char $\ast$$\ast$ads, int $\ast$port, const char $\ast$$\ast$path)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN unsigned long \hyperlink{group__misc_ga33bf2635033710b25f931b57ed663e1e}{lws\+\_\+now\+\_\+secs} (void)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN struct lws\+\_\+context $\ast$L\+W\+S\+\_\+\+W\+A\+R\+N\+\_\+\+U\+N\+U\+S\+E\+D\+\_\+\+R\+E\+S\+U\+LT \hyperlink{group__misc_ga0af4f7d2dd375aeedcfa7eb0e1101c4b}{lws\+\_\+get\+\_\+context} (const struct lws $\ast$wsi)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int L\+W\+S\+\_\+\+W\+A\+R\+N\+\_\+\+U\+N\+U\+S\+E\+D\+\_\+\+R\+E\+S\+U\+LT \hyperlink{group__misc_ga629f48268fd1856b54b11172991b97d9}{lws\+\_\+get\+\_\+count\+\_\+threads} (struct lws\+\_\+context $\ast$context)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN struct lws $\ast$L\+W\+S\+\_\+\+W\+A\+R\+N\+\_\+\+U\+N\+U\+S\+E\+D\+\_\+\+R\+E\+S\+U\+LT \hyperlink{group__misc_ga8930fe36a3f3eefe4a6a4fd499d8e899}{lws\+\_\+get\+\_\+parent} (const struct lws $\ast$wsi)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN struct lws $\ast$L\+W\+S\+\_\+\+W\+A\+R\+N\+\_\+\+U\+N\+U\+S\+E\+D\+\_\+\+R\+E\+S\+U\+LT \hyperlink{group__misc_gacae4d7b6a8d22e4c2d82ff8b12c1e234}{lws\+\_\+get\+\_\+child} (const struct lws $\ast$wsi)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int {\bfseries lws\+\_\+read} (struct lws $\ast$wsi, unsigned char $\ast$buf, size\+\_\+t len)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN void \hyperlink{group__misc_gab321ed812f46f6dc7ef9e3ca6f00cf1b}{lws\+\_\+set\+\_\+allocator} (void $\ast$($\ast$realloc)(void $\ast$ptr, size\+\_\+t size))
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int L\+W\+S\+\_\+\+W\+A\+R\+N\+\_\+\+U\+N\+U\+S\+E\+D\+\_\+\+R\+E\+S\+U\+LT \hyperlink{group__wsstatus_ga2bb3655329b4651cd06f79ee3a764421}{lws\+\_\+send\+\_\+pipe\+\_\+choked} (struct lws $\ast$wsi)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int \hyperlink{group__wsstatus_ga08e9ee165fca503fd9427d55cfecac37}{lws\+\_\+is\+\_\+final\+\_\+fragment} (struct lws $\ast$wsi)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN unsigned char \hyperlink{group__wsstatus_ga3df5045656dfb6b0e63a38de2dca79d2}{lws\+\_\+get\+\_\+reserved\+\_\+bits} (struct lws $\ast$wsi)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int L\+W\+S\+\_\+\+W\+A\+R\+N\+\_\+\+U\+N\+U\+S\+E\+D\+\_\+\+R\+E\+S\+U\+LT \hyperlink{group__wsstatus_gaeca4afc94b1f026034f99cbba37e2f85}{lws\+\_\+partial\+\_\+buffered} (struct lws $\ast$wsi)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int L\+W\+S\+\_\+\+W\+A\+R\+N\+\_\+\+U\+N\+U\+S\+E\+D\+\_\+\+R\+E\+S\+U\+LT \hyperlink{group__wsstatus_gaccd9c59336efad8af0554f79cc5966fd}{lws\+\_\+frame\+\_\+is\+\_\+binary} (struct lws $\ast$wsi)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int \hyperlink{group__wsstatus_ga26a140623d202dd2bf2004deb6994baa}{lws\+\_\+is\+\_\+ssl} (struct lws $\ast$wsi)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int \hyperlink{group__wsstatus_ga4ad226d5e01024b4046f4a5a37199aa1}{lws\+\_\+is\+\_\+cgi} (struct lws $\ast$wsi)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN unsigned char $\ast$ \hyperlink{group__sha_ga7b09ab74646266f0b555103b3bb8dfe5}{lws\+\_\+\+S\+H\+A1} (const unsigned char $\ast$d, size\+\_\+t n, unsigned char $\ast$md)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int \hyperlink{group__sha_gaf39765e4a3b413efb65e4698b2ec3575}{lws\+\_\+b64\+\_\+encode\+\_\+string} (const char $\ast$in, int in\+\_\+len, char $\ast$out, int out\+\_\+size)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int \hyperlink{group__sha_ga66316e6a5a0644a09d5a10e919dfdd8d}{lws\+\_\+b64\+\_\+decode\+\_\+string} (const char $\ast$in, char $\ast$out, int out\+\_\+size)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int \hyperlink{libwebsockets_8h_af52923473c59e643a974d65e12290831}{lws\+\_\+cgi} (struct lws $\ast$wsi, const char $\ast$const $\ast$exec\+\_\+array, int script\+\_\+uri\+\_\+path\+\_\+len, int timeout\+\_\+secs, const struct \hyperlink{structlws__protocol__vhost__options}{lws\+\_\+protocol\+\_\+vhost\+\_\+options} $\ast$mp\+\_\+cgienv)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int \hyperlink{libwebsockets_8h_a5326d3402af8429a166dd991dc65c4a2}{lws\+\_\+cgi\+\_\+write\+\_\+split\+\_\+stdout\+\_\+headers} (struct lws $\ast$wsi)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int \hyperlink{libwebsockets_8h_a27bb0b3cdcd0af839c928c253b521ff4}{lws\+\_\+cgi\+\_\+kill} (struct lws $\ast$wsi)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN struct \hyperlink{structlws__plat__file__ops}{lws\+\_\+plat\+\_\+file\+\_\+ops} $\ast$L\+W\+S\+\_\+\+W\+A\+R\+N\+\_\+\+U\+N\+U\+S\+E\+D\+\_\+\+R\+E\+S\+U\+LT \hyperlink{group__fops_gac08aef64c4c34647ed699b24759b6b0e}{lws\+\_\+get\+\_\+fops} (struct lws\+\_\+context $\ast$context)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int \hyperlink{group__smtp_ga77fc9b56a1bb39484844981ec375fc29}{lws\+\_\+email\+\_\+init} (struct \hyperlink{structlws__email}{lws\+\_\+email} $\ast$email, uv\+\_\+loop\+\_\+t $\ast$loop, int max\+\_\+content)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN void \hyperlink{group__smtp_ga5e535e346d92a9daf00be33abf79d4eb}{lws\+\_\+email\+\_\+check} (struct \hyperlink{structlws__email}{lws\+\_\+email} $\ast$email)
+\item
+L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN void \hyperlink{group__smtp_ga25298a5afc1074e13b2d5711a86432b2}{lws\+\_\+email\+\_\+destroy} (struct \hyperlink{structlws__email}{lws\+\_\+email} $\ast$email)
+\end{DoxyCompactItemize}
+
+
+\subsection{Function Documentation}
+\index{libwebsockets.\+h@{libwebsockets.\+h}!lws\+\_\+cgi@{lws\+\_\+cgi}}
+\index{lws\+\_\+cgi@{lws\+\_\+cgi}!libwebsockets.\+h@{libwebsockets.\+h}}
+\subsubsection[{\texorpdfstring{lws\+\_\+cgi(struct lws $\ast$wsi, const char $\ast$const $\ast$exec\+\_\+array, int script\+\_\+uri\+\_\+path\+\_\+len, int timeout\+\_\+secs, const struct lws\+\_\+protocol\+\_\+vhost\+\_\+options $\ast$mp\+\_\+cgienv)}{lws\_cgi(struct lws *wsi, const char *const *exec\_array, int script\_uri\_path\_len, int timeout\_secs, const struct lws\_protocol\_vhost\_options *mp\_cgienv)}}]{\setlength{\rightskip}{0pt plus 5cm}L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int lws\+\_\+cgi (
+\begin{DoxyParamCaption}
+\item[{struct lws $\ast$}]{wsi, }
+\item[{const char $\ast$const $\ast$}]{exec\+\_\+array, }
+\item[{int}]{script\+\_\+uri\+\_\+path\+\_\+len, }
+\item[{int}]{timeout\+\_\+secs, }
+\item[{const struct {\bf lws\+\_\+protocol\+\_\+vhost\+\_\+options} $\ast$}]{mp\+\_\+cgienv}
+\end{DoxyParamCaption}
+)}\hypertarget{libwebsockets_8h_af52923473c59e643a974d65e12290831}{}\label{libwebsockets_8h_af52923473c59e643a974d65e12290831}
+lws\+\_\+cgi\+: spawn network-\/connected cgi process
+
+
+\begin{DoxyParams}{Parameters}
+{\em wsi} & connection to own the process \\
+\hline
+{\em exec\+\_\+array} & array of \char`\"{}exec-\/name\char`\"{} \char`\"{}arg1\char`\"{} ... \char`\"{}argn\char`\"{} N\+U\+LL \\
+\hline
+{\em script\+\_\+uri\+\_\+path\+\_\+len} & how many chars on the left of the uri are the path to the cgi \\
+\hline
+{\em timeout\+\_\+secs} & seconds script should be allowed to run \\
+\hline
+{\em mp\+\_\+cgienv} & pvo list with per-\/vhost cgi options to put in env \\
+\hline
+\end{DoxyParams}
+\index{libwebsockets.\+h@{libwebsockets.\+h}!lws\+\_\+cgi\+\_\+kill@{lws\+\_\+cgi\+\_\+kill}}
+\index{lws\+\_\+cgi\+\_\+kill@{lws\+\_\+cgi\+\_\+kill}!libwebsockets.\+h@{libwebsockets.\+h}}
+\subsubsection[{\texorpdfstring{lws\+\_\+cgi\+\_\+kill(struct lws $\ast$wsi)}{lws\_cgi\_kill(struct lws *wsi)}}]{\setlength{\rightskip}{0pt plus 5cm}L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int lws\+\_\+cgi\+\_\+kill (
+\begin{DoxyParamCaption}
+\item[{struct lws $\ast$}]{wsi}
+\end{DoxyParamCaption}
+)}\hypertarget{libwebsockets_8h_a27bb0b3cdcd0af839c928c253b521ff4}{}\label{libwebsockets_8h_a27bb0b3cdcd0af839c928c253b521ff4}
+lws\+\_\+cgi\+\_\+kill\+: terminate cgi process associated with wsi
+
+
+\begin{DoxyParams}{Parameters}
+{\em wsi} & connection to own the process \\
+\hline
+\end{DoxyParams}
+\index{libwebsockets.\+h@{libwebsockets.\+h}!lws\+\_\+cgi\+\_\+write\+\_\+split\+\_\+stdout\+\_\+headers@{lws\+\_\+cgi\+\_\+write\+\_\+split\+\_\+stdout\+\_\+headers}}
+\index{lws\+\_\+cgi\+\_\+write\+\_\+split\+\_\+stdout\+\_\+headers@{lws\+\_\+cgi\+\_\+write\+\_\+split\+\_\+stdout\+\_\+headers}!libwebsockets.\+h@{libwebsockets.\+h}}
+\subsubsection[{\texorpdfstring{lws\+\_\+cgi\+\_\+write\+\_\+split\+\_\+stdout\+\_\+headers(struct lws $\ast$wsi)}{lws\_cgi\_write\_split\_stdout\_headers(struct lws *wsi)}}]{\setlength{\rightskip}{0pt plus 5cm}L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int lws\+\_\+cgi\+\_\+write\+\_\+split\+\_\+stdout\+\_\+headers (
+\begin{DoxyParamCaption}
+\item[{struct lws $\ast$}]{wsi}
+\end{DoxyParamCaption}
+)}\hypertarget{libwebsockets_8h_a5326d3402af8429a166dd991dc65c4a2}{}\label{libwebsockets_8h_a5326d3402af8429a166dd991dc65c4a2}
+lws\+\_\+cgi\+\_\+write\+\_\+split\+\_\+stdout\+\_\+headers\+: write cgi output accounting for header part
+
+
+\begin{DoxyParams}{Parameters}
+{\em wsi} & connection to own the process \\
+\hline
+\end{DoxyParams}
+\index{libwebsockets.\+h@{libwebsockets.\+h}!lws\+\_\+remaining\+\_\+packet\+\_\+payload@{lws\+\_\+remaining\+\_\+packet\+\_\+payload}}
+\index{lws\+\_\+remaining\+\_\+packet\+\_\+payload@{lws\+\_\+remaining\+\_\+packet\+\_\+payload}!libwebsockets.\+h@{libwebsockets.\+h}}
+\subsubsection[{\texorpdfstring{lws\+\_\+remaining\+\_\+packet\+\_\+payload(struct lws $\ast$wsi)}{lws\_remaining\_packet\_payload(struct lws *wsi)}}]{\setlength{\rightskip}{0pt plus 5cm}L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN size\+\_\+t lws\+\_\+remaining\+\_\+packet\+\_\+payload (
+\begin{DoxyParamCaption}
+\item[{struct lws $\ast$}]{wsi}
+\end{DoxyParamCaption}
+)}\hypertarget{libwebsockets_8h_a72fe65e83b8bb03f904a1a256c673536}{}\label{libwebsockets_8h_a72fe65e83b8bb03f904a1a256c673536}
+\hyperlink{libwebsockets_8h_a72fe65e83b8bb03f904a1a256c673536}{lws\+\_\+remaining\+\_\+packet\+\_\+payload()} -\/ Bytes to come before \char`\"{}overall\char`\"{} rx packet is complete
+\begin{DoxyParams}{Parameters}
+{\em wsi} & Websocket instance (available from user callback) \begin{DoxyVerb} This function is intended to be called from the callback if the
+\end{DoxyVerb}
+ user code is interested in \char`\"{}complete packets\char`\"{} from the client. libwebsockets just passes through payload as it comes and issues a buffer additionally when it hits a built-\/in limit. The L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+R\+E\+C\+E\+I\+VE callback handler can use this A\+PI to find out if the buffer it has just been given is the last piece of a \char`\"{}complete packet\char`\"{} from the client -- when that is the case \hyperlink{libwebsockets_8h_a72fe65e83b8bb03f904a1a256c673536}{lws\+\_\+remaining\+\_\+packet\+\_\+payload()} will return 0.\\
+\hline
+\end{DoxyParams}
+Many protocols won\textquotesingle{}t care becuse their packets are always small. \index{libwebsockets.\+h@{libwebsockets.\+h}!lws\+\_\+rx\+\_\+flow\+\_\+allow\+\_\+all\+\_\+protocol@{lws\+\_\+rx\+\_\+flow\+\_\+allow\+\_\+all\+\_\+protocol}}
+\index{lws\+\_\+rx\+\_\+flow\+\_\+allow\+\_\+all\+\_\+protocol@{lws\+\_\+rx\+\_\+flow\+\_\+allow\+\_\+all\+\_\+protocol}!libwebsockets.\+h@{libwebsockets.\+h}}
+\subsubsection[{\texorpdfstring{lws\+\_\+rx\+\_\+flow\+\_\+allow\+\_\+all\+\_\+protocol(const struct lws\+\_\+context $\ast$context, const struct lws\+\_\+protocols $\ast$protocol)}{lws\_rx\_flow\_allow\_all\_protocol(const struct lws\_context *context, const struct lws\_protocols *protocol)}}]{\setlength{\rightskip}{0pt plus 5cm}L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN void lws\+\_\+rx\+\_\+flow\+\_\+allow\+\_\+all\+\_\+protocol (
+\begin{DoxyParamCaption}
+\item[{const struct lws\+\_\+context $\ast$}]{context, }
+\item[{const struct {\bf lws\+\_\+protocols} $\ast$}]{protocol}
+\end{DoxyParamCaption}
+)}\hypertarget{libwebsockets_8h_a5e627dbf1db48170ef486edbaf268672}{}\label{libwebsockets_8h_a5e627dbf1db48170ef486edbaf268672}
+\hyperlink{libwebsockets_8h_a5e627dbf1db48170ef486edbaf268672}{lws\+\_\+rx\+\_\+flow\+\_\+allow\+\_\+all\+\_\+protocol()} -\/ Allow all connections with this protocol to receive
+
+When the user server code realizes it can accept more input, it can call this to have the RX flow restriction removed from all connections using the given protocol.
+\begin{DoxyParams}{Parameters}
+{\em context} & lws\+\_\+context \\
+\hline
+{\em protocol} & all connections using this protocol will be allowed to receive \\
+\hline
+\end{DoxyParams}
+\index{libwebsockets.\+h@{libwebsockets.\+h}!lws\+\_\+rx\+\_\+flow\+\_\+control@{lws\+\_\+rx\+\_\+flow\+\_\+control}}
+\index{lws\+\_\+rx\+\_\+flow\+\_\+control@{lws\+\_\+rx\+\_\+flow\+\_\+control}!libwebsockets.\+h@{libwebsockets.\+h}}
+\subsubsection[{\texorpdfstring{lws\+\_\+rx\+\_\+flow\+\_\+control(struct lws $\ast$wsi, int enable)}{lws\_rx\_flow\_control(struct lws *wsi, int enable)}}]{\setlength{\rightskip}{0pt plus 5cm}L\+W\+S\+\_\+\+V\+I\+S\+I\+B\+LE L\+W\+S\+\_\+\+E\+X\+T\+E\+RN int lws\+\_\+rx\+\_\+flow\+\_\+control (
+\begin{DoxyParamCaption}
+\item[{struct lws $\ast$}]{wsi, }
+\item[{int}]{enable}
+\end{DoxyParamCaption}
+)}\hypertarget{libwebsockets_8h_adf4abd01e8c43f07c6e498ce13590c3e}{}\label{libwebsockets_8h_adf4abd01e8c43f07c6e498ce13590c3e}
+\hyperlink{libwebsockets_8h_adf4abd01e8c43f07c6e498ce13590c3e}{lws\+\_\+rx\+\_\+flow\+\_\+control()} -\/ Enable and disable socket servicing for received packets.
+
+If the output side of a server process becomes choked, this allows flow control for the input side.
+
+
+\begin{DoxyParams}{Parameters}
+{\em wsi} & Websocket connection instance to get callback for \\
+\hline
+{\em enable} & 0 = disable read servicing for this connection, 1 = enable \\
+\hline
+\end{DoxyParams}
--- /dev/null
+\subsection*{Introduction to C\+Make }
+
+C\+Make is a multi-\/platform build tool that can generate build files for many different target platforms. See more info at \href{http://www.cmake.org}{\tt http\+://www.\+cmake.\+org}
+
+C\+Make also allows/recommends you to do \char`\"{}out of source\char`\"{}-\/builds, that is, the build files are separated from your sources, so there is no need to create elaborate clean scripts to get a clean source tree, instead you simply remove your build directory.
+
+Libwebsockets has been tested to build successfully on the following platforms with S\+SL support (both Open\+S\+S\+L/wolf\+S\+SL)\+:
+
+
+\begin{DoxyItemize}
+\item Windows (Visual Studio)
+\item Windows (Min\+GW)
+\item Linux (x86 and A\+RM)
+\item O\+SX
+\item Net\+B\+SD
+\end{DoxyItemize}
+
+\subsection*{Building the library and test apps }
+
+The project settings used by C\+Make to generate the platform specific build files is called \href{CMakeLists.txt}{\tt C\+Make\+Lists.\+txt}. C\+Make then uses one of its \char`\"{}\+Generators\char`\"{} to output a Visual Studio project or Make file for instance. To see a list of the available generators for your platform, simply run the \char`\"{}cmake\char`\"{} command.
+
+Note that by default Open\+S\+SL will be linked, if you don\textquotesingle{}t want S\+SL support see below on how to toggle compile options.
+
+\subsection*{Building on Unix\+: }
+
+
+\begin{DoxyEnumerate}
+\item Install C\+Make 2.\+8 or greater\+: \href{http://cmake.org/cmake/resources/software.html}{\tt http\+://cmake.\+org/cmake/resources/software.\+html} (Most Unix distributions comes with a packaged version also)
+\item Install Open\+S\+SL.
+\item Generate the build files (default is Make files)\+:
+\begin{DoxyCode}
+1 $ cd /path/to/src
+2 $ mkdir build
+3 $ cd build
+4 $ cmake ..
+\end{DoxyCode}
+
+\item Finally you can build using the generated Makefile\+:
+\begin{DoxyCode}
+1 $ make && sudo make install
+\end{DoxyCode}
+ {\bfseries N\+O\+TE}\+: The {\ttfamily build/}{\ttfamily directory can have any name and be located anywhere on your filesystem, and that the argument}..` given to cmake is simply the source directory of {\bfseries libwebsockets} containing the \href{CMakeLists.txt}{\tt C\+Make\+Lists.\+txt} project file. All examples in this file assumes you use \char`\"{}..\char`\"{}
+\end{DoxyEnumerate}
+
+{\bfseries N\+O\+T\+E2}\+: A common option you may want to give is to set the install path, same as --prefix= with autotools. It defaults to /usr/local. You can do this by, eg
+\begin{DoxyCode}
+1 $ cmake -DCMAKE\_INSTALL\_PREFIX:PATH=/usr .
+\end{DoxyCode}
+
+
+{\bfseries N\+O\+T\+E3}\+: On machines that want libraries in lib64, you can also add the following to the cmake line
+\begin{DoxyCode}
+1 -DLIB\_SUFFIX=64
+\end{DoxyCode}
+
+
+{\bfseries N\+O\+T\+E4}\+: If you are building against a non-\/distro Open\+S\+SL (eg, in order to get access to A\+L\+PN support only in newer Open\+S\+SL versions) the nice way to express that in one cmake command is eg,
+\begin{DoxyCode}
+1 $ cmake .. -DOPENSSL\_ROOT\_DIR=/usr/local/ssl \(\backslash\)
+2 -DCMAKE\_INCLUDE\_DIRECTORIES\_PROJECT\_BEFORE=/usr/local/ssl \(\backslash\)
+3 -DLWS\_WITH\_HTTP2=1
+\end{DoxyCode}
+
+
+When you run the test apps using non-\/distro S\+SL, you have to force them to use your libs, not the distro ones
+\begin{DoxyCode}
+1 $ LD\_LIBRARY\_PATH=/usr/local/ssl/lib libwebsockets-test-server --ssl
+\end{DoxyCode}
+
+
+To get it to build on latest openssl (2016-\/04-\/10) it needed this approach
+\begin{DoxyCode}
+1 cmake .. -DLWS\_WITH\_HTTP2=1 -DLWS\_OPENSSL\_INCLUDE\_DIRS=/usr/local/include/openssl
+ -DLWS\_OPENSSL\_LIBRARIES="/usr/local/lib64/libssl.so;/usr/local/lib64/libcrypto.so"
+\end{DoxyCode}
+
+
+{\bfseries N\+O\+T\+E5}\+: To build with debug info and \+\_\+\+D\+E\+B\+UG for lower priority debug messages compiled in, use
+\begin{DoxyCode}
+1 $ cmake .. -DCMAKE\_BUILD\_TYPE=DEBUG
+\end{DoxyCode}
+
+
+\subsection*{Quirk of cmake }
+
+When changing cmake options, for some reason the only way to get it to see the changes sometimes is delete the contents of your build directory and do the cmake from scratch.
+
+\subsection*{Building on Windows (Visual Studio) }
+
+
+\begin{DoxyEnumerate}
+\item Install C\+Make 2.\+6 or greater\+: \href{http://cmake.org/cmake/resources/software.html}{\tt http\+://cmake.\+org/cmake/resources/software.\+html}
+\item Install Open\+S\+SL binaries. \href{http://www.openssl.org/related/binaries.html}{\tt http\+://www.\+openssl.\+org/related/binaries.\+html}
+
+({\bfseries N\+O\+TE}\+: Preferably in the default location to make it easier for C\+Make to find them)
+
+{\bfseries N\+O\+T\+E2}\+: Be sure that O\+P\+E\+N\+S\+S\+L\+\_\+\+C\+O\+NF environment variable is defined and points at $<$\+Open\+S\+S\+L install=\char`\"{}\char`\"{} location$>$=\char`\"{}\char`\"{}$>$.cfg
+\item Generate the Visual studio project by opening the Visual Studio cmd prompt\+:
+\end{DoxyEnumerate}
+
+
+\begin{DoxyCode}
+1 cd <path to src>
+2 md build
+3 cd build
+4 cmake -G "Visual Studio 10" ..
+\end{DoxyCode}
+
+
+({\bfseries N\+O\+TE}\+: There is also a cmake-\/gui available on Windows if you prefer that)
+
+{\bfseries N\+O\+T\+E2}\+: See this link to find out the version number corresponding to your Visual Studio edition\+: \href{http://superuser.com/a/194065}{\tt http\+://superuser.\+com/a/194065}
+
+
+\begin{DoxyEnumerate}
+\item Now you should have a generated Visual Studio Solution in your {\ttfamily $<$path to src$>$/build} directory, which can be used to build.
+\item Some additional deps may be needed
+\begin{DoxyItemize}
+\item iphlpapi.\+lib
+\item psapi.\+lib
+\item userenv.\+lib
+\end{DoxyItemize}
+\item If you\textquotesingle{}re using libuv, you must make sure to compile libuv with the same multithread-\/dll / Mtd attributes as libwebsockets itself
+\end{DoxyEnumerate}
+
+\subsection*{Building on Windows (Min\+GW) }
+
+
+\begin{DoxyEnumerate}
+\item Install Min\+GW\+: \href{http://sourceforge.net/projects/mingw/files}{\tt http\+://sourceforge.\+net/projects/mingw/files}
+
+({\bfseries N\+O\+TE}\+: Preferably in the default location C\+:)
+\item Fix up Min\+GW headers
+
+a) Add the following lines to C\+:.h\+:
+\begin{DoxyCode}
+1 #if(\_WIN32\_WINNT >= 0x0600)
+2
+3 typedef struct pollfd \{
+4
+5 SOCKET fd;
+6 SHORT events;
+7 SHORT revents;
+8
+9 \} WSAPOLLFD, *PWSAPOLLFD, FAR *LPWSAPOLLFD;
+10
+11 WINSOCK\_API\_LINKAGE int WSAAPI WSAPoll(LPWSAPOLLFD fdArray, ULONG fds, INT timeout);
+12
+13 #endif // (\_WIN32\_WINNT >= 0x0600)
+\end{DoxyCode}
+ b) Create C\+:.h and copy and paste the content from following link into it\+:
+
+\href{http://wine-unstable.sourcearchive.com/documentation/1.1.32/mstcpip_8h-source.html}{\tt http\+://wine-\/unstable.\+sourcearchive.\+com/documentation/1.\+1.\+32/mstcpip\+\_\+8h-\/source.\+html}
+\item Install C\+Make 2.\+6 or greater\+: \href{http://cmake.org/cmake/resources/software.html}{\tt http\+://cmake.\+org/cmake/resources/software.\+html}
+\item Install Open\+S\+SL binaries. \href{http://www.openssl.org/related/binaries.html}{\tt http\+://www.\+openssl.\+org/related/binaries.\+html}
+
+({\bfseries N\+O\+TE}\+: Preferably in the default location to make it easier for C\+Make to find them)
+
+{\bfseries N\+O\+T\+E2}\+: Be sure that O\+P\+E\+N\+S\+S\+L\+\_\+\+C\+O\+NF environment variable is defined and points at $<$\+Open\+S\+S\+L install=\char`\"{}\char`\"{} location$>$=\char`\"{}\char`\"{}$>$.cfg
+\item Generate the build files (default is Make files) using M\+S\+YS shell\+:
+\begin{DoxyCode}
+1 $ cd /drive/path/to/src
+2 $ mkdir build
+3 $ cd build
+4 $ cmake -G "MSYS Makefiles" -DCMAKE\_INSTALL\_PREFIX=C:/MinGW ..
+\end{DoxyCode}
+ ({\bfseries N\+O\+TE}\+: The {\ttfamily build/}{\ttfamily directory can have any name and be located anywhere on your filesystem, and that the argument}..` given to cmake is simply the source directory of {\bfseries libwebsockets} containing the \href{CMakeLists.txt}{\tt C\+Make\+Lists.\+txt} project file. All examples in this file assumes you use \char`\"{}..\char`\"{})
+
+{\bfseries N\+O\+T\+E2}\+: To generate build files allowing to create libwebsockets binaries with debug information set the C\+M\+A\+K\+E\+\_\+\+B\+U\+I\+L\+D\+\_\+\+T\+Y\+PE flag to D\+E\+B\+UG\+:
+\begin{DoxyCode}
+1 $ cmake -G "MSYS Makefiles" -DCMAKE\_INSTALL\_PREFIX=C:/MinGW -DCMAKE\_BUILD\_TYPE=DEBUG ..
+\end{DoxyCode}
+
+\item Finally you can build using the generated Makefile and get the results deployed into your Min\+GW installation\+:
+\end{DoxyEnumerate}
+
+
+\begin{DoxyCode}
+1 $ make
+2 $ make install
+\end{DoxyCode}
+
+
+\subsection*{Setting compile options }
+
+To set compile time flags you can either use one of the C\+Make gui applications or do it via command line.
+
+\subsection*{Command line }
+
+To list avaialable options (ommit the H if you don\textquotesingle{}t want the help text)\+: \begin{DoxyVerb} cmake -LH ..
+\end{DoxyVerb}
+
+
+Then to set an option and build (for example turn off S\+SL support)\+: \begin{DoxyVerb} cmake -DLWS_WITH_SSL=0 ..
+\end{DoxyVerb}
+ or cmake -\/\+D\+L\+W\+S\+\_\+\+W\+I\+T\+H\+\_\+\+S\+SL\+:B\+O\+OL=O\+FF ..
+
+\subsection*{Building on mbed3 }
+
+M\+B\+E\+D3 is a non-\/posix embedded OS targeted on Cortex M class chips.
+
+\href{https://www.mbed.com/}{\tt https\+://www.\+mbed.\+com/}
+
+It\textquotesingle{}s quite unlike any other Posixy platform since the OS is linked statically in with lws to form one binary.
+
+At the minute server-\/only is supported and due to bugs in mbed3 network support, the port is of alpha quality. However it can serve the test html, favicon.\+ico and logo png and may be able to make ws connections. The binary for that including the OS, test app, lws and all the assets is only 117\+KB.
+
+0) Today mbed3 only properly works on F\+R\+DM K64F \$35 Freescale Dev Board with 1\+MB Flash, 256\+KB S\+R\+AM and Ethernet.
+
+\href{http://www.freescale.com/products/arm-processors/kinetis-cortex-m/k-series/k6x-ethernet-mcus/freescale-freedom-development-platform-for-kinetis-k64-k63-and-k24-mcus:FRDM-K64F}{\tt http\+://www.\+freescale.\+com/products/arm-\/processors/kinetis-\/cortex-\/m/k-\/series/k6x-\/ethernet-\/mcus/freescale-\/freedom-\/development-\/platform-\/for-\/kinetis-\/k64-\/k63-\/and-\/k24-\/mcus\+:\+F\+R\+D\+M-\/\+K64F}
+
+1) Get a working mbed3 environment with arm-\/none-\/eabi-\/cs toolchain (available in Fedora, Ubuntu and other distros)
+
+2) Confirm you can build things using yotta by following the getting started guide here
+
+\href{https://docs.mbed.com/docs/getting-started-mbed-os/en/latest/}{\tt https\+://docs.\+mbed.\+com/docs/getting-\/started-\/mbed-\/os/en/latest/}
+
+3)
+
+git clone \href{https://github.com/warmcat/lws-test-server}{\tt https\+://github.\+com/warmcat/lws-\/test-\/server}
+
+and cd into it
+
+4) mkdir -\/p yotta\+\_\+modules ; cd yotta\+\_\+modules
+
+5) git clone \href{https://github.com/warmcat/libwebsockets}{\tt https\+://github.\+com/warmcat/libwebsockets} ; mv libwebsockets websockets ; cd ..
+
+6) yotta target frdm-\/k64f-\/gcc
+
+7) yotta install
+
+8) yotta build
+
+\subsection*{Unix G\+UI }
+
+If you have a curses-\/enabled build you simply type\+: (not all packages include this, my debian install does not for example). \begin{DoxyVerb} ccmake
+\end{DoxyVerb}
+
+
+\subsection*{Windows G\+UI }
+
+On windows C\+Make comes with a gui application\+: Start -\/$>$ Programs -\/$>$ C\+Make -\/$>$ C\+Make (cmake-\/gui)
+
+\subsection*{wolf\+S\+S\+L/\+Cya\+S\+SL replacement for Open\+S\+SL }
+
+wolf\+S\+S\+L/\+Cya\+S\+SL is a lightweight S\+SL library targeted at embedded systems\+: \href{https://www.wolfssl.com/wolfSSL/Products-wolfssl.html}{\tt https\+://www.\+wolfssl.\+com/wolf\+S\+S\+L/\+Products-\/wolfssl.\+html}
+
+It contains a Open\+S\+SL compatibility layer which makes it possible to pretty much link to it instead of Open\+S\+SL, giving a much smaller footprint.
+
+{\bfseries N\+O\+TE}\+: wolfssl needs to be compiled using the {\ttfamily -\/-\/enable-\/opensslextra} flag for this to work.
+
+\subsection*{Compiling libwebsockets with wolf\+S\+SL }
+
+
+\begin{DoxyCode}
+1 cmake .. -DLWS\_USE\_WOLFSSL=1 \(\backslash\)
+2 -DLWS\_WOLFSSL\_INCLUDE\_DIRS=/path/to/wolfssl \(\backslash\)
+3 -DLWS\_WOLFSSL\_LIBRARIES=/path/to/wolfssl/wolfssl.a ..
+\end{DoxyCode}
+
+
+{\bfseries N\+O\+TE}\+: On windows use the .lib file extension for {\ttfamily L\+W\+S\+\_\+\+W\+O\+L\+F\+S\+S\+L\+\_\+\+L\+I\+B\+R\+A\+R\+I\+ES} instead.
+
+\subsection*{Compiling libwebsockets with Cya\+S\+SL }
+
+
+\begin{DoxyCode}
+1 cmake .. -DLWS\_USE\_CYASSL=1 \(\backslash\)
+2 -DLWS\_CYASSL\_INCLUDE\_DIRS=/path/to/cyassl \(\backslash\)
+3 -DLWS\_CYASSL\_LIBRARIES=/path/to/wolfssl/cyassl.a ..
+\end{DoxyCode}
+
+
+{\bfseries N\+O\+TE}\+: On windows use the .lib file extension for {\ttfamily L\+W\+S\+\_\+\+C\+Y\+A\+S\+S\+L\+\_\+\+L\+I\+B\+R\+A\+R\+I\+ES} instead.
+
+\subsection*{Compiling libwebsockets with Polar\+S\+SL }
+
+Caution... at some point Polar\+S\+SL became Mbed\+T\+LS. But it did not happen all at once. The name changed first then at mbed\+T\+LS 2.\+0 the apis changed. So eg in Fedora 22, there is an \char`\"{}mbedtls\char`\"{} package which is actually using polarssl for the include dir and polarssl apis... this should be treated as polarssl then.
+
+Example config for this case is
+\begin{DoxyCode}
+1 cmake .. -DLWS\_USE\_POLARSSL=1 -DLWS\_POLARSSL\_LIBRARIES=/usr/lib64/libmbedtls.so \(\backslash\)
+2 -DLWS\_POLARSSL\_INCLUDE\_DIRS=/usr/include/polarssl/
+\end{DoxyCode}
+
+
+\subsection*{Building plugins outside of lws itself }
+
+The directory ./plugin-\/standalone/ shows how easy it is to create plugins outside of lws itself. First build lws itself with -\/\+D\+L\+W\+S\+\_\+\+W\+I\+T\+H\+\_\+\+P\+L\+U\+G\+I\+NS, then use the same flow to build the standalone plugin
+\begin{DoxyCode}
+1 cd ./plugin-standalone
+2 mkdir build
+3 cd build
+4 cmake ..
+5 make && sudo make install
+\end{DoxyCode}
+
+
+if you changed the default plugin directory when you built lws, you must also give the same arguments to cmake here (eg, {\ttfamily -\/\+D\+C\+M\+A\+K\+E\+\_\+\+I\+N\+S\+T\+A\+L\+L\+\_\+\+P\+R\+E\+F\+IX\+:P\+A\+TH=/usr/something/else...} )
+
+Otherwise if you run lwsws or libwebsockets-\/test-\/server-\/v2.\+0, it will now find the additional plugin \char`\"{}libprotocol\+\_\+example\+\_\+standalone.\+so\char`\"{}
+\begin{DoxyCode}
+1 lwsts[21257]: Plugins:
+2 lwsts[21257]: libprotocol\_dumb\_increment.so
+3 lwsts[21257]: libprotocol\_example\_standalone.so
+4 lwsts[21257]: libprotocol\_lws\_mirror.so
+5 lwsts[21257]: libprotocol\_lws\_server\_status.so
+6 lwsts[21257]: libprotocol\_lws\_status.so
+\end{DoxyCode}
+ If you have multiple vhosts, you must enable plugins at the vhost additionally, discovered plugins are not enabled automatically for security reasons. You do this using info-\/$>$pvo or for lwsws, in the J\+S\+ON config.
+
+\subsection*{Reproducing H\+T\+T\+P2.\+0 tests }
+
+You must have built and be running lws against a version of openssl that has A\+L\+PN / N\+PN. Most distros still have older versions. You\textquotesingle{}ll know it\textquotesingle{}s right by seeing
+\begin{DoxyCode}
+1 lwsts[4752]: Compiled with OpenSSL support
+2 lwsts[4752]: Using SSL mode
+3 lwsts[4752]: HTTP2 / ALPN enabled
+\end{DoxyCode}
+ at lws startup.
+
+For non-\/\+S\+SL H\+T\+T\+P2.\+0 upgrade
+\begin{DoxyCode}
+1 $ nghttp -nvasu http://localhost:7681/test.htm
+\end{DoxyCode}
+ For S\+SL / A\+L\+PN H\+T\+T\+P2.\+0 upgrade
+\begin{DoxyCode}
+1 $ nghttp -nvas https://localhost:7681/test.html
+\end{DoxyCode}
+
+
+\subsection*{Cross compiling }
+
+To enable cross-\/compiling {\bfseries libwebsockets} using C\+Make you need to create a \char`\"{}\+Toolchain file\char`\"{} that you supply to C\+Make when generating your build files. C\+Make will then use the cross compilers and build paths specified in this file to look for dependencies and such.
+
+{\bfseries Libwebsockets} includes an example toolchain file \href{cross-arm-linux-gnueabihf.cmake}{\tt cross-\/arm-\/linux-\/gnueabihf.\+cmake} you can use as a starting point.
+
+The commandline to configure for cross with this would look like
+\begin{DoxyCode}
+1 $ cmake .. -DCMAKE\_INSTALL\_PREFIX:PATH=/usr \(\backslash\)
+2 -DCMAKE\_TOOLCHAIN\_FILE=../cross-arm-linux-gnueabihf.cmake \(\backslash\)
+3 -DWITHOUT\_EXTENSIONS=1 -DWITH\_SSL=0
+\end{DoxyCode}
+ The example shows how to build with no external cross lib dependencies, you need to provide the cross libraries otherwise.
+
+{\bfseries N\+O\+TE}\+: start from an E\+M\+P\+TY build directory if you had a non-\/cross build in there before the settings will be cached and your changes ignored.
+
+Additional information on cross compilation with C\+Make\+: \href{http://www.vtk.org/Wiki/CMake_Cross_Compiling}{\tt http\+://www.\+vtk.\+org/\+Wiki/\+C\+Make\+\_\+\+Cross\+\_\+\+Compiling}
+
+\subsection*{Memory efficiency }
+
+Embedded server-\/only configuration without extensions (ie, no compression on websocket connections), but with full v13 websocket features and http server, built on A\+RM Cortex-\/\+A9\+:
+
+Update at 8dac94d (2013-\/02-\/18)
+\begin{DoxyCode}
+1 $ ./configure --without-client --without-extensions --disable-debug --without-daemonize
+2
+3 Context Creation, 1024 fd limit[2]: 16720 (includes 12 bytes per fd)
+4 Per-connection [3]: 72 bytes, +1328 during headers
+5
+6 .text .rodata .data .bss
+7 11512 2784 288 4
+\end{DoxyCode}
+ This shows the impact of the major configuration with/without options at 13ba5bbc633ea962d46d using Ubuntu A\+RM on a Panda\+Board ES.
+
+These are accounting for static allocations from the library elf, there are additional dynamic allocations via malloc. These are a bit old now but give the right idea for relative \char`\"{}expense\char`\"{} of features.
+
+Static allocations, A\+R\+M9
+
+\tabulinesep=1mm
+\begin{longtabu} spread 0pt [c]{*5{|X[-1]}|}
+\hline
+\rowcolor{\tableheadbgcolor}{\bf }&{\bf .text }&{\bf .rodata }&{\bf .data }&{\bf .bss }\\\cline{1-5}
+\endfirsthead
+\hline
+\endfoot
+\hline
+\rowcolor{\tableheadbgcolor}{\bf }&{\bf .text }&{\bf .rodata }&{\bf .data }&{\bf .bss }\\\cline{1-5}
+\endhead
+All (no without) &35024 &9940 &336 &4104 \\\cline{1-5}
+without client &25684 &7144 &336 &4104 \\\cline{1-5}
+without client, exts &21652 &6288 &288 &4104 \\\cline{1-5}
+without client, exts, debug\mbox{[}1\mbox{]} &19756 &3768 &288 &4104 \\\cline{1-5}
+without server &30304 &8160 &336 &4104 \\\cline{1-5}
+without server, exts &25382 &7204 &288 &4104 \\\cline{1-5}
+without server, exts, debug\mbox{[}1\mbox{]} &23712 &4256 &288 &4104 \\\cline{1-5}
+\end{longtabu}
+\mbox{[}1\mbox{]} {\ttfamily -\/-\/disable-\/debug} only removes messages below {\ttfamily lwsl\+\_\+notice}. Since that is the default logging level the impact is not noticeable, error, warn and notice logs are all still there.
+
+\mbox{[}2\mbox{]} {\ttfamily 1024} fd per process is the default limit (set by ulimit) in at least Fedora and Ubuntu. You can make significant savings tailoring this to actual expected peak fds, ie, at a limit of {\ttfamily 20}, context creation allocation reduces to {\ttfamily 4432 + 240 = 4672})
+
+\mbox{[}3\mbox{]} known header content is freed after connection establishment
\ No newline at end of file
--- /dev/null
+\subsection*{Daemonization }
+
+There\textquotesingle{}s a helper api {\ttfamily lws\+\_\+daemonize} built by default that does everything you need to daemonize well, including creating a lock file. If you\textquotesingle{}re making what\textquotesingle{}s basically a daemon, just call this early in your init to fork to a headless background process and exit the starting process.
+
+Notice stdout, stderr, stdin are all redirected to /dev/null to enforce your daemon is headless, so you\textquotesingle{}ll need to sort out alternative logging, by, eg, syslog.
+
+\subsection*{Maximum number of connections }
+
+The maximum number of connections the library can deal with is decided when it starts by querying the OS to find out how many file descriptors it is allowed to open (1024 on Fedora for example). It then allocates arrays that allow up to that many connections, minus whatever other file descriptors are in use by the user code.
+
+If you want to restrict that allocation, or increase it, you can use ulimit or similar to change the avaiable number of file descriptors, and when restarted {\bfseries libwebsockets} will adapt accordingly.
+
+\subsection*{Libwebsockets is singlethreaded }
+
+Directly performing websocket actions from other threads is not allowed. Aside from the internal data being inconsistent in {\ttfamily forked()} processes, the scope of a {\ttfamily wsi} ({\ttfamily struct websocket}) can end at any time during service with the socket closing and the {\ttfamily wsi} freed.
+
+Websocket write activities should only take place in the {\ttfamily L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+W\+R\+I\+T\+E\+A\+B\+LE} callback as described below.
+
+\mbox{[}This network-\/programming necessity to link the issue of new data to the peer taking the previous data is not obvious to all users so let\textquotesingle{}s repeat that in other words\+:
+
+$\ast$$\ast$$\ast$\+O\+N\+LY DO L\+W\+S\+\_\+\+W\+R\+I\+TE F\+R\+OM T\+HE W\+R\+I\+T\+E\+A\+B\+LE C\+A\+L\+L\+B\+A\+C\+K$\ast$$\ast$$\ast$
+
+There is another network-\/programming truism that surprises some people which is if the sink for the data cannot accept more\+:
+
+$\ast$$\ast$$\ast$\+Y\+OU M\+U\+ST P\+E\+R\+F\+O\+RM RX F\+L\+OW C\+O\+N\+T\+R\+O\+L$\ast$$\ast$$\ast$
+
+See the mirror protocol implementations for example code.
+
+Only live connections appear in the user callbacks, so this removes any possibility of trying to used closed and freed wsis.
+
+If you need to service other socket or file descriptors as well as the websocket ones, you can combine them together with the websocket ones in one poll loop, see \char`\"{}\+External Polling Loop support\char`\"{} below, and still do it all in one thread / process context.
+
+If you insist on trying to use it from multiple threads, take special care if you might simultaneously create more than one context from different threads.
+
+S\+S\+L\+\_\+library\+\_\+init() is called from the context create api and it also is not reentrant. So at least create the contexts sequentially.
+
+\subsection*{Only send data when socket writeable }
+
+You should only send data on a websocket connection from the user callback {\ttfamily L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+W\+R\+I\+T\+E\+A\+B\+LE} (or {\ttfamily L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+W\+R\+I\+T\+E\+A\+B\+LE} for clients).
+
+If you want to send something, do not just send it but request a callback when the socket is writeable using
+
+
+\begin{DoxyItemize}
+\item {\ttfamily lws\+\_\+callback\+\_\+on\+\_\+writable(context, wsi)} for a specific {\ttfamily wsi}, or
+\item {\ttfamily lws\+\_\+callback\+\_\+on\+\_\+writable\+\_\+all\+\_\+protocol(protocol)} for all connections using that protocol to get a callback when next writeable.
+\end{DoxyItemize}
+
+Usually you will get called back immediately next time around the service loop, but if your peer is slow or temporarily inactive the callback will be delayed accordingly. Generating what to write and sending it should be done in the ...W\+R\+I\+T\+E\+A\+B\+LE callback.
+
+See the test server code for an example of how to do this.
+
+\subsection*{Do not rely on only your own W\+R\+I\+T\+E\+A\+B\+LE requests appearing }
+
+Libwebsockets may generate additional {\ttfamily L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+W\+R\+I\+T\+E\+A\+B\+LE} events if it met network conditions where it had to buffer your send data internally.
+
+So your code for {\ttfamily L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+W\+R\+I\+T\+E\+A\+B\+LE} needs to own the decision about what to send, it can\textquotesingle{}t assume that just because the writeable callback came it really is time to send something.
+
+It\textquotesingle{}s quite possible you get an \textquotesingle{}extra\textquotesingle{} writeable callback at any time and just need to {\ttfamily return 0} and wait for the expected callback later.
+
+\subsection*{Closing connections from the user side }
+
+When you want to close a connection, you do it by returning {\ttfamily -\/1} from a callback for that connection.
+
+You can provoke a callback by calling {\ttfamily lws\+\_\+callback\+\_\+on\+\_\+writable} on the wsi, then notice in the callback you want to close it and just return -\/1. But usually, the decision to close is made in a callback already and returning -\/1 is simple.
+
+If the socket knows the connection is dead, because the peer closed or there was an affirmitive network error like a F\+IN coming, then {\bfseries libwebsockets} will take care of closing the connection automatically.
+
+If you have a silently dead connection, it\textquotesingle{}s possible to enter a state where the send pipe on the connection is choked but no ack will ever come, so the dead connection will never become writeable. To cover that, you can use T\+CP keepalives (see later in this document)
+
+\subsection*{Fragmented messages }
+
+To support fragmented messages you need to check for the final frame of a message with {\ttfamily lws\+\_\+is\+\_\+final\+\_\+fragment}. This check can be combined with {\ttfamily libwebsockets\+\_\+remaining\+\_\+packet\+\_\+payload} to gather the whole contents of a message, eg\+:
+
+
+\begin{DoxyCode}
+1 case LWS\_CALLBACK\_RECEIVE:
+2 \{
+3 Client * const client = (Client *)user;
+4 const size\_t remaining = lws\_remaining\_packet\_payload(wsi);
+5
+6 if (!remaining && lws\_is\_final\_fragment(wsi)) \{
+7 if (client->HasFragments()) \{
+8 client->AppendMessageFragment(in, len, 0);
+9 in = (void *)client->GetMessage();
+10 len = client->GetMessageLength();
+11 \}
+12
+13 client->ProcessMessage((char *)in, len, wsi);
+14 client->ResetMessage();
+15 \} else
+16 client->AppendMessageFragment(in, len, remaining);
+17 \}
+18 break;
+\end{DoxyCode}
+
+
+The test app libwebsockets-\/test-\/fraggle sources also show how to deal with fragmented messages.
+
+\subsection*{Debug Logging }
+
+Also using {\ttfamily lws\+\_\+set\+\_\+log\+\_\+level} api you may provide a custom callback to actually emit the log string. By default, this points to an internal emit function that sends to stderr. Setting it to {\ttfamily N\+U\+LL} leaves it as it is instead.
+
+A helper function {\ttfamily \hyperlink{group__log_gab7c0fc936cc9f1eb58e2bb234c15147c}{lwsl\+\_\+emit\+\_\+syslog()}} is exported from the library to simplify logging to syslog. You still need to use {\ttfamily setlogmask}, {\ttfamily openlog} and {\ttfamily closelog} in your user code.
+
+The logging apis are made available for user code.
+
+
+\begin{DoxyItemize}
+\item {\ttfamily lwsl\+\_\+err(...)}
+\item {\ttfamily lwsl\+\_\+warn(...)}
+\item {\ttfamily lwsl\+\_\+notice(...)}
+\item {\ttfamily lwsl\+\_\+info(...)}
+\item {\ttfamily lwsl\+\_\+debug(...)}
+\end{DoxyItemize}
+
+The difference between notice and info is that notice will be logged by default whereas info is ignored by default.
+
+\subsection*{External Polling Loop support }
+
+{\bfseries libwebsockets} maintains an internal {\ttfamily poll()} array for all of its sockets, but you can instead integrate the sockets into an external polling array. That\textquotesingle{}s needed if {\bfseries libwebsockets} will cooperate with an existing poll array maintained by another server.
+
+Four callbacks {\ttfamily L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+A\+D\+D\+\_\+\+P\+O\+L\+L\+\_\+\+FD}, {\ttfamily L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+D\+E\+L\+\_\+\+P\+O\+L\+L\+\_\+\+FD}, {\ttfamily L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+S\+E\+T\+\_\+\+M\+O\+D\+E\+\_\+\+P\+O\+L\+L\+\_\+\+FD} and {\ttfamily L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+C\+L\+E\+A\+R\+\_\+\+M\+O\+D\+E\+\_\+\+P\+O\+L\+L\+\_\+\+FD} appear in the callback for protocol 0 and allow interface code to manage socket descriptors in other poll loops.
+
+You can pass all pollfds that need service to {\ttfamily \hyperlink{group__service_gad82efa5466d14a9f05aa06416375b28d}{lws\+\_\+service\+\_\+fd()}}, even if the socket or file does not belong to {\bfseries libwebsockets} it is safe.
+
+If {\bfseries libwebsocket} handled it, it zeros the pollfd {\ttfamily revents} field before returning. So you can let {\bfseries libwebsockets} try and if {\ttfamily pollfd-\/$>$revents} is nonzero on return, you know it needs handling by your code.
+
+\subsection*{Using with in c++ apps }
+
+The library is ready for use by C++ apps. You can get started quickly by copying the test server
+
+
+\begin{DoxyCode}
+1 $ cp test-server/test-server.c test.cpp
+\end{DoxyCode}
+
+
+and building it in C++ like this
+
+
+\begin{DoxyCode}
+1 $ g++ -DINSTALL\_DATADIR=\(\backslash\)"/usr/share\(\backslash\)" -ocpptest test.cpp -lwebsockets
+\end{DoxyCode}
+
+
+{\ttfamily I\+N\+S\+T\+A\+L\+L\+\_\+\+D\+A\+T\+A\+D\+IR} is only needed because the test server uses it as shipped, if you remove the references to it in your app you don\textquotesingle{}t need to define it on the g++ line either.
+
+\subsection*{Availability of header information }
+
+From v1.\+2 of the library onwards, the H\+T\+TP header content is {\ttfamily free()}d as soon as the websocket connection is established. For websocket servers, you can copy interesting headers by handling {\ttfamily L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+F\+I\+L\+T\+E\+R\+\_\+\+P\+R\+O\+T\+O\+C\+O\+L\+\_\+\+C\+O\+N\+N\+E\+C\+T\+I\+ON} callback, for clients there\textquotesingle{}s a new callback just for this purpose {\ttfamily L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+F\+I\+L\+T\+E\+R\+\_\+\+P\+R\+E\+\_\+\+E\+S\+T\+A\+B\+L\+I\+SH}.
+
+\subsection*{T\+CP Keepalive }
+
+It is possible for a connection which is not being used to send to die silently somewhere between the peer and the side not sending. In this case by default T\+CP will just not report anything and you will never get any more incoming data or sign the link is dead until you try to send.
+
+To deal with getting a notification of that situation, you can choose to enable T\+CP keepalives on all {\bfseries libwebsockets} sockets, when you create the context.
+
+To enable keepalive, set the ka\+\_\+time member of the context creation parameter struct to a nonzero value (in seconds) at context creation time. You should also fill ka\+\_\+probes and ka\+\_\+interval in that case.
+
+With keepalive enabled, the T\+CP layer will send control packets that should stimulate a response from the peer without affecting link traffic. If the response is not coming, the socket will announce an error at {\ttfamily poll()} forcing a close.
+
+Note that B\+S\+Ds don\textquotesingle{}t support keepalive time / probes / interval per-\/socket like Linux does. On those systems you can enable keepalive by a nonzero value in {\ttfamily ka\+\_\+time}, but the systemwide kernel settings for the time / probes/ interval are used, regardless of what nonzero value is in {\ttfamily ka\+\_\+time}.
+
+\subsection*{Optimizing S\+SL connections }
+
+There\textquotesingle{}s a member {\ttfamily ssl\+\_\+cipher\+\_\+list} in the {\ttfamily \hyperlink{structlws__context__creation__info}{lws\+\_\+context\+\_\+creation\+\_\+info}} struct which allows the user code to restrict the possible cipher selection at context-\/creation time.
+
+You might want to look into that to stop the ssl peers selecting a cipher which is too computationally expensive. To use it, point it to a string like \begin{DoxyVerb} `"RC4-MD5:RC4-SHA:AES128-SHA:AES256-SHA:HIGH:!DSS:!aNULL"`
+\end{DoxyVerb}
+
+
+if left {\ttfamily N\+U\+LL}, then the \char`\"{}\+D\+E\+F\+A\+U\+L\+T\char`\"{} set of ciphers are all possible to select.
+
+You can also set it to {\ttfamily \char`\"{}\+A\+L\+L\char`\"{}} to allow everything (including insecure ciphers).
+
+\subsection*{Async nature of client connections }
+
+When you call {\ttfamily \hyperlink{structlws__client__connect__info}{lws\+\_\+client\+\_\+connect\+\_\+info}(..)} and get a {\ttfamily wsi} back, it does not mean your connection is active. It just means it started trying to connect.
+
+Your client connection is actually active only when you receive {\ttfamily L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+E\+S\+T\+A\+B\+L\+I\+S\+H\+ED} for it.
+
+There\textquotesingle{}s a 5 second timeout for the connection, and it may give up or die for other reasons, if any of that happens you\textquotesingle{}ll get a {\ttfamily L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+C\+O\+N\+N\+E\+C\+T\+I\+O\+N\+\_\+\+E\+R\+R\+OR} callback on protocol 0 instead for the {\ttfamily wsi}.
+
+After attempting the connection and getting back a non-\/{\ttfamily N\+U\+LL} {\ttfamily wsi} you should loop calling {\ttfamily \hyperlink{group__service_gaf95bd0c663d6516a0c80047d9b1167a8}{lws\+\_\+service()}} until one of the above callbacks occurs.
+
+As usual, see \href{test-server/test-client.c}{\tt test-\/client.\+c} for example code.
+
+\subsection*{Lws platform-\/independent file access apis }
+
+lws now exposes his internal platform file abstraction in a way that can be both used by user code to make it platform-\/agnostic, and be overridden or subclassed by user code. This allows things like handling the U\+RI \char`\"{}directory
+space\char`\"{} as a virtual filesystem that may or may not be backed by a regular filesystem. One example use is serving files from inside large compressed archive storage without having to unpack anything except the file being requested.
+
+The test server shows how to use it, basically the platform-\/specific part of lws prepares a file operations structure that lives in the lws context.
+
+The user code can get a pointer to the file operations struct
+
+
+\begin{DoxyCode}
+1 LWS\_VISIBLE LWS\_EXTERN struct lws\_plat\_file\_ops *
+2 `lws\_get\_fops`(struct lws\_context *context);
+\end{DoxyCode}
+
+
+and then can use helpers to also leverage these platform-\/independent file handling apis
+
+
+\begin{DoxyCode}
+1 static inline lws\_filefd\_type
+2 `lws\_plat\_file\_open`(struct lws *wsi, const char *filename, unsigned long *filelen, int flags)
+3
+4 static inline int
+5 `lws\_plat\_file\_close`(struct lws *wsi, lws\_filefd\_type fd)
+6
+7 static inline unsigned long
+8 `lws\_plat\_file\_seek\_cur`(struct lws *wsi, lws\_filefd\_type fd, long offset\_from\_cur\_pos)
+9
+10 static inline int
+11 `lws\_plat\_file\_read`(struct lws *wsi, lws\_filefd\_type fd, unsigned long *amount, unsigned char *buf,
+ unsigned long len)
+12
+13 static inline int
+14 `lws\_plat\_file\_write`(struct lws *wsi, lws\_filefd\_type fd, unsigned long *amount, unsigned char *buf,
+ unsigned long len)
+\end{DoxyCode}
+
+
+The user code can also override or subclass the file operations, to either wrap or replace them. An example is shown in test server.
+
+\subsection*{E\+C\+DH Support }
+
+E\+C\+DH Certs are now supported. Enable the C\+Make option \begin{DoxyVerb} cmake .. -DLWS_SSL_SERVER_WITH_ECDH_CERT=1
+\end{DoxyVerb}
+
+
+{\bfseries and} the info-\/$>$options flag \begin{DoxyVerb} LWS_SERVER_OPTION_SSL_ECDH
+\end{DoxyVerb}
+
+
+to build in support and select it at runtime.
+
+\subsection*{S\+MP / Multithreaded service }
+
+S\+MP support is integrated into L\+WS without any internal threading. It\textquotesingle{}s very simple to use, libwebsockets-\/test-\/server-\/pthread shows how to do it, use -\/j $<$n$>$ argument there to control the number of service threads up to 32.
+
+Two new members are added to the info struct \begin{DoxyVerb} unsigned int count_threads;
+ unsigned int fd_limit_per_thread;
+\end{DoxyVerb}
+
+
+leave them at the default 0 to get the normal singlethreaded service loop.
+
+Set count\+\_\+threads to n to tell lws you will have n simultaneous service threads operating on the context.
+
+There is still a single listen socket on one port, no matter how many service threads.
+
+When a connection is made, it is accepted by the service thread with the least connections active to perform load balancing.
+
+The user code is responsible for spawning n threads running the service loop associated to a specific tsi (Thread Service Index, 0 .. n -\/ 1). See the libwebsockets-\/test-\/server-\/pthread for how to do.
+
+If you leave fd\+\_\+limit\+\_\+per\+\_\+thread at 0, then the process limit of fds is shared between the service threads; if you process was allowed 1024 fds overall then each thread is limited to 1024 / n.
+
+You can set fd\+\_\+limit\+\_\+per\+\_\+thread to a nonzero number to control this manually, eg the overall supported fd limit is less than the process allowance.
+
+You can control the context basic data allocation for multithreading from Cmake using -\/\+D\+L\+W\+S\+\_\+\+M\+A\+X\+\_\+\+S\+MP=, if not given it\textquotesingle{}s set to 32. The serv\+\_\+buf allocation for the threads (currently 4096) is made at runtime only for active threads.
+
+Because lws will limit the requested number of actual threads supported according to L\+W\+S\+\_\+\+M\+A\+X\+\_\+\+S\+MP, there is an api lws\+\_\+get\+\_\+count\+\_\+threads(context) to discover how many threads were actually allowed when the context was created.
+
+It\textquotesingle{}s required to implement locking in the user code in the same way that libwebsockets-\/test-\/server-\/pthread does it, for the FD locking callbacks.
+
+There is no knowledge or dependency in lws itself about pthreads. How the locking is implemented is entirely up to the user code.
+
+\subsection*{Libev / Libuv support }
+
+You can select either or both \begin{DoxyVerb} -DLWS_WITH_LIBEV=1
+ -DLWS_WITH_LIBUV=1
+\end{DoxyVerb}
+
+
+at cmake configure-\/time. The user application may use one of the context init options flags \begin{DoxyVerb} LWS_SERVER_OPTION_LIBEV
+ LWS_SERVER_OPTION_LIBUV
+\end{DoxyVerb}
+
+
+to indicate it will use either of the event libraries.
+
+\subsection*{Extension option control from user code }
+
+User code may set per-\/connection extension options now, using a new api {\ttfamily \hyperlink{group__extensions_gae0e24e1768f83a7fb07896ce975704b9}{lws\+\_\+set\+\_\+extension\+\_\+option()}}.
+
+This should be called from the E\+S\+T\+A\+B\+L\+I\+S\+H\+ED callback like this
+\begin{DoxyCode}
+1 lws\_set\_extension\_option(wsi, "permessage-deflate",
+2 "rx\_buf\_size", "12"); /* 1 << 12 */
+\end{DoxyCode}
+
+
+If the extension is not active (missing or not negotiated for the connection, or extensions are disabled on the library) the call is just returns -\/1. Otherwise the connection\textquotesingle{}s extension has its named option changed.
+
+The extension may decide to alter or disallow the change, in the example above permessage-\/deflate restricts the size of his rx output buffer also considering the protocol\textquotesingle{}s rx\+\_\+buf\+\_\+size member.
+
+\subsection*{Client connections as H\+T\+TP\mbox{[}S\mbox{]} rather than WS\mbox{[}S\mbox{]} }
+
+You may open a generic http client connection using the same struct \hyperlink{structlws__client__connect__info}{lws\+\_\+client\+\_\+connect\+\_\+info} used to create client ws\mbox{[}s\mbox{]} connections.
+
+To stay in http\mbox{[}s\mbox{]}, set the optional info member \char`\"{}method\char`\"{} to point to the string \char`\"{}\+G\+E\+T\char`\"{} instead of the default N\+U\+LL.
+
+After the server headers are processed, when payload from the server is available the callback L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+R\+E\+C\+E\+I\+V\+E\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+H\+T\+TP will be made.
+
+You can choose whether to process the data immediately, or queue a callback when an outgoing socket is writeable to provide flow control, and process the data in the writable callback.
+
+Either way you use the api {\ttfamily lws\+\_\+http\+\_\+client\+\_\+read()} to access the data, eg
+
+
+\begin{DoxyCode}
+1 case LWS\_CALLBACK\_RECEIVE\_CLIENT\_HTTP:
+2 \{
+3 char buffer[1024 + LWS\_PRE];
+4 char *px = buffer + LWS\_PRE;
+5 int lenx = sizeof(buffer) - LWS\_PRE;
+6
+7 lwsl\_notice("LWS\_CALLBACK\_RECEIVE\_CLIENT\_HTTP\(\backslash\)n");
+8
+9 /*
+10 * Often you need to flow control this by something
+11 * else being writable. In that case call the api
+12 * to get a callback when writable here, and do the
+13 * pending client read in the writeable callback of
+14 * the output.
+15 */
+16 if (lws\_http\_client\_read(wsi, &px, &lenx) < 0)
+17 return -1;
+18 while (lenx--)
+19 putchar(*px++);
+20 \}
+21 break;
+\end{DoxyCode}
+
+
+\subsection*{Using lws v2 vhosts }
+
+If you set L\+W\+S\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+E\+X\+P\+L\+I\+C\+I\+T\+\_\+\+V\+H\+O\+S\+TS options flag when you create your context, it won\textquotesingle{}t create a default vhost using the info struct members for compatibility. Instead you can call \hyperlink{group__context-and-vhost_ga0c54c667ccd9b8b3dddcd123ca72f87c}{lws\+\_\+create\+\_\+vhost()} afterwards to attach one or more vhosts manually.
+
+
+\begin{DoxyCode}
+1 LWS\_VISIBLE struct lws\_vhost *
+2 lws\_create\_vhost(struct lws\_context *context,
+3 struct lws\_context\_creation\_info *info,
+4 struct lws\_http\_mount *mounts);
+\end{DoxyCode}
+
+
+\hyperlink{group__context-and-vhost_ga0c54c667ccd9b8b3dddcd123ca72f87c}{lws\+\_\+create\+\_\+vhost()} uses the same info struct as \hyperlink{group__context-and-vhost_gaf2fff58562caab7510c41eeac85a8648}{lws\+\_\+create\+\_\+context()}, it ignores members related to context and uses the ones meaningful for vhost (marked with VH in \hyperlink{libwebsockets_8h}{libwebsockets.\+h}).
+
+
+\begin{DoxyCode}
+1 struct lws\_context\_creation\_info \{
+2 int port; /* VH */
+3 const char *iface; /* VH */
+4 const struct lws\_protocols *protocols; /* VH */
+5 const struct lws\_extension *extensions; /* VH */
+6 ...
+\end{DoxyCode}
+
+
+When you attach the vhost, if the vhost\textquotesingle{}s port already has a listen socket then both vhosts share it and use S\+NI (is S\+SL in use) or the Host\+: header from the client to select the right one. Or if no other vhost already listening the a new listen socket is created.
+
+There are some new members but mainly it\textquotesingle{}s stuff you used to set at context creation time.
+
+\subsection*{Using lws v2 mounts on a vhost }
+
+The last argument to \hyperlink{group__context-and-vhost_ga0c54c667ccd9b8b3dddcd123ca72f87c}{lws\+\_\+create\+\_\+vhost()} lets you associate a linked list of \hyperlink{structlws__http__mount}{lws\+\_\+http\+\_\+mount} structures with that vhost\textquotesingle{}s U\+RL \textquotesingle{}namespace\textquotesingle{}, in a similar way that unix lets you mount filesystems into areas of your / filesystem how you like and deal with the contents transparently.
+
+
+\begin{DoxyCode}
+1 struct lws\_http\_mount \{
+2 struct lws\_http\_mount *mount\_next;
+3 const char *mountpoint; /* mountpoint in http pathspace, eg, "/" */
+4 const char *origin; /* path to be mounted, eg, "/var/www/warmcat.com" */
+5 const char *def; /* default target, eg, "index.html" */
+6
+7 struct lws\_protocol\_vhost\_options *cgienv;
+8
+9 int cgi\_timeout;
+10 int cache\_max\_age;
+11
+12 unsigned int cache\_reusable:1;
+13 unsigned int cache\_revalidate:1;
+14 unsigned int cache\_intermediaries:1;
+15
+16 unsigned char origin\_protocol;
+17 unsigned char mountpoint\_len;
+18 \};
+\end{DoxyCode}
+
+
+The last mount structure should have a N\+U\+LL mount\+\_\+next, otherwise it should point to the \textquotesingle{}next\textquotesingle{} mount structure in your list.
+
+Both the mount structures and the strings must persist until the context is destroyed, since they are not copied but used in place.
+
+{\ttfamily .origin\+\_\+protocol} should be one of
+
+
+\begin{DoxyCode}
+1 enum \{
+2 LWSMPRO\_HTTP,
+3 LWSMPRO\_HTTPS,
+4 LWSMPRO\_FILE,
+5 LWSMPRO\_CGI,
+6 LWSMPRO\_REDIR\_HTTP,
+7 LWSMPRO\_REDIR\_HTTPS,
+8 LWSMPRO\_CALLBACK,
+9 \};
+\end{DoxyCode}
+
+
+
+\begin{DoxyItemize}
+\item L\+W\+S\+M\+P\+R\+O\+\_\+\+F\+I\+LE is used for mapping url namespace to a filesystem directory and serve it automatically.
+\item L\+W\+S\+M\+P\+R\+O\+\_\+\+C\+GI associates the url namespace with the given C\+GI executable, which runs when the U\+RL is accessed and the output provided to the client.
+\item L\+W\+S\+M\+P\+R\+O\+\_\+\+R\+E\+D\+I\+R\+\_\+\+H\+T\+TP and L\+W\+S\+M\+P\+R\+O\+\_\+\+R\+E\+D\+I\+R\+\_\+\+H\+T\+T\+PS auto-\/redirect clients to the given origin U\+RL.
+\item L\+W\+S\+M\+P\+R\+O\+\_\+\+C\+A\+L\+L\+B\+A\+CK causes the http connection to attach to the callback associated with the named protocol (which may be a plugin).
+\end{DoxyItemize}
+
+\subsection*{Operation of L\+W\+S\+M\+P\+R\+O\+\_\+\+C\+A\+L\+L\+B\+A\+CK mounts }
+
+The feature provided by C\+A\+L\+L\+B\+A\+CK type mounts is binding a part of the U\+RL namespace to a named protocol callback handler.
+
+This allows protocol plugins to handle areas of the U\+RL namespace. For example in test-\/server-\/v2.\+0.\+c, the U\+RL area \char`\"{}/formtest\char`\"{} is associated with the plugin providing \char`\"{}protocol-\/post-\/demo\char`\"{} like this
+
+
+\begin{DoxyCode}
+1 static const struct lws\_http\_mount mount\_post = \{
+2 NULL, /* linked-list pointer to next*/
+3 "/formtest", /* mountpoint in URL namespace on this vhost */
+4 "protocol-post-demo", /* handler */
+5 NULL, /* default filename if none given */
+6 NULL,
+7 0,
+8 0,
+9 0,
+10 0,
+11 0,
+12 LWSMPRO\_CALLBACK, /* origin points to a callback */
+13 9, /* strlen("/formtest"), ie length of the mountpoint */
+14 \};
+\end{DoxyCode}
+
+
+Client access to /formtest\mbox{[}anything\mbox{]} will be passed to the callback registered with the named protocol, which in this case is provided by a protocol plugin.
+
+Access by all methods, eg, G\+ET and P\+O\+ST are handled by the callback.
+
+protocol-\/post-\/demo deals with accepting and responding to the html form that is in the test server H\+T\+ML.
+
+When a connection accesses a U\+RL related to a C\+A\+L\+L\+B\+A\+CK type mount, the connection protocol is changed until the next access on the connection to a U\+RL outside the same C\+A\+L\+L\+B\+A\+CK mount area. User space on the connection is arranged to be the size of the new protocol user space allocation as given in the protocol struct.
+
+This allocation is only deleted / replaced when the connection accesses a U\+RL region with a different protocol (or the default protocols\mbox{[}0\mbox{]} if no C\+A\+L\+L\+B\+A\+CK area matches it).
\ No newline at end of file
--- /dev/null
+\subsection*{Enabling for build }
+
+Enable at C\+Make with -\/\+D\+L\+W\+S\+\_\+\+W\+I\+T\+H\+\_\+\+G\+E\+N\+E\+R\+I\+C\+\_\+\+S\+E\+S\+S\+I\+O\+NS=1
+
+This also needs sqlite3 (libsqlite3-\/dev or similar package)
+
+\subsection*{Introduction }
+
+The generic-\/sessions protocol plugin provides cookie-\/based login authentication for lws web and ws connections.
+
+The plugin handles everything about generic account registration, email verification, lost password, account deletion, and other generic account management.
+
+Other code, in another eg, ws protocol handler, only needs very high-\/level state information from generic-\/sessions, ie, which user the client is authenticated as. Everything underneath is managed in generic-\/sessions.
+
+
+\begin{DoxyItemize}
+\item random 20-\/byte session id managed in a cookie
+\item all information related to the session held at the server, nothing managed clientside
+\item sqlite3 used at the server to manage active sessions and users
+\item defaults to creating anonymous sessions with no user associated
+\item admin account (with user-\/selectable username) is defined in config with a S\+H\+A-\/1 of the password; rest of the accounts are in sqlite3
+\item user account passwords stored as salted S\+H\+A-\/1 with additional confounder only stored in the J\+S\+ON config, not the database
+\item login, logout, register account + email verification built-\/in with examples
+\item in a mount, some file suffixes (ie, .js) can be associated with a protocol for the purposes of rewriting symbolnames. These are read-\/only copies of logged-\/in server state.
+\item When your page fetches .js or other rewritten files from that mount, \char`\"{}\$lwsgs\+\_\+user\char`\"{} and so on are rewritten on the fly using chunked transfer encoding
+\item Eliminates server-\/side scripting with a few rewritten symbols and javascript on client side
+\item 32-\/bit bitfield for authentication sectoring, mounts can provide a mask on the loggin-\/in session\textquotesingle{}s associated server-\/side bitfield that must be set for access.
+\item No code (just config) required for, eg, private U\+RL namespace that requires login to access.
+\end{DoxyItemize}
+
+\subsection*{Integration to H\+T\+ML }
+
+Only three steps are needed to integrate lwsgs in your H\+T\+ML.
+
+1) lwsgs H\+T\+ML UI is bundled with the javascript it uses in {\ttfamily lwsgs.\+js}, so import that script file in your head section
+
+2) define an empty div of id \char`\"{}lwsgs\char`\"{} somewhere
+
+3) Call lwsgs\+\_\+initial() in your page
+
+That\textquotesingle{}s it. An example is below
+
+
+\begin{DoxyCode}
+1 <html>
+2 <head>
+3 <script src="lwsgs.js"></script>
+4 <style>
+5 .body \{ font-size: 12 \}
+6 .gstitle \{ font-size: 18 \}
+7 </style>
+8 </head>
+9 <body style="background-image:url(seats.jpg)">
+10 <table style="width:100%;transition: max-height 2s;">
+11 <tr>
+12 <td style="vertical-align:top;text-align:left;width=200px">
+13 <img src="lwsgs-logo.png">
+14 </td>
+15 <td style="vertical-align:top;float:right">
+16 <div id=lwsgs style="text-align:right;background-color: rgba(255, 255, 255, 0.8);"></div>
+17 </td>
+18 </tr>
+19 </table>
+20 </form>
+21
+22 <script>lwsgs\_initial();</script>
+23
+24 </body>
+25 </html>
+\end{DoxyCode}
+ \subsection*{Overall Flow }
+
+When the protocol is initialized, it gets per-\/vhost information from the config, such as where the sqlite3 databases are to be stored. The admin username and sha-\/1 of the admin password are also taken from here.
+
+In the mounts using protocol-\/generic-\/sessions, a cookie is maintained against any requests; if no cookie was active on the initial request a new session is created with no attached user.
+
+So there should always be an active session after any transactions with the server.
+
+In the example html going to the mount /lwsgs loads a login / register page as the default.
+
+The $<$form$>$ in the login page contains \textquotesingle{}next url\textquotesingle{} hidden inputs that let the html \textquotesingle{}program\textquotesingle{} where the form handler will go after a successful admin login, a successful user login and a failed login.
+
+After a successful login, the sqlite record at the server for the current session is updated to have the logged-\/in username associated with it.
+
+\subsection*{Configuration }
+
+\char`\"{}auth-\/mask\char`\"{} defines the autorization sector bits that must be enabled on the session to gain access.
+
+\char`\"{}auth-\/mask\char`\"{} 0 is the default.
+
+
+\begin{DoxyItemize}
+\item b0 is set if you are logged in as a user at all.
+\item b1 is set if you are logged in with the user configured to be admin
+\item b2 is set if the account has been verified (the account configured for admin is always verified)
+\item b3 is set if your session just did the forgot password flow successfully
+\end{DoxyItemize}
+
+
+\begin{DoxyCode}
+1 \{
+2 # things in here can always be served
+3 "mountpoint": "/lwsgs",
+4 "origin": "file:///usr/share/libwebsockets-test-server/generic-sessions",
+5 "origin": "callback://protocol-lws-messageboard",
+6 "default": "generic-sessions-login-example.html",
+7 "auth-mask": "0",
+8 "interpret": \{
+9 ".js": "protocol-lws-messageboard"
+10 \}
+11 \}, \{
+12 # things in here can only be served if logged in as a user
+13 "mountpoint": "/lwsgs/needauth",
+14 "origin": "file:///usr/share/libwebsockets-test-server/generic-sessions/needauth",
+15 "origin": "callback://protocol-lws-messageboard",
+16 "default": "generic-sessions-login-example.html",
+17 "auth-mask": "5", # logged in as a verified user
+18 "interpret": \{
+19 ".js": "protocol-lws-messageboard"
+20 \}
+21 \}, \{
+22 # things in here can only be served if logged in as admin
+23 "mountpoint": "/lwsgs/needadmin",
+24 "origin": "file:///usr/share/libwebsockets-test-server/generic-sessions/needadmin",
+25 "origin": "callback://protocol-lws-messageboard",
+26 "default": "generic-sessions-login-example.html",
+27 "auth-mask": "7", # b2 = verified (by email / or admin), b1 = admin, b0 = logged in with any user name
+28 "interpret": \{
+29 ".js": "protocol-lws-messageboard"
+30 \}
+31 \}
+\end{DoxyCode}
+ Note that the name of the real application protocol that uses generic-\/sessions is used, not generic-\/sessions itself.
+
+The vhost configures the storage dir, admin credentials and session cookie lifetimes\+:
+
+
+\begin{DoxyCode}
+1 "ws-protocols": [\{
+2 "protocol-generic-sessions": \{
+3 "status": "ok",
+4 "admin-user": "admin",
+5
+6 # create the pw hash like this (for the example pw, "jipdocesExunt" )
+7 # $ echo -n "jipdocesExunt" | sha1sum
+8 # 046ce9a9cca769e85798133be06ef30c9c0122c9 -
+9 #
+10 # Obviously ** change this password hash to a secret one before deploying **
+11 #
+12 "admin-password-sha1": "046ce9a9cca769e85798133be06ef30c9c0122c9",
+13 "session-db": "/var/www/sessions/lws.sqlite3",
+14 "timeout-idle-secs": "600",
+15 "timeout-anon-idle-secs": "1200",
+16 "timeout-absolute-secs": "6000",
+17 # the confounder is part of the salted password hashes. If this config
+18 # file is in a 0700 root:root dir, an attacker with apache credentials
+19 # will have to get the confounder out of the process image to even try
+20 # to guess the password hashes.
+21 "confounder": "Change to <=31 chars of junk",
+22
+23 "email-from": "noreply@example.com",
+24 "email-smtp-ip": "127.0.0.1",
+25 "email-expire": "3600",
+26 "email-helo": "myhost.com",
+27 "email-contact-person": "Set Me <real-person@email.com>",
+28 "email-confirm-url-base": "http://localhost:7681/lwsgs"
+29 \}
+\end{DoxyCode}
+
+
+The email-\/ related settings control generation of automatic emails for registration and forgotten password.
+
+
+\begin{DoxyItemize}
+\item {\ttfamily email-\/from}\+: The email address automatic emails are sent from
+\item {\ttfamily email-\/smtp-\/ip}\+: Normally 127.\+0.\+0.\+1, if you have a suitable server on port 25 on your lan you can use this instead here.
+\item {\ttfamily email-\/expire}\+: Seconds that links sent in email will work before being deleted
+\item {\ttfamily email-\/helo}\+: H\+E\+LO to use when communicating with your S\+M\+TP server
+\item {\ttfamily email-\/contact-\/person}\+: mentioned in the automatic emails as a human who can answer questions
+\item {\ttfamily email-\/confirm-\/url-\/base}\+: the U\+RL to start links with in the emails, so the recipient can get back to the web server
+\end{DoxyItemize}
+
+The real protocol that makes use of generic-\/sessions must also be listed and any configuration it needs given
+
+
+\begin{DoxyCode}
+1 "protocol-lws-messageboard": \{
+2 "status": "ok",
+3 "message-db": "/var/www/sessions/messageboard.sqlite3"
+4 \},
+\end{DoxyCode}
+
+
+Notice the real application uses his own sqlite db, no details about how generic-\/sessions works or how it stores data are available to it.
+
+\subsection*{Password Confounder }
+
+You can also define a per-\/vhost confounder shown in the example above, used when aggregating the password with the salt when it is hashed. Any attacker will also need to get the confounder along with the database, which you can make harder by making the config dir only eneterable / readable by root.
+
+\subsection*{Preparing the db directory }
+
+You will have to prepare the db directory so it\textquotesingle{}s suitable for the lwsws user to use, that usually means apache, eg
+
+
+\begin{DoxyCode}
+1 # mkdir -p /var/www/sessions
+2 # chown root:apache /var/www/sessions
+3 # chmod 770 /var/www/sessions
+\end{DoxyCode}
+
+
+\subsection*{Email configuration }
+
+lwsgs will can send emails by talking to an S\+M\+TP server on localhost\+:25. That will usually be sendmail or postfix, you should confirm that works first by itself using the {\ttfamily mail} application to send on it.
+
+lwsgs has been tested on stock Fedora sendmail and postfix.
+
+\subsection*{Integration with another protocol }
+
+lwsgs is designed to provide sessions and accounts in a standalone and generic way.
+
+But it\textquotesingle{}s not useful by itself, there will always be the actual application who wants to make use of generic-\/sessions features.
+
+The basic approach is the \textquotesingle{}real\textquotesingle{} protocol handler (usually a plugin itself) subclasses the generic-\/sessions plugin and calls through to it by default.
+
+The \char`\"{}real\char`\"{} protocol handler entirely deals with ws-\/related stuff itself, since generic-\/sessions does not use ws. But for
+
+
+\begin{DoxyItemize}
+\item L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+H\+T\+TP
+\item L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+H\+T\+T\+P\+\_\+\+B\+O\+DY
+\item L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+H\+T\+T\+P\+\_\+\+B\+O\+D\+Y\+\_\+\+C\+O\+M\+P\+L\+E\+T\+I\+ON
+\item L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+H\+T\+T\+P\+\_\+\+D\+R\+O\+P\+\_\+\+P\+R\+O\+T\+O\+C\+OL
+\end{DoxyItemize}
+
+the \char`\"{}real\char`\"{} protocol handler checks if it recognizes the activity (eg, his own P\+O\+ST form U\+RL) and if not, passes stuff through to the generic-\/sessions protocol callback to handle it. To simplify matters the real protocol can just pass through any unhandled messages to generic-\/sessions.
+
+The \char`\"{}real\char`\"{} protocol can get a pointer to generic-\/sessions protocol on the same vhost using
+
+
+\begin{DoxyCode}
+1 vhd->gsp = lws\_vhost\_name\_to\_protocol(vhd->vh, "protocol-generic-sessions");
+\end{DoxyCode}
+
+
+The \char`\"{}real\char`\"{} protocol must also arrange generic-\/sessions per\+\_\+session\+\_\+data in his own per-\/session allocation. To allow keeping generic-\/sessions opaque, the real protocol must allocate that space at runtime, using the pss size the generic-\/sessions protocol struct exposes
+
+
+\begin{DoxyCode}
+1 struct per\_session\_data\_\_myapp \{
+2 void *pss\_gs;
+3 ...
+4
+5 pss->pss\_gs = malloc(vhd->gsp->per\_session\_data\_size);
+\end{DoxyCode}
+
+
+The allocation reserved for generic-\/sessions is then used as user\+\_\+space when the real protocol calls through to the generic-\/sessions callback
+
+
+\begin{DoxyCode}
+1 vhd->gsp->callback(wsi, reason, &pss->pss\_gs, in, len);
+\end{DoxyCode}
+
+
+In that way the \char`\"{}real\char`\"{} protocol can subclass generic-\/sessions functionality.
+
+To ease management of these secondary allocations, there are callbacks that occur when a wsi binds to a protocol and when the binding is dropped. These should be used to malloc and free and kind of per-\/connection secondary allocations.
+
+
+\begin{DoxyCode}
+1 case LWS\_CALLBACK\_HTTP\_BIND\_PROTOCOL:
+2 if (!pss || pss->pss\_gs)
+3 break;
+4
+5 pss->pss\_gs = malloc(vhd->gsp->per\_session\_data\_size);
+6 if (!pss->pss\_gs)
+7 return -1;
+8
+9 memset(pss->pss\_gs, 0, vhd->gsp->per\_session\_data\_size);
+10 break;
+11
+12 case LWS\_CALLBACK\_HTTP\_DROP\_PROTOCOL:
+13 if (vhd->gsp->callback(wsi, reason, pss ? pss->pss\_gs : NULL, in, len))
+14 return -1;
+15
+16 if (pss->pss\_gs) \{
+17 free(pss->pss\_gs);
+18 pss->pss\_gs = NULL;
+19 \}
+20 break;
+\end{DoxyCode}
+
+
+\subsection*{Getting session-\/specific information from another protocol }
+
+At least at the time when someone tries to upgrade an http(s) connection to ws(s) with your real protocol, it is necessary to confirm the cookie the http(s) connection has with generic-\/sessions and find out his username and other info.
+
+Generic sessions lets another protocol check it again by calling his callback, and lws itself provides a generic session info struct to pass the related data
+
+
+\begin{DoxyCode}
+1 struct lws\_session\_info \{
+2 char username[32];
+3 char email[100];
+4 char ip[72];
+5 unsigned int mask;
+6 char session[42];
+7 \};
+8
+9 struct lws\_session\_info sinfo;
+10 ...
+11 vhd->gsp->callback(wsi, LWS\_CALLBACK\_SESSION\_INFO,
+12 &pss->pss\_gs, &sinfo, 0);
+\end{DoxyCode}
+
+
+After the call to generic-\/sessions, the results can be
+
+
+\begin{DoxyItemize}
+\item all the strings will be zero-\/length and .mask zero, there is no usable cookie
+\begin{DoxyItemize}
+\item only .ip and .session are set\+: the cookie is OK but no user logged in
+\item all the strings contain information about the logged-\/in user
+\end{DoxyItemize}
+\end{DoxyItemize}
+
+the real protocol can use this to reject attempts to open ws connections from http connections that are not authenticated; afterwards there\textquotesingle{}s no need to check the ws connection auth status again.
\ No newline at end of file
--- /dev/null
+\subsection*{Libwebsockets Web Server }
+
+lwsws is an implementation of a very lightweight, ws-\/capable generic web server, which uses libwebsockets to implement everything underneath.
+
+\subsection*{Build }
+
+Just enable -\/\+D\+L\+W\+S\+\_\+\+W\+I\+T\+H\+\_\+\+L\+W\+S\+WS=1 at cmake-\/time.
+
+It enables libuv and plugin support automatically.
+
+\subsection*{Configuration }
+
+lwsws uses J\+S\+ON config files, they\textquotesingle{}re pure J\+S\+ON but \# may be used to turn the rest of the line into a comment.
+
+There is a single file intended for global settings
+
+/etc/lwsws/conf
+\begin{DoxyCode}
+1 # these are the server global settings
+2 # stuff related to vhosts should go in one
+3 # file per vhost in ../conf.d/
+4
+5 \{
+6 "global": \{
+7 "uid": "48", # apache user
+8 "gid": "48", # apache user
+9 "count-threads": "1",
+10 "server-string": "myserver v1", # returned in http headers
+11 "init-ssl": "yes"
+12 \}
+13 \}
+\end{DoxyCode}
+ and a config directory intended to take one file per vhost
+
+/etc/lwsws/conf.d/warmcat.\+com
+\begin{DoxyCode}
+1 \{
+2 "vhosts": [\{
+3 "name": "warmcat.com",
+4 "port": "443",
+5 "interface": "eth0", # optional
+6 "host-ssl-key": "/etc/pki/tls/private/warmcat.com.key", # if given enable ssl
+7 "host-ssl-cert": "/etc/pki/tls/certs/warmcat.com.crt",
+8 "host-ssl-ca": "/etc/pki/tls/certs/warmcat.com.cer",
+9 "mounts": [\{ # autoserve
+10 "mountpoint": "/",
+11 "origin": "file:///var/www/warmcat.com",
+12 "default": "index.html"
+13 \}]
+14 \}]
+15 \}
+\end{DoxyCode}
+ To get started quickly, an example config reproducing the old test server on port 7681, non-\/\+S\+SL is provided. To set it up
+\begin{DoxyCode}
+1 # mkdir -p /etc/lwsws/conf.d /var/log/lwsws
+2 # cp ./lwsws/etc-lwsws-conf-EXAMPLE /etc/lwsws/conf
+3 # cp ./lwsws/etc-lwsws-conf.d-localhost-EXAMPLE /etc/lwsws/conf.d/test-server
+4 # sudo lwsws
+\end{DoxyCode}
+ \subsection*{Vhosts }
+
+One server can run many vhosts, where S\+SL is in use S\+NI is used to match the connection to a vhost and its vhost-\/specific S\+SL keys during S\+SL negotiation.
+
+Listing multiple vhosts looks something like this
+\begin{DoxyCode}
+1 \{
+2 "vhosts": [ \{
+3 "name": "localhost",
+4 "port": "443",
+5 "host-ssl-key": "/etc/pki/tls/private/libwebsockets.org.key",
+6 "host-ssl-cert": "/etc/pki/tls/certs/libwebsockets.org.crt",
+7 "host-ssl-ca": "/etc/pki/tls/certs/libwebsockets.org.cer",
+8 "mounts": [\{
+9 "mountpoint": "/",
+10 "origin": "file:///var/www/libwebsockets.org",
+11 "default": "index.html"
+12 \}, \{
+13 "mountpoint": "/testserver",
+14 "origin": "file:///usr/local/share/libwebsockets-test-server",
+15 "default": "test.html"
+16 \}],
+17 # which protocols are enabled for this vhost, and optional
+18 # vhost-specific config options for the protocol
+19 #
+20 "ws-protocols": [\{
+21 "warmcat,timezoom": \{
+22 "status": "ok"
+23 \}
+24 \}]
+25 \},
+26 \{
+27 "name": "localhost",
+28 "port": "7681",
+29 "host-ssl-key": "/etc/pki/tls/private/libwebsockets.org.key",
+30 "host-ssl-cert": "/etc/pki/tls/certs/libwebsockets.org.crt",
+31 "host-ssl-ca": "/etc/pki/tls/certs/libwebsockets.org.cer",
+32 "mounts": [\{
+33 "mountpoint": "/",
+34 "origin": ">https://localhost"
+35 \}]
+36 \},
+37 \{
+38 "name": "localhost",
+39 "port": "80",
+40 "mounts": [\{
+41 "mountpoint": "/",
+42 "origin": ">https://localhost"
+43 \}]
+44 \}
+45
+46 ]
+47 \}
+\end{DoxyCode}
+
+
+That sets up three vhosts all called \char`\"{}localhost\char`\"{} on ports 443 and 7681 with S\+SL, and port 80 without S\+SL but with a forced redirect to \href{https://localhost}{\tt https\+://localhost}
+
+\subsection*{Vhost name and port }
+
+The vhost name field is used to match on incoming S\+NI or Host\+: header, so it must always be the host name used to reach the vhost externally.
+
+
+\begin{DoxyItemize}
+\item Vhosts may have the same name and different ports, these will each create a listening socket on the appropriate port.
+\item Vhosts may also have the same port and different name\+: these will be treated as true vhosts on one listening socket and the active vhost decided at S\+SL negotiation time (via S\+NI) or if no S\+SL, then after the Host\+: header from the client has been parsed.
+\end{DoxyItemize}
+
+\subsection*{Protocols }
+
+Vhosts by default have available the union of any initial protocols from context creation time, and any protocols exposed by plugins.
+
+Vhosts can select which plugins they want to offer and give them per-\/vhost settings using this syntax
+\begin{DoxyCode}
+1 "ws-protocols": [\{
+2 "warmcat-timezoom": \{
+3 "status": "ok"
+4 \}
+5 \}]
+\end{DoxyCode}
+
+
+The \char`\"{}x\char`\"{}\+:\char`\"{}y\char`\"{} parameters like \char`\"{}status\char`\"{}\+:\char`\"{}ok\char`\"{} are made available to the protocol during its per-\/vhost L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+P\+R\+O\+T\+O\+C\+O\+L\+\_\+\+I\+N\+IT ( is a pointer to a linked list of struct \hyperlink{structlws__protocol__vhost__options}{lws\+\_\+protocol\+\_\+vhost\+\_\+options} containing the name and value pointers).
+
+To indicate that a protocol should be used when no Protocol\+: header is sent by the client, you can use \char`\"{}default\char`\"{}\+: \char`\"{}1\char`\"{}
+\begin{DoxyCode}
+1 "ws-protocols": [\{
+2 "warmcat-timezoom": \{
+3 "status": "ok",
+4 "default": "1"
+5 \}
+6 \}]
+\end{DoxyCode}
+
+
+\subsection*{Other vhost options }
+
+
+\begin{DoxyItemize}
+\item If the three options {\ttfamily host-\/ssl-\/cert}, {\ttfamily host-\/ssl-\/ca} and {\ttfamily host-\/ssl-\/key} are given, then the vhost supports S\+SL.
+\end{DoxyItemize}
+
+Each vhost may have its own certs, S\+NI is used during the initial connection negotiation to figure out which certs to use by the server name it\textquotesingle{}s asking for from the request D\+NS name.
+
+
+\begin{DoxyItemize}
+\item {\ttfamily keeplive-\/timeout} (in secs) defaults to 60 for lwsws, it may be set as a vhost option
+\item {\ttfamily interface} lets you specify which network interface to listen on, if not given listens on all
+\item \char`\"{}`unix-\/socket`\char`\"{}\+: \char`\"{}1\char`\"{} causes the unix socket specified in the interface option to be used instead of an I\+N\+ET socket
+\item \char`\"{}`sts`\char`\"{}\+: \char`\"{}1\char`\"{} causes lwsws to send a Strict Transport Security header with responses that informs the client he should never accept to connect to this address using http. This is needed to get the A+ security rating from S\+SL Labs for your server.
+\item \char`\"{}`access-\/log`\char`\"{}\+: \char`\"{}filepath\char`\"{} sets where apache-\/compatible access logs will be written
+\item {\ttfamily \char`\"{}enable-\/client-\/ssl\char`\"{}}\+: {\ttfamily \char`\"{}1\char`\"{}} enables the vhost\textquotesingle{}s client S\+SL context, you will need this if you plan to create client conections on the vhost that will use S\+SL. You don\textquotesingle{}t need it if you only want http / ws client connections.
+\item \char`\"{}`ciphers`\char`\"{}\+: \char`\"{}$<$cipher list$>$\char`\"{} sets the allowed list of ciphers and key exchange protocols for the vhost. The default list is restricted to only those providing P\+FS (Perfect Forward Secrecy) on the author\textquotesingle{}s Fedora system.
+\end{DoxyItemize}
+
+If you need to allow weaker ciphers,you can provide an alternative list here per-\/vhost.
+
+
+\begin{DoxyItemize}
+\item \char`\"{}`ecdh-\/curve`\char`\"{}\+: \char`\"{}$<$curve name$>$\char`\"{} The default ecdh curve is \char`\"{}prime256v1\char`\"{}, but you can override it here, per-\/vhost
+\item \char`\"{}`noipv6`\char`\"{}\+: \char`\"{}on\char`\"{} Disable ipv6 completely for this vhost
+\item \char`\"{}`ipv6only`\char`\"{}\+: \char`\"{}on\char`\"{} Only allow ipv6 on this vhost / \char`\"{}off\char`\"{} only allow ipv4 on this vhost
+\item \char`\"{}`ssl-\/option-\/set`\char`\"{}\+: \char`\"{}$<$decimal$>$\char`\"{} Sets the S\+SL option flag value for the vhost. It may be used multiple times and OR\textquotesingle{}s the flags together.
+\end{DoxyItemize}
+
+The values are derived from /usr/include/openssl/ssl.h
+\begin{DoxyCode}
+1 # define SSL\_OP\_NO\_TLSv1\_1 0x10000000L
+\end{DoxyCode}
+
+
+would equate to
+
+
+\begin{DoxyCode}
+1 "`ssl-option-set`": "268435456"
+\end{DoxyCode}
+
+\begin{DoxyItemize}
+\item \char`\"{}`ssl-\/option-\/clear\textquotesingle{}\char`\"{}\+: \char`\"{}$<$decimal$>$\char`\"{} Clears the S\+SL option flag value for the vhost. It may be used multiple times and OR\textquotesingle{}s the flags together.
+\end{DoxyItemize}
+
+\subsection*{Mounts }
+
+Where mounts are given in the vhost definition, then directory contents may be auto-\/served if it matches the mountpoint.
+
+Mount protocols are used to control what kind of translation happens
+
+
+\begin{DoxyItemize}
+\item \href{file://}{\tt file\+://} serve the uri using the remainder of the url past the mountpoint based on the origin directory.
+\end{DoxyItemize}
+
+Eg, with this mountpoint
+\begin{DoxyCode}
+1 \{
+2 "mountpoint": "/",
+3 "origin": "file:///var/www/mysite.com",
+4 "default": "/"
+5 \}
+\end{DoxyCode}
+ The uri /file.jpg would serve /var/www/mysite.com/file.\+jpg, since / matched.
+
+
+\begin{DoxyItemize}
+\item $^\wedge$http\+:// or $^\wedge$https\+:// these cause any url matching the mountpoint to issue a redirect to the origin url
+\item cgi\+:// this causes any matching url to be given to the named cgi, eg
+\begin{DoxyCode}
+1 \{
+2 "mountpoint": "/git",
+3 "origin": "cgi:///var/www/cgi-bin/cgit",
+4 "default": "/"
+5 \}, \{
+6 "mountpoint": "/cgit-data",
+7 "origin": "file:///usr/share/cgit",
+8 "default": "/"
+9 \},
+\end{DoxyCode}
+ would cause the url /git/myrepo to pass \char`\"{}myrepo\char`\"{} to the cgi /var/www/cgi-\/bin/cgit and send the results to the client.
+\end{DoxyItemize}
+
+\subsection*{Other mount options }
+
+1) When using a cgi\+:// protcol origin at a mountpoint, you may also give cgi environment variables specific to the mountpoint like this
+\begin{DoxyCode}
+1 \{
+2 "mountpoint": "/git",
+3 "origin": "cgi:///var/www/cgi-bin/cgit",
+4 "default": "/",
+5 "cgi-env": [\{
+6 "CGIT\_CONFIG": "/etc/cgitrc/libwebsockets.org"
+7 \}]
+8 \}
+\end{DoxyCode}
+ This allows you to customize one cgi depending on the mountpoint (and / or vhost).
+
+2) It\textquotesingle{}s also possible to set the cgi timeout (in secs) per cgi\+:// mount, like this
+\begin{DoxyCode}
+1 "cgi-timeout": "30"
+\end{DoxyCode}
+ 3) {\ttfamily callback\+://} protocol may be used when defining a mount to associate a named protocol callback with the U\+RL namespace area. For example
+\begin{DoxyCode}
+1 \{
+2 "mountpoint": "/formtest",
+3 "origin": "callback://protocol-post-demo"
+4 \}
+\end{DoxyCode}
+ All handling of client access to /formtest\mbox{[}anything\mbox{]} will be passed to the callback registered to the protocol \char`\"{}protocol-\/post-\/demo\char`\"{}.
+
+This is useful for handling P\+O\+ST http body content or general non-\/cgi http payload generation inside a plugin.
+
+See the related notes in R\+E\+A\+D\+M\+E.\+coding.\+md
+
+4) Cache policy of the files in the mount can also be set. If no options are given, the content is marked uncacheable.
+\begin{DoxyCode}
+1 \{
+2 "mountpoint": "/",
+3 "origin": "file:///var/www/mysite.com",
+4 "cache-max-age": "60", # seconds
+5 "cache-reuse": "1", # allow reuse at client at all
+6 "cache-revalidate": "1", # check it with server each time
+7 "cache-intermediaries": "1" # allow intermediary caches to hold
+8 \}
+\end{DoxyCode}
+
+
+4) You can also define a list of additional mimetypes per-\/mount
+\begin{DoxyCode}
+1 "extra-mimetypes": \{
+2 ".zip": "application/zip",
+3 ".doc": "text/evil"
+4 \}
+\end{DoxyCode}
+
+
+\subsection*{Plugins }
+
+Protcols and extensions may also be provided from \char`\"{}plugins\char`\"{}, these are lightweight dynamic libraries. They are scanned for at init time, and any protocols and extensions found are added to the list given at context creation time.
+
+Protocols receive init (L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+P\+R\+O\+T\+O\+C\+O\+L\+\_\+\+I\+N\+IT) and destruction (L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+P\+R\+O\+T\+O\+C\+O\+L\+\_\+\+D\+E\+S\+T\+R\+OY) callbacks per-\/vhost, and there are arrangements they can make per-\/vhost allocations and get hold of the correct pointer from the wsi at the callback.
+
+This allows a protocol to choose to strictly segregate data on a per-\/vhost basis, and also allows the plugin to handle its own initialization and context storage.
+
+To help that happen conveniently, there are some new apis
+
+
+\begin{DoxyItemize}
+\item lws\+\_\+vhost\+\_\+get(wsi)
+\item lws\+\_\+protocol\+\_\+get(wsi)
+\item lws\+\_\+callback\+\_\+on\+\_\+writable\+\_\+all\+\_\+protocol\+\_\+vhost(vhost, protocol)
+\item lws\+\_\+protocol\+\_\+vh\+\_\+priv\+\_\+zalloc(vhost, protocol, size)
+\item lws\+\_\+protocol\+\_\+vh\+\_\+priv\+\_\+get(vhost, protocol)
+\end{DoxyItemize}
+
+dumb increment, mirror and status protocol plugins are provided as examples.
+
+\subsection*{Additional plugin search paths }
+
+Packages that have their own lws plugins can install them in their own preferred dir and ask lwsws to scan there by using a config fragment like this, in its own conf.\+d/ file managed by the other package
+\begin{DoxyCode}
+1 \{
+2 "global": \{
+3 "plugin-dir": "/usr/local/share/coherent-timeline/plugins"
+4 \}
+5 \}
+\end{DoxyCode}
+
+
+\subsection*{lws-\/server-\/status plugin }
+
+One provided protocol can be used to monitor the server status.
+
+Enable the protocol like this on a vhost\textquotesingle{}s ws-\/protocols section
+\begin{DoxyCode}
+1 "lws-server-status": \{
+2 "status": "ok",
+3 "update-ms": "5000"
+4 \}
+\end{DoxyCode}
+ \char`\"{}update-\/ms\char`\"{} is used to control how often updated J\+S\+ON is sent on a ws link.
+
+And map the provided H\+T\+ML into the vhost in the mounts section
+\begin{DoxyCode}
+1 \{
+2 "mountpoint": "/server-status",
+3 "origin": "file:///usr/local/share/libwebsockets-test-server/server-status",
+4 "default": "server-status.html"
+5 \}
+\end{DoxyCode}
+ You might choose to put it on its own vhost which has \char`\"{}interface\char`\"{}\+: \char`\"{}lo\char`\"{}, so it\textquotesingle{}s not externally visible.
+
+\subsection*{Integration with Systemd }
+
+lwsws needs a service file like this as {\ttfamily /usr/lib/systemd/system/lwsws.service}
+\begin{DoxyCode}
+1 [Unit]
+2 Description=Libwebsockets Web Server
+3 After=syslog.target
+4
+5 [Service]
+6 ExecStart=/usr/local/bin/lwsws
+7 StandardError=null
+8
+9 [Install]
+10 WantedBy=multi-user.target
+\end{DoxyCode}
+
+
+You can find this prepared in {\ttfamily ./lwsws/usr-\/lib-\/systemd-\/system-\/lwsws.service}
+
+\subsection*{Integration with logrotate }
+
+For correct operation with logrotate, {\ttfamily /etc/logrotate.d/lwsws} (if that\textquotesingle{}s where we\textquotesingle{}re putting the logs) should contain
+\begin{DoxyCode}
+1 /var/log/lwsws/*log \{
+2 copytruncate
+3 missingok
+4 notifempty
+5 delaycompress
+6 \}
+\end{DoxyCode}
+ You can find this prepared in {\ttfamily /lwsws/etc-\/logrotate.d-\/lwsws}
+
+Prepare the log directory like this
+
+
+\begin{DoxyCode}
+1 sudo mkdir /var/log/lwsws
+2 sudo chmod 700 /var/log/lwsws
+\end{DoxyCode}
+
\ No newline at end of file
--- /dev/null
+\subsection*{Testing server with a browser }
+
+If you run \href{test-server/test-server.c}{\tt libwebsockets-\/test-\/server} and point your browser (eg, Chrome) to \begin{DoxyVerb} http://127.0.0.1:7681
+\end{DoxyVerb}
+
+
+It will fetch a script in the form of {\ttfamily test.\+html}, and then run the script in there on the browser to open a websocket connection. Incrementing numbers should appear in the browser display.
+
+By default the test server logs to both stderr and syslog, you can control what is logged using {\ttfamily -\/d $<$log level$>$}, see later.
+
+\subsection*{Running test server as a Daemon }
+
+You can use the -\/D option on the test server to have it fork into the background and return immediately. In this daemonized mode all stderr is disabled and logging goes only to syslog, eg, {\ttfamily /var/log/messages} or similar.
+
+The server maintains a lockfile at {\ttfamily /tmp/.lwsts-\/lock} that contains the pid of the master process, and deletes this file when the master process terminates.
+
+To stop the daemon, do
+\begin{DoxyCode}
+1 $ kill cat /tmp/.lwsts-lock
+\end{DoxyCode}
+ If it finds a stale lock (the pid mentioned in the file does not exist any more) it will delete the lock and create a new one during startup.
+
+If the lock is valid, the daemon will exit with a note on stderr that it was already running.
+
+\subsection*{Using S\+SL on the server side }
+
+To test it using S\+S\+L/\+W\+SS, just run the test server with
+\begin{DoxyCode}
+1 $ libwebsockets-test-server --ssl
+\end{DoxyCode}
+ and use the U\+RL
+\begin{DoxyCode}
+1 https://127.0.0.1:7681
+\end{DoxyCode}
+ The connection will be entirely encrypted using some generated certificates that your browser will not accept, since they are not signed by any real Certificate Authority. Just accept the certificates in the browser and the connection will proceed in first https and then websocket wss, acting exactly the same.
+
+\href{test-server/test-server.c}{\tt test-\/server.\+c} is all that is needed to use libwebsockets for serving both the script html over http and websockets.
+
+\subsection*{Testing websocket client support }
+
+If you run the test server as described above, you can also connect to it using the test client as well as a browser.
+
+
+\begin{DoxyCode}
+1 $ libwebsockets-test-client localhost
+\end{DoxyCode}
+
+
+will by default connect to the test server on localhost\+:7681 and print the dumb increment number from the server at the same time as drawing random circles in the mirror protocol; if you connect to the test server using a browser at the same time you will be able to see the circles being drawn.
+
+The test client supports S\+SL too, use
+
+
+\begin{DoxyCode}
+1 $ libwebsockets-test-client localhost --ssl -s
+\end{DoxyCode}
+
+
+the -\/s tells it to accept the default selfsigned cert from the server, otherwise it will strictly fail the connection if there is no CA cert to validate the server\textquotesingle{}s certificate.
+
+\subsection*{Choosing between test server variations }
+
+If you will be doing standalone serving with lws, ideally you should avoid making your own server at all, and use lwsws with your own protocol plugins.
+
+The second best option is follow test-\/server-\/v2.\+0.\+c, which uses a mount to autoserve a directory, and lws protocol plugins for ws, without needing any user callback code (other than what\textquotesingle{}s needed in the protocol plugin).
+
+For those two options libuv is needed to support the protocol plugins, if that\textquotesingle{}s not possible then the other variations with their own protocol code should be considered.
+
+\subsection*{Testing simple echo }
+
+You can test against {\ttfamily echo.\+websockets.\+org} as a sanity test like this (the client connects to port {\ttfamily 80} by default)\+:
+
+
+\begin{DoxyCode}
+1 $ libwebsockets-test-echo --client echo.websocket.org
+\end{DoxyCode}
+
+
+This echo test is of limited use though because it doesn\textquotesingle{}t negotiate any protocol. You can run the same test app as a local server, by default on localhost\+:7681
+\begin{DoxyCode}
+1 $ libwebsockets-test-echo
+\end{DoxyCode}
+ and do the echo test against the local echo server
+\begin{DoxyCode}
+1 $ libwebsockets-test-echo --client localhost --port 7681
+\end{DoxyCode}
+ If you add the {\ttfamily -\/-\/ssl} switch to both the client and server, you can also test with an encrypted link.
+
+\subsection*{Testing S\+SL on the client side }
+
+To test S\+S\+L/\+W\+SS client action, just run the client test with
+\begin{DoxyCode}
+1 $ libwebsockets-test-client localhost --ssl
+\end{DoxyCode}
+ By default the client test applet is set to accept selfsigned certificates used by the test server, this is indicated by the {\ttfamily use\+\_\+ssl} var being set to {\ttfamily 2}. Set it to {\ttfamily 1} to reject any server certificate that it doesn\textquotesingle{}t have a trusted CA cert for.
+
+\subsection*{Using the websocket ping utility }
+
+libwebsockets-\/test-\/ping connects as a client to a remote websocket server and pings it like the normal unix ping utility.
+\begin{DoxyCode}
+1 $ libwebsockets-test-ping localhost
+2 handshake OK for protocol lws-mirror-protocol
+3 Websocket PING localhost.localdomain (127.0.0.1) 64 bytes of data.
+4 64 bytes from localhost: req=1 time=0.1ms
+5 64 bytes from localhost: req=2 time=0.1ms
+6 64 bytes from localhost: req=3 time=0.1ms
+7 64 bytes from localhost: req=4 time=0.2ms
+8 64 bytes from localhost: req=5 time=0.1ms
+9 64 bytes from localhost: req=6 time=0.2ms
+10 64 bytes from localhost: req=7 time=0.2ms
+11 64 bytes from localhost: req=8 time=0.1ms
+12 ^C
+13 --- localhost.localdomain websocket ping statistics ---
+14 8 packets transmitted, 8 received, 0% packet loss, time 7458ms
+15 rtt min/avg/max = 0.110/0.185/0.218 ms
+16 $
+\end{DoxyCode}
+ By default it sends 64 byte payload packets using the 04 P\+I\+NG packet opcode type. You can change the payload size using the {\ttfamily -\/s=} flag, up to a maximum of 125 mandated by the 04 standard.
+
+Using the lws-\/mirror protocol that is provided by the test server, libwebsockets-\/test-\/ping can also use larger payload sizes up to 4096 is B\+I\+N\+A\+RY packets; lws-\/mirror will copy them back to the client and they appear as a P\+O\+NG. Use the {\ttfamily -\/m} flag to select this operation.
+
+The default interval between pings is 1s, you can use the -\/i= flag to set this, including fractions like {\ttfamily -\/i=0.\+01} for 10ms interval.
+
+Before you can even use the P\+I\+NG opcode that is part of the standard, you must complete a handshake with a specified protocol. By default lws-\/mirror-\/protocol is used which is supported by the test server. But if you are using it on another server, you can specify the protcol to handshake with by {\ttfamily -\/-\/protocol=protocolname}
+
+\subsection*{Fraggle test app }
+
+By default it runs in server mode
+\begin{DoxyCode}
+1 $ libwebsockets-test-fraggle
+2 libwebsockets test fraggle
+3 (C) Copyright 2010-2011 Andy Green <andy@warmcat.com> licensed under LGPL2.1
+4 Compiled with SSL support, not using it
+5 Listening on port 7681
+6 server sees client connect
+7 accepted v06 connection
+8 Spamming 360 random fragments
+9 Spamming session over, len = 371913. sum = 0x2D3C0AE
+10 Spamming 895 random fragments
+11 Spamming session over, len = 875970. sum = 0x6A74DA1
+12 ...
+\end{DoxyCode}
+ You need to run a second session in client mode, you have to give the {\ttfamily -\/c} switch and the server address at least\+:
+\begin{DoxyCode}
+1 $ libwebsockets-test-fraggle -c localhost
+2 libwebsockets test fraggle
+3 (C) Copyright 2010-2011 Andy Green <andy@warmcat.com> licensed under LGPL2.1
+4 Client mode
+5 Connecting to localhost:7681
+6 denied deflate-stream extension
+7 handshake OK for protocol fraggle-protocol
+8 client connects to server
+9 EOM received 371913 correctly from 360 fragments
+10 EOM received 875970 correctly from 895 fragments
+11 EOM received 247140 correctly from 258 fragments
+12 EOM received 695451 correctly from 692 fragments
+13 ...
+\end{DoxyCode}
+ The fraggle test sends a random number up to 1024 fragmented websocket frames each of a random size between 1 and 2001 bytes in a single message, then sends a checksum and starts sending a new randomly sized and fragmented message.
+
+The fraggle test client receives the same message fragments and computes the same checksum using websocket framing to see when the message has ended. It then accepts the server checksum message and compares that to its checksum.
+
+\subsection*{proxy support }
+
+The http\+\_\+proxy environment variable is respected by the client connection code for both {\ttfamily ws\+://} and {\ttfamily wss\+://}. It doesn\textquotesingle{}t support authentication.
+
+You use it like this
+\begin{DoxyCode}
+1 $ export http\_proxy=myproxy.com:3128
+2 $ libwebsockets-test-client someserver.com
+\end{DoxyCode}
+
+
+\subsection*{debug logging }
+
+By default logging of severity \char`\"{}notice\char`\"{}, \char`\"{}warn\char`\"{} or \char`\"{}err\char`\"{} is enabled to stderr.
+
+Again by default other logging is compiled in but disabled from printing.
+
+If you want to eliminate the debug logging below notice in severity, use the {\ttfamily -\/-\/disable-\/debug} configure option to have it removed from the code by the preprocesser.
+
+If you want to see more detailed debug logs, you can control a bitfield to select which logs types may print using the {\ttfamily \hyperlink{group__log_ga244647f9e1bf0097ccdde66d74f41e26}{lws\+\_\+set\+\_\+log\+\_\+level()}} api, in the test apps you can use {\ttfamily -\/d $<$number$>$} to control this. The types of logging available are (OR together the numbers to select multiple)
+
+
+\begin{DoxyItemize}
+\item 1 E\+RR
+\item 2 W\+A\+RN
+\item 4 N\+O\+T\+I\+CE
+\item 8 I\+N\+FO
+\item 16 D\+E\+B\+UG
+\item 32 P\+A\+R\+S\+ER
+\item 64 H\+E\+A\+D\+ER
+\item 128 E\+X\+T\+E\+N\+S\+I\+ON
+\item 256 C\+L\+I\+E\+NT
+\item 512 L\+A\+T\+E\+N\+CY
+\end{DoxyItemize}
+
+\subsection*{Websocket version supported }
+
+The final I\+E\+TF standard is supported for both client and server, protocol version 13.
+
+\subsection*{Latency Tracking }
+
+Since libwebsockets runs using {\ttfamily poll()} and a single threaded approach, any unexpected latency coming from system calls would be bad news. There\textquotesingle{}s now a latency tracking scheme that can be built in with {\ttfamily -\/-\/with-\/latency} at configure-\/time, logging the time taken for system calls to complete and if the whole action did complete that time or was deferred.
+
+You can see the detailed data by enabling logging level 512 (eg, {\ttfamily -\/d 519} on the test server to see that and the usual logs), however even without that the \char`\"{}worst\char`\"{} latency is kept and reported to the logs with N\+O\+T\+I\+CE severity when the context is destroyed.
+
+Some care is needed interpreting them, if the action completed the first figure (in us) is the time taken for the whole action, which may have retried through the poll loop many times and will depend on network roundtrip times. High figures here don\textquotesingle{}t indicate a problem. The figure in us reported after \char`\"{}lat\char`\"{} in the logging is the time taken by this particular attempt. High figures here may indicate a problem, or if you system is loaded with another app at that time, such as the browser, it may simply indicate the OS gave preferential treatment to the other app during that call.
+
+\subsection*{Autobahn Test Suite }
+
+Lws can be tested against the autobahn websocket fuzzer.
+
+1) pip install autobahntestsuite
+
+2) wstest -\/m fuzzingserver
+
+3) Run tests like this
+
+libwebsockets-\/test-\/echo --client localhost --port 9001 -\/u \char`\"{}/run\+Case?case=20\&agent=libwebsockets\char`\"{} -\/v -\/d 65535 -\/n 1
+
+(this runs test 20)
+
+4) In a browser, go here
+
+\href{http://localhost:8080/test_browser.html}{\tt http\+://localhost\+:8080/test\+\_\+browser.\+html}
+
+fill in \char`\"{}libwebsockets\char`\"{} in \char`\"{}\+User Agent Identifier\char`\"{} and press \char`\"{}\+Update Reports (\+Manual)\char`\"{}
+
+5) In a browser go to the directory you ran wstest in (eg, /projects/libwebsockets)
+
+\href{file:///projects/libwebsockets/reports/clients/index.html}{\tt file\+:///projects/libwebsockets/reports/clients/index.\+html}
+
+to see the results
+
+\subsection*{Autobahn Test Notes }
+
+1) Autobahn tests the user code + lws implementation. So to get the same results, you need to follow test-\/echo.\+c in terms of user implmentation.
+
+2) Some of the tests make no sense for Libwebsockets to support and we fail them.
+
+
+\begin{DoxyItemize}
+\item Tests 2.\+10 + 2.\+11\+: sends multiple pings on one connection. Lws policy is to only allow one active ping in flight on each connection, the rest are dropped. The autobahn test itself admits this is not part of the standard, just someone\textquotesingle{}s random opinion about how they think a ws server should act. So we will fail this by design and it is no problem about R\+F\+C6455 compliance.
+\end{DoxyItemize}
\ No newline at end of file
--- /dev/null
+\section{Modules}
+Here is a list of all modules\+:\begin{DoxyCompactList}
+\item \contentsline{section}{Built-\/in service loop entry}{\pageref{group__service}}{}
+\item \contentsline{section}{Callback when writeable}{\pageref{group__callback-when-writeable}}{}
+\item \contentsline{section}{Client}{\pageref{group__client}}{}
+\item \contentsline{section}{Connection timeouts}{\pageref{group__timeout}}{}
+\item \contentsline{section}{Context-\/and-\/vhost}{\pageref{group__context-and-vhost}}{}
+\begin{DoxyCompactList}
+\item \contentsline{section}{Vhost mounts and options}{\pageref{group__vhost-mounts}}{}
+\end{DoxyCompactList}
+\item \contentsline{section}{Extensions}{\pageref{group__extensions}}{}
+\item \contentsline{section}{H\+T\+TP}{\pageref{group__http}}{}
+\begin{DoxyCompactList}
+\item \contentsline{section}{Form Parsing}{\pageref{group__form-parsing}}{}
+\item \contentsline{section}{H\+T\+ML Chunked Substitution}{\pageref{group__html-chunked-substitution}}{}
+\item \contentsline{section}{H\+T\+TP File transfer}{\pageref{group__httpft}}{}
+\item \contentsline{section}{H\+T\+TP headers\+: create}{\pageref{group__HTTP-headers-create}}{}
+\item \contentsline{section}{H\+T\+TP headers\+: read}{\pageref{group__HTTP-headers-read}}{}
+\item \contentsline{section}{Urlencode and Urldecode}{\pageref{group__urlendec}}{}
+\end{DoxyCompactList}
+\item \contentsline{section}{Logging}{\pageref{group__log}}{}
+\item \contentsline{section}{Miscellaneous A\+P\+Is}{\pageref{group__misc}}{}
+\item \contentsline{section}{Network related helper A\+P\+Is}{\pageref{group__net}}{}
+\item \contentsline{section}{Protocols and Plugins}{\pageref{group__Protocols-and-Plugins}}{}
+\begin{DoxyCompactList}
+\item \contentsline{section}{plugin\+: generic-\/sessions}{\pageref{group__generic-sessions}}{}
+\end{DoxyCompactList}
+\item \contentsline{section}{S\+HA and B64 helpers}{\pageref{group__sha}}{}
+\item \contentsline{section}{Sanitize / purify S\+QL and J\+S\+ON helpers}{\pageref{group__pur}}{}
+\item \contentsline{section}{Sending data}{\pageref{group__sending-data}}{}
+\item \contentsline{section}{Smtp}{\pageref{group__smtp}}{}
+\item \contentsline{section}{Socket adoption helpers}{\pageref{group__sock-adopt}}{}
+\item \contentsline{section}{User Callback}{\pageref{group__usercb}}{}
+\item \contentsline{section}{Websocket Close}{\pageref{group__wsclose}}{}
+\item \contentsline{section}{Websocket status A\+P\+Is}{\pageref{group__wsstatus}}{}
+\item \contentsline{section}{cgi handling}{\pageref{group__cgi}}{}
+\item \contentsline{section}{file operation wrapping}{\pageref{group__fops}}{}
+\item \contentsline{section}{libev helpers}{\pageref{group__ev}}{}
+\item \contentsline{section}{libuv helpers}{\pageref{group__uv}}{}
+\end{DoxyCompactList}
--- /dev/null
+\documentclass[twoside]{book}
+
+% Packages required by doxygen
+\usepackage{fixltx2e}
+\usepackage{calc}
+\usepackage{doxygen}
+\usepackage[export]{adjustbox} % also loads graphicx
+\usepackage{graphicx}
+\usepackage[utf8]{inputenc}
+\usepackage{makeidx}
+\usepackage{multicol}
+\usepackage{multirow}
+\PassOptionsToPackage{warn}{textcomp}
+\usepackage{textcomp}
+\usepackage[nointegrals]{wasysym}
+\usepackage[table]{xcolor}
+
+% Font selection
+\usepackage[T1]{fontenc}
+\usepackage[scaled=.90]{helvet}
+\usepackage{courier}
+\usepackage{amssymb}
+\usepackage{sectsty}
+\renewcommand{\familydefault}{\sfdefault}
+\allsectionsfont{%
+ \fontseries{bc}\selectfont%
+ \color{darkgray}%
+}
+\renewcommand{\DoxyLabelFont}{%
+ \fontseries{bc}\selectfont%
+ \color{darkgray}%
+}
+\newcommand{\+}{\discretionary{\mbox{\scriptsize$\hookleftarrow$}}{}{}}
+
+% Page & text layout
+\usepackage{geometry}
+\geometry{%
+ a4paper,%
+ top=2.5cm,%
+ bottom=2.5cm,%
+ left=2.5cm,%
+ right=2.5cm%
+}
+\tolerance=750
+\hfuzz=15pt
+\hbadness=750
+\setlength{\emergencystretch}{15pt}
+\setlength{\parindent}{0cm}
+\setlength{\parskip}{3ex plus 2ex minus 2ex}
+\makeatletter
+\renewcommand{\paragraph}{%
+ \@startsection{paragraph}{4}{0ex}{-1.0ex}{1.0ex}{%
+ \normalfont\normalsize\bfseries\SS@parafont%
+ }%
+}
+\renewcommand{\subparagraph}{%
+ \@startsection{subparagraph}{5}{0ex}{-1.0ex}{1.0ex}{%
+ \normalfont\normalsize\bfseries\SS@subparafont%
+ }%
+}
+\makeatother
+
+% Headers & footers
+\usepackage{fancyhdr}
+\pagestyle{fancyplain}
+\fancyhead[LE]{\fancyplain{}{\bfseries\thepage}}
+\fancyhead[CE]{\fancyplain{}{}}
+\fancyhead[RE]{\fancyplain{}{\bfseries\leftmark}}
+\fancyhead[LO]{\fancyplain{}{\bfseries\rightmark}}
+\fancyhead[CO]{\fancyplain{}{}}
+\fancyhead[RO]{\fancyplain{}{\bfseries\thepage}}
+\fancyfoot[LE]{\fancyplain{}{}}
+\fancyfoot[CE]{\fancyplain{}{}}
+\fancyfoot[RE]{\fancyplain{}{\bfseries\scriptsize Generated by Doxygen }}
+\fancyfoot[LO]{\fancyplain{}{\bfseries\scriptsize Generated by Doxygen }}
+\fancyfoot[CO]{\fancyplain{}{}}
+\fancyfoot[RO]{\fancyplain{}{}}
+\renewcommand{\footrulewidth}{0.4pt}
+\renewcommand{\chaptermark}[1]{%
+ \markboth{#1}{}%
+}
+\renewcommand{\sectionmark}[1]{%
+ \markright{\thesection\ #1}%
+}
+
+% Indices & bibliography
+\usepackage{natbib}
+\usepackage[titles]{tocloft}
+\setcounter{tocdepth}{3}
+\setcounter{secnumdepth}{5}
+\makeindex
+
+% Hyperlinks (required, but should be loaded last)
+\usepackage{ifpdf}
+\ifpdf
+ \usepackage[pdftex,pagebackref=true]{hyperref}
+\else
+ \usepackage[ps2pdf,pagebackref=true]{hyperref}
+\fi
+\hypersetup{%
+ colorlinks=true,%
+ linkcolor=blue,%
+ citecolor=blue,%
+ unicode%
+}
+
+% Custom commands
+\newcommand{\clearemptydoublepage}{%
+ \newpage{\pagestyle{empty}\cleardoublepage}%
+}
+
+\usepackage{caption}
+\captionsetup{labelsep=space,justification=centering,font={bf},singlelinecheck=off,skip=4pt,position=top}
+
+%===== C O N T E N T S =====
+
+\begin{document}
+
+% Titlepage & ToC
+\hypersetup{pageanchor=false,
+ bookmarksnumbered=true,
+ pdfencoding=unicode
+ }
+\pagenumbering{roman}
+\begin{titlepage}
+\vspace*{7cm}
+\begin{center}%
+{\Large libwebsockets }\\
+\vspace*{1cm}
+{\large Generated by Doxygen 1.8.11}\\
+\end{center}
+\end{titlepage}
+\clearemptydoublepage
+\tableofcontents
+\clearemptydoublepage
+\pagenumbering{arabic}
+\hypersetup{pageanchor=true}
+
+%--- Begin generated contents ---
+\chapter{Libwebsockets A\+PI introduction}
+\label{index}\hypertarget{index}{}\input{index}
+\chapter{Notes about building lws}
+\label{md_README.build}
+\hypertarget{md_README.build}{}
+\input{md_README.build}
+\chapter{Notes about lwsws}
+\label{md_README.lwsws}
+\hypertarget{md_README.lwsws}{}
+\input{md_README.lwsws}
+\chapter{Notes about coding with lws}
+\label{md_README.coding}
+\hypertarget{md_README.coding}{}
+\input{md_README.coding}
+\chapter{Notes about generic-\/sessions Plugin}
+\label{md_README.generic-sessions}
+\hypertarget{md_README.generic-sessions}{}
+\input{md_README.generic-sessions}
+\chapter{Notes about lws test apps}
+\label{md_README.test-apps}
+\hypertarget{md_README.test-apps}{}
+\input{md_README.test-apps}
+\chapter{Deprecated List}
+\label{deprecated}
+\hypertarget{deprecated}{}
+\input{deprecated}
+\chapter{Module Index}
+\input{modules}
+\chapter{Hierarchical Index}
+\input{hierarchy}
+\chapter{Data Structure Index}
+\input{annotated}
+\chapter{File Index}
+\input{files}
+\chapter{Module Documentation}
+\input{group__service}
+\include{group__callback-when-writeable}
+\include{group__client}
+\include{group__timeout}
+\include{group__context-and-vhost}
+\include{group__extensions}
+\include{group__form-parsing}
+\include{group__html-chunked-substitution}
+\include{group__http}
+\include{group__httpft}
+\include{group__HTTP-headers-create}
+\include{group__HTTP-headers-read}
+\include{group__log}
+\include{group__misc}
+\include{group__net}
+\include{group__Protocols-and-Plugins}
+\include{group__sha}
+\include{group__pur}
+\include{group__sending-data}
+\include{group__smtp}
+\include{group__sock-adopt}
+\include{group__urlendec}
+\include{group__usercb}
+\include{group__vhost-mounts}
+\include{group__wsclose}
+\include{group__wsstatus}
+\include{group__cgi}
+\include{group__fops}
+\include{group__ev}
+\include{group__uv}
+\include{group__generic-sessions}
+\chapter{Data Structure Documentation}
+\input{structlws__cgi__args}
+\input{structlws__client__connect__info}
+\input{classlws__conn}
+\input{classlws__conn__listener}
+\input{structlws__context__creation__info}
+\input{structlws__email}
+\input{structlws__ext__option__arg}
+\input{structlws__ext__options}
+\input{structlws__extension}
+\input{structlws__gs__event__args}
+\input{structlws__http__mount}
+\input{structlws__plat__file__ops}
+\input{structlws__plugin}
+\input{structlws__plugin__capability}
+\input{structlws__polarssl__context}
+\input{structlws__pollargs}
+\input{structlws__pollfd}
+\input{structlws__process__html__args}
+\input{structlws__process__html__state}
+\input{structlws__protocol__vhost__options}
+\input{structlws__protocols}
+\input{structlws__session__info}
+\input{structlws__token__limits}
+\input{structlws__tokens}
+\input{structlwsgw__hash}
+\input{structlwsgw__hash__bin}
+\input{structpollfd}
+\chapter{File Documentation}
+\input{libwebsockets_8h}
+%--- End generated contents ---
+
+% Index
+\backmatter
+\newpage
+\phantomsection
+\clearemptydoublepage
+\addcontentsline{toc}{chapter}{Index}
+\printindex
+
+\end{document}
--- /dev/null
+\hypertarget{structlws__cgi__args}{}\section{lws\+\_\+cgi\+\_\+args Struct Reference}
+\label{structlws__cgi__args}\index{lws\+\_\+cgi\+\_\+args@{lws\+\_\+cgi\+\_\+args}}
+\subsection*{Data Fields}
+\begin{DoxyCompactItemize}
+\item
+struct lws $\ast$$\ast$ \hyperlink{structlws__cgi__args_a4ccc1058e7e914a26eef31ab2ad46aa1}{stdwsi}
+\item
+enum lws\+\_\+enum\+\_\+stdinouterr \hyperlink{structlws__cgi__args_adeee220b29aeacc34632c38e50f0f5a5}{ch}
+\item
+unsigned char $\ast$ \hyperlink{structlws__cgi__args_a8ac842084688c02f3f94694ef700d8f7}{data}
+\item
+enum lws\+\_\+cgi\+\_\+hdr\+\_\+state \hyperlink{structlws__cgi__args_a741c11b9aa05997ec45a3400d7fb7739}{hdr\+\_\+state}
+\item
+int \hyperlink{structlws__cgi__args_a36e5c256433c187bd0eaa9c1ca667f1d}{len}
+\end{DoxyCompactItemize}
+
+
+\subsection{Field Documentation}
+\index{lws\+\_\+cgi\+\_\+args@{lws\+\_\+cgi\+\_\+args}!ch@{ch}}
+\index{ch@{ch}!lws\+\_\+cgi\+\_\+args@{lws\+\_\+cgi\+\_\+args}}
+\subsubsection[{\texorpdfstring{ch}{ch}}]{\setlength{\rightskip}{0pt plus 5cm}enum lws\+\_\+enum\+\_\+stdinouterr lws\+\_\+cgi\+\_\+args\+::ch}\hypertarget{structlws__cgi__args_adeee220b29aeacc34632c38e50f0f5a5}{}\label{structlws__cgi__args_adeee220b29aeacc34632c38e50f0f5a5}
+channel index \index{lws\+\_\+cgi\+\_\+args@{lws\+\_\+cgi\+\_\+args}!data@{data}}
+\index{data@{data}!lws\+\_\+cgi\+\_\+args@{lws\+\_\+cgi\+\_\+args}}
+\subsubsection[{\texorpdfstring{data}{data}}]{\setlength{\rightskip}{0pt plus 5cm}unsigned char$\ast$ lws\+\_\+cgi\+\_\+args\+::data}\hypertarget{structlws__cgi__args_a8ac842084688c02f3f94694ef700d8f7}{}\label{structlws__cgi__args_a8ac842084688c02f3f94694ef700d8f7}
+for messages with payload \index{lws\+\_\+cgi\+\_\+args@{lws\+\_\+cgi\+\_\+args}!hdr\+\_\+state@{hdr\+\_\+state}}
+\index{hdr\+\_\+state@{hdr\+\_\+state}!lws\+\_\+cgi\+\_\+args@{lws\+\_\+cgi\+\_\+args}}
+\subsubsection[{\texorpdfstring{hdr\+\_\+state}{hdr\_state}}]{\setlength{\rightskip}{0pt plus 5cm}enum lws\+\_\+cgi\+\_\+hdr\+\_\+state lws\+\_\+cgi\+\_\+args\+::hdr\+\_\+state}\hypertarget{structlws__cgi__args_a741c11b9aa05997ec45a3400d7fb7739}{}\label{structlws__cgi__args_a741c11b9aa05997ec45a3400d7fb7739}
+track where we are in cgi headers \index{lws\+\_\+cgi\+\_\+args@{lws\+\_\+cgi\+\_\+args}!len@{len}}
+\index{len@{len}!lws\+\_\+cgi\+\_\+args@{lws\+\_\+cgi\+\_\+args}}
+\subsubsection[{\texorpdfstring{len}{len}}]{\setlength{\rightskip}{0pt plus 5cm}int lws\+\_\+cgi\+\_\+args\+::len}\hypertarget{structlws__cgi__args_a36e5c256433c187bd0eaa9c1ca667f1d}{}\label{structlws__cgi__args_a36e5c256433c187bd0eaa9c1ca667f1d}
+length \index{lws\+\_\+cgi\+\_\+args@{lws\+\_\+cgi\+\_\+args}!stdwsi@{stdwsi}}
+\index{stdwsi@{stdwsi}!lws\+\_\+cgi\+\_\+args@{lws\+\_\+cgi\+\_\+args}}
+\subsubsection[{\texorpdfstring{stdwsi}{stdwsi}}]{\setlength{\rightskip}{0pt plus 5cm}struct lws$\ast$$\ast$ lws\+\_\+cgi\+\_\+args\+::stdwsi}\hypertarget{structlws__cgi__args_a4ccc1058e7e914a26eef31ab2ad46aa1}{}\label{structlws__cgi__args_a4ccc1058e7e914a26eef31ab2ad46aa1}
+get fd with \hyperlink{group__callback-when-writeable_gaa709e02a10558753c851e58f1e2c16ba}{lws\+\_\+get\+\_\+socket\+\_\+fd()}
+
+The documentation for this struct was generated from the following file\+:\begin{DoxyCompactItemize}
+\item
+lib/\hyperlink{libwebsockets_8h}{libwebsockets.\+h}\end{DoxyCompactItemize}
--- /dev/null
+\hypertarget{structlws__client__connect__info}{}\section{lws\+\_\+client\+\_\+connect\+\_\+info Struct Reference}
+\label{structlws__client__connect__info}\index{lws\+\_\+client\+\_\+connect\+\_\+info@{lws\+\_\+client\+\_\+connect\+\_\+info}}
+
+
+{\ttfamily \#include $<$libwebsockets.\+h$>$}
+
+\subsection*{Data Fields}
+\begin{DoxyCompactItemize}
+\item
+struct lws\+\_\+context $\ast$ \hyperlink{structlws__client__connect__info_afe999d133cc240a0bfd02aade0514cfd}{context}
+\item
+const char $\ast$ \hyperlink{structlws__client__connect__info_aa364094f94ef1bcaaabbd9161971d502}{address}
+\item
+int \hyperlink{structlws__client__connect__info_a1af124d81c3c22a46d39387c5bc3d6b9}{port}
+\item
+int \hyperlink{structlws__client__connect__info_a9862297827639238a7a0b4054c3ddf3d}{ssl\+\_\+connection}
+\item
+const char $\ast$ \hyperlink{structlws__client__connect__info_a76a8388733f114fb8fd3643874781185}{path}
+\item
+const char $\ast$ \hyperlink{structlws__client__connect__info_a9b36d47c3422329df32c21040a35ebc7}{host}
+\item
+const char $\ast$ \hyperlink{structlws__client__connect__info_a8595f83e64147cb687b6418cf500dd4c}{origin}
+\item
+const char $\ast$ \hyperlink{structlws__client__connect__info_aba35adfb74845a5fd0c3dc141cbdddd2}{protocol}
+\item
+int \hyperlink{structlws__client__connect__info_a69abb5aeed755750b9755e5c91db6895}{ietf\+\_\+version\+\_\+or\+\_\+minus\+\_\+one}
+\item
+void $\ast$ \hyperlink{structlws__client__connect__info_a9831b9f9ab54a1aec4bb15324f1c3836}{userdata}
+\item
+const struct \hyperlink{structlws__extension}{lws\+\_\+extension} $\ast$ \hyperlink{structlws__client__connect__info_a7732b996e977393c3e1076be2a8ded6c}{client\+\_\+exts}
+\item
+const char $\ast$ \hyperlink{structlws__client__connect__info_aa9e8e3da4e783a0651b0dea62c2dd1db}{method}
+\item
+struct lws $\ast$ \hyperlink{structlws__client__connect__info_a6843a60e1050b10db9d98d7eeb45f587}{parent\+\_\+wsi}
+\item
+const char $\ast$ \hyperlink{structlws__client__connect__info_a03c305fdca809667b6a9a83b3edfd83a}{uri\+\_\+replace\+\_\+from}
+\item
+const char $\ast$ \hyperlink{structlws__client__connect__info_a9959ba103d3d2484e559a9f7879eebe3}{uri\+\_\+replace\+\_\+to}
+\item
+struct lws\+\_\+vhost $\ast$ \hyperlink{structlws__client__connect__info_a3893181d728f326f9f5b47c1459cb8be}{vhost}
+\item
+void $\ast$ \hyperlink{structlws__client__connect__info_ad47f50d1633dc5df74548606c9a66d73}{\+\_\+unused} \mbox{[}4\mbox{]}
+\end{DoxyCompactItemize}
+
+
+\subsection{Detailed Description}
+struct \hyperlink{structlws__client__connect__info}{lws\+\_\+client\+\_\+connect\+\_\+info} -\/ parameters to connect with when using \hyperlink{group__client_gac30a7be106abd0cedfbb2e8b8fe3a2f5}{lws\+\_\+client\+\_\+connect\+\_\+via\+\_\+info()}
+
+\subsection{Field Documentation}
+\index{lws\+\_\+client\+\_\+connect\+\_\+info@{lws\+\_\+client\+\_\+connect\+\_\+info}!\+\_\+unused@{\+\_\+unused}}
+\index{\+\_\+unused@{\+\_\+unused}!lws\+\_\+client\+\_\+connect\+\_\+info@{lws\+\_\+client\+\_\+connect\+\_\+info}}
+\subsubsection[{\texorpdfstring{\+\_\+unused}{\_unused}}]{\setlength{\rightskip}{0pt plus 5cm}void$\ast$ lws\+\_\+client\+\_\+connect\+\_\+info\+::\+\_\+unused\mbox{[}4\mbox{]}}\hypertarget{structlws__client__connect__info_ad47f50d1633dc5df74548606c9a66d73}{}\label{structlws__client__connect__info_ad47f50d1633dc5df74548606c9a66d73}
+dummy \index{lws\+\_\+client\+\_\+connect\+\_\+info@{lws\+\_\+client\+\_\+connect\+\_\+info}!address@{address}}
+\index{address@{address}!lws\+\_\+client\+\_\+connect\+\_\+info@{lws\+\_\+client\+\_\+connect\+\_\+info}}
+\subsubsection[{\texorpdfstring{address}{address}}]{\setlength{\rightskip}{0pt plus 5cm}const char$\ast$ lws\+\_\+client\+\_\+connect\+\_\+info\+::address}\hypertarget{structlws__client__connect__info_aa364094f94ef1bcaaabbd9161971d502}{}\label{structlws__client__connect__info_aa364094f94ef1bcaaabbd9161971d502}
+remote address to connect to \index{lws\+\_\+client\+\_\+connect\+\_\+info@{lws\+\_\+client\+\_\+connect\+\_\+info}!client\+\_\+exts@{client\+\_\+exts}}
+\index{client\+\_\+exts@{client\+\_\+exts}!lws\+\_\+client\+\_\+connect\+\_\+info@{lws\+\_\+client\+\_\+connect\+\_\+info}}
+\subsubsection[{\texorpdfstring{client\+\_\+exts}{client\_exts}}]{\setlength{\rightskip}{0pt plus 5cm}const struct {\bf lws\+\_\+extension}$\ast$ lws\+\_\+client\+\_\+connect\+\_\+info\+::client\+\_\+exts}\hypertarget{structlws__client__connect__info_a7732b996e977393c3e1076be2a8ded6c}{}\label{structlws__client__connect__info_a7732b996e977393c3e1076be2a8ded6c}
+array of extensions that may be used on connection \index{lws\+\_\+client\+\_\+connect\+\_\+info@{lws\+\_\+client\+\_\+connect\+\_\+info}!context@{context}}
+\index{context@{context}!lws\+\_\+client\+\_\+connect\+\_\+info@{lws\+\_\+client\+\_\+connect\+\_\+info}}
+\subsubsection[{\texorpdfstring{context}{context}}]{\setlength{\rightskip}{0pt plus 5cm}struct lws\+\_\+context$\ast$ lws\+\_\+client\+\_\+connect\+\_\+info\+::context}\hypertarget{structlws__client__connect__info_afe999d133cc240a0bfd02aade0514cfd}{}\label{structlws__client__connect__info_afe999d133cc240a0bfd02aade0514cfd}
+lws context to create connection in \index{lws\+\_\+client\+\_\+connect\+\_\+info@{lws\+\_\+client\+\_\+connect\+\_\+info}!host@{host}}
+\index{host@{host}!lws\+\_\+client\+\_\+connect\+\_\+info@{lws\+\_\+client\+\_\+connect\+\_\+info}}
+\subsubsection[{\texorpdfstring{host}{host}}]{\setlength{\rightskip}{0pt plus 5cm}const char$\ast$ lws\+\_\+client\+\_\+connect\+\_\+info\+::host}\hypertarget{structlws__client__connect__info_a9b36d47c3422329df32c21040a35ebc7}{}\label{structlws__client__connect__info_a9b36d47c3422329df32c21040a35ebc7}
+content of host header \index{lws\+\_\+client\+\_\+connect\+\_\+info@{lws\+\_\+client\+\_\+connect\+\_\+info}!ietf\+\_\+version\+\_\+or\+\_\+minus\+\_\+one@{ietf\+\_\+version\+\_\+or\+\_\+minus\+\_\+one}}
+\index{ietf\+\_\+version\+\_\+or\+\_\+minus\+\_\+one@{ietf\+\_\+version\+\_\+or\+\_\+minus\+\_\+one}!lws\+\_\+client\+\_\+connect\+\_\+info@{lws\+\_\+client\+\_\+connect\+\_\+info}}
+\subsubsection[{\texorpdfstring{ietf\+\_\+version\+\_\+or\+\_\+minus\+\_\+one}{ietf\_version\_or\_minus\_one}}]{\setlength{\rightskip}{0pt plus 5cm}int lws\+\_\+client\+\_\+connect\+\_\+info\+::ietf\+\_\+version\+\_\+or\+\_\+minus\+\_\+one}\hypertarget{structlws__client__connect__info_a69abb5aeed755750b9755e5c91db6895}{}\label{structlws__client__connect__info_a69abb5aeed755750b9755e5c91db6895}
+deprecated\+: currently leave at 0 or -\/1 \index{lws\+\_\+client\+\_\+connect\+\_\+info@{lws\+\_\+client\+\_\+connect\+\_\+info}!method@{method}}
+\index{method@{method}!lws\+\_\+client\+\_\+connect\+\_\+info@{lws\+\_\+client\+\_\+connect\+\_\+info}}
+\subsubsection[{\texorpdfstring{method}{method}}]{\setlength{\rightskip}{0pt plus 5cm}const char$\ast$ lws\+\_\+client\+\_\+connect\+\_\+info\+::method}\hypertarget{structlws__client__connect__info_aa9e8e3da4e783a0651b0dea62c2dd1db}{}\label{structlws__client__connect__info_aa9e8e3da4e783a0651b0dea62c2dd1db}
+if non-\/\+N\+U\+LL, do this http method instead of ws\mbox{[}s\mbox{]} upgrade. use \char`\"{}\+G\+E\+T\char`\"{} to be a simple http client connection \index{lws\+\_\+client\+\_\+connect\+\_\+info@{lws\+\_\+client\+\_\+connect\+\_\+info}!origin@{origin}}
+\index{origin@{origin}!lws\+\_\+client\+\_\+connect\+\_\+info@{lws\+\_\+client\+\_\+connect\+\_\+info}}
+\subsubsection[{\texorpdfstring{origin}{origin}}]{\setlength{\rightskip}{0pt plus 5cm}const char$\ast$ lws\+\_\+client\+\_\+connect\+\_\+info\+::origin}\hypertarget{structlws__client__connect__info_a8595f83e64147cb687b6418cf500dd4c}{}\label{structlws__client__connect__info_a8595f83e64147cb687b6418cf500dd4c}
+content of origin header \index{lws\+\_\+client\+\_\+connect\+\_\+info@{lws\+\_\+client\+\_\+connect\+\_\+info}!parent\+\_\+wsi@{parent\+\_\+wsi}}
+\index{parent\+\_\+wsi@{parent\+\_\+wsi}!lws\+\_\+client\+\_\+connect\+\_\+info@{lws\+\_\+client\+\_\+connect\+\_\+info}}
+\subsubsection[{\texorpdfstring{parent\+\_\+wsi}{parent\_wsi}}]{\setlength{\rightskip}{0pt plus 5cm}struct lws$\ast$ lws\+\_\+client\+\_\+connect\+\_\+info\+::parent\+\_\+wsi}\hypertarget{structlws__client__connect__info_a6843a60e1050b10db9d98d7eeb45f587}{}\label{structlws__client__connect__info_a6843a60e1050b10db9d98d7eeb45f587}
+if another wsi is responsible for this connection, give it here. this is used to make sure if the parent closes so do any child connections first. \index{lws\+\_\+client\+\_\+connect\+\_\+info@{lws\+\_\+client\+\_\+connect\+\_\+info}!path@{path}}
+\index{path@{path}!lws\+\_\+client\+\_\+connect\+\_\+info@{lws\+\_\+client\+\_\+connect\+\_\+info}}
+\subsubsection[{\texorpdfstring{path}{path}}]{\setlength{\rightskip}{0pt plus 5cm}const char$\ast$ lws\+\_\+client\+\_\+connect\+\_\+info\+::path}\hypertarget{structlws__client__connect__info_a76a8388733f114fb8fd3643874781185}{}\label{structlws__client__connect__info_a76a8388733f114fb8fd3643874781185}
+uri path \index{lws\+\_\+client\+\_\+connect\+\_\+info@{lws\+\_\+client\+\_\+connect\+\_\+info}!port@{port}}
+\index{port@{port}!lws\+\_\+client\+\_\+connect\+\_\+info@{lws\+\_\+client\+\_\+connect\+\_\+info}}
+\subsubsection[{\texorpdfstring{port}{port}}]{\setlength{\rightskip}{0pt plus 5cm}int lws\+\_\+client\+\_\+connect\+\_\+info\+::port}\hypertarget{structlws__client__connect__info_a1af124d81c3c22a46d39387c5bc3d6b9}{}\label{structlws__client__connect__info_a1af124d81c3c22a46d39387c5bc3d6b9}
+remote port to connect to \index{lws\+\_\+client\+\_\+connect\+\_\+info@{lws\+\_\+client\+\_\+connect\+\_\+info}!protocol@{protocol}}
+\index{protocol@{protocol}!lws\+\_\+client\+\_\+connect\+\_\+info@{lws\+\_\+client\+\_\+connect\+\_\+info}}
+\subsubsection[{\texorpdfstring{protocol}{protocol}}]{\setlength{\rightskip}{0pt plus 5cm}const char$\ast$ lws\+\_\+client\+\_\+connect\+\_\+info\+::protocol}\hypertarget{structlws__client__connect__info_aba35adfb74845a5fd0c3dc141cbdddd2}{}\label{structlws__client__connect__info_aba35adfb74845a5fd0c3dc141cbdddd2}
+list of ws protocols we could accept \index{lws\+\_\+client\+\_\+connect\+\_\+info@{lws\+\_\+client\+\_\+connect\+\_\+info}!ssl\+\_\+connection@{ssl\+\_\+connection}}
+\index{ssl\+\_\+connection@{ssl\+\_\+connection}!lws\+\_\+client\+\_\+connect\+\_\+info@{lws\+\_\+client\+\_\+connect\+\_\+info}}
+\subsubsection[{\texorpdfstring{ssl\+\_\+connection}{ssl\_connection}}]{\setlength{\rightskip}{0pt plus 5cm}int lws\+\_\+client\+\_\+connect\+\_\+info\+::ssl\+\_\+connection}\hypertarget{structlws__client__connect__info_a9862297827639238a7a0b4054c3ddf3d}{}\label{structlws__client__connect__info_a9862297827639238a7a0b4054c3ddf3d}
+nonzero for ssl \index{lws\+\_\+client\+\_\+connect\+\_\+info@{lws\+\_\+client\+\_\+connect\+\_\+info}!uri\+\_\+replace\+\_\+from@{uri\+\_\+replace\+\_\+from}}
+\index{uri\+\_\+replace\+\_\+from@{uri\+\_\+replace\+\_\+from}!lws\+\_\+client\+\_\+connect\+\_\+info@{lws\+\_\+client\+\_\+connect\+\_\+info}}
+\subsubsection[{\texorpdfstring{uri\+\_\+replace\+\_\+from}{uri\_replace\_from}}]{\setlength{\rightskip}{0pt plus 5cm}const char$\ast$ lws\+\_\+client\+\_\+connect\+\_\+info\+::uri\+\_\+replace\+\_\+from}\hypertarget{structlws__client__connect__info_a03c305fdca809667b6a9a83b3edfd83a}{}\label{structlws__client__connect__info_a03c305fdca809667b6a9a83b3edfd83a}
+if non-\/\+N\+U\+LL, when this string is found in U\+R\+Is in text/html content-\/encoding, it\textquotesingle{}s replaced with uri\+\_\+replace\+\_\+to \index{lws\+\_\+client\+\_\+connect\+\_\+info@{lws\+\_\+client\+\_\+connect\+\_\+info}!uri\+\_\+replace\+\_\+to@{uri\+\_\+replace\+\_\+to}}
+\index{uri\+\_\+replace\+\_\+to@{uri\+\_\+replace\+\_\+to}!lws\+\_\+client\+\_\+connect\+\_\+info@{lws\+\_\+client\+\_\+connect\+\_\+info}}
+\subsubsection[{\texorpdfstring{uri\+\_\+replace\+\_\+to}{uri\_replace\_to}}]{\setlength{\rightskip}{0pt plus 5cm}const char$\ast$ lws\+\_\+client\+\_\+connect\+\_\+info\+::uri\+\_\+replace\+\_\+to}\hypertarget{structlws__client__connect__info_a9959ba103d3d2484e559a9f7879eebe3}{}\label{structlws__client__connect__info_a9959ba103d3d2484e559a9f7879eebe3}
+see uri\+\_\+replace\+\_\+from \index{lws\+\_\+client\+\_\+connect\+\_\+info@{lws\+\_\+client\+\_\+connect\+\_\+info}!userdata@{userdata}}
+\index{userdata@{userdata}!lws\+\_\+client\+\_\+connect\+\_\+info@{lws\+\_\+client\+\_\+connect\+\_\+info}}
+\subsubsection[{\texorpdfstring{userdata}{userdata}}]{\setlength{\rightskip}{0pt plus 5cm}void$\ast$ lws\+\_\+client\+\_\+connect\+\_\+info\+::userdata}\hypertarget{structlws__client__connect__info_a9831b9f9ab54a1aec4bb15324f1c3836}{}\label{structlws__client__connect__info_a9831b9f9ab54a1aec4bb15324f1c3836}
+if non-\/\+N\+U\+LL, use this as wsi user\+\_\+data instead of malloc it \index{lws\+\_\+client\+\_\+connect\+\_\+info@{lws\+\_\+client\+\_\+connect\+\_\+info}!vhost@{vhost}}
+\index{vhost@{vhost}!lws\+\_\+client\+\_\+connect\+\_\+info@{lws\+\_\+client\+\_\+connect\+\_\+info}}
+\subsubsection[{\texorpdfstring{vhost}{vhost}}]{\setlength{\rightskip}{0pt plus 5cm}struct lws\+\_\+vhost$\ast$ lws\+\_\+client\+\_\+connect\+\_\+info\+::vhost}\hypertarget{structlws__client__connect__info_a3893181d728f326f9f5b47c1459cb8be}{}\label{structlws__client__connect__info_a3893181d728f326f9f5b47c1459cb8be}
+vhost to bind to (used to determine related S\+S\+L\+\_\+\+C\+TX)
+
+The documentation for this struct was generated from the following file\+:\begin{DoxyCompactItemize}
+\item
+lib/\hyperlink{libwebsockets_8h}{libwebsockets.\+h}\end{DoxyCompactItemize}
--- /dev/null
+\hypertarget{structlws__context__creation__info}{}\section{lws\+\_\+context\+\_\+creation\+\_\+info Struct Reference}
+\label{structlws__context__creation__info}\index{lws\+\_\+context\+\_\+creation\+\_\+info@{lws\+\_\+context\+\_\+creation\+\_\+info}}
+
+
+{\ttfamily \#include $<$libwebsockets.\+h$>$}
+
+\subsection*{Data Fields}
+\begin{DoxyCompactItemize}
+\item
+int \hyperlink{structlws__context__creation__info_a424a5ce268d6903e42243be94487ab85}{port}
+\item
+const char $\ast$ \hyperlink{structlws__context__creation__info_a75434932bb5df54665ea678eb8ac104a}{iface}
+\item
+const struct \hyperlink{structlws__protocols}{lws\+\_\+protocols} $\ast$ \hyperlink{structlws__context__creation__info_abb90ffb3e6d6db2db20f529d61bd9122}{protocols}
+\item
+const struct \hyperlink{structlws__extension}{lws\+\_\+extension} $\ast$ \hyperlink{structlws__context__creation__info_a4a3d1155fc52f5048b481884f6fb947c}{extensions}
+\item
+const struct \hyperlink{structlws__token__limits}{lws\+\_\+token\+\_\+limits} $\ast$ \hyperlink{structlws__context__creation__info_ac8a75b7b259a3c3a5fbb4219a3f06c29}{token\+\_\+limits}
+\item
+const char $\ast$ \hyperlink{structlws__context__creation__info_af3fb447be15c4fcb01d3285a6678ab54}{ssl\+\_\+private\+\_\+key\+\_\+password}
+\item
+const char $\ast$ \hyperlink{structlws__context__creation__info_ac62b0f0e8e402412ba5011d15c244103}{ssl\+\_\+cert\+\_\+filepath}
+\item
+const char $\ast$ \hyperlink{structlws__context__creation__info_ab9ec8893e0f7843cf5d783d2f350ef14}{ssl\+\_\+private\+\_\+key\+\_\+filepath}
+\item
+const char $\ast$ \hyperlink{structlws__context__creation__info_a4f8e65c3a059d3b586fafa9ef3282c29}{ssl\+\_\+ca\+\_\+filepath}
+\item
+const char $\ast$ \hyperlink{structlws__context__creation__info_a3e1516fd7fed26bfa77c0246ed26c2eb}{ssl\+\_\+cipher\+\_\+list}
+\item
+const char $\ast$ \hyperlink{structlws__context__creation__info_aef917c0b23976a264d2474901b4f5aa3}{http\+\_\+proxy\+\_\+address}
+\item
+unsigned int \hyperlink{structlws__context__creation__info_a7b59f2bdc869871e7bde232db94f5ca6}{http\+\_\+proxy\+\_\+port}
+\item
+int \hyperlink{structlws__context__creation__info_a9c9d22437de92c197f3cee52912b2c03}{gid}
+\item
+int \hyperlink{structlws__context__creation__info_ac105b4180008cb3e672d57beead8382e}{uid}
+\item
+unsigned int \hyperlink{structlws__context__creation__info_a9d3b17a25e1fbc772f21eb4959a82724}{options}
+\item
+void $\ast$ \hyperlink{structlws__context__creation__info_a0e9d94cdfb893d777b4a4db81e7b5ac0}{user}
+\item
+int \hyperlink{structlws__context__creation__info_ac583ce92b8e1c949cb6fef6bfe713d56}{ka\+\_\+time}
+\item
+int \hyperlink{structlws__context__creation__info_a3baab4285c679fbe027c2504621d7410}{ka\+\_\+probes}
+\item
+int \hyperlink{structlws__context__creation__info_a381342a398883d6204955ff3c1849ddd}{ka\+\_\+interval}
+\item
+\hyperlink{structlws__polarssl__context}{S\+S\+L\+\_\+\+C\+TX} $\ast$ \hyperlink{structlws__context__creation__info_a1654d41bea6fb2f619b57e6a264b26a4}{provided\+\_\+client\+\_\+ssl\+\_\+ctx}
+\item
+void $\ast$ \hyperlink{structlws__context__creation__info_a0e790dda6202604f73a03b6149bc12bb}{provided\+\_\+client\+\_\+ssl\+\_\+ctx}
+\item
+short \hyperlink{structlws__context__creation__info_a0cdfd3c484689ba6f0f2cc91b38ce948}{max\+\_\+http\+\_\+header\+\_\+data}
+\item
+short \hyperlink{structlws__context__creation__info_a0b154e79abc1167ba4ac3539f4af6720}{max\+\_\+http\+\_\+header\+\_\+pool}
+\item
+unsigned int \hyperlink{structlws__context__creation__info_ae52f3237e144e9ddcab5e2cf91d1e419}{count\+\_\+threads}
+\item
+unsigned int \hyperlink{structlws__context__creation__info_a45e63e24c88289e0c8352377ef4d3646}{fd\+\_\+limit\+\_\+per\+\_\+thread}
+\item
+unsigned int \hyperlink{structlws__context__creation__info_a6cfa3d51df2def3349a5cbf0d712822d}{timeout\+\_\+secs}
+\item
+const char $\ast$ \hyperlink{structlws__context__creation__info_afa5d4e7d9f86b58a1c6fac14f0a5f5f9}{ecdh\+\_\+curve}
+\item
+const char $\ast$ \hyperlink{structlws__context__creation__info_ad50db098a208f045f7811207d2bee4b9}{vhost\+\_\+name}
+\item
+const char $\ast$const $\ast$ \hyperlink{structlws__context__creation__info_a8122cfc0810bafe51edb3ba6bf9a1251}{plugin\+\_\+dirs}
+\item
+const struct \hyperlink{structlws__protocol__vhost__options}{lws\+\_\+protocol\+\_\+vhost\+\_\+options} $\ast$ \hyperlink{structlws__context__creation__info_a999866fcd15dbd621773436f97190458}{pvo}
+\item
+int \hyperlink{structlws__context__creation__info_a81697c6b763b5ef3ee52862bc70b07d6}{keepalive\+\_\+timeout}
+\item
+const char $\ast$ \hyperlink{structlws__context__creation__info_ad0e95ba721f7bd2b676719f8093c23a2}{log\+\_\+filepath}
+\item
+const struct \hyperlink{structlws__http__mount}{lws\+\_\+http\+\_\+mount} $\ast$ \hyperlink{structlws__context__creation__info_a13ffbb0d010309669611f8c4eda7d7f8}{mounts}
+\item
+const char $\ast$ \hyperlink{structlws__context__creation__info_a137a9b9de4f6a7993fed8746d551e616}{server\+\_\+string}
+\item
+unsigned int \hyperlink{structlws__context__creation__info_a57f88c0745adbd1d6b9b619b8de30209}{pt\+\_\+serv\+\_\+buf\+\_\+size}
+\item
+unsigned int \hyperlink{structlws__context__creation__info_aa8d9e85e137f35fb006f2e4a53f0887a}{max\+\_\+http\+\_\+header\+\_\+data2}
+\item
+long \hyperlink{structlws__context__creation__info_a704940261951ced6b5d8191bd8b9bb2d}{ssl\+\_\+options\+\_\+set}
+\item
+long \hyperlink{structlws__context__creation__info_adb0bc0b28cd7d90ab306723d8ffa96fa}{ssl\+\_\+options\+\_\+clear}
+\item
+void $\ast$ \hyperlink{structlws__context__creation__info_afce3b59950eca3203faa07381bbed5d7}{\+\_\+unused} \mbox{[}8\mbox{]}
+\end{DoxyCompactItemize}
+
+
+\subsection{Detailed Description}
+struct \hyperlink{structlws__context__creation__info}{lws\+\_\+context\+\_\+creation\+\_\+info} -\/ parameters to create context and /or vhost with
+
+This is also used to create vhosts.... if L\+W\+S\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+E\+X\+P\+L\+I\+C\+I\+T\+\_\+\+V\+H\+O\+S\+TS is not given, then for backwards compatibility one vhost is created at context-\/creation time using the info from this struct.
+
+If L\+W\+S\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+E\+X\+P\+L\+I\+C\+I\+T\+\_\+\+V\+H\+O\+S\+TS is given, then no vhosts are created at the same time as the context, they are expected to be created afterwards.
+
+\subsection{Field Documentation}
+\index{lws\+\_\+context\+\_\+creation\+\_\+info@{lws\+\_\+context\+\_\+creation\+\_\+info}!\+\_\+unused@{\+\_\+unused}}
+\index{\+\_\+unused@{\+\_\+unused}!lws\+\_\+context\+\_\+creation\+\_\+info@{lws\+\_\+context\+\_\+creation\+\_\+info}}
+\subsubsection[{\texorpdfstring{\+\_\+unused}{\_unused}}]{\setlength{\rightskip}{0pt plus 5cm}void$\ast$ lws\+\_\+context\+\_\+creation\+\_\+info\+::\+\_\+unused\mbox{[}8\mbox{]}}\hypertarget{structlws__context__creation__info_afce3b59950eca3203faa07381bbed5d7}{}\label{structlws__context__creation__info_afce3b59950eca3203faa07381bbed5d7}
+dummy \index{lws\+\_\+context\+\_\+creation\+\_\+info@{lws\+\_\+context\+\_\+creation\+\_\+info}!count\+\_\+threads@{count\+\_\+threads}}
+\index{count\+\_\+threads@{count\+\_\+threads}!lws\+\_\+context\+\_\+creation\+\_\+info@{lws\+\_\+context\+\_\+creation\+\_\+info}}
+\subsubsection[{\texorpdfstring{count\+\_\+threads}{count\_threads}}]{\setlength{\rightskip}{0pt plus 5cm}unsigned int lws\+\_\+context\+\_\+creation\+\_\+info\+::count\+\_\+threads}\hypertarget{structlws__context__creation__info_ae52f3237e144e9ddcab5e2cf91d1e419}{}\label{structlws__context__creation__info_ae52f3237e144e9ddcab5e2cf91d1e419}
+C\+O\+N\+T\+E\+XT\+: how many contexts to create in an array, 0 = 1 \index{lws\+\_\+context\+\_\+creation\+\_\+info@{lws\+\_\+context\+\_\+creation\+\_\+info}!ecdh\+\_\+curve@{ecdh\+\_\+curve}}
+\index{ecdh\+\_\+curve@{ecdh\+\_\+curve}!lws\+\_\+context\+\_\+creation\+\_\+info@{lws\+\_\+context\+\_\+creation\+\_\+info}}
+\subsubsection[{\texorpdfstring{ecdh\+\_\+curve}{ecdh\_curve}}]{\setlength{\rightskip}{0pt plus 5cm}const char$\ast$ lws\+\_\+context\+\_\+creation\+\_\+info\+::ecdh\+\_\+curve}\hypertarget{structlws__context__creation__info_afa5d4e7d9f86b58a1c6fac14f0a5f5f9}{}\label{structlws__context__creation__info_afa5d4e7d9f86b58a1c6fac14f0a5f5f9}
+V\+H\+O\+ST\+: if N\+U\+LL, defaults to initializing server with \char`\"{}prime256v1\char`\"{} \index{lws\+\_\+context\+\_\+creation\+\_\+info@{lws\+\_\+context\+\_\+creation\+\_\+info}!extensions@{extensions}}
+\index{extensions@{extensions}!lws\+\_\+context\+\_\+creation\+\_\+info@{lws\+\_\+context\+\_\+creation\+\_\+info}}
+\subsubsection[{\texorpdfstring{extensions}{extensions}}]{\setlength{\rightskip}{0pt plus 5cm}const struct {\bf lws\+\_\+extension}$\ast$ lws\+\_\+context\+\_\+creation\+\_\+info\+::extensions}\hypertarget{structlws__context__creation__info_a4a3d1155fc52f5048b481884f6fb947c}{}\label{structlws__context__creation__info_a4a3d1155fc52f5048b481884f6fb947c}
+V\+H\+O\+ST\+: N\+U\+LL or array of \hyperlink{structlws__extension}{lws\+\_\+extension} structs listing the extensions this context supports. \index{lws\+\_\+context\+\_\+creation\+\_\+info@{lws\+\_\+context\+\_\+creation\+\_\+info}!fd\+\_\+limit\+\_\+per\+\_\+thread@{fd\+\_\+limit\+\_\+per\+\_\+thread}}
+\index{fd\+\_\+limit\+\_\+per\+\_\+thread@{fd\+\_\+limit\+\_\+per\+\_\+thread}!lws\+\_\+context\+\_\+creation\+\_\+info@{lws\+\_\+context\+\_\+creation\+\_\+info}}
+\subsubsection[{\texorpdfstring{fd\+\_\+limit\+\_\+per\+\_\+thread}{fd\_limit\_per\_thread}}]{\setlength{\rightskip}{0pt plus 5cm}unsigned int lws\+\_\+context\+\_\+creation\+\_\+info\+::fd\+\_\+limit\+\_\+per\+\_\+thread}\hypertarget{structlws__context__creation__info_a45e63e24c88289e0c8352377ef4d3646}{}\label{structlws__context__creation__info_a45e63e24c88289e0c8352377ef4d3646}
+C\+O\+N\+T\+E\+XT\+: nonzero means restrict each service thread to this many fds, 0 means the default which is divide the process fd limit by the number of threads. \index{lws\+\_\+context\+\_\+creation\+\_\+info@{lws\+\_\+context\+\_\+creation\+\_\+info}!gid@{gid}}
+\index{gid@{gid}!lws\+\_\+context\+\_\+creation\+\_\+info@{lws\+\_\+context\+\_\+creation\+\_\+info}}
+\subsubsection[{\texorpdfstring{gid}{gid}}]{\setlength{\rightskip}{0pt plus 5cm}int lws\+\_\+context\+\_\+creation\+\_\+info\+::gid}\hypertarget{structlws__context__creation__info_a9c9d22437de92c197f3cee52912b2c03}{}\label{structlws__context__creation__info_a9c9d22437de92c197f3cee52912b2c03}
+C\+O\+N\+T\+E\+XT\+: group id to change to after setting listen socket, or -\/1. \index{lws\+\_\+context\+\_\+creation\+\_\+info@{lws\+\_\+context\+\_\+creation\+\_\+info}!http\+\_\+proxy\+\_\+address@{http\+\_\+proxy\+\_\+address}}
+\index{http\+\_\+proxy\+\_\+address@{http\+\_\+proxy\+\_\+address}!lws\+\_\+context\+\_\+creation\+\_\+info@{lws\+\_\+context\+\_\+creation\+\_\+info}}
+\subsubsection[{\texorpdfstring{http\+\_\+proxy\+\_\+address}{http\_proxy\_address}}]{\setlength{\rightskip}{0pt plus 5cm}const char$\ast$ lws\+\_\+context\+\_\+creation\+\_\+info\+::http\+\_\+proxy\+\_\+address}\hypertarget{structlws__context__creation__info_aef917c0b23976a264d2474901b4f5aa3}{}\label{structlws__context__creation__info_aef917c0b23976a264d2474901b4f5aa3}
+V\+H\+O\+ST\+: If non-\/\+N\+U\+LL, attempts to proxy via the given address. If proxy auth is required, use format \char`\"{}username\+:password\textbackslash{}@server\+:port\char`\"{} \index{lws\+\_\+context\+\_\+creation\+\_\+info@{lws\+\_\+context\+\_\+creation\+\_\+info}!http\+\_\+proxy\+\_\+port@{http\+\_\+proxy\+\_\+port}}
+\index{http\+\_\+proxy\+\_\+port@{http\+\_\+proxy\+\_\+port}!lws\+\_\+context\+\_\+creation\+\_\+info@{lws\+\_\+context\+\_\+creation\+\_\+info}}
+\subsubsection[{\texorpdfstring{http\+\_\+proxy\+\_\+port}{http\_proxy\_port}}]{\setlength{\rightskip}{0pt plus 5cm}unsigned int lws\+\_\+context\+\_\+creation\+\_\+info\+::http\+\_\+proxy\+\_\+port}\hypertarget{structlws__context__creation__info_a7b59f2bdc869871e7bde232db94f5ca6}{}\label{structlws__context__creation__info_a7b59f2bdc869871e7bde232db94f5ca6}
+V\+H\+O\+ST\+: If http\+\_\+proxy\+\_\+address was non-\/\+N\+U\+LL, uses this port \index{lws\+\_\+context\+\_\+creation\+\_\+info@{lws\+\_\+context\+\_\+creation\+\_\+info}!iface@{iface}}
+\index{iface@{iface}!lws\+\_\+context\+\_\+creation\+\_\+info@{lws\+\_\+context\+\_\+creation\+\_\+info}}
+\subsubsection[{\texorpdfstring{iface}{iface}}]{\setlength{\rightskip}{0pt plus 5cm}const char$\ast$ lws\+\_\+context\+\_\+creation\+\_\+info\+::iface}\hypertarget{structlws__context__creation__info_a75434932bb5df54665ea678eb8ac104a}{}\label{structlws__context__creation__info_a75434932bb5df54665ea678eb8ac104a}
+V\+H\+O\+ST\+: N\+U\+LL to bind the listen socket to all interfaces, or the interface name, eg, \char`\"{}eth2\char`\"{} If options specifies L\+W\+S\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+\+U\+N\+I\+X\+\_\+\+S\+O\+CK, this member is the pathname of a U\+N\+IX domain socket. you can use the U\+N\+IX domain sockets in abstract namespace, by prepending an at symbol to the socket name. \index{lws\+\_\+context\+\_\+creation\+\_\+info@{lws\+\_\+context\+\_\+creation\+\_\+info}!ka\+\_\+interval@{ka\+\_\+interval}}
+\index{ka\+\_\+interval@{ka\+\_\+interval}!lws\+\_\+context\+\_\+creation\+\_\+info@{lws\+\_\+context\+\_\+creation\+\_\+info}}
+\subsubsection[{\texorpdfstring{ka\+\_\+interval}{ka\_interval}}]{\setlength{\rightskip}{0pt plus 5cm}int lws\+\_\+context\+\_\+creation\+\_\+info\+::ka\+\_\+interval}\hypertarget{structlws__context__creation__info_a381342a398883d6204955ff3c1849ddd}{}\label{structlws__context__creation__info_a381342a398883d6204955ff3c1849ddd}
+C\+O\+N\+T\+E\+XT\+: if ka\+\_\+time was nonzero, how long to wait before each ka\+\_\+probes attempt \index{lws\+\_\+context\+\_\+creation\+\_\+info@{lws\+\_\+context\+\_\+creation\+\_\+info}!ka\+\_\+probes@{ka\+\_\+probes}}
+\index{ka\+\_\+probes@{ka\+\_\+probes}!lws\+\_\+context\+\_\+creation\+\_\+info@{lws\+\_\+context\+\_\+creation\+\_\+info}}
+\subsubsection[{\texorpdfstring{ka\+\_\+probes}{ka\_probes}}]{\setlength{\rightskip}{0pt plus 5cm}int lws\+\_\+context\+\_\+creation\+\_\+info\+::ka\+\_\+probes}\hypertarget{structlws__context__creation__info_a3baab4285c679fbe027c2504621d7410}{}\label{structlws__context__creation__info_a3baab4285c679fbe027c2504621d7410}
+C\+O\+N\+T\+E\+XT\+: if ka\+\_\+time was nonzero, after the timeout expires how many times to try to get a response from the peer before giving up and killing the connection \index{lws\+\_\+context\+\_\+creation\+\_\+info@{lws\+\_\+context\+\_\+creation\+\_\+info}!ka\+\_\+time@{ka\+\_\+time}}
+\index{ka\+\_\+time@{ka\+\_\+time}!lws\+\_\+context\+\_\+creation\+\_\+info@{lws\+\_\+context\+\_\+creation\+\_\+info}}
+\subsubsection[{\texorpdfstring{ka\+\_\+time}{ka\_time}}]{\setlength{\rightskip}{0pt plus 5cm}int lws\+\_\+context\+\_\+creation\+\_\+info\+::ka\+\_\+time}\hypertarget{structlws__context__creation__info_ac583ce92b8e1c949cb6fef6bfe713d56}{}\label{structlws__context__creation__info_ac583ce92b8e1c949cb6fef6bfe713d56}
+C\+O\+N\+T\+E\+XT\+: 0 for no T\+CP keepalive, otherwise apply this keepalive timeout to all libwebsocket sockets, client or server \index{lws\+\_\+context\+\_\+creation\+\_\+info@{lws\+\_\+context\+\_\+creation\+\_\+info}!keepalive\+\_\+timeout@{keepalive\+\_\+timeout}}
+\index{keepalive\+\_\+timeout@{keepalive\+\_\+timeout}!lws\+\_\+context\+\_\+creation\+\_\+info@{lws\+\_\+context\+\_\+creation\+\_\+info}}
+\subsubsection[{\texorpdfstring{keepalive\+\_\+timeout}{keepalive\_timeout}}]{\setlength{\rightskip}{0pt plus 5cm}int lws\+\_\+context\+\_\+creation\+\_\+info\+::keepalive\+\_\+timeout}\hypertarget{structlws__context__creation__info_a81697c6b763b5ef3ee52862bc70b07d6}{}\label{structlws__context__creation__info_a81697c6b763b5ef3ee52862bc70b07d6}
+V\+H\+O\+ST\+: (default = 0 = 60s) seconds to allow remote client to hold on to an idle H\+T\+T\+P/1.\+1 connection \index{lws\+\_\+context\+\_\+creation\+\_\+info@{lws\+\_\+context\+\_\+creation\+\_\+info}!log\+\_\+filepath@{log\+\_\+filepath}}
+\index{log\+\_\+filepath@{log\+\_\+filepath}!lws\+\_\+context\+\_\+creation\+\_\+info@{lws\+\_\+context\+\_\+creation\+\_\+info}}
+\subsubsection[{\texorpdfstring{log\+\_\+filepath}{log\_filepath}}]{\setlength{\rightskip}{0pt plus 5cm}const char$\ast$ lws\+\_\+context\+\_\+creation\+\_\+info\+::log\+\_\+filepath}\hypertarget{structlws__context__creation__info_ad0e95ba721f7bd2b676719f8093c23a2}{}\label{structlws__context__creation__info_ad0e95ba721f7bd2b676719f8093c23a2}
+V\+H\+O\+ST\+: filepath to append logs to... this is opened before any dropping of initial privileges \index{lws\+\_\+context\+\_\+creation\+\_\+info@{lws\+\_\+context\+\_\+creation\+\_\+info}!max\+\_\+http\+\_\+header\+\_\+data@{max\+\_\+http\+\_\+header\+\_\+data}}
+\index{max\+\_\+http\+\_\+header\+\_\+data@{max\+\_\+http\+\_\+header\+\_\+data}!lws\+\_\+context\+\_\+creation\+\_\+info@{lws\+\_\+context\+\_\+creation\+\_\+info}}
+\subsubsection[{\texorpdfstring{max\+\_\+http\+\_\+header\+\_\+data}{max\_http\_header\_data}}]{\setlength{\rightskip}{0pt plus 5cm}short lws\+\_\+context\+\_\+creation\+\_\+info\+::max\+\_\+http\+\_\+header\+\_\+data}\hypertarget{structlws__context__creation__info_a0cdfd3c484689ba6f0f2cc91b38ce948}{}\label{structlws__context__creation__info_a0cdfd3c484689ba6f0f2cc91b38ce948}
+C\+O\+N\+T\+E\+XT\+: The max amount of header payload that can be handled in an http request (unrecognized header payload is dropped) \index{lws\+\_\+context\+\_\+creation\+\_\+info@{lws\+\_\+context\+\_\+creation\+\_\+info}!max\+\_\+http\+\_\+header\+\_\+data2@{max\+\_\+http\+\_\+header\+\_\+data2}}
+\index{max\+\_\+http\+\_\+header\+\_\+data2@{max\+\_\+http\+\_\+header\+\_\+data2}!lws\+\_\+context\+\_\+creation\+\_\+info@{lws\+\_\+context\+\_\+creation\+\_\+info}}
+\subsubsection[{\texorpdfstring{max\+\_\+http\+\_\+header\+\_\+data2}{max\_http\_header\_data2}}]{\setlength{\rightskip}{0pt plus 5cm}unsigned int lws\+\_\+context\+\_\+creation\+\_\+info\+::max\+\_\+http\+\_\+header\+\_\+data2}\hypertarget{structlws__context__creation__info_aa8d9e85e137f35fb006f2e4a53f0887a}{}\label{structlws__context__creation__info_aa8d9e85e137f35fb006f2e4a53f0887a}
+C\+O\+N\+T\+E\+XT\+: if max\+\_\+http\+\_\+header\+\_\+data is 0 and this is nonzero, this will be used in place of the default. It\textquotesingle{}s like this for compatibility with the original short version, this is unsigned int length. \index{lws\+\_\+context\+\_\+creation\+\_\+info@{lws\+\_\+context\+\_\+creation\+\_\+info}!max\+\_\+http\+\_\+header\+\_\+pool@{max\+\_\+http\+\_\+header\+\_\+pool}}
+\index{max\+\_\+http\+\_\+header\+\_\+pool@{max\+\_\+http\+\_\+header\+\_\+pool}!lws\+\_\+context\+\_\+creation\+\_\+info@{lws\+\_\+context\+\_\+creation\+\_\+info}}
+\subsubsection[{\texorpdfstring{max\+\_\+http\+\_\+header\+\_\+pool}{max\_http\_header\_pool}}]{\setlength{\rightskip}{0pt plus 5cm}short lws\+\_\+context\+\_\+creation\+\_\+info\+::max\+\_\+http\+\_\+header\+\_\+pool}\hypertarget{structlws__context__creation__info_a0b154e79abc1167ba4ac3539f4af6720}{}\label{structlws__context__creation__info_a0b154e79abc1167ba4ac3539f4af6720}
+C\+O\+N\+T\+E\+XT\+: The max number of connections with http headers that can be processed simultaneously (the corresponding memory is allocated for the lifetime of the context). If the pool is busy new incoming connections must wait for accept until one becomes free. \index{lws\+\_\+context\+\_\+creation\+\_\+info@{lws\+\_\+context\+\_\+creation\+\_\+info}!mounts@{mounts}}
+\index{mounts@{mounts}!lws\+\_\+context\+\_\+creation\+\_\+info@{lws\+\_\+context\+\_\+creation\+\_\+info}}
+\subsubsection[{\texorpdfstring{mounts}{mounts}}]{\setlength{\rightskip}{0pt plus 5cm}const struct {\bf lws\+\_\+http\+\_\+mount}$\ast$ lws\+\_\+context\+\_\+creation\+\_\+info\+::mounts}\hypertarget{structlws__context__creation__info_a13ffbb0d010309669611f8c4eda7d7f8}{}\label{structlws__context__creation__info_a13ffbb0d010309669611f8c4eda7d7f8}
+V\+H\+O\+ST\+: optional linked list of mounts for this vhost \index{lws\+\_\+context\+\_\+creation\+\_\+info@{lws\+\_\+context\+\_\+creation\+\_\+info}!options@{options}}
+\index{options@{options}!lws\+\_\+context\+\_\+creation\+\_\+info@{lws\+\_\+context\+\_\+creation\+\_\+info}}
+\subsubsection[{\texorpdfstring{options}{options}}]{\setlength{\rightskip}{0pt plus 5cm}unsigned int lws\+\_\+context\+\_\+creation\+\_\+info\+::options}\hypertarget{structlws__context__creation__info_a9d3b17a25e1fbc772f21eb4959a82724}{}\label{structlws__context__creation__info_a9d3b17a25e1fbc772f21eb4959a82724}
+V\+H\+O\+ST + C\+O\+N\+T\+E\+XT\+: 0, or L\+W\+S\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+O\+P\+T\+I\+O\+N\+\_\+... bitfields \index{lws\+\_\+context\+\_\+creation\+\_\+info@{lws\+\_\+context\+\_\+creation\+\_\+info}!plugin\+\_\+dirs@{plugin\+\_\+dirs}}
+\index{plugin\+\_\+dirs@{plugin\+\_\+dirs}!lws\+\_\+context\+\_\+creation\+\_\+info@{lws\+\_\+context\+\_\+creation\+\_\+info}}
+\subsubsection[{\texorpdfstring{plugin\+\_\+dirs}{plugin\_dirs}}]{\setlength{\rightskip}{0pt plus 5cm}const char$\ast$ const$\ast$ lws\+\_\+context\+\_\+creation\+\_\+info\+::plugin\+\_\+dirs}\hypertarget{structlws__context__creation__info_a8122cfc0810bafe51edb3ba6bf9a1251}{}\label{structlws__context__creation__info_a8122cfc0810bafe51edb3ba6bf9a1251}
+C\+O\+N\+T\+E\+XT\+: N\+U\+LL, or N\+U\+L\+L-\/terminated array of directories to scan for lws protocol plugins at context creation time \index{lws\+\_\+context\+\_\+creation\+\_\+info@{lws\+\_\+context\+\_\+creation\+\_\+info}!port@{port}}
+\index{port@{port}!lws\+\_\+context\+\_\+creation\+\_\+info@{lws\+\_\+context\+\_\+creation\+\_\+info}}
+\subsubsection[{\texorpdfstring{port}{port}}]{\setlength{\rightskip}{0pt plus 5cm}int lws\+\_\+context\+\_\+creation\+\_\+info\+::port}\hypertarget{structlws__context__creation__info_a424a5ce268d6903e42243be94487ab85}{}\label{structlws__context__creation__info_a424a5ce268d6903e42243be94487ab85}
+V\+H\+O\+ST\+: Port to listen on... you can use C\+O\+N\+T\+E\+X\+T\+\_\+\+P\+O\+R\+T\+\_\+\+N\+O\+\_\+\+L\+I\+S\+T\+EN to suppress listening on any port, that\textquotesingle{}s what you want if you are not running a websocket server at all but just using it as a client \index{lws\+\_\+context\+\_\+creation\+\_\+info@{lws\+\_\+context\+\_\+creation\+\_\+info}!protocols@{protocols}}
+\index{protocols@{protocols}!lws\+\_\+context\+\_\+creation\+\_\+info@{lws\+\_\+context\+\_\+creation\+\_\+info}}
+\subsubsection[{\texorpdfstring{protocols}{protocols}}]{\setlength{\rightskip}{0pt plus 5cm}const struct {\bf lws\+\_\+protocols}$\ast$ lws\+\_\+context\+\_\+creation\+\_\+info\+::protocols}\hypertarget{structlws__context__creation__info_abb90ffb3e6d6db2db20f529d61bd9122}{}\label{structlws__context__creation__info_abb90ffb3e6d6db2db20f529d61bd9122}
+V\+H\+O\+ST\+: Array of structures listing supported protocols and a protocol-\/ specific callback for each one. The list is ended with an entry that has a N\+U\+LL callback pointer. \index{lws\+\_\+context\+\_\+creation\+\_\+info@{lws\+\_\+context\+\_\+creation\+\_\+info}!provided\+\_\+client\+\_\+ssl\+\_\+ctx@{provided\+\_\+client\+\_\+ssl\+\_\+ctx}}
+\index{provided\+\_\+client\+\_\+ssl\+\_\+ctx@{provided\+\_\+client\+\_\+ssl\+\_\+ctx}!lws\+\_\+context\+\_\+creation\+\_\+info@{lws\+\_\+context\+\_\+creation\+\_\+info}}
+\subsubsection[{\texorpdfstring{provided\+\_\+client\+\_\+ssl\+\_\+ctx}{provided\_client\_ssl\_ctx}}]{\setlength{\rightskip}{0pt plus 5cm}{\bf S\+S\+L\+\_\+\+C\+TX}$\ast$ lws\+\_\+context\+\_\+creation\+\_\+info\+::provided\+\_\+client\+\_\+ssl\+\_\+ctx}\hypertarget{structlws__context__creation__info_a1654d41bea6fb2f619b57e6a264b26a4}{}\label{structlws__context__creation__info_a1654d41bea6fb2f619b57e6a264b26a4}
+C\+O\+N\+T\+E\+XT\+: If non-\/null, swap out libwebsockets ssl implementation for the one provided by provided\+\_\+ssl\+\_\+ctx. Libwebsockets no longer is responsible for freeing the context if this option is selected. \index{lws\+\_\+context\+\_\+creation\+\_\+info@{lws\+\_\+context\+\_\+creation\+\_\+info}!provided\+\_\+client\+\_\+ssl\+\_\+ctx@{provided\+\_\+client\+\_\+ssl\+\_\+ctx}}
+\index{provided\+\_\+client\+\_\+ssl\+\_\+ctx@{provided\+\_\+client\+\_\+ssl\+\_\+ctx}!lws\+\_\+context\+\_\+creation\+\_\+info@{lws\+\_\+context\+\_\+creation\+\_\+info}}
+\subsubsection[{\texorpdfstring{provided\+\_\+client\+\_\+ssl\+\_\+ctx}{provided\_client\_ssl\_ctx}}]{\setlength{\rightskip}{0pt plus 5cm}void$\ast$ lws\+\_\+context\+\_\+creation\+\_\+info\+::provided\+\_\+client\+\_\+ssl\+\_\+ctx}\hypertarget{structlws__context__creation__info_a0e790dda6202604f73a03b6149bc12bb}{}\label{structlws__context__creation__info_a0e790dda6202604f73a03b6149bc12bb}
+dummy if ssl disabled \index{lws\+\_\+context\+\_\+creation\+\_\+info@{lws\+\_\+context\+\_\+creation\+\_\+info}!pt\+\_\+serv\+\_\+buf\+\_\+size@{pt\+\_\+serv\+\_\+buf\+\_\+size}}
+\index{pt\+\_\+serv\+\_\+buf\+\_\+size@{pt\+\_\+serv\+\_\+buf\+\_\+size}!lws\+\_\+context\+\_\+creation\+\_\+info@{lws\+\_\+context\+\_\+creation\+\_\+info}}
+\subsubsection[{\texorpdfstring{pt\+\_\+serv\+\_\+buf\+\_\+size}{pt\_serv\_buf\_size}}]{\setlength{\rightskip}{0pt plus 5cm}unsigned int lws\+\_\+context\+\_\+creation\+\_\+info\+::pt\+\_\+serv\+\_\+buf\+\_\+size}\hypertarget{structlws__context__creation__info_a57f88c0745adbd1d6b9b619b8de30209}{}\label{structlws__context__creation__info_a57f88c0745adbd1d6b9b619b8de30209}
+C\+O\+N\+T\+E\+XT\+: 0 = default of 4096. This buffer is used by various service related features including file serving, it defines the max chunk of file that can be sent at once. At the risk of lws having to buffer failed large sends, it can be increased to, eg, 128\+KiB to improve throughput. \index{lws\+\_\+context\+\_\+creation\+\_\+info@{lws\+\_\+context\+\_\+creation\+\_\+info}!pvo@{pvo}}
+\index{pvo@{pvo}!lws\+\_\+context\+\_\+creation\+\_\+info@{lws\+\_\+context\+\_\+creation\+\_\+info}}
+\subsubsection[{\texorpdfstring{pvo}{pvo}}]{\setlength{\rightskip}{0pt plus 5cm}const struct {\bf lws\+\_\+protocol\+\_\+vhost\+\_\+options}$\ast$ lws\+\_\+context\+\_\+creation\+\_\+info\+::pvo}\hypertarget{structlws__context__creation__info_a999866fcd15dbd621773436f97190458}{}\label{structlws__context__creation__info_a999866fcd15dbd621773436f97190458}
+V\+H\+O\+ST\+: pointer to optional linked list of per-\/vhost options made accessible to protocols \index{lws\+\_\+context\+\_\+creation\+\_\+info@{lws\+\_\+context\+\_\+creation\+\_\+info}!server\+\_\+string@{server\+\_\+string}}
+\index{server\+\_\+string@{server\+\_\+string}!lws\+\_\+context\+\_\+creation\+\_\+info@{lws\+\_\+context\+\_\+creation\+\_\+info}}
+\subsubsection[{\texorpdfstring{server\+\_\+string}{server\_string}}]{\setlength{\rightskip}{0pt plus 5cm}const char$\ast$ lws\+\_\+context\+\_\+creation\+\_\+info\+::server\+\_\+string}\hypertarget{structlws__context__creation__info_a137a9b9de4f6a7993fed8746d551e616}{}\label{structlws__context__creation__info_a137a9b9de4f6a7993fed8746d551e616}
+C\+O\+N\+T\+E\+XT\+: string used in H\+T\+TP headers to identify server software, if N\+U\+LL, \char`\"{}libwebsockets\char`\"{}. \index{lws\+\_\+context\+\_\+creation\+\_\+info@{lws\+\_\+context\+\_\+creation\+\_\+info}!ssl\+\_\+ca\+\_\+filepath@{ssl\+\_\+ca\+\_\+filepath}}
+\index{ssl\+\_\+ca\+\_\+filepath@{ssl\+\_\+ca\+\_\+filepath}!lws\+\_\+context\+\_\+creation\+\_\+info@{lws\+\_\+context\+\_\+creation\+\_\+info}}
+\subsubsection[{\texorpdfstring{ssl\+\_\+ca\+\_\+filepath}{ssl\_ca\_filepath}}]{\setlength{\rightskip}{0pt plus 5cm}const char$\ast$ lws\+\_\+context\+\_\+creation\+\_\+info\+::ssl\+\_\+ca\+\_\+filepath}\hypertarget{structlws__context__creation__info_a4f8e65c3a059d3b586fafa9ef3282c29}{}\label{structlws__context__creation__info_a4f8e65c3a059d3b586fafa9ef3282c29}
+V\+H\+O\+ST\+: CA certificate filepath or N\+U\+LL \index{lws\+\_\+context\+\_\+creation\+\_\+info@{lws\+\_\+context\+\_\+creation\+\_\+info}!ssl\+\_\+cert\+\_\+filepath@{ssl\+\_\+cert\+\_\+filepath}}
+\index{ssl\+\_\+cert\+\_\+filepath@{ssl\+\_\+cert\+\_\+filepath}!lws\+\_\+context\+\_\+creation\+\_\+info@{lws\+\_\+context\+\_\+creation\+\_\+info}}
+\subsubsection[{\texorpdfstring{ssl\+\_\+cert\+\_\+filepath}{ssl\_cert\_filepath}}]{\setlength{\rightskip}{0pt plus 5cm}const char$\ast$ lws\+\_\+context\+\_\+creation\+\_\+info\+::ssl\+\_\+cert\+\_\+filepath}\hypertarget{structlws__context__creation__info_ac62b0f0e8e402412ba5011d15c244103}{}\label{structlws__context__creation__info_ac62b0f0e8e402412ba5011d15c244103}
+V\+H\+O\+ST\+: If libwebsockets was compiled to use ssl, and you want to listen using S\+SL, set to the filepath to fetch the server cert from, otherwise N\+U\+LL for unencrypted \index{lws\+\_\+context\+\_\+creation\+\_\+info@{lws\+\_\+context\+\_\+creation\+\_\+info}!ssl\+\_\+cipher\+\_\+list@{ssl\+\_\+cipher\+\_\+list}}
+\index{ssl\+\_\+cipher\+\_\+list@{ssl\+\_\+cipher\+\_\+list}!lws\+\_\+context\+\_\+creation\+\_\+info@{lws\+\_\+context\+\_\+creation\+\_\+info}}
+\subsubsection[{\texorpdfstring{ssl\+\_\+cipher\+\_\+list}{ssl\_cipher\_list}}]{\setlength{\rightskip}{0pt plus 5cm}const char$\ast$ lws\+\_\+context\+\_\+creation\+\_\+info\+::ssl\+\_\+cipher\+\_\+list}\hypertarget{structlws__context__creation__info_a3e1516fd7fed26bfa77c0246ed26c2eb}{}\label{structlws__context__creation__info_a3e1516fd7fed26bfa77c0246ed26c2eb}
+V\+H\+O\+ST\+: List of valid ciphers to use (eg, \char`\"{}\+R\+C4-\/\+M\+D5\+:\+R\+C4-\/\+S\+H\+A\+:\+A\+E\+S128-\/\+S\+H\+A\+:\+A\+E\+S256-\/\+S\+H\+A\+:\+H\+I\+G\+H\+:!\+D\+S\+S\+:!a\+N\+U\+L\+L\char`\"{} or you can leave it as N\+U\+LL to get \char`\"{}\+D\+E\+F\+A\+U\+L\+T\char`\"{} \index{lws\+\_\+context\+\_\+creation\+\_\+info@{lws\+\_\+context\+\_\+creation\+\_\+info}!ssl\+\_\+options\+\_\+clear@{ssl\+\_\+options\+\_\+clear}}
+\index{ssl\+\_\+options\+\_\+clear@{ssl\+\_\+options\+\_\+clear}!lws\+\_\+context\+\_\+creation\+\_\+info@{lws\+\_\+context\+\_\+creation\+\_\+info}}
+\subsubsection[{\texorpdfstring{ssl\+\_\+options\+\_\+clear}{ssl\_options\_clear}}]{\setlength{\rightskip}{0pt plus 5cm}long lws\+\_\+context\+\_\+creation\+\_\+info\+::ssl\+\_\+options\+\_\+clear}\hypertarget{structlws__context__creation__info_adb0bc0b28cd7d90ab306723d8ffa96fa}{}\label{structlws__context__creation__info_adb0bc0b28cd7d90ab306723d8ffa96fa}
+V\+H\+O\+ST\+: Any bits set here will be cleared as S\+SL options \index{lws\+\_\+context\+\_\+creation\+\_\+info@{lws\+\_\+context\+\_\+creation\+\_\+info}!ssl\+\_\+options\+\_\+set@{ssl\+\_\+options\+\_\+set}}
+\index{ssl\+\_\+options\+\_\+set@{ssl\+\_\+options\+\_\+set}!lws\+\_\+context\+\_\+creation\+\_\+info@{lws\+\_\+context\+\_\+creation\+\_\+info}}
+\subsubsection[{\texorpdfstring{ssl\+\_\+options\+\_\+set}{ssl\_options\_set}}]{\setlength{\rightskip}{0pt plus 5cm}long lws\+\_\+context\+\_\+creation\+\_\+info\+::ssl\+\_\+options\+\_\+set}\hypertarget{structlws__context__creation__info_a704940261951ced6b5d8191bd8b9bb2d}{}\label{structlws__context__creation__info_a704940261951ced6b5d8191bd8b9bb2d}
+V\+H\+O\+ST\+: Any bits set here will be set as S\+SL options \index{lws\+\_\+context\+\_\+creation\+\_\+info@{lws\+\_\+context\+\_\+creation\+\_\+info}!ssl\+\_\+private\+\_\+key\+\_\+filepath@{ssl\+\_\+private\+\_\+key\+\_\+filepath}}
+\index{ssl\+\_\+private\+\_\+key\+\_\+filepath@{ssl\+\_\+private\+\_\+key\+\_\+filepath}!lws\+\_\+context\+\_\+creation\+\_\+info@{lws\+\_\+context\+\_\+creation\+\_\+info}}
+\subsubsection[{\texorpdfstring{ssl\+\_\+private\+\_\+key\+\_\+filepath}{ssl\_private\_key\_filepath}}]{\setlength{\rightskip}{0pt plus 5cm}const char$\ast$ lws\+\_\+context\+\_\+creation\+\_\+info\+::ssl\+\_\+private\+\_\+key\+\_\+filepath}\hypertarget{structlws__context__creation__info_ab9ec8893e0f7843cf5d783d2f350ef14}{}\label{structlws__context__creation__info_ab9ec8893e0f7843cf5d783d2f350ef14}
+V\+H\+O\+ST\+: filepath to private key if wanting S\+SL mode; if this is set to N\+U\+LL but sll\+\_\+cert\+\_\+filepath is set, the O\+P\+E\+N\+S\+S\+L\+\_\+\+C\+O\+N\+T\+E\+X\+T\+\_\+\+R\+E\+Q\+U\+I\+R\+E\+S\+\_\+\+P\+R\+I\+V\+A\+T\+E\+\_\+\+K\+EY callback is called to allow setting of the private key directly via open\+S\+SL library calls \index{lws\+\_\+context\+\_\+creation\+\_\+info@{lws\+\_\+context\+\_\+creation\+\_\+info}!ssl\+\_\+private\+\_\+key\+\_\+password@{ssl\+\_\+private\+\_\+key\+\_\+password}}
+\index{ssl\+\_\+private\+\_\+key\+\_\+password@{ssl\+\_\+private\+\_\+key\+\_\+password}!lws\+\_\+context\+\_\+creation\+\_\+info@{lws\+\_\+context\+\_\+creation\+\_\+info}}
+\subsubsection[{\texorpdfstring{ssl\+\_\+private\+\_\+key\+\_\+password}{ssl\_private\_key\_password}}]{\setlength{\rightskip}{0pt plus 5cm}const char$\ast$ lws\+\_\+context\+\_\+creation\+\_\+info\+::ssl\+\_\+private\+\_\+key\+\_\+password}\hypertarget{structlws__context__creation__info_af3fb447be15c4fcb01d3285a6678ab54}{}\label{structlws__context__creation__info_af3fb447be15c4fcb01d3285a6678ab54}
+V\+H\+O\+ST\+: N\+U\+LL or the passphrase needed for the private key \index{lws\+\_\+context\+\_\+creation\+\_\+info@{lws\+\_\+context\+\_\+creation\+\_\+info}!timeout\+\_\+secs@{timeout\+\_\+secs}}
+\index{timeout\+\_\+secs@{timeout\+\_\+secs}!lws\+\_\+context\+\_\+creation\+\_\+info@{lws\+\_\+context\+\_\+creation\+\_\+info}}
+\subsubsection[{\texorpdfstring{timeout\+\_\+secs}{timeout\_secs}}]{\setlength{\rightskip}{0pt plus 5cm}unsigned int lws\+\_\+context\+\_\+creation\+\_\+info\+::timeout\+\_\+secs}\hypertarget{structlws__context__creation__info_a6cfa3d51df2def3349a5cbf0d712822d}{}\label{structlws__context__creation__info_a6cfa3d51df2def3349a5cbf0d712822d}
+V\+H\+O\+ST\+: various processes involving network roundtrips in the library are protected from hanging forever by timeouts. If nonzero, this member lets you set the timeout used in seconds. Otherwise a default timeout is used. \index{lws\+\_\+context\+\_\+creation\+\_\+info@{lws\+\_\+context\+\_\+creation\+\_\+info}!token\+\_\+limits@{token\+\_\+limits}}
+\index{token\+\_\+limits@{token\+\_\+limits}!lws\+\_\+context\+\_\+creation\+\_\+info@{lws\+\_\+context\+\_\+creation\+\_\+info}}
+\subsubsection[{\texorpdfstring{token\+\_\+limits}{token\_limits}}]{\setlength{\rightskip}{0pt plus 5cm}const struct {\bf lws\+\_\+token\+\_\+limits}$\ast$ lws\+\_\+context\+\_\+creation\+\_\+info\+::token\+\_\+limits}\hypertarget{structlws__context__creation__info_ac8a75b7b259a3c3a5fbb4219a3f06c29}{}\label{structlws__context__creation__info_ac8a75b7b259a3c3a5fbb4219a3f06c29}
+C\+O\+N\+T\+E\+XT\+: N\+U\+LL or struct \hyperlink{structlws__token__limits}{lws\+\_\+token\+\_\+limits} pointer which is initialized with a token length limit for each possible W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+ \index{lws\+\_\+context\+\_\+creation\+\_\+info@{lws\+\_\+context\+\_\+creation\+\_\+info}!uid@{uid}}
+\index{uid@{uid}!lws\+\_\+context\+\_\+creation\+\_\+info@{lws\+\_\+context\+\_\+creation\+\_\+info}}
+\subsubsection[{\texorpdfstring{uid}{uid}}]{\setlength{\rightskip}{0pt plus 5cm}int lws\+\_\+context\+\_\+creation\+\_\+info\+::uid}\hypertarget{structlws__context__creation__info_ac105b4180008cb3e672d57beead8382e}{}\label{structlws__context__creation__info_ac105b4180008cb3e672d57beead8382e}
+C\+O\+N\+T\+E\+XT\+: user id to change to after setting listen socket, or -\/1. \index{lws\+\_\+context\+\_\+creation\+\_\+info@{lws\+\_\+context\+\_\+creation\+\_\+info}!user@{user}}
+\index{user@{user}!lws\+\_\+context\+\_\+creation\+\_\+info@{lws\+\_\+context\+\_\+creation\+\_\+info}}
+\subsubsection[{\texorpdfstring{user}{user}}]{\setlength{\rightskip}{0pt plus 5cm}void$\ast$ lws\+\_\+context\+\_\+creation\+\_\+info\+::user}\hypertarget{structlws__context__creation__info_a0e9d94cdfb893d777b4a4db81e7b5ac0}{}\label{structlws__context__creation__info_a0e9d94cdfb893d777b4a4db81e7b5ac0}
+C\+O\+N\+T\+E\+XT\+: optional user pointer that can be recovered via the context pointer using lws\+\_\+context\+\_\+user \index{lws\+\_\+context\+\_\+creation\+\_\+info@{lws\+\_\+context\+\_\+creation\+\_\+info}!vhost\+\_\+name@{vhost\+\_\+name}}
+\index{vhost\+\_\+name@{vhost\+\_\+name}!lws\+\_\+context\+\_\+creation\+\_\+info@{lws\+\_\+context\+\_\+creation\+\_\+info}}
+\subsubsection[{\texorpdfstring{vhost\+\_\+name}{vhost\_name}}]{\setlength{\rightskip}{0pt plus 5cm}const char$\ast$ lws\+\_\+context\+\_\+creation\+\_\+info\+::vhost\+\_\+name}\hypertarget{structlws__context__creation__info_ad50db098a208f045f7811207d2bee4b9}{}\label{structlws__context__creation__info_ad50db098a208f045f7811207d2bee4b9}
+V\+H\+O\+ST\+: name of vhost, must match external D\+NS name used to access the site, like \char`\"{}warmcat.\+com\char`\"{} as it\textquotesingle{}s used to match Host\+: header and / or S\+NI name for S\+SL.
+
+The documentation for this struct was generated from the following file\+:\begin{DoxyCompactItemize}
+\item
+lib/\hyperlink{libwebsockets_8h}{libwebsockets.\+h}\end{DoxyCompactItemize}
--- /dev/null
+\hypertarget{structlws__email}{}\section{lws\+\_\+email Struct Reference}
+\label{structlws__email}\index{lws\+\_\+email@{lws\+\_\+email}}
+
+
+{\ttfamily \#include $<$libwebsockets.\+h$>$}
+
+\subsection*{Data Fields}
+\begin{DoxyCompactItemize}
+\item
+void $\ast$ \hyperlink{structlws__email_add1341456045382c183f4c763bdea6bc}{data}
+\item
+uv\+\_\+loop\+\_\+t $\ast$ \hyperlink{structlws__email_ab5fbf121195a8e67509c78a42cfbe168}{loop}
+\item
+char \hyperlink{structlws__email_a472ae23fc9fca6599e5c512bc21458d2}{email\+\_\+smtp\+\_\+ip} \mbox{[}32\mbox{]}
+\item
+char \hyperlink{structlws__email_a939e5d7ee0339a16de73bde71ab4d4d9}{email\+\_\+helo} \mbox{[}32\mbox{]}
+\item
+char \hyperlink{structlws__email_af7f0ae934347d81071f63a963301f9e2}{email\+\_\+from} \mbox{[}100\mbox{]}
+\item
+char \hyperlink{structlws__email_a6453a8b92b3de6d2c2101af3edce685e}{email\+\_\+to} \mbox{[}100\mbox{]}
+\item
+unsigned int \hyperlink{structlws__email_a7bbc1964889c984b3da723c86a210e05}{max\+\_\+content\+\_\+size}
+\item
+int($\ast$ \hyperlink{structlws__email_ad8dc60353ee246d84dd59ec0591e9719}{on\+\_\+next} )(struct \hyperlink{structlws__email}{lws\+\_\+email} $\ast$email)
+\item
+int($\ast$ \hyperlink{structlws__email_a39ef6263d58eb40cca417c8697b227d8}{on\+\_\+sent} )(struct \hyperlink{structlws__email}{lws\+\_\+email} $\ast$email)
+\item
+int($\ast$ \hyperlink{structlws__email_a2aff78c8e04db243052aa91b4d87e987}{on\+\_\+get\+\_\+body} )(struct \hyperlink{structlws__email}{lws\+\_\+email} $\ast$email, char $\ast$buf, int len)
+\item
+uv\+\_\+timer\+\_\+t \hyperlink{structlws__email_a77723e2f2b940b1c879ef5e1cd88c2be}{timeout\+\_\+email}
+\item
+enum \hyperlink{group__smtp_ga116be79bf44f9dc2a97f46e051fe4dc0}{lwsgs\+\_\+smtp\+\_\+states} \hyperlink{structlws__email_ac6115d3cbef2e8bac62cc00895bf5fd3}{estate}
+\item
+uv\+\_\+connect\+\_\+t \hyperlink{structlws__email_a5f53d4c5a1e34b0dcaa8787e2eabb1b3}{email\+\_\+connect\+\_\+req}
+\item
+uv\+\_\+tcp\+\_\+t \hyperlink{structlws__email_a01f31934166dc6d01e8a375012f8ad1e}{email\+\_\+client}
+\item
+time\+\_\+t \hyperlink{structlws__email_a9747ca85597788c2d118d287df47b7c1}{email\+\_\+connect\+\_\+started}
+\item
+char \hyperlink{structlws__email_a8f34ec0643a817be67ef4276aeb7fb82}{email\+\_\+buf} \mbox{[}256\mbox{]}
+\item
+char $\ast$ \hyperlink{structlws__email_a6fff03c5a5d369a2aa3cab0c897b1bed}{content}
+\end{DoxyCompactItemize}
+
+
+\subsection{Detailed Description}
+struct \hyperlink{structlws__email}{lws\+\_\+email} -\/ abstract context for performing S\+M\+TP operations
+
+\subsection{Field Documentation}
+\index{lws\+\_\+email@{lws\+\_\+email}!content@{content}}
+\index{content@{content}!lws\+\_\+email@{lws\+\_\+email}}
+\subsubsection[{\texorpdfstring{content}{content}}]{\setlength{\rightskip}{0pt plus 5cm}char$\ast$ lws\+\_\+email\+::content}\hypertarget{structlws__email_a6fff03c5a5d369a2aa3cab0c897b1bed}{}\label{structlws__email_a6fff03c5a5d369a2aa3cab0c897b1bed}
+private \index{lws\+\_\+email@{lws\+\_\+email}!data@{data}}
+\index{data@{data}!lws\+\_\+email@{lws\+\_\+email}}
+\subsubsection[{\texorpdfstring{data}{data}}]{\setlength{\rightskip}{0pt plus 5cm}void$\ast$ lws\+\_\+email\+::data}\hypertarget{structlws__email_add1341456045382c183f4c763bdea6bc}{}\label{structlws__email_add1341456045382c183f4c763bdea6bc}
+opaque pointer set by user code and available to the callbacks \index{lws\+\_\+email@{lws\+\_\+email}!email\+\_\+buf@{email\+\_\+buf}}
+\index{email\+\_\+buf@{email\+\_\+buf}!lws\+\_\+email@{lws\+\_\+email}}
+\subsubsection[{\texorpdfstring{email\+\_\+buf}{email\_buf}}]{\setlength{\rightskip}{0pt plus 5cm}char lws\+\_\+email\+::email\+\_\+buf\mbox{[}256\mbox{]}}\hypertarget{structlws__email_a8f34ec0643a817be67ef4276aeb7fb82}{}\label{structlws__email_a8f34ec0643a817be67ef4276aeb7fb82}
+private \index{lws\+\_\+email@{lws\+\_\+email}!email\+\_\+client@{email\+\_\+client}}
+\index{email\+\_\+client@{email\+\_\+client}!lws\+\_\+email@{lws\+\_\+email}}
+\subsubsection[{\texorpdfstring{email\+\_\+client}{email\_client}}]{\setlength{\rightskip}{0pt plus 5cm}uv\+\_\+tcp\+\_\+t lws\+\_\+email\+::email\+\_\+client}\hypertarget{structlws__email_a01f31934166dc6d01e8a375012f8ad1e}{}\label{structlws__email_a01f31934166dc6d01e8a375012f8ad1e}
+private \index{lws\+\_\+email@{lws\+\_\+email}!email\+\_\+connect\+\_\+req@{email\+\_\+connect\+\_\+req}}
+\index{email\+\_\+connect\+\_\+req@{email\+\_\+connect\+\_\+req}!lws\+\_\+email@{lws\+\_\+email}}
+\subsubsection[{\texorpdfstring{email\+\_\+connect\+\_\+req}{email\_connect\_req}}]{\setlength{\rightskip}{0pt plus 5cm}uv\+\_\+connect\+\_\+t lws\+\_\+email\+::email\+\_\+connect\+\_\+req}\hypertarget{structlws__email_a5f53d4c5a1e34b0dcaa8787e2eabb1b3}{}\label{structlws__email_a5f53d4c5a1e34b0dcaa8787e2eabb1b3}
+private \index{lws\+\_\+email@{lws\+\_\+email}!email\+\_\+connect\+\_\+started@{email\+\_\+connect\+\_\+started}}
+\index{email\+\_\+connect\+\_\+started@{email\+\_\+connect\+\_\+started}!lws\+\_\+email@{lws\+\_\+email}}
+\subsubsection[{\texorpdfstring{email\+\_\+connect\+\_\+started}{email\_connect\_started}}]{\setlength{\rightskip}{0pt plus 5cm}time\+\_\+t lws\+\_\+email\+::email\+\_\+connect\+\_\+started}\hypertarget{structlws__email_a9747ca85597788c2d118d287df47b7c1}{}\label{structlws__email_a9747ca85597788c2d118d287df47b7c1}
+private \index{lws\+\_\+email@{lws\+\_\+email}!email\+\_\+from@{email\+\_\+from}}
+\index{email\+\_\+from@{email\+\_\+from}!lws\+\_\+email@{lws\+\_\+email}}
+\subsubsection[{\texorpdfstring{email\+\_\+from}{email\_from}}]{\setlength{\rightskip}{0pt plus 5cm}char lws\+\_\+email\+::email\+\_\+from\mbox{[}100\mbox{]}}\hypertarget{structlws__email_af7f0ae934347d81071f63a963301f9e2}{}\label{structlws__email_af7f0ae934347d81071f63a963301f9e2}
+Fill before init or on\+\_\+next \index{lws\+\_\+email@{lws\+\_\+email}!email\+\_\+helo@{email\+\_\+helo}}
+\index{email\+\_\+helo@{email\+\_\+helo}!lws\+\_\+email@{lws\+\_\+email}}
+\subsubsection[{\texorpdfstring{email\+\_\+helo}{email\_helo}}]{\setlength{\rightskip}{0pt plus 5cm}char lws\+\_\+email\+::email\+\_\+helo\mbox{[}32\mbox{]}}\hypertarget{structlws__email_a939e5d7ee0339a16de73bde71ab4d4d9}{}\label{structlws__email_a939e5d7ee0339a16de73bde71ab4d4d9}
+Fill before init, eg, \char`\"{}myserver.\+com\char`\"{} \index{lws\+\_\+email@{lws\+\_\+email}!email\+\_\+smtp\+\_\+ip@{email\+\_\+smtp\+\_\+ip}}
+\index{email\+\_\+smtp\+\_\+ip@{email\+\_\+smtp\+\_\+ip}!lws\+\_\+email@{lws\+\_\+email}}
+\subsubsection[{\texorpdfstring{email\+\_\+smtp\+\_\+ip}{email\_smtp\_ip}}]{\setlength{\rightskip}{0pt plus 5cm}char lws\+\_\+email\+::email\+\_\+smtp\+\_\+ip\mbox{[}32\mbox{]}}\hypertarget{structlws__email_a472ae23fc9fca6599e5c512bc21458d2}{}\label{structlws__email_a472ae23fc9fca6599e5c512bc21458d2}
+Fill before init, eg, \char`\"{}127.\+0.\+0.\+1\char`\"{} \index{lws\+\_\+email@{lws\+\_\+email}!email\+\_\+to@{email\+\_\+to}}
+\index{email\+\_\+to@{email\+\_\+to}!lws\+\_\+email@{lws\+\_\+email}}
+\subsubsection[{\texorpdfstring{email\+\_\+to}{email\_to}}]{\setlength{\rightskip}{0pt plus 5cm}char lws\+\_\+email\+::email\+\_\+to\mbox{[}100\mbox{]}}\hypertarget{structlws__email_a6453a8b92b3de6d2c2101af3edce685e}{}\label{structlws__email_a6453a8b92b3de6d2c2101af3edce685e}
+Fill before init or on\+\_\+next \index{lws\+\_\+email@{lws\+\_\+email}!estate@{estate}}
+\index{estate@{estate}!lws\+\_\+email@{lws\+\_\+email}}
+\subsubsection[{\texorpdfstring{estate}{estate}}]{\setlength{\rightskip}{0pt plus 5cm}enum {\bf lwsgs\+\_\+smtp\+\_\+states} lws\+\_\+email\+::estate}\hypertarget{structlws__email_ac6115d3cbef2e8bac62cc00895bf5fd3}{}\label{structlws__email_ac6115d3cbef2e8bac62cc00895bf5fd3}
+private \index{lws\+\_\+email@{lws\+\_\+email}!loop@{loop}}
+\index{loop@{loop}!lws\+\_\+email@{lws\+\_\+email}}
+\subsubsection[{\texorpdfstring{loop}{loop}}]{\setlength{\rightskip}{0pt plus 5cm}uv\+\_\+loop\+\_\+t$\ast$ lws\+\_\+email\+::loop}\hypertarget{structlws__email_ab5fbf121195a8e67509c78a42cfbe168}{}\label{structlws__email_ab5fbf121195a8e67509c78a42cfbe168}
+the libuv loop we will work on \index{lws\+\_\+email@{lws\+\_\+email}!max\+\_\+content\+\_\+size@{max\+\_\+content\+\_\+size}}
+\index{max\+\_\+content\+\_\+size@{max\+\_\+content\+\_\+size}!lws\+\_\+email@{lws\+\_\+email}}
+\subsubsection[{\texorpdfstring{max\+\_\+content\+\_\+size}{max\_content\_size}}]{\setlength{\rightskip}{0pt plus 5cm}unsigned int lws\+\_\+email\+::max\+\_\+content\+\_\+size}\hypertarget{structlws__email_a7bbc1964889c984b3da723c86a210e05}{}\label{structlws__email_a7bbc1964889c984b3da723c86a210e05}
+largest possible email body size \index{lws\+\_\+email@{lws\+\_\+email}!on\+\_\+get\+\_\+body@{on\+\_\+get\+\_\+body}}
+\index{on\+\_\+get\+\_\+body@{on\+\_\+get\+\_\+body}!lws\+\_\+email@{lws\+\_\+email}}
+\subsubsection[{\texorpdfstring{on\+\_\+get\+\_\+body}{on\_get\_body}}]{\setlength{\rightskip}{0pt plus 5cm}int($\ast$ lws\+\_\+email\+::on\+\_\+get\+\_\+body) (struct {\bf lws\+\_\+email} $\ast$email, char $\ast$buf, int len)}\hypertarget{structlws__email_a2aff78c8e04db243052aa91b4d87e987}{}\label{structlws__email_a2aff78c8e04db243052aa91b4d87e987}
+(Fill in before calling lws\+\_\+email\+\_\+init) called when the body part of the queued email is about to be sent to the S\+M\+TP server. \index{lws\+\_\+email@{lws\+\_\+email}!on\+\_\+next@{on\+\_\+next}}
+\index{on\+\_\+next@{on\+\_\+next}!lws\+\_\+email@{lws\+\_\+email}}
+\subsubsection[{\texorpdfstring{on\+\_\+next}{on\_next}}]{\setlength{\rightskip}{0pt plus 5cm}int($\ast$ lws\+\_\+email\+::on\+\_\+next) (struct {\bf lws\+\_\+email} $\ast$email)}\hypertarget{structlws__email_ad8dc60353ee246d84dd59ec0591e9719}{}\label{structlws__email_ad8dc60353ee246d84dd59ec0591e9719}
+(Fill in before calling lws\+\_\+email\+\_\+init) called when idle, 0 = another email to send, nonzero is idle. If you return 0, all of the email\+\_\+$\ast$ char arrays must be set to something useful. \index{lws\+\_\+email@{lws\+\_\+email}!on\+\_\+sent@{on\+\_\+sent}}
+\index{on\+\_\+sent@{on\+\_\+sent}!lws\+\_\+email@{lws\+\_\+email}}
+\subsubsection[{\texorpdfstring{on\+\_\+sent}{on\_sent}}]{\setlength{\rightskip}{0pt plus 5cm}int($\ast$ lws\+\_\+email\+::on\+\_\+sent) (struct {\bf lws\+\_\+email} $\ast$email)}\hypertarget{structlws__email_a39ef6263d58eb40cca417c8697b227d8}{}\label{structlws__email_a39ef6263d58eb40cca417c8697b227d8}
+(Fill in before calling lws\+\_\+email\+\_\+init) called when transfer of the email to the S\+M\+TP server was successful, your callback would remove the current email from its queue \index{lws\+\_\+email@{lws\+\_\+email}!timeout\+\_\+email@{timeout\+\_\+email}}
+\index{timeout\+\_\+email@{timeout\+\_\+email}!lws\+\_\+email@{lws\+\_\+email}}
+\subsubsection[{\texorpdfstring{timeout\+\_\+email}{timeout\_email}}]{\setlength{\rightskip}{0pt plus 5cm}uv\+\_\+timer\+\_\+t lws\+\_\+email\+::timeout\+\_\+email}\hypertarget{structlws__email_a77723e2f2b940b1c879ef5e1cd88c2be}{}\label{structlws__email_a77723e2f2b940b1c879ef5e1cd88c2be}
+private
+
+The documentation for this struct was generated from the following file\+:\begin{DoxyCompactItemize}
+\item
+lib/\hyperlink{libwebsockets_8h}{libwebsockets.\+h}\end{DoxyCompactItemize}
--- /dev/null
+\hypertarget{structlws__ext__option__arg}{}\section{lws\+\_\+ext\+\_\+option\+\_\+arg Struct Reference}
+\label{structlws__ext__option__arg}\index{lws\+\_\+ext\+\_\+option\+\_\+arg@{lws\+\_\+ext\+\_\+option\+\_\+arg}}
+
+
+{\ttfamily \#include $<$libwebsockets.\+h$>$}
+
+\subsection*{Data Fields}
+\begin{DoxyCompactItemize}
+\item
+const char $\ast$ \hyperlink{structlws__ext__option__arg_a0a320c56b79271b8f059eeaad9423ac9}{option\+\_\+name}
+\item
+int \hyperlink{structlws__ext__option__arg_af57fffcfa253dfa8d98681ac1fb1785f}{option\+\_\+index}
+\item
+const char $\ast$ \hyperlink{structlws__ext__option__arg_a0b1f7b30c3ceaf5f1bf9d105c24568d1}{start}
+\item
+int \hyperlink{structlws__ext__option__arg_af37f0b6caa7735af51a1ac12b68d5bc5}{len}
+\end{DoxyCompactItemize}
+
+
+\subsection{Detailed Description}
+struct \hyperlink{structlws__ext__option__arg}{lws\+\_\+ext\+\_\+option\+\_\+arg}
+
+\subsection{Field Documentation}
+\index{lws\+\_\+ext\+\_\+option\+\_\+arg@{lws\+\_\+ext\+\_\+option\+\_\+arg}!len@{len}}
+\index{len@{len}!lws\+\_\+ext\+\_\+option\+\_\+arg@{lws\+\_\+ext\+\_\+option\+\_\+arg}}
+\subsubsection[{\texorpdfstring{len}{len}}]{\setlength{\rightskip}{0pt plus 5cm}int lws\+\_\+ext\+\_\+option\+\_\+arg\+::len}\hypertarget{structlws__ext__option__arg_af37f0b6caa7735af51a1ac12b68d5bc5}{}\label{structlws__ext__option__arg_af37f0b6caa7735af51a1ac12b68d5bc5}
+length of value \index{lws\+\_\+ext\+\_\+option\+\_\+arg@{lws\+\_\+ext\+\_\+option\+\_\+arg}!option\+\_\+index@{option\+\_\+index}}
+\index{option\+\_\+index@{option\+\_\+index}!lws\+\_\+ext\+\_\+option\+\_\+arg@{lws\+\_\+ext\+\_\+option\+\_\+arg}}
+\subsubsection[{\texorpdfstring{option\+\_\+index}{option\_index}}]{\setlength{\rightskip}{0pt plus 5cm}int lws\+\_\+ext\+\_\+option\+\_\+arg\+::option\+\_\+index}\hypertarget{structlws__ext__option__arg_af57fffcfa253dfa8d98681ac1fb1785f}{}\label{structlws__ext__option__arg_af57fffcfa253dfa8d98681ac1fb1785f}
+argument ordinal to use if option\+\_\+name missing \index{lws\+\_\+ext\+\_\+option\+\_\+arg@{lws\+\_\+ext\+\_\+option\+\_\+arg}!option\+\_\+name@{option\+\_\+name}}
+\index{option\+\_\+name@{option\+\_\+name}!lws\+\_\+ext\+\_\+option\+\_\+arg@{lws\+\_\+ext\+\_\+option\+\_\+arg}}
+\subsubsection[{\texorpdfstring{option\+\_\+name}{option\_name}}]{\setlength{\rightskip}{0pt plus 5cm}const char$\ast$ lws\+\_\+ext\+\_\+option\+\_\+arg\+::option\+\_\+name}\hypertarget{structlws__ext__option__arg_a0a320c56b79271b8f059eeaad9423ac9}{}\label{structlws__ext__option__arg_a0a320c56b79271b8f059eeaad9423ac9}
+may be N\+U\+LL, option\+\_\+index used then \index{lws\+\_\+ext\+\_\+option\+\_\+arg@{lws\+\_\+ext\+\_\+option\+\_\+arg}!start@{start}}
+\index{start@{start}!lws\+\_\+ext\+\_\+option\+\_\+arg@{lws\+\_\+ext\+\_\+option\+\_\+arg}}
+\subsubsection[{\texorpdfstring{start}{start}}]{\setlength{\rightskip}{0pt plus 5cm}const char$\ast$ lws\+\_\+ext\+\_\+option\+\_\+arg\+::start}\hypertarget{structlws__ext__option__arg_a0b1f7b30c3ceaf5f1bf9d105c24568d1}{}\label{structlws__ext__option__arg_a0b1f7b30c3ceaf5f1bf9d105c24568d1}
+value
+
+The documentation for this struct was generated from the following file\+:\begin{DoxyCompactItemize}
+\item
+lib/\hyperlink{libwebsockets_8h}{libwebsockets.\+h}\end{DoxyCompactItemize}
--- /dev/null
+\hypertarget{structlws__ext__options}{}\section{lws\+\_\+ext\+\_\+options Struct Reference}
+\label{structlws__ext__options}\index{lws\+\_\+ext\+\_\+options@{lws\+\_\+ext\+\_\+options}}
+
+
+{\ttfamily \#include $<$libwebsockets.\+h$>$}
+
+\subsection*{Data Fields}
+\begin{DoxyCompactItemize}
+\item
+const char $\ast$ \hyperlink{structlws__ext__options_a1769e4a9805bbdda227821e9578ddc7e}{name}
+\item
+enum \hyperlink{group__extensions_gacc9f55936dc165257a2e1f7d47bce89e}{lws\+\_\+ext\+\_\+options\+\_\+types} \hyperlink{structlws__ext__options_a7c4dbd62dbeba63a9d50d2306bd1cc61}{type}
+\end{DoxyCompactItemize}
+
+
+\subsection{Detailed Description}
+struct \hyperlink{structlws__ext__options}{lws\+\_\+ext\+\_\+options} -\/ Option arguments to the extension. These are used in the negotiation at ws upgrade time. The helper function \hyperlink{group__extensions_ga6fb3e2c3dfb9d64dc87026a4e99c128b}{lws\+\_\+ext\+\_\+parse\+\_\+options()} uses these to generate callbacks
+
+\subsection{Field Documentation}
+\index{lws\+\_\+ext\+\_\+options@{lws\+\_\+ext\+\_\+options}!name@{name}}
+\index{name@{name}!lws\+\_\+ext\+\_\+options@{lws\+\_\+ext\+\_\+options}}
+\subsubsection[{\texorpdfstring{name}{name}}]{\setlength{\rightskip}{0pt plus 5cm}const char$\ast$ lws\+\_\+ext\+\_\+options\+::name}\hypertarget{structlws__ext__options_a1769e4a9805bbdda227821e9578ddc7e}{}\label{structlws__ext__options_a1769e4a9805bbdda227821e9578ddc7e}
+Option name, eg, \char`\"{}server\+\_\+no\+\_\+context\+\_\+takeover\char`\"{} \index{lws\+\_\+ext\+\_\+options@{lws\+\_\+ext\+\_\+options}!type@{type}}
+\index{type@{type}!lws\+\_\+ext\+\_\+options@{lws\+\_\+ext\+\_\+options}}
+\subsubsection[{\texorpdfstring{type}{type}}]{\setlength{\rightskip}{0pt plus 5cm}enum {\bf lws\+\_\+ext\+\_\+options\+\_\+types} lws\+\_\+ext\+\_\+options\+::type}\hypertarget{structlws__ext__options_a7c4dbd62dbeba63a9d50d2306bd1cc61}{}\label{structlws__ext__options_a7c4dbd62dbeba63a9d50d2306bd1cc61}
+What kind of args the option can take
+
+The documentation for this struct was generated from the following file\+:\begin{DoxyCompactItemize}
+\item
+lib/\hyperlink{libwebsockets_8h}{libwebsockets.\+h}\end{DoxyCompactItemize}
--- /dev/null
+\hypertarget{structlws__extension}{}\section{lws\+\_\+extension Struct Reference}
+\label{structlws__extension}\index{lws\+\_\+extension@{lws\+\_\+extension}}
+
+
+{\ttfamily \#include $<$libwebsockets.\+h$>$}
+
+\subsection*{Data Fields}
+\begin{DoxyCompactItemize}
+\item
+const char $\ast$ \hyperlink{structlws__extension_a1e5018c883d85176f5c2152176843f9e}{name}
+\item
+\hyperlink{group__extensions_gaae7169b2cd346b34fa33d0250db2afd0}{lws\+\_\+extension\+\_\+callback\+\_\+function} $\ast$ \hyperlink{structlws__extension_afa21f3b3c8c2c9212a276c52b680c3af}{callback}
+\item
+const char $\ast$ \hyperlink{structlws__extension_a36b06c213aedb02bf9a402651751855b}{client\+\_\+offer}
+\end{DoxyCompactItemize}
+
+
+\subsection{Detailed Description}
+struct \hyperlink{structlws__extension}{lws\+\_\+extension} -\/ An extension we support
+
+\subsection{Field Documentation}
+\index{lws\+\_\+extension@{lws\+\_\+extension}!callback@{callback}}
+\index{callback@{callback}!lws\+\_\+extension@{lws\+\_\+extension}}
+\subsubsection[{\texorpdfstring{callback}{callback}}]{\setlength{\rightskip}{0pt plus 5cm}{\bf lws\+\_\+extension\+\_\+callback\+\_\+function}$\ast$ lws\+\_\+extension\+::callback}\hypertarget{structlws__extension_afa21f3b3c8c2c9212a276c52b680c3af}{}\label{structlws__extension_afa21f3b3c8c2c9212a276c52b680c3af}
+Service callback \index{lws\+\_\+extension@{lws\+\_\+extension}!client\+\_\+offer@{client\+\_\+offer}}
+\index{client\+\_\+offer@{client\+\_\+offer}!lws\+\_\+extension@{lws\+\_\+extension}}
+\subsubsection[{\texorpdfstring{client\+\_\+offer}{client\_offer}}]{\setlength{\rightskip}{0pt plus 5cm}const char$\ast$ lws\+\_\+extension\+::client\+\_\+offer}\hypertarget{structlws__extension_a36b06c213aedb02bf9a402651751855b}{}\label{structlws__extension_a36b06c213aedb02bf9a402651751855b}
+String containing exts and options client offers \index{lws\+\_\+extension@{lws\+\_\+extension}!name@{name}}
+\index{name@{name}!lws\+\_\+extension@{lws\+\_\+extension}}
+\subsubsection[{\texorpdfstring{name}{name}}]{\setlength{\rightskip}{0pt plus 5cm}const char$\ast$ lws\+\_\+extension\+::name}\hypertarget{structlws__extension_a1e5018c883d85176f5c2152176843f9e}{}\label{structlws__extension_a1e5018c883d85176f5c2152176843f9e}
+Formal extension name, eg, \char`\"{}permessage-\/deflate\char`\"{}
+
+The documentation for this struct was generated from the following file\+:\begin{DoxyCompactItemize}
+\item
+lib/\hyperlink{libwebsockets_8h}{libwebsockets.\+h}\end{DoxyCompactItemize}
--- /dev/null
+\hypertarget{structlws__gs__event__args}{}\section{lws\+\_\+gs\+\_\+event\+\_\+args Struct Reference}
+\label{structlws__gs__event__args}\index{lws\+\_\+gs\+\_\+event\+\_\+args@{lws\+\_\+gs\+\_\+event\+\_\+args}}
+
+
+{\ttfamily \#include $<$libwebsockets.\+h$>$}
+
+\subsection*{Data Fields}
+\begin{DoxyCompactItemize}
+\item
+enum \hyperlink{group__generic-sessions_gaa93946b3d921072209d5cd8cdfa5332e}{lws\+\_\+gs\+\_\+event} \hyperlink{structlws__gs__event__args_a477274f8ca22ba7411b9285b9dc8dd06}{event}
+\item
+const char $\ast$ \hyperlink{structlws__gs__event__args_a2bec693d8a43730d487004a44326178b}{username}
+\item
+const char $\ast$ \hyperlink{structlws__gs__event__args_acd17e4f9f91f7f9a8f0fbf0744a3a463}{email}
+\end{DoxyCompactItemize}
+
+
+\subsection{Detailed Description}
+struct \hyperlink{structlws__gs__event__args}{lws\+\_\+gs\+\_\+event\+\_\+args}
+
+\subsection{Field Documentation}
+\index{lws\+\_\+gs\+\_\+event\+\_\+args@{lws\+\_\+gs\+\_\+event\+\_\+args}!email@{email}}
+\index{email@{email}!lws\+\_\+gs\+\_\+event\+\_\+args@{lws\+\_\+gs\+\_\+event\+\_\+args}}
+\subsubsection[{\texorpdfstring{email}{email}}]{\setlength{\rightskip}{0pt plus 5cm}const char$\ast$ lws\+\_\+gs\+\_\+event\+\_\+args\+::email}\hypertarget{structlws__gs__event__args_acd17e4f9f91f7f9a8f0fbf0744a3a463}{}\label{structlws__gs__event__args_acd17e4f9f91f7f9a8f0fbf0744a3a463}
+the email address of that user \index{lws\+\_\+gs\+\_\+event\+\_\+args@{lws\+\_\+gs\+\_\+event\+\_\+args}!event@{event}}
+\index{event@{event}!lws\+\_\+gs\+\_\+event\+\_\+args@{lws\+\_\+gs\+\_\+event\+\_\+args}}
+\subsubsection[{\texorpdfstring{event}{event}}]{\setlength{\rightskip}{0pt plus 5cm}enum {\bf lws\+\_\+gs\+\_\+event} lws\+\_\+gs\+\_\+event\+\_\+args\+::event}\hypertarget{structlws__gs__event__args_a477274f8ca22ba7411b9285b9dc8dd06}{}\label{structlws__gs__event__args_a477274f8ca22ba7411b9285b9dc8dd06}
+which event happened \index{lws\+\_\+gs\+\_\+event\+\_\+args@{lws\+\_\+gs\+\_\+event\+\_\+args}!username@{username}}
+\index{username@{username}!lws\+\_\+gs\+\_\+event\+\_\+args@{lws\+\_\+gs\+\_\+event\+\_\+args}}
+\subsubsection[{\texorpdfstring{username}{username}}]{\setlength{\rightskip}{0pt plus 5cm}const char$\ast$ lws\+\_\+gs\+\_\+event\+\_\+args\+::username}\hypertarget{structlws__gs__event__args_a2bec693d8a43730d487004a44326178b}{}\label{structlws__gs__event__args_a2bec693d8a43730d487004a44326178b}
+which username the event happened to
+
+The documentation for this struct was generated from the following file\+:\begin{DoxyCompactItemize}
+\item
+lib/\hyperlink{libwebsockets_8h}{libwebsockets.\+h}\end{DoxyCompactItemize}
--- /dev/null
+\hypertarget{structlws__http__mount}{}\section{lws\+\_\+http\+\_\+mount Struct Reference}
+\label{structlws__http__mount}\index{lws\+\_\+http\+\_\+mount@{lws\+\_\+http\+\_\+mount}}
+
+
+{\ttfamily \#include $<$libwebsockets.\+h$>$}
+
+\subsection*{Data Fields}
+\begin{DoxyCompactItemize}
+\item
+struct \hyperlink{structlws__http__mount}{lws\+\_\+http\+\_\+mount} $\ast$ \hyperlink{structlws__http__mount_ad878546ae1c399bbca7d7f8a0baf973d}{mount\+\_\+next}
+\item
+const char $\ast$ \hyperlink{structlws__http__mount_aa2391bfcada0b7a290b3c6651f64586c}{mountpoint}
+\item
+const char $\ast$ \hyperlink{structlws__http__mount_a21d86fd6043ec00e121ababbc29af39a}{origin}
+\item
+const char $\ast$ \hyperlink{structlws__http__mount_ae90d1efe7178199fad39de2926902ee4}{def}
+\item
+const char $\ast$ \hyperlink{structlws__http__mount_a05347d92c3d379809564bd4f3eab259b}{protocol}
+\item
+const struct \hyperlink{structlws__protocol__vhost__options}{lws\+\_\+protocol\+\_\+vhost\+\_\+options} $\ast$ \hyperlink{structlws__http__mount_ae7b5c0f4c5408061e6ea3a8d281f45af}{cgienv}
+\item
+const struct \hyperlink{structlws__protocol__vhost__options}{lws\+\_\+protocol\+\_\+vhost\+\_\+options} $\ast$ \hyperlink{structlws__http__mount_a4437423df85ee3dbcae0e15974c89ec7}{extra\+\_\+mimetypes}
+\item
+const struct \hyperlink{structlws__protocol__vhost__options}{lws\+\_\+protocol\+\_\+vhost\+\_\+options} $\ast$ \hyperlink{structlws__http__mount_a11ea62b952710d59733dbcf9794a5773}{interpret}
+\item
+int \hyperlink{structlws__http__mount_a4a7239d6d4c03986e6e1a72abb6c83aa}{cgi\+\_\+timeout}
+\item
+int \hyperlink{structlws__http__mount_a4283e30ea89d27ae7d061ad760d1d146}{cache\+\_\+max\+\_\+age}
+\item
+unsigned int \hyperlink{structlws__http__mount_a614364c770b0bd4db464ad65cddab477}{auth\+\_\+mask}
+\item
+unsigned int \hyperlink{structlws__http__mount_a8316dd183ffbef50419a5a4968d35d84}{cache\+\_\+reusable}\+:1
+\item
+unsigned int \hyperlink{structlws__http__mount_ae137203040c6153694bd88a708da5395}{cache\+\_\+revalidate}\+:1
+\item
+unsigned int \hyperlink{structlws__http__mount_aabec1a326780aafe11b977000983be0c}{cache\+\_\+intermediaries}\+:1
+\item
+unsigned char \hyperlink{structlws__http__mount_a6a9b1492a0b9749e39bd19932717a0b7}{origin\+\_\+protocol}
+\item
+unsigned char \hyperlink{structlws__http__mount_ac8489b60b8f969eb19c9abbdeac90743}{mountpoint\+\_\+len}
+\end{DoxyCompactItemize}
+
+
+\subsection{Detailed Description}
+struct \hyperlink{structlws__http__mount}{lws\+\_\+http\+\_\+mount}
+
+arguments for mounting something in a vhost\textquotesingle{}s url namespace
+
+\subsection{Field Documentation}
+\index{lws\+\_\+http\+\_\+mount@{lws\+\_\+http\+\_\+mount}!auth\+\_\+mask@{auth\+\_\+mask}}
+\index{auth\+\_\+mask@{auth\+\_\+mask}!lws\+\_\+http\+\_\+mount@{lws\+\_\+http\+\_\+mount}}
+\subsubsection[{\texorpdfstring{auth\+\_\+mask}{auth\_mask}}]{\setlength{\rightskip}{0pt plus 5cm}unsigned int lws\+\_\+http\+\_\+mount\+::auth\+\_\+mask}\hypertarget{structlws__http__mount_a614364c770b0bd4db464ad65cddab477}{}\label{structlws__http__mount_a614364c770b0bd4db464ad65cddab477}
+bits set here must be set for authorized client session \index{lws\+\_\+http\+\_\+mount@{lws\+\_\+http\+\_\+mount}!cache\+\_\+intermediaries@{cache\+\_\+intermediaries}}
+\index{cache\+\_\+intermediaries@{cache\+\_\+intermediaries}!lws\+\_\+http\+\_\+mount@{lws\+\_\+http\+\_\+mount}}
+\subsubsection[{\texorpdfstring{cache\+\_\+intermediaries}{cache\_intermediaries}}]{\setlength{\rightskip}{0pt plus 5cm}unsigned int lws\+\_\+http\+\_\+mount\+::cache\+\_\+intermediaries}\hypertarget{structlws__http__mount_aabec1a326780aafe11b977000983be0c}{}\label{structlws__http__mount_aabec1a326780aafe11b977000983be0c}
+set if intermediaries are allowed to cache \index{lws\+\_\+http\+\_\+mount@{lws\+\_\+http\+\_\+mount}!cache\+\_\+max\+\_\+age@{cache\+\_\+max\+\_\+age}}
+\index{cache\+\_\+max\+\_\+age@{cache\+\_\+max\+\_\+age}!lws\+\_\+http\+\_\+mount@{lws\+\_\+http\+\_\+mount}}
+\subsubsection[{\texorpdfstring{cache\+\_\+max\+\_\+age}{cache\_max\_age}}]{\setlength{\rightskip}{0pt plus 5cm}int lws\+\_\+http\+\_\+mount\+::cache\+\_\+max\+\_\+age}\hypertarget{structlws__http__mount_a4283e30ea89d27ae7d061ad760d1d146}{}\label{structlws__http__mount_a4283e30ea89d27ae7d061ad760d1d146}
+max-\/age for reuse of client cache of files, seconds \index{lws\+\_\+http\+\_\+mount@{lws\+\_\+http\+\_\+mount}!cache\+\_\+reusable@{cache\+\_\+reusable}}
+\index{cache\+\_\+reusable@{cache\+\_\+reusable}!lws\+\_\+http\+\_\+mount@{lws\+\_\+http\+\_\+mount}}
+\subsubsection[{\texorpdfstring{cache\+\_\+reusable}{cache\_reusable}}]{\setlength{\rightskip}{0pt plus 5cm}unsigned int lws\+\_\+http\+\_\+mount\+::cache\+\_\+reusable}\hypertarget{structlws__http__mount_a8316dd183ffbef50419a5a4968d35d84}{}\label{structlws__http__mount_a8316dd183ffbef50419a5a4968d35d84}
+set if client cache may reuse this \index{lws\+\_\+http\+\_\+mount@{lws\+\_\+http\+\_\+mount}!cache\+\_\+revalidate@{cache\+\_\+revalidate}}
+\index{cache\+\_\+revalidate@{cache\+\_\+revalidate}!lws\+\_\+http\+\_\+mount@{lws\+\_\+http\+\_\+mount}}
+\subsubsection[{\texorpdfstring{cache\+\_\+revalidate}{cache\_revalidate}}]{\setlength{\rightskip}{0pt plus 5cm}unsigned int lws\+\_\+http\+\_\+mount\+::cache\+\_\+revalidate}\hypertarget{structlws__http__mount_ae137203040c6153694bd88a708da5395}{}\label{structlws__http__mount_ae137203040c6153694bd88a708da5395}
+set if client cache should revalidate on use \index{lws\+\_\+http\+\_\+mount@{lws\+\_\+http\+\_\+mount}!cgi\+\_\+timeout@{cgi\+\_\+timeout}}
+\index{cgi\+\_\+timeout@{cgi\+\_\+timeout}!lws\+\_\+http\+\_\+mount@{lws\+\_\+http\+\_\+mount}}
+\subsubsection[{\texorpdfstring{cgi\+\_\+timeout}{cgi\_timeout}}]{\setlength{\rightskip}{0pt plus 5cm}int lws\+\_\+http\+\_\+mount\+::cgi\+\_\+timeout}\hypertarget{structlws__http__mount_a4a7239d6d4c03986e6e1a72abb6c83aa}{}\label{structlws__http__mount_a4a7239d6d4c03986e6e1a72abb6c83aa}
+seconds cgi is allowed to live, if cgi\+://mount type \index{lws\+\_\+http\+\_\+mount@{lws\+\_\+http\+\_\+mount}!cgienv@{cgienv}}
+\index{cgienv@{cgienv}!lws\+\_\+http\+\_\+mount@{lws\+\_\+http\+\_\+mount}}
+\subsubsection[{\texorpdfstring{cgienv}{cgienv}}]{\setlength{\rightskip}{0pt plus 5cm}const struct {\bf lws\+\_\+protocol\+\_\+vhost\+\_\+options}$\ast$ lws\+\_\+http\+\_\+mount\+::cgienv}\hypertarget{structlws__http__mount_ae7b5c0f4c5408061e6ea3a8d281f45af}{}\label{structlws__http__mount_ae7b5c0f4c5408061e6ea3a8d281f45af}
+optional linked-\/list of cgi options. These are created as environment variables for the cgi process \index{lws\+\_\+http\+\_\+mount@{lws\+\_\+http\+\_\+mount}!def@{def}}
+\index{def@{def}!lws\+\_\+http\+\_\+mount@{lws\+\_\+http\+\_\+mount}}
+\subsubsection[{\texorpdfstring{def}{def}}]{\setlength{\rightskip}{0pt plus 5cm}const char$\ast$ lws\+\_\+http\+\_\+mount\+::def}\hypertarget{structlws__http__mount_ae90d1efe7178199fad39de2926902ee4}{}\label{structlws__http__mount_ae90d1efe7178199fad39de2926902ee4}
+default target, eg, \char`\"{}index.\+html\char`\"{} \index{lws\+\_\+http\+\_\+mount@{lws\+\_\+http\+\_\+mount}!extra\+\_\+mimetypes@{extra\+\_\+mimetypes}}
+\index{extra\+\_\+mimetypes@{extra\+\_\+mimetypes}!lws\+\_\+http\+\_\+mount@{lws\+\_\+http\+\_\+mount}}
+\subsubsection[{\texorpdfstring{extra\+\_\+mimetypes}{extra\_mimetypes}}]{\setlength{\rightskip}{0pt plus 5cm}const struct {\bf lws\+\_\+protocol\+\_\+vhost\+\_\+options}$\ast$ lws\+\_\+http\+\_\+mount\+::extra\+\_\+mimetypes}\hypertarget{structlws__http__mount_a4437423df85ee3dbcae0e15974c89ec7}{}\label{structlws__http__mount_a4437423df85ee3dbcae0e15974c89ec7}
+optional linked-\/list of mimetype mappings \index{lws\+\_\+http\+\_\+mount@{lws\+\_\+http\+\_\+mount}!interpret@{interpret}}
+\index{interpret@{interpret}!lws\+\_\+http\+\_\+mount@{lws\+\_\+http\+\_\+mount}}
+\subsubsection[{\texorpdfstring{interpret}{interpret}}]{\setlength{\rightskip}{0pt plus 5cm}const struct {\bf lws\+\_\+protocol\+\_\+vhost\+\_\+options}$\ast$ lws\+\_\+http\+\_\+mount\+::interpret}\hypertarget{structlws__http__mount_a11ea62b952710d59733dbcf9794a5773}{}\label{structlws__http__mount_a11ea62b952710d59733dbcf9794a5773}
+optional linked-\/list of files to be interpreted \index{lws\+\_\+http\+\_\+mount@{lws\+\_\+http\+\_\+mount}!mount\+\_\+next@{mount\+\_\+next}}
+\index{mount\+\_\+next@{mount\+\_\+next}!lws\+\_\+http\+\_\+mount@{lws\+\_\+http\+\_\+mount}}
+\subsubsection[{\texorpdfstring{mount\+\_\+next}{mount\_next}}]{\setlength{\rightskip}{0pt plus 5cm}struct {\bf lws\+\_\+http\+\_\+mount}$\ast$ lws\+\_\+http\+\_\+mount\+::mount\+\_\+next}\hypertarget{structlws__http__mount_ad878546ae1c399bbca7d7f8a0baf973d}{}\label{structlws__http__mount_ad878546ae1c399bbca7d7f8a0baf973d}
+pointer to next struct \hyperlink{structlws__http__mount}{lws\+\_\+http\+\_\+mount} \index{lws\+\_\+http\+\_\+mount@{lws\+\_\+http\+\_\+mount}!mountpoint@{mountpoint}}
+\index{mountpoint@{mountpoint}!lws\+\_\+http\+\_\+mount@{lws\+\_\+http\+\_\+mount}}
+\subsubsection[{\texorpdfstring{mountpoint}{mountpoint}}]{\setlength{\rightskip}{0pt plus 5cm}const char$\ast$ lws\+\_\+http\+\_\+mount\+::mountpoint}\hypertarget{structlws__http__mount_aa2391bfcada0b7a290b3c6651f64586c}{}\label{structlws__http__mount_aa2391bfcada0b7a290b3c6651f64586c}
+mountpoint in http pathspace, eg, \char`\"{}/\char`\"{} \index{lws\+\_\+http\+\_\+mount@{lws\+\_\+http\+\_\+mount}!mountpoint\+\_\+len@{mountpoint\+\_\+len}}
+\index{mountpoint\+\_\+len@{mountpoint\+\_\+len}!lws\+\_\+http\+\_\+mount@{lws\+\_\+http\+\_\+mount}}
+\subsubsection[{\texorpdfstring{mountpoint\+\_\+len}{mountpoint\_len}}]{\setlength{\rightskip}{0pt plus 5cm}unsigned char lws\+\_\+http\+\_\+mount\+::mountpoint\+\_\+len}\hypertarget{structlws__http__mount_ac8489b60b8f969eb19c9abbdeac90743}{}\label{structlws__http__mount_ac8489b60b8f969eb19c9abbdeac90743}
+length of mountpoint string \index{lws\+\_\+http\+\_\+mount@{lws\+\_\+http\+\_\+mount}!origin@{origin}}
+\index{origin@{origin}!lws\+\_\+http\+\_\+mount@{lws\+\_\+http\+\_\+mount}}
+\subsubsection[{\texorpdfstring{origin}{origin}}]{\setlength{\rightskip}{0pt plus 5cm}const char$\ast$ lws\+\_\+http\+\_\+mount\+::origin}\hypertarget{structlws__http__mount_a21d86fd6043ec00e121ababbc29af39a}{}\label{structlws__http__mount_a21d86fd6043ec00e121ababbc29af39a}
+path to be mounted, eg, \char`\"{}/var/www/warmcat.\+com\char`\"{} \index{lws\+\_\+http\+\_\+mount@{lws\+\_\+http\+\_\+mount}!origin\+\_\+protocol@{origin\+\_\+protocol}}
+\index{origin\+\_\+protocol@{origin\+\_\+protocol}!lws\+\_\+http\+\_\+mount@{lws\+\_\+http\+\_\+mount}}
+\subsubsection[{\texorpdfstring{origin\+\_\+protocol}{origin\_protocol}}]{\setlength{\rightskip}{0pt plus 5cm}unsigned char lws\+\_\+http\+\_\+mount\+::origin\+\_\+protocol}\hypertarget{structlws__http__mount_a6a9b1492a0b9749e39bd19932717a0b7}{}\label{structlws__http__mount_a6a9b1492a0b9749e39bd19932717a0b7}
+one of enum lws\+\_\+mount\+\_\+protocols \index{lws\+\_\+http\+\_\+mount@{lws\+\_\+http\+\_\+mount}!protocol@{protocol}}
+\index{protocol@{protocol}!lws\+\_\+http\+\_\+mount@{lws\+\_\+http\+\_\+mount}}
+\subsubsection[{\texorpdfstring{protocol}{protocol}}]{\setlength{\rightskip}{0pt plus 5cm}const char$\ast$ lws\+\_\+http\+\_\+mount\+::protocol}\hypertarget{structlws__http__mount_a05347d92c3d379809564bd4f3eab259b}{}\label{structlws__http__mount_a05347d92c3d379809564bd4f3eab259b}
+\char`\"{}protocol-\/name\char`\"{} to handle mount
+
+The documentation for this struct was generated from the following file\+:\begin{DoxyCompactItemize}
+\item
+lib/\hyperlink{libwebsockets_8h}{libwebsockets.\+h}\end{DoxyCompactItemize}
--- /dev/null
+\hypertarget{structlws__plat__file__ops}{}\section{lws\+\_\+plat\+\_\+file\+\_\+ops Struct Reference}
+\label{structlws__plat__file__ops}\index{lws\+\_\+plat\+\_\+file\+\_\+ops@{lws\+\_\+plat\+\_\+file\+\_\+ops}}
+
+
+{\ttfamily \#include $<$libwebsockets.\+h$>$}
+
+\subsection*{Data Fields}
+\begin{DoxyCompactItemize}
+\item
+lws\+\_\+filefd\+\_\+type($\ast$ \hyperlink{structlws__plat__file__ops_ad37a97abc68d0af967cef874f4d8df32}{open} )(struct lws $\ast$wsi, const char $\ast$filename, unsigned long $\ast$filelen, int flags)
+\item
+int($\ast$ \hyperlink{structlws__plat__file__ops_a034ec96f2fbaf52b4aa3e82d20795f7b}{close} )(struct lws $\ast$wsi, lws\+\_\+filefd\+\_\+type fd)
+\item
+unsigned long($\ast$ \hyperlink{structlws__plat__file__ops_abfcda19b003dcc13c61ff9e2bb4ff869}{seek\+\_\+cur} )(struct lws $\ast$wsi, lws\+\_\+filefd\+\_\+type fd, long offset\+\_\+from\+\_\+cur\+\_\+pos)
+\item
+int($\ast$ \hyperlink{structlws__plat__file__ops_a01f483807a9862736b17ba9ed5110c40}{read} )(struct lws $\ast$wsi, lws\+\_\+filefd\+\_\+type fd, unsigned long $\ast$amount, unsigned char $\ast$buf, unsigned long len)
+\item
+int($\ast$ \hyperlink{structlws__plat__file__ops_a1fae8330ee94649a3551e31a30809793}{write} )(struct lws $\ast$wsi, lws\+\_\+filefd\+\_\+type fd, unsigned long $\ast$amount, unsigned char $\ast$buf, unsigned long len)
+\end{DoxyCompactItemize}
+
+
+\subsection{Detailed Description}
+struct \hyperlink{structlws__plat__file__ops}{lws\+\_\+plat\+\_\+file\+\_\+ops} -\/ Platform-\/specific file operations
+
+These provide platform-\/agnostic ways to deal with filesystem access in the library and in the user code.
+
+\subsection{Field Documentation}
+\index{lws\+\_\+plat\+\_\+file\+\_\+ops@{lws\+\_\+plat\+\_\+file\+\_\+ops}!close@{close}}
+\index{close@{close}!lws\+\_\+plat\+\_\+file\+\_\+ops@{lws\+\_\+plat\+\_\+file\+\_\+ops}}
+\subsubsection[{\texorpdfstring{close}{close}}]{\setlength{\rightskip}{0pt plus 5cm}int($\ast$ lws\+\_\+plat\+\_\+file\+\_\+ops\+::close) (struct lws $\ast$wsi, lws\+\_\+filefd\+\_\+type fd)}\hypertarget{structlws__plat__file__ops_a034ec96f2fbaf52b4aa3e82d20795f7b}{}\label{structlws__plat__file__ops_a034ec96f2fbaf52b4aa3e82d20795f7b}
+close file \index{lws\+\_\+plat\+\_\+file\+\_\+ops@{lws\+\_\+plat\+\_\+file\+\_\+ops}!open@{open}}
+\index{open@{open}!lws\+\_\+plat\+\_\+file\+\_\+ops@{lws\+\_\+plat\+\_\+file\+\_\+ops}}
+\subsubsection[{\texorpdfstring{open}{open}}]{\setlength{\rightskip}{0pt plus 5cm}lws\+\_\+filefd\+\_\+type($\ast$ lws\+\_\+plat\+\_\+file\+\_\+ops\+::open) (struct lws $\ast$wsi, const char $\ast$filename, unsigned long $\ast$filelen, int flags)}\hypertarget{structlws__plat__file__ops_ad37a97abc68d0af967cef874f4d8df32}{}\label{structlws__plat__file__ops_ad37a97abc68d0af967cef874f4d8df32}
+Open file (always binary access if plat supports it) filelen is filled on exit to be the length of the file flags should be set to O\+\_\+\+R\+D\+O\+N\+LY or O\+\_\+\+R\+D\+WR \index{lws\+\_\+plat\+\_\+file\+\_\+ops@{lws\+\_\+plat\+\_\+file\+\_\+ops}!read@{read}}
+\index{read@{read}!lws\+\_\+plat\+\_\+file\+\_\+ops@{lws\+\_\+plat\+\_\+file\+\_\+ops}}
+\subsubsection[{\texorpdfstring{read}{read}}]{\setlength{\rightskip}{0pt plus 5cm}int($\ast$ lws\+\_\+plat\+\_\+file\+\_\+ops\+::read) (struct lws $\ast$wsi, lws\+\_\+filefd\+\_\+type fd, unsigned long $\ast$amount, unsigned char $\ast$buf, unsigned long len)}\hypertarget{structlws__plat__file__ops_a01f483807a9862736b17ba9ed5110c40}{}\label{structlws__plat__file__ops_a01f483807a9862736b17ba9ed5110c40}
+Read from file, on exit $\ast$amount is set to amount actually read \index{lws\+\_\+plat\+\_\+file\+\_\+ops@{lws\+\_\+plat\+\_\+file\+\_\+ops}!seek\+\_\+cur@{seek\+\_\+cur}}
+\index{seek\+\_\+cur@{seek\+\_\+cur}!lws\+\_\+plat\+\_\+file\+\_\+ops@{lws\+\_\+plat\+\_\+file\+\_\+ops}}
+\subsubsection[{\texorpdfstring{seek\+\_\+cur}{seek\_cur}}]{\setlength{\rightskip}{0pt plus 5cm}unsigned long($\ast$ lws\+\_\+plat\+\_\+file\+\_\+ops\+::seek\+\_\+cur) (struct lws $\ast$wsi, lws\+\_\+filefd\+\_\+type fd, long offset\+\_\+from\+\_\+cur\+\_\+pos)}\hypertarget{structlws__plat__file__ops_abfcda19b003dcc13c61ff9e2bb4ff869}{}\label{structlws__plat__file__ops_abfcda19b003dcc13c61ff9e2bb4ff869}
+seek from current position \index{lws\+\_\+plat\+\_\+file\+\_\+ops@{lws\+\_\+plat\+\_\+file\+\_\+ops}!write@{write}}
+\index{write@{write}!lws\+\_\+plat\+\_\+file\+\_\+ops@{lws\+\_\+plat\+\_\+file\+\_\+ops}}
+\subsubsection[{\texorpdfstring{write}{write}}]{\setlength{\rightskip}{0pt plus 5cm}int($\ast$ lws\+\_\+plat\+\_\+file\+\_\+ops\+::write) (struct lws $\ast$wsi, lws\+\_\+filefd\+\_\+type fd, unsigned long $\ast$amount, unsigned char $\ast$buf, unsigned long len)}\hypertarget{structlws__plat__file__ops_a1fae8330ee94649a3551e31a30809793}{}\label{structlws__plat__file__ops_a1fae8330ee94649a3551e31a30809793}
+Write to file, on exit $\ast$amount is set to amount actually written
+
+The documentation for this struct was generated from the following file\+:\begin{DoxyCompactItemize}
+\item
+lib/\hyperlink{libwebsockets_8h}{libwebsockets.\+h}\end{DoxyCompactItemize}
--- /dev/null
+\hypertarget{structlws__plugin}{}\section{lws\+\_\+plugin Struct Reference}
+\label{structlws__plugin}\index{lws\+\_\+plugin@{lws\+\_\+plugin}}
+
+
+{\ttfamily \#include $<$libwebsockets.\+h$>$}
+
+\subsection*{Data Fields}
+\begin{DoxyCompactItemize}
+\item
+struct \hyperlink{structlws__plugin}{lws\+\_\+plugin} $\ast$ \hyperlink{structlws__plugin_a65dffd68fd267ce17b988790d1d35f22}{list}
+\item
+uv\+\_\+lib\+\_\+t \hyperlink{structlws__plugin_af9e1042dc1de5b9d202c2f5fd1834330}{lib}
+\item
+void $\ast$ \hyperlink{structlws__plugin_a4ef37a43653715b6c69cbf8a7be747f4}{l}
+\item
+char \hyperlink{structlws__plugin_af4ac8fcb79e10e0c2d960e1804d98105}{name} \mbox{[}64\mbox{]}
+\item
+struct \hyperlink{structlws__plugin__capability}{lws\+\_\+plugin\+\_\+capability} \hyperlink{structlws__plugin_ac7f1fdfe8cf8a21f8ee9720c21934a3f}{caps}
+\end{DoxyCompactItemize}
+
+
+\subsection{Detailed Description}
+struct \hyperlink{structlws__plugin}{lws\+\_\+plugin}
+
+\subsection{Field Documentation}
+\index{lws\+\_\+plugin@{lws\+\_\+plugin}!caps@{caps}}
+\index{caps@{caps}!lws\+\_\+plugin@{lws\+\_\+plugin}}
+\subsubsection[{\texorpdfstring{caps}{caps}}]{\setlength{\rightskip}{0pt plus 5cm}struct {\bf lws\+\_\+plugin\+\_\+capability} lws\+\_\+plugin\+::caps}\hypertarget{structlws__plugin_ac7f1fdfe8cf8a21f8ee9720c21934a3f}{}\label{structlws__plugin_ac7f1fdfe8cf8a21f8ee9720c21934a3f}
+plugin capabilities \index{lws\+\_\+plugin@{lws\+\_\+plugin}!l@{l}}
+\index{l@{l}!lws\+\_\+plugin@{lws\+\_\+plugin}}
+\subsubsection[{\texorpdfstring{l}{l}}]{\setlength{\rightskip}{0pt plus 5cm}void$\ast$ lws\+\_\+plugin\+::l}\hypertarget{structlws__plugin_a4ef37a43653715b6c69cbf8a7be747f4}{}\label{structlws__plugin_a4ef37a43653715b6c69cbf8a7be747f4}
+so we can compile on ancient libuv \index{lws\+\_\+plugin@{lws\+\_\+plugin}!lib@{lib}}
+\index{lib@{lib}!lws\+\_\+plugin@{lws\+\_\+plugin}}
+\subsubsection[{\texorpdfstring{lib}{lib}}]{\setlength{\rightskip}{0pt plus 5cm}uv\+\_\+lib\+\_\+t lws\+\_\+plugin\+::lib}\hypertarget{structlws__plugin_af9e1042dc1de5b9d202c2f5fd1834330}{}\label{structlws__plugin_af9e1042dc1de5b9d202c2f5fd1834330}
+shared library pointer \index{lws\+\_\+plugin@{lws\+\_\+plugin}!list@{list}}
+\index{list@{list}!lws\+\_\+plugin@{lws\+\_\+plugin}}
+\subsubsection[{\texorpdfstring{list}{list}}]{\setlength{\rightskip}{0pt plus 5cm}struct {\bf lws\+\_\+plugin}$\ast$ lws\+\_\+plugin\+::list}\hypertarget{structlws__plugin_a65dffd68fd267ce17b988790d1d35f22}{}\label{structlws__plugin_a65dffd68fd267ce17b988790d1d35f22}
+linked list \index{lws\+\_\+plugin@{lws\+\_\+plugin}!name@{name}}
+\index{name@{name}!lws\+\_\+plugin@{lws\+\_\+plugin}}
+\subsubsection[{\texorpdfstring{name}{name}}]{\setlength{\rightskip}{0pt plus 5cm}char lws\+\_\+plugin\+::name\mbox{[}64\mbox{]}}\hypertarget{structlws__plugin_af4ac8fcb79e10e0c2d960e1804d98105}{}\label{structlws__plugin_af4ac8fcb79e10e0c2d960e1804d98105}
+name of the plugin
+
+The documentation for this struct was generated from the following file\+:\begin{DoxyCompactItemize}
+\item
+lib/\hyperlink{libwebsockets_8h}{libwebsockets.\+h}\end{DoxyCompactItemize}
--- /dev/null
+\hypertarget{structlws__plugin__capability}{}\section{lws\+\_\+plugin\+\_\+capability Struct Reference}
+\label{structlws__plugin__capability}\index{lws\+\_\+plugin\+\_\+capability@{lws\+\_\+plugin\+\_\+capability}}
+
+
+{\ttfamily \#include $<$libwebsockets.\+h$>$}
+
+\subsection*{Data Fields}
+\begin{DoxyCompactItemize}
+\item
+unsigned int \hyperlink{structlws__plugin__capability_a523c7cde6f15bba345f56493dcf6b32a}{api\+\_\+magic}
+\item
+const struct \hyperlink{structlws__protocols}{lws\+\_\+protocols} $\ast$ \hyperlink{structlws__plugin__capability_a6a4d9d01e770f378ddadc77b37522033}{protocols}
+\item
+int \hyperlink{structlws__plugin__capability_ae38f7cf1246b9ca3af3cbf9d46b7090f}{count\+\_\+protocols}
+\item
+const struct \hyperlink{structlws__extension}{lws\+\_\+extension} $\ast$ \hyperlink{structlws__plugin__capability_a7936f0eb93d79dea76b903d0f8a5f623}{extensions}
+\item
+int \hyperlink{structlws__plugin__capability_abcf51db969522fdda9aaf902e65739d3}{count\+\_\+extensions}
+\end{DoxyCompactItemize}
+
+
+\subsection{Detailed Description}
+struct \hyperlink{structlws__plugin__capability}{lws\+\_\+plugin\+\_\+capability} -\/ how a plugin introduces itself to lws
+
+\subsection{Field Documentation}
+\index{lws\+\_\+plugin\+\_\+capability@{lws\+\_\+plugin\+\_\+capability}!api\+\_\+magic@{api\+\_\+magic}}
+\index{api\+\_\+magic@{api\+\_\+magic}!lws\+\_\+plugin\+\_\+capability@{lws\+\_\+plugin\+\_\+capability}}
+\subsubsection[{\texorpdfstring{api\+\_\+magic}{api\_magic}}]{\setlength{\rightskip}{0pt plus 5cm}unsigned int lws\+\_\+plugin\+\_\+capability\+::api\+\_\+magic}\hypertarget{structlws__plugin__capability_a523c7cde6f15bba345f56493dcf6b32a}{}\label{structlws__plugin__capability_a523c7cde6f15bba345f56493dcf6b32a}
+caller fills this in, plugin fills rest \index{lws\+\_\+plugin\+\_\+capability@{lws\+\_\+plugin\+\_\+capability}!count\+\_\+extensions@{count\+\_\+extensions}}
+\index{count\+\_\+extensions@{count\+\_\+extensions}!lws\+\_\+plugin\+\_\+capability@{lws\+\_\+plugin\+\_\+capability}}
+\subsubsection[{\texorpdfstring{count\+\_\+extensions}{count\_extensions}}]{\setlength{\rightskip}{0pt plus 5cm}int lws\+\_\+plugin\+\_\+capability\+::count\+\_\+extensions}\hypertarget{structlws__plugin__capability_abcf51db969522fdda9aaf902e65739d3}{}\label{structlws__plugin__capability_abcf51db969522fdda9aaf902e65739d3}
+how many extensions \index{lws\+\_\+plugin\+\_\+capability@{lws\+\_\+plugin\+\_\+capability}!count\+\_\+protocols@{count\+\_\+protocols}}
+\index{count\+\_\+protocols@{count\+\_\+protocols}!lws\+\_\+plugin\+\_\+capability@{lws\+\_\+plugin\+\_\+capability}}
+\subsubsection[{\texorpdfstring{count\+\_\+protocols}{count\_protocols}}]{\setlength{\rightskip}{0pt plus 5cm}int lws\+\_\+plugin\+\_\+capability\+::count\+\_\+protocols}\hypertarget{structlws__plugin__capability_ae38f7cf1246b9ca3af3cbf9d46b7090f}{}\label{structlws__plugin__capability_ae38f7cf1246b9ca3af3cbf9d46b7090f}
+how many protocols \index{lws\+\_\+plugin\+\_\+capability@{lws\+\_\+plugin\+\_\+capability}!extensions@{extensions}}
+\index{extensions@{extensions}!lws\+\_\+plugin\+\_\+capability@{lws\+\_\+plugin\+\_\+capability}}
+\subsubsection[{\texorpdfstring{extensions}{extensions}}]{\setlength{\rightskip}{0pt plus 5cm}const struct {\bf lws\+\_\+extension}$\ast$ lws\+\_\+plugin\+\_\+capability\+::extensions}\hypertarget{structlws__plugin__capability_a7936f0eb93d79dea76b903d0f8a5f623}{}\label{structlws__plugin__capability_a7936f0eb93d79dea76b903d0f8a5f623}
+array of extensions provided by plugin \index{lws\+\_\+plugin\+\_\+capability@{lws\+\_\+plugin\+\_\+capability}!protocols@{protocols}}
+\index{protocols@{protocols}!lws\+\_\+plugin\+\_\+capability@{lws\+\_\+plugin\+\_\+capability}}
+\subsubsection[{\texorpdfstring{protocols}{protocols}}]{\setlength{\rightskip}{0pt plus 5cm}const struct {\bf lws\+\_\+protocols}$\ast$ lws\+\_\+plugin\+\_\+capability\+::protocols}\hypertarget{structlws__plugin__capability_a6a4d9d01e770f378ddadc77b37522033}{}\label{structlws__plugin__capability_a6a4d9d01e770f378ddadc77b37522033}
+array of supported protocols provided by plugin
+
+The documentation for this struct was generated from the following file\+:\begin{DoxyCompactItemize}
+\item
+lib/\hyperlink{libwebsockets_8h}{libwebsockets.\+h}\end{DoxyCompactItemize}
--- /dev/null
+\hypertarget{structlws__polarssl__context}{}\section{lws\+\_\+polarssl\+\_\+context Struct Reference}
+\label{structlws__polarssl__context}\index{lws\+\_\+polarssl\+\_\+context@{lws\+\_\+polarssl\+\_\+context}}
+\subsection*{Data Fields}
+\begin{DoxyCompactItemize}
+\item
+x509\+\_\+crt \hyperlink{structlws__polarssl__context_a1872f2ea24878d807ae20ca8513674af}{ca}
+\item
+x509\+\_\+crt \hyperlink{structlws__polarssl__context_ae7e11c9129ff71c7ee71b3b2e320ff27}{certificate}
+\item
+rsa\+\_\+context \hyperlink{structlws__polarssl__context_a919c33af37aab170f828d954de1fa270}{key}
+\end{DoxyCompactItemize}
+
+
+\subsection{Field Documentation}
+\index{lws\+\_\+polarssl\+\_\+context@{lws\+\_\+polarssl\+\_\+context}!ca@{ca}}
+\index{ca@{ca}!lws\+\_\+polarssl\+\_\+context@{lws\+\_\+polarssl\+\_\+context}}
+\subsubsection[{\texorpdfstring{ca}{ca}}]{\setlength{\rightskip}{0pt plus 5cm}x509\+\_\+crt lws\+\_\+polarssl\+\_\+context\+::ca}\hypertarget{structlws__polarssl__context_a1872f2ea24878d807ae20ca8513674af}{}\label{structlws__polarssl__context_a1872f2ea24878d807ae20ca8513674af}
+ca \index{lws\+\_\+polarssl\+\_\+context@{lws\+\_\+polarssl\+\_\+context}!certificate@{certificate}}
+\index{certificate@{certificate}!lws\+\_\+polarssl\+\_\+context@{lws\+\_\+polarssl\+\_\+context}}
+\subsubsection[{\texorpdfstring{certificate}{certificate}}]{\setlength{\rightskip}{0pt plus 5cm}x509\+\_\+crt lws\+\_\+polarssl\+\_\+context\+::certificate}\hypertarget{structlws__polarssl__context_ae7e11c9129ff71c7ee71b3b2e320ff27}{}\label{structlws__polarssl__context_ae7e11c9129ff71c7ee71b3b2e320ff27}
+cert \index{lws\+\_\+polarssl\+\_\+context@{lws\+\_\+polarssl\+\_\+context}!key@{key}}
+\index{key@{key}!lws\+\_\+polarssl\+\_\+context@{lws\+\_\+polarssl\+\_\+context}}
+\subsubsection[{\texorpdfstring{key}{key}}]{\setlength{\rightskip}{0pt plus 5cm}rsa\+\_\+context lws\+\_\+polarssl\+\_\+context\+::key}\hypertarget{structlws__polarssl__context_a919c33af37aab170f828d954de1fa270}{}\label{structlws__polarssl__context_a919c33af37aab170f828d954de1fa270}
+key
+
+The documentation for this struct was generated from the following file\+:\begin{DoxyCompactItemize}
+\item
+lib/\hyperlink{libwebsockets_8h}{libwebsockets.\+h}\end{DoxyCompactItemize}
--- /dev/null
+\hypertarget{structlws__pollargs}{}\section{lws\+\_\+pollargs Struct Reference}
+\label{structlws__pollargs}\index{lws\+\_\+pollargs@{lws\+\_\+pollargs}}
+
+
+{\ttfamily \#include $<$libwebsockets.\+h$>$}
+
+\subsection*{Data Fields}
+\begin{DoxyCompactItemize}
+\item
+lws\+\_\+sockfd\+\_\+type \hyperlink{structlws__pollargs_af14a48ef4e78128aef9a76902b104a81}{fd}
+\item
+int \hyperlink{structlws__pollargs_a00bbffea9f55de342783e32d71ce1de6}{events}
+\item
+int \hyperlink{structlws__pollargs_a437fec0de5cf264371e1ab5a401e86d8}{prev\+\_\+events}
+\end{DoxyCompactItemize}
+
+
+\subsection{Detailed Description}
+struct \hyperlink{structlws__pollargs}{lws\+\_\+pollargs} -\/ argument structure for all external poll related calls passed in via \textquotesingle{}in\textquotesingle{}
+
+\subsection{Field Documentation}
+\index{lws\+\_\+pollargs@{lws\+\_\+pollargs}!events@{events}}
+\index{events@{events}!lws\+\_\+pollargs@{lws\+\_\+pollargs}}
+\subsubsection[{\texorpdfstring{events}{events}}]{\setlength{\rightskip}{0pt plus 5cm}int lws\+\_\+pollargs\+::events}\hypertarget{structlws__pollargs_a00bbffea9f55de342783e32d71ce1de6}{}\label{structlws__pollargs_a00bbffea9f55de342783e32d71ce1de6}
+the new event mask \index{lws\+\_\+pollargs@{lws\+\_\+pollargs}!fd@{fd}}
+\index{fd@{fd}!lws\+\_\+pollargs@{lws\+\_\+pollargs}}
+\subsubsection[{\texorpdfstring{fd}{fd}}]{\setlength{\rightskip}{0pt plus 5cm}lws\+\_\+sockfd\+\_\+type lws\+\_\+pollargs\+::fd}\hypertarget{structlws__pollargs_af14a48ef4e78128aef9a76902b104a81}{}\label{structlws__pollargs_af14a48ef4e78128aef9a76902b104a81}
+applicable socket descriptor \index{lws\+\_\+pollargs@{lws\+\_\+pollargs}!prev\+\_\+events@{prev\+\_\+events}}
+\index{prev\+\_\+events@{prev\+\_\+events}!lws\+\_\+pollargs@{lws\+\_\+pollargs}}
+\subsubsection[{\texorpdfstring{prev\+\_\+events}{prev\_events}}]{\setlength{\rightskip}{0pt plus 5cm}int lws\+\_\+pollargs\+::prev\+\_\+events}\hypertarget{structlws__pollargs_a437fec0de5cf264371e1ab5a401e86d8}{}\label{structlws__pollargs_a437fec0de5cf264371e1ab5a401e86d8}
+the previous event mask
+
+The documentation for this struct was generated from the following file\+:\begin{DoxyCompactItemize}
+\item
+lib/\hyperlink{libwebsockets_8h}{libwebsockets.\+h}\end{DoxyCompactItemize}
--- /dev/null
+\hypertarget{structlws__pollfd}{}\section{lws\+\_\+pollfd Struct Reference}
+\label{structlws__pollfd}\index{lws\+\_\+pollfd@{lws\+\_\+pollfd}}
+\subsection*{Data Fields}
+\begin{DoxyCompactItemize}
+\item
+lws\+\_\+sockfd\+\_\+type \hyperlink{structlws__pollfd_a714cf5ca90b41926117fdde9fa6542be}{fd}
+\item
+S\+H\+O\+RT \hyperlink{structlws__pollfd_ac393db6fc7fb6ed8fe7ca20936908ee9}{events}
+\item
+S\+H\+O\+RT \hyperlink{structlws__pollfd_ae7cecfe7511c59d4a3a44f876d030932}{revents}
+\end{DoxyCompactItemize}
+
+
+\subsection{Field Documentation}
+\index{lws\+\_\+pollfd@{lws\+\_\+pollfd}!events@{events}}
+\index{events@{events}!lws\+\_\+pollfd@{lws\+\_\+pollfd}}
+\subsubsection[{\texorpdfstring{events}{events}}]{\setlength{\rightskip}{0pt plus 5cm}S\+H\+O\+RT lws\+\_\+pollfd\+::events}\hypertarget{structlws__pollfd_ac393db6fc7fb6ed8fe7ca20936908ee9}{}\label{structlws__pollfd_ac393db6fc7fb6ed8fe7ca20936908ee9}
+which events to respond to \index{lws\+\_\+pollfd@{lws\+\_\+pollfd}!fd@{fd}}
+\index{fd@{fd}!lws\+\_\+pollfd@{lws\+\_\+pollfd}}
+\subsubsection[{\texorpdfstring{fd}{fd}}]{\setlength{\rightskip}{0pt plus 5cm}lws\+\_\+sockfd\+\_\+type lws\+\_\+pollfd\+::fd}\hypertarget{structlws__pollfd_a714cf5ca90b41926117fdde9fa6542be}{}\label{structlws__pollfd_a714cf5ca90b41926117fdde9fa6542be}
+file descriptor \index{lws\+\_\+pollfd@{lws\+\_\+pollfd}!revents@{revents}}
+\index{revents@{revents}!lws\+\_\+pollfd@{lws\+\_\+pollfd}}
+\subsubsection[{\texorpdfstring{revents}{revents}}]{\setlength{\rightskip}{0pt plus 5cm}S\+H\+O\+RT lws\+\_\+pollfd\+::revents}\hypertarget{structlws__pollfd_ae7cecfe7511c59d4a3a44f876d030932}{}\label{structlws__pollfd_ae7cecfe7511c59d4a3a44f876d030932}
+which events happened
+
+The documentation for this struct was generated from the following file\+:\begin{DoxyCompactItemize}
+\item
+lib/\hyperlink{libwebsockets_8h}{libwebsockets.\+h}\end{DoxyCompactItemize}
--- /dev/null
+\hypertarget{structlws__process__html__args}{}\section{lws\+\_\+process\+\_\+html\+\_\+args Struct Reference}
+\label{structlws__process__html__args}\index{lws\+\_\+process\+\_\+html\+\_\+args@{lws\+\_\+process\+\_\+html\+\_\+args}}
+\subsection*{Data Fields}
+\begin{DoxyCompactItemize}
+\item
+char $\ast$ \hyperlink{structlws__process__html__args_a11859d8bedd379fbf64543b25c65fe14}{p}
+\item
+int \hyperlink{structlws__process__html__args_a754513f2311241cabb0cd1c90d7307ef}{len}
+\item
+int \hyperlink{structlws__process__html__args_a8be7fd396a1942ea2449a2fda990ff99}{max\+\_\+len}
+\item
+int \hyperlink{structlws__process__html__args_a362547891ee0d693f3900a1f807ea475}{final}
+\end{DoxyCompactItemize}
+
+
+\subsection{Field Documentation}
+\index{lws\+\_\+process\+\_\+html\+\_\+args@{lws\+\_\+process\+\_\+html\+\_\+args}!final@{final}}
+\index{final@{final}!lws\+\_\+process\+\_\+html\+\_\+args@{lws\+\_\+process\+\_\+html\+\_\+args}}
+\subsubsection[{\texorpdfstring{final}{final}}]{\setlength{\rightskip}{0pt plus 5cm}int lws\+\_\+process\+\_\+html\+\_\+args\+::final}\hypertarget{structlws__process__html__args_a362547891ee0d693f3900a1f807ea475}{}\label{structlws__process__html__args_a362547891ee0d693f3900a1f807ea475}
+set if this is the last chunk of the file \index{lws\+\_\+process\+\_\+html\+\_\+args@{lws\+\_\+process\+\_\+html\+\_\+args}!len@{len}}
+\index{len@{len}!lws\+\_\+process\+\_\+html\+\_\+args@{lws\+\_\+process\+\_\+html\+\_\+args}}
+\subsubsection[{\texorpdfstring{len}{len}}]{\setlength{\rightskip}{0pt plus 5cm}int lws\+\_\+process\+\_\+html\+\_\+args\+::len}\hypertarget{structlws__process__html__args_a754513f2311241cabb0cd1c90d7307ef}{}\label{structlws__process__html__args_a754513f2311241cabb0cd1c90d7307ef}
+length of the original data at p \index{lws\+\_\+process\+\_\+html\+\_\+args@{lws\+\_\+process\+\_\+html\+\_\+args}!max\+\_\+len@{max\+\_\+len}}
+\index{max\+\_\+len@{max\+\_\+len}!lws\+\_\+process\+\_\+html\+\_\+args@{lws\+\_\+process\+\_\+html\+\_\+args}}
+\subsubsection[{\texorpdfstring{max\+\_\+len}{max\_len}}]{\setlength{\rightskip}{0pt plus 5cm}int lws\+\_\+process\+\_\+html\+\_\+args\+::max\+\_\+len}\hypertarget{structlws__process__html__args_a8be7fd396a1942ea2449a2fda990ff99}{}\label{structlws__process__html__args_a8be7fd396a1942ea2449a2fda990ff99}
+maximum length we can grow the data to \index{lws\+\_\+process\+\_\+html\+\_\+args@{lws\+\_\+process\+\_\+html\+\_\+args}!p@{p}}
+\index{p@{p}!lws\+\_\+process\+\_\+html\+\_\+args@{lws\+\_\+process\+\_\+html\+\_\+args}}
+\subsubsection[{\texorpdfstring{p}{p}}]{\setlength{\rightskip}{0pt plus 5cm}char$\ast$ lws\+\_\+process\+\_\+html\+\_\+args\+::p}\hypertarget{structlws__process__html__args_a11859d8bedd379fbf64543b25c65fe14}{}\label{structlws__process__html__args_a11859d8bedd379fbf64543b25c65fe14}
+pointer to the buffer containing the data
+
+The documentation for this struct was generated from the following file\+:\begin{DoxyCompactItemize}
+\item
+lib/\hyperlink{libwebsockets_8h}{libwebsockets.\+h}\end{DoxyCompactItemize}
--- /dev/null
+\hypertarget{structlws__process__html__state}{}\section{lws\+\_\+process\+\_\+html\+\_\+state Struct Reference}
+\label{structlws__process__html__state}\index{lws\+\_\+process\+\_\+html\+\_\+state@{lws\+\_\+process\+\_\+html\+\_\+state}}
+\subsection*{Data Fields}
+\begin{DoxyCompactItemize}
+\item
+char $\ast$ \hyperlink{structlws__process__html__state_af0732884ef891e24fe5fa237ebaa21a3}{start}
+\item
+char \hyperlink{structlws__process__html__state_a71982bc1cbd8cf876ca0f545144404eb}{swallow} \mbox{[}16\mbox{]}
+\item
+int \hyperlink{structlws__process__html__state_a53234f2948812c7208a256f9f5b23c20}{pos}
+\item
+void $\ast$ \hyperlink{structlws__process__html__state_af21119890fdfebe28fb5c4dabfc1bdf5}{data}
+\item
+const char $\ast$const $\ast$ \hyperlink{structlws__process__html__state_a3b113e00c03a2fded51b1c85ff5bf077}{vars}
+\item
+int \hyperlink{structlws__process__html__state_adcafd17704775b4bbeea9561fb340968}{count\+\_\+vars}
+\item
+lws\+\_\+process\+\_\+html\+\_\+state\+\_\+cb \hyperlink{structlws__process__html__state_a693d2fb45378afee5da29b539c1ea644}{replace}
+\end{DoxyCompactItemize}
+
+
+\subsection{Field Documentation}
+\index{lws\+\_\+process\+\_\+html\+\_\+state@{lws\+\_\+process\+\_\+html\+\_\+state}!count\+\_\+vars@{count\+\_\+vars}}
+\index{count\+\_\+vars@{count\+\_\+vars}!lws\+\_\+process\+\_\+html\+\_\+state@{lws\+\_\+process\+\_\+html\+\_\+state}}
+\subsubsection[{\texorpdfstring{count\+\_\+vars}{count\_vars}}]{\setlength{\rightskip}{0pt plus 5cm}int lws\+\_\+process\+\_\+html\+\_\+state\+::count\+\_\+vars}\hypertarget{structlws__process__html__state_adcafd17704775b4bbeea9561fb340968}{}\label{structlws__process__html__state_adcafd17704775b4bbeea9561fb340968}
+count of variable names \index{lws\+\_\+process\+\_\+html\+\_\+state@{lws\+\_\+process\+\_\+html\+\_\+state}!data@{data}}
+\index{data@{data}!lws\+\_\+process\+\_\+html\+\_\+state@{lws\+\_\+process\+\_\+html\+\_\+state}}
+\subsubsection[{\texorpdfstring{data}{data}}]{\setlength{\rightskip}{0pt plus 5cm}void$\ast$ lws\+\_\+process\+\_\+html\+\_\+state\+::data}\hypertarget{structlws__process__html__state_af21119890fdfebe28fb5c4dabfc1bdf5}{}\label{structlws__process__html__state_af21119890fdfebe28fb5c4dabfc1bdf5}
+opaque pointer \index{lws\+\_\+process\+\_\+html\+\_\+state@{lws\+\_\+process\+\_\+html\+\_\+state}!pos@{pos}}
+\index{pos@{pos}!lws\+\_\+process\+\_\+html\+\_\+state@{lws\+\_\+process\+\_\+html\+\_\+state}}
+\subsubsection[{\texorpdfstring{pos}{pos}}]{\setlength{\rightskip}{0pt plus 5cm}int lws\+\_\+process\+\_\+html\+\_\+state\+::pos}\hypertarget{structlws__process__html__state_a53234f2948812c7208a256f9f5b23c20}{}\label{structlws__process__html__state_a53234f2948812c7208a256f9f5b23c20}
+position in match \index{lws\+\_\+process\+\_\+html\+\_\+state@{lws\+\_\+process\+\_\+html\+\_\+state}!replace@{replace}}
+\index{replace@{replace}!lws\+\_\+process\+\_\+html\+\_\+state@{lws\+\_\+process\+\_\+html\+\_\+state}}
+\subsubsection[{\texorpdfstring{replace}{replace}}]{\setlength{\rightskip}{0pt plus 5cm}lws\+\_\+process\+\_\+html\+\_\+state\+\_\+cb lws\+\_\+process\+\_\+html\+\_\+state\+::replace}\hypertarget{structlws__process__html__state_a693d2fb45378afee5da29b539c1ea644}{}\label{structlws__process__html__state_a693d2fb45378afee5da29b539c1ea644}
+called on match to perform substitution \index{lws\+\_\+process\+\_\+html\+\_\+state@{lws\+\_\+process\+\_\+html\+\_\+state}!start@{start}}
+\index{start@{start}!lws\+\_\+process\+\_\+html\+\_\+state@{lws\+\_\+process\+\_\+html\+\_\+state}}
+\subsubsection[{\texorpdfstring{start}{start}}]{\setlength{\rightskip}{0pt plus 5cm}char$\ast$ lws\+\_\+process\+\_\+html\+\_\+state\+::start}\hypertarget{structlws__process__html__state_af0732884ef891e24fe5fa237ebaa21a3}{}\label{structlws__process__html__state_af0732884ef891e24fe5fa237ebaa21a3}
+pointer to start of match \index{lws\+\_\+process\+\_\+html\+\_\+state@{lws\+\_\+process\+\_\+html\+\_\+state}!swallow@{swallow}}
+\index{swallow@{swallow}!lws\+\_\+process\+\_\+html\+\_\+state@{lws\+\_\+process\+\_\+html\+\_\+state}}
+\subsubsection[{\texorpdfstring{swallow}{swallow}}]{\setlength{\rightskip}{0pt plus 5cm}char lws\+\_\+process\+\_\+html\+\_\+state\+::swallow\mbox{[}16\mbox{]}}\hypertarget{structlws__process__html__state_a71982bc1cbd8cf876ca0f545144404eb}{}\label{structlws__process__html__state_a71982bc1cbd8cf876ca0f545144404eb}
+matched character buffer \index{lws\+\_\+process\+\_\+html\+\_\+state@{lws\+\_\+process\+\_\+html\+\_\+state}!vars@{vars}}
+\index{vars@{vars}!lws\+\_\+process\+\_\+html\+\_\+state@{lws\+\_\+process\+\_\+html\+\_\+state}}
+\subsubsection[{\texorpdfstring{vars}{vars}}]{\setlength{\rightskip}{0pt plus 5cm}const char$\ast$ const$\ast$ lws\+\_\+process\+\_\+html\+\_\+state\+::vars}\hypertarget{structlws__process__html__state_a3b113e00c03a2fded51b1c85ff5bf077}{}\label{structlws__process__html__state_a3b113e00c03a2fded51b1c85ff5bf077}
+list of variable names
+
+The documentation for this struct was generated from the following file\+:\begin{DoxyCompactItemize}
+\item
+lib/\hyperlink{libwebsockets_8h}{libwebsockets.\+h}\end{DoxyCompactItemize}
--- /dev/null
+\hypertarget{structlws__protocol__vhost__options}{}\section{lws\+\_\+protocol\+\_\+vhost\+\_\+options Struct Reference}
+\label{structlws__protocol__vhost__options}\index{lws\+\_\+protocol\+\_\+vhost\+\_\+options@{lws\+\_\+protocol\+\_\+vhost\+\_\+options}}
+
+
+{\ttfamily \#include $<$libwebsockets.\+h$>$}
+
+\subsection*{Data Fields}
+\begin{DoxyCompactItemize}
+\item
+const struct \hyperlink{structlws__protocol__vhost__options}{lws\+\_\+protocol\+\_\+vhost\+\_\+options} $\ast$ \hyperlink{structlws__protocol__vhost__options_abc714ddb4171756fc8196e9823a1e21c}{next}
+\item
+const struct \hyperlink{structlws__protocol__vhost__options}{lws\+\_\+protocol\+\_\+vhost\+\_\+options} $\ast$ \hyperlink{structlws__protocol__vhost__options_afd99fbc90be51ea2465b550c2ec47822}{options}
+\item
+const char $\ast$ \hyperlink{structlws__protocol__vhost__options_acf9db77f8eb64cd4e314be9b43d8a8b9}{name}
+\item
+const char $\ast$ \hyperlink{structlws__protocol__vhost__options_a0640a92513c70ee6b9b295a9ad1658e7}{value}
+\end{DoxyCompactItemize}
+
+
+\subsection{Detailed Description}
+struct \hyperlink{structlws__protocol__vhost__options}{lws\+\_\+protocol\+\_\+vhost\+\_\+options} -\/ linked list of per-\/vhost protocol name=value options
+
+This provides a general way to attach a linked-\/list of name=value pairs, which can also have an optional child link-\/list using the options member.
+
+\subsection{Field Documentation}
+\index{lws\+\_\+protocol\+\_\+vhost\+\_\+options@{lws\+\_\+protocol\+\_\+vhost\+\_\+options}!name@{name}}
+\index{name@{name}!lws\+\_\+protocol\+\_\+vhost\+\_\+options@{lws\+\_\+protocol\+\_\+vhost\+\_\+options}}
+\subsubsection[{\texorpdfstring{name}{name}}]{\setlength{\rightskip}{0pt plus 5cm}const char$\ast$ lws\+\_\+protocol\+\_\+vhost\+\_\+options\+::name}\hypertarget{structlws__protocol__vhost__options_acf9db77f8eb64cd4e314be9b43d8a8b9}{}\label{structlws__protocol__vhost__options_acf9db77f8eb64cd4e314be9b43d8a8b9}
+name of name=value pair \index{lws\+\_\+protocol\+\_\+vhost\+\_\+options@{lws\+\_\+protocol\+\_\+vhost\+\_\+options}!next@{next}}
+\index{next@{next}!lws\+\_\+protocol\+\_\+vhost\+\_\+options@{lws\+\_\+protocol\+\_\+vhost\+\_\+options}}
+\subsubsection[{\texorpdfstring{next}{next}}]{\setlength{\rightskip}{0pt plus 5cm}const struct {\bf lws\+\_\+protocol\+\_\+vhost\+\_\+options}$\ast$ lws\+\_\+protocol\+\_\+vhost\+\_\+options\+::next}\hypertarget{structlws__protocol__vhost__options_abc714ddb4171756fc8196e9823a1e21c}{}\label{structlws__protocol__vhost__options_abc714ddb4171756fc8196e9823a1e21c}
+linked list \index{lws\+\_\+protocol\+\_\+vhost\+\_\+options@{lws\+\_\+protocol\+\_\+vhost\+\_\+options}!options@{options}}
+\index{options@{options}!lws\+\_\+protocol\+\_\+vhost\+\_\+options@{lws\+\_\+protocol\+\_\+vhost\+\_\+options}}
+\subsubsection[{\texorpdfstring{options}{options}}]{\setlength{\rightskip}{0pt plus 5cm}const struct {\bf lws\+\_\+protocol\+\_\+vhost\+\_\+options}$\ast$ lws\+\_\+protocol\+\_\+vhost\+\_\+options\+::options}\hypertarget{structlws__protocol__vhost__options_afd99fbc90be51ea2465b550c2ec47822}{}\label{structlws__protocol__vhost__options_afd99fbc90be51ea2465b550c2ec47822}
+child linked-\/list of more options for this node \index{lws\+\_\+protocol\+\_\+vhost\+\_\+options@{lws\+\_\+protocol\+\_\+vhost\+\_\+options}!value@{value}}
+\index{value@{value}!lws\+\_\+protocol\+\_\+vhost\+\_\+options@{lws\+\_\+protocol\+\_\+vhost\+\_\+options}}
+\subsubsection[{\texorpdfstring{value}{value}}]{\setlength{\rightskip}{0pt plus 5cm}const char$\ast$ lws\+\_\+protocol\+\_\+vhost\+\_\+options\+::value}\hypertarget{structlws__protocol__vhost__options_a0640a92513c70ee6b9b295a9ad1658e7}{}\label{structlws__protocol__vhost__options_a0640a92513c70ee6b9b295a9ad1658e7}
+value of name=value pair
+
+The documentation for this struct was generated from the following file\+:\begin{DoxyCompactItemize}
+\item
+lib/\hyperlink{libwebsockets_8h}{libwebsockets.\+h}\end{DoxyCompactItemize}
--- /dev/null
+\hypertarget{structlws__protocols}{}\section{lws\+\_\+protocols Struct Reference}
+\label{structlws__protocols}\index{lws\+\_\+protocols@{lws\+\_\+protocols}}
+
+
+{\ttfamily \#include $<$libwebsockets.\+h$>$}
+
+\subsection*{Data Fields}
+\begin{DoxyCompactItemize}
+\item
+const char $\ast$ \hyperlink{structlws__protocols_a0e63edb457a613c3fa4271e0a8f19624}{name}
+\item
+\hyperlink{group__usercb_gad4fcb82e68d60ffacca61a3f783a0a2f}{lws\+\_\+callback\+\_\+function} $\ast$ \hyperlink{structlws__protocols_acabf94c1a9bfe7be0387fbb0e0c56b2d}{callback}
+\item
+size\+\_\+t \hyperlink{structlws__protocols_a9bbd85f591ffb4259711cb5acbb05bea}{per\+\_\+session\+\_\+data\+\_\+size}
+\item
+size\+\_\+t \hyperlink{structlws__protocols_a0d1d4996d81b2f5e125bcec981e461c5}{rx\+\_\+buffer\+\_\+size}
+\item
+unsigned int \hyperlink{structlws__protocols_a6b632018590c2b1bbe43fbab6d5e6fac}{id}
+\item
+void $\ast$ \hyperlink{structlws__protocols_a3cbd903ad076736ae934a54cae36580e}{user}
+\end{DoxyCompactItemize}
+
+
+\subsection{Detailed Description}
+struct \hyperlink{structlws__protocols}{lws\+\_\+protocols} -\/ List of protocols and handlers client or server supports.
+
+\subsection{Field Documentation}
+\index{lws\+\_\+protocols@{lws\+\_\+protocols}!callback@{callback}}
+\index{callback@{callback}!lws\+\_\+protocols@{lws\+\_\+protocols}}
+\subsubsection[{\texorpdfstring{callback}{callback}}]{\setlength{\rightskip}{0pt plus 5cm}{\bf lws\+\_\+callback\+\_\+function}$\ast$ lws\+\_\+protocols\+::callback}\hypertarget{structlws__protocols_acabf94c1a9bfe7be0387fbb0e0c56b2d}{}\label{structlws__protocols_acabf94c1a9bfe7be0387fbb0e0c56b2d}
+The service callback used for this protocol. It allows the service action for an entire protocol to be encapsulated in the protocol-\/specific callback \index{lws\+\_\+protocols@{lws\+\_\+protocols}!id@{id}}
+\index{id@{id}!lws\+\_\+protocols@{lws\+\_\+protocols}}
+\subsubsection[{\texorpdfstring{id}{id}}]{\setlength{\rightskip}{0pt plus 5cm}unsigned int lws\+\_\+protocols\+::id}\hypertarget{structlws__protocols_a6b632018590c2b1bbe43fbab6d5e6fac}{}\label{structlws__protocols_a6b632018590c2b1bbe43fbab6d5e6fac}
+ignored by lws, but useful to contain user information bound to the selected protocol. For example if this protocol was called \char`\"{}myprotocol-\/v2\char`\"{}, you might set id to 2, and the user code that acts differently according to the version can do so by switch (wsi-\/$>$protocol-\/$>$id), user code might use some bits as capability flags based on selected protocol version, etc. \index{lws\+\_\+protocols@{lws\+\_\+protocols}!name@{name}}
+\index{name@{name}!lws\+\_\+protocols@{lws\+\_\+protocols}}
+\subsubsection[{\texorpdfstring{name}{name}}]{\setlength{\rightskip}{0pt plus 5cm}const char$\ast$ lws\+\_\+protocols\+::name}\hypertarget{structlws__protocols_a0e63edb457a613c3fa4271e0a8f19624}{}\label{structlws__protocols_a0e63edb457a613c3fa4271e0a8f19624}
+Protocol name that must match the one given in the client Javascript new Web\+Socket(url, \textquotesingle{}protocol\textquotesingle{}) name. \index{lws\+\_\+protocols@{lws\+\_\+protocols}!per\+\_\+session\+\_\+data\+\_\+size@{per\+\_\+session\+\_\+data\+\_\+size}}
+\index{per\+\_\+session\+\_\+data\+\_\+size@{per\+\_\+session\+\_\+data\+\_\+size}!lws\+\_\+protocols@{lws\+\_\+protocols}}
+\subsubsection[{\texorpdfstring{per\+\_\+session\+\_\+data\+\_\+size}{per\_session\_data\_size}}]{\setlength{\rightskip}{0pt plus 5cm}size\+\_\+t lws\+\_\+protocols\+::per\+\_\+session\+\_\+data\+\_\+size}\hypertarget{structlws__protocols_a9bbd85f591ffb4259711cb5acbb05bea}{}\label{structlws__protocols_a9bbd85f591ffb4259711cb5acbb05bea}
+Each new connection using this protocol gets this much memory allocated on connection establishment and freed on connection takedown. A pointer to this per-\/connection allocation is passed into the callback in the \textquotesingle{}user\textquotesingle{} parameter \index{lws\+\_\+protocols@{lws\+\_\+protocols}!rx\+\_\+buffer\+\_\+size@{rx\+\_\+buffer\+\_\+size}}
+\index{rx\+\_\+buffer\+\_\+size@{rx\+\_\+buffer\+\_\+size}!lws\+\_\+protocols@{lws\+\_\+protocols}}
+\subsubsection[{\texorpdfstring{rx\+\_\+buffer\+\_\+size}{rx\_buffer\_size}}]{\setlength{\rightskip}{0pt plus 5cm}size\+\_\+t lws\+\_\+protocols\+::rx\+\_\+buffer\+\_\+size}\hypertarget{structlws__protocols_a0d1d4996d81b2f5e125bcec981e461c5}{}\label{structlws__protocols_a0d1d4996d81b2f5e125bcec981e461c5}
+lws allocates this much space for rx data and informs callback when something came. Due to rx flow control, the callback may not be able to consume it all without having to return to the event loop. That is supported in lws.
+
+This also controls how much may be sent at once at the moment, although this is likely to change. \index{lws\+\_\+protocols@{lws\+\_\+protocols}!user@{user}}
+\index{user@{user}!lws\+\_\+protocols@{lws\+\_\+protocols}}
+\subsubsection[{\texorpdfstring{user}{user}}]{\setlength{\rightskip}{0pt plus 5cm}void$\ast$ lws\+\_\+protocols\+::user}\hypertarget{structlws__protocols_a3cbd903ad076736ae934a54cae36580e}{}\label{structlws__protocols_a3cbd903ad076736ae934a54cae36580e}
+ignored by lws, but user code can pass a pointer here it can later access from the protocol callback
+
+The documentation for this struct was generated from the following file\+:\begin{DoxyCompactItemize}
+\item
+lib/\hyperlink{libwebsockets_8h}{libwebsockets.\+h}\end{DoxyCompactItemize}
--- /dev/null
+\hypertarget{structlws__session__info}{}\section{lws\+\_\+session\+\_\+info Struct Reference}
+\label{structlws__session__info}\index{lws\+\_\+session\+\_\+info@{lws\+\_\+session\+\_\+info}}
+
+
+{\ttfamily \#include $<$libwebsockets.\+h$>$}
+
+\subsection*{Data Fields}
+\begin{DoxyCompactItemize}
+\item
+char \hyperlink{structlws__session__info_a3d57a70b6e7181d95a8bec429b1a7697}{username} \mbox{[}32\mbox{]}
+\item
+char \hyperlink{structlws__session__info_a94b813cfc6b0da4b182659de30038ad3}{email} \mbox{[}100\mbox{]}
+\item
+char \hyperlink{structlws__session__info_a53eed02325e8717a53297391e3e98fac}{ip} \mbox{[}72\mbox{]}
+\item
+unsigned int \hyperlink{structlws__session__info_afb924864b70f40372920688a5c1c895e}{mask}
+\item
+char \hyperlink{structlws__session__info_a4353b5dd19400b2b15edfd7cee1e4cd5}{session} \mbox{[}42\mbox{]}
+\end{DoxyCompactItemize}
+
+
+\subsection{Detailed Description}
+struct \hyperlink{structlws__session__info}{lws\+\_\+session\+\_\+info} -\/ information about user session status
+
+\subsection{Field Documentation}
+\index{lws\+\_\+session\+\_\+info@{lws\+\_\+session\+\_\+info}!email@{email}}
+\index{email@{email}!lws\+\_\+session\+\_\+info@{lws\+\_\+session\+\_\+info}}
+\subsubsection[{\texorpdfstring{email}{email}}]{\setlength{\rightskip}{0pt plus 5cm}char lws\+\_\+session\+\_\+info\+::email\mbox{[}100\mbox{]}}\hypertarget{structlws__session__info_a94b813cfc6b0da4b182659de30038ad3}{}\label{structlws__session__info_a94b813cfc6b0da4b182659de30038ad3}
+email address associated with login, or empty string \index{lws\+\_\+session\+\_\+info@{lws\+\_\+session\+\_\+info}!ip@{ip}}
+\index{ip@{ip}!lws\+\_\+session\+\_\+info@{lws\+\_\+session\+\_\+info}}
+\subsubsection[{\texorpdfstring{ip}{ip}}]{\setlength{\rightskip}{0pt plus 5cm}char lws\+\_\+session\+\_\+info\+::ip\mbox{[}72\mbox{]}}\hypertarget{structlws__session__info_a53eed02325e8717a53297391e3e98fac}{}\label{structlws__session__info_a53eed02325e8717a53297391e3e98fac}
+ip address session was started from \index{lws\+\_\+session\+\_\+info@{lws\+\_\+session\+\_\+info}!mask@{mask}}
+\index{mask@{mask}!lws\+\_\+session\+\_\+info@{lws\+\_\+session\+\_\+info}}
+\subsubsection[{\texorpdfstring{mask}{mask}}]{\setlength{\rightskip}{0pt plus 5cm}unsigned int lws\+\_\+session\+\_\+info\+::mask}\hypertarget{structlws__session__info_afb924864b70f40372920688a5c1c895e}{}\label{structlws__session__info_afb924864b70f40372920688a5c1c895e}
+access rights mask associated with session see enum lwsgs\+\_\+auth\+\_\+bits \index{lws\+\_\+session\+\_\+info@{lws\+\_\+session\+\_\+info}!session@{session}}
+\index{session@{session}!lws\+\_\+session\+\_\+info@{lws\+\_\+session\+\_\+info}}
+\subsubsection[{\texorpdfstring{session}{session}}]{\setlength{\rightskip}{0pt plus 5cm}char lws\+\_\+session\+\_\+info\+::session\mbox{[}42\mbox{]}}\hypertarget{structlws__session__info_a4353b5dd19400b2b15edfd7cee1e4cd5}{}\label{structlws__session__info_a4353b5dd19400b2b15edfd7cee1e4cd5}
+session id string, usable as opaque uid when not logged in \index{lws\+\_\+session\+\_\+info@{lws\+\_\+session\+\_\+info}!username@{username}}
+\index{username@{username}!lws\+\_\+session\+\_\+info@{lws\+\_\+session\+\_\+info}}
+\subsubsection[{\texorpdfstring{username}{username}}]{\setlength{\rightskip}{0pt plus 5cm}char lws\+\_\+session\+\_\+info\+::username\mbox{[}32\mbox{]}}\hypertarget{structlws__session__info_a3d57a70b6e7181d95a8bec429b1a7697}{}\label{structlws__session__info_a3d57a70b6e7181d95a8bec429b1a7697}
+username logged in as, or empty string
+
+The documentation for this struct was generated from the following file\+:\begin{DoxyCompactItemize}
+\item
+lib/\hyperlink{libwebsockets_8h}{libwebsockets.\+h}\end{DoxyCompactItemize}
--- /dev/null
+\hypertarget{structlws__token__limits}{}\section{lws\+\_\+token\+\_\+limits Struct Reference}
+\label{structlws__token__limits}\index{lws\+\_\+token\+\_\+limits@{lws\+\_\+token\+\_\+limits}}
+\subsection*{Data Fields}
+\begin{DoxyCompactItemize}
+\item
+unsigned short \hyperlink{structlws__token__limits_a6ec712306cbf8585bce7a56758a3ceff}{token\+\_\+limit} \mbox{[}W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+C\+O\+U\+NT\mbox{]}
+\end{DoxyCompactItemize}
+
+
+\subsection{Field Documentation}
+\index{lws\+\_\+token\+\_\+limits@{lws\+\_\+token\+\_\+limits}!token\+\_\+limit@{token\+\_\+limit}}
+\index{token\+\_\+limit@{token\+\_\+limit}!lws\+\_\+token\+\_\+limits@{lws\+\_\+token\+\_\+limits}}
+\subsubsection[{\texorpdfstring{token\+\_\+limit}{token\_limit}}]{\setlength{\rightskip}{0pt plus 5cm}unsigned short lws\+\_\+token\+\_\+limits\+::token\+\_\+limit\mbox{[}W\+S\+I\+\_\+\+T\+O\+K\+E\+N\+\_\+\+C\+O\+U\+NT\mbox{]}}\hypertarget{structlws__token__limits_a6ec712306cbf8585bce7a56758a3ceff}{}\label{structlws__token__limits_a6ec712306cbf8585bce7a56758a3ceff}
+max chars for this token
+
+The documentation for this struct was generated from the following file\+:\begin{DoxyCompactItemize}
+\item
+lib/\hyperlink{libwebsockets_8h}{libwebsockets.\+h}\end{DoxyCompactItemize}
--- /dev/null
+\hypertarget{structlws__tokens}{}\section{lws\+\_\+tokens Struct Reference}
+\label{structlws__tokens}\index{lws\+\_\+tokens@{lws\+\_\+tokens}}
+
+
+{\ttfamily \#include $<$libwebsockets.\+h$>$}
+
+\subsection*{Data Fields}
+\begin{DoxyCompactItemize}
+\item
+char $\ast$ \hyperlink{structlws__tokens_a9f3635412bc71a5cb78e9862b55f10cd}{token}
+\item
+int \hyperlink{structlws__tokens_a855b7375d1d58516c0ecd4b60e9a7766}{token\+\_\+len}
+\end{DoxyCompactItemize}
+
+
+\subsection{Detailed Description}
+struct \hyperlink{structlws__tokens}{lws\+\_\+tokens} you need these to look at headers that have been parsed if using the L\+W\+S\+\_\+\+C\+A\+L\+L\+B\+A\+C\+K\+\_\+\+F\+I\+L\+T\+E\+R\+\_\+\+C\+O\+N\+N\+E\+C\+T\+I\+ON callback. If a header from the enum list below is absent, .token = N\+U\+LL and token\+\_\+len = 0. Otherwise .token points to .token\+\_\+len chars containing that header content.
+
+\subsection{Field Documentation}
+\index{lws\+\_\+tokens@{lws\+\_\+tokens}!token@{token}}
+\index{token@{token}!lws\+\_\+tokens@{lws\+\_\+tokens}}
+\subsubsection[{\texorpdfstring{token}{token}}]{\setlength{\rightskip}{0pt plus 5cm}char$\ast$ lws\+\_\+tokens\+::token}\hypertarget{structlws__tokens_a9f3635412bc71a5cb78e9862b55f10cd}{}\label{structlws__tokens_a9f3635412bc71a5cb78e9862b55f10cd}
+pointer to start of the token \index{lws\+\_\+tokens@{lws\+\_\+tokens}!token\+\_\+len@{token\+\_\+len}}
+\index{token\+\_\+len@{token\+\_\+len}!lws\+\_\+tokens@{lws\+\_\+tokens}}
+\subsubsection[{\texorpdfstring{token\+\_\+len}{token\_len}}]{\setlength{\rightskip}{0pt plus 5cm}int lws\+\_\+tokens\+::token\+\_\+len}\hypertarget{structlws__tokens_a855b7375d1d58516c0ecd4b60e9a7766}{}\label{structlws__tokens_a855b7375d1d58516c0ecd4b60e9a7766}
+length of the token\textquotesingle{}s value
+
+The documentation for this struct was generated from the following file\+:\begin{DoxyCompactItemize}
+\item
+lib/\hyperlink{libwebsockets_8h}{libwebsockets.\+h}\end{DoxyCompactItemize}
--- /dev/null
+\hypertarget{structlwsgw__hash}{}\section{lwsgw\+\_\+hash Struct Reference}
+\label{structlwsgw__hash}\index{lwsgw\+\_\+hash@{lwsgw\+\_\+hash}}
+
+
+{\ttfamily \#include $<$libwebsockets.\+h$>$}
+
+\subsection*{Data Fields}
+\begin{DoxyCompactItemize}
+\item
+char \hyperlink{structlwsgw__hash_a29435f5cf78747d4257695b0f141d164}{id} \mbox{[}41\mbox{]}
+\end{DoxyCompactItemize}
+
+
+\subsection{Detailed Description}
+typedef struct \hyperlink{structlwsgw__hash}{lwsgw\+\_\+hash}
+
+\subsection{Field Documentation}
+\index{lwsgw\+\_\+hash@{lwsgw\+\_\+hash}!id@{id}}
+\index{id@{id}!lwsgw\+\_\+hash@{lwsgw\+\_\+hash}}
+\subsubsection[{\texorpdfstring{id}{id}}]{\setlength{\rightskip}{0pt plus 5cm}char lwsgw\+\_\+hash\+::id\mbox{[}41\mbox{]}}\hypertarget{structlwsgw__hash_a29435f5cf78747d4257695b0f141d164}{}\label{structlwsgw__hash_a29435f5cf78747d4257695b0f141d164}
+ascii hex representation of hash
+
+The documentation for this struct was generated from the following file\+:\begin{DoxyCompactItemize}
+\item
+lib/\hyperlink{libwebsockets_8h}{libwebsockets.\+h}\end{DoxyCompactItemize}
--- /dev/null
+\hypertarget{structlwsgw__hash__bin}{}\section{lwsgw\+\_\+hash\+\_\+bin Struct Reference}
+\label{structlwsgw__hash__bin}\index{lwsgw\+\_\+hash\+\_\+bin@{lwsgw\+\_\+hash\+\_\+bin}}
+
+
+{\ttfamily \#include $<$libwebsockets.\+h$>$}
+
+\subsection*{Data Fields}
+\begin{DoxyCompactItemize}
+\item
+unsigned char \hyperlink{structlwsgw__hash__bin_ac92f50d9471058525d110597a4e0de6b}{bin} \mbox{[}20\mbox{]}
+\end{DoxyCompactItemize}
+
+
+\subsection{Detailed Description}
+typedef struct \hyperlink{structlwsgw__hash__bin}{lwsgw\+\_\+hash\+\_\+bin}
+
+\subsection{Field Documentation}
+\index{lwsgw\+\_\+hash\+\_\+bin@{lwsgw\+\_\+hash\+\_\+bin}!bin@{bin}}
+\index{bin@{bin}!lwsgw\+\_\+hash\+\_\+bin@{lwsgw\+\_\+hash\+\_\+bin}}
+\subsubsection[{\texorpdfstring{bin}{bin}}]{\setlength{\rightskip}{0pt plus 5cm}unsigned char lwsgw\+\_\+hash\+\_\+bin\+::bin\mbox{[}20\mbox{]}}\hypertarget{structlwsgw__hash__bin_ac92f50d9471058525d110597a4e0de6b}{}\label{structlwsgw__hash__bin_ac92f50d9471058525d110597a4e0de6b}
+binary representation of hash
+
+The documentation for this struct was generated from the following file\+:\begin{DoxyCompactItemize}
+\item
+lib/\hyperlink{libwebsockets_8h}{libwebsockets.\+h}\end{DoxyCompactItemize}
--- /dev/null
+\hypertarget{structpollfd}{}\section{pollfd Struct Reference}
+\label{structpollfd}\index{pollfd@{pollfd}}
+\subsection*{Data Fields}
+\begin{DoxyCompactItemize}
+\item
+lws\+\_\+sockfd\+\_\+type \hyperlink{structpollfd_af084f089bdece61d177f85782d6673d0}{fd}
+\item
+short \hyperlink{structpollfd_ac9b2f2c5b1f9a7487eb57e67cd4960ef}{events}
+\item
+short \hyperlink{structpollfd_aafb457d11cac415faf0e1e2b825118c2}{revents}
+\end{DoxyCompactItemize}
+
+
+\subsection{Field Documentation}
+\index{pollfd@{pollfd}!events@{events}}
+\index{events@{events}!pollfd@{pollfd}}
+\subsubsection[{\texorpdfstring{events}{events}}]{\setlength{\rightskip}{0pt plus 5cm}short pollfd\+::events}\hypertarget{structpollfd_ac9b2f2c5b1f9a7487eb57e67cd4960ef}{}\label{structpollfd_ac9b2f2c5b1f9a7487eb57e67cd4960ef}
+which P\+O\+LL... events to respond to \index{pollfd@{pollfd}!fd@{fd}}
+\index{fd@{fd}!pollfd@{pollfd}}
+\subsubsection[{\texorpdfstring{fd}{fd}}]{\setlength{\rightskip}{0pt plus 5cm}lws\+\_\+sockfd\+\_\+type pollfd\+::fd}\hypertarget{structpollfd_af084f089bdece61d177f85782d6673d0}{}\label{structpollfd_af084f089bdece61d177f85782d6673d0}
+fd related to \index{pollfd@{pollfd}!revents@{revents}}
+\index{revents@{revents}!pollfd@{pollfd}}
+\subsubsection[{\texorpdfstring{revents}{revents}}]{\setlength{\rightskip}{0pt plus 5cm}short pollfd\+::revents}\hypertarget{structpollfd_aafb457d11cac415faf0e1e2b825118c2}{}\label{structpollfd_aafb457d11cac415faf0e1e2b825118c2}
+which P\+O\+LL... events occurred
+
+The documentation for this struct was generated from the following file\+:\begin{DoxyCompactItemize}
+\item
+lib/\hyperlink{libwebsockets_8h}{libwebsockets.\+h}\end{DoxyCompactItemize}
return HUBBUB_OK;
}
#endif
-/**
- * lws_client_connect_via_info() - Connect to another websocket server
- * @i:pointer to lws_client_connect_info struct
- *
- * This function creates a connection to a remote server
- */
-
LWS_VISIBLE struct lws *
lws_client_connect_via_info(struct lws_client_connect_info *i)
return NULL;
}
-
-/**
- * lws_client_connect_extended() - Connect to another websocket server
- * DEPRECATED use lws_client_connect_via_info
- * @context: Websocket context
- * @address: Remote server address, eg, "myserver.com"
- * @port: Port to connect to on the remote server, eg, 80
- * @ssl_connection: 0 = ws://, 1 = wss:// encrypted, 2 = wss:// allow self
- * signed certs
- * @path: Websocket path on server
- * @host: Hostname on server
- * @origin: Socket origin name
- * @protocol: Comma-separated list of protocols being asked for from
- * the server, or just one. The server will pick the one it
- * likes best.
- * @ietf_version_or_minus_one: -1 to ask to connect using the default, latest
- * protocol supported, or the specific protocol ordinal
- * @userdata: Pre-allocated user data
- *
- * This function creates a connection to a remote server
- */
-
LWS_VISIBLE struct lws *
lws_client_connect_extended(struct lws_context *context, const char *address,
int port, int ssl_connection, const char *path,
return lws_client_connect_via_info(&i);
}
-/**
- * lws_client_connect_info() - Connect to another websocket server
- * DEPRECATED use lws_client_connect_via_info
- * @context: Websocket context
- * @address: Remote server address, eg, "myserver.com"
- * @port: Port to connect to on the remote server, eg, 80
- * @ssl_connection: 0 = ws://, 1 = wss:// encrypted, 2 = wss:// allow self
- * signed certs
- * @path: Websocket path on server
- * @host: Hostname on server
- * @origin: Socket origin name
- * @protocol: Comma-separated list of protocols being asked for from
- * the server, or just one. The server will pick the one it
- * likes best. If you don't want to specify a protocol, which is
- * legal, use NULL here.
- * @ietf_version_or_minus_one: -1 to ask to connect using the default, latest
- * protocol supported, or the specific protocol ordinal
- *
- * This function creates a connection to a remote server
- */
-
LWS_VISIBLE struct lws *
lws_client_connect(struct lws_context *context, const char *address,
}
}
-/**
- * lws_http_transaction_completed() - wait for new http transaction or close
- * @wsi: websocket connection
- *
- * Returns 1 if the HTTP connection must close now
- * Returns 0 and resets connection to wait for new HTTP header /
- * transaction if possible
- */
-
int LWS_WARN_UNUSED_RESULT
lws_http_transaction_completed_client(struct lws *wsi)
{
return NULL;
}
-/**
- * lws_init_vhost_client_ssl() - also enable client SSL on an existing vhost
- *
- * @info: client ssl related info
- * @vhost: which vhost to initialize client ssl operations on
- *
- * You only need to call this if you plan on using SSL client connections on
- * the vhost. For non-SSL client connections, it's not necessary to call this.
- *
- * The following members of @info are used during the call
- *
- * - @options must have LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT set,
- * otherwise the call does nothing
- * - @provided_client_ssl_ctx must be NULL to get a generated client
- * ssl context, otherwise you can pass a prepared one in by setting it
- * - @ssl_cipher_list may be NULL or set to the client valid cipher list
- * - @ssl_ca_filepath may be NULL or client cert filepath
- * - @ssl_cert_filepath may be NULL or client cert filepath
- * - @ssl_private_key_filepath may be NULL or client cert private key
- *
- * You must create your vhost explicitly if you want to use this, so you have
- * a pointer to the vhost. Create the context first with the option flag
- * LWS_SERVER_OPTION_EXPLICIT_VHOSTS and then call lws_create_vhost() with
- * the same info struct.
- */
LWS_VISIBLE int
lws_init_vhost_client_ssl(const struct lws_context_creation_info *info,
struct lws_vhost *vhost)
return lws_context_init_client_ssl(&i, vhost);
}
-/**
- * lws_create_context() - Create the websocket handler
- * @info: pointer to struct with parameters
- *
- * This function creates the listening socket (if serving) and takes care
- * of all initialization in one step.
- *
- * After initialization, it returns a struct lws_context * that
- * represents this server. After calling, user code needs to take care
- * of calling lws_service() with the context pointer to get the
- * server's sockets serviced. This must be done in the same process
- * context as the initialization call.
- *
- * The protocol callback functions are called for a handful of events
- * including http requests coming in, websocket connections becoming
- * established, and data arriving; it's also called periodically to allow
- * async transmission.
- *
- * HTTP requests are sent always to the FIRST protocol in @protocol, since
- * at that time websocket protocol has not been negotiated. Other
- * protocols after the first one never see any HTTP callack activity.
- *
- * The server created is a simple http server by default; part of the
- * websocket standard is upgrading this http connection to a websocket one.
- *
- * This allows the same server to provide files like scripts and favicon /
- * images or whatever over http and dynamic data over websockets all in
- * one place; they're all handled in the user callback.
- */
LWS_VISIBLE struct lws_context *
lws_create_context(struct lws_context_creation_info *info)
{
return NULL;
}
-/**
- * lws_context_destroy() - Destroy the websocket context
- * @context: Websocket context
- *
- * This function closes any active connections and then frees the
- * context. After calling this, any further use of the context is
- * undefined.
- */
LWS_VISIBLE void
lws_context_destroy(struct lws_context *context)
{
return handled;
}
-/**
- * lws_set_extension_option(): set extension option if possible
- *
- * @wsi: websocket connection
- * @ext_name: name of ext, like "permessage-deflate"
- * @opt_name: name of option, like "rx_buf_size"
- * @opt_val: value to set option to
- */
-
int
lws_set_extension_option(struct lws *wsi, const char *ext_name,
const char *opt_name, const char *opt_val)
return 0;
}
-/**
- * lws_return_http_status() - Return simple http status
- * @wsi: Websocket instance (available from user callback)
- * @code: Status index, eg, 404
- * @html_body: User-readable HTML description < 1KB, or NULL
- *
- * Helper to report HTTP errors back to the client cleanly and
- * consistently
- */
LWS_VISIBLE int
lws_return_http_status(struct lws *wsi, unsigned int code,
const char *html_body)
/**
* lejp_construct - prepare a struct lejp_ctx for use
*
- * @ctx: pointer to your struct lejp_ctx
- * @callback: your user callback which will received parsed tokens
- * @user: optional user data pointer untouched by lejp
- * @paths: your array of name elements you are interested in
- * @count_paths: ARRAY_SIZE() of @paths
+ * \param ctx: pointer to your struct lejp_ctx
+ * \param callback: your user callback which will received parsed tokens
+ * \param user: optional user data pointer untouched by lejp
+ * \param paths: your array of name elements you are interested in
+ * \param count_paths: ARRAY_SIZE() of @paths
*
* Prepares your context struct for use with lejp
*/
/**
* lejp_destruct - retire a previously constructed struct lejp_ctx
*
- * @ctx: pointer to your struct lejp_ctx
+ * \param ctx: pointer to your struct lejp_ctx
*
* lejp does not perform any allocations, but since your user code might, this
* provides a one-time LEJPCB_DESTRUCTED callback at destruction time where
/**
* lejp_change_callback - switch to a different callback from now on
*
- * @ctx: pointer to your struct lejp_ctx
- * @callback: your user callback which will received parsed tokens
+ * \param ctx: pointer to your struct lejp_ctx
+ * \param callback: your user callback which will received parsed tokens
*
* This tells the old callback it was destroyed, in case you want to take any
* action because that callback "lost focus", then changes to the new
/**
* lejp_parse - interpret some more incoming data incrementally
*
- * @ctx: previously constructed parsing context
- * @json: char buffer with the new data to interpret
- * @len: amount of data in the buffer
+ * \param ctx: previously constructed parsing context
+ * \param json: char buffer with the new data to interpret
+ * \param len: amount of data in the buffer
*
* Because lejp is a stream parser, it incrementally parses as new data
* becomes available, maintaining all state in the context struct. So an
/**
* _lejp_callback() - User parser actions
- * @ctx: LEJP context
- * @reason: Callback reason
+ * \param ctx: LEJP context
+ * \param reason: Callback reason
*
* Your user callback is associated with the context at construction time,
* and receives calls as the parsing progresses.
lws_pt_unlock(pt);
}
-/**
- * lws_set_timeout() - marks the wsi as subject to a timeout
- *
- * You will not need this unless you are doing something special
- *
- * @wsi: Websocket connection instance
- * @reason: timeout reason
- * @secs: how many seconds
- */
-
LWS_VISIBLE void
lws_set_timeout(struct lws *wsi, enum pending_timeout reason, int secs)
{
lws_free_wsi(wsi);
}
-/**
- * lws_get_urlarg_by_name() - return pointer to arg value if present
- * @wsi: the connection to check
- * @name: the arg name, like "token="
- * @buf: the buffer to receive the urlarg (including the name= part)
- * @len: the length of the buffer to receive the urlarg
- *
- * Returns NULL if not found or a pointer inside @buf to just after the
- * name= part.
- */
-
LWS_VISIBLE LWS_EXTERN const char *
lws_get_urlarg_by_name(struct lws *wsi, const char *name, char *buf, int len)
{
#endif
}
-/**
- * lws_get_peer_simple() - Get client address information without RDNS
- * @wsi: Local struct lws associated with
- * @name: Buffer to take client address name
- * @name_len: Length of client address name buffer
- *
- * This provides a 123.123.123.123 type IP address in @name from the
- * peer that has connected to @wsi
- */
-
LWS_VISIBLE const char *
lws_get_peer_simple(struct lws *wsi, char *name, int namelen)
{
#endif
}
-/**
- * lws_get_peer_addresses() - Get client address information
- * @wsi: Local struct lws associated with
- * @fd: Connection socket descriptor
- * @name: Buffer to take client address name
- * @name_len: Length of client address name buffer
- * @rip: Buffer to take client address IP dotted quad
- * @rip_len: Length of client address IP buffer
- *
- * This function fills in @name and @rip with the name and IP of
- * the client connected with socket descriptor @fd. Names may be
- * truncated if there is not enough room. If either cannot be
- * determined, they will be returned as valid zero-length strings.
- */
-
LWS_VISIBLE void
lws_get_peer_addresses(struct lws *wsi, lws_sockfd_type fd, char *name,
int name_len, char *rip, int rip_len)
#endif
}
-/**
- * lws_context_user() - get the user data associated with the context
- * @context: Websocket context
- *
- * This returns the optional user allocation that can be attached to
- * the context the sockets live in at context_create time. It's a way
- * to let all sockets serviced in the same context share data without
- * using globals statics in the user code.
- */
LWS_EXTERN void *
lws_context_user(struct lws_context *context)
{
return wsi->protocol;
}
-
-/**
- * lws_callback_all_protocol() - Callback all connections using
- * the given protocol with the given reason
- *
- * @protocol: Protocol whose connections will get callbacks
- * @reason: Callback reason index
- */
-
LWS_VISIBLE int
lws_callback_all_protocol(struct lws_context *context,
const struct lws_protocols *protocol, int reason)
return 0;
}
-/**
- * lws_callback_all_protocol_vhost() - Callback all connections using
- * the given protocol with the given reason
- *
- * @vh: Vhost whose connections will get callbacks
- * @protocol: Which protocol to match
- * @reason: Callback reason index
- */
-
LWS_VISIBLE int
lws_callback_all_protocol_vhost(struct lws_vhost *vh,
const struct lws_protocols *protocol, int reason)
return 0;
}
-/**
- * lws_callback_vhost_protocols() - Callback all protocols enabled on a vhost
- * with the given reason
- *
- * @wsi: wsi whose vhost will get callbacks
- * @reason: Callback reason index
- * @in: in argument to callback
- * @len: len argument to callback
- *
- * This is useful when informing all fellow enabled protocols on a vhost about
- * a vhost-wide event, eg, creation or deletion of an account
- */
-
LWS_VISIBLE LWS_EXTERN int
lws_callback_vhost_protocols(struct lws *wsi, int reason, void *in, int len)
{
#if LWS_POSIX
-/**
- * lws_get_socket_fd() - returns the socket file descriptor
- *
- * You will not need this unless you are doing something special
- *
- * @wsi: Websocket connection instance
- */
-
LWS_VISIBLE int
lws_get_socket_fd(struct lws *wsi)
{
}
#endif
-
-
-/**
- * lws_rx_flow_control() - Enable and disable socket servicing for
- * received packets.
- *
- * If the output side of a server process becomes choked, this allows flow
- * control for the input side.
- *
- * @wsi: Websocket connection instance to get callback for
- * @enable: 0 = disable read servicing for this connection, 1 = enable
- */
-
LWS_VISIBLE int
lws_rx_flow_control(struct lws *wsi, int enable)
{
return 0;
}
-/**
- * lws_rx_flow_allow_all_protocol() - Allow all connections with this protocol to receive
- *
- * When the user server code realizes it can accept more input, it can
- * call this to have the RX flow restriction removed from all connections using
- * the given protocol.
- *
- * @protocol: all connections using this protocol will be allowed to receive
- */
-
LWS_VISIBLE void
lws_rx_flow_allow_all_protocol(const struct lws_context *context,
const struct lws_protocols *protocol)
}
}
-
-/**
- * lws_canonical_hostname() - returns this host's hostname
- *
- * This is typically used by client code to fill in the host parameter
- * when making a client connection. You can only call it after the context
- * has been created.
- *
- * @context: Websocket context
- */
LWS_VISIBLE extern const char *
lws_canonical_hostname(struct lws_context *context)
{
return n;
}
-
-/**
- * lws_set_proxy() - Setups proxy to lws_context.
- * @context: pointer to struct lws_context you want set proxy to
- * @proxy: pointer to c string containing proxy in format address:port
- *
- * Returns 0 if proxy string was parsed and proxy was setup.
- * Returns -1 if @proxy is NULL or has incorrect format.
- *
- * This is only required if your OS does not provide the http_proxy
- * environment variable (eg, OSX)
- *
- * IMPORTANT! You should call this function right after creation of the
- * lws_context and before call to connect. If you call this
- * function after connect behavior is undefined.
- * This function will override proxy settings made on lws_context
- * creation with genenv() call.
- */
-
LWS_VISIBLE int
lws_set_proxy(struct lws_vhost *vhost, const char *proxy)
{
return -1;
}
-/**
- * lws_get_protocol() - Returns a protocol pointer from a websocket
- * connection.
- * @wsi: pointer to struct websocket you want to know the protocol of
- *
- *
- * Some apis can act on all live connections of a given protocol,
- * this is how you can get a pointer to the active protocol if needed.
- */
-
LWS_VISIBLE const struct lws_protocols *
lws_get_protocol(struct lws *wsi)
{
return 0;
}
-/**
- * lwsl_timestamp: generate logging timestamp string
- *
- * @level: logging level
- * @p: char * buffer to take timestamp
- * @len: length of p
- *
- * returns length written in p
- */
LWS_VISIBLE int
lwsl_timestamp(int level, char *p, int len)
{
va_end(ap);
}
-/**
- * lws_set_log_level() - Set the logging bitfield
- * @level: OR together the LLL_ debug contexts you want output from
- * @log_emit_function: NULL to leave it as it is, or a user-supplied
- * function to perform log string emission instead of
- * the default stderr one.
- *
- * log level defaults to "err", "warn" and "notice" contexts enabled and
- * emission on stderr.
- */
-
LWS_VISIBLE void lws_set_log_level(int level,
void (*func)(int level, const char *line))
{
lwsl_emit = func;
}
-/**
- * lws_use_ssl() - Find out if connection is using SSL
- * @wsi: websocket connection to check
- *
- * Returns 0 if the connection is not using SSL, 1 if using SSL and
- * using verified cert, and 2 if using SSL but the cert was not
- * checked (appears for client wsi told to skip check on connection)
- */
LWS_VISIBLE int
lws_is_ssl(struct lws *wsi)
{
#endif
}
-/**
- * lws_partial_buffered() - find out if lws buffered the last write
- * @wsi: websocket connection to check
- *
- * Returns 1 if you cannot use lws_write because the last
- * write on this connection is still buffered, and can't be cleared without
- * returning to the service loop and waiting for the connection to be
- * writeable again.
- *
- * If you will try to do >1 lws_write call inside a single
- * WRITEABLE callback, you must check this after every write and bail if
- * set, ask for a new writeable callback and continue writing from there.
- *
- * This is never set at the start of a writeable callback, but any write
- * may set it.
- */
-
LWS_VISIBLE int
lws_partial_buffered(struct lws *wsi)
{
return &context->fops;
}
-/**
- * lws_get_context - Allow geting lws_context from a Websocket connection
- * instance
- *
- * With this function, users can access context in the callback function.
- * Otherwise users may have to declare context as a global variable.
- *
- * @wsi: Websocket connection instance
- */
-
LWS_VISIBLE LWS_EXTERN struct lws_context *
lws_get_context(const struct lws *wsi)
{
return 0;
}
-/**
- * lws_parse_uri: cut up prot:/ads:port/path into pieces
- * Notice it does so by dropping '\0' into input string
- * and the leading / on the path is consequently lost
- *
- * @p: incoming uri string.. will get written to
- * @prot: result pointer for protocol part (https://)
- * @ads: result pointer for address part
- * @port: result pointer for port part
- * @path: result pointer for path part
- */
-
LWS_VISIBLE LWS_EXTERN int
lws_parse_uri(char *p, const char **prot, const char **ads, int *port,
const char **path)
static const char *hex = "0123456789ABCDEF";
-/**
- * lws_sql_purify() - like strncpy but with escaping for sql quotes
- *
- * @escaped: output buffer
- * @string: input buffer ('/0' terminated)
- * @len: output buffer max length
- *
- * Because escaping expands the output string, it's not
- * possible to do it in-place, ie, with escaped == string
- */
-
LWS_VISIBLE LWS_EXTERN const char *
lws_sql_purify(char *escaped, const char *string, int len)
{
return escaped;
}
-/**
- * lws_json_purify() - like strncpy but with escaping for json chars
- *
- * @escaped: output buffer
- * @string: input buffer ('/0' terminated)
- * @len: output buffer max length
- *
- * Because escaping expands the output string, it's not
- * possible to do it in-place, ie, with escaped == string
- */
-
LWS_VISIBLE LWS_EXTERN const char *
lws_json_purify(char *escaped, const char *string, int len)
{
return escaped;
}
-
-/**
- * lws_urlencode() - like strncpy but with urlencoding
- *
- * @escaped: output buffer
- * @string: input buffer ('/0' terminated)
- * @len: output buffer max length
- *
- * Because urlencoding expands the output string, it's not
- * possible to do it in-place, ie, with escaped == string
- */
-
LWS_VISIBLE LWS_EXTERN const char *
lws_urlencode(char *escaped, const char *string, int len)
{
return escaped;
}
-/**
- * lws_urldecode() - like strncpy but with urldecoding
- *
- * @string: output buffer
- * @escaped: input buffer ('\0' terminated)
- * @len: output buffer max length
- *
- * This is only useful for '\0' terminated strings
- *
- * Since urldecoding only shrinks the output string, it is possible to
- * do it in-place, ie, string == escaped
- */
-
LWS_VISIBLE LWS_EXTERN int
lws_urldecode(char *string, const char *escaped, int len)
{
return new_wsi;
}
-/**
- * lws_cgi: spawn network-connected cgi process
- *
- * @wsi: connection to own the process
- * @exec_array: array of "exec-name" "arg1" ... "argn" NULL
- */
-
LWS_VISIBLE LWS_EXTERN int
lws_cgi(struct lws *wsi, const char * const *exec_array, int script_uri_path_len,
int timeout_secs, const struct lws_protocol_vhost_options *mp_cgienv)
return -1;
}
-/**
- * lws_cgi_write_split_headers: write cgi output accounting for header part
- *
- * @wsi: connection to own the process
- */
+
LWS_VISIBLE LWS_EXTERN int
lws_cgi_write_split_stdout_headers(struct lws *wsi)
{
return 0;
}
-/**
- * lws_cgi_kill: terminate cgi process associated with wsi
- *
- * @wsi: connection to own the process
- */
LWS_VISIBLE LWS_EXTERN int
lws_cgi_kill(struct lws *wsi)
{
* MA 02110-1301 USA
*/
+/** @file */
+
#ifndef LIBWEBSOCKET_H_3060898B846849FF9F88F5DB59B5950C
#define LIBWEBSOCKET_H_3060898B846849FF9F88F5DB59B5950C
&lws_conn_listener::onError));
}
- void start(const uint16_t port);
+ void start(const uint16_t port); /**< start listening */
protected:
- void onRX(Socket *s);
- void onError(Socket *s, socket_error_t err);
- void onIncoming(TCPListener *s, void *impl);
- void onDisconnect(TCPStream *s);
+ void onRX(Socket *s); /**< incoming data ready */
+ void onError(Socket *s, socket_error_t err); /**< if error occurs */
+ void onIncoming(TCPListener *s, void *impl); /**< new connection */
+ void onDisconnect(TCPStream *s); /**< disconnection */
public:
TCPListener srv;
#if defined(LWS_USE_POLARSSL)
#include <polarssl/ssl.h>
struct lws_polarssl_context {
- x509_crt ca;
- x509_crt certificate;
- rsa_context key;
+ x509_crt ca; /**< ca */
+ x509_crt certificate; /**< cert */
+ rsa_context key; /**< key */
};
typedef struct lws_polarssl_context SSL_CTX;
typedef ssl_context SSL;
#define CONTEXT_PORT_NO_LISTEN -1
+/** \defgroup log Logging
+ *
+ * ##Logging
+ *
+ * Lws provides flexible and filterable logging facilities, which can be
+ * used inside lws and in user code.
+ *
+ * Log categories may be individually filtered bitwise, and directed to built-in
+ * sinks for syslog-compatible logging, or a user-defined function.
+ */
+///@{
+
enum lws_log_levels {
LLL_ERR = 1 << 0,
LLL_WARN = 1 << 1,
LWS_VISIBLE LWS_EXTERN void _lws_log(int filter, const char *format, ...);
LWS_VISIBLE LWS_EXTERN void _lws_logv(int filter, const char *format, va_list vl);
+/**
+ * lwsl_timestamp: generate logging timestamp string
+ *
+ * \param level: logging level
+ * \param p: char * buffer to take timestamp
+ * \param len: length of p
+ *
+ * returns length written in p
+ */
LWS_VISIBLE LWS_EXTERN int
lwsl_timestamp(int level, char *p, int len);
#define lwsl_ext(...) _lws_log(LLL_EXT, __VA_ARGS__)
#define lwsl_client(...) _lws_log(LLL_CLIENT, __VA_ARGS__)
#define lwsl_latency(...) _lws_log(LLL_LATENCY, __VA_ARGS__)
+/**
+ * lwsl_hexdump() - helper to hexdump a buffer (DEBUG builds only)
+ *
+ * \param buf: buffer start to dump
+ * \param len: length of buffer to dump
+ */
LWS_VISIBLE LWS_EXTERN void lwsl_hexdump(void *buf, size_t len);
#else /* no debug */
#endif
+/**
+ * lws_set_log_level() - Set the logging bitfield
+ * \param level: OR together the LLL_ debug contexts you want output from
+ * \param log_emit_function: NULL to leave it as it is, or a user-supplied
+ * function to perform log string emission instead of
+ * the default stderr one.
+ *
+ * log level defaults to "err", "warn" and "notice" contexts enabled and
+ * emission on stderr.
+ */
+LWS_VISIBLE LWS_EXTERN void
+lws_set_log_level(int level,
+ void (*log_emit_function)(int level, const char *line));
+
+/**
+ * lwsl_emit_syslog() - helper log emit function writes to system log
+ *
+ * \param level: one of LLL_ log level indexes
+ * \param line: log string
+ *
+ * You use this by passing the function pointer to lws_set_log_level(), to set
+ * it as the log emit function, it is not called directly.
+ */
+LWS_VISIBLE LWS_EXTERN void
+lwsl_emit_syslog(int level, const char *line);
+
+///@}
+
+
#include <stddef.h>
#ifndef lws_container_of
/* File operations stuff exists */
#define LWS_FEATURE_FOPS
+
+#if defined(_WIN32)
+typedef SOCKET lws_sockfd_type;
+typedef HANDLE lws_filefd_type;
+#define lws_sockfd_valid(sfd) (!!sfd)
+struct lws_pollfd {
+ lws_sockfd_type fd; /**< file descriptor */
+ SHORT events; /**< which events to respond to */
+ SHORT revents; /**< which events happened */
+};
+#else
+
+#if defined(MBED_OPERATORS)
+/* it's a class lws_conn * */
+typedef void * lws_sockfd_type;
+typedef void * lws_filefd_type;
+#define lws_sockfd_valid(sfd) (!!sfd)
+struct pollfd {
+ lws_sockfd_type fd; /**< fd related to */
+ short events; /**< which POLL... events to respond to */
+ short revents; /**< which POLL... events occurred */
+};
+#define POLLIN 0x0001
+#define POLLPRI 0x0002
+#define POLLOUT 0x0004
+#define POLLERR 0x0008
+#define POLLHUP 0x0010
+#define POLLNVAL 0x0020
+
+struct lws;
+
+void * mbed3_create_tcp_stream_socket(void);
+void mbed3_delete_tcp_stream_socket(void *sockfd);
+void mbed3_tcp_stream_bind(void *sock, int port, struct lws *);
+void mbed3_tcp_stream_accept(void *sock, struct lws *);
+#else
+typedef int lws_sockfd_type;
+typedef int lws_filefd_type;
+#define lws_sockfd_valid(sfd) (sfd >= 0)
+#endif
+
+#define lws_pollfd pollfd
+#endif
+
+/** struct lws_pollargs - argument structure for all external poll related calls
+ * passed in via 'in' */
+struct lws_pollargs {
+ lws_sockfd_type fd; /**< applicable socket descriptor */
+ int events; /**< the new event mask */
+ int prev_events; /**< the previous event mask */
+};
+
+struct lws_tokens;
+struct lws_token_limits;
+
+/*! \defgroup wsclose Websocket Close
+ *
+ * ##Websocket close frame control
+ *
+ * When we close a ws connection, we can send a reason code and a short
+ * UTF-8 description back with the close packet.
+ */
+///@{
+
/*
* NOTE: These public enums are part of the abi. If you want to add one,
* add it at where specified so existing users are unaffected.
*/
+/** enum lws_close_status - RFC6455 close status codes */
+enum lws_close_status {
+ LWS_CLOSE_STATUS_NOSTATUS = 0,
+ LWS_CLOSE_STATUS_NORMAL = 1000,
+ /**< 1000 indicates a normal closure, meaning that the purpose for
+ which the connection was established has been fulfilled. */
+ LWS_CLOSE_STATUS_GOINGAWAY = 1001,
+ /**< 1001 indicates that an endpoint is "going away", such as a server
+ going down or a browser having navigated away from a page. */
+ LWS_CLOSE_STATUS_PROTOCOL_ERR = 1002,
+ /**< 1002 indicates that an endpoint is terminating the connection due
+ to a protocol error. */
+ LWS_CLOSE_STATUS_UNACCEPTABLE_OPCODE = 1003,
+ /**< 1003 indicates that an endpoint is terminating the connection
+ because it has received a type of data it cannot accept (e.g., an
+ endpoint that understands only text data MAY send this if it
+ receives a binary message). */
+ LWS_CLOSE_STATUS_RESERVED = 1004,
+ /**< Reserved. The specific meaning might be defined in the future. */
+ LWS_CLOSE_STATUS_NO_STATUS = 1005,
+ /**< 1005 is a reserved value and MUST NOT be set as a status code in a
+ Close control frame by an endpoint. It is designated for use in
+ applications expecting a status code to indicate that no status
+ code was actually present. */
+ LWS_CLOSE_STATUS_ABNORMAL_CLOSE = 1006,
+ /**< 1006 is a reserved value and MUST NOT be set as a status code in a
+ Close control frame by an endpoint. It is designated for use in
+ applications expecting a status code to indicate that the
+ connection was closed abnormally, e.g., without sending or
+ receiving a Close control frame. */
+ LWS_CLOSE_STATUS_INVALID_PAYLOAD = 1007,
+ /**< 1007 indicates that an endpoint is terminating the connection
+ because it has received data within a message that was not
+ consistent with the type of the message (e.g., non-UTF-8 [RFC3629]
+ data within a text message). */
+ LWS_CLOSE_STATUS_POLICY_VIOLATION = 1008,
+ /**< 1008 indicates that an endpoint is terminating the connection
+ because it has received a message that violates its policy. This
+ is a generic status code that can be returned when there is no
+ other more suitable status code (e.g., 1003 or 1009) or if there
+ is a need to hide specific details about the policy. */
+ LWS_CLOSE_STATUS_MESSAGE_TOO_LARGE = 1009,
+ /**< 1009 indicates that an endpoint is terminating the connection
+ because it has received a message that is too big for it to
+ process. */
+ LWS_CLOSE_STATUS_EXTENSION_REQUIRED = 1010,
+ /**< 1010 indicates that an endpoint (client) is terminating the
+ connection because it has expected the server to negotiate one or
+ more extension, but the server didn't return them in the response
+ message of the WebSocket handshake. The list of extensions that
+ are needed SHOULD appear in the /reason/ part of the Close frame.
+ Note that this status code is not used by the server, because it
+ can fail the WebSocket handshake instead */
+ LWS_CLOSE_STATUS_UNEXPECTED_CONDITION = 1011,
+ /**< 1011 indicates that a server is terminating the connection because
+ it encountered an unexpected condition that prevented it from
+ fulfilling the request. */
+ LWS_CLOSE_STATUS_TLS_FAILURE = 1015,
+ /**< 1015 is a reserved value and MUST NOT be set as a status code in a
+ Close control frame by an endpoint. It is designated for use in
+ applications expecting a status code to indicate that the
+ connection was closed due to a failure to perform a TLS handshake
+ (e.g., the server certificate can't be verified). */
+
+ /****** add new things just above ---^ ******/
+ LWS_CLOSE_STATUS_NOSTATUS_CONTEXT_DESTROY = 9999,
+};
/**
- * enum lws_context_options() - context + vhost options
- *
- * LWS_SERVER_OPTION_REQUIRE_VALID_OPENSSL_CLIENT_CERT: (VH) Don't allow the
- * connection unless the client has a client cert that we recognize;
- * provides LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT
- *
- * LWS_SERVER_OPTION_SKIP_SERVER_CANONICAL_NAME: (CTX) Don't try to get the
- * server's hostname
- *
- * LWS_SERVER_OPTION_ALLOW_NON_SSL_ON_SSL_PORT: (VH) Allow non-SSL (plaintext)
- * connections on the same port as SSL is listening... undermines the
- * security of SSL; provides LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT
- *
- * LWS_SERVER_OPTION_LIBEV: (CTX) Use libev event loop
- *
- * LWS_SERVER_OPTION_DISABLE_IPV6: (VH) Disable IPV6 support
- *
- * LWS_SERVER_OPTION_DISABLE_OS_CA_CERTS: (VH) Don't load OS CA certs, you
- * will need to load your own CA cert(s)
- *
- * LWS_SERVER_OPTION_PEER_CERT_NOT_REQUIRED: (VH) Accept connections with no
- * valid Cert (eg, selfsigned)
- *
- * LWS_SERVER_OPTION_VALIDATE_UTF8: (VH) Check UT-8 correctness
- *
- * LWS_SERVER_OPTION_SSL_ECDH: (VH) initialize ECDH ciphers
- *
- * LWS_SERVER_OPTION_LIBUV: (CTX) Use libuv event loop
- *
- * LWS_SERVER_OPTION_REDIRECT_HTTP_TO_HTTPS: (VH) Use http redirect to force
- * http to https (deprecated: use mount redirection)
- *
- * LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT: (CTX) Initialize the SSL library
- * at all
- *
- * LWS_SERVER_OPTION_EXPLICIT_VHOSTS: (CTX) Only create the context when
- * calling context create api, user code will create its own vhosts
+ * lws_close_reason - Set reason and aux data to send with Close packet
+ * If you are going to return nonzero from the callback
+ * requesting the connection to close, you can optionally
+ * call this to set the reason the peer will be told if
+ * possible.
*
- * LWS_SERVER_OPTION_UNIX_SOCK: (VH) Use Unix socket
+ * \param wsi: The websocket connection to set the close reason on
+ * \param status: A valid close status from websocket standard
+ * \param buf: NULL or buffer containing up to 124 bytes of auxiliary data
+ * \param len: Length of data in \param buf to send
+ */
+LWS_VISIBLE LWS_EXTERN void
+lws_close_reason(struct lws *wsi, enum lws_close_status status,
+ unsigned char *buf, size_t len);
+
+///@}
+
+struct lws;
+struct lws_context;
+/* needed even with extensions disabled for create context */
+struct lws_extension;
+
+/*! \defgroup usercb User Callback
*
- * LWS_SERVER_OPTION_STS: (VH) Send Strict Transport Security header, making
- * clients subsequently go to https even if user asked for http
+ * ##User protocol callback
*
- * LWS_SERVER_OPTION_IPV6_V6ONLY_MODIFY: (VH) Enable
- * LWS_SERVER_OPTION_IPV6_V6ONLY_VALUE to take effect
+ * The protocol callback is the primary way lws interacts with
+ * user code. For one of a list of a few dozen reasons the callback gets
+ * called at some event to be handled.
*
- * LWS_SERVER_OPTION_IPV6_V6ONLY_VALUE: (VH) if set, only ipv6 allowed on the
- * vhost
+ * All of the events can be ignored, returning 0 is taken as "OK" and returning
+ * nonzero in most cases indicates that the connection should be closed.
*/
-enum lws_context_options {
- LWS_SERVER_OPTION_REQUIRE_VALID_OPENSSL_CLIENT_CERT = (1 << 1) |
- (1 << 12),
- LWS_SERVER_OPTION_SKIP_SERVER_CANONICAL_NAME = (1 << 2),
- LWS_SERVER_OPTION_ALLOW_NON_SSL_ON_SSL_PORT = (1 << 3) |
- (1 << 12),
- LWS_SERVER_OPTION_LIBEV = (1 << 4),
- LWS_SERVER_OPTION_DISABLE_IPV6 = (1 << 5),
- LWS_SERVER_OPTION_DISABLE_OS_CA_CERTS = (1 << 6),
- LWS_SERVER_OPTION_PEER_CERT_NOT_REQUIRED = (1 << 7),
- LWS_SERVER_OPTION_VALIDATE_UTF8 = (1 << 8),
- LWS_SERVER_OPTION_SSL_ECDH = (1 << 9) |
- (1 << 12),
- LWS_SERVER_OPTION_LIBUV = (1 << 10),
- LWS_SERVER_OPTION_REDIRECT_HTTP_TO_HTTPS = (1 << 11) |
- (1 << 3) |
- (1 << 12),
- LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT = (1 << 12),
- LWS_SERVER_OPTION_EXPLICIT_VHOSTS = (1 << 13),
- LWS_SERVER_OPTION_UNIX_SOCK = (1 << 14),
- LWS_SERVER_OPTION_STS = (1 << 15),
- LWS_SERVER_OPTION_IPV6_V6ONLY_MODIFY = (1 << 16),
- LWS_SERVER_OPTION_IPV6_V6ONLY_VALUE = (1 << 17),
-
- /****** add new things just above ---^ ******/
-};
+///@{
-#define lws_check_opt(c, f) (((c) & (f)) == (f))
/*
* NOTE: These public enums are part of the abi. If you want to add one,
* add it at where specified so existing users are unaffected.
*/
+/** enum lws_callback_reasons - reason you're getting a protocol callback */
enum lws_callback_reasons {
LWS_CALLBACK_ESTABLISHED = 0,
+ /**< (VH) after the server completes a handshake with an incoming
+ * client. If you built the library with ssl support, in is a
+ * pointer to the ssl struct associated with the connection or NULL.*/
LWS_CALLBACK_CLIENT_CONNECTION_ERROR = 1,
+ /**< the request client connection has been unable to complete a
+ * handshake with the remote server. If in is non-NULL, you can
+ * find an error string of length len where it points to. */
LWS_CALLBACK_CLIENT_FILTER_PRE_ESTABLISH = 2,
+ /**< this is the last chance for the client user code to examine the
+ * http headers and decide to reject the connection. If the
+ * content in the headers is interesting to the
+ * client (url, etc) it needs to copy it out at
+ * this point since it will be destroyed before
+ * the CLIENT_ESTABLISHED call */
LWS_CALLBACK_CLIENT_ESTABLISHED = 3,
+ /**< after your client connection completed
+ * a handshake with the remote server */
LWS_CALLBACK_CLOSED = 4,
+ /**< when the websocket session ends */
LWS_CALLBACK_CLOSED_HTTP = 5,
+ /**< when a HTTP (non-websocket) session ends */
LWS_CALLBACK_RECEIVE = 6,
+ /**< data has appeared for this server endpoint from a
+ * remote client, it can be found at *in and is
+ * len bytes long */
LWS_CALLBACK_RECEIVE_PONG = 7,
+ /**< servers receive PONG packets with this callback reason */
LWS_CALLBACK_CLIENT_RECEIVE = 8,
+ /**< data has appeared from the server for the client connection, it
+ * can be found at *in and is len bytes long */
LWS_CALLBACK_CLIENT_RECEIVE_PONG = 9,
+ /**< clients receive PONG packets with this callback reason */
LWS_CALLBACK_CLIENT_WRITEABLE = 10,
+ /**< If you call lws_callback_on_writable() on a connection, you will
+ * get one of these callbacks coming when the connection socket
+ * is able to accept another write packet without blocking.
+ * If it already was able to take another packet without blocking,
+ * you'll get this callback at the next call to the service loop
+ * function. Notice that CLIENTs get LWS_CALLBACK_CLIENT_WRITEABLE
+ * and servers get LWS_CALLBACK_SERVER_WRITEABLE. */
LWS_CALLBACK_SERVER_WRITEABLE = 11,
+ /**< See LWS_CALLBACK_CLIENT_WRITEABLE */
LWS_CALLBACK_HTTP = 12,
+ /**< an http request has come from a client that is not
+ * asking to upgrade the connection to a websocket
+ * one. This is a chance to serve http content,
+ * for example, to send a script to the client
+ * which will then open the websockets connection.
+ * in points to the URI path requested and
+ * lws_serve_http_file() makes it very
+ * simple to send back a file to the client.
+ * Normally after sending the file you are done
+ * with the http connection, since the rest of the
+ * activity will come by websockets from the script
+ * that was delivered by http, so you will want to
+ * return 1; to close and free up the connection. */
LWS_CALLBACK_HTTP_BODY = 13,
+ /**< the next len bytes data from the http
+ * request body HTTP connection is now available in in. */
LWS_CALLBACK_HTTP_BODY_COMPLETION = 14,
+ /**< the expected amount of http request body has been delivered */
LWS_CALLBACK_HTTP_FILE_COMPLETION = 15,
+ /**< a file requested to be sent down http link has completed. */
LWS_CALLBACK_HTTP_WRITEABLE = 16,
+ /**< you can write more down the http protocol link now. */
LWS_CALLBACK_FILTER_NETWORK_CONNECTION = 17,
+ /**< called when a client connects to
+ * the server at network level; the connection is accepted but then
+ * passed to this callback to decide whether to hang up immediately
+ * or not, based on the client IP. in contains the connection
+ * socket's descriptor. Since the client connection information is
+ * not available yet, wsi still pointing to the main server socket.
+ * Return non-zero to terminate the connection before sending or
+ * receiving anything. Because this happens immediately after the
+ * network connection from the client, there's no websocket protocol
+ * selected yet so this callback is issued only to protocol 0. */
LWS_CALLBACK_FILTER_HTTP_CONNECTION = 18,
+ /**< called when the request has
+ * been received and parsed from the client, but the response is
+ * not sent yet. Return non-zero to disallow the connection.
+ * user is a pointer to the connection user space allocation,
+ * in is the URI, eg, "/"
+ * In your handler you can use the public APIs
+ * lws_hdr_total_length() / lws_hdr_copy() to access all of the
+ * headers using the header enums lws_token_indexes from
+ * libwebsockets.h to check for and read the supported header
+ * presence and content before deciding to allow the http
+ * connection to proceed or to kill the connection. */
LWS_CALLBACK_SERVER_NEW_CLIENT_INSTANTIATED = 19,
+ /**< A new client just had
+ * been connected, accepted, and instantiated into the pool. This
+ * callback allows setting any relevant property to it. Because this
+ * happens immediately after the instantiation of a new client,
+ * there's no websocket protocol selected yet so this callback is
+ * issued only to protocol 0. Only wsi is defined, pointing to the
+ * new client, and the return value is ignored. */
LWS_CALLBACK_FILTER_PROTOCOL_CONNECTION = 20,
+ /**< called when the handshake has
+ * been received and parsed from the client, but the response is
+ * not sent yet. Return non-zero to disallow the connection.
+ * user is a pointer to the connection user space allocation,
+ * in is the requested protocol name
+ * In your handler you can use the public APIs
+ * lws_hdr_total_length() / lws_hdr_copy() to access all of the
+ * headers using the header enums lws_token_indexes from
+ * libwebsockets.h to check for and read the supported header
+ * presence and content before deciding to allow the handshake
+ * to proceed or to kill the connection. */
LWS_CALLBACK_OPENSSL_LOAD_EXTRA_CLIENT_VERIFY_CERTS = 21,
+ /**< if configured for
+ * including OpenSSL support, this callback allows your user code
+ * to perform extra SSL_CTX_load_verify_locations() or similar
+ * calls to direct OpenSSL where to find certificates the client
+ * can use to confirm the remote server identity. user is the
+ * OpenSSL SSL_CTX* */
LWS_CALLBACK_OPENSSL_LOAD_EXTRA_SERVER_VERIFY_CERTS = 22,
+ /**< if configured for
+ * including OpenSSL support, this callback allows your user code
+ * to load extra certifcates into the server which allow it to
+ * verify the validity of certificates returned by clients. user
+ * is the server's OpenSSL SSL_CTX* */
LWS_CALLBACK_OPENSSL_PERFORM_CLIENT_CERT_VERIFICATION = 23,
+ /**< if the libwebsockets vhost was created with the option
+ * LWS_SERVER_OPTION_REQUIRE_VALID_OPENSSL_CLIENT_CERT, then this
+ * callback is generated during OpenSSL verification of the cert
+ * sent from the client. It is sent to protocol[0] callback as
+ * no protocol has been negotiated on the connection yet.
+ * Notice that the libwebsockets context and wsi are both NULL
+ * during this callback. See
+ * http://www.openssl.org/docs/ssl/SSL_CTX_set_verify.html
+ * to understand more detail about the OpenSSL callback that
+ * generates this libwebsockets callback and the meanings of the
+ * arguments passed. In this callback, user is the x509_ctx,
+ * in is the ssl pointer and len is preverify_ok
+ * Notice that this callback maintains libwebsocket return
+ * conventions, return 0 to mean the cert is OK or 1 to fail it.
+ * This also means that if you don't handle this callback then
+ * the default callback action of returning 0 allows the client
+ * certificates. */
LWS_CALLBACK_CLIENT_APPEND_HANDSHAKE_HEADER = 24,
+ /**< this callback happens
+ * when a client handshake is being compiled. user is NULL,
+ * in is a char **, it's pointing to a char * which holds the
+ * next location in the header buffer where you can add
+ * headers, and len is the remaining space in the header buffer,
+ * which is typically some hundreds of bytes. So, to add a canned
+ * cookie, your handler code might look similar to:
+ *
+ * char **p = (char **)in;
+ *
+ * if (len < 100)
+ * return 1;
+ *
+ * *p += sprintf(*p, "Cookie: a=b\x0d\x0a");
+ *
+ * return 0;
+ *
+ * Notice if you add anything, you just have to take care about
+ * the CRLF on the line you added. Obviously this callback is
+ * optional, if you don't handle it everything is fine.
+ *
+ * Notice the callback is coming to protocols[0] all the time,
+ * because there is no specific protocol negotiated yet. */
LWS_CALLBACK_CONFIRM_EXTENSION_OKAY = 25,
+ /**< When the server handshake code
+ * sees that it does support a requested extension, before
+ * accepting the extension by additing to the list sent back to
+ * the client it gives this callback just to check that it's okay
+ * to use that extension. It calls back to the requested protocol
+ * and with in being the extension name, len is 0 and user is
+ * valid. Note though at this time the ESTABLISHED callback hasn't
+ * happened yet so if you initialize user content there, user
+ * content during this callback might not be useful for anything.
+ * Notice this callback comes to protocols[0]. */
LWS_CALLBACK_CLIENT_CONFIRM_EXTENSION_SUPPORTED = 26,
+ /**< When a client
+ * connection is being prepared to start a handshake to a server,
+ * each supported extension is checked with protocols[0] callback
+ * with this reason, giving the user code a chance to suppress the
+ * claim to support that extension by returning non-zero. If
+ * unhandled, by default 0 will be returned and the extension
+ * support included in the header to the server. Notice this
+ * callback comes to protocols[0]. */
LWS_CALLBACK_PROTOCOL_INIT = 27,
+ /**< One-time call per protocol, per-vhost using it, so it can
+ * do initial setup / allocations etc */
LWS_CALLBACK_PROTOCOL_DESTROY = 28,
- LWS_CALLBACK_WSI_CREATE /* always protocol[0] */ = 29,
- LWS_CALLBACK_WSI_DESTROY /* always protocol[0] */ = 30,
+ /**< One-time call per protocol, per-vhost using it, indicating
+ * this protocol won't get used at all after this callback, the
+ * vhost is getting destroyed. Take the opportunity to
+ * deallocate everything that was allocated by the protocol. */
+ LWS_CALLBACK_WSI_CREATE = 29,
+ /**< outermost (earliest) wsi create notification to protocols[0] */
+ LWS_CALLBACK_WSI_DESTROY = 30,
+ /**< outermost (latest) wsi destroy notification to protocols[0] */
LWS_CALLBACK_GET_THREAD_ID = 31,
+ /**< lws can accept callback when writable requests from other
+ * threads, if you implement this callback and return an opaque
+ * current thread ID integer. */
/* external poll() management support */
LWS_CALLBACK_ADD_POLL_FD = 32,
+ /**< lws normally deals with its poll() or other event loop
+ * internally, but in the case you are integrating with another
+ * server you will need to have lws sockets share a
+ * polling array with the other server. This and the other
+ * POLL_FD related callbacks let you put your specialized
+ * poll array interface code in the callback for protocol 0, the
+ * first protocol you support, usually the HTTP protocol in the
+ * serving case.
+ * This callback happens when a socket needs to be
+ * added to the polling loop: in points to a struct
+ * lws_pollargs; the fd member of the struct is the file
+ * descriptor, and events contains the active events
+ *
+ * If you are using the internal lws polling / event loop
+ * you can just ignore these callbacks. */
LWS_CALLBACK_DEL_POLL_FD = 33,
+ /**< This callback happens when a socket descriptor
+ * needs to be removed from an external polling array. in is
+ * again the struct lws_pollargs containing the fd member
+ * to be removed. If you are using the internal polling
+ * loop, you can just ignore it. */
LWS_CALLBACK_CHANGE_MODE_POLL_FD = 34,
+ /**< This callback happens when lws wants to modify the events for
+ * a connection.
+ * in is the struct lws_pollargs with the fd to change.
+ * The new event mask is in events member and the old mask is in
+ * the prev_events member.
+ * If you are using the internal polling loop, you can just ignore
+ * it. */
LWS_CALLBACK_LOCK_POLL = 35,
+ /**< These allow the external poll changes driven
+ * by lws to participate in an external thread locking
+ * scheme around the changes, so the whole thing is threadsafe.
+ * These are called around three activities in the library,
+ * - inserting a new wsi in the wsi / fd table (len=1)
+ * - deleting a wsi from the wsi / fd table (len=1)
+ * - changing a wsi's POLLIN/OUT state (len=0)
+ * Locking and unlocking external synchronization objects when
+ * len == 1 allows external threads to be synchronized against
+ * wsi lifecycle changes if it acquires the same lock for the
+ * duration of wsi dereference from the other thread context. */
LWS_CALLBACK_UNLOCK_POLL = 36,
+ /**< See LWS_CALLBACK_LOCK_POLL, ignore if using lws internal poll */
LWS_CALLBACK_OPENSSL_CONTEXT_REQUIRES_PRIVATE_KEY = 37,
+ /**< if configured for including OpenSSL support but no private key
+ * file has been specified (ssl_private_key_filepath is NULL), this is
+ * called to allow the user to set the private key directly via
+ * libopenssl and perform further operations if required; this might be
+ * useful in situations where the private key is not directly accessible
+ * by the OS, for example if it is stored on a smartcard.
+ * user is the server's OpenSSL SSL_CTX* */
LWS_CALLBACK_WS_PEER_INITIATED_CLOSE = 38,
+ /**< The peer has sent an unsolicited Close WS packet. in and
+ * len are the optional close code (first 2 bytes, network
+ * order) and the optional additional information which is not
+ * defined in the standard, and may be a string or non-human- readable data.
+ * If you return 0 lws will echo the close and then close the
+ * connection. If you return nonzero lws will just close the
+ * connection. */
LWS_CALLBACK_WS_EXT_DEFAULTS = 39,
+ /**< */
LWS_CALLBACK_CGI = 40,
+ /**< */
LWS_CALLBACK_CGI_TERMINATED = 41,
+ /**< */
LWS_CALLBACK_CGI_STDIN_DATA = 42,
+ /**< */
LWS_CALLBACK_CGI_STDIN_COMPLETED = 43,
+ /**< */
LWS_CALLBACK_ESTABLISHED_CLIENT_HTTP = 44,
+ /**< */
LWS_CALLBACK_CLOSED_CLIENT_HTTP = 45,
+ /**< */
LWS_CALLBACK_RECEIVE_CLIENT_HTTP = 46,
+ /**< */
LWS_CALLBACK_COMPLETED_CLIENT_HTTP = 47,
+ /**< */
LWS_CALLBACK_RECEIVE_CLIENT_HTTP_READ = 48,
+ /**< */
LWS_CALLBACK_HTTP_BIND_PROTOCOL = 49,
+ /**< */
LWS_CALLBACK_HTTP_DROP_PROTOCOL = 50,
+ /**< */
LWS_CALLBACK_CHECK_ACCESS_RIGHTS = 51,
+ /**< */
LWS_CALLBACK_PROCESS_HTML = 52,
+ /**< */
LWS_CALLBACK_ADD_HEADERS = 53,
+ /**< */
LWS_CALLBACK_SESSION_INFO = 54,
+ /**< */
LWS_CALLBACK_GS_EVENT = 55,
+ /**< */
/****** add new things just above ---^ ******/
- LWS_CALLBACK_USER = 1000, /* user code can use any including / above */
-};
-
-
-#if defined(_WIN32)
-typedef SOCKET lws_sockfd_type;
-typedef HANDLE lws_filefd_type;
-#define lws_sockfd_valid(sfd) (!!sfd)
-struct lws_pollfd {
- lws_sockfd_type fd;
- SHORT events;
- SHORT revents;
-};
-#else
-
-#if defined(MBED_OPERATORS)
-/* it's a class lws_conn * */
-typedef void * lws_sockfd_type;
-typedef void * lws_filefd_type;
-#define lws_sockfd_valid(sfd) (!!sfd)
-struct pollfd {
- lws_sockfd_type fd;
- short events;
- short revents;
+ LWS_CALLBACK_USER = 1000,
+ /**< user code can use any including / above without fear of clashes */
};
-#define POLLIN 0x0001
-#define POLLPRI 0x0002
-#define POLLOUT 0x0004
-#define POLLERR 0x0008
-#define POLLHUP 0x0010
-#define POLLNVAL 0x0020
-
-struct lws;
-
-void * mbed3_create_tcp_stream_socket(void);
-void mbed3_delete_tcp_stream_socket(void *sockfd);
-void mbed3_tcp_stream_bind(void *sock, int port, struct lws *);
-void mbed3_tcp_stream_accept(void *sock, struct lws *);
-#else
-typedef int lws_sockfd_type;
-typedef int lws_filefd_type;
-#define lws_sockfd_valid(sfd) (sfd >= 0)
-#endif
-#define lws_pollfd pollfd
-#endif
-/* argument structure for all external poll related calls
- * passed in via 'in'
- */
-struct lws_pollargs {
- lws_sockfd_type fd; /* applicable socket descriptor */
- int events; /* the new event mask */
- int prev_events; /* the previous event mask */
-};
/**
- * struct lws_plat_file_ops - Platform-specific file operations
+ * typedef lws_callback_function() - User server actions
+ * \param wsi: Opaque websocket instance pointer
+ * \param reason: The reason for the call
+ * \param user: Pointer to per-session user data allocated by library
+ * \param in: Pointer used for some callback reasons
+ * \param len: Length set for some callback reasons
*
- * These provide platform-agnostic ways to deal with filesystem access in the
- * library and in the user code.
+ * This callback is the way the user controls what is served. All the
+ * protocol detail is hidden and handled by the library.
*
- * @open: Open file (always binary access if plat supports it)
- * filelen is filled on exit to be the length of the file
- * flags should be set to O_RDONLY or O_RDWR
- * @close: Close file
- * @seek_cur: Seek from current position
- * @read: Read fron file *amount is set on exit to amount read
- * @write: Write to file *amount is set on exit as amount written
+ * For each connection / session there is user data allocated that is
+ * pointed to by "user". You set the size of this user data area when
+ * the library is initialized with lws_create_server.
*/
-struct lws_plat_file_ops {
- lws_filefd_type (*open)(struct lws *wsi, const char *filename,
- unsigned long *filelen, int flags);
- int (*close)(struct lws *wsi, lws_filefd_type fd);
- unsigned long (*seek_cur)(struct lws *wsi, lws_filefd_type fd,
- long offset_from_cur_pos);
- int (*read)(struct lws *wsi, lws_filefd_type fd, unsigned long *amount,
- unsigned char *buf, unsigned long len);
- int (*write)(struct lws *wsi, lws_filefd_type fd, unsigned long *amount,
- unsigned char *buf, unsigned long len);
+typedef int
+lws_callback_function(struct lws *wsi, enum lws_callback_reasons reason,
+ void *user, void *in, size_t len);
+///@}
- /* Add new things just above here ---^
- * This is part of the ABI, don't needlessly break compatibility */
-};
+/*! \defgroup extensions
+ *
+ * ##Extension releated functions
+ *
+ * Ws defines optional extensions, lws provides the ability to implement these
+ * in user code if so desired.
+ *
+ * We provide one extensions permessage-deflate.
+ */
+///@{
/*
* NOTE: These public enums are part of the abi. If you want to add one,
/****** add new things just above ---^ ******/
};
-/*
- * NOTE: These public enums are part of the abi. If you want to add one,
- * add it at where specified so existing users are unaffected.
- */
-enum lws_write_protocol {
- LWS_WRITE_TEXT = 0,
- LWS_WRITE_BINARY = 1,
- LWS_WRITE_CONTINUATION = 2,
- LWS_WRITE_HTTP = 3,
-
- /* special 04+ opcodes */
-
- /* LWS_WRITE_CLOSE is handled by lws_close_reason() */
- LWS_WRITE_PING = 5,
- LWS_WRITE_PONG = 6,
-
- /* Same as write_http but we know this write ends the transaction */
- LWS_WRITE_HTTP_FINAL = 7,
-
- /* HTTP2 */
-
- LWS_WRITE_HTTP_HEADERS = 8,
-
- /****** add new things just above ---^ ******/
-
- /* flags */
-
- LWS_WRITE_NO_FIN = 0x40,
- /*
- * client packet payload goes out on wire unmunged
- * only useful for security tests since normal servers cannot
- * decode the content if used
- */
- LWS_WRITE_CLIENT_IGNORE_XOR_MASK = 0x80
-};
-
-/*
- * you need these to look at headers that have been parsed if using the
- * LWS_CALLBACK_FILTER_CONNECTION callback. If a header from the enum
- * list below is absent, .token = NULL and token_len = 0. Otherwise .token
- * points to .token_len chars containing that header content.
- */
-
-struct lws_tokens {
- char *token;
- int token_len;
-};
-
-/*
- * these have to be kept in sync with lextable.h / minilex.c
- *
- * NOTE: These public enums are part of the abi. If you want to add one,
- * add it at where specified so existing users are unaffected.
- */
-enum lws_token_indexes {
- WSI_TOKEN_GET_URI = 0,
- WSI_TOKEN_POST_URI = 1,
- WSI_TOKEN_OPTIONS_URI = 2,
- WSI_TOKEN_HOST = 3,
- WSI_TOKEN_CONNECTION = 4,
- WSI_TOKEN_UPGRADE = 5,
- WSI_TOKEN_ORIGIN = 6,
- WSI_TOKEN_DRAFT = 7,
- WSI_TOKEN_CHALLENGE = 8,
- WSI_TOKEN_EXTENSIONS = 9,
- WSI_TOKEN_KEY1 = 10,
- WSI_TOKEN_KEY2 = 11,
- WSI_TOKEN_PROTOCOL = 12,
- WSI_TOKEN_ACCEPT = 13,
- WSI_TOKEN_NONCE = 14,
- WSI_TOKEN_HTTP = 15,
- WSI_TOKEN_HTTP2_SETTINGS = 16,
- WSI_TOKEN_HTTP_ACCEPT = 17,
- WSI_TOKEN_HTTP_AC_REQUEST_HEADERS = 18,
- WSI_TOKEN_HTTP_IF_MODIFIED_SINCE = 19,
- WSI_TOKEN_HTTP_IF_NONE_MATCH = 20,
- WSI_TOKEN_HTTP_ACCEPT_ENCODING = 21,
- WSI_TOKEN_HTTP_ACCEPT_LANGUAGE = 22,
- WSI_TOKEN_HTTP_PRAGMA = 23,
- WSI_TOKEN_HTTP_CACHE_CONTROL = 24,
- WSI_TOKEN_HTTP_AUTHORIZATION = 25,
- WSI_TOKEN_HTTP_COOKIE = 26,
- WSI_TOKEN_HTTP_CONTENT_LENGTH = 27,
- WSI_TOKEN_HTTP_CONTENT_TYPE = 28,
- WSI_TOKEN_HTTP_DATE = 29,
- WSI_TOKEN_HTTP_RANGE = 30,
- WSI_TOKEN_HTTP_REFERER = 31,
- WSI_TOKEN_KEY = 32,
- WSI_TOKEN_VERSION = 33,
- WSI_TOKEN_SWORIGIN = 34,
-
- WSI_TOKEN_HTTP_COLON_AUTHORITY = 35,
- WSI_TOKEN_HTTP_COLON_METHOD = 36,
- WSI_TOKEN_HTTP_COLON_PATH = 37,
- WSI_TOKEN_HTTP_COLON_SCHEME = 38,
- WSI_TOKEN_HTTP_COLON_STATUS = 39,
-
- WSI_TOKEN_HTTP_ACCEPT_CHARSET = 40,
- WSI_TOKEN_HTTP_ACCEPT_RANGES = 41,
- WSI_TOKEN_HTTP_ACCESS_CONTROL_ALLOW_ORIGIN = 42,
- WSI_TOKEN_HTTP_AGE = 43,
- WSI_TOKEN_HTTP_ALLOW = 44,
- WSI_TOKEN_HTTP_CONTENT_DISPOSITION = 45,
- WSI_TOKEN_HTTP_CONTENT_ENCODING = 46,
- WSI_TOKEN_HTTP_CONTENT_LANGUAGE = 47,
- WSI_TOKEN_HTTP_CONTENT_LOCATION = 48,
- WSI_TOKEN_HTTP_CONTENT_RANGE = 49,
- WSI_TOKEN_HTTP_ETAG = 50,
- WSI_TOKEN_HTTP_EXPECT = 51,
- WSI_TOKEN_HTTP_EXPIRES = 52,
- WSI_TOKEN_HTTP_FROM = 53,
- WSI_TOKEN_HTTP_IF_MATCH = 54,
- WSI_TOKEN_HTTP_IF_RANGE = 55,
- WSI_TOKEN_HTTP_IF_UNMODIFIED_SINCE = 56,
- WSI_TOKEN_HTTP_LAST_MODIFIED = 57,
- WSI_TOKEN_HTTP_LINK = 58,
- WSI_TOKEN_HTTP_LOCATION = 59,
- WSI_TOKEN_HTTP_MAX_FORWARDS = 60,
- WSI_TOKEN_HTTP_PROXY_AUTHENTICATE = 61,
- WSI_TOKEN_HTTP_PROXY_AUTHORIZATION = 62,
- WSI_TOKEN_HTTP_REFRESH = 63,
- WSI_TOKEN_HTTP_RETRY_AFTER = 64,
- WSI_TOKEN_HTTP_SERVER = 65,
- WSI_TOKEN_HTTP_SET_COOKIE = 66,
- WSI_TOKEN_HTTP_STRICT_TRANSPORT_SECURITY = 67,
- WSI_TOKEN_HTTP_TRANSFER_ENCODING = 68,
- WSI_TOKEN_HTTP_USER_AGENT = 69,
- WSI_TOKEN_HTTP_VARY = 70,
- WSI_TOKEN_HTTP_VIA = 71,
- WSI_TOKEN_HTTP_WWW_AUTHENTICATE = 72,
-
- WSI_TOKEN_PATCH_URI = 73,
- WSI_TOKEN_PUT_URI = 74,
- WSI_TOKEN_DELETE_URI = 75,
-
- WSI_TOKEN_HTTP_URI_ARGS = 76,
- WSI_TOKEN_PROXY = 77,
- WSI_TOKEN_HTTP_X_REAL_IP = 78,
- WSI_TOKEN_HTTP1_0 = 79,
-
- /****** add new things just above ---^ ******/
-
- /* use token storage to stash these internally, not for
- * user use */
-
- _WSI_TOKEN_CLIENT_SENT_PROTOCOLS,
- _WSI_TOKEN_CLIENT_PEER_ADDRESS,
- _WSI_TOKEN_CLIENT_URI,
- _WSI_TOKEN_CLIENT_HOST,
- _WSI_TOKEN_CLIENT_ORIGIN,
- _WSI_TOKEN_CLIENT_METHOD,
-
- /* always last real token index*/
- WSI_TOKEN_COUNT,
-
- /* parser state additions, no storage associated */
- WSI_TOKEN_NAME_PART,
- WSI_TOKEN_SKIPPING,
- WSI_TOKEN_SKIPPING_SAW_CR,
- WSI_PARSING_COMPLETE,
- WSI_INIT_TOKEN_MUXURL,
-};
+/** enum lws_ext_options_types */
+enum lws_ext_options_types {
+ EXTARG_NONE, /**< does not take an argument */
+ EXTARG_DEC, /**< requires a decimal argument */
+ EXTARG_OPT_DEC /**< may have an optional decimal argument */
-struct lws_token_limits {
- unsigned short token_limit[WSI_TOKEN_COUNT];
+ /* Add new things just above here ---^
+ * This is part of the ABI, don't needlessly break compatibility */
};
-/*
- * From RFC 6455
- 1000
-
- 1000 indicates a normal closure, meaning that the purpose for
- which the connection was established has been fulfilled.
-
- 1001
-
- 1001 indicates that an endpoint is "going away", such as a server
- going down or a browser having navigated away from a page.
-
- 1002
-
- 1002 indicates that an endpoint is terminating the connection due
- to a protocol error.
-
- 1003
-
- 1003 indicates that an endpoint is terminating the connection
- because it has received a type of data it cannot accept (e.g., an
- endpoint that understands only text data MAY send this if it
- receives a binary message).
-
- 1004
-
- Reserved. The specific meaning might be defined in the future.
-
- 1005
-
- 1005 is a reserved value and MUST NOT be set as a status code in a
- Close control frame by an endpoint. It is designated for use in
- applications expecting a status code to indicate that no status
- code was actually present.
-
- 1006
-
- 1006 is a reserved value and MUST NOT be set as a status code in a
- Close control frame by an endpoint. It is designated for use in
- applications expecting a status code to indicate that the
- connection was closed abnormally, e.g., without sending or
- receiving a Close control frame.
-
- 1007
-
- 1007 indicates that an endpoint is terminating the connection
- because it has received data within a message that was not
- consistent with the type of the message (e.g., non-UTF-8 [RFC3629]
- data within a text message).
-
- 1008
-
- 1008 indicates that an endpoint is terminating the connection
- because it has received a message that violates its policy. This
- is a generic status code that can be returned when there is no
- other more suitable status code (e.g., 1003 or 1009) or if there
- is a need to hide specific details about the policy.
-
- 1009
-
- 1009 indicates that an endpoint is terminating the connection
- because it has received a message that is too big for it to
- process.
-
- 1010
-
- 1010 indicates that an endpoint (client) is terminating the
- connection because it has expected the server to negotiate one or
- more extension, but the server didn't return them in the response
- message of the WebSocket handshake. The list of extensions that
- are needed SHOULD appear in the /reason/ part of the Close frame.
- Note that this status code is not used by the server, because it
- can fail the WebSocket handshake instead.
-
- 1011
-
- 1011 indicates that a server is terminating the connection because
- it encountered an unexpected condition that prevented it from
- fulfilling the request.
-
- 1015
-
- 1015 is a reserved value and MUST NOT be set as a status code in a
- Close control frame by an endpoint. It is designated for use in
- applications expecting a status code to indicate that the
- connection was closed due to a failure to perform a TLS handshake
- (e.g., the server certificate can't be verified).
-*/
-
-/*
- * NOTE: These public enums are part of the abi. If you want to add one,
- * add it at where specified so existing users are unaffected.
- */
-enum lws_close_status {
- LWS_CLOSE_STATUS_NOSTATUS = 0,
- LWS_CLOSE_STATUS_NORMAL = 1000,
- LWS_CLOSE_STATUS_GOINGAWAY = 1001,
- LWS_CLOSE_STATUS_PROTOCOL_ERR = 1002,
- LWS_CLOSE_STATUS_UNACCEPTABLE_OPCODE = 1003,
- LWS_CLOSE_STATUS_RESERVED = 1004,
- LWS_CLOSE_STATUS_NO_STATUS = 1005,
- LWS_CLOSE_STATUS_ABNORMAL_CLOSE = 1006,
- LWS_CLOSE_STATUS_INVALID_PAYLOAD = 1007,
- LWS_CLOSE_STATUS_POLICY_VIOLATION = 1008,
- LWS_CLOSE_STATUS_MESSAGE_TOO_LARGE = 1009,
- LWS_CLOSE_STATUS_EXTENSION_REQUIRED = 1010,
- LWS_CLOSE_STATUS_UNEXPECTED_CONDITION = 1011,
- LWS_CLOSE_STATUS_TLS_FAILURE = 1015,
-
- /****** add new things just above ---^ ******/
+/** struct lws_ext_options - Option arguments to the extension. These are
+ * used in the negotiation at ws upgrade time.
+ * The helper function lws_ext_parse_options()
+ * uses these to generate callbacks */
+struct lws_ext_options {
+ const char *name; /**< Option name, eg, "server_no_context_takeover" */
+ enum lws_ext_options_types type; /**< What kind of args the option can take */
- LWS_CLOSE_STATUS_NOSTATUS_CONTEXT_DESTROY = 9999,
+ /* Add new things just above here ---^
+ * This is part of the ABI, don't needlessly break compatibility */
};
-enum http_status {
- HTTP_STATUS_OK = 200,
- HTTP_STATUS_NO_CONTENT = 204,
-
- HTTP_STATUS_MOVED_PERMANENTLY = 301,
- HTTP_STATUS_FOUND = 302,
- HTTP_STATUS_SEE_OTHER = 303,
-
- HTTP_STATUS_BAD_REQUEST = 400,
- HTTP_STATUS_UNAUTHORIZED,
- HTTP_STATUS_PAYMENT_REQUIRED,
- HTTP_STATUS_FORBIDDEN,
- HTTP_STATUS_NOT_FOUND,
- HTTP_STATUS_METHOD_NOT_ALLOWED,
- HTTP_STATUS_NOT_ACCEPTABLE,
- HTTP_STATUS_PROXY_AUTH_REQUIRED,
- HTTP_STATUS_REQUEST_TIMEOUT,
- HTTP_STATUS_CONFLICT,
- HTTP_STATUS_GONE,
- HTTP_STATUS_LENGTH_REQUIRED,
- HTTP_STATUS_PRECONDITION_FAILED,
- HTTP_STATUS_REQ_ENTITY_TOO_LARGE,
- HTTP_STATUS_REQ_URI_TOO_LONG,
- HTTP_STATUS_UNSUPPORTED_MEDIA_TYPE,
- HTTP_STATUS_REQ_RANGE_NOT_SATISFIABLE,
- HTTP_STATUS_EXPECTATION_FAILED,
-
- HTTP_STATUS_INTERNAL_SERVER_ERROR = 500,
- HTTP_STATUS_NOT_IMPLEMENTED,
- HTTP_STATUS_BAD_GATEWAY,
- HTTP_STATUS_SERVICE_UNAVAILABLE,
- HTTP_STATUS_GATEWAY_TIMEOUT,
- HTTP_STATUS_HTTP_VERSION_NOT_SUPPORTED,
+/** struct lws_ext_option_arg */
+struct lws_ext_option_arg {
+ const char *option_name; /**< may be NULL, option_index used then */
+ int option_index; /**< argument ordinal to use if option_name missing */
+ const char *start; /**< value */
+ int len; /**< length of value */
};
-struct lws;
-struct lws_context;
-/* needed even with extensions disabled for create context */
-struct lws_extension;
-
-/**
- * typedef lws_callback_function() - User server actions
- * @wsi: Opaque websocket instance pointer
- * @reason: The reason for the call
- * @user: Pointer to per-session user data allocated by library
- * @in: Pointer used for some callback reasons
- * @len: Length set for some callback reasons
- *
- * This callback is the way the user controls what is served. All the
- * protocol detail is hidden and handled by the library.
- *
- * For each connection / session there is user data allocated that is
- * pointed to by "user". You set the size of this user data area when
- * the library is initialized with lws_create_server.
- *
- * You get an opportunity to initialize user data when called back with
- * LWS_CALLBACK_ESTABLISHED reason.
- *
- * LWS_CALLBACK_ESTABLISHED: after the server completes a handshake with
- * an incoming client. If you built the library
- * with ssl support, @in is a pointer to the
- * ssl struct associated with the connection or
- * NULL.
- *
- * LWS_CALLBACK_CLIENT_CONNECTION_ERROR: the request client connection has
- * been unable to complete a handshake with the remote server. If
- * in is non-NULL, you can find an error string of length len where
- * it points to.
- *
- * LWS_CALLBACK_CLIENT_FILTER_PRE_ESTABLISH: this is the last chance for the
- * client user code to examine the http headers
- * and decide to reject the connection. If the
- * content in the headers is interesting to the
- * client (url, etc) it needs to copy it out at
- * this point since it will be destroyed before
- * the CLIENT_ESTABLISHED call
- *
- * LWS_CALLBACK_CLIENT_ESTABLISHED: after your client connection completed
- * a handshake with the remote server
- *
- * LWS_CALLBACK_CLOSED: when the websocket session ends
- *
- * LWS_CALLBACK_CLOSED_HTTP: when a HTTP (non-websocket) session ends
- *
- * LWS_CALLBACK_RECEIVE: data has appeared for this server endpoint from a
- * remote client, it can be found at *in and is
- * len bytes long
- *
- * LWS_CALLBACK_CLIENT_RECEIVE_PONG: if you elected to see PONG packets,
- * they appear with this callback reason. PONG
- * packets only exist in 04+ protocol
- *
- * LWS_CALLBACK_CLIENT_RECEIVE: data has appeared from the server for the
- * client connection, it can be found at *in and
- * is len bytes long
- *
- * LWS_CALLBACK_HTTP: an http request has come from a client that is not
- * asking to upgrade the connection to a websocket
- * one. This is a chance to serve http content,
- * for example, to send a script to the client
- * which will then open the websockets connection.
- * @in points to the URI path requested and
- * lws_serve_http_file() makes it very
- * simple to send back a file to the client.
- * Normally after sending the file you are done
- * with the http connection, since the rest of the
- * activity will come by websockets from the script
- * that was delivered by http, so you will want to
- * return 1; to close and free up the connection.
- * That's important because it uses a slot in the
- * total number of client connections allowed set
- * by MAX_CLIENTS.
- *
- * LWS_CALLBACK_HTTP_BODY: the next @len bytes data from the http
- * request body HTTP connection is now available in @in.
- *
- * LWS_CALLBACK_HTTP_BODY_COMPLETION: the expected amount of http request
- * body has been delivered
- *
- * LWS_CALLBACK_HTTP_WRITEABLE: you can write more down the http protocol
- * link now.
- *
- * LWS_CALLBACK_HTTP_FILE_COMPLETION: a file requested to be send down
- * http link has completed.
- *
- * LWS_CALLBACK_CLIENT_WRITEABLE:
- * LWS_CALLBACK_SERVER_WRITEABLE: If you call
- * lws_callback_on_writable() on a connection, you will
- * get one of these callbacks coming when the connection socket
- * is able to accept another write packet without blocking.
- * If it already was able to take another packet without blocking,
- * you'll get this callback at the next call to the service loop
- * function. Notice that CLIENTs get LWS_CALLBACK_CLIENT_WRITEABLE
- * and servers get LWS_CALLBACK_SERVER_WRITEABLE.
- *
- * LWS_CALLBACK_FILTER_NETWORK_CONNECTION: called when a client connects to
- * the server at network level; the connection is accepted but then
- * passed to this callback to decide whether to hang up immediately
- * or not, based on the client IP. @in contains the connection
- * socket's descriptor. Since the client connection information is
- * not available yet, @wsi still pointing to the main server socket.
- * Return non-zero to terminate the connection before sending or
- * receiving anything. Because this happens immediately after the
- * network connection from the client, there's no websocket protocol
- * selected yet so this callback is issued only to protocol 0.
- *
- * LWS_CALLBACK_SERVER_NEW_CLIENT_INSTANTIATED: A new client just had
- * been connected, accepted, and instantiated into the pool. This
- * callback allows setting any relevant property to it. Because this
- * happens immediately after the instantiation of a new client,
- * there's no websocket protocol selected yet so this callback is
- * issued only to protocol 0. Only @wsi is defined, pointing to the
- * new client, and the return value is ignored.
- *
- * LWS_CALLBACK_FILTER_HTTP_CONNECTION: called when the request has
- * been received and parsed from the client, but the response is
- * not sent yet. Return non-zero to disallow the connection.
- * @user is a pointer to the connection user space allocation,
- * @in is the URI, eg, "/"
- * In your handler you can use the public APIs
- * lws_hdr_total_length() / lws_hdr_copy() to access all of the
- * headers using the header enums lws_token_indexes from
- * libwebsockets.h to check for and read the supported header
- * presence and content before deciding to allow the http
- * connection to proceed or to kill the connection.
- *
- * LWS_CALLBACK_FILTER_PROTOCOL_CONNECTION: called when the handshake has
- * been received and parsed from the client, but the response is
- * not sent yet. Return non-zero to disallow the connection.
- * @user is a pointer to the connection user space allocation,
- * @in is the requested protocol name
- * In your handler you can use the public APIs
- * lws_hdr_total_length() / lws_hdr_copy() to access all of the
- * headers using the header enums lws_token_indexes from
- * libwebsockets.h to check for and read the supported header
- * presence and content before deciding to allow the handshake
- * to proceed or to kill the connection.
- *
- * LWS_CALLBACK_OPENSSL_LOAD_EXTRA_CLIENT_VERIFY_CERTS: if configured for
- * including OpenSSL support, this callback allows your user code
- * to perform extra SSL_CTX_load_verify_locations() or similar
- * calls to direct OpenSSL where to find certificates the client
- * can use to confirm the remote server identity. @user is the
- * OpenSSL SSL_CTX*
- *
- * LWS_CALLBACK_OPENSSL_LOAD_EXTRA_SERVER_VERIFY_CERTS: if configured for
- * including OpenSSL support, this callback allows your user code
- * to load extra certifcates into the server which allow it to
- * verify the validity of certificates returned by clients. @user
- * is the server's OpenSSL SSL_CTX*
- *
- * LWS_CALLBACK_OPENSSL_CONTEXT_REQUIRES_PRIVATE_KEY: if configured for
- * including OpenSSL support but no private key file has been
- * specified (ssl_private_key_filepath is NULL), this is called to
- * allow the user to set the private key directly via libopenssl
- * and perform further operations if required; this might be useful
- * in situations where the private key is not directly accessible
- * by the OS, for example if it is stored on a smartcard
- * @user is the server's OpenSSL SSL_CTX*
- *
- * LWS_CALLBACK_OPENSSL_PERFORM_CLIENT_CERT_VERIFICATION: if the
- * libwebsockets context was created with the option
- * LWS_SERVER_OPTION_REQUIRE_VALID_OPENSSL_CLIENT_CERT, then this
- * callback is generated during OpenSSL verification of the cert
- * sent from the client. It is sent to protocol[0] callback as
- * no protocol has been negotiated on the connection yet.
- * Notice that the libwebsockets context and wsi are both NULL
- * during this callback. See
- * http://www.openssl.org/docs/ssl/SSL_CTX_set_verify.html
- * to understand more detail about the OpenSSL callback that
- * generates this libwebsockets callback and the meanings of the
- * arguments passed. In this callback, @user is the x509_ctx,
- * @in is the ssl pointer and @len is preverify_ok
- * Notice that this callback maintains libwebsocket return
- * conventions, return 0 to mean the cert is OK or 1 to fail it.
- * This also means that if you don't handle this callback then
- * the default callback action of returning 0 allows the client
- * certificates.
- *
- * LWS_CALLBACK_CLIENT_APPEND_HANDSHAKE_HEADER: this callback happens
- * when a client handshake is being compiled. @user is NULL,
- * @in is a char **, it's pointing to a char * which holds the
- * next location in the header buffer where you can add
- * headers, and @len is the remaining space in the header buffer,
- * which is typically some hundreds of bytes. So, to add a canned
- * cookie, your handler code might look similar to:
- *
- * char **p = (char **)in;
- *
- * if (len < 100)
- * return 1;
- *
- * *p += sprintf(*p, "Cookie: a=b\x0d\x0a");
- *
- * return 0;
- *
- * Notice if you add anything, you just have to take care about
- * the CRLF on the line you added. Obviously this callback is
- * optional, if you don't handle it everything is fine.
- *
- * Notice the callback is coming to protocols[0] all the time,
- * because there is no specific protocol handshook yet.
- *
- * LWS_CALLBACK_CONFIRM_EXTENSION_OKAY: When the server handshake code
- * sees that it does support a requested extension, before
- * accepting the extension by additing to the list sent back to
- * the client it gives this callback just to check that it's okay
- * to use that extension. It calls back to the requested protocol
- * and with @in being the extension name, @len is 0 and @user is
- * valid. Note though at this time the ESTABLISHED callback hasn't
- * happened yet so if you initialize @user content there, @user
- * content during this callback might not be useful for anything.
- * Notice this callback comes to protocols[0].
- *
- * LWS_CALLBACK_CLIENT_CONFIRM_EXTENSION_SUPPORTED: When a client
- * connection is being prepared to start a handshake to a server,
- * each supported extension is checked with protocols[0] callback
- * with this reason, giving the user code a chance to suppress the
- * claim to support that extension by returning non-zero. If
- * unhandled, by default 0 will be returned and the extension
- * support included in the header to the server. Notice this
- * callback comes to protocols[0].
- *
- * LWS_CALLBACK_PROTOCOL_INIT: One-time call per protocol so it can
- * do initial setup / allocations etc
- *
- * LWS_CALLBACK_PROTOCOL_DESTROY: One-time call per protocol indicating
- * this protocol won't get used at all after this callback, the
- * context is getting destroyed. Take the opportunity to
- * deallocate everything that was allocated by the protocol.
- *
- * LWS_CALLBACK_WSI_CREATE: outermost (earliest) wsi create notification
- *
- * LWS_CALLBACK_WSI_DESTROY: outermost (latest) wsi destroy notification
- *
- * The next five reasons are optional and only need taking care of if you
- * will be integrating libwebsockets sockets into an external polling
- * array.
- *
- * For these calls, @in points to a struct lws_pollargs that
- * contains @fd, @events and @prev_events members
- *
- * LWS_CALLBACK_ADD_POLL_FD: libwebsocket deals with its poll() loop
- * internally, but in the case you are integrating with another
- * server you will need to have libwebsocket sockets share a
- * polling array with the other server. This and the other
- * POLL_FD related callbacks let you put your specialized
- * poll array interface code in the callback for protocol 0, the
- * first protocol you support, usually the HTTP protocol in the
- * serving case.
- * This callback happens when a socket needs to be
- * added to the polling loop: @in points to a struct
- * lws_pollargs; the @fd member of the struct is the file
- * descriptor, and @events contains the active events.
- *
- * If you are using the internal polling loop (the "service"
- * callback), you can just ignore these callbacks.
- *
- * LWS_CALLBACK_DEL_POLL_FD: This callback happens when a socket descriptor
- * needs to be removed from an external polling array. @in is
- * again the struct lws_pollargs containing the @fd member
- * to be removed. If you are using the internal polling
- * loop, you can just ignore it.
- *
- * LWS_CALLBACK_CHANGE_MODE_POLL_FD: This callback happens when
- * libwebsockets wants to modify the events for a connectiion.
- * @in is the struct lws_pollargs with the @fd to change.
- * The new event mask is in @events member and the old mask is in
- * the @prev_events member.
- * If you are using the internal polling loop, you can just ignore
- * it.
- *
- * LWS_CALLBACK_LOCK_POLL:
- * LWS_CALLBACK_UNLOCK_POLL: These allow the external poll changes driven
- * by libwebsockets to participate in an external thread locking
- * scheme around the changes, so the whole thing is threadsafe.
- * These are called around three activities in the library,
- * - inserting a new wsi in the wsi / fd table (len=1)
- * - deleting a wsi from the wsi / fd table (len=1)
- * - changing a wsi's POLLIN/OUT state (len=0)
- * Locking and unlocking external synchronization objects when
- * len == 1 allows external threads to be synchronized against
- * wsi lifecycle changes if it acquires the same lock for the
- * duration of wsi dereference from the other thread context.
- *
- * LWS_CALLBACK_WS_PEER_INITIATED_CLOSE:
- * The peer has sent an unsolicited Close WS packet. @in and
- * @len are the optional close code (first 2 bytes, network
- * order) and the optional additional information which is not
- * defined in the standard, and may be a string or non-human-
- * readble data.
- * If you return 0 lws will echo the close and then close the
- * connection. If you return nonzero lws will just close the
- * connection.
- */
-typedef int
-lws_callback_function(struct lws *wsi, enum lws_callback_reasons reason,
- void *user, void *in, size_t len);
-
/**
* typedef lws_extension_callback_function() - Hooks to allow extensions to operate
- * @context: Websockets context
- * @ext: This extension
- * @wsi: Opaque websocket instance pointer
- * @reason: The reason for the call
- * @user: Pointer to ptr to per-session user data allocated by library
- * @in: Pointer used for some callback reasons
- * @len: Length set for some callback reasons
+ * \param context: Websockets context
+ * \param ext: This extension
+ * \param wsi: Opaque websocket instance pointer
+ * \param reason: The reason for the call
+ * \param user: Pointer to ptr to per-session user data allocated by library
+ * \param in: Pointer used for some callback reasons
+ * \param len: Length set for some callback reasons
*
* Each extension that is active on a particular connection receives
* callbacks during the connection lifetime to allow the extension to
*
* Libwebsockets takes care of allocating and freeing "user" memory for
* each active extension on each connection. That is what is pointed to
- * by the @user parameter.
+ * by the user parameter.
*
* LWS_EXT_CB_CONSTRUCT: called when the server has decided to
* select this extension from the list provided by the client,
* just before the server will send back the handshake accepting
* the connection with this extension active. This gives the
* extension a chance to initialize its connection context found
- * in @user.
+ * in user.
*
* LWS_EXT_CB_CLIENT_CONSTRUCT: same as LWS_EXT_CB_CONSTRUCT
* but called when client is instantiating this extension. Some
* LWS_EXT_CB_DESTROY: called when the connection the extension was
* being used on is about to be closed and deallocated. It's the
* last chance for the extension to deallocate anything it has
- * allocated in the user data (pointed to by @user) before the
+ * allocated in the user data (pointed to by user) before the
* user data is deleted. This same callback is used whether you
* are in client or server instantiation context.
*
* LWS_EXT_CB_PACKET_RX_PREPARSE: when this extension was active on
* a connection, and a packet of data arrived at the connection,
* it is passed to this callback to give the extension a chance to
- * change the data, eg, decompress it. @user is pointing to the
- * extension's private connection context data, @in is pointing
+ * change the data, eg, decompress it. user is pointing to the
+ * extension's private connection context data, in is pointing
* to an lws_tokens struct, it consists of a char * pointer called
* token, and an int called token_len. At entry, these are
* set to point to the received buffer and set to the content
* LWS_EXT_CB_PACKET_TX_PRESEND: this works the same way as
* LWS_EXT_CB_PACKET_RX_PREPARSE above, except it gives the
* extension a chance to change websocket data just before it will
- * be sent out. Using the same lws_token pointer scheme in @in,
+ * be sent out. Using the same lws_token pointer scheme in in,
* the extension can change the buffer and the length to be
* transmitted how it likes. Again if it wants to grow the
* buffer safely, it should copy the data into its own buffer and
enum lws_extension_callback_reasons reason,
void *user, void *in, size_t len);
+/** struct lws_extension - An extension we support */
+struct lws_extension {
+ const char *name; /**< Formal extension name, eg, "permessage-deflate" */
+ lws_extension_callback_function *callback; /**< Service callback */
+ const char *client_offer; /**< String containing exts and options client offers */
+
+ /* Add new things just above here ---^
+ * This is part of the ABI, don't needlessly break compatibility */
+};
+
/**
- * struct lws_protocols - List of protocols and handlers server
- * supports.
- * @name: Protocol name that must match the one given in the client
- * Javascript new WebSocket(url, 'protocol') name.
- * @callback: The service callback used for this protocol. It allows the
- * service action for an entire protocol to be encapsulated in
- * the protocol-specific callback
- * @per_session_data_size: Each new connection using this protocol gets
- * this much memory allocated on connection establishment and
- * freed on connection takedown. A pointer to this per-connection
- * allocation is passed into the callback in the 'user' parameter
- * @rx_buffer_size: if you want atomic frames delivered to the callback, you
- * should set this to the size of the biggest legal frame that
- * you support. If the frame size is exceeded, there is no
- * error, but the buffer will spill to the user callback when
- * full, which you can detect by using
- * lws_remaining_packet_payload(). Notice that you
- * just talk about frame size here, the LWS_PRE
- * and post-padding are automatically also allocated on top.
- * @id: ignored by lws, but useful to contain user information bound
- * to the selected protocol. For example if this protocol was
- * called "myprotocol-v2", you might set id to 2, and the user
- * code that acts differently according to the version can do so by
- * switch (wsi->protocol->id), user code might use some bits as
- * capability flags based on selected protocol version, etc.
- * @user: User provided context data at the protocol level.
- * Accessible via lws_get_protocol(wsi)->user
- * This should not be confused with wsi->user, it is not the same.
- * The library completely ignores any value in here.
- *
- * This structure represents one protocol supported by the server. An
- * array of these structures is passed to lws_create_server()
- * allows as many protocols as you like to be handled by one server.
- *
- * The first protocol given has its callback used for user callbacks when
- * there is no agreed protocol name, that's true during HTTP part of the
- * connection and true if the client did not send a Protocol: header.
+ * lws_set_extension_option(): set extension option if possible
+ *
+ * \param wsi: websocket connection
+ * \param ext_name: name of ext, like "permessage-deflate"
+ * \param opt_name: name of option, like "rx_buf_size"
+ * \param opt_val: value to set option to
+ */
+LWS_VISIBLE LWS_EXTERN int
+lws_set_extension_option(struct lws *wsi, const char *ext_name,
+ const char *opt_name, const char *opt_val);
+
+#ifndef LWS_NO_EXTENSIONS
+/* lws_get_internal_extensions() - DEPRECATED
+ *
+ * \Deprecated There is no longer a set internal extensions table. The table is provided
+ * by user code along with application-specific settings. See the test
+ * client and server for how to do.
+ */
+static LWS_INLINE LWS_WARN_DEPRECATED const struct lws_extension *
+lws_get_internal_extensions() { return NULL; }
+
+/**
+ * lws_ext_parse_options() - deal with parsing negotiated extension options
+ *
+ * \param ext: related extension struct
+ * \param wsi: websocket connection
+ * \param ext_user: per-connection extension private data
+ * \param opts: list of supported options
+ * \param o: option string to parse
+ * \param len: length
+ */
+LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
+lws_ext_parse_options(const struct lws_extension *ext, struct lws *wsi,
+ void *ext_user, const struct lws_ext_options *opts,
+ const char *o, int len);
+#endif
+
+/** lws_extension_callback_pm_deflate() - extension for RFC7692
+ *
+ * \param context: lws context
+ * \param ext: related lws_extension struct
+ * \param wsi: websocket connection
+ * \param reason: incoming callback reason
+ * \param user: per-connection extension private data
+ * \param in: pointer parameter
+ * \param len: length parameter
+ *
+ * Built-in callback implementing RFC7692 permessage-deflate
+ */
+LWS_EXTERN
+int lws_extension_callback_pm_deflate(
+ struct lws_context *context, const struct lws_extension *ext,
+ struct lws *wsi, enum lws_extension_callback_reasons reason,
+ void *user, void *in, size_t len);
+
+/*
+ * The internal exts are part of the public abi
+ * If we add more extensions, publish the callback here ------v
+ */
+///@}
+
+/*! \defgroup Protocols-and-Plugins Protocols and Plugins
+ * \ingroup lwsapi
+ *
+ * ##Protocol and protocol plugin -related apis
+ *
+ * Protocols bind ws protocol names to a custom callback specific to that
+ * protocol implementaion.
+ *
+ * A list of protocols can be passed in at context creation time, but it is
+ * also legal to leave that NULL and add the protocols and their callback code
+ * using plugins.
+ *
+ * Plugins are much preferable compared to cut and pasting code into an
+ * application each time, since they can be used standalone.
+ */
+///@{
+/** struct lws_protocols - List of protocols and handlers client or server
+ * supports. */
+
+struct lws_protocols {
+ const char *name;
+ /**< Protocol name that must match the one given in the client
+ * Javascript new WebSocket(url, 'protocol') name. */
+ lws_callback_function *callback;
+ /**< The service callback used for this protocol. It allows the
+ * service action for an entire protocol to be encapsulated in
+ * the protocol-specific callback */
+ size_t per_session_data_size;
+ /**< Each new connection using this protocol gets
+ * this much memory allocated on connection establishment and
+ * freed on connection takedown. A pointer to this per-connection
+ * allocation is passed into the callback in the 'user' parameter */
+ size_t rx_buffer_size;
+ /**< lws allocates this much space for rx data and informs callback
+ * when something came. Due to rx flow control, the callback may not
+ * be able to consume it all without having to return to the event
+ * loop. That is supported in lws.
+ *
+ * This also controls how much may be sent at once at the moment,
+ * although this is likely to change.
+ */
+ unsigned int id;
+ /**< ignored by lws, but useful to contain user information bound
+ * to the selected protocol. For example if this protocol was
+ * called "myprotocol-v2", you might set id to 2, and the user
+ * code that acts differently according to the version can do so by
+ * switch (wsi->protocol->id), user code might use some bits as
+ * capability flags based on selected protocol version, etc. */
+ void *user; /**< ignored by lws, but user code can pass a pointer
+ here it can later access from the protocol callback */
+
+ /* Add new things just above here ---^
+ * This is part of the ABI, don't needlessly break compatibility */
+};
+
+struct lws_vhost;
+
+/**
+ * lws_vhost_name_to_protocol() - get vhost's protocol object from its name
+ *
+ * \param vh: vhost to search
+ * \param name: protocol name
+ *
+ * Returns NULL or a pointer to the vhost's protocol of the requested name
+ */
+LWS_VISIBLE LWS_EXTERN const struct lws_protocols *
+lws_vhost_name_to_protocol(struct lws_vhost *vh, const char *name);
+
+/**
+ * lws_get_protocol() - Returns a protocol pointer from a websocket
+ * connection.
+ * \param wsi: pointer to struct websocket you want to know the protocol of
+ *
+ *
+ * Some apis can act on all live connections of a given protocol,
+ * this is how you can get a pointer to the active protocol if needed.
+ */
+LWS_VISIBLE LWS_EXTERN const struct lws_protocols *
+lws_get_protocol(struct lws *wsi);
+
+/** lws_protocol_get() - deprecated: use lws_get_protocol */
+LWS_VISIBLE LWS_EXTERN const struct lws_protocols *
+lws_protocol_get(struct lws *wsi) LWS_WARN_DEPRECATED;
+
+/**
+ * lws_protocol_vh_priv_zalloc() - Allocate and zero down a protocol's per-vhost
+ * storage
+ * \param vhost: vhost the instance is related to
+ * \param prot: protocol the instance is related to
+ * \param size: bytes to allocate
+ *
+ * Protocols often find it useful to allocate a per-vhost struct, this is a
+ * helper to be called in the per-vhost init LWS_CALLBACK_PROTOCOL_INIT
+ */
+LWS_VISIBLE LWS_EXTERN void *
+lws_protocol_vh_priv_zalloc(struct lws_vhost *vhost, const struct lws_protocols *prot,
+ int size);
+
+/**
+ * lws_protocol_vh_priv_get() - retreive a protocol's per-vhost storage
+ *
+ * \param vhost: vhost the instance is related to
+ * \param prot: protocol the instance is related to
+ *
+ * Recover a pointer to the allocated per-vhost storage for the protocol created
+ * by lws_protocol_vh_priv_zalloc() earlier
+ */
+LWS_VISIBLE LWS_EXTERN void *
+lws_protocol_vh_priv_get(struct lws_vhost *vhost, const struct lws_protocols *prot);
+
+/**
+ * lws_finalize_startup() - drop initial process privileges
+ *
+ * \param context: lws context
+ *
+ * This is called after the end of the vhost protocol initializations, but
+ * you may choose to call it earlier
+ */
+LWS_VISIBLE LWS_EXTERN int
+lws_finalize_startup(struct lws_context *context);
+
+#ifdef LWS_WITH_PLUGINS
+
+/* PLUGINS implies LIBUV */
+
+#define LWS_PLUGIN_API_MAGIC 180
+
+/** struct lws_plugin_capability - how a plugin introduces itself to lws */
+struct lws_plugin_capability {
+ unsigned int api_magic; /**< caller fills this in, plugin fills rest */
+ const struct lws_protocols *protocols; /**< array of supported protocols provided by plugin */
+ int count_protocols; /**< how many protocols */
+ const struct lws_extension *extensions; /**< array of extensions provided by plugin */
+ int count_extensions; /**< how many extensions */
+};
+
+typedef int (*lws_plugin_init_func)(struct lws_context *,
+ struct lws_plugin_capability *);
+typedef int (*lws_plugin_destroy_func)(struct lws_context *);
+
+/** struct lws_plugin */
+struct lws_plugin {
+ struct lws_plugin *list; /**< linked list */
+#if (UV_VERSION_MAJOR > 0)
+ uv_lib_t lib; /**< shared library pointer */
+#else
+ void *l; /**< so we can compile on ancient libuv */
+#endif
+ char name[64]; /**< name of the plugin */
+ struct lws_plugin_capability caps; /**< plugin capabilities */
+};
+
+#endif
+
+///@}
+
+
+/*! \defgroup generic-sessions plugin: generic-sessions
+ * \ingroup Protocols-and-Plugins
+ *
+ * ##Plugin Generic-sessions related
+ *
+ * generic-sessions plugin provides a reusable, generic session and login /
+ * register / forgot password framework including email verification.
+ */
+///@{
+
+#define LWSGS_EMAIL_CONTENT_SIZE 16384
+/**< Maximum size of email we might send */
+
+/* SHA-1 binary and hexified versions */
+/** typedef struct lwsgw_hash_bin */
+typedef struct { unsigned char bin[20]; /**< binary representation of hash */} lwsgw_hash_bin;
+/** typedef struct lwsgw_hash */
+typedef struct { char id[41]; /**< ascii hex representation of hash */ } lwsgw_hash;
+
+/** enum lwsgs_auth_bits */
+enum lwsgs_auth_bits {
+ LWSGS_AUTH_LOGGED_IN = 1, /**< user is logged in as somebody */
+ LWSGS_AUTH_ADMIN = 2, /**< logged in as the admin user */
+ LWSGS_AUTH_VERIFIED = 4, /**< user has verified his email */
+ LWSGS_AUTH_FORGOT_FLOW = 8, /**< he just completed "forgot password" flow */
+};
+
+/** struct lws_session_info - information about user session status */
+struct lws_session_info {
+ char username[32]; /**< username logged in as, or empty string */
+ char email[100]; /**< email address associated with login, or empty string */
+ char ip[72]; /**< ip address session was started from */
+ unsigned int mask; /**< access rights mask associated with session
+ * see enum lwsgs_auth_bits */
+ char session[42]; /**< session id string, usable as opaque uid when not logged in */
+};
+
+/** enum lws_gs_event */
+enum lws_gs_event {
+ LWSGSE_CREATED, /**< a new user was created */
+ LWSGSE_DELETED /**< an existing user was deleted */
+};
+
+/** struct lws_gs_event_args */
+struct lws_gs_event_args {
+ enum lws_gs_event event; /**< which event happened */
+ const char *username; /**< which username the event happened to */
+ const char *email; /**< the email address of that user */
+};
+
+///@}
+
+
+/*! \defgroup context-and-vhost
+ * \ingroup lwsapi
+ *
+ * ##Context and Vhost releated functions
+ *
+ * LWS requires that there is one context, in which you may define multiple
+ * vhosts. Each vhost is a virtual host, with either its own listen port
+ * or sharing an existing one. Each vhost has its own SSL context that can
+ * be set up individually or left disabled.
+ *
+ * If you don't care about multiple "site" support, you can ignore it and
+ * lws will create a single default vhost at context creation time.
+ */
+///@{
+
+/*
+ * NOTE: These public enums are part of the abi. If you want to add one,
+ * add it at where specified so existing users are unaffected.
+ */
+
+/** enum lws_context_options - context and vhost options */
+enum lws_context_options {
+ LWS_SERVER_OPTION_REQUIRE_VALID_OPENSSL_CLIENT_CERT = (1 << 1) |
+ (1 << 12),
+ /**< (VH) Don't allow the connection unless the client has a
+ * client cert that we recognize; provides
+ * LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT */
+ LWS_SERVER_OPTION_SKIP_SERVER_CANONICAL_NAME = (1 << 2),
+ /**< (CTX) Don't try to get the server's hostname */
+ LWS_SERVER_OPTION_ALLOW_NON_SSL_ON_SSL_PORT = (1 << 3) |
+ (1 << 12),
+ /**< (VH) Allow non-SSL (plaintext) connections on the same
+ * port as SSL is listening... undermines the security of SSL;
+ * provides LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT */
+ LWS_SERVER_OPTION_LIBEV = (1 << 4),
+ /**< (CTX) Use libev event loop */
+ LWS_SERVER_OPTION_DISABLE_IPV6 = (1 << 5),
+ /**< (VH) Disable IPV6 support */
+ LWS_SERVER_OPTION_DISABLE_OS_CA_CERTS = (1 << 6),
+ /**< (VH) Don't load OS CA certs, you will need to load your
+ * own CA cert(s) */
+ LWS_SERVER_OPTION_PEER_CERT_NOT_REQUIRED = (1 << 7),
+ /**< (VH) Accept connections with no valid Cert (eg, selfsigned) */
+ LWS_SERVER_OPTION_VALIDATE_UTF8 = (1 << 8),
+ /**< (VH) Check UT-8 correctness */
+ LWS_SERVER_OPTION_SSL_ECDH = (1 << 9) |
+ (1 << 12),
+ /**< (VH) initialize ECDH ciphers */
+ LWS_SERVER_OPTION_LIBUV = (1 << 10),
+ /**< (CTX) Use libuv event loop */
+ LWS_SERVER_OPTION_REDIRECT_HTTP_TO_HTTPS = (1 << 11) |
+ (1 << 3) |
+ (1 << 12),
+ /**< (VH) Use http redirect to force http to https
+ * (deprecated: use mount redirection) */
+ LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT = (1 << 12),
+ /**< (CTX) Initialize the SSL library at all */
+ LWS_SERVER_OPTION_EXPLICIT_VHOSTS = (1 << 13),
+ /**< (CTX) Only create the context when calling context
+ * create api, implies user code will create its own vhosts */
+ LWS_SERVER_OPTION_UNIX_SOCK = (1 << 14),
+ /**< (VH) Use Unix socket */
+ LWS_SERVER_OPTION_STS = (1 << 15),
+ /**< (VH) Send Strict Transport Security header, making
+ * clients subsequently go to https even if user asked for http */
+ LWS_SERVER_OPTION_IPV6_V6ONLY_MODIFY = (1 << 16),
+ /**< (VH) Enable LWS_SERVER_OPTION_IPV6_V6ONLY_VALUE to take effect */
+ LWS_SERVER_OPTION_IPV6_V6ONLY_VALUE = (1 << 17),
+ /**< (VH) if set, only ipv6 allowed on the vhost */
+
+ /****** add new things just above ---^ ******/
+};
+
+#define lws_check_opt(c, f) (((c) & (f)) == (f))
+
+/** struct lws_context_creation_info - parameters to create context and /or vhost with
+ *
+ * This is also used to create vhosts.... if LWS_SERVER_OPTION_EXPLICIT_VHOSTS
+ * is not given, then for backwards compatibility one vhost is created at
+ * context-creation time using the info from this struct.
+ *
+ * If LWS_SERVER_OPTION_EXPLICIT_VHOSTS is given, then no vhosts are created
+ * at the same time as the context, they are expected to be created afterwards.
*/
-
-struct lws_protocols {
- const char *name;
- lws_callback_function *callback;
- size_t per_session_data_size;
- size_t rx_buffer_size;
- unsigned int id;
+struct lws_context_creation_info {
+ int port;
+ /**< VHOST: Port to listen on... you can use CONTEXT_PORT_NO_LISTEN to
+ * suppress listening on any port, that's what you want if you are
+ * not running a websocket server at all but just using it as a
+ * client */
+ const char *iface;
+ /**< VHOST: NULL to bind the listen socket to all interfaces, or the
+ * interface name, eg, "eth2"
+ * If options specifies LWS_SERVER_OPTION_UNIX_SOCK, this member is
+ * the pathname of a UNIX domain socket. you can use the UNIX domain
+ * sockets in abstract namespace, by prepending an at symbol to the
+ * socket name. */
+ const struct lws_protocols *protocols;
+ /**< VHOST: Array of structures listing supported protocols and a protocol-
+ * specific callback for each one. The list is ended with an
+ * entry that has a NULL callback pointer. */
+ const struct lws_extension *extensions;
+ /**< VHOST: NULL or array of lws_extension structs listing the
+ * extensions this context supports. */
+ const struct lws_token_limits *token_limits;
+ /**< CONTEXT: NULL or struct lws_token_limits pointer which is initialized
+ * with a token length limit for each possible WSI_TOKEN_ */
+ const char *ssl_private_key_password;
+ /**< VHOST: NULL or the passphrase needed for the private key */
+ const char *ssl_cert_filepath;
+ /**< VHOST: If libwebsockets was compiled to use ssl, and you want
+ * to listen using SSL, set to the filepath to fetch the
+ * server cert from, otherwise NULL for unencrypted */
+ const char *ssl_private_key_filepath;
+ /**< VHOST: filepath to private key if wanting SSL mode;
+ * if this is set to NULL but sll_cert_filepath is set, the
+ * OPENSSL_CONTEXT_REQUIRES_PRIVATE_KEY callback is called
+ * to allow setting of the private key directly via openSSL
+ * library calls */
+ const char *ssl_ca_filepath;
+ /**< VHOST: CA certificate filepath or NULL */
+ const char *ssl_cipher_list;
+ /**< VHOST: List of valid ciphers to use (eg,
+ * "RC4-MD5:RC4-SHA:AES128-SHA:AES256-SHA:HIGH:!DSS:!aNULL"
+ * or you can leave it as NULL to get "DEFAULT" */
+ const char *http_proxy_address;
+ /**< VHOST: If non-NULL, attempts to proxy via the given address.
+ * If proxy auth is required, use format "username:password\@server:port" */
+ unsigned int http_proxy_port;
+ /**< VHOST: If http_proxy_address was non-NULL, uses this port */
+ int gid;
+ /**< CONTEXT: group id to change to after setting listen socket, or -1. */
+ int uid;
+ /**< CONTEXT: user id to change to after setting listen socket, or -1. */
+ unsigned int options;
+ /**< VHOST + CONTEXT: 0, or LWS_SERVER_OPTION_... bitfields */
void *user;
+ /**< CONTEXT: optional user pointer that can be recovered via the context
+ * pointer using lws_context_user */
+ int ka_time;
+ /**< CONTEXT: 0 for no TCP keepalive, otherwise apply this keepalive
+ * timeout to all libwebsocket sockets, client or server */
+ int ka_probes;
+ /**< CONTEXT: if ka_time was nonzero, after the timeout expires how many
+ * times to try to get a response from the peer before giving up
+ * and killing the connection */
+ int ka_interval;
+ /**< CONTEXT: if ka_time was nonzero, how long to wait before each ka_probes
+ * attempt */
+#ifdef LWS_OPENSSL_SUPPORT
+ SSL_CTX *provided_client_ssl_ctx;
+ /**< CONTEXT: If non-null, swap out libwebsockets ssl
+ * implementation for the one provided by provided_ssl_ctx.
+ * Libwebsockets no longer is responsible for freeing the context
+ * if this option is selected. */
+#else /* maintain structure layout either way */
+ void *provided_client_ssl_ctx; /**< dummy if ssl disabled */
+#endif
- /* Add new things just above here ---^
- * This is part of the ABI, don't needlessly break compatibility */
-};
+ short max_http_header_data;
+ /**< CONTEXT: The max amount of header payload that can be handled
+ * in an http request (unrecognized header payload is dropped) */
+ short max_http_header_pool;
+ /**< CONTEXT: The max number of connections with http headers that
+ * can be processed simultaneously (the corresponding memory is
+ * allocated for the lifetime of the context). If the pool is
+ * busy new incoming connections must wait for accept until one
+ * becomes free. */
+
+ unsigned int count_threads;
+ /**< CONTEXT: how many contexts to create in an array, 0 = 1 */
+ unsigned int fd_limit_per_thread;
+ /**< CONTEXT: nonzero means restrict each service thread to this
+ * many fds, 0 means the default which is divide the process fd
+ * limit by the number of threads. */
+ unsigned int timeout_secs;
+ /**< VHOST: various processes involving network roundtrips in the
+ * library are protected from hanging forever by timeouts. If
+ * nonzero, this member lets you set the timeout used in seconds.
+ * Otherwise a default timeout is used. */
+ const char *ecdh_curve;
+ /**< VHOST: if NULL, defaults to initializing server with "prime256v1" */
+ const char *vhost_name;
+ /**< VHOST: name of vhost, must match external DNS name used to
+ * access the site, like "warmcat.com" as it's used to match
+ * Host: header and / or SNI name for SSL. */
+ const char * const *plugin_dirs;
+ /**< CONTEXT: NULL, or NULL-terminated array of directories to
+ * scan for lws protocol plugins at context creation time */
+ const struct lws_protocol_vhost_options *pvo;
+ /**< VHOST: pointer to optional linked list of per-vhost
+ * options made accessible to protocols */
+ int keepalive_timeout;
+ /**< VHOST: (default = 0 = 60s) seconds to allow remote
+ * client to hold on to an idle HTTP/1.1 connection */
+ const char *log_filepath;
+ /**< VHOST: filepath to append logs to... this is opened before
+ * any dropping of initial privileges */
+ const struct lws_http_mount *mounts;
+ /**< VHOST: optional linked list of mounts for this vhost */
+ const char *server_string;
+ /**< CONTEXT: string used in HTTP headers to identify server
+ * software, if NULL, "libwebsockets". */
+ unsigned int pt_serv_buf_size;
+ /**< CONTEXT: 0 = default of 4096. This buffer is used by
+ * various service related features including file serving, it
+ * defines the max chunk of file that can be sent at once.
+ * At the risk of lws having to buffer failed large sends, it
+ * can be increased to, eg, 128KiB to improve throughput. */
+ unsigned int max_http_header_data2;
+ /**< CONTEXT: if max_http_header_data is 0 and this
+ * is nonzero, this will be used in place of the default. It's
+ * like this for compatibility with the original short version,
+ * this is unsigned int length. */
+ long ssl_options_set;
+ /**< VHOST: Any bits set here will be set as SSL options */
+ long ssl_options_clear;
+ /**< VHOST: Any bits set here will be cleared as SSL options */
-struct lws_session_info {
- char username[32];
- char email[100];
- char ip[72];
- unsigned int mask;
- char session[42];
-};
+ /* Add new things just above here ---^
+ * This is part of the ABI, don't needlessly break compatibility
+ *
+ * The below is to ensure later library versions with new
+ * members added above will see 0 (default) even if the app
+ * was not built against the newer headers.
+ */
-struct lws_process_html_args {
- char *p;
- int len;
- int max_len;
- int final;
+ void *_unused[8]; /**< dummy */
};
-typedef const char *(*lws_process_html_state_cb)(void *data, int index);
-
-struct lws_process_html_state {
- char *start;
- char swallow[16];
- int pos;
- void *data;
- const char * const *vars;
- int count_vars;
+/**
+ * lws_create_context() - Create the websocket handler
+ * \param info: pointer to struct with parameters
+ *
+ * This function creates the listening socket (if serving) and takes care
+ * of all initialization in one step.
+ *
+ * If option LWS_SERVER_OPTION_EXPLICIT_VHOSTS is given, no vhost is
+ * created; you're expected to create your own vhosts afterwards using
+ * lws_create_vhost(). Otherwise a vhost named "default" is also created
+ * using the information in the vhost-related members, for compatibility.
+ *
+ * After initialization, it returns a struct lws_context * that
+ * represents this server. After calling, user code needs to take care
+ * of calling lws_service() with the context pointer to get the
+ * server's sockets serviced. This must be done in the same process
+ * context as the initialization call.
+ *
+ * The protocol callback functions are called for a handful of events
+ * including http requests coming in, websocket connections becoming
+ * established, and data arriving; it's also called periodically to allow
+ * async transmission.
+ *
+ * HTTP requests are sent always to the FIRST protocol in protocol, since
+ * at that time websocket protocol has not been negotiated. Other
+ * protocols after the first one never see any HTTP callack activity.
+ *
+ * The server created is a simple http server by default; part of the
+ * websocket standard is upgrading this http connection to a websocket one.
+ *
+ * This allows the same server to provide files like scripts and favicon /
+ * images or whatever over http and dynamic data over websockets all in
+ * one place; they're all handled in the user callback.
+ */
+LWS_VISIBLE LWS_EXTERN struct lws_context *
+lws_create_context(struct lws_context_creation_info *info);
- lws_process_html_state_cb replace;
-};
+/**
+ * lws_context_destroy() - Destroy the websocket context
+ * \param context: Websocket context
+ *
+ * This function closes any active connections and then frees the
+ * context. After calling this, any further use of the context is
+ * undefined.
+ */
+LWS_VISIBLE LWS_EXTERN void
+lws_context_destroy(struct lws_context *context);
+/**
+ * lws_set_proxy() - Setups proxy to lws_context.
+ * \param vhost: pointer to struct lws_vhost you want set proxy for
+ * \param proxy: pointer to c string containing proxy in format address:port
+ *
+ * Returns 0 if proxy string was parsed and proxy was setup.
+ * Returns -1 if proxy is NULL or has incorrect format.
+ *
+ * This is only required if your OS does not provide the http_proxy
+ * environment variable (eg, OSX)
+ *
+ * IMPORTANT! You should call this function right after creation of the
+ * lws_context and before call to connect. If you call this
+ * function after connect behavior is undefined.
+ * This function will override proxy settings made on lws_context
+ * creation with genenv() call.
+ */
LWS_VISIBLE LWS_EXTERN int
-lws_chunked_html_process(struct lws_process_html_args *args,
- struct lws_process_html_state *s);
+lws_set_proxy(struct lws_vhost *vhost, const char *proxy);
-/* generic-sessions public api */
-#define LWSGS_EMAIL_CONTENT_SIZE 16384
+struct lws_vhost;
-/* SHA-1 binary and hexified versions */
-typedef struct { unsigned char bin[20]; } lwsgw_hash_bin;
-typedef struct { char id[41]; } lwsgw_hash;
+/**
+ * lws_create_vhost() - Create a vhost (virtual server context)
+ * \param context: pointer to result of lws_create_context()
+ * \param info: pointer to struct with parameters
+ *
+ * This function creates a virtual server (vhost) using the vhost-related
+ * members of the info struct. You can create many vhosts inside one context
+ * if you created the context with the option LWS_SERVER_OPTION_EXPLICIT_VHOSTS
+ */
+LWS_EXTERN LWS_VISIBLE struct lws_vhost *
+lws_create_vhost(struct lws_context *context,
+ struct lws_context_creation_info *info);
-enum lwsgs_auth_bits {
- LWSGS_AUTH_LOGGED_IN = 1,
- LWSGS_AUTH_ADMIN = 2,
- LWSGS_AUTH_VERIFIED = 4,
- LWSGS_AUTH_FORGOT_FLOW = 8,
-};
+/**
+ * lwsws_get_config_globals() - Parse a JSON server config file
+ * \param info: pointer to struct with parameters
+ * \param d: filepath of the config file
+ * \param config_strings: storage for the config strings extracted from JSON,
+ * the pointer is incremented as strings are stored
+ * \param len: pointer to the remaining length left in config_strings
+ * the value is decremented as strings are stored
+ *
+ * This function prepares a n lws_context_creation_info struct with global
+ * settings from a file d.
+ *
+ * Requires CMake option LWS_WITH_LEJP_CONF to have been enabled
+ */
+LWS_VISIBLE LWS_EXTERN int
+lwsws_get_config_globals(struct lws_context_creation_info *info, const char *d,
+ char **config_strings, int *len);
-enum lws_gs_event {
- LWSGSE_CREATED,
- LWSGSE_DELETED
-};
+/**
+ * lwsws_get_config_vhosts() - Create vhosts from a JSON server config file
+ * \param context: pointer to result of lws_create_context()
+ * \param info: pointer to struct with parameters
+ * \param d: filepath of the config file
+ * \param config_strings: storage for the config strings extracted from JSON,
+ * the pointer is incremented as strings are stored
+ * \param len: pointer to the remaining length left in config_strings
+ * the value is decremented as strings are stored
+ *
+ * This function creates vhosts into a context according to the settings in
+ *JSON files found in directory d.
+ *
+ * Requires CMake option LWS_WITH_LEJP_CONF to have been enabled
+ */
+LWS_VISIBLE LWS_EXTERN int
+lwsws_get_config_vhosts(struct lws_context *context,
+ struct lws_context_creation_info *info, const char *d,
+ char **config_strings, int *len);
-struct lws_gs_event_args {
- enum lws_gs_event event;
- const char *username;
- const char *email;
-};
+/** lws_vhost_get() - \deprecated deprecated: use lws_get_vhost() */
+LWS_VISIBLE LWS_EXTERN struct lws_vhost *
+lws_vhost_get(struct lws *wsi) LWS_WARN_DEPRECATED;
+/**
+ * lws_get_vhost() - return the vhost a wsi belongs to
+ *
+ * \param wsi: which connection
+ */
+LWS_VISIBLE LWS_EXTERN struct lws_vhost *
+lws_get_vhost(struct lws *wsi);
-enum lws_ext_options_types {
- EXTARG_NONE,
- EXTARG_DEC,
- EXTARG_OPT_DEC
+/**
+ * lws_json_dump_vhost() - describe vhost state and stats in JSON
+ *
+ * \param vh: the vhost
+ * \param buf: buffer to fill with JSON
+ * \param len: max length of buf
+ */
+LWS_VISIBLE LWS_EXTERN int
+lws_json_dump_vhost(const struct lws_vhost *vh, char *buf, int len);
- /* Add new things just above here ---^
- * This is part of the ABI, don't needlessly break compatibility */
-};
+/**
+ * lws_json_dump_context() - describe context state and stats in JSON
+ *
+ * \param context: the context
+ * \param buf: buffer to fill with JSON
+ * \param len: max length of buf
+ */
+LWS_VISIBLE LWS_EXTERN int
+lws_json_dump_context(const struct lws_context *context, char *buf, int len);
/**
- * struct lws_ext_options - Option arguments to the extension. These are
- * used in the negotiation at ws upgrade time.
- * The helper function lws_ext_parse_options()
- * uses these to generate callbacks
+ * lws_context_user() - get the user data associated with the context
+ * \param context: Websocket context
*
- * @name: Option name, eg, "server_no_context_takeover"
- * @type: What kind of args the option can take
+ * This returns the optional user allocation that can be attached to
+ * the context the sockets live in at context_create time. It's a way
+ * to let all sockets serviced in the same context share data without
+ * using globals statics in the user code.
*/
-struct lws_ext_options {
- const char *name;
- enum lws_ext_options_types type;
+LWS_VISIBLE LWS_EXTERN void *
+lws_context_user(struct lws_context *context);
- /* Add new things just above here ---^
- * This is part of the ABI, don't needlessly break compatibility */
+/*! \defgroup vhost-mounts Vhost mounts and options
+ * \ingroup context-and-vhost-creation
+ *
+ * ##Vhost mounts and options
+ */
+///@{
+/** struct lws_protocol_vhost_options - linked list of per-vhost protocol
+ * name=value options
+ *
+ * This provides a general way to attach a linked-list of name=value pairs,
+ * which can also have an optional child link-list using the options member.
+ */
+struct lws_protocol_vhost_options {
+ const struct lws_protocol_vhost_options *next; /**< linked list */
+ const struct lws_protocol_vhost_options *options; /**< child linked-list of more options for this node */
+ const char *name; /**< name of name=value pair */
+ const char *value; /**< value of name=value pair */
};
-struct lws_ext_option_arg {
- const char *option_name; /* may be NULL, option_index used then */
- int option_index;
- const char *start;
- int len;
+/** enum lws_mount_protocols
+ * This specifies the mount protocol for a mountpoint, whether it is to be
+ * served from a filesystem, or it is a cgi etc.
+ */
+enum lws_mount_protocols {
+ LWSMPRO_HTTP = 0, /**< not supported yet */
+ LWSMPRO_HTTPS = 1, /**< not supported yet */
+ LWSMPRO_FILE = 2, /**< serve from filesystem directory */
+ LWSMPRO_CGI = 3, /**< pass to CGI to handle */
+ LWSMPRO_REDIR_HTTP = 4, /**< redirect to http:// url */
+ LWSMPRO_REDIR_HTTPS = 5, /**< redirect to https:// url */
+ LWSMPRO_CALLBACK = 6, /**< hand by named protocol's callback */
};
-/**
- * struct lws_extension - An extension we know how to cope with
+/** struct lws_http_mount
*
- * @name: Formal extension name, eg, "permessage-deflate"
- * @callback: Service callback
- * @client_offer: String containing exts and options client offers
+ * arguments for mounting something in a vhost's url namespace
*/
+struct lws_http_mount {
+ struct lws_http_mount *mount_next;
+ /**< pointer to next struct lws_http_mount */
+ const char *mountpoint;
+ /**< mountpoint in http pathspace, eg, "/" */
+ const char *origin;
+ /**< path to be mounted, eg, "/var/www/warmcat.com" */
+ const char *def;
+ /**< default target, eg, "index.html" */
+ const char *protocol;
+ /**<"protocol-name" to handle mount */
-struct lws_extension {
- const char *name;
- lws_extension_callback_function *callback;
- const char *client_offer;
+ const struct lws_protocol_vhost_options *cgienv;
+ /**< optional linked-list of cgi options. These are created
+ * as environment variables for the cgi process
+ */
+ const struct lws_protocol_vhost_options *extra_mimetypes;
+ /**< optional linked-list of mimetype mappings */
+ const struct lws_protocol_vhost_options *interpret;
+ /**< optional linked-list of files to be interpreted */
- /* Add new things just above here ---^
- * This is part of the ABI, don't needlessly break compatibility */
-};
+ int cgi_timeout;
+ /**< seconds cgi is allowed to live, if cgi://mount type */
+ int cache_max_age;
+ /**< max-age for reuse of client cache of files, seconds */
+ unsigned int auth_mask;
+ /**< bits set here must be set for authorized client session */
+ unsigned int cache_reusable:1; /**< set if client cache may reuse this */
+ unsigned int cache_revalidate:1; /**< set if client cache should revalidate on use */
+ unsigned int cache_intermediaries:1; /**< set if intermediaries are allowed to cache */
-#ifdef LWS_WITH_PLUGINS
+ unsigned char origin_protocol; /**< one of enum lws_mount_protocols */
+ unsigned char mountpoint_len; /**< length of mountpoint string */
+};
+///@}
+///@}
-/* PLUGINS implies LIBUV */
+/*! \defgroup client
+ * \ingroup lwsapi
+ *
+ * ##Client releated functions
+ * */
+///@{
-#define LWS_PLUGIN_API_MAGIC 180
+/** struct lws_client_connect_info - parameters to connect with when using
+ * lws_client_connect_via_info() */
-struct lws_plugin_capability {
- unsigned int api_magic; /* caller fills this in, plugin fills rest */
- const struct lws_protocols *protocols;
- int count_protocols;
- const struct lws_extension *extensions;
- int count_extensions;
-};
+struct lws_client_connect_info {
+ struct lws_context *context;
+ /**< lws context to create connection in */
+ const char *address;
+ /**< remote address to connect to */
+ int port;
+ /**< remote port to connect to */
+ int ssl_connection;
+ /**< nonzero for ssl */
+ const char *path;
+ /**< uri path */
+ const char *host;
+ /**< content of host header */
+ const char *origin;
+ /**< content of origin header */
+ const char *protocol;
+ /**< list of ws protocols we could accept */
+ int ietf_version_or_minus_one;
+ /**< deprecated: currently leave at 0 or -1 */
+ void *userdata;
+ /**< if non-NULL, use this as wsi user_data instead of malloc it */
+ const struct lws_extension *client_exts;
+ /**< array of extensions that may be used on connection */
+ const char *method;
+ /**< if non-NULL, do this http method instead of ws[s] upgrade.
+ * use "GET" to be a simple http client connection */
+ struct lws *parent_wsi;
+ /**< if another wsi is responsible for this connection, give it here.
+ * this is used to make sure if the parent closes so do any
+ * child connections first. */
+ const char *uri_replace_from;
+ /**< if non-NULL, when this string is found in URIs in
+ * text/html content-encoding, it's replaced with uri_replace_to */
+ const char *uri_replace_to;
+ /**< see uri_replace_from */
+ struct lws_vhost *vhost;
+ /**< vhost to bind to (used to determine related SSL_CTX) */
-typedef int (*lws_plugin_init_func)(struct lws_context *,
- struct lws_plugin_capability *);
-typedef int (*lws_plugin_destroy_func)(struct lws_context *);
-struct lws_plugin {
- struct lws_plugin *list;
-#if (UV_VERSION_MAJOR > 0)
- uv_lib_t lib;
-#else
- void *l;
-#endif
- char name[64];
- struct lws_plugin_capability caps;
+ /* Add new things just above here ---^
+ * This is part of the ABI, don't needlessly break compatibility
+ *
+ * The below is to ensure later library versions with new
+ * members added above will see 0 (default) even if the app
+ * was not built against the newer headers.
+ */
+
+ void *_unused[4]; /**< dummy */
};
-#endif
+/**
+ * lws_client_connect_via_info() - Connect to another websocket server
+ * \param ccinfo: pointer to lws_client_connect_info struct
+ *
+ * This function creates a connection to a remote server
+ */
+LWS_VISIBLE LWS_EXTERN struct lws * LWS_WARN_UNUSED_RESULT
+lws_client_connect_via_info(struct lws_client_connect_info * ccinfo);
-/*
- * The internal exts are part of the public abi
- * If we add more extensions, publish the callback here ------v
+/**
+ * lws_client_connect() - Connect to another websocket server
+ * \deprecated DEPRECATED use lws_client_connect_via_info
+ * \param clients: Websocket context
+ * \param address: Remote server address, eg, "myserver.com"
+ * \param port: Port to connect to on the remote server, eg, 80
+ * \param ssl_connection: 0 = ws://, 1 = wss:// encrypted, 2 = wss:// allow self
+ * signed certs
+ * \param path: Websocket path on server
+ * \param host: Hostname on server
+ * \param origin: Socket origin name
+ * \param protocol: Comma-separated list of protocols being asked for from
+ * the server, or just one. The server will pick the one it
+ * likes best. If you don't want to specify a protocol, which is
+ * legal, use NULL here.
+ * \param ietf_version_or_minus_one: -1 to ask to connect using the default, latest
+ * protocol supported, or the specific protocol ordinal
+ *
+ * This function creates a connection to a remote server
+ */
+/* deprecated, use lws_client_connect_via_info() */
+LWS_VISIBLE LWS_EXTERN struct lws * LWS_WARN_UNUSED_RESULT
+lws_client_connect(struct lws_context *clients, const char *address,
+ int port, int ssl_connection, const char *path,
+ const char *host, const char *origin, const char *protocol,
+ int ietf_version_or_minus_one) LWS_WARN_DEPRECATED;
+/* deprecated, use lws_client_connect_via_info() */
+/**
+ * lws_client_connect_extended() - Connect to another websocket server
+ * \deprecated DEPRECATED use lws_client_connect_via_info
+ * \param clients: Websocket context
+ * \param address: Remote server address, eg, "myserver.com"
+ * \param port: Port to connect to on the remote server, eg, 80
+ * \param ssl_connection: 0 = ws://, 1 = wss:// encrypted, 2 = wss:// allow self
+ * signed certs
+ * \param path: Websocket path on server
+ * \param host: Hostname on server
+ * \param origin: Socket origin name
+ * \param protocol: Comma-separated list of protocols being asked for from
+ * the server, or just one. The server will pick the one it
+ * likes best.
+ * \param ietf_version_or_minus_one: -1 to ask to connect using the default, latest
+ * protocol supported, or the specific protocol ordinal
+ * \param userdata: Pre-allocated user data
+ *
+ * This function creates a connection to a remote server
*/
+LWS_VISIBLE LWS_EXTERN struct lws * LWS_WARN_UNUSED_RESULT
+lws_client_connect_extended(struct lws_context *clients, const char *address,
+ int port, int ssl_connection, const char *path,
+ const char *host, const char *origin,
+ const char *protocol, int ietf_version_or_minus_one,
+ void *userdata) LWS_WARN_DEPRECATED;
-LWS_EXTERN
-int lws_extension_callback_pm_deflate(
- struct lws_context *context, const struct lws_extension *ext,
- struct lws *wsi, enum lws_extension_callback_reasons reason,
- void *user, void *in, size_t len);
+/**
+ * lws_init_vhost_client_ssl() - also enable client SSL on an existing vhost
+ *
+ * \param info: client ssl related info
+ * \param vhost: which vhost to initialize client ssl operations on
+ *
+ * You only need to call this if you plan on using SSL client connections on
+ * the vhost. For non-SSL client connections, it's not necessary to call this.
+ *
+ * The following members of info are used during the call
+ *
+ * - options must have LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT set,
+ * otherwise the call does nothing
+ * - provided_client_ssl_ctx must be NULL to get a generated client
+ * ssl context, otherwise you can pass a prepared one in by setting it
+ * - ssl_cipher_list may be NULL or set to the client valid cipher list
+ * - ssl_ca_filepath may be NULL or client cert filepath
+ * - ssl_cert_filepath may be NULL or client cert filepath
+ * - ssl_private_key_filepath may be NULL or client cert private key
+ *
+ * You must create your vhost explicitly if you want to use this, so you have
+ * a pointer to the vhost. Create the context first with the option flag
+ * LWS_SERVER_OPTION_EXPLICIT_VHOSTS and then call lws_create_vhost() with
+ * the same info struct.
+ */
+LWS_VISIBLE LWS_EXTERN int
+lws_init_vhost_client_ssl(const struct lws_context_creation_info *info,
+ struct lws_vhost *vhost);
LWS_VISIBLE LWS_EXTERN int
-lws_set_extension_option(struct lws *wsi, const char *ext_name,
- const char *opt_name, const char *opt_val);
+lws_http_client_read(struct lws *wsi, char **buf, int *len);
+///@}
-struct lws_protocol_vhost_options {
- const struct lws_protocol_vhost_options *next;
- const struct lws_protocol_vhost_options *options;
- const char *name;
- const char *value;
-};
+/** \defgroup service Built-in service loop entry
+ *
+ * ##Built-in service loop entry
+ *
+ * If you're not using libev / libuv, these apis are needed to enter the poll()
+ * wait in lws and service any connections with pending events.
+ */
+///@{
-struct lws_http_mount {
- struct lws_http_mount *mount_next;
- const char *mountpoint; /* mountpoint in http pathspace, eg, "/" */
- const char *origin; /* path to be mounted, eg, "/var/www/warmcat.com" */
- const char *def; /* default target, eg, "index.html" */
- const char *protocol; /* "protocol-name" to handle mount */
+/**
+ * lws_service() - Service any pending websocket activity
+ * \param context: Websocket context
+ * \param timeout_ms: Timeout for poll; 0 means return immediately if nothing needed
+ * service otherwise block and service immediately, returning
+ * after the timeout if nothing needed service.
+ *
+ * This function deals with any pending websocket traffic, for three
+ * kinds of event. It handles these events on both server and client
+ * types of connection the same.
+ *
+ * 1) Accept new connections to our context's server
+ *
+ * 2) Call the receive callback for incoming frame data received by
+ * server or client connections.
+ *
+ * You need to call this service function periodically to all the above
+ * functions to happen; if your application is single-threaded you can
+ * just call it in your main event loop.
+ *
+ * Alternatively you can fork a new process that asynchronously handles
+ * calling this service in a loop. In that case you are happy if this
+ * call blocks your thread until it needs to take care of something and
+ * would call it with a large nonzero timeout. Your loop then takes no
+ * CPU while there is nothing happening.
+ *
+ * If you are calling it in a single-threaded app, you don't want it to
+ * wait around blocking other things in your loop from happening, so you
+ * would call it with a timeout_ms of 0, so it returns immediately if
+ * nothing is pending, or as soon as it services whatever was pending.
+ */
+LWS_VISIBLE LWS_EXTERN int
+lws_service(struct lws_context *context, int timeout_ms);
- const struct lws_protocol_vhost_options *cgienv;
- const struct lws_protocol_vhost_options *extra_mimetypes;
- const struct lws_protocol_vhost_options *interpret;
+/**
+ * lws_service() - Service any pending websocket activity
+ *
+ * \param context: Websocket context
+ * \param timeout_ms: Timeout for poll; 0 means return immediately if nothing needed
+ * service otherwise block and service immediately, returning
+ * after the timeout if nothing needed service.
+ *
+ * Same as lws_service(), but for a specific thread service index. Only needed
+ * if you are spawning multiple service threads.
+ */
+LWS_VISIBLE LWS_EXTERN int
+lws_service_tsi(struct lws_context *context, int timeout_ms, int tsi);
- int cgi_timeout;
- int cache_max_age;
- unsigned int auth_mask;
+/**
+ * lws_cancel_service_pt() - Cancel servicing of pending socket activity
+ * on one thread
+ * \param wsi: Cancel service on the thread this wsi is serviced by
+ *
+ * This function lets a call to lws_service() waiting for a timeout
+ * immediately return.
+ *
+ * It works by creating a phony event and then swallowing it silently.
+ *
+ * The reason it may be needed is when waiting in poll(), changes to
+ * the event masks are ignored by the OS until poll() is reentered. This
+ * lets you halt the poll() wait and make the reentry happen immediately
+ * instead of having the wait out the rest of the poll timeout.
+ */
+LWS_VISIBLE LWS_EXTERN void
+lws_cancel_service_pt(struct lws *wsi);
- unsigned int cache_reusable:1;
- unsigned int cache_revalidate:1;
- unsigned int cache_intermediaries:1;
+/**
+ * lws_cancel_service() - Cancel wait for new pending socket activity
+ * \param context: Websocket context
+ *
+ * This function let a call to lws_service() waiting for a timeout
+ * immediately return.
+ *
+ * What it basically does is provide a fake event that will be swallowed,
+ * so the wait in poll() is ended. That's useful because poll() doesn't
+ * attend to changes in POLLIN/OUT/ERR until it re-enters the wait.
+ */
+LWS_VISIBLE LWS_EXTERN void
+lws_cancel_service(struct lws_context *context);
- unsigned char origin_protocol;
- unsigned char mountpoint_len;
-};
+/**
+ * lws_service_fd() - Service polled socket with something waiting
+ * \param context: Websocket context
+ * \param pollfd: The pollfd entry describing the socket fd and which events
+ * happened.
+ *
+ * This function takes a pollfd that has POLLIN or POLLOUT activity and
+ * services it according to the state of the associated
+ * struct lws.
+ *
+ * The one call deals with all "service" that might happen on a socket
+ * including listen accepts, http files as well as websocket protocol.
+ *
+ * If a pollfd says it has something, you can just pass it to
+ * lws_service_fd() whether it is a socket handled by lws or not.
+ * If it sees it is a lws socket, the traffic will be handled and
+ * pollfd->revents will be zeroed now.
+ *
+ * If the socket is foreign to lws, it leaves revents alone. So you can
+ * see if you should service yourself by checking the pollfd revents
+ * after letting lws try to service it.
+ */
+LWS_VISIBLE LWS_EXTERN int
+lws_service_fd(struct lws_context *context, struct lws_pollfd *pollfd);
/**
- * struct lws_context_creation_info - parameters to create context with
- *
- * This is also used to create vhosts.... if LWS_SERVER_OPTION_EXPLICIT_VHOSTS
- * is not given, then for backwards compatibility one vhost is created at
- * context-creation time using the info from this struct.
- *
- * If LWS_SERVER_OPTION_EXPLICIT_VHOSTS is given, then no vhosts are created
- * at the same time as the context, they are expected to be created afterwards.
+ * lws_service_fd_tsi() - Service polled socket in specific service thread
+ * \param context: Websocket context
+ * \param pollfd: The pollfd entry describing the socket fd and which events
+ * happened.
+ * \param tsi: thread service index
*
- * @port: VHOST: Port to listen on... you can use CONTEXT_PORT_NO_LISTEN to
- * suppress listening on any port, that's what you want if you are
- * not running a websocket server at all but just using it as a
- * client
- * @iface: VHOST: NULL to bind the listen socket to all interfaces, or the
- * interface name, eg, "eth2"
- * If options specifies LWS_SERVER_OPTION_UNIX_SOCK, this member is
- * the pathname of a UNIX domain socket. you can use the UNIX domain
- * sockets in abstract namespace, by prepending an @ symbole to the
- * socket name.
- * @protocols: VHOST: Array of structures listing supported protocols and a protocol-
- * specific callback for each one. The list is ended with an
- * entry that has a NULL callback pointer.
- * It's not const because we write the owning_server member
- * @extensions: VHOST: NULL or array of lws_extension structs listing the
- * extensions this context supports. If you configured with
- * --without-extensions, you should give NULL here.
- * @token_limits: CONTEXT: NULL or struct lws_token_limits pointer which is initialized
- * with a token length limit for each possible WSI_TOKEN_***
- * @ssl_cert_filepath: VHOST: If libwebsockets was compiled to use ssl, and you want
- * to listen using SSL, set to the filepath to fetch the
- * server cert from, otherwise NULL for unencrypted
- * @ssl_private_key_filepath: VHOST: filepath to private key if wanting SSL mode;
- * if this is set to NULL but sll_cert_filepath is set, the
- * OPENSSL_CONTEXT_REQUIRES_PRIVATE_KEY callback is called
- * to allow setting of the private key directly via openSSL
- * library calls
- * @ssl_ca_filepath: VHOST: CA certificate filepath or NULL
- * @ssl_cipher_list: VHOST: List of valid ciphers to use (eg,
- * "RC4-MD5:RC4-SHA:AES128-SHA:AES256-SHA:HIGH:!DSS:!aNULL"
- * or you can leave it as NULL to get "DEFAULT"
- * @http_proxy_address: VHOST: If non-NULL, attempts to proxy via the given address.
- * If proxy auth is required, use format
- * "username:password@server:port"
- * @http_proxy_port: VHOST: If http_proxy_address was non-NULL, uses this port at
- * the address
- * @gid: CONTEXT: group id to change to after setting listen socket, or -1.
- * @uid: CONTEXT: user id to change to after setting listen socket, or -1.
- * @options: VHOST + CONTEXT: 0, or LWS_SERVER_OPTION_... bitfields
- * @user: CONTEXT: optional user pointer that can be recovered via the context
- * pointer using lws_context_user
- * @ka_time: CONTEXT: 0 for no keepalive, otherwise apply this keepalive timeout to
- * all libwebsocket sockets, client or server
- * @ka_probes: CONTEXT: if ka_time was nonzero, after the timeout expires how many
- * times to try to get a response from the peer before giving up
- * and killing the connection
- * @ka_interval: CONTEXT: if ka_time was nonzero, how long to wait before each ka_probes
- * attempt
- * @provided_client_ssl_ctx: CONTEXT: If non-null, swap out libwebsockets ssl
- * implementation for the one provided by provided_ssl_ctx.
- * Libwebsockets no longer is responsible for freeing the context
- * if this option is selected.
- * @max_http_header_data: CONTEXT: The max amount of header payload that can be handled
- * in an http request (unrecognized header payload is dropped)
- * @max_http_header_pool: CONTEXT: The max number of connections with http headers that
- * can be processed simultaneously (the corresponding memory is
- * allocated for the lifetime of the context). If the pool is
- * busy new incoming connections must wait for accept until one
- * becomes free.
- * @count_threads: CONTEXT: how many contexts to create in an array, 0 = 1
- * @fd_limit_per_thread: CONTEXT: nonzero means restrict each service thread to this
- * many fds, 0 means the default which is divide the process fd
- * limit by the number of threads.
- * @timeout_secs: VHOST: various processes involving network roundtrips in the
- * library are protected from hanging forever by timeouts. If
- * nonzero, this member lets you set the timeout used in seconds.
- * Otherwise a default timeout is used.
- * @ecdh_curve: VHOST: if NULL, defaults to initializing server with "prime256v1"
- * @vhost_name: VHOST: name of vhost, must match external DNS name used to
- * access the site, like "warmcat.com" as it's used to match
- * Host: header and / or SNI name for SSL.
- * @plugin_dirs: CONTEXT: NULL, or NULL-terminated array of directories to
- * scan for lws protocol plugins at context creation time
- * @pvo: VHOST: pointer to optional linked list of per-vhost
- * options made accessible to protocols
- * @keepalive_timeout: VHOST: (default = 0 = 60s) seconds to allow remote
- * client to hold on to an idle HTTP/1.1 connection
- * @log_filepath: VHOST: filepath to append logs to... this is opened before
- * any dropping of initial privileges
- * @mounts: VHOST: optional linked list of mounts for this vhost
- * @server_string: CONTEXT: string used in HTTP headers to identify server
- * software, if NULL, "libwebsockets".
- * @pt_serv_buf_size: CONTEXT: 0 = default of 4096. This buffer is used by
- * various service related features including file serving, it
- * defines the max chunk of file that can be sent at once.
- * At the risk of lws having to buffer failed large sends, it
- * can be increased to, eg, 128KiB to improve throughput.
- * @max_http_header_data2 CONTEXT: if @max_http_header_data is 0 and this
- * is nonzero, this will be used in place of the default. It's
- * like this for compatibility with the original short version,
- * this is unsigned int length.
- * @ssl_options_set: VHOST: Any bits set here will be set as SSL options
- * @ssl_options_clear: VHOST: Any bits set here will be cleared as SSL options
+ * Same as lws_service_fd() but used with multiple service threads
*/
+LWS_VISIBLE LWS_EXTERN int
+lws_service_fd_tsi(struct lws_context *context, struct lws_pollfd *pollfd,
+ int tsi);
-struct lws_context_creation_info {
- int port; /* VH */
- const char *iface; /* VH */
- const struct lws_protocols *protocols; /* VH */
- const struct lws_extension *extensions; /* VH */
- const struct lws_token_limits *token_limits; /* context */
- const char *ssl_private_key_password; /* VH */
- const char *ssl_cert_filepath; /* VH */
- const char *ssl_private_key_filepath; /* VH */
- const char *ssl_ca_filepath; /* VH */
- const char *ssl_cipher_list; /* VH */
- const char *http_proxy_address; /* VH */
- unsigned int http_proxy_port; /* VH */
- int gid; /* context */
- int uid; /* context */
- unsigned int options; /* VH + context */
- void *user; /* context */
- int ka_time; /* context */
- int ka_probes; /* context */
- int ka_interval; /* context */
-#ifdef LWS_OPENSSL_SUPPORT
- SSL_CTX *provided_client_ssl_ctx; /* context */
-#else /* maintain structure layout either way */
- void *provided_client_ssl_ctx;
-#endif
+///@}
- short max_http_header_data; /* context */
- short max_http_header_pool; /* context */
-
- unsigned int count_threads; /* context */
- unsigned int fd_limit_per_thread; /* context */
- unsigned int timeout_secs; /* VH */
- const char *ecdh_curve; /* VH */
- const char *vhost_name; /* VH */
- const char * const *plugin_dirs; /* context */
- const struct lws_protocol_vhost_options *pvo; /* VH */
- int keepalive_timeout; /* VH */
- const char *log_filepath; /* VH */
- const struct lws_http_mount *mounts; /* VH */
- const char *server_string; /* context */
- unsigned int pt_serv_buf_size; /* context */
- unsigned int max_http_header_data2; /* context */
- long ssl_options_set; /* VH */
- long ssl_options_clear; /* VH */
+/*! \defgroup http HTTP
- /* Add new things just above here ---^
- * This is part of the ABI, don't needlessly break compatibility
- *
- * The below is to ensure later library versions with new
- * members added above will see 0 (default) even if the app
- * was not built against the newer headers.
- */
+ Modules related to handling HTTP
+*/
+//@{
- void *_unused[8];
-};
+/*! \defgroup httpft HTTP File transfer
+ * \ingroup http
+
+ APIs for sending local files in response to HTTP requests
+*/
+//@{
/**
- * struct lws_client_connect_info - parameters to connect with when using
- * lws_client_connect_via_info()
- *
- * @context: lws context to create connection in
- * @address: remote address to connect to
- * @port: remote port to connect to
- * @ssl_connection: nonzero for ssl
- * @path: uri path
- * @host: content of host header
- * @origin: content of origin header
- * @protocol: list of ws protocols
- * @ietf_version_or_minus_one: currently leave at 0 or -1
- * @userdata: if non-NULL, use this as wsi user_data instead of malloc it
- * @client_exts: array of extensions that may be used on connection
- * @method: if non-NULL, do this http method instead of ws[s] upgrade.
- * use "GET" to be a simple http client connection
- * @parent_wsi: if another wsi is responsible for this connection, give it here.
- * this is used to make sure if the parent closes so do any
- * child connections first.
- * @uri_replace_from: if non-NULL, when this string is found in URIs in
- * text/html content-encoding, it's replaced with @uri_replace_to
- * @uri_replace_to: see above
- * @vhost: vhost to bind to (used to determine related SSL_CTX)
+ * lws_serve_http_file() - Send a file back to the client using http
+ * \param wsi: Websocket instance (available from user callback)
+ * \param file: The file to issue over http
+ * \param content_type: The http content type, eg, text/html
+ * \param other_headers: NULL or pointer to header string
+ * \param other_headers_len: length of the other headers if non-NULL
+ *
+ * This function is intended to be called from the callback in response
+ * to http requests from the client. It allows the callback to issue
+ * local files down the http link in a single step.
+ *
+ * Returning <0 indicates error and the wsi should be closed. Returning
+ * >0 indicates the file was completely sent and
+ * lws_http_transaction_completed() called on the wsi (and close if != 0)
+ * ==0 indicates the file transfer is started and needs more service later,
+ * the wsi should be left alone.
+ */
+LWS_VISIBLE LWS_EXTERN int
+lws_serve_http_file(struct lws *wsi, const char *file, const char *content_type,
+ const char *other_headers, int other_headers_len);
+LWS_VISIBLE LWS_EXTERN int
+lws_serve_http_file_fragment(struct lws *wsi);
+//@}
+
+/*! \defgroup html-chunked-substitution HTML Chunked Substitution
+ * \ingroup http
+ *
+ * ##HTML chunked Substitution
+ *
+ * APIs for receiving chunks of text, replacing a set of variable names via
+ * a callback, and then prepending and appending HTML chunked encoding
+ * headers.
*/
+//@{
-struct lws_client_connect_info {
- struct lws_context *context;
- const char *address;
- int port;
- int ssl_connection;
- const char *path;
- const char *host;
- const char *origin;
- const char *protocol;
- int ietf_version_or_minus_one;
- void *userdata;
- const struct lws_extension *client_exts;
- const char *method;
- struct lws *parent_wsi;
- const char *uri_replace_from;
- const char *uri_replace_to;
- struct lws_vhost *vhost;
+enum http_status {
+ HTTP_STATUS_OK = 200,
+ HTTP_STATUS_NO_CONTENT = 204,
- /* Add new things just above here ---^
- * This is part of the ABI, don't needlessly break compatibility
- *
- * The below is to ensure later library versions with new
- * members added above will see 0 (default) even if the app
- * was not built against the newer headers.
- */
+ HTTP_STATUS_MOVED_PERMANENTLY = 301,
+ HTTP_STATUS_FOUND = 302,
+ HTTP_STATUS_SEE_OTHER = 303,
+
+ HTTP_STATUS_BAD_REQUEST = 400,
+ HTTP_STATUS_UNAUTHORIZED,
+ HTTP_STATUS_PAYMENT_REQUIRED,
+ HTTP_STATUS_FORBIDDEN,
+ HTTP_STATUS_NOT_FOUND,
+ HTTP_STATUS_METHOD_NOT_ALLOWED,
+ HTTP_STATUS_NOT_ACCEPTABLE,
+ HTTP_STATUS_PROXY_AUTH_REQUIRED,
+ HTTP_STATUS_REQUEST_TIMEOUT,
+ HTTP_STATUS_CONFLICT,
+ HTTP_STATUS_GONE,
+ HTTP_STATUS_LENGTH_REQUIRED,
+ HTTP_STATUS_PRECONDITION_FAILED,
+ HTTP_STATUS_REQ_ENTITY_TOO_LARGE,
+ HTTP_STATUS_REQ_URI_TOO_LONG,
+ HTTP_STATUS_UNSUPPORTED_MEDIA_TYPE,
+ HTTP_STATUS_REQ_RANGE_NOT_SATISFIABLE,
+ HTTP_STATUS_EXPECTATION_FAILED,
- void *_unused[4];
+ HTTP_STATUS_INTERNAL_SERVER_ERROR = 500,
+ HTTP_STATUS_NOT_IMPLEMENTED,
+ HTTP_STATUS_BAD_GATEWAY,
+ HTTP_STATUS_SERVICE_UNAVAILABLE,
+ HTTP_STATUS_GATEWAY_TIMEOUT,
+ HTTP_STATUS_HTTP_VERSION_NOT_SUPPORTED,
};
-enum {
- LWSMPRO_HTTP = 0,
- LWSMPRO_HTTPS = 1,
- LWSMPRO_FILE = 2,
- LWSMPRO_CGI = 3,
- LWSMPRO_REDIR_HTTP = 4,
- LWSMPRO_REDIR_HTTPS = 5,
- LWSMPRO_CALLBACK = 6,
+struct lws_process_html_args {
+ char *p; /**< pointer to the buffer containing the data */
+ int len; /**< length of the original data at p */
+ int max_len; /**< maximum length we can grow the data to */
+ int final; /**< set if this is the last chunk of the file */
};
-LWS_VISIBLE LWS_EXTERN int
-lws_json_dump_vhost(const struct lws_vhost *vh, char *buf, int len);
+typedef const char *(*lws_process_html_state_cb)(void *data, int index);
-LWS_VISIBLE LWS_EXTERN int
-lws_json_dump_context(const struct lws_context *context, char *buf, int len);
+struct lws_process_html_state {
+ char *start; /**< pointer to start of match */
+ char swallow[16]; /**< matched character buffer */
+ int pos; /**< position in match */
+ void *data; /**< opaque pointer */
+ const char * const *vars; /**< list of variable names */
+ int count_vars; /**< count of variable names */
+
+ lws_process_html_state_cb replace; /**< called on match to perform substitution */
+};
-LWS_VISIBLE LWS_EXTERN void
-lws_set_log_level(int level,
- void (*log_emit_function)(int level, const char *line));
+/*! lws_chunked_html_process() - generic chunked substitution
+ * \param args: buffer to process using chunked encoding
+ * \param s: current processing state
+ */
+LWS_VISIBLE LWS_EXTERN int
+lws_chunked_html_process(struct lws_process_html_args *args,
+ struct lws_process_html_state *s);
+//@}
-LWS_VISIBLE LWS_EXTERN void
-lwsl_emit_syslog(int level, const char *line);
+/** \defgroup HTTP-headers-read HTTP headers: read
+ * \ingroup http
+ *
+ * ##HTTP header releated functions
+ *
+ * In lws the client http headers are temporarily stored in a pool, only for the
+ * duration of the http part of the handshake. It's because in most cases,
+ * the header content is ignored for the whole rest of the connection lifetime
+ * and would then just be taking up space needlessly.
+ *
+ * During LWS_CALLBACK_HTTP when the URI path is delivered is the last time
+ * the http headers are still allocated, you can use these apis then to
+ * look at and copy out interesting header content (cookies, etc)
+ *
+ * Notice that the header total length reported does not include a terminating
+ * '\0', however you must allocate for it when using the _copy apis. So the
+ * length reported for a header containing "123" is 3, but you must provide
+ * a buffer of length 4 so that "123\0" may be copied into it, or the copy
+ * will fail with a nonzero return code.
+ *
+ * In the special case of URL arguments, like ?x=1&y=2, the arguments are
+ * stored in a token named for the method, eg, WSI_TOKEN_GET_URI if it
+ * was a GET or WSI_TOKEN_POST_URI if POST. You can check the total
+ * length to confirm the method.
+ *
+ * For URL arguments, each argument is stored urldecoded in a "fragment", so
+ * you can use the fragment-aware api lws_hdr_copy_fragment() to access each
+ * argument in turn: the fragments contain urldecoded strings like x=1 or y=2.
+ *
+ * As a convenience, lws has an api that will find the fragment with a
+ * given name= part, lws_get_urlarg_by_name().
+ */
+///@{
-LWS_VISIBLE LWS_EXTERN struct lws_context *
-lws_create_context(struct lws_context_creation_info *info);
+/** struct lws_tokens
+ * you need these to look at headers that have been parsed if using the
+ * LWS_CALLBACK_FILTER_CONNECTION callback. If a header from the enum
+ * list below is absent, .token = NULL and token_len = 0. Otherwise .token
+ * points to .token_len chars containing that header content.
+ */
+struct lws_tokens {
+ char *token; /**< pointer to start of the token */
+ int token_len; /**< length of the token's value */
+};
-struct lws_vhost;
+/* enum lws_token_indexes
+ * these have to be kept in sync with lextable.h / minilex.c
+ *
+ * NOTE: These public enums are part of the abi. If you want to add one,
+ * add it at where specified so existing users are unaffected.
+ */
+enum lws_token_indexes {
+ WSI_TOKEN_GET_URI = 0,
+ WSI_TOKEN_POST_URI = 1,
+ WSI_TOKEN_OPTIONS_URI = 2,
+ WSI_TOKEN_HOST = 3,
+ WSI_TOKEN_CONNECTION = 4,
+ WSI_TOKEN_UPGRADE = 5,
+ WSI_TOKEN_ORIGIN = 6,
+ WSI_TOKEN_DRAFT = 7,
+ WSI_TOKEN_CHALLENGE = 8,
+ WSI_TOKEN_EXTENSIONS = 9,
+ WSI_TOKEN_KEY1 = 10,
+ WSI_TOKEN_KEY2 = 11,
+ WSI_TOKEN_PROTOCOL = 12,
+ WSI_TOKEN_ACCEPT = 13,
+ WSI_TOKEN_NONCE = 14,
+ WSI_TOKEN_HTTP = 15,
+ WSI_TOKEN_HTTP2_SETTINGS = 16,
+ WSI_TOKEN_HTTP_ACCEPT = 17,
+ WSI_TOKEN_HTTP_AC_REQUEST_HEADERS = 18,
+ WSI_TOKEN_HTTP_IF_MODIFIED_SINCE = 19,
+ WSI_TOKEN_HTTP_IF_NONE_MATCH = 20,
+ WSI_TOKEN_HTTP_ACCEPT_ENCODING = 21,
+ WSI_TOKEN_HTTP_ACCEPT_LANGUAGE = 22,
+ WSI_TOKEN_HTTP_PRAGMA = 23,
+ WSI_TOKEN_HTTP_CACHE_CONTROL = 24,
+ WSI_TOKEN_HTTP_AUTHORIZATION = 25,
+ WSI_TOKEN_HTTP_COOKIE = 26,
+ WSI_TOKEN_HTTP_CONTENT_LENGTH = 27,
+ WSI_TOKEN_HTTP_CONTENT_TYPE = 28,
+ WSI_TOKEN_HTTP_DATE = 29,
+ WSI_TOKEN_HTTP_RANGE = 30,
+ WSI_TOKEN_HTTP_REFERER = 31,
+ WSI_TOKEN_KEY = 32,
+ WSI_TOKEN_VERSION = 33,
+ WSI_TOKEN_SWORIGIN = 34,
-LWS_EXTERN LWS_VISIBLE struct lws_vhost *
-lws_create_vhost(struct lws_context *context,
- struct lws_context_creation_info *info);
+ WSI_TOKEN_HTTP_COLON_AUTHORITY = 35,
+ WSI_TOKEN_HTTP_COLON_METHOD = 36,
+ WSI_TOKEN_HTTP_COLON_PATH = 37,
+ WSI_TOKEN_HTTP_COLON_SCHEME = 38,
+ WSI_TOKEN_HTTP_COLON_STATUS = 39,
-LWS_VISIBLE LWS_EXTERN int
-lws_init_vhost_client_ssl(const struct lws_context_creation_info *info,
- struct lws_vhost *vhost);
+ WSI_TOKEN_HTTP_ACCEPT_CHARSET = 40,
+ WSI_TOKEN_HTTP_ACCEPT_RANGES = 41,
+ WSI_TOKEN_HTTP_ACCESS_CONTROL_ALLOW_ORIGIN = 42,
+ WSI_TOKEN_HTTP_AGE = 43,
+ WSI_TOKEN_HTTP_ALLOW = 44,
+ WSI_TOKEN_HTTP_CONTENT_DISPOSITION = 45,
+ WSI_TOKEN_HTTP_CONTENT_ENCODING = 46,
+ WSI_TOKEN_HTTP_CONTENT_LANGUAGE = 47,
+ WSI_TOKEN_HTTP_CONTENT_LOCATION = 48,
+ WSI_TOKEN_HTTP_CONTENT_RANGE = 49,
+ WSI_TOKEN_HTTP_ETAG = 50,
+ WSI_TOKEN_HTTP_EXPECT = 51,
+ WSI_TOKEN_HTTP_EXPIRES = 52,
+ WSI_TOKEN_HTTP_FROM = 53,
+ WSI_TOKEN_HTTP_IF_MATCH = 54,
+ WSI_TOKEN_HTTP_IF_RANGE = 55,
+ WSI_TOKEN_HTTP_IF_UNMODIFIED_SINCE = 56,
+ WSI_TOKEN_HTTP_LAST_MODIFIED = 57,
+ WSI_TOKEN_HTTP_LINK = 58,
+ WSI_TOKEN_HTTP_LOCATION = 59,
+ WSI_TOKEN_HTTP_MAX_FORWARDS = 60,
+ WSI_TOKEN_HTTP_PROXY_AUTHENTICATE = 61,
+ WSI_TOKEN_HTTP_PROXY_AUTHORIZATION = 62,
+ WSI_TOKEN_HTTP_REFRESH = 63,
+ WSI_TOKEN_HTTP_RETRY_AFTER = 64,
+ WSI_TOKEN_HTTP_SERVER = 65,
+ WSI_TOKEN_HTTP_SET_COOKIE = 66,
+ WSI_TOKEN_HTTP_STRICT_TRANSPORT_SECURITY = 67,
+ WSI_TOKEN_HTTP_TRANSFER_ENCODING = 68,
+ WSI_TOKEN_HTTP_USER_AGENT = 69,
+ WSI_TOKEN_HTTP_VARY = 70,
+ WSI_TOKEN_HTTP_VIA = 71,
+ WSI_TOKEN_HTTP_WWW_AUTHENTICATE = 72,
-LWS_VISIBLE LWS_EXTERN const struct lws_protocols *
-lws_vhost_name_to_protocol(struct lws_vhost *vh, const char *name);
+ WSI_TOKEN_PATCH_URI = 73,
+ WSI_TOKEN_PUT_URI = 74,
+ WSI_TOKEN_DELETE_URI = 75,
-/* deprecated: use lws_get_vhost() */
-LWS_VISIBLE LWS_EXTERN struct lws_vhost *
-lws_vhost_get(struct lws *wsi) LWS_WARN_DEPRECATED;
+ WSI_TOKEN_HTTP_URI_ARGS = 76,
+ WSI_TOKEN_PROXY = 77,
+ WSI_TOKEN_HTTP_X_REAL_IP = 78,
+ WSI_TOKEN_HTTP1_0 = 79,
-LWS_VISIBLE LWS_EXTERN struct lws_vhost *
-lws_get_vhost(struct lws *wsi);
+ /****** add new things just above ---^ ******/
-/* deprecated: use lws_get_protocol */
-LWS_VISIBLE LWS_EXTERN const struct lws_protocols *
-lws_protocol_get(struct lws *wsi) LWS_WARN_DEPRECATED;
+ /* use token storage to stash these internally, not for
+ * user use */
-LWS_VISIBLE LWS_EXTERN void *
-lws_protocol_vh_priv_zalloc(struct lws_vhost *vhost, const struct lws_protocols *prot,
- int size);
-LWS_VISIBLE LWS_EXTERN void *
-lws_protocol_vh_priv_get(struct lws_vhost *vhost, const struct lws_protocols *prot);
+ _WSI_TOKEN_CLIENT_SENT_PROTOCOLS,
+ _WSI_TOKEN_CLIENT_PEER_ADDRESS,
+ _WSI_TOKEN_CLIENT_URI,
+ _WSI_TOKEN_CLIENT_HOST,
+ _WSI_TOKEN_CLIENT_ORIGIN,
+ _WSI_TOKEN_CLIENT_METHOD,
-LWS_VISIBLE LWS_EXTERN int
-lws_finalize_startup(struct lws_context *context);
+ /* always last real token index*/
+ WSI_TOKEN_COUNT,
-LWS_VISIBLE LWS_EXTERN int
-lws_set_proxy(struct lws_vhost *vhost, const char *proxy);
+ /* parser state additions, no storage associated */
+ WSI_TOKEN_NAME_PART,
+ WSI_TOKEN_SKIPPING,
+ WSI_TOKEN_SKIPPING_SAW_CR,
+ WSI_PARSING_COMPLETE,
+ WSI_INIT_TOKEN_MUXURL,
+};
-LWS_VISIBLE LWS_EXTERN void
-lws_context_destroy(struct lws_context *context);
+struct lws_token_limits {
+ unsigned short token_limit[WSI_TOKEN_COUNT]; /**< max chars for this token */
+};
-LWS_VISIBLE LWS_EXTERN int
-lws_service(struct lws_context *context, int timeout_ms);
+/**
+ * lws_token_to_string() - returns a textual representation of a hdr token index
+ *
+ * \param: token index
+ */
+LWS_VISIBLE LWS_EXTERN const unsigned char *
+lws_token_to_string(enum lws_token_indexes token);
-LWS_VISIBLE LWS_EXTERN int
-lws_service_tsi(struct lws_context *context, int timeout_ms, int tsi);
-LWS_VISIBLE LWS_EXTERN void
-lws_cancel_service_pt(struct lws *wsi);
+/**
+ * lws_hdr_total_length: report length of all fragments of a header totalled up
+ * The returned length does not include the space for a
+ * terminating '\0'
+ *
+ * \param wsi: websocket connection
+ * \param h: which header index we are interested in
+ */
+LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
+lws_hdr_total_length(struct lws *wsi, enum lws_token_indexes h);
-LWS_VISIBLE LWS_EXTERN void
-lws_cancel_service(struct lws_context *context);
+/**
+ * lws_hdr_fragment_length: report length of a single fragment of a header
+ * The returned length does not include the space for a
+ * terminating '\0'
+ *
+ * \param wsi: websocket connection
+ * \param h: which header index we are interested in
+ * \param frag_idx: which fragment of h we want to get the length of
+ */
+LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
+lws_hdr_fragment_length(struct lws *wsi, enum lws_token_indexes h, int frag_idx);
+/**
+ * lws_hdr_copy() - copy a single fragment of the given header to a buffer
+ * The buffer length len must include space for an additional
+ * terminating '\0', or it will fail returning -1.
+ *
+ * \param wsi: websocket connection
+ * \param dest: destination buffer
+ * \param len: length of destination buffer
+ * \param h: which header index we are interested in
+ *
+ * copies the whole, aggregated header, even if it was delivered in
+ * several actual headers piece by piece
+ */
LWS_VISIBLE LWS_EXTERN int
-lws_interface_to_sa(int ipv6, const char *ifname, struct sockaddr_in *addr,
- size_t addrlen);
+lws_hdr_copy(struct lws *wsi, char *dest, int len, enum lws_token_indexes h);
-LWS_VISIBLE LWS_EXTERN const unsigned char *
-lws_token_to_string(enum lws_token_indexes token);
+/**
+ * lws_hdr_copy_fragment() - copy a single fragment of the given header to a buffer
+ * The buffer length len must include space for an additional
+ * terminating '\0', or it will fail returning -1.
+ * If the requested fragment index is not present, it fails
+ * returning -1.
+ *
+ * \param wsi: websocket connection
+ * \param dest: destination buffer
+ * \param len: length of destination buffer
+ * \param h: which header index we are interested in
+ * \param frag_idx: which fragment of h we want to copy
+ *
+ * Normally this is only useful
+ * to parse URI arguments like ?x=1&y=2, token index WSI_TOKEN_HTTP_URI_ARGS
+ * fragment 0 will contain "x=1" and fragment 1 "y=2"
+ */
+LWS_VISIBLE LWS_EXTERN int
+lws_hdr_copy_fragment(struct lws *wsi, char *dest, int len,
+ enum lws_token_indexes h, int frag_idx);
-/* all the below must be LWS_WARN_UNUSED_RESULT as they can run short */
+/**
+ * lws_get_urlarg_by_name() - return pointer to arg value if present
+ * \param wsi: the connection to check
+ * \param name: the arg name, like "token="
+ * \param buf: the buffer to receive the urlarg (including the name= part)
+ * \param len: the length of the buffer to receive the urlarg
+ *
+ * Returns NULL if not found or a pointer inside buf to just after the
+ * name= part.
+ */
+LWS_VISIBLE LWS_EXTERN const char *
+lws_get_urlarg_by_name(struct lws *wsi, const char *name, char *buf, int len);
+///@}
+/*! \defgroup HTTP-headers-create HTTP headers: create
+ *
+ * ## HTTP headers: Create
+ *
+ * These apis allow you to create HTTP response headers in a way compatible with
+ * both HTTP/1.x and HTTP/2.
+ *
+ * They each append to a buffer taking care about the buffer end, which is
+ * passed in as a pointer. When data is written to the buffer, the current
+ * position p is updated accordingly.
+ *
+ * All of these apis are LWS_WARN_UNUSED_RESULT as they can run out of space
+ * and fail with nonzero return.
+ */
+///@{
+/**
+ * lws_add_http_header_status() - add the HTTP response status code
+ *
+ * \param wsi: the connection to check
+ * \param code: an HTTP code like 200, 404 etc (see enum http_status)
+ * \param p: pointer to current position in buffer pointer
+ * \param end: pointer to end of buffer
+ *
+ * Adds the initial response code, so should be called first
+ */
+LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
+lws_add_http_header_status(struct lws *wsi,
+ unsigned int code, unsigned char **p,
+ unsigned char *end);
+/**
+ * lws_add_http_header_by_name() - append named header and value
+ *
+ * \param wsi: the connection to check
+ * \param name: the hdr name, like "my-header"
+ * \param value: the value after the = for this header
+ * \param length: the length of the value
+ * \param p: pointer to current position in buffer pointer
+ * \param end: pointer to end of buffer
+ *
+ * Appends name: value to the headers
+ */
LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
lws_add_http_header_by_name(struct lws *wsi, const unsigned char *name,
const unsigned char *value, int length,
unsigned char **p, unsigned char *end);
-LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
-lws_finalize_http_header(struct lws *wsi, unsigned char **p,
- unsigned char *end);
+/**
+ * lws_add_http_header_by_token() - append given header and value
+ *
+ * \param wsi: the connection to check
+ * \param token: the token index for the hdr
+ * \param value: the value after the = for this header
+ * \param length: the length of the value
+ * \param p: pointer to current position in buffer pointer
+ * \param end: pointer to end of buffer
+ *
+ * Appends name=value to the headers, but is able to take advantage of better
+ * HTTP/2 coding mechanisms where possible.
+ */
LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
lws_add_http_header_by_token(struct lws *wsi, enum lws_token_indexes token,
const unsigned char *value, int length,
unsigned char **p, unsigned char *end);
+/**
+ * lws_add_http_header_by_name() - append content-length helper
+ *
+ * \param wsi: the connection to check
+ * \param content_length: the content length to use
+ * \param p: pointer to current position in buffer pointer
+ * \param end: pointer to end of buffer
+ *
+ * Appends content-length: content_length to the headers
+ */
LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
lws_add_http_header_content_length(struct lws *wsi,
unsigned long content_length,
unsigned char **p, unsigned char *end);
-LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
-lws_add_http_header_status(struct lws *wsi,
- unsigned int code, unsigned char **p,
- unsigned char *end);
-
-LWS_VISIBLE LWS_EXTERN const char *
-lws_urlencode(char *escaped, const char *string, int len);
-
-LWS_VISIBLE LWS_EXTERN const char *
-lws_sql_purify(char *escaped, const char *string, int len);
-
-LWS_VISIBLE LWS_EXTERN const char *
-lws_json_purify(char *escaped, const char *string, int len);
-
-/*
- * URLDECODE 1 / 2
+/**
+ * lws_finalize_http_header() - terminate header block
*
- * This simple urldecode only operates until the first '\0' and requires the
- * data to exist all at once
+ * \param wsi: the connection to check
+ * \param p: pointer to current position in buffer pointer
+ * \param end: pointer to end of buffer
+ *
+ * Indicates no more headers will be added
*/
+LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
+lws_finalize_http_header(struct lws *wsi, unsigned char **p,
+ unsigned char *end);
+///@}
-LWS_VISIBLE LWS_EXTERN int
-lws_urldecode(char *string, const char *escaped, int len);
-
-
-/*
- * URLDECODE 2 / 2
+/** \defgroup form-parsing Form Parsing
+ * \ingroup http
+ * ##POSTed form parsing functions
+ *
+ * These lws_spa (stateful post arguments) apis let you parse and urldecode
+ * POSTed form arguments, both using simple urlencoded and multipart transfer
+ * encoding.
+ *
+ * It's capable of handling file uploads as well a named input parsing,
+ * and the apis are the same for both form upload styles.
*
- * These apis let you manage a form data parser that is capable of handling
- * both urlencoded POST bodies and multipart ones (including file upload)
+ * You feed it a list of parameter names and it creates pointers to the
+ * urldecoded arguments: file upload parameters pass the file data in chunks to
+ * a user-supplied callback as they come.
*
- * Since it's stateful, and the decoded area is malloc'd, this is robust
- * enough to handle the form data coming in multiple POST_BODY packets without
- * having to get into any special code.
+ * Since it's stateful, it handles the incoming data needing more than one
+ * POST_BODY callback and has no limit on uploaded file size.
*/
+///@{
+/** enum lws_spa_fileupload_states */
enum lws_spa_fileupload_states {
LWS_UFS_CONTENT,
+ /**< a chunk of file content has arrived */
LWS_UFS_FINAL_CONTENT,
+ /**< the last chunk (possibly zero length) of file content has arrived */
LWS_UFS_OPEN
+ /**< a new file is starting to arrive */
};
+/**
+ * lws_spa_fileupload_cb() - callback to receive file upload data
+ *
+ * \param data: opt_data pointer set in lws_spa_create
+ * \param name: name of the form field being uploaded
+ * \param filename: original filename from client
+ * \param buf: start of data to receive
+ * \param len: length of data to receive
+ * \param state: information about how this call relates to file
+ *
+ * Notice name and filename shouldn't be trusted, as they are passed from
+ * HTTP provided by the client.
+ */
typedef int (*lws_spa_fileupload_cb)(void *data, const char *name,
const char *filename, char *buf, int len,
enum lws_spa_fileupload_states state);
+/** struct lws_spa - opaque urldecode parser capable of handling multipart
+ * and file uploads */
struct lws_spa;
+/**
+ * lws_spa_create() - create urldecode parser
+ *
+ * \param wsi: lws connection (used to find Content Type)
+ * \param param_names: array of form parameter names, like "username"
+ * \param count_params: count of param_names
+ * \param max_storage: total amount of form parameter values we can store
+ * \param opt_cb: NULL, or callback to receive file upload data.
+ * \param opt_data: NULL, or user pointer provided to opt_cb.
+ *
+ * Creates a urldecode parser and initializes it.
+ *
+ * opt_cb can be NULL if you just want normal name=value parsing, however
+ * if one or more entries in your form are bulk data (file transfer), you
+ * can provide this callback and filter on the name callback parameter to
+ * treat that urldecoded data separately. The callback should return -1
+ * in case of fatal error, and 0 if OK.
+ */
LWS_VISIBLE LWS_EXTERN struct lws_spa *
lws_spa_create(struct lws *wsi, const char * const *param_names,
int count_params, int max_storage, lws_spa_fileupload_cb opt_cb,
void *opt_data);
+/**
+ * lws_spa_process() - parses a chunk of input data
+ *
+ * \param spa: the parser object previously created
+ * \param in: incoming, urlencoded data
+ * \param len: count of bytes valid at \param in
+ */
LWS_VISIBLE LWS_EXTERN int
-lws_spa_process(struct lws_spa *ludspa, const char *in, int len);
+lws_spa_process(struct lws_spa *spa, const char *in, int len);
+/**
+ * lws_spa_finalize() - indicate incoming data completed
+ *
+ * \param spa: the parser object previously created
+ */
LWS_VISIBLE LWS_EXTERN int
-lws_spa_finalize(struct lws_spa *ludspa);
+lws_spa_finalize(struct lws_spa *spa);
+/**
+ * lws_spa_get_length() - return length of parameter value
+ *
+ * \param spa: the parser object previously created
+ * \param n: parameter ordinal to return length of value for
+ */
LWS_VISIBLE LWS_EXTERN int
-lws_spa_get_length(struct lws_spa *ludspa, int n);
+lws_spa_get_length(struct lws_spa *spa, int n);
+/**
+ * lws_spa_get_string() - return pointer to parameter value
+ * \param spa: the parser object previously created
+ * \param n: parameter ordinal to return pointer to value for
+ */
LWS_VISIBLE LWS_EXTERN const char *
-lws_spa_get_string(struct lws_spa *ludspa, int n);
+lws_spa_get_string(struct lws_spa *spa, int n);
+/**
+ * lws_spa_destroy() - destroy parser object
+ *
+ * \param spa: the parser object previously created
+ */
LWS_VISIBLE LWS_EXTERN int
-lws_spa_destroy(struct lws_spa *ludspa);
+lws_spa_destroy(struct lws_spa *spa);
+///@}
+
+/*! \defgroup urlendec Urlencode and Urldecode
+ * \ingroup http
+ *
+ * ##HTML chunked Substitution
+ *
+ * APIs for receiving chunks of text, replacing a set of variable names via
+ * a callback, and then prepending and appending HTML chunked encoding
+ * headers.
+ */
+//@{
+
+/**
+ * lws_urlencode() - like strncpy but with urlencoding
+ *
+ * \param escaped: output buffer
+ * \param string: input buffer ('/0' terminated)
+ * \param len: output buffer max length
+ *
+ * Because urlencoding expands the output string, it's not
+ * possible to do it in-place, ie, with escaped == string
+ */
+LWS_VISIBLE LWS_EXTERN const char *
+lws_urlencode(char *escaped, const char *string, int len);
+/*
+ * URLDECODE 1 / 2
+ *
+ * This simple urldecode only operates until the first '\0' and requires the
+ * data to exist all at once
+ */
+/**
+ * lws_urldecode() - like strncpy but with urldecoding
+ *
+ * \param string: output buffer
+ * \param escaped: input buffer ('\0' terminated)
+ * \param len: output buffer max length
+ *
+ * This is only useful for '\0' terminated strings
+ *
+ * Since urldecoding only shrinks the output string, it is possible to
+ * do it in-place, ie, string == escaped
+ */
+LWS_VISIBLE LWS_EXTERN int
+lws_urldecode(char *string, const char *escaped, int len);
+///@}
+/**
+ * lws_return_http_status() - Return simple http status
+ * \param wsi: Websocket instance (available from user callback)
+ * \param code: Status index, eg, 404
+ * \param html_body: User-readable HTML description < 1KB, or NULL
+ *
+ * Helper to report HTTP errors back to the client cleanly and
+ * consistently
+ */
+LWS_VISIBLE LWS_EXTERN int
+lws_return_http_status(struct lws *wsi, unsigned int code,
+ const char *html_body);
+/**
+ * lws_http_redirect() - write http redirect into buffer
+ *
+ * \param wsi: websocket connection
+ * \param code: HTTP response code (eg, 301)
+ * \param loc: where to redirect to
+ * \param len: length of loc
+ * \param p: pointer current position in buffer (updated as we write)
+ * \param end: pointer to end of buffer
+ */
LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
lws_http_redirect(struct lws *wsi, int code, const unsigned char *loc, int len,
unsigned char **p, unsigned char *end);
+/**
+ * lws_http_transaction_completed() - wait for new http transaction or close
+ * \param wsi: websocket connection
+ *
+ * Returns 1 if the HTTP connection must close now
+ * Returns 0 and resets connection to wait for new HTTP header /
+ * transaction if possible
+ */
LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
lws_http_transaction_completed(struct lws *wsi);
+///@}
+
+/*! \defgroup pur Sanitize / purify SQL and JSON helpers
+ *
+ * ##Sanitize / purify SQL and JSON helpers
+ *
+ * APIs for escaping untrusted JSON and SQL safely before use
+ */
+//@{
+
+/**
+ * lws_sql_purify() - like strncpy but with escaping for sql quotes
+ *
+ * \param escaped: output buffer
+ * \param string: input buffer ('/0' terminated)
+ * \param len: output buffer max length
+ *
+ * Because escaping expands the output string, it's not
+ * possible to do it in-place, ie, with escaped == string
+ */
+LWS_VISIBLE LWS_EXTERN const char *
+lws_sql_purify(char *escaped, const char *string, int len);
+
+/**
+ * lws_json_purify() - like strncpy but with escaping for json chars
+ *
+ * \param escaped: output buffer
+ * \param string: input buffer ('/0' terminated)
+ * \param len: output buffer max length
+ *
+ * Because escaping expands the output string, it's not
+ * possible to do it in-place, ie, with escaped == string
+ */
+LWS_VISIBLE LWS_EXTERN const char *
+lws_json_purify(char *escaped, const char *string, int len);
+///@}
+
+/*! \defgroup ev libev helpers
+ *
+ * ##libev helpers
+ *
+ * APIs specific to libev event loop itegration
+ */
+///@{
#ifdef LWS_USE_LIBEV
typedef void (lws_ev_signal_cb_t)(EV_P_ struct ev_signal *w, int revents);
lws_ev_sigint_cb(struct ev_loop *loop, struct ev_signal *watcher, int revents);
#endif /* LWS_USE_LIBEV */
+///@}
+
+/*! \defgroup uv libuv helpers
+ *
+ * ##libuv helpers
+ *
+ * APIs specific to libuv event loop itegration
+ */
+///@{
#ifdef LWS_USE_LIBUV
LWS_VISIBLE LWS_EXTERN int
lws_uv_sigint_cfg(struct lws_context *context, int use_uv_sigint,
LWS_VISIBLE LWS_EXTERN void
lws_uv_sigint_cb(uv_signal_t *watcher, int signum);
#endif /* LWS_USE_LIBUV */
+///@}
-LWS_VISIBLE LWS_EXTERN int
-lws_service_fd(struct lws_context *context, struct lws_pollfd *pollfd);
-
-LWS_VISIBLE LWS_EXTERN int
-lws_service_fd_tsi(struct lws_context *context, struct lws_pollfd *pollfd,
- int tsi);
-
-LWS_VISIBLE LWS_EXTERN void *
-lws_context_user(struct lws_context *context);
+/*! \defgroup timeout Connection timeouts
-LWS_VISIBLE LWS_EXTERN void *
-lws_wsi_user(struct lws *wsi);
+ APIs related to setting connection timeouts
+*/
+//@{
/*
* NOTE: These public enums are part of the abi. If you want to add one,
/****** add new things just above ---^ ******/
};
-LWS_VISIBLE LWS_EXTERN void
-lws_set_timeout(struct lws *wsi, enum pending_timeout reason, int secs);
+/**
+ * lws_set_timeout() - marks the wsi as subject to a timeout
+ *
+ * You will not need this unless you are doing something special
+ *
+ * \param wsi: Websocket connection instance
+ * \param reason: timeout reason
+ * \param secs: how many seconds
+ */
+LWS_VISIBLE LWS_EXTERN void
+lws_set_timeout(struct lws *wsi, enum pending_timeout reason, int secs);
+///@}
+
+/*! \defgroup sending-data Sending data
+
+ APIs related to writing data on a connection
+*/
+//@{
+#if !defined(LWS_SIZEOFPTR)
+#define LWS_SIZEOFPTR (sizeof (void *))
+#endif
+#if !defined(u_int64_t)
+#define u_int64_t unsigned long long
+#endif
+
+#if __x86_64__
+#define _LWS_PAD_SIZE 16 /* Intel recommended for best performance */
+#else
+#define _LWS_PAD_SIZE LWS_SIZEOFPTR /* Size of a pointer on the target arch */
+#endif
+#define _LWS_PAD(n) (((n) % _LWS_PAD_SIZE) ? \
+ ((n) + (_LWS_PAD_SIZE - ((n) % _LWS_PAD_SIZE))) : (n))
+#define LWS_PRE _LWS_PAD(4 + 10)
+/* used prior to 1.7 and retained for backward compatibility */
+#define LWS_SEND_BUFFER_PRE_PADDING LWS_PRE
+#define LWS_SEND_BUFFER_POST_PADDING 0
+
+/*
+ * NOTE: These public enums are part of the abi. If you want to add one,
+ * add it at where specified so existing users are unaffected.
+ */
+enum lws_write_protocol {
+ LWS_WRITE_TEXT = 0,
+ /**< Send a ws TEXT message,the pointer must have LWS_PRE valid
+ * memory behind it. The receiver expects only valid utf-8 in the
+ * payload */
+ LWS_WRITE_BINARY = 1,
+ /**< Send a ws BINARY message, the pointer must have LWS_PRE valid
+ * memory behind it. Any sequence of bytes is valid */
+ LWS_WRITE_CONTINUATION = 2,
+ /**< Continue a previous ws message, the pointer must have LWS_PRE valid
+ * memory behind it */
+ LWS_WRITE_HTTP = 3,
+ /**< Send HTTP content */
+
+ /* LWS_WRITE_CLOSE is handled by lws_close_reason() */
+ LWS_WRITE_PING = 5,
+ LWS_WRITE_PONG = 6,
+
+ /* Same as write_http but we know this write ends the transaction */
+ LWS_WRITE_HTTP_FINAL = 7,
+
+ /* HTTP2 */
+
+ LWS_WRITE_HTTP_HEADERS = 8,
+ /**< Send http headers (http2 encodes this payload and LWS_WRITE_HTTP
+ * payload differently, http 1.x links also handle this correctly. so
+ * to be compatible with both in the future,header response part should
+ * be sent using this regardless of http version expected)
+ */
+
+ /****** add new things just above ---^ ******/
+
+ /* flags */
+
+ LWS_WRITE_NO_FIN = 0x40,
+ /**< This part of the message is not the end of the message */
+
+ LWS_WRITE_CLIENT_IGNORE_XOR_MASK = 0x80
+ /**< client packet payload goes out on wire unmunged
+ * only useful for security tests since normal servers cannot
+ * decode the content if used */
+};
+
-/*
+/**
+ * lws_write() - Apply protocol then write data to client
+ * \param wsi: Websocket instance (available from user callback)
+ * \param buf: The data to send. For data being sent on a websocket
+ * connection (ie, not default http), this buffer MUST have
+ * LWS_PRE bytes valid BEFORE the pointer.
+ * This is so the protocol header data can be added in-situ.
+ * \param len: Count of the data bytes in the payload starting from buf
+ * \param protocol: Use LWS_WRITE_HTTP to reply to an http connection, and one
+ * of LWS_WRITE_BINARY or LWS_WRITE_TEXT to send appropriate
+ * data on a websockets connection. Remember to allow the extra
+ * bytes before and after buf if LWS_WRITE_BINARY or LWS_WRITE_TEXT
+ * are used.
+ *
+ * This function provides the way to issue data back to the client
+ * for both http and websocket protocols.
+ *
* IMPORTANT NOTICE!
*
* When sending with websocket protocol
* to the address immediately after the padding won't cause an unaligned access
* error. Sometimes for performance reasons the recommended padding is even
* larger than sizeof(void *).
+ *
+ * In the case of sending using websocket protocol, be sure to allocate
+ * valid storage before and after buf as explained above. This scheme
+ * allows maximum efficiency of sending data and protocol in a single
+ * packet while not burdening the user code with any protocol knowledge.
+ *
+ * Return may be -1 for a fatal error needing connection close, or a
+ * positive number reflecting the amount of bytes actually sent. This
+ * can be less than the requested number of bytes due to OS memory
+ * pressure at any given time.
*/
-
-#if !defined(LWS_SIZEOFPTR)
-#define LWS_SIZEOFPTR (sizeof (void *))
-#endif
-#if !defined(u_int64_t)
-#define u_int64_t unsigned long long
-#endif
-
-#if __x86_64__
-#define _LWS_PAD_SIZE 16 /* Intel recommended for best performance */
-#else
-#define _LWS_PAD_SIZE LWS_SIZEOFPTR /* Size of a pointer on the target arch */
-#endif
-#define _LWS_PAD(n) (((n) % _LWS_PAD_SIZE) ? \
- ((n) + (_LWS_PAD_SIZE - ((n) % _LWS_PAD_SIZE))) : (n))
-#define LWS_PRE _LWS_PAD(4 + 10)
-/* used prior to 1.7 and retained for backward compatibility */
-#define LWS_SEND_BUFFER_PRE_PADDING LWS_PRE
-#define LWS_SEND_BUFFER_POST_PADDING 0
-
LWS_VISIBLE LWS_EXTERN int
lws_write(struct lws *wsi, unsigned char *buf, size_t len,
enum lws_write_protocol protocol);
-/**
- * lws_close_reason - Set reason and aux data to send with Close packet
- * If you are going to return nonzero from the callback
- * requesting the connection to close, you can optionally
- * call this to set the reason the peer will be told if
- * possible.
- *
- * @wsi: The websocket connection to set the close reason on
- * @status: A valid close status from websocket standard
- * @buf: NULL or buffer containing up to 124 bytes of auxiliary data
- * @len: Length of data in @buf to send
- */
-LWS_VISIBLE LWS_EXTERN void
-lws_close_reason(struct lws *wsi, enum lws_close_status status,
- unsigned char *buf, size_t len);
-
/* helper for case where buffer may be const */
#define lws_write_http(wsi, buf, len) \
lws_write(wsi, (unsigned char *)(buf), len, LWS_WRITE_HTTP)
-LWS_VISIBLE LWS_EXTERN int
-lws_serve_http_file(struct lws *wsi, const char *file, const char *content_type,
- const char *other_headers, int other_headers_len);
-LWS_VISIBLE LWS_EXTERN int
-lws_serve_http_file_fragment(struct lws *wsi);
-
-LWS_VISIBLE LWS_EXTERN int
-lws_return_http_status(struct lws *wsi, unsigned int code,
- const char *html_body);
+///@}
-LWS_VISIBLE LWS_EXTERN const struct lws_protocols *
-lws_get_protocol(struct lws *wsi);
+/** \defgroup callback-when-writeable Callback when writeable
+ *
+ * ##Callback When Writeable
+ *
+ * lws can only write data on a connection when it is able to accept more
+ * data without blocking.
+ *
+ * So a basic requirement is we should only use the lws_write() apis when the
+ * connection we want to write on says that he can accept more data.
+ *
+ * When lws cannot complete your send at the time, it will buffer the data
+ * and send it in the background, suppressing any further WRITEABLE callbacks
+ * on that connection until it completes. So it is important to write new
+ * things in a new writeable callback.
+ *
+ * These apis reflect the various ways we can indicate we would like to be
+ * called back when one or more connections is writeable.
+ */
+///@{
+/**
+ * lws_callback_on_writable() - Request a callback when this socket
+ * becomes able to be written to without
+ * blocking
+ *
+ * \param wsi: Websocket connection instance to get callback for
+ *
+ * - Which: only this wsi
+ * - When: when the individual connection becomes writeable
+ * - What: LWS_CALLBACK_*_WRITEABLE
+ */
LWS_VISIBLE LWS_EXTERN int
lws_callback_on_writable(struct lws *wsi);
+/**
+ * lws_callback_on_writable_all_protocol() - Request a callback for all
+ * connections on same vhost using the given protocol when it
+ * becomes possible to write to each socket without
+ * blocking in turn.
+ *
+ * \param context: lws_context
+ * \param protocol: Protocol whose connections will get callbacks
+ *
+ * - Which: connections using this protocol on ANY VHOST
+ * - When: when the individual connection becomes writeable
+ * - What: LWS_CALLBACK_*_WRITEABLE
+ */
LWS_VISIBLE LWS_EXTERN int
lws_callback_on_writable_all_protocol(const struct lws_context *context,
const struct lws_protocols *protocol);
+/**
+ * lws_callback_on_writable_all_protocol_vhost() - Request a callback for
+ * all connections using the given protocol when it
+ * becomes possible to write to each socket without
+ * blocking in turn.
+ *
+ * \param vhost: Only consider connections on this lws_vhost
+ * \param protocol: Protocol whose connections will get callbacks
+ *
+ * - Which: connections using this protocol on GIVEN VHOST ONLY
+ * - When: when the individual connection becomes writeable
+ * - What: LWS_CALLBACK_*_WRITEABLE
+ */
LWS_VISIBLE LWS_EXTERN int
lws_callback_on_writable_all_protocol_vhost(const struct lws_vhost *vhost,
const struct lws_protocols *protocol);
+/**
+ * lws_callback_all_protocol() - Callback all connections using
+ * the given protocol with the given reason
+ *
+ * \param context: lws_context
+ * \param protocol: Protocol whose connections will get callbacks
+ * \param reason: Callback reason index
+ *
+ * - Which: connections using this protocol on ALL VHOSTS
+ * - When: when the individual connection becomes writeable
+ * - What: reason
+ */
LWS_VISIBLE LWS_EXTERN int
lws_callback_all_protocol(struct lws_context *context,
const struct lws_protocols *protocol, int reason);
+/**
+ * lws_callback_all_protocol_vhost() - Callback all connections using
+ * the given protocol with the given reason
+ *
+ * \param vh: Vhost whose connections will get callbacks
+ * \param protocol: Which protocol to match
+ * \param reason: Callback reason index
+ *
+ * - Which: connections using this protocol on GIVEN VHOST ONLY
+ * - When: now
+ * - What: reason
+ */
LWS_VISIBLE LWS_EXTERN int
lws_callback_all_protocol_vhost(struct lws_vhost *vh,
const struct lws_protocols *protocol, int reason);
+/**
+ * lws_callback_vhost_protocols() - Callback all protocols enabled on a vhost
+ * with the given reason
+ *
+ * \param wsi: wsi whose vhost will get callbacks
+ * \param reason: Callback reason index
+ * \param in: in argument to callback
+ * \param len: len argument to callback
+ *
+ * - Which: connections using this protocol on same VHOST as wsi ONLY
+ * - When: now
+ * - What: reason
+ */
LWS_VISIBLE LWS_EXTERN int
lws_callback_vhost_protocols(struct lws *wsi, int reason, void *in, int len);
+/**
+ * lws_get_socket_fd() - returns the socket file descriptor
+ *
+ * You will not need this unless you are doing something special
+ *
+ * \param wsi: Websocket connection instance
+ */
LWS_VISIBLE LWS_EXTERN int
lws_get_socket_fd(struct lws *wsi);
-LWS_VISIBLE LWS_EXTERN int
-lws_is_final_fragment(struct lws *wsi);
-
-LWS_VISIBLE LWS_EXTERN unsigned char
-lws_get_reserved_bits(struct lws *wsi);
-
-LWS_VISIBLE LWS_EXTERN int
-lws_rx_flow_control(struct lws *wsi, int enable);
-
-LWS_VISIBLE LWS_EXTERN void
-lws_rx_flow_allow_all_protocol(const struct lws_context *context,
- const struct lws_protocols *protocol);
-
-LWS_VISIBLE LWS_EXTERN size_t
-lws_remaining_packet_payload(struct lws *wsi);
-
-/*
+/**
+ * lws_get_peer_write_allowance() - get the amount of data writeable to peer
+ * if known
+ *
+ * \param wsi: Websocket connection instance
+ *
* if the protocol does not have any guidance, returns -1. Currently only
* http2 connections get send window information from this API. But your code
* should use it so it can work properly with any protocol.
* of buffer space your OS can accept on this connection for a write action.
*
* This number represents the maximum you could send to the peer or intermediary
- * on this connection right now without it complaining.
+ * on this connection right now without the protocol complaining.
*
* lws manages accounting for send window updates and payload writes
* automatically, so this number reflects the situation at the peer or
*/
LWS_VISIBLE LWS_EXTERN size_t
lws_get_peer_write_allowance(struct lws *wsi);
+///@}
-/* deprecated, use lws_client_connect_via_info() */
-LWS_VISIBLE LWS_EXTERN struct lws * LWS_WARN_UNUSED_RESULT
-lws_client_connect(struct lws_context *clients, const char *address,
- int port, int ssl_connection, const char *path,
- const char *host, const char *origin, const char *protocol,
- int ietf_version_or_minus_one) LWS_WARN_DEPRECATED;
-/* deprecated, use lws_client_connect_via_info() */
+/**
+ * lws_rx_flow_control() - Enable and disable socket servicing for
+ * received packets.
+ *
+ * If the output side of a server process becomes choked, this allows flow
+ * control for the input side.
+ *
+ * \param wsi: Websocket connection instance to get callback for
+ * \param enable: 0 = disable read servicing for this connection, 1 = enable
+ */
+LWS_VISIBLE LWS_EXTERN int
+lws_rx_flow_control(struct lws *wsi, int enable);
+
+/**
+ * lws_rx_flow_allow_all_protocol() - Allow all connections with this protocol to receive
+ *
+ * When the user server code realizes it can accept more input, it can
+ * call this to have the RX flow restriction removed from all connections using
+ * the given protocol.
+ * \param context: lws_context
+ * \param protocol: all connections using this protocol will be allowed to receive
+ */
+LWS_VISIBLE LWS_EXTERN void
+lws_rx_flow_allow_all_protocol(const struct lws_context *context,
+ const struct lws_protocols *protocol);
+
+/**
+ * lws_remaining_packet_payload() - Bytes to come before "overall"
+ * rx packet is complete
+ * \param wsi: Websocket instance (available from user callback)
+ *
+ * This function is intended to be called from the callback if the
+ * user code is interested in "complete packets" from the client.
+ * libwebsockets just passes through payload as it comes and issues a buffer
+ * additionally when it hits a built-in limit. The LWS_CALLBACK_RECEIVE
+ * callback handler can use this API to find out if the buffer it has just
+ * been given is the last piece of a "complete packet" from the client --
+ * when that is the case lws_remaining_packet_payload() will return
+ * 0.
+ *
+ * Many protocols won't care becuse their packets are always small.
+ */
+LWS_VISIBLE LWS_EXTERN size_t
+lws_remaining_packet_payload(struct lws *wsi);
+
+
+/** \defgroup sock-adopt Socket adoption helpers
+ * ##Socket adoption helpers
+ *
+ * When integrating with an external app with its own event loop, these can
+ * be used to accept connections from someone else's listening socket.
+ *
+ * When using lws own event loop, these are not needed.
+ */
+///@{
+
+/**
+ * lws_adopt_socket() - adopt foreign socket as if listen socket accepted it
+ * \param context: lws context
+ * \param accept_fd: fd of already-accepted socket to adopt
+ *
+ * Either returns new wsi bound to accept_fd, or closes accept_fd and
+ * returns NULL, having cleaned up any new wsi pieces.
+ *
+ * LWS adopts the socket in http serving mode, it's ready to accept an upgrade
+ * to ws or just serve http.
+ */
+LWS_VISIBLE LWS_EXTERN struct lws *
+lws_adopt_socket(struct lws_context *context, lws_sockfd_type accept_fd);
+/**
+ * lws_adopt_socket_readbuf() - adopt foreign socket and first rx as if listen socket accepted it
+ * \param context: lws context
+ * \param accept_fd: fd of already-accepted socket to adopt
+ * \param readbuf: NULL or pointer to data that must be drained before reading from
+ * accept_fd
+ * \param len: The length of the data held at \param readbuf
+ *
+ * Either returns new wsi bound to accept_fd, or closes accept_fd and
+ * returns NULL, having cleaned up any new wsi pieces.
+ *
+ * LWS adopts the socket in http serving mode, it's ready to accept an upgrade
+ * to ws or just serve http.
+ *
+ * If your external code did not already read from the socket, you can use
+ * lws_adopt_socket() instead.
+ *
+ * This api is guaranteed to use the data at \param readbuf first, before reading from
+ * the socket.
+ *
+ * readbuf is limited to the size of the ah rx buf, currently 2048 bytes.
+ */
+LWS_VISIBLE LWS_EXTERN struct lws *
+lws_adopt_socket_readbuf(struct lws_context *context, lws_sockfd_type accept_fd,
+ const char *readbuf, size_t len);
+///@}
+
+/** \defgroup net Network related helper APIs
+ * ##Network related helper APIs
+ *
+ * These wrap miscellaneous useful network-related functions
+ */
+///@{
+
+/**
+ * lws_canonical_hostname() - returns this host's hostname
+ *
+ * This is typically used by client code to fill in the host parameter
+ * when making a client connection. You can only call it after the context
+ * has been created.
+ *
+ * \param context: Websocket context
+ */
+LWS_VISIBLE LWS_EXTERN const char * LWS_WARN_UNUSED_RESULT
+lws_canonical_hostname(struct lws_context *context);
+
+/**
+ * lws_get_peer_addresses() - Get client address information
+ * \param wsi: Local struct lws associated with
+ * \param fd: Connection socket descriptor
+ * \param name: Buffer to take client address name
+ * \param name_len: Length of client address name buffer
+ * \param rip: Buffer to take client address IP dotted quad
+ * \param rip_len: Length of client address IP buffer
+ *
+ * This function fills in name and rip with the name and IP of
+ * the client connected with socket descriptor fd. Names may be
+ * truncated if there is not enough room. If either cannot be
+ * determined, they will be returned as valid zero-length strings.
+ */
+LWS_VISIBLE LWS_EXTERN void
+lws_get_peer_addresses(struct lws *wsi, lws_sockfd_type fd, char *name,
+ int name_len, char *rip, int rip_len);
+
+/**
+ * lws_get_peer_simple() - Get client address information without RDNS
+ *
+ * \param wsi: Local struct lws associated with
+ * \param name: Buffer to take client address name
+ * \param namelen: Length of client address name buffer
+ *
+ * This provides a 123.123.123.123 type IP address in name from the
+ * peer that has connected to wsi
+ */
+LWS_VISIBLE LWS_EXTERN const char *
+lws_get_peer_simple(struct lws *wsi, char *name, int namelen);
+
+/**
+ * lws_interface_to_sa() - Convert interface name or IP to sockaddr struct
+ *
+ * \param ipv6: Allow IPV6 addresses
+ * \param ifname: Interface name or IP
+ * \param addr: struct sockaddr_in * to be written
+ * \param addrlen: Length of addr
+ *
+ * This converts a textual network interface name to a sockaddr usable by
+ * other network functions
+ */
+LWS_VISIBLE LWS_EXTERN int
+lws_interface_to_sa(int ipv6, const char *ifname, struct sockaddr_in *addr,
+ size_t addrlen);
+///@}
+
+/** \defgroup misc Miscellaneous APIs
+* ##Miscellaneous APIs
+*
+* Various APIs outside of other categories
+*/
+///@{
+
+/**
+ * lws_get_random(): fill a buffer with platform random data
+ *
+ * \param context: the lws context
+ * \param buf: buffer to fill
+ * \param len: how much to fill
+ *
+ * This is intended to be called from the LWS_CALLBACK_RECEIVE callback if
+ * it's interested to see if the frame it's dealing with was sent in binary
+ * mode.
+ */
+LWS_VISIBLE LWS_EXTERN int
+lws_get_random(struct lws_context *context, void *buf, int len);
+/**
+ * lws_daemonize(): fill a buffer with platform random data
+ *
+ * \param _lock_path: the filepath to write the lock file
+ *
+ * Spawn lws as a background process, taking care of various things
+ */
+LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
+lws_daemonize(const char *_lock_path);
+/**
+ * lws_get_library_version(): return string describing the version of lws
+ *
+ * On unix, also includes the git describe
+ */
+LWS_VISIBLE LWS_EXTERN const char * LWS_WARN_UNUSED_RESULT
+lws_get_library_version(void);
+
+/**
+ * lws_wsi_user() - get the user data associated with the connection
+ * \param wsi: lws connection
+ *
+ * Not normally needed since it's passed into the callback
+ */
+LWS_VISIBLE LWS_EXTERN void *
+lws_wsi_user(struct lws *wsi);
+
+/**
+ * lws_parse_uri: cut up prot:/ads:port/path into pieces
+ * Notice it does so by dropping '\0' into input string
+ * and the leading / on the path is consequently lost
+ *
+ * \param p: incoming uri string.. will get written to
+ * \param prot: result pointer for protocol part (https://)
+ * \param ads: result pointer for address part
+ * \param port: result pointer for port part
+ * \param path: result pointer for path part
+ */
+LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
+lws_parse_uri(char *p, const char **prot, const char **ads, int *port,
+ const char **path);
+
+/**
+ * lws_now_secs(): return seconds since 1970-1-1
+ */
+LWS_VISIBLE LWS_EXTERN unsigned long
+lws_now_secs(void);
+
+/**
+ * lws_get_context - Allow geting lws_context from a Websocket connection
+ * instance
+ *
+ * With this function, users can access context in the callback function.
+ * Otherwise users may have to declare context as a global variable.
+ *
+ * \param wsi: Websocket connection instance
+ */
+LWS_VISIBLE LWS_EXTERN struct lws_context * LWS_WARN_UNUSED_RESULT
+lws_get_context(const struct lws *wsi);
+
+/**
+ * lws_get_count_threads(): how many service threads the context uses
+ *
+ * \param context: the lws context
+ *
+ * By default this is always 1, if you asked for more than lws can handle it
+ * will clip the number of threads. So you can use this to find out how many
+ * threads are actually in use.
+ */
+LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
+lws_get_count_threads(struct lws_context *context);
+
+/**
+ * lws_get_parent() - get parent wsi or NULL
+ * \param wsi: lws connection
+ *
+ * Specialized wsi like cgi stdin/out/err are associated to a parent wsi,
+ * this allows you to get their parent.
+ */
LWS_VISIBLE LWS_EXTERN struct lws * LWS_WARN_UNUSED_RESULT
-lws_client_connect_extended(struct lws_context *clients, const char *address,
- int port, int ssl_connection, const char *path,
- const char *host, const char *origin,
- const char *protocol, int ietf_version_or_minus_one,
- void *userdata) LWS_WARN_DEPRECATED;
+lws_get_parent(const struct lws *wsi);
+/**
+ * lws_get_child() - get child wsi or NULL
+ * \param wsi: lws connection
+ *
+ * Allows you to find a related wsi from the parent wsi.
+ */
LWS_VISIBLE LWS_EXTERN struct lws * LWS_WARN_UNUSED_RESULT
-lws_client_connect_via_info(struct lws_client_connect_info * ccinfo);
-
-LWS_VISIBLE LWS_EXTERN struct lws *
-lws_adopt_socket(struct lws_context *context, lws_sockfd_type accept_fd);
-LWS_VISIBLE LWS_EXTERN struct lws *
-lws_adopt_socket_readbuf(struct lws_context *context, lws_sockfd_type accept_fd,
- const char *readbuf, size_t len);
+lws_get_child(const struct lws *wsi);
-LWS_VISIBLE LWS_EXTERN const char * LWS_WARN_UNUSED_RESULT
-lws_canonical_hostname(struct lws_context *context);
+/*
+ * \deprecated DEPRECATED Note: this is not normally needed as a user api.
+ * It's provided in case it is
+ * useful when integrating with other app poll loop service code.
+ */
+LWS_VISIBLE LWS_EXTERN int
+lws_read(struct lws *wsi, unsigned char *buf, size_t len);
+/**
+ * lws_set_allocator() - custom allocator support
+ *
+ * \param realloc
+ *
+ * Allows you to replace the allocator (and deallocator) used by lws
+ */
LWS_VISIBLE LWS_EXTERN void
-lws_get_peer_addresses(struct lws *wsi, lws_sockfd_type fd, char *name,
- int name_len, char *rip, int rip_len);
+lws_set_allocator(void *(*realloc)(void *ptr, size_t size));
+///@}
-LWS_VISIBLE LWS_EXTERN const char *
-lws_get_peer_simple(struct lws *wsi, char *name, int namelen);
+/** \defgroup wsstatus Websocket status APIs
+ * ##Websocket connection status APIs
+ *
+ * These provide information about ws connection or message status
+ */
+///@{
+/**
+ * lws_send_pipe_choked() - tests if socket is writable or not
+ * \param wsi: lws connection
+ *
+ * Allows you to check if you can write more on the socket
+ */
+LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
+lws_send_pipe_choked(struct lws *wsi);
+/**
+ * lws_is_final_fragment() - tests if last part of ws message
+ * \param wsi: lws connection
+ */
LWS_VISIBLE LWS_EXTERN int
-lws_get_random(struct lws_context *context, void *buf, int len);
-
-LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
-lws_daemonize(const char *_lock_path);
+lws_is_final_fragment(struct lws *wsi);
-LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
-lws_send_pipe_choked(struct lws *wsi);
+/**
+ * lws_get_reserved_bits() - access reserved bits of ws frame
+ * \param wsi: lws connection
+ */
+LWS_VISIBLE LWS_EXTERN unsigned char
+lws_get_reserved_bits(struct lws *wsi);
+/**
+ * lws_partial_buffered() - find out if lws buffered the last write
+ * \param wsi: websocket connection to check
+ *
+ * Returns 1 if you cannot use lws_write because the last
+ * write on this connection is still buffered, and can't be cleared without
+ * returning to the service loop and waiting for the connection to be
+ * writeable again.
+ *
+ * If you will try to do >1 lws_write call inside a single
+ * WRITEABLE callback, you must check this after every write and bail if
+ * set, ask for a new writeable callback and continue writing from there.
+ *
+ * This is never set at the start of a writeable callback, but any write
+ * may set it.
+ */
LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
lws_partial_buffered(struct lws *wsi);
+/**
+ * lws_frame_is_binary(): true if the current frame was sent in binary mode
+ *
+ * \param wsi: the connection we are inquiring about
+ *
+ * This is intended to be called from the LWS_CALLBACK_RECEIVE callback if
+ * it's interested to see if the frame it's dealing with was sent in binary
+ * mode.
+ */
LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
lws_frame_is_binary(struct lws *wsi);
+/**
+ * lws_is_ssl() - Find out if connection is using SSL
+ * \param wsi: websocket connection to check
+ *
+ * Returns 0 if the connection is not using SSL, 1 if using SSL and
+ * using verified cert, and 2 if using SSL but the cert was not
+ * checked (appears for client wsi told to skip check on connection)
+ */
LWS_VISIBLE LWS_EXTERN int
lws_is_ssl(struct lws *wsi);
-
+/**
+ * lws_is_cgi() - find out if this wsi is running a cgi process
+ * \param wsi: lws connection
+ */
LWS_VISIBLE LWS_EXTERN int
lws_is_cgi(struct lws *wsi);
+///@}
+
+/** \defgroup sha SHA and B64 helpers
+ * ##SHA and B64 helpers
+ *
+ * These provide SHA-1 and B64 helper apis
+ */
+///@{
#ifdef LWS_SHA1_USE_OPENSSL_NAME
#define lws_SHA1 SHA1
#else
+/**
+ * lws_SHA1(): make a SHA-1 digest of a buffer
+ *
+ * \param d: incoming buffer
+ * \param n: length of incoming buffer
+ * \param md: buffer for message digest (must be >= 20 bytes)
+ *
+ * Reduces any size buffer into a 20-byte SHA-1 hash.
+ */
LWS_VISIBLE LWS_EXTERN unsigned char *
lws_SHA1(const unsigned char *d, size_t n, unsigned char *md);
#endif
-
+/**
+ * lws_b64_encode_string(): encode a string into base 64
+ *
+ * \param in: incoming buffer
+ * \param in_len: length of incoming buffer
+ * \param out: result buffer
+ * \param out_size: length of result buffer
+ *
+ * Encodes a string using b64
+ */
LWS_VISIBLE LWS_EXTERN int
lws_b64_encode_string(const char *in, int in_len, char *out, int out_size);
-
+/**
+ * lws_b64_decode_string(): decode a string from base 64
+ *
+ * \param in: incoming buffer
+ * \param out: result buffer
+ * \param out_size: length of result buffer
+ *
+ * Decodes a string using b64
+ */
LWS_VISIBLE LWS_EXTERN int
lws_b64_decode_string(const char *in, char *out, int out_size);
+///@}
-LWS_VISIBLE LWS_EXTERN const char * LWS_WARN_UNUSED_RESULT
-lws_get_library_version(void);
-
-LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
-lws_parse_uri(char *p, const char **prot, const char **ads, int *port,
- const char **path);
-/*
- * Access to http headers
+/*! \defgroup cgi cgi handling
*
- * In lws the client http headers are temporarily malloc'd only for the
- * duration of the http part of the handshake. It's because in most cases,
- * the header content is ignored for the whole rest of the connection lifetime
- * and would then just be taking up space needlessly.
+ * ##CGI handling
*
- * During LWS_CALLBACK_HTTP when the URI path is delivered is the last time
- * the http headers are still allocated, you can use these apis then to
- * look at and copy out interesting header content (cookies, etc)
+ * These functions allow low-level control over stdin/out/err of the cgi.
*
- * Notice that the header total length reported does not include a terminating
- * '\0', however you must allocate for it when using the _copy apis. So the
- * length reported for a header containing "123" is 3, but you must provide
- * a buffer of length 4 so that "123\0" may be copied into it, or the copy
- * will fail with a nonzero return code.
- */
-
-LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
-lws_hdr_total_length(struct lws *wsi, enum lws_token_indexes h);
-
-LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
-lws_hdr_fragment_length(struct lws *wsi, enum lws_token_indexes h, int frag_idx);
-
-/*
- * copies the whole, aggregated header, even if it was delivered in
- * several actual headers piece by piece
- */
-LWS_VISIBLE LWS_EXTERN int
-lws_hdr_copy(struct lws *wsi, char *dest, int len, enum lws_token_indexes h);
-
-/*
- * copies only fragment frag_idx of a header. Normally this is only useful
- * to parse URI arguments like ?x=1&y=2, token index WSI_TOKEN_HTTP_URI_ARGS
- * fragment 0 will contain "x=1" and fragment 1 "y=2"
+ * However for most cases, binding the cgi to http in and out, the default
+ * lws implementation already does the right thing.
*/
-LWS_VISIBLE LWS_EXTERN int
-lws_hdr_copy_fragment(struct lws *wsi, char *dest, int len,
- enum lws_token_indexes h, int frag_idx);
-
-LWS_VISIBLE LWS_EXTERN const char *
-lws_get_urlarg_by_name(struct lws *wsi, const char *name, char *buf, int len);
-
-LWS_VISIBLE LWS_EXTERN unsigned long
-lws_now_secs(void);
-
-
-/* get the active file operations struct */
-LWS_VISIBLE LWS_EXTERN struct lws_plat_file_ops * LWS_WARN_UNUSED_RESULT
-lws_get_fops(struct lws_context *context);
-
-LWS_VISIBLE LWS_EXTERN struct lws_context * LWS_WARN_UNUSED_RESULT
-lws_get_context(const struct lws *wsi);
-
-LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
-lws_get_count_threads(struct lws_context *context);
-
-LWS_VISIBLE LWS_EXTERN struct lws * LWS_WARN_UNUSED_RESULT
-lws_get_parent(const struct lws *wsi);
-
-LWS_VISIBLE LWS_EXTERN struct lws * LWS_WARN_UNUSED_RESULT
-lws_get_child(const struct lws *wsi);
-
#ifdef LWS_WITH_CGI
enum lws_enum_stdinouterr {
LWS_STDIN = 0,
};
struct lws_cgi_args {
- struct lws **stdwsi; /* get fd with lws_get_socket_fd() */
- enum lws_enum_stdinouterr ch;
- unsigned char *data; /* for messages with payload */
- enum lws_cgi_hdr_state hdr_state;
- int len;
+ struct lws **stdwsi; /**< get fd with lws_get_socket_fd() */
+ enum lws_enum_stdinouterr ch; /**< channel index */
+ unsigned char *data; /**< for messages with payload */
+ enum lws_cgi_hdr_state hdr_state; /**< track where we are in cgi headers */
+ int len; /**< length */
};
+
+/**
+ * lws_cgi: spawn network-connected cgi process
+ *
+ * \param wsi: connection to own the process
+ * \param exec_array: array of "exec-name" "arg1" ... "argn" NULL
+ * \param script_uri_path_len: how many chars on the left of the uri are the path to the cgi
+ * \param timeout_secs: seconds script should be allowed to run
+ * \param mp_cgienv: pvo list with per-vhost cgi options to put in env
+ */
LWS_VISIBLE LWS_EXTERN int
lws_cgi(struct lws *wsi, const char * const *exec_array,
int script_uri_path_len, int timeout_secs,
const struct lws_protocol_vhost_options *mp_cgienv);
+/**
+ * lws_cgi_write_split_stdout_headers: write cgi output accounting for header part
+ *
+ * \param wsi: connection to own the process
+ */
LWS_VISIBLE LWS_EXTERN int
lws_cgi_write_split_stdout_headers(struct lws *wsi);
+/**
+ * lws_cgi_kill: terminate cgi process associated with wsi
+ *
+ * \param wsi: connection to own the process
+ */
LWS_VISIBLE LWS_EXTERN int
lws_cgi_kill(struct lws *wsi);
#endif
+///@}
-LWS_VISIBLE LWS_EXTERN int
-lws_http_client_read(struct lws *wsi, char **buf, int *len);
-
-/*
- * lejp conf parsers
- */
-LWS_VISIBLE LWS_EXTERN int
-lwsws_get_config_globals(struct lws_context_creation_info *info, const char *d,
- char **config_strings, int *len);
-
-LWS_VISIBLE LWS_EXTERN int
-lwsws_get_config_vhosts(struct lws_context *context,
- struct lws_context_creation_info *info, const char *d,
- char **config_strings, int *len);
-/*
- * Wsi-associated File Operations access helpers
+/*! \defgroup fops file operation wrapping
+ *
+ * ##File operation wrapping
*
* Use these helper functions if you want to access a file from the perspective
* of a specific wsi, which is usually the case. If you just want contextless
* The advantage from all this is user code can be portable for file operations
* without having to deal with differences between platforms.
*/
+//@{
+
+/** struct lws_plat_file_ops - Platform-specific file operations
+ *
+ * These provide platform-agnostic ways to deal with filesystem access in the
+ * library and in the user code.
+ */
+struct lws_plat_file_ops {
+ lws_filefd_type (*open)(struct lws *wsi, const char *filename,
+ unsigned long *filelen, int flags);
+ /**< Open file (always binary access if plat supports it)
+ * filelen is filled on exit to be the length of the file
+ * flags should be set to O_RDONLY or O_RDWR */
+ int (*close)(struct lws *wsi, lws_filefd_type fd);
+ /**< close file */
+ unsigned long (*seek_cur)(struct lws *wsi, lws_filefd_type fd,
+ long offset_from_cur_pos);
+ /**< seek from current position */
+ int (*read)(struct lws *wsi, lws_filefd_type fd, unsigned long *amount,
+ unsigned char *buf, unsigned long len);
+ /**< Read from file, on exit *amount is set to amount actually read */
+ int (*write)(struct lws *wsi, lws_filefd_type fd, unsigned long *amount,
+ unsigned char *buf, unsigned long len);
+ /**< Write to file, on exit *amount is set to amount actually written */
+
+ /* Add new things just above here ---^
+ * This is part of the ABI, don't needlessly break compatibility */
+};
+
+/**
+ * lws_get_fops() - get current file ops
+ *
+ * \param context: context
+ */
+LWS_VISIBLE LWS_EXTERN struct lws_plat_file_ops * LWS_WARN_UNUSED_RESULT
+lws_get_fops(struct lws_context *context);
+/**
+ * lws_plat_file_open() - file open operations
+ *
+ * \param wsi: connection doing the opening
+ * \param filename: filename to open
+ * \param filelen: length of file (filled in by call)
+ * \param flags: open flags
+ */
static LWS_INLINE lws_filefd_type LWS_WARN_UNUSED_RESULT
lws_plat_file_open(struct lws *wsi, const char *filename,
unsigned long *filelen, int flags)
filelen, flags);
}
+/**
+ * lws_plat_file_close() - close file
+ *
+ * \param wsi: connection opened by
+ * \param fd: file descriptor
+ */
static LWS_INLINE int
lws_plat_file_close(struct lws *wsi, lws_filefd_type fd)
{
return lws_get_fops(lws_get_context(wsi))->close(wsi, fd);
}
+/**
+ * lws_plat_file_seek_cur() - close file
+ *
+ * \param wsi: connection opened by
+ * \param fd: file descriptor
+ * \param offset: position to seek to
+ */
static LWS_INLINE unsigned long
lws_plat_file_seek_cur(struct lws *wsi, lws_filefd_type fd, long offset)
{
return lws_get_fops(lws_get_context(wsi))->seek_cur(wsi, fd, offset);
}
-
+/**
+ * lws_plat_file_read() - read from file
+ *
+ * \param wsi: connection opened by
+ * \param fd: file descriptor
+ * \param amount: how much to read (rewritten by call)
+ * \param buf: buffer to write to
+ * \param len: max length
+ */
static LWS_INLINE int LWS_WARN_UNUSED_RESULT
lws_plat_file_read(struct lws *wsi, lws_filefd_type fd, unsigned long *amount,
unsigned char *buf, unsigned long len)
return lws_get_fops(lws_get_context(wsi))->read(wsi, fd, amount, buf,
len);
}
-
+/**
+ * lws_plat_file_write() - write from file
+ *
+ * \param wsi: connection opened by
+ * \param fd: file descriptor
+ * \param amount: how much to write (rewritten by call)
+ * \param buf: buffer to read from
+ * \param len: max length
+ */
static LWS_INLINE int LWS_WARN_UNUSED_RESULT
lws_plat_file_write(struct lws *wsi, lws_filefd_type fd, unsigned long *amount,
unsigned char *buf, unsigned long len)
return lws_get_fops(lws_get_context(wsi))->write(wsi, fd, amount, buf,
len);
}
+//@}
-/*
- * Note: this is not normally needed as a user api. It's provided in case it is
- * useful when integrating with other app poll loop service code.
- */
-LWS_VISIBLE LWS_EXTERN int
-lws_read(struct lws *wsi, unsigned char *buf, size_t len);
-
-#ifndef LWS_NO_EXTENSIONS
-/* Deprecated
+/** \defgroup smtp
+ * \ingroup lwsapi
+ * ##SMTP related functions
*
- * There is no longer a set internal extensions table. The table is provided
- * by user code along with application-specific settings. See the test
- * client and server for how to do.
- */
-static LWS_INLINE LWS_WARN_DEPRECATED const struct lws_extension *
-lws_get_internal_extensions() { return NULL; }
-LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
-lws_ext_parse_options(const struct lws_extension *ext, struct lws *wsi,
- void *ext_user, const struct lws_ext_options *opts,
- const char *o, int len);
-#endif
-
-/*
- * custom allocator support
+ * These apis let you communicate with a local SMTP server to send email from
+ * lws. It handles all the SMTP sequencing and protocol actions.
+ *
+ * Your system should have postfix, sendmail or another MTA listening on port
+ * 25 and able to send email using the "mail" commandline app. Usually distro
+ * MTAs are configured for this by default.
+ *
+ * It runs via its own libuv events if initialized (which requires giving it
+ * a libuv loop to attach to).
+ *
+ * It operates using three callbacks, on_next() queries if there is a new email
+ * to send, on_get_body() asks for the body of the email, and on_sent() is
+ * called after the email is successfully sent.
+ *
+ * To use it
+ *
+ * - create an lws_email struct
+ *
+ * - initialize data, loop, the email_* strings, max_content_size and
+ * the callbacks
+ *
+ * - call lws_email_init()
+ *
+ * When you have at least one email to send, call lws_email_check() to
+ * schedule starting to send it.
*/
-LWS_VISIBLE LWS_EXTERN void
-lws_set_allocator(void *(*realloc)(void *ptr, size_t size));
-
-/* lws_email */
+//@{
#ifdef LWS_WITH_SMTP
+
+/** enum lwsgs_smtp_states - where we are in SMTP protocol sequence */
enum lwsgs_smtp_states {
- LGSSMTP_IDLE,
- LGSSMTP_CONNECTING,
- LGSSMTP_CONNECTED,
- LGSSMTP_SENT_HELO,
- LGSSMTP_SENT_FROM,
- LGSSMTP_SENT_TO,
- LGSSMTP_SENT_DATA,
- LGSSMTP_SENT_BODY,
- LGSSMTP_SENT_QUIT,
+ LGSSMTP_IDLE, /**< awaiting new email */
+ LGSSMTP_CONNECTING, /**< opening tcp connection to MTA */
+ LGSSMTP_CONNECTED, /**< tcp connection to MTA is connected */
+ LGSSMTP_SENT_HELO, /**< sent the HELO */
+ LGSSMTP_SENT_FROM, /**< sent FROM */
+ LGSSMTP_SENT_TO, /**< sent TO */
+ LGSSMTP_SENT_DATA, /**< sent DATA request */
+ LGSSMTP_SENT_BODY, /**< sent the email body */
+ LGSSMTP_SENT_QUIT, /**< sent the session quit */
};
-/*
- * struct lws_email - abstract context for performing SMTP operations
- *
- * @data: opaque pointer set by user code and available to the callbacks
- * @email_smtp_ip: IP address to access for SMTP server (usually 127.0.0.1)
- * @email_helo: Server name to use when greeting SMTP server
- * @on_next: called when idle, 0 = another email to send, nonzero is idle.
- * If you return 0, all of the email_* char arrays must be set
- * to something useful.
- * @on_sent: called when transfer of the email to the SMTP server was
- * successful, your callback would remove the current email
- * from its queue
- * @on_get_body: called when the body part of the queued email is about to be
- * sent to the SMTP server.
- */
+/** struct lws_email - abstract context for performing SMTP operations */
struct lws_email {
- uv_timer_t timeout_email;
- enum lwsgs_smtp_states estate;
- uv_connect_t email_connect_req;
- uv_tcp_t email_client;
- time_t email_connect_started;
- char email_buf[256];
- char *content;
- void *data; /* Fill before init, useful in callbacks */
+ void *data;
+ /**< opaque pointer set by user code and available to the callbacks */
uv_loop_t *loop;
+ /**< the libuv loop we will work on */
- char email_smtp_ip[32]; /* Fill before init, eg, "127.0.0.1" */
- char email_helo[32]; /* Fill before init, eg, "myserver.com" */
- char email_from[100]; /* Fill before init or @on_next */
- char email_to[100]; /* Fill before init or @on_next */
+ char email_smtp_ip[32]; /**< Fill before init, eg, "127.0.0.1" */
+ char email_helo[32]; /**< Fill before init, eg, "myserver.com" */
+ char email_from[100]; /**< Fill before init or on_next */
+ char email_to[100]; /**< Fill before init or on_next */
unsigned int max_content_size;
+ /**< largest possible email body size */
/* Fill all the callbacks before init */
int (*on_next)(struct lws_email *email);
+ /**< (Fill in before calling lws_email_init)
+ * called when idle, 0 = another email to send, nonzero is idle.
+ * If you return 0, all of the email_* char arrays must be set
+ * to something useful. */
int (*on_sent)(struct lws_email *email);
+ /**< (Fill in before calling lws_email_init)
+ * called when transfer of the email to the SMTP server was
+ * successful, your callback would remove the current email
+ * from its queue */
int (*on_get_body)(struct lws_email *email, char *buf, int len);
+ /**< (Fill in before calling lws_email_init)
+ * called when the body part of the queued email is about to be
+ * sent to the SMTP server. */
+
+
+ /* private things */
+ uv_timer_t timeout_email; /**< private */
+ enum lwsgs_smtp_states estate; /**< private */
+ uv_connect_t email_connect_req; /**< private */
+ uv_tcp_t email_client; /**< private */
+ time_t email_connect_started; /**< private */
+ char email_buf[256]; /**< private */
+ char *content; /**< private */
};
+/**
+ * lws_email_init() - Initialize a struct lws_email
+ *
+ * \param email: struct lws_email to init
+ * \param loop: libuv loop to use
+ * \param max_content: max email content size
+ *
+ * Prepares a struct lws_email for use ending SMTP
+ */
LWS_VISIBLE LWS_EXTERN int
lws_email_init(struct lws_email *email, uv_loop_t *loop, int max_content);
+
+/**
+ * lws_email_check() - Request check for new email
+ *
+ * \param email: struct lws_email context to check
+ *
+ * Schedules a check for new emails in 1s... call this when you have queued an
+ * email for send.
+ */
LWS_VISIBLE LWS_EXTERN void
lws_email_check(struct lws_email *email);
+/**
+ * lws_email_destroy() - stop using the struct lws_email
+ *
+ * \param email: the struct lws_email context
+ *
+ * Stop sending email using email and free allocations
+ */
LWS_VISIBLE LWS_EXTERN void
lws_email_destroy(struct lws_email *email);
+
#endif
+//@}
#ifdef __cplusplus
}
/**
* lws_cancel_service() - Cancel servicing of pending websocket activity
- * @context: Websocket context
+ * \param context: Websocket context
*
* This function let a call to lws_service() waiting for a timeout
* immediately return.
return poll(fd, 1, 0);
}
-/**
- * lws_cancel_service_pt() - Cancel servicing of pending socket activity
- * on one thread
- * @wsi: Cancel service on the thread this wsi is serviced by
- *
- * This function let a call to lws_service() waiting for a timeout
- * immediately return.
- */
LWS_VISIBLE void
lws_cancel_service_pt(struct lws *wsi)
{
lwsl_err("Cannot write to dummy pipe");
}
-/**
- * lws_cancel_service() - Cancel ALL servicing of pending socket activity
- * @context: Websocket context
- *
- * This function let a call to lws_service() waiting for a timeout
- * immediately return.
- */
LWS_VISIBLE void
lws_cancel_service(struct lws_context *context)
{
return select(fd->fd + 1, &readfds, NULL, NULL, &tv);
}
-/**
- * lws_cancel_service() - Cancel servicing of pending websocket activity
- * @context: Websocket context
- *
- * This function let a call to lws_service() waiting for a timeout
- * immediately return.
- */
LWS_VISIBLE void
lws_cancel_service(struct lws_context *context)
{
lwsl_emit_stderr(level, line);
}
-LWS_VISIBLE DWORD
+LWS_VISIBLE DWORD
lws_plat_wait_event(struct lws_context_per_thread* pt, int timeout)
{
int event_count = pt->fds_count + 1;
// the WSAWaitForMultipleEvents can wait for maximum of 64 handles
if(event_count <= WSA_MAXIMUM_WAIT_EVENTS)
- {
+ {
return ev = WSAWaitForMultipleEvents(event_count, events,
FALSE, timeout, FALSE);
}
else
{
- // back-up solution
- // this is really ugly and introduces unneeded latency / unfairness
+ // back-up solution
+ // this is really ugly and introduces unneeded latency / unfairness
// but still better than the current crash
int timeout_left = timeout;
// the smaller the step the closer we get to the valid solution
- // and the more CPU we will use
+ // and the more CPU we will use
int timeout_step = (timeout > 20) ? 20 : timeout;
while(timeout_left > 0)
- {
+ {
int events_left = event_count;
int events_handled = 0;
timeout = 0;
-
+
while(events_left > 0)
{
// split to groups to size of max 64
return real_len;
}
-/**
- * lws_write() - Apply protocol then write data to client
- * @wsi: Websocket instance (available from user callback)
- * @buf: The data to send. For data being sent on a websocket
- * connection (ie, not default http), this buffer MUST have
- * LWS_PRE bytes valid BEFORE the pointer.
- * This is so the protocol header data can be added in-situ.
- * @len: Count of the data bytes in the payload starting from buf
- * @protocol: Use LWS_WRITE_HTTP to reply to an http connection, and one
- * of LWS_WRITE_BINARY or LWS_WRITE_TEXT to send appropriate
- * data on a websockets connection. Remember to allow the extra
- * bytes before and after buf if LWS_WRITE_BINARY or LWS_WRITE_TEXT
- * are used.
- *
- * This function provides the way to issue data back to the client
- * for both http and websocket protocols.
- *
- * In the case of sending using websocket protocol, be sure to allocate
- * valid storage before and after buf as explained above. This scheme
- * allows maximum efficiency of sending data and protocol in a single
- * packet while not burdening the user code with any protocol knowledge.
- *
- * Return may be -1 for a fatal error needing connection close, or a
- * positive number reflecting the amount of bytes actually sent. This
- * can be less than the requested number of bytes due to OS memory
- * pressure at any given time.
- */
-
LWS_VISIBLE int lws_write(struct lws *wsi, unsigned char *buf, size_t len,
enum lws_write_protocol wp)
{
return 0;
}
-/**
- * lws_hdr_fragment_length: report length of a single fragment of a header
- * The returned length does not include the space for a
- * terminating '\0'
- *
- * @wsi: websocket connection
- * @h: which header index we are interested in
- * @frag_idx: which fragment of @h we want to get the length of
- */
-
LWS_VISIBLE int
lws_hdr_fragment_length(struct lws *wsi, enum lws_token_indexes h, int frag_idx)
{
return 0;
}
-/**
- * lws_hdr_total_length: report length of all fragments of a header totalled up
- * The returned length does not include the space for a
- * terminating '\0'
- *
- * @wsi: websocket connection
- * @h: which header index we are interested in
- */
-
LWS_VISIBLE int lws_hdr_total_length(struct lws *wsi, enum lws_token_indexes h)
{
int n;
return len;
}
-/**
- * lws_hdr_copy_fragment: copy a single fragment of the given header to a buffer
- * The buffer length @len must include space for an additional
- * terminating '\0', or it will fail returning -1.
- * If the requested fragment index is not present, it fails
- * returning -1.
- *
- * @wsi: websocket connection
- * @dst: destination buffer
- * @len: length of destination buffer
- * @h: which header index we are interested in
- * @frag_index: which fragment of @h we want to copy
- */
-
LWS_VISIBLE int lws_hdr_copy_fragment(struct lws *wsi, char *dst, int len,
enum lws_token_indexes h, int frag_idx)
{
return wsi->u.hdr.ah->frags[f].len;
}
-/**
- * lws_hdr_copy: copy a single fragment of the given header to a buffer
- * The buffer length @len must include space for an additional
- * terminating '\0', or it will fail returning -1.
- *
- * @wsi: websocket connection
- * @dst: destination buffer
- * @len: length of destination buffer
- * @h: which header index we are interested in
- */
-
LWS_VISIBLE int lws_hdr_copy(struct lws *wsi, char *dst, int len,
enum lws_token_indexes h)
{
return -1;
}
-
-/**
- * lws_frame_is_binary: true if the current frame was sent in binary mode
- *
- * @wsi: the connection we are inquiring about
- *
- * This is intended to be called from the LWS_CALLBACK_RECEIVE callback if
- * it's interested to see if the frame it's dealing with was sent in binary
- * mode.
- */
-
LWS_VISIBLE int lws_frame_is_binary(struct lws *wsi)
{
return wsi->u.ws.frame_is_binary;
return -1;
}
-
-/**
- * lws_remaining_packet_payload() - Bytes to come before "overall"
- * rx packet is complete
- * @wsi: Websocket instance (available from user callback)
- *
- * This function is intended to be called from the callback if the
- * user code is interested in "complete packets" from the client.
- * libwebsockets just passes through payload as it comes and issues a buffer
- * additionally when it hits a built-in limit. The LWS_CALLBACK_RECEIVE
- * callback handler can use this API to find out if the buffer it has just
- * been given is the last piece of a "complete packet" from the client --
- * when that is the case lws_remaining_packet_payload() will return
- * 0.
- *
- * Many protocols won't care becuse their packets are always small.
- */
-
LWS_VISIBLE size_t
lws_remaining_packet_payload(struct lws *wsi)
{
return ret;
}
-
-/**
- * lws_callback_on_writable() - Request a callback when this socket
- * becomes able to be written to without
- * blocking
- *
- * @wsi: Websocket connection instance to get callback for
- */
-
LWS_VISIBLE int
lws_callback_on_writable(struct lws *wsi)
{
return 1;
}
-/**
- * lws_callback_on_writable_all_protocol_vhost() - Request a callback for
- * all connections using the given protocol when it
- * becomes possible to write to each socket without
- * blocking in turn.
- *
- * This calls back connections with the same protocol ON THE SAME
- * VHOST ONLY.
- *
- * @vhost: Only consider connections on this lws_vhost
- * @protocol: Protocol whose connections will get callbacks
- */
-
LWS_VISIBLE int
lws_callback_on_writable_all_protocol_vhost(const struct lws_vhost *vhost,
const struct lws_protocols *protocol)
return 0;
}
-/**
- * lws_callback_on_writable_all_protocol() - Request a callback for
- * all connections using the given protocol when it
- * becomes possible to write to each socket without
- * blocking in turn.
- *
- * This calls back any connection using the same protocol on ANY
- * VHOST.
- *
- * @context: lws_context
- * @protocol: Protocol whose connections will get callbacks
- */
-
LWS_VISIBLE int
lws_callback_on_writable_all_protocol(const struct lws_context *context,
const struct lws_protocols *protocol)
return NULL;
}
-/**
- * lws_vhost_name_to_protocol() - get vhost's protocol object from its name
- *
- * @vh: vhost to search
- * @name: protocol name
- *
- * Returns NULL or a pointer to the vhost's protocol of the requested name
- */
-
LWS_VISIBLE LWS_EXTERN const struct lws_protocols *
lws_vhost_name_to_protocol(struct lws_vhost *vh, const char *name)
{
return new_wsi;
}
-/**
- * lws_http_transaction_completed() - wait for new http transaction or close
- * @wsi: websocket connection
- *
- * Returns 1 if the HTTP connection must close now
- * Returns 0 and resets connection to wait for new HTTP header /
- * transaction if possible
- */
-
LWS_VISIBLE int LWS_WARN_UNUSED_RESULT
lws_http_transaction_completed(struct lws *wsi)
{
return NULL;
}
-/**
- * lws_adopt_socket() - adopt foreign socket as if listen socket accepted it
- * @context: lws context
- * @accept_fd: fd of already-accepted socket to adopt
- *
- * Either returns new wsi bound to accept_fd, or closes accept_fd and
- * returns NULL, having cleaned up any new wsi pieces.
- *
- * LWS adopts the socket in http serving mode, it's ready to accept an upgrade
- * to ws or just serve http.
- */
-
LWS_VISIBLE struct lws *
lws_adopt_socket(struct lws_context *context, lws_sockfd_type accept_fd)
{
return lws_adopt_socket_vhost(context->vhost_list, accept_fd);
}
-
-/**
- * lws_adopt_socket_readbuf() - adopt foreign socket and first rx as if listen socket accepted it
- * @context: lws context
- * @accept_fd: fd of already-accepted socket to adopt
- * @readbuf: NULL or pointer to data that must be drained before reading from
- * accept_fd
- * @len: The length of the data held at @readbuf
- *
- * Either returns new wsi bound to accept_fd, or closes accept_fd and
- * returns NULL, having cleaned up any new wsi pieces.
- *
- * LWS adopts the socket in http serving mode, it's ready to accept an upgrade
- * to ws or just serve http.
- *
- * If your external code did not already read from the socket, you can use
- * lws_adopt_socket() instead.
- *
- * This api is guaranteed to use the data at @readbuf first, before reading from
- * the socket.
- *
- * @readbuf is limited to the size of the ah rx buf, currently 2048 bytes.
- */
-
LWS_VISIBLE LWS_EXTERN struct lws *
lws_adopt_socket_readbuf(struct lws_context *context, lws_sockfd_type accept_fd,
const char *readbuf, size_t len)
return 1;
}
-/**
- * lws_serve_http_file() - Send a file back to the client using http
- * @wsi: Websocket instance (available from user callback)
- * @file: The file to issue over http
- * @content_type: The http content type, eg, text/html
- * @other_headers: NULL or pointer to header string
- * @other_headers_len: length of the other headers if non-NULL
- *
- * This function is intended to be called from the callback in response
- * to http requests from the client. It allows the callback to issue
- * local files down the http link in a single step.
- *
- * Returning <0 indicates error and the wsi should be closed. Returning
- * >0 indicates the file was completely sent and
- * lws_http_transaction_completed() called on the wsi (and close if != 0)
- * ==0 indicates the file transfer is started and needs more service later,
- * the wsi should be left alone.
- */
-
LWS_VISIBLE int
lws_serve_http_file(struct lws *wsi, const char *file, const char *content_type,
const char *other_headers, int other_headers_len)
return 0;
}
-/**
- * lws_spa_create() - create urldecode parser
- *
- * @wsi: lws connection (used to find Content Type)
- * @param_names: array of form parameter names, like "username"
- * @count_params: count of param_names
- * @max_storage: total amount of form parameter values we can store
- * @opt_cb: NULL, or callback to receive file upload data.
- * @opt_data: NULL, or user pointer provided to opt_cb.
- *
- * Creates a urldecode parser and initializes it.
- *
- * @opt_cb can be NULL if you just want normal name=value parsing, however
- * if one or more entries in your form are bulk data (file transfer), you
- * can provide this callback and filter on the name callback parameter to
- * treat that urldecoded data separately. The callback should return -1
- * in case of fatal error, and 0 if OK.
- */
-
LWS_VISIBLE LWS_EXTERN struct lws_spa *
lws_spa_create(struct lws *wsi, const char * const *param_names,
int count_params, int max_storage,
return NULL;
}
-/**
- * lws_spa_process() - parses a chunk of input data
- *
- * @ludspa: the parser object previously created
- * @in: incoming, urlencoded data
- * @len: count of bytes valid at @in
- */
-
LWS_VISIBLE LWS_EXTERN int
lws_spa_process(struct lws_spa *ludspa, const char *in, int len)
{
return lws_urldecode_s_process(ludspa->s, in, len);
}
-/**
- * lws_spa_get_length() - return length of parameter value
- *
- * @ludspa: the parser object previously created
- * @n: parameter ordinal to return length of value for
- */
-
LWS_VISIBLE LWS_EXTERN int
lws_spa_get_length(struct lws_spa *ludspa, int n)
{
return ludspa->param_length[n];
}
-/**
- * lws_spa_get_string() - return pointer to parameter value
- *
- * @ludspa: the parser object previously created
- * @n: parameter ordinal to return pointer to value for
- */
-
LWS_VISIBLE LWS_EXTERN const char *
lws_spa_get_string(struct lws_spa *ludspa, int n)
{
return ludspa->params[n];
}
-/**
- * lws_spa_finalize() - indicate incoming data completed
- *
- * @ludspa: the parser object previously created
- */
-
LWS_VISIBLE LWS_EXTERN int
lws_spa_finalize(struct lws_spa *spa)
{
return 0;
}
-/**
- * lws_spa_destroy() - destroy parser object
- *
- * @ludspa: the parser object previously created
- */
-
LWS_VISIBLE LWS_EXTERN int
lws_spa_destroy(struct lws_spa *spa)
{
}
#endif
-/**
- * lws_service_fd() - Service polled socket with something waiting
- * @context: Websocket context
- * @pollfd: The pollfd entry describing the socket fd and which events
- * happened.
- *
- * This function takes a pollfd that has POLLIN or POLLOUT activity and
- * services it according to the state of the associated
- * struct lws.
- *
- * The one call deals with all "service" that might happen on a socket
- * including listen accepts, http files as well as websocket protocol.
- *
- * If a pollfd says it has something, you can just pass it to
- * lws_service_fd() whether it is a socket handled by lws or not.
- * If it sees it is a lws socket, the traffic will be handled and
- * pollfd->revents will be zeroed now.
- *
- * If the socket is foreign to lws, it leaves revents alone. So you can
- * see if you should service yourself by checking the pollfd revents
- * after letting lws try to service it.
- */
-
LWS_VISIBLE int
lws_service_fd_tsi(struct lws_context *context, struct lws_pollfd *pollfd, int tsi)
{
return lws_service_fd_tsi(context, pollfd, 0);
}
-/**
- * lws_service() - Service any pending websocket activity
- * @context: Websocket context
- * @timeout_ms: Timeout for poll; 0 means return immediately if nothing needed
- * service otherwise block and service immediately, returning
- * after the timeout if nothing needed service.
- *
- * This function deals with any pending websocket traffic, for three
- * kinds of event. It handles these events on both server and client
- * types of connection the same.
- *
- * 1) Accept new connections to our context's server
- *
- * 2) Call the receive callback for incoming frame data received by
- * server or client connections.
- *
- * You need to call this service function periodically to all the above
- * functions to happen; if your application is single-threaded you can
- * just call it in your main event loop.
- *
- * Alternatively you can fork a new process that asynchronously handles
- * calling this service in a loop. In that case you are happy if this
- * call blocks your thread until it needs to take care of something and
- * would call it with a large nonzero timeout. Your loop then takes no
- * CPU while there is nothing happening.
- *
- * If you are calling it in a single-threaded app, you don't want it to
- * wait around blocking other things in your loop from happening, so you
- * would call it with a timeout_ms of 0, so it returns immediately if
- * nothing is pending, or as soon as it services whatever was pending.
- */
-
LWS_VISIBLE int
lws_service(struct lws_context *context, int timeout_ms)
{
}
}
-/**
- * lws_email_init() - Initialize a struct lws_email
- *
- * @email: struct lws_email to init
- * @loop: libuv loop to use
- * @max_content: max email content size
- *
- * Prepares a struct lws_email for use ending SMTP
- */
-
LWS_VISIBLE LWS_EXTERN int
lws_email_init(struct lws_email *email, uv_loop_t *loop, int max_content)
{
return 0;
}
-/**
- * lws_email_check() - Request check for new email
- *
- * @email: struct lws_email context to check
- *
- * Schedules a check for new emails in 1s... call this when you have queued an
- * email for send.
- */
-
LWS_VISIBLE LWS_EXTERN void
lws_email_check(struct lws_email *email)
{
uv_timer_start(&email->timeout_email, uv_timeout_cb_email, 1000, 0);
}
-/**
- * lws_email_destroy() - stop using the struct lws_email
- *
- * @email: the struct lws_email context
- *
- * Stop sending email using @email and free allocations
- */
-
LWS_VISIBLE LWS_EXTERN void
lws_email_destroy(struct lws_email *email)
{
+++ /dev/null
-<h2>lws_client_reset - retarget a connected wsi to start over with a new connection (ie, redirect) this only works if still in HTTP, ie, not upgraded yet</h2>
-<i>struct lws *</i>
-<b>lws_client_reset</b>
-(<i>struct lws *</i> <b>wsi</b>,
-<i>int</i> <b>ssl</b>,
-<i>const char *</i> <b>address</b>,
-<i>int</i> <b>port</b>,
-<i>const char *</i> <b>path</b>,
-<i>const char *</i> <b>host</b>)
-<h3>Arguments</h3>
-<dl>
-</dl>
-<h3>wsi</h3>
-<blockquote>
-connection to reset
-</blockquote>
-<h3>address</h3>
-<blockquote>
-network address of the new server
-</blockquote>
-<h3>port</h3>
-<blockquote>
-port to connect to
-</blockquote>
-<h3>path</h3>
-<blockquote>
-uri path to connect to on the new server
-</blockquote>
-<h3>host</h3>
-<blockquote>
-host header to send to the new server
-</blockquote>
-<hr>
-<h2>lws_client_connect_via_info - Connect to another websocket server</h2>
-<i>struct lws *</i>
-<b>lws_client_connect_via_info</b>
-(<i>struct lws_client_connect_info *</i> <b>i</b>)
-<h3>Arguments</h3>
-<dl>
-<dt><b>i</b>
-<dd>pointer to lws_client_connect_info struct
-</dl>
-<h3>Description</h3>
-<blockquote>
-This function creates a connection to a remote server
-</blockquote>
-<hr>
-<h2>lws_client_connect_extended - Connect to another websocket server DEPRECATED use lws_client_connect_via_info</h2>
-<i>struct lws *</i>
-<b>lws_client_connect_extended</b>
-(<i>struct lws_context *</i> <b>context</b>,
-<i>const char *</i> <b>address</b>,
-<i>int</i> <b>port</b>,
-<i>int</i> <b>ssl_connection</b>,
-<i>const char *</i> <b>path</b>,
-<i>const char *</i> <b>host</b>,
-<i>const char *</i> <b>origin</b>,
-<i>const char *</i> <b>protocol</b>,
-<i>int</i> <b>ietf_version_or_minus_one</b>,
-<i>void *</i> <b>userdata</b>)
-<h3>Arguments</h3>
-<dl>
-<dt><b>context</b>
-<dd>Websocket context
-<dt><b>address</b>
-<dd>Remote server address, eg, "myserver.com"
-<dt><b>port</b>
-<dd>Port to connect to on the remote server, eg, 80
-<dt><b>ssl_connection</b>
-<dd>0 = ws://, 1 = wss:// encrypted, 2 = wss:// allow self
-signed certs
-<dt><b>path</b>
-<dd>Websocket path on server
-<dt><b>host</b>
-<dd>Hostname on server
-<dt><b>origin</b>
-<dd>Socket origin name
-<dt><b>protocol</b>
-<dd>Comma-separated list of protocols being asked for from
-the server, or just one. The server will pick the one it
-likes best.
-<dt><b>ietf_version_or_minus_one</b>
-<dd>-1 to ask to connect using the default, latest
-protocol supported, or the specific protocol ordinal
-<dt><b>userdata</b>
-<dd>Pre-allocated user data
-</dl>
-<h3>Description</h3>
-<blockquote>
-This function creates a connection to a remote server
-</blockquote>
-<hr>
-<h2>lws_client_connect - Connect to another websocket server DEPRECATED use lws_client_connect_via_info</h2>
-<i>struct lws *</i>
-<b>lws_client_connect</b>
-(<i>struct lws_context *</i> <b>context</b>,
-<i>const char *</i> <b>address</b>,
-<i>int</i> <b>port</b>,
-<i>int</i> <b>ssl_connection</b>,
-<i>const char *</i> <b>path</b>,
-<i>const char *</i> <b>host</b>,
-<i>const char *</i> <b>origin</b>,
-<i>const char *</i> <b>protocol</b>,
-<i>int</i> <b>ietf_version_or_minus_one</b>)
-<h3>Arguments</h3>
-<dl>
-<dt><b>context</b>
-<dd>Websocket context
-<dt><b>address</b>
-<dd>Remote server address, eg, "myserver.com"
-<dt><b>port</b>
-<dd>Port to connect to on the remote server, eg, 80
-<dt><b>ssl_connection</b>
-<dd>0 = ws://, 1 = wss:// encrypted, 2 = wss:// allow self
-signed certs
-<dt><b>path</b>
-<dd>Websocket path on server
-<dt><b>host</b>
-<dd>Hostname on server
-<dt><b>origin</b>
-<dd>Socket origin name
-<dt><b>protocol</b>
-<dd>Comma-separated list of protocols being asked for from
-the server, or just one. The server will pick the one it
-likes best. If you don't want to specify a protocol, which is
-legal, use NULL here.
-<dt><b>ietf_version_or_minus_one</b>
-<dd>-1 to ask to connect using the default, latest
-protocol supported, or the specific protocol ordinal
-</dl>
-<h3>Description</h3>
-<blockquote>
-This function creates a connection to a remote server
-</blockquote>
-<hr>
-<h2>lws_http_transaction_completed_client - wait for new http transaction or close</h2>
-<i>int LWS_WARN_UNUSED_RESULT</i>
-<b>lws_http_transaction_completed_client</b>
-(<i>struct lws *</i> <b>wsi</b>)
-<h3>Arguments</h3>
-<dl>
-<dt><b>wsi</b>
-<dd>websocket connection
-</dl>
-<h3>Description</h3>
-<blockquote>
-Returns 1 if the HTTP connection must close now
-Returns 0 and resets connection to wait for new HTTP header /
-transaction if possible
-</blockquote>
-<hr>
-<h2>lws_get_library_version - </h2>
-<i>const char *</i>
-<b>lws_get_library_version</b>
-(<i></i> <b>void</b>)
-<h3>Arguments</h3>
-<dl>
-<dt><b>void</b>
-<dd>no arguments
-</dl>
-<h3>Description</h3>
-<blockquote>
-<p>
-returns a const char * to a string like "1.1 178d78c"
-representing the library version followed by the git head hash it
-was built from
-</blockquote>
-<hr>
-<h2>lws_init_vhost_client_ssl - also enable client SSL on an existing vhost</h2>
-<i>int</i>
-<b>lws_init_vhost_client_ssl</b>
-(<i>const struct lws_context_creation_info *</i> <b>info</b>,
-<i>struct lws_vhost *</i> <b>vhost</b>)
-<h3>Arguments</h3>
-<dl>
-<dt><b>info</b>
-<dd>client ssl related info
-<dt><b>vhost</b>
-<dd>which vhost to initialize client ssl operations on
-</dl>
-<h3>Description</h3>
-<blockquote>
-You only need to call this if you plan on using SSL client connections on
-the vhost. For non-SSL client connections, it's not necessary to call this.
-<p>
-The following members of <tt><b>info</b></tt> are used during the call
-<p>
-- <tt><b>options</b></tt> must have LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT set,
-otherwise the call does nothing
-- <tt><b>provided_client_ssl_ctx</b></tt> must be NULL to get a generated client
-ssl context, otherwise you can pass a prepared one in by setting it
-- <tt><b>ssl_cipher_list</b></tt> may be NULL or set to the client valid cipher list
-- <tt><b>ssl_ca_filepath</b></tt> may be NULL or client cert filepath
-- <tt><b>ssl_cert_filepath</b></tt> may be NULL or client cert filepath
-- <tt><b>ssl_private_key_filepath</b></tt> may be NULL or client cert private key
-<p>
-You must create your vhost explicitly if you want to use this, so you have
-a pointer to the vhost. Create the context first with the option flag
-LWS_SERVER_OPTION_EXPLICIT_VHOSTS and then call <b>lws_create_vhost</b> with
-the same info struct.
-</blockquote>
-<hr>
-<h2>lws_create_context - Create the websocket handler</h2>
-<i>struct lws_context *</i>
-<b>lws_create_context</b>
-(<i>struct lws_context_creation_info *</i> <b>info</b>)
-<h3>Arguments</h3>
-<dl>
-<dt><b>info</b>
-<dd>pointer to struct with parameters
-</dl>
-<h3>Description</h3>
-<blockquote>
-This function creates the listening socket (if serving) and takes care
-of all initialization in one step.
-<p>
-After initialization, it returns a struct lws_context * that
-represents this server. After calling, user code needs to take care
-of calling <b>lws_service</b> with the context pointer to get the
-server's sockets serviced. This must be done in the same process
-context as the initialization call.
-<p>
-The protocol callback functions are called for a handful of events
-including http requests coming in, websocket connections becoming
-established, and data arriving; it's also called periodically to allow
-async transmission.
-<p>
-HTTP requests are sent always to the FIRST protocol in <tt><b>protocol</b></tt>, since
-at that time websocket protocol has not been negotiated. Other
-protocols after the first one never see any HTTP callack activity.
-<p>
-The server created is a simple http server by default; part of the
-websocket standard is upgrading this http connection to a websocket one.
-<p>
-This allows the same server to provide files like scripts and favicon /
-images or whatever over http and dynamic data over websockets all in
-one place; they're all handled in the user callback.
-</blockquote>
-<hr>
-<h2>lws_context_destroy - Destroy the websocket context</h2>
-<i>void</i>
-<b>lws_context_destroy</b>
-(<i>struct lws_context *</i> <b>context</b>)
-<h3>Arguments</h3>
-<dl>
-<dt><b>context</b>
-<dd>Websocket context
-</dl>
-<h3>Description</h3>
-<blockquote>
-This function closes any active connections and then frees the
-context. After calling this, any further use of the context is
-undefined.
-</blockquote>
-<hr>
-<h2>lws_set_extension_option - </h2>
-<i>int</i>
-<b>lws_set_extension_option</b>
-(<i>struct lws *</i> <b>wsi</b>,
-<i>const char *</i> <b>ext_name</b>,
-<i>const char *</i> <b>opt_name</b>,
-<i>const char *</i> <b>opt_val</b>)
-<h3>Arguments</h3>
-<dl>
-<dt><b>wsi</b>
-<dd>websocket connection
-<dt><b>ext_name</b>
-<dd>name of ext, like "permessage-deflate"
-<dt><b>opt_name</b>
-<dd>name of option, like "rx_buf_size"
-<dt><b>opt_val</b>
-<dd>value to set option to
-</dl>
-<hr>
-<h2>lws_return_http_status - Return simple http status</h2>
-<i>int</i>
-<b>lws_return_http_status</b>
-(<i>struct lws *</i> <b>wsi</b>,
-<i>unsigned int</i> <b>code</b>,
-<i>const char *</i> <b>html_body</b>)
-<h3>Arguments</h3>
-<dl>
-<dt><b>wsi</b>
-<dd>Websocket instance (available from user callback)
-<dt><b>code</b>
-<dd>Status index, eg, 404
-<dt><b>html_body</b>
-<dd>User-readable HTML description < 1KB, or NULL
-</dl>
-<h3>Description</h3>
-<blockquote>
-Helper to report HTTP errors back to the client cleanly and
-consistently
-</blockquote>
-<hr>
-<h2>lejp_construct - prepare a struct lejp_ctx for use</h2>
-<i>void</i>
-<b>lejp_construct</b>
-(<i>struct lejp_ctx *</i> <b>ctx</b>,
-<i>char (*</i><b>callback</b>) <i>(struct lejp_ctx *ctx, char reason)</i>,
-<i>void *</i> <b>user</b>,
-<i>const char *const *</i> <b>paths</b>,
-<i>unsigned char</i> <b>count_paths</b>)
-<h3>Arguments</h3>
-<dl>
-<dt><b>ctx</b>
-<dd>pointer to your struct lejp_ctx
-<dt><b>callback</b>
-<dd>your user callback which will received parsed tokens
-<dt><b>user</b>
-<dd>optional user data pointer untouched by lejp
-<dt><b>paths</b>
-<dd>your array of name elements you are interested in
-<dt><b>count_paths</b>
-<dd><b>ARRAY_SIZE</b> of <tt><b>paths</b></tt>
-</dl>
-<h3>Description</h3>
-<blockquote>
-Prepares your context struct for use with lejp
-</blockquote>
-<hr>
-<h2>lejp_destruct - retire a previously constructed struct lejp_ctx</h2>
-<i>void</i>
-<b>lejp_destruct</b>
-(<i>struct lejp_ctx *</i> <b>ctx</b>)
-<h3>Arguments</h3>
-<dl>
-<dt><b>ctx</b>
-<dd>pointer to your struct lejp_ctx
-</dl>
-<h3>Description</h3>
-<blockquote>
-lejp does not perform any allocations, but since your user code might, this
-provides a one-time LEJPCB_DESTRUCTED callback at destruction time where
-you can clean up in your callback.
-</blockquote>
-<hr>
-<h2>lejp_change_callback - switch to a different callback from now on</h2>
-<i>void</i>
-<b>lejp_change_callback</b>
-(<i>struct lejp_ctx *</i> <b>ctx</b>,
-<i>char (*</i><b>callback</b>) <i>(struct lejp_ctx *ctx, char reason)</i>)
-<h3>Arguments</h3>
-<dl>
-<dt><b>ctx</b>
-<dd>pointer to your struct lejp_ctx
-<dt><b>callback</b>
-<dd>your user callback which will received parsed tokens
-</dl>
-<h3>Description</h3>
-<blockquote>
-This tells the old callback it was destroyed, in case you want to take any
-action because that callback "lost focus", then changes to the new
-callback and tells it first that it was constructed, and then started.
-<p>
-Changing callback is a cheap and powerful trick to split out handlers
-according to information earlier in the parse. For example you may have
-a JSON pair "schema" whose value defines what can be expected for the rest
-of the JSON. Rather than having one huge callback for all cases, you can
-have an initial one looking for "schema" which then calls
-<b>lejp_change_callback</b> to a handler specific for the schema.
-<p>
-Notice that afterwards, you need to construct the context again anyway to
-parse another JSON object, and the callback is reset then to the main,
-schema-interpreting one. The construction action is very lightweight.
-</blockquote>
-<hr>
-<h2>lejp_parse - interpret some more incoming data incrementally</h2>
-<i>int</i>
-<b>lejp_parse</b>
-(<i>struct lejp_ctx *</i> <b>ctx</b>,
-<i>const unsigned char *</i> <b>json</b>,
-<i>int</i> <b>len</b>)
-<h3>Arguments</h3>
-<dl>
-<dt><b>ctx</b>
-<dd>previously constructed parsing context
-<dt><b>json</b>
-<dd>char buffer with the new data to interpret
-<dt><b>len</b>
-<dd>amount of data in the buffer
-</dl>
-<h3>Description</h3>
-<blockquote>
-Because lejp is a stream parser, it incrementally parses as new data
-becomes available, maintaining all state in the context struct. So an
-incomplete JSON is a normal situation, getting you a LEJP_CONTINUE
-return, signalling there's no error but to call again with more data when
-it comes to complete the parsing. Successful parsing completes with a
-0 or positive integer indicating how much of the last input buffer was
-unused.
-</blockquote>
-<hr>
-<h2>lws_set_timeout - marks the wsi as subject to a timeout</h2>
-<i>void</i>
-<b>lws_set_timeout</b>
-(<i>struct lws *</i> <b>wsi</b>,
-<i>enum pending_timeout</i> <b>reason</b>,
-<i>int</i> <b>secs</b>)
-<h3>Arguments</h3>
-<dl>
-<dt><b>wsi</b>
-<dd>Websocket connection instance
-<dt><b>reason</b>
-<dd>timeout reason
-<dt><b>secs</b>
-<dd>how many seconds
-</dl>
-<h3>Description</h3>
-<blockquote>
-<p>
-You will not need this unless you are doing something special
-</blockquote>
-<hr>
-<h2>lws_get_urlarg_by_name - return pointer to arg value if present</h2>
-<i>LWS_EXTERN const char *</i>
-<b>lws_get_urlarg_by_name</b>
-(<i>struct lws *</i> <b>wsi</b>,
-<i>const char *</i> <b>name</b>,
-<i>char *</i> <b>buf</b>,
-<i>int</i> <b>len</b>)
-<h3>Arguments</h3>
-<dl>
-<dt><b>wsi</b>
-<dd>the connection to check
-<dt><b>name</b>
-<dd>the arg name, like "token="
-<dt><b>buf</b>
-<dd>the buffer to receive the urlarg (including the name= part)
-<dt><b>len</b>
-<dd>the length of the buffer to receive the urlarg
-</dl>
-<h3>Description</h3>
-<blockquote>
-Returns NULL if not found or a pointer inside <tt><b>buf</b></tt> to just after the
-name= part.
-</blockquote>
-<hr>
-<h2>lws_get_peer_simple - Get client address information without RDNS</h2>
-<i>const char *</i>
-<b>lws_get_peer_simple</b>
-(<i>struct lws *</i> <b>wsi</b>,
-<i>char *</i> <b>name</b>,
-<i>int</i> <b>namelen</b>)
-<h3>Arguments</h3>
-<dl>
-<dt><b>wsi</b>
-<dd>Local struct lws associated with
-<dt><b>name</b>
-<dd>Buffer to take client address name
-</dl>
-<h3>Description</h3>
-<blockquote>
-This provides a 123.123.123.123 type IP address in <tt><b>name</b></tt> from the
-peer that has connected to <tt><b>wsi</b></tt>
-</blockquote>
-<hr>
-<h2>lws_get_peer_addresses - Get client address information</h2>
-<i>void</i>
-<b>lws_get_peer_addresses</b>
-(<i>struct lws *</i> <b>wsi</b>,
-<i>lws_sockfd_type</i> <b>fd</b>,
-<i>char *</i> <b>name</b>,
-<i>int</i> <b>name_len</b>,
-<i>char *</i> <b>rip</b>,
-<i>int</i> <b>rip_len</b>)
-<h3>Arguments</h3>
-<dl>
-<dt><b>wsi</b>
-<dd>Local struct lws associated with
-<dt><b>fd</b>
-<dd>Connection socket descriptor
-<dt><b>name</b>
-<dd>Buffer to take client address name
-<dt><b>name_len</b>
-<dd>Length of client address name buffer
-<dt><b>rip</b>
-<dd>Buffer to take client address IP dotted quad
-<dt><b>rip_len</b>
-<dd>Length of client address IP buffer
-</dl>
-<h3>Description</h3>
-<blockquote>
-This function fills in <tt><b>name</b></tt> and <tt><b>rip</b></tt> with the name and IP of
-the client connected with socket descriptor <tt><b>fd</b></tt>. Names may be
-truncated if there is not enough room. If either cannot be
-determined, they will be returned as valid zero-length strings.
-</blockquote>
-<hr>
-<h2>lws_context_user - get the user data associated with the context</h2>
-<i>LWS_EXTERN void *</i>
-<b>lws_context_user</b>
-(<i>struct lws_context *</i> <b>context</b>)
-<h3>Arguments</h3>
-<dl>
-<dt><b>context</b>
-<dd>Websocket context
-</dl>
-<h3>Description</h3>
-<blockquote>
-This returns the optional user allocation that can be attached to
-the context the sockets live in at context_create time. It's a way
-to let all sockets serviced in the same context share data without
-using globals statics in the user code.
-</blockquote>
-<hr>
-<h2>lws_callback_all_protocol - Callback all connections using the given protocol with the given reason</h2>
-<i>int</i>
-<b>lws_callback_all_protocol</b>
-(<i>struct lws_context *</i> <b>context</b>,
-<i>const struct lws_protocols *</i> <b>protocol</b>,
-<i>int</i> <b>reason</b>)
-<h3>Arguments</h3>
-<dl>
-<dt><b>protocol</b>
-<dd>Protocol whose connections will get callbacks
-<dt><b>reason</b>
-<dd>Callback reason index
-</dl>
-<hr>
-<h2>lws_callback_all_protocol_vhost - Callback all connections using the given protocol with the given reason</h2>
-<i>int</i>
-<b>lws_callback_all_protocol_vhost</b>
-(<i>struct lws_vhost *</i> <b>vh</b>,
-<i>const struct lws_protocols *</i> <b>protocol</b>,
-<i>int</i> <b>reason</b>)
-<h3>Arguments</h3>
-<dl>
-<dt><b>vh</b>
-<dd>Vhost whose connections will get callbacks
-<dt><b>protocol</b>
-<dd>Which protocol to match
-<dt><b>reason</b>
-<dd>Callback reason index
-</dl>
-<hr>
-<h2>lws_get_socket_fd - returns the socket file descriptor</h2>
-<i>int</i>
-<b>lws_get_socket_fd</b>
-(<i>struct lws *</i> <b>wsi</b>)
-<h3>Arguments</h3>
-<dl>
-<dt><b>wsi</b>
-<dd>Websocket connection instance
-</dl>
-<h3>Description</h3>
-<blockquote>
-<p>
-You will not need this unless you are doing something special
-</blockquote>
-<hr>
-<h2>lws_rx_flow_control - Enable and disable socket servicing for received packets.</h2>
-<i>int</i>
-<b>lws_rx_flow_control</b>
-(<i>struct lws *</i> <b>wsi</b>,
-<i>int</i> <b>enable</b>)
-<h3>Arguments</h3>
-<dl>
-<dt><b>wsi</b>
-<dd>Websocket connection instance to get callback for
-<dt><b>enable</b>
-<dd>0 = disable read servicing for this connection, 1 = enable
-</dl>
-<h3>Description</h3>
-<blockquote>
-<p>
-If the output side of a server process becomes choked, this allows flow
-control for the input side.
-</blockquote>
-<hr>
-<h2>lws_rx_flow_allow_all_protocol - Allow all connections with this protocol to receive</h2>
-<i>void</i>
-<b>lws_rx_flow_allow_all_protocol</b>
-(<i>const struct lws_context *</i> <b>context</b>,
-<i>const struct lws_protocols *</i> <b>protocol</b>)
-<h3>Arguments</h3>
-<dl>
-<dt><b>protocol</b>
-<dd>all connections using this protocol will be allowed to receive
-</dl>
-<h3>Description</h3>
-<blockquote>
-<p>
-When the user server code realizes it can accept more input, it can
-call this to have the RX flow restriction removed from all connections using
-the given protocol.
-</blockquote>
-<hr>
-<h2>lws_canonical_hostname - returns this host's hostname</h2>
-<i>const char *</i>
-<b>lws_canonical_hostname</b>
-(<i>struct lws_context *</i> <b>context</b>)
-<h3>Arguments</h3>
-<dl>
-<dt><b>context</b>
-<dd>Websocket context
-</dl>
-<h3>Description</h3>
-<blockquote>
-<p>
-This is typically used by client code to fill in the host parameter
-when making a client connection. You can only call it after the context
-has been created.
-</blockquote>
-<hr>
-<h2>lws_set_proxy - Setups proxy to lws_context.</h2>
-<i>int</i>
-<b>lws_set_proxy</b>
-(<i>struct lws_vhost *</i> <b>vhost</b>,
-<i>const char *</i> <b>proxy</b>)
-<h3>Arguments</h3>
-<dl>
-<dt><b>proxy</b>
-<dd>pointer to c string containing proxy in format address:port
-</dl>
-<h3>Description</h3>
-<blockquote>
-Returns 0 if proxy string was parsed and proxy was setup.
-Returns -1 if <tt><b>proxy</b></tt> is NULL or has incorrect format.
-<p>
-This is only required if your OS does not provide the http_proxy
-environment variable (eg, OSX)
-<p>
-IMPORTANT! You should call this function right after creation of the
-lws_context and before call to connect. If you call this
-function after connect behavior is undefined.
-This function will override proxy settings made on lws_context
-creation with <b>genenv</b> call.
-</blockquote>
-<hr>
-<h2>lws_get_protocol - Returns a protocol pointer from a websocket connection.</h2>
-<i>const struct lws_protocols *</i>
-<b>lws_get_protocol</b>
-(<i>struct lws *</i> <b>wsi</b>)
-<h3>Arguments</h3>
-<dl>
-<dt><b>wsi</b>
-<dd>pointer to struct websocket you want to know the protocol of
-</dl>
-<h3>Description</h3>
-<blockquote>
-<p>
-Some apis can act on all live connections of a given protocol,
-this is how you can get a pointer to the active protocol if needed.
-</blockquote>
-<hr>
-<h2>lwsl_timestamp - </h2>
-<i>int</i>
-<b>lwsl_timestamp</b>
-(<i>int</i> <b>level</b>,
-<i>char *</i> <b>p</b>,
-<i>int</i> <b>len</b>)
-<h3>Arguments</h3>
-<dl>
-<dt><b>level</b>
-<dd>logging level
-<dt><b>p</b>
-<dd>char * buffer to take timestamp
-<dt><b>len</b>
-<dd>length of p
-</dl>
-<h3>Description</h3>
-<blockquote>
-returns length written in p
-</blockquote>
-<hr>
-<h2>lws_set_log_level - Set the logging bitfield</h2>
-<i>void</i>
-<b>lws_set_log_level</b>
-(<i>int</i> <b>level</b>,
-<i>void (*</i><b>func</b>) <i>(int level, const char *line)</i>)
-<h3>Arguments</h3>
-<dl>
-<dt><b>level</b>
-<dd>OR together the LLL_ debug contexts you want output from
-</dl>
-<h3>Description</h3>
-<blockquote>
-log level defaults to "err", "warn" and "notice" contexts enabled and
-emission on stderr.
-</blockquote>
-<hr>
-<h2>lws_is_ssl - Find out if connection is using SSL</h2>
-<i>int</i>
-<b>lws_is_ssl</b>
-(<i>struct lws *</i> <b>wsi</b>)
-<h3>Arguments</h3>
-<dl>
-<dt><b>wsi</b>
-<dd>websocket connection to check
-</dl>
-<h3>Description</h3>
-<blockquote>
-Returns 0 if the connection is not using SSL, 1 if using SSL and
-using verified cert, and 2 if using SSL but the cert was not
-checked (appears for client wsi told to skip check on connection)
-</blockquote>
-<hr>
-<h2>lws_partial_buffered - find out if lws buffered the last write</h2>
-<i>int</i>
-<b>lws_partial_buffered</b>
-(<i>struct lws *</i> <b>wsi</b>)
-<h3>Arguments</h3>
-<dl>
-<dt><b>wsi</b>
-<dd>websocket connection to check
-</dl>
-<h3>Description</h3>
-<blockquote>
-Returns 1 if you cannot use lws_write because the last
-write on this connection is still buffered, and can't be cleared without
-returning to the service loop and waiting for the connection to be
-writeable again.
-<p>
-If you will try to do >1 lws_write call inside a single
-WRITEABLE callback, you must check this after every write and bail if
-set, ask for a new writeable callback and continue writing from there.
-<p>
-This is never set at the start of a writeable callback, but any write
-may set it.
-</blockquote>
-<hr>
-<h2>lws_get_context - Allow geting lws_context from a Websocket connection instance</h2>
-<i>LWS_EXTERN struct lws_context *</i>
-<b>lws_get_context</b>
-(<i>const struct lws *</i> <b>wsi</b>)
-<h3>Arguments</h3>
-<dl>
-<dt><b>wsi</b>
-<dd>Websocket connection instance
-</dl>
-<h3>Description</h3>
-<blockquote>
-<p>
-With this function, users can access context in the callback function.
-Otherwise users may have to declare context as a global variable.
-</blockquote>
-<hr>
-<h2>lws_parse_uri - </h2>
-<i>LWS_EXTERN int</i>
-<b>lws_parse_uri</b>
-(<i>char *</i> <b>p</b>,
-<i>const char **</i> <b>prot</b>,
-<i>const char **</i> <b>ads</b>,
-<i>int *</i> <b>port</b>,
-<i>const char **</i> <b>path</b>)
-<h3>Arguments</h3>
-<dl>
-<dt><b>p</b>
-<dd>incoming uri string.. will get written to
-<dt><b>prot</b>
-<dd>result pointer for protocol part (https://)
-<dt><b>ads</b>
-<dd>result pointer for address part
-<dt><b>port</b>
-<dd>result pointer for port part
-<dt><b>path</b>
-<dd>result pointer for path part
-</dl>
-<h3>Description</h3>
-<blockquote>
-Notice it does so by dropping '\0' into input string
-and the leading / on the path is consequently lost
-</blockquote>
-<hr>
-<h2>lws_sql_purify - like strncpy but with escaping for sql quotes</h2>
-<i>LWS_EXTERN const char *</i>
-<b>lws_sql_purify</b>
-(<i>char *</i> <b>escaped</b>,
-<i>const char *</i> <b>string</b>,
-<i>int</i> <b>len</b>)
-<h3>Arguments</h3>
-<dl>
-<dt><b>escaped</b>
-<dd>output buffer
-<dt><b>string</b>
-<dd>input buffer ('/0' terminated)
-<dt><b>len</b>
-<dd>output buffer max length
-</dl>
-<h3>Description</h3>
-<blockquote>
-Because escaping expands the output string, it's not
-possible to do it in-place, ie, with escaped == string
-</blockquote>
-<hr>
-<h2>lws_urlencode - like strncpy but with urlencoding</h2>
-<i>LWS_EXTERN const char *</i>
-<b>lws_urlencode</b>
-(<i>char *</i> <b>escaped</b>,
-<i>const char *</i> <b>string</b>,
-<i>int</i> <b>len</b>)
-<h3>Arguments</h3>
-<dl>
-<dt><b>escaped</b>
-<dd>output buffer
-<dt><b>string</b>
-<dd>input buffer ('/0' terminated)
-<dt><b>len</b>
-<dd>output buffer max length
-</dl>
-<h3>Description</h3>
-<blockquote>
-Because urlencoding expands the output string, it's not
-possible to do it in-place, ie, with escaped == string
-</blockquote>
-<hr>
-<h2>lws_urldecode - like strncpy but with urldecoding</h2>
-<i>LWS_EXTERN int</i>
-<b>lws_urldecode</b>
-(<i>char *</i> <b>string</b>,
-<i>const char *</i> <b>escaped</b>,
-<i>int</i> <b>len</b>)
-<h3>Arguments</h3>
-<dl>
-<dt><b>string</b>
-<dd>output buffer
-<dt><b>escaped</b>
-<dd>input buffer ('\0' terminated)
-<dt><b>len</b>
-<dd>output buffer max length
-</dl>
-<h3>Description</h3>
-<blockquote>
-This is only useful for '\0' terminated strings
-<p>
-Since urldecoding only shrinks the output string, it is possible to
-do it in-place, ie, string == escaped
-</blockquote>
-<hr>
-<h2>lws_urldecode_spa_create - create urldecode parser</h2>
-<i>LWS_EXTERN struct lws_urldecode_stateful_param_array *</i>
-<b>lws_urldecode_spa_create</b>
-(<i>struct lws *</i> <b>wsi</b>,
-<i>const char *const *</i> <b>param_names</b>,
-<i>int</i> <b>count_params</b>,
-<i>int</i> <b>max_storage</b>,
-<i>lws_urldecode_fileupload_cb</i> <b>opt_cb</b>,
-<i>void *</i> <b>opt_data</b>)
-<h3>Arguments</h3>
-<dl>
-<dt><b>wsi</b>
-<dd>lws connection (used to find Content Type)
-<dt><b>param_names</b>
-<dd>array of form parameter names, like "username"
-<dt><b>count_params</b>
-<dd>count of param_names
-<dt><b>max_storage</b>
-<dd>total amount of form parameter values we can store
-<dt><b>opt_cb</b>
-<dd>NULL, or callback to receive file upload data.
-<dt><b>opt_data</b>
-<dd>NULL, or user pointer provided to opt_cb.
-</dl>
-<h3>Description</h3>
-<blockquote>
-Creates a urldecode parser and initializes it.
-<p>
-<tt><b>opt_cb</b></tt> can be NULL if you just want normal name=value parsing, however
-if one or more entries in your form are bulk data (file transfer), you
-can provide this callback and filter on the name callback parameter to
-treat that urldecoded data separately. The callback should return -1
-in case of fatal error, and 0 if OK.
-</blockquote>
-<hr>
-<h2>lws_urldecode_spa_process - parses a chunk of input data</h2>
-<i>LWS_EXTERN int</i>
-<b>lws_urldecode_spa_process</b>
-(<i>struct lws_urldecode_stateful_param_array *</i> <b>ludspa</b>,
-<i>const char *</i> <b>in</b>,
-<i>int</i> <b>len</b>)
-<h3>Arguments</h3>
-<dl>
-<dt><b>ludspa</b>
-<dd>the parser object previously created
-<dt><b>in</b>
-<dd>incoming, urlencoded data
-<dt><b>len</b>
-<dd>count of bytes valid at <tt><b>in</b></tt>
-</dl>
-<hr>
-<h2>lws_urldecode_spa_get_length - return length of parameter value</h2>
-<i>LWS_EXTERN int</i>
-<b>lws_urldecode_spa_get_length</b>
-(<i>struct lws_urldecode_stateful_param_array *</i> <b>ludspa</b>,
-<i>int</i> <b>n</b>)
-<h3>Arguments</h3>
-<dl>
-<dt><b>ludspa</b>
-<dd>the parser object previously created
-<dt><b>n</b>
-<dd>parameter ordinal to return length of value for
-</dl>
-<hr>
-<h2>lws_urldecode_spa_get_string - return pointer to parameter value</h2>
-<i>LWS_EXTERN const char *</i>
-<b>lws_urldecode_spa_get_string</b>
-(<i>struct lws_urldecode_stateful_param_array *</i> <b>ludspa</b>,
-<i>int</i> <b>n</b>)
-<h3>Arguments</h3>
-<dl>
-<dt><b>ludspa</b>
-<dd>the parser object previously created
-<dt><b>n</b>
-<dd>parameter ordinal to return pointer to value for
-</dl>
-<hr>
-<h2>lws_urldecode_spa_finalize - indicate incoming data completed</h2>
-<i>LWS_EXTERN int</i>
-<b>lws_urldecode_spa_finalize</b>
-(<i>struct lws_urldecode_stateful_param_array *</i> <b>spa</b>)
-<h3>Arguments</h3>
-<dl>
-</dl>
-<hr>
-<h2>lws_urldecode_spa_destroy - destroy parser object</h2>
-<i>LWS_EXTERN int</i>
-<b>lws_urldecode_spa_destroy</b>
-(<i>struct lws_urldecode_stateful_param_array *</i> <b>spa</b>)
-<h3>Arguments</h3>
-<dl>
-</dl>
-<hr>
-<h2>lws_cgi - connected cgi process</h2>
-<i>LWS_EXTERN int</i>
-<b>lws_cgi</b>
-(<i>struct lws *</i> <b>wsi</b>,
-<i>const char *const *</i> <b>exec_array</b>,
-<i>int</i> <b>script_uri_path_len</b>,
-<i>int</i> <b>timeout_secs</b>,
-<i>const struct lws_protocol_vhost_options *</i> <b>mp_cgienv</b>)
-<h3>Arguments</h3>
-<dl>
-<dt><b>wsi</b>
-<dd>connection to own the process
-<dt><b>exec_array</b>
-<dd>array of "exec-name" "arg1" ... "argn" NULL
-</dl>
-<hr>
-<h2>lws_cgi_write_split_stdout_headers - </h2>
-<i>LWS_EXTERN int</i>
-<b>lws_cgi_write_split_stdout_headers</b>
-(<i>struct lws *</i> <b>wsi</b>)
-<h3>Arguments</h3>
-<dl>
-<dt><b>wsi</b>
-<dd>connection to own the process
-</dl>
-<hr>
-<h2>lws_cgi_kill - </h2>
-<i>LWS_EXTERN int</i>
-<b>lws_cgi_kill</b>
-(<i>struct lws *</i> <b>wsi</b>)
-<h3>Arguments</h3>
-<dl>
-<dt><b>wsi</b>
-<dd>connection to own the process
-</dl>
-<hr>
-<h2>lws_cancel_service - Cancel servicing of pending websocket activity</h2>
-<i>void</i>
-<b>lws_cancel_service</b>
-(<i>struct lws_context *</i> <b>context</b>)
-<h3>Arguments</h3>
-<dl>
-<dt><b>context</b>
-<dd>Websocket context
-</dl>
-<h3>Description</h3>
-<blockquote>
-This function let a call to <b>lws_service</b> waiting for a timeout
-immediately return.
-<p>
-There is no <b>poll</b> in MBED3, he will fire callbacks when he feels like
-it.
-</blockquote>
-<hr>
-<h2>lws_cancel_service_pt - Cancel servicing of pending socket activity on one thread</h2>
-<i>void</i>
-<b>lws_cancel_service_pt</b>
-(<i>struct lws *</i> <b>wsi</b>)
-<h3>Arguments</h3>
-<dl>
-<dt><b>wsi</b>
-<dd>Cancel service on the thread this wsi is serviced by
-</dl>
-<h3>Description</h3>
-<blockquote>
-This function let a call to <b>lws_service</b> waiting for a timeout
-immediately return.
-</blockquote>
-<hr>
-<h2>lws_cancel_service - Cancel ALL servicing of pending socket activity</h2>
-<i>void</i>
-<b>lws_cancel_service</b>
-(<i>struct lws_context *</i> <b>context</b>)
-<h3>Arguments</h3>
-<dl>
-<dt><b>context</b>
-<dd>Websocket context
-</dl>
-<h3>Description</h3>
-<blockquote>
-This function let a call to <b>lws_service</b> waiting for a timeout
-immediately return.
-</blockquote>
-<hr>
-<h2>lws_cancel_service - Cancel servicing of pending websocket activity</h2>
-<i>void</i>
-<b>lws_cancel_service</b>
-(<i>struct lws_context *</i> <b>context</b>)
-<h3>Arguments</h3>
-<dl>
-<dt><b>context</b>
-<dd>Websocket context
-</dl>
-<h3>Description</h3>
-<blockquote>
-This function let a call to <b>lws_service</b> waiting for a timeout
-immediately return.
-</blockquote>
-<hr>
-<h2>lws_write - Apply protocol then write data to client</h2>
-<i>int</i>
-<b>lws_write</b>
-(<i>struct lws *</i> <b>wsi</b>,
-<i>unsigned char *</i> <b>buf</b>,
-<i>size_t</i> <b>len</b>,
-<i>enum lws_write_protocol</i> <b>wp</b>)
-<h3>Arguments</h3>
-<dl>
-<dt><b>wsi</b>
-<dd>Websocket instance (available from user callback)
-<dt><b>buf</b>
-<dd>The data to send. For data being sent on a websocket
-connection (ie, not default http), this buffer MUST have
-LWS_PRE bytes valid BEFORE the pointer.
-This is so the protocol header data can be added in-situ.
-<dt><b>len</b>
-<dd>Count of the data bytes in the payload starting from buf
-</dl>
-<h3>Description</h3>
-<blockquote>
-This function provides the way to issue data back to the client
-for both http and websocket protocols.
-<p>
-In the case of sending using websocket protocol, be sure to allocate
-valid storage before and after buf as explained above. This scheme
-allows maximum efficiency of sending data and protocol in a single
-packet while not burdening the user code with any protocol knowledge.
-<p>
-Return may be -1 for a fatal error needing connection close, or a
-positive number reflecting the amount of bytes actually sent. This
-can be less than the requested number of bytes due to OS memory
-pressure at any given time.
-</blockquote>
-<hr>
-<h2>lws_hdr_fragment_length - </h2>
-<i>int</i>
-<b>lws_hdr_fragment_length</b>
-(<i>struct lws *</i> <b>wsi</b>,
-<i>enum lws_token_indexes</i> <b>h</b>,
-<i>int</i> <b>frag_idx</b>)
-<h3>Arguments</h3>
-<dl>
-<dt><b>wsi</b>
-<dd>websocket connection
-<dt><b>h</b>
-<dd>which header index we are interested in
-<dt><b>frag_idx</b>
-<dd>which fragment of <tt><b>h</b></tt> we want to get the length of
-</dl>
-<h3>Description</h3>
-<blockquote>
-The returned length does not include the space for a
-terminating '\0'
-</blockquote>
-<hr>
-<h2>lws_hdr_total_length - </h2>
-<i>int</i>
-<b>lws_hdr_total_length</b>
-(<i>struct lws *</i> <b>wsi</b>,
-<i>enum lws_token_indexes</i> <b>h</b>)
-<h3>Arguments</h3>
-<dl>
-<dt><b>wsi</b>
-<dd>websocket connection
-<dt><b>h</b>
-<dd>which header index we are interested in
-</dl>
-<h3>Description</h3>
-<blockquote>
-The returned length does not include the space for a
-terminating '\0'
-</blockquote>
-<hr>
-<h2>lws_hdr_copy_fragment - </h2>
-<i>int</i>
-<b>lws_hdr_copy_fragment</b>
-(<i>struct lws *</i> <b>wsi</b>,
-<i>char *</i> <b>dst</b>,
-<i>int</i> <b>len</b>,
-<i>enum lws_token_indexes</i> <b>h</b>,
-<i>int</i> <b>frag_idx</b>)
-<h3>Arguments</h3>
-<dl>
-<dt><b>wsi</b>
-<dd>websocket connection
-<dt><b>dst</b>
-<dd>destination buffer
-<dt><b>len</b>
-<dd>length of destination buffer
-<dt><b>h</b>
-<dd>which header index we are interested in
-</dl>
-<h3>Description</h3>
-<blockquote>
-The buffer length <tt><b>len</b></tt> must include space for an additional
-terminating '\0', or it will fail returning -1.
-If the requested fragment index is not present, it fails
-returning -1.
-</blockquote>
-<hr>
-<h2>lws_hdr_copy - </h2>
-<i>int</i>
-<b>lws_hdr_copy</b>
-(<i>struct lws *</i> <b>wsi</b>,
-<i>char *</i> <b>dst</b>,
-<i>int</i> <b>len</b>,
-<i>enum lws_token_indexes</i> <b>h</b>)
-<h3>Arguments</h3>
-<dl>
-<dt><b>wsi</b>
-<dd>websocket connection
-<dt><b>dst</b>
-<dd>destination buffer
-<dt><b>len</b>
-<dd>length of destination buffer
-<dt><b>h</b>
-<dd>which header index we are interested in
-</dl>
-<h3>Description</h3>
-<blockquote>
-The buffer length <tt><b>len</b></tt> must include space for an additional
-terminating '\0', or it will fail returning -1.
-</blockquote>
-<hr>
-<h2>lws_frame_is_binary - </h2>
-<i>int</i>
-<b>lws_frame_is_binary</b>
-(<i>struct lws *</i> <b>wsi</b>)
-<h3>Arguments</h3>
-<dl>
-<dt><b>wsi</b>
-<dd>the connection we are inquiring about
-</dl>
-<h3>Description</h3>
-<blockquote>
-This is intended to be called from the LWS_CALLBACK_RECEIVE callback if
-it's interested to see if the frame it's dealing with was sent in binary
-mode.
-</blockquote>
-<hr>
-<h2>lws_remaining_packet_payload - Bytes to come before "overall" rx packet is complete</h2>
-<i>size_t</i>
-<b>lws_remaining_packet_payload</b>
-(<i>struct lws *</i> <b>wsi</b>)
-<h3>Arguments</h3>
-<dl>
-<dt><b>wsi</b>
-<dd>Websocket instance (available from user callback)
-</dl>
-<h3>Description</h3>
-<blockquote>
-This function is intended to be called from the callback if the
-user code is interested in "complete packets" from the client.
-libwebsockets just passes through payload as it comes and issues a buffer
-additionally when it hits a built-in limit. The LWS_CALLBACK_RECEIVE
-callback handler can use this API to find out if the buffer it has just
-been given is the last piece of a "complete packet" from the client --
-when that is the case <b>lws_remaining_packet_payload</b> will return
-0.
-<p>
-Many protocols won't care becuse their packets are always small.
-</blockquote>
-<hr>
-<h2>lws_callback_on_writable - Request a callback when this socket becomes able to be written to without blocking</h2>
-<i>int</i>
-<b>lws_callback_on_writable</b>
-(<i>struct lws *</i> <b>wsi</b>)
-<h3>Arguments</h3>
-<dl>
-<dt><b>wsi</b>
-<dd>Websocket connection instance to get callback for
-</dl>
-<hr>
-<h2>lws_callback_on_writable_all_protocol_vhost - Request a callback for all connections using the given protocol when it becomes possible to write to each socket without blocking in turn.</h2>
-<i>int</i>
-<b>lws_callback_on_writable_all_protocol_vhost</b>
-(<i>const struct lws_vhost *</i> <b>vhost</b>,
-<i>const struct lws_protocols *</i> <b>protocol</b>)
-<h3>Arguments</h3>
-<dl>
-<dt><b>vhost</b>
-<dd>Only consider connections on this lws_vhost
-<dt><b>protocol</b>
-<dd>Protocol whose connections will get callbacks
-</dl>
-<h3>Description</h3>
-<blockquote>
-<p>
-This calls back connections with the same protocol ON THE SAME
-VHOST ONLY.
-</blockquote>
-<hr>
-<h2>lws_callback_on_writable_all_protocol - Request a callback for all connections using the given protocol when it becomes possible to write to each socket without blocking in turn.</h2>
-<i>int</i>
-<b>lws_callback_on_writable_all_protocol</b>
-(<i>const struct lws_context *</i> <b>context</b>,
-<i>const struct lws_protocols *</i> <b>protocol</b>)
-<h3>Arguments</h3>
-<dl>
-<dt><b>context</b>
-<dd>lws_context
-<dt><b>protocol</b>
-<dd>Protocol whose connections will get callbacks
-</dl>
-<h3>Description</h3>
-<blockquote>
-<p>
-This calls back any connection using the same protocol on ANY
-VHOST.
-</blockquote>
-<hr>
-<h2>lws_http_transaction_completed - wait for new http transaction or close</h2>
-<i>int LWS_WARN_UNUSED_RESULT</i>
-<b>lws_http_transaction_completed</b>
-(<i>struct lws *</i> <b>wsi</b>)
-<h3>Arguments</h3>
-<dl>
-<dt><b>wsi</b>
-<dd>websocket connection
-</dl>
-<h3>Description</h3>
-<blockquote>
-Returns 1 if the HTTP connection must close now
-Returns 0 and resets connection to wait for new HTTP header /
-transaction if possible
-</blockquote>
-<hr>
-<h2>lws_adopt_socket - adopt foreign socket as if listen socket accepted it</h2>
-<i>struct lws *</i>
-<b>lws_adopt_socket</b>
-(<i>struct lws_context *</i> <b>context</b>,
-<i>lws_sockfd_type</i> <b>accept_fd</b>)
-<h3>Arguments</h3>
-<dl>
-<dt><b>context</b>
-<dd>lws context
-<dt><b>accept_fd</b>
-<dd>fd of already-accepted socket to adopt
-</dl>
-<h3>Description</h3>
-<blockquote>
-Either returns new wsi bound to accept_fd, or closes accept_fd and
-returns NULL, having cleaned up any new wsi pieces.
-<p>
-LWS adopts the socket in http serving mode, it's ready to accept an upgrade
-to ws or just serve http.
-</blockquote>
-<hr>
-<h2>lws_adopt_socket_readbuf - adopt foreign socket and first rx as if listen socket accepted it</h2>
-<i>LWS_EXTERN struct lws *</i>
-<b>lws_adopt_socket_readbuf</b>
-(<i>struct lws_context *</i> <b>context</b>,
-<i>lws_sockfd_type</i> <b>accept_fd</b>,
-<i>const char *</i> <b>readbuf</b>,
-<i>size_t</i> <b>len</b>)
-<h3>Arguments</h3>
-<dl>
-<dt><b>context</b>
-<dd>lws context
-<dt><b>accept_fd</b>
-<dd>fd of already-accepted socket to adopt
-<dt><b>readbuf</b>
-<dd>NULL or pointer to data that must be drained before reading from
-accept_fd
-<dt><b>len</b>
-<dd>The length of the data held at <tt><b>readbuf</b></tt>
-</dl>
-<h3>Description</h3>
-<blockquote>
-Either returns new wsi bound to accept_fd, or closes accept_fd and
-returns NULL, having cleaned up any new wsi pieces.
-<p>
-LWS adopts the socket in http serving mode, it's ready to accept an upgrade
-to ws or just serve http.
-<p>
-If your external code did not already read from the socket, you can use
-<b>lws_adopt_socket</b> instead.
-<p>
-This api is guaranteed to use the data at <tt><b>readbuf</b></tt> first, before reading from
-the socket.
-<p>
-<tt><b>readbuf</b></tt> is limited to the size of the ah rx buf, currently 2048 bytes.
-</blockquote>
-<hr>
-<h2>lws_serve_http_file - Send a file back to the client using http</h2>
-<i>int</i>
-<b>lws_serve_http_file</b>
-(<i>struct lws *</i> <b>wsi</b>,
-<i>const char *</i> <b>file</b>,
-<i>const char *</i> <b>content_type</b>,
-<i>const char *</i> <b>other_headers</b>,
-<i>int</i> <b>other_headers_len</b>)
-<h3>Arguments</h3>
-<dl>
-<dt><b>wsi</b>
-<dd>Websocket instance (available from user callback)
-<dt><b>file</b>
-<dd>The file to issue over http
-<dt><b>content_type</b>
-<dd>The http content type, eg, text/html
-<dt><b>other_headers</b>
-<dd>NULL or pointer to header string
-<dt><b>other_headers_len</b>
-<dd>length of the other headers if non-NULL
-</dl>
-<h3>Description</h3>
-<blockquote>
-This function is intended to be called from the callback in response
-to http requests from the client. It allows the callback to issue
-local files down the http link in a single step.
-<p>
-Returning <0 indicates error and the wsi should be closed. Returning
->0 indicates the file was completely sent and
-<b>lws_http_transaction_completed</b> called on the wsi (and close if != 0)
-==0 indicates the file transfer is started and needs more service later,
-the wsi should be left alone.
-</blockquote>
-<hr>
-<h2>lws_service_fd_tsi - Service polled socket with something waiting</h2>
-<i>int</i>
-<b>lws_service_fd_tsi</b>
-(<i>struct lws_context *</i> <b>context</b>,
-<i>struct lws_pollfd *</i> <b>pollfd</b>,
-<i>int</i> <b>tsi</b>)
-<h3>Arguments</h3>
-<dl>
-<dt><b>context</b>
-<dd>Websocket context
-<dt><b>pollfd</b>
-<dd>The pollfd entry describing the socket fd and which events
-happened.
-</dl>
-<h3>Description</h3>
-<blockquote>
-This function takes a pollfd that has POLLIN or POLLOUT activity and
-services it according to the state of the associated
-struct lws.
-<p>
-The one call deals with all "service" that might happen on a socket
-including listen accepts, http files as well as websocket protocol.
-<p>
-If a pollfd says it has something, you can just pass it to
-<b>lws_service_fd</b> whether it is a socket handled by lws or not.
-If it sees it is a lws socket, the traffic will be handled and
-pollfd->revents will be zeroed now.
-<p>
-If the socket is foreign to lws, it leaves revents alone. So you can
-see if you should service yourself by checking the pollfd revents
-after letting lws try to service it.
-</blockquote>
-<hr>
-<h2>lws_service - Service any pending websocket activity</h2>
-<i>int</i>
-<b>lws_service</b>
-(<i>struct lws_context *</i> <b>context</b>,
-<i>int</i> <b>timeout_ms</b>)
-<h3>Arguments</h3>
-<dl>
-<dt><b>context</b>
-<dd>Websocket context
-<dt><b>timeout_ms</b>
-<dd>Timeout for poll; 0 means return immediately if nothing needed
-service otherwise block and service immediately, returning
-after the timeout if nothing needed service.
-</dl>
-<h3>Description</h3>
-<blockquote>
-This function deals with any pending websocket traffic, for three
-kinds of event. It handles these events on both server and client
-types of connection the same.
-<p>
-1) Accept new connections to our context's server
-<p>
-2) Call the receive callback for incoming frame data received by
-server or client connections.
-<p>
-You need to call this service function periodically to all the above
-functions to happen; if your application is single-threaded you can
-just call it in your main event loop.
-<p>
-Alternatively you can fork a new process that asynchronously handles
-calling this service in a loop. In that case you are happy if this
-call blocks your thread until it needs to take care of something and
-would call it with a large nonzero timeout. Your loop then takes no
-CPU while there is nothing happening.
-<p>
-If you are calling it in a single-threaded app, you don't want it to
-wait around blocking other things in your loop from happening, so you
-would call it with a timeout_ms of 0, so it returns immediately if
-nothing is pending, or as soon as it services whatever was pending.
-</blockquote>
-<hr>
-<h2>lws_email_init - Initialize a struct lws_email</h2>
-<i>LWS_EXTERN int</i>
-<b>lws_email_init</b>
-(<i>struct lws_email *</i> <b>email</b>,
-<i>uv_loop_t *</i> <b>loop</b>,
-<i>int</i> <b>max_content</b>)
-<h3>Arguments</h3>
-<dl>
-<dt><b>email</b>
-<dd>struct lws_email to init
-<dt><b>loop</b>
-<dd>libuv loop to use
-<dt><b>max_content</b>
-<dd>max email content size
-</dl>
-<h3>Description</h3>
-<blockquote>
-Prepares a struct lws_email for use ending SMTP
-</blockquote>
-<hr>
-<h2>lws_email_check - Request check for new email</h2>
-<i>LWS_EXTERN void</i>
-<b>lws_email_check</b>
-(<i>struct lws_email *</i> <b>email</b>)
-<h3>Arguments</h3>
-<dl>
-<dt><b>email</b>
-<dd>struct lws_email context to check
-</dl>
-<h3>Description</h3>
-<blockquote>
-Schedules a check for new emails in 1s... call this when you have queued an
-email for send.
-</blockquote>
-<hr>
-<h2>lws_email_destroy - stop using the struct lws_email</h2>
-<i>LWS_EXTERN void</i>
-<b>lws_email_destroy</b>
-(<i>struct lws_email *</i> <b>email</b>)
-<h3>Arguments</h3>
-<dl>
-<dt><b>email</b>
-<dd>the struct lws_email context
-</dl>
-<h3>Description</h3>
-<blockquote>
-Stop sending email using <tt><b>email</b></tt> and free allocations
-</blockquote>
-<hr>
-<h2>struct lws_plat_file_ops - Platform-specific file operations</h2>
-<b>struct lws_plat_file_ops</b> {<br>
- <i>lws_filefd_type (*</i><b>open</b>) <i>(struct lws *wsi, const char *filename,unsigned long *filelen, int flags)</i>;<br>
- <i>int (*</i><b>close</b>) <i>(struct lws *wsi, lws_filefd_type fd)</i>;<br>
- <i>unsigned long (*</i><b>seek_cur</b>) <i>(struct lws *wsi, lws_filefd_type fd,long offset_from_cur_pos)</i>;<br>
- <i>int (*</i><b>read</b>) <i>(struct lws *wsi, lws_filefd_type fd, unsigned long *amount,unsigned char *buf, unsigned long len)</i>;<br>
- <i>int (*</i><b>write</b>) <i>(struct lws *wsi, lws_filefd_type fd, unsigned long *amount,unsigned char *buf, unsigned long len)</i>;<br>
-};<br>
-<h3>Members</h3>
-<dl>
-<dt><b>open</b>
-<dd>Open file (always binary access if plat supports it)
-filelen is filled on exit to be the length of the file
-flags should be set to O_RDONLY or O_RDWR
-<dt><b>close</b>
-<dd>Close file
-<dt><b>seek_cur</b>
-<dd>Seek from current position
-<dt><b>read</b>
-<dd>Read fron file *amount is set on exit to amount read
-<dt><b>write</b>
-<dd>Write to file *amount is set on exit as amount written
-</dl>
-<h3>Description</h3>
-<blockquote>
-<p>
-These provide platform-agnostic ways to deal with filesystem access in the
-library and in the user code.
-</blockquote>
-<hr>
-<h2>lws_callback_function - User server actions</h2>
-<i>typedef int</i>
-<b>lws_callback_function</b>
-(<i>struct lws *</i> <b>wsi</b>,
-<i>enum lws_callback_reasons</i> <b>reason</b>,
-<i>void *</i> <b>user</b>,
-<i>void *</i> <b>in</b>,
-<i>size_t</i> <b>len</b>)
-<h3>Arguments</h3>
-<dl>
-<dt><b>wsi</b>
-<dd>Opaque websocket instance pointer
-<dt><b>reason</b>
-<dd>The reason for the call
-<dt><b>user</b>
-<dd>Pointer to per-session user data allocated by library
-<dt><b>in</b>
-<dd>Pointer used for some callback reasons
-<dt><b>len</b>
-<dd>Length set for some callback reasons
-</dl>
-<h3>Description</h3>
-<blockquote>
-This callback is the way the user controls what is served. All the
-protocol detail is hidden and handled by the library.
-<p>
-For each connection / session there is user data allocated that is
-pointed to by "user". You set the size of this user data area when
-the library is initialized with lws_create_server.
-<p>
-You get an opportunity to initialize user data when called back with
-LWS_CALLBACK_ESTABLISHED reason.
-</blockquote>
-<h3>LWS_CALLBACK_ESTABLISHED</h3>
-<blockquote>
-after the server completes a handshake with
-an incoming client. If you built the library
-with ssl support, <tt><b>in</b></tt> is a pointer to the
-ssl struct associated with the connection or
-NULL.
-</blockquote>
-<h3>LWS_CALLBACK_CLIENT_CONNECTION_ERROR</h3>
-<blockquote>
-the request client connection has
-been unable to complete a handshake with the remote server. If
-in is non-NULL, you can find an error string of length len where
-it points to.
-</blockquote>
-<h3>LWS_CALLBACK_CLIENT_FILTER_PRE_ESTABLISH</h3>
-<blockquote>
-this is the last chance for the
-client user code to examine the http headers
-and decide to reject the connection. If the
-content in the headers is interesting to the
-client (url, etc) it needs to copy it out at
-this point since it will be destroyed before
-the CLIENT_ESTABLISHED call
-</blockquote>
-<h3>LWS_CALLBACK_CLIENT_ESTABLISHED</h3>
-<blockquote>
-after your client connection completed
-a handshake with the remote server
-</blockquote>
-<h3>LWS_CALLBACK_CLOSED</h3>
-<blockquote>
-when the websocket session ends
-</blockquote>
-<h3>LWS_CALLBACK_CLOSED_HTTP</h3>
-<blockquote>
-when a HTTP (non-websocket) session ends
-</blockquote>
-<h3>LWS_CALLBACK_RECEIVE</h3>
-<blockquote>
-data has appeared for this server endpoint from a
-remote client, it can be found at *in and is
-len bytes long
-</blockquote>
-<h3>LWS_CALLBACK_CLIENT_RECEIVE_PONG</h3>
-<blockquote>
-if you elected to see PONG packets,
-they appear with this callback reason. PONG
-packets only exist in 04+ protocol
-</blockquote>
-<h3>LWS_CALLBACK_CLIENT_RECEIVE</h3>
-<blockquote>
-data has appeared from the server for the
-client connection, it can be found at *in and
-is len bytes long
-</blockquote>
-<h3>LWS_CALLBACK_HTTP</h3>
-<blockquote>
-an http request has come from a client that is not
-asking to upgrade the connection to a websocket
-one. This is a chance to serve http content,
-for example, to send a script to the client
-which will then open the websockets connection.
-<tt><b>in</b></tt> points to the URI path requested and
-<b>lws_serve_http_file</b> makes it very
-simple to send back a file to the client.
-Normally after sending the file you are done
-with the http connection, since the rest of the
-activity will come by websockets from the script
-that was delivered by http, so you will want to
-return 1; to close and free up the connection.
-That's important because it uses a slot in the
-total number of client connections allowed set
-by MAX_CLIENTS.
-</blockquote>
-<h3>LWS_CALLBACK_HTTP_BODY</h3>
-<blockquote>
-the next <tt><b>len</b></tt> bytes data from the http
-request body HTTP connection is now available in <tt><b>in</b></tt>.
-</blockquote>
-<h3>LWS_CALLBACK_HTTP_BODY_COMPLETION</h3>
-<blockquote>
-the expected amount of http request
-body has been delivered
-</blockquote>
-<h3>LWS_CALLBACK_HTTP_WRITEABLE</h3>
-<blockquote>
-you can write more down the http protocol
-link now.
-</blockquote>
-<h3>LWS_CALLBACK_HTTP_FILE_COMPLETION</h3>
-<blockquote>
-a file requested to be send down
-http link has completed.
-</blockquote>
-<h3>LWS_CALLBACK_SERVER_WRITEABLE</h3>
-<blockquote>
-If you call
-<b>lws_callback_on_writable</b> on a connection, you will
-get one of these callbacks coming when the connection socket
-is able to accept another write packet without blocking.
-If it already was able to take another packet without blocking,
-you'll get this callback at the next call to the service loop
-function. Notice that CLIENTs get LWS_CALLBACK_CLIENT_WRITEABLE
-and servers get LWS_CALLBACK_SERVER_WRITEABLE.
-</blockquote>
-<h3>LWS_CALLBACK_FILTER_NETWORK_CONNECTION</h3>
-<blockquote>
-called when a client connects to
-the server at network level; the connection is accepted but then
-passed to this callback to decide whether to hang up immediately
-or not, based on the client IP. <tt><b>in</b></tt> contains the connection
-socket's descriptor. Since the client connection information is
-not available yet, <tt><b>wsi</b></tt> still pointing to the main server socket.
-Return non-zero to terminate the connection before sending or
-receiving anything. Because this happens immediately after the
-network connection from the client, there's no websocket protocol
-selected yet so this callback is issued only to protocol 0.
-</blockquote>
-<h3>LWS_CALLBACK_SERVER_NEW_CLIENT_INSTANTIATED</h3>
-<blockquote>
-A new client just had
-been connected, accepted, and instantiated into the pool. This
-callback allows setting any relevant property to it. Because this
-happens immediately after the instantiation of a new client,
-there's no websocket protocol selected yet so this callback is
-issued only to protocol 0. Only <tt><b>wsi</b></tt> is defined, pointing to the
-new client, and the return value is ignored.
-</blockquote>
-<h3>LWS_CALLBACK_FILTER_HTTP_CONNECTION</h3>
-<blockquote>
-called when the request has
-been received and parsed from the client, but the response is
-not sent yet. Return non-zero to disallow the connection.
-<tt><b>user</b></tt> is a pointer to the connection user space allocation,
-<tt><b>in</b></tt> is the URI, eg, "/"
-In your handler you can use the public APIs
-<b>lws_hdr_total_length</b> / <b>lws_hdr_copy</b> to access all of the
-headers using the header enums lws_token_indexes from
-libwebsockets.h to check for and read the supported header
-presence and content before deciding to allow the http
-connection to proceed or to kill the connection.
-</blockquote>
-<h3>LWS_CALLBACK_FILTER_PROTOCOL_CONNECTION</h3>
-<blockquote>
-called when the handshake has
-been received and parsed from the client, but the response is
-not sent yet. Return non-zero to disallow the connection.
-<tt><b>user</b></tt> is a pointer to the connection user space allocation,
-<tt><b>in</b></tt> is the requested protocol name
-In your handler you can use the public APIs
-<b>lws_hdr_total_length</b> / <b>lws_hdr_copy</b> to access all of the
-headers using the header enums lws_token_indexes from
-libwebsockets.h to check for and read the supported header
-presence and content before deciding to allow the handshake
-to proceed or to kill the connection.
-</blockquote>
-<h3>LWS_CALLBACK_OPENSSL_LOAD_EXTRA_CLIENT_VERIFY_CERTS</h3>
-<blockquote>
-if configured for
-including OpenSSL support, this callback allows your user code
-to perform extra <b>SSL_CTX_load_verify_locations</b> or similar
-calls to direct OpenSSL where to find certificates the client
-can use to confirm the remote server identity. <tt><b>user</b></tt> is the
-OpenSSL SSL_CTX*
-</blockquote>
-<h3>LWS_CALLBACK_OPENSSL_LOAD_EXTRA_SERVER_VERIFY_CERTS</h3>
-<blockquote>
-if configured for
-including OpenSSL support, this callback allows your user code
-to load extra certifcates into the server which allow it to
-verify the validity of certificates returned by clients. <tt><b>user</b></tt>
-is the server's OpenSSL SSL_CTX*
-</blockquote>
-<h3>LWS_CALLBACK_OPENSSL_CONTEXT_REQUIRES_PRIVATE_KEY</h3>
-<blockquote>
-if configured for
-including OpenSSL support but no private key file has been
-specified (ssl_private_key_filepath is NULL), this is called to
-allow the user to set the private key directly via libopenssl
-and perform further operations if required; this might be useful
-in situations where the private key is not directly accessible
-by the OS, for example if it is stored on a smartcard
-<tt><b>user</b></tt> is the server's OpenSSL SSL_CTX*
-</blockquote>
-<h3>LWS_CALLBACK_OPENSSL_PERFORM_CLIENT_CERT_VERIFICATION</h3>
-<blockquote>
-if the
-libwebsockets context was created with the option
-LWS_SERVER_OPTION_REQUIRE_VALID_OPENSSL_CLIENT_CERT, then this
-callback is generated during OpenSSL verification of the cert
-sent from the client. It is sent to protocol[0] callback as
-no protocol has been negotiated on the connection yet.
-Notice that the libwebsockets context and wsi are both NULL
-during this callback. See
-</blockquote>
-<h3>http</h3>
-<blockquote>
-//www.openssl.org/docs/ssl/SSL_CTX_set_verify.html
-to understand more detail about the OpenSSL callback that
-generates this libwebsockets callback and the meanings of the
-arguments passed. In this callback, <tt><b>user</b></tt> is the x509_ctx,
-<tt><b>in</b></tt> is the ssl pointer and <tt><b>len</b></tt> is preverify_ok
-Notice that this callback maintains libwebsocket return
-conventions, return 0 to mean the cert is OK or 1 to fail it.
-This also means that if you don't handle this callback then
-the default callback action of returning 0 allows the client
-certificates.
-</blockquote>
-<h3>LWS_CALLBACK_CLIENT_APPEND_HANDSHAKE_HEADER</h3>
-<blockquote>
-this callback happens
-when a client handshake is being compiled. <tt><b>user</b></tt> is NULL,
-<tt><b>in</b></tt> is a char **, it's pointing to a char * which holds the
-next location in the header buffer where you can add
-headers, and <tt><b>len</b></tt> is the remaining space in the header buffer,
-which is typically some hundreds of bytes. So, to add a canned
-cookie, your handler code might look similar to:
-<p>
-char **p = (char **)in;
-<p>
-if (len < 100)
-return 1;
-<p>
-*p += sprintf(*p, "Cookie: a=b\x0d\x0a");
-<p>
-return 0;
-<p>
-Notice if you add anything, you just have to take care about
-the CRLF on the line you added. Obviously this callback is
-optional, if you don't handle it everything is fine.
-<p>
-Notice the callback is coming to protocols[0] all the time,
-because there is no specific protocol handshook yet.
-</blockquote>
-<h3>LWS_CALLBACK_CONFIRM_EXTENSION_OKAY</h3>
-<blockquote>
-When the server handshake code
-sees that it does support a requested extension, before
-accepting the extension by additing to the list sent back to
-the client it gives this callback just to check that it's okay
-to use that extension. It calls back to the requested protocol
-and with <tt><b>in</b></tt> being the extension name, <tt><b>len</b></tt> is 0 and <tt><b>user</b></tt> is
-valid. Note though at this time the ESTABLISHED callback hasn't
-happened yet so if you initialize <tt><b>user</b></tt> content there, <tt><b>user</b></tt>
-content during this callback might not be useful for anything.
-Notice this callback comes to protocols[0].
-</blockquote>
-<h3>LWS_CALLBACK_CLIENT_CONFIRM_EXTENSION_SUPPORTED</h3>
-<blockquote>
-When a client
-connection is being prepared to start a handshake to a server,
-each supported extension is checked with protocols[0] callback
-with this reason, giving the user code a chance to suppress the
-claim to support that extension by returning non-zero. If
-unhandled, by default 0 will be returned and the extension
-support included in the header to the server. Notice this
-callback comes to protocols[0].
-</blockquote>
-<h3>LWS_CALLBACK_PROTOCOL_INIT</h3>
-<blockquote>
-One-time call per protocol so it can
-do initial setup / allocations etc
-</blockquote>
-<h3>LWS_CALLBACK_PROTOCOL_DESTROY</h3>
-<blockquote>
-One-time call per protocol indicating
-this protocol won't get used at all after this callback, the
-context is getting destroyed. Take the opportunity to
-deallocate everything that was allocated by the protocol.
-</blockquote>
-<h3>LWS_CALLBACK_WSI_CREATE</h3>
-<blockquote>
-outermost (earliest) wsi create notification
-</blockquote>
-<h3>LWS_CALLBACK_WSI_DESTROY</h3>
-<blockquote>
-outermost (latest) wsi destroy notification
-<p>
-The next five reasons are optional and only need taking care of if you
-will be integrating libwebsockets sockets into an external polling
-array.
-<p>
-For these calls, <tt><b>in</b></tt> points to a struct lws_pollargs that
-contains <tt><b>fd</b></tt>, <tt><b>events</b></tt> and <tt><b>prev_events</b></tt> members
-</blockquote>
-<h3>LWS_CALLBACK_ADD_POLL_FD</h3>
-<blockquote>
-libwebsocket deals with its <b>poll</b> loop
-internally, but in the case you are integrating with another
-server you will need to have libwebsocket sockets share a
-polling array with the other server. This and the other
-POLL_FD related callbacks let you put your specialized
-poll array interface code in the callback for protocol 0, the
-first protocol you support, usually the HTTP protocol in the
-serving case.
-This callback happens when a socket needs to be
-</blockquote>
-<h3>added to the polling loop</h3>
-<blockquote>
-<tt><b>in</b></tt> points to a struct
-lws_pollargs; the <tt><b>fd</b></tt> member of the struct is the file
-descriptor, and <tt><b>events</b></tt> contains the active events.
-<p>
-If you are using the internal polling loop (the "service"
-callback), you can just ignore these callbacks.
-</blockquote>
-<h3>LWS_CALLBACK_DEL_POLL_FD</h3>
-<blockquote>
-This callback happens when a socket descriptor
-needs to be removed from an external polling array. <tt><b>in</b></tt> is
-again the struct lws_pollargs containing the <tt><b>fd</b></tt> member
-to be removed. If you are using the internal polling
-loop, you can just ignore it.
-</blockquote>
-<h3>LWS_CALLBACK_CHANGE_MODE_POLL_FD</h3>
-<blockquote>
-This callback happens when
-libwebsockets wants to modify the events for a connectiion.
-<tt><b>in</b></tt> is the struct lws_pollargs with the <tt><b>fd</b></tt> to change.
-The new event mask is in <tt><b>events</b></tt> member and the old mask is in
-the <tt><b>prev_events</b></tt> member.
-If you are using the internal polling loop, you can just ignore
-it.
-</blockquote>
-<h3>LWS_CALLBACK_UNLOCK_POLL</h3>
-<blockquote>
-These allow the external poll changes driven
-by libwebsockets to participate in an external thread locking
-scheme around the changes, so the whole thing is threadsafe.
-These are called around three activities in the library,
-- inserting a new wsi in the wsi / fd table (len=1)
-- deleting a wsi from the wsi / fd table (len=1)
-- changing a wsi's POLLIN/OUT state (len=0)
-Locking and unlocking external synchronization objects when
-len == 1 allows external threads to be synchronized against
-wsi lifecycle changes if it acquires the same lock for the
-duration of wsi dereference from the other thread context.
-</blockquote>
-<h3>LWS_CALLBACK_WS_PEER_INITIATED_CLOSE</h3>
-<blockquote>
-The peer has sent an unsolicited Close WS packet. <tt><b>in</b></tt> and
-<tt><b>len</b></tt> are the optional close code (first 2 bytes, network
-order) and the optional additional information which is not
-defined in the standard, and may be a string or non-human-
-readble data.
-If you return 0 lws will echo the close and then close the
-connection. If you return nonzero lws will just close the
-connection.
-</blockquote>
-<hr>
-<h2>lws_extension_callback_function - Hooks to allow extensions to operate</h2>
-<i>typedef int</i>
-<b>lws_extension_callback_function</b>
-(<i>struct lws_context *</i> <b>context</b>,
-<i>const struct lws_extension *</i> <b>ext</b>,
-<i>struct lws *</i> <b>wsi</b>,
-<i>enum lws_extension_callback_reasons</i> <b>reason</b>,
-<i>void *</i> <b>user</b>,
-<i>void *</i> <b>in</b>,
-<i>size_t</i> <b>len</b>)
-<h3>Arguments</h3>
-<dl>
-<dt><b>context</b>
-<dd>Websockets context
-<dt><b>ext</b>
-<dd>This extension
-<dt><b>wsi</b>
-<dd>Opaque websocket instance pointer
-<dt><b>reason</b>
-<dd>The reason for the call
-<dt><b>user</b>
-<dd>Pointer to ptr to per-session user data allocated by library
-<dt><b>in</b>
-<dd>Pointer used for some callback reasons
-<dt><b>len</b>
-<dd>Length set for some callback reasons
-</dl>
-<h3>Description</h3>
-<blockquote>
-Each extension that is active on a particular connection receives
-callbacks during the connection lifetime to allow the extension to
-operate on websocket data and manage itself.
-<p>
-Libwebsockets takes care of allocating and freeing "user" memory for
-each active extension on each connection. That is what is pointed to
-by the <tt><b>user</b></tt> parameter.
-</blockquote>
-<h3>LWS_EXT_CB_CONSTRUCT</h3>
-<blockquote>
-called when the server has decided to
-select this extension from the list provided by the client,
-just before the server will send back the handshake accepting
-the connection with this extension active. This gives the
-extension a chance to initialize its connection context found
-in <tt><b>user</b></tt>.
-</blockquote>
-<h3>LWS_EXT_CB_CLIENT_CONSTRUCT</h3>
-<blockquote>
-same as LWS_EXT_CB_CONSTRUCT
-but called when client is instantiating this extension. Some
-extensions will work the same on client and server side and then
-you can just merge handlers for both CONSTRUCTS.
-</blockquote>
-<h3>LWS_EXT_CB_DESTROY</h3>
-<blockquote>
-called when the connection the extension was
-being used on is about to be closed and deallocated. It's the
-last chance for the extension to deallocate anything it has
-allocated in the user data (pointed to by <tt><b>user</b></tt>) before the
-user data is deleted. This same callback is used whether you
-are in client or server instantiation context.
-</blockquote>
-<h3>LWS_EXT_CB_PACKET_RX_PREPARSE</h3>
-<blockquote>
-when this extension was active on
-a connection, and a packet of data arrived at the connection,
-it is passed to this callback to give the extension a chance to
-change the data, eg, decompress it. <tt><b>user</b></tt> is pointing to the
-extension's private connection context data, <tt><b>in</b></tt> is pointing
-to an lws_tokens struct, it consists of a char * pointer called
-token, and an int called token_len. At entry, these are
-set to point to the received buffer and set to the content
-length. If the extension will grow the content, it should use
-a new buffer allocated in its private user context data and
-set the pointed-to lws_tokens members to point to its buffer.
-</blockquote>
-<h3>LWS_EXT_CB_PACKET_TX_PRESEND</h3>
-<blockquote>
-this works the same way as
-LWS_EXT_CB_PACKET_RX_PREPARSE above, except it gives the
-extension a chance to change websocket data just before it will
-be sent out. Using the same lws_token pointer scheme in <tt><b>in</b></tt>,
-the extension can change the buffer and the length to be
-transmitted how it likes. Again if it wants to grow the
-buffer safely, it should copy the data into its own buffer and
-set the lws_tokens token pointer to it.
-</blockquote>
-<hr>
-<h2>struct lws_protocols - List of protocols and handlers server supports.</h2>
-<b>struct lws_protocols</b> {<br>
- <i>const char *</i> <b>name</b>;<br>
- <i>lws_callback_function *</i> <b>callback</b>;<br>
- <i>size_t</i> <b>per_session_data_size</b>;<br>
- <i>size_t</i> <b>rx_buffer_size</b>;<br>
- <i>unsigned int</i> <b>id</b>;<br>
- <i>void *</i> <b>user</b>;<br>
-};<br>
-<h3>Members</h3>
-<dl>
-<dt><b>name</b>
-<dd>Protocol name that must match the one given in the client
-Javascript new WebSocket(url, 'protocol') name.
-<dt><b>callback</b>
-<dd>The service callback used for this protocol. It allows the
-service action for an entire protocol to be encapsulated in
-the protocol-specific callback
-<dt><b>per_session_data_size</b>
-<dd>Each new connection using this protocol gets
-this much memory allocated on connection establishment and
-freed on connection takedown. A pointer to this per-connection
-allocation is passed into the callback in the 'user' parameter
-<dt><b>rx_buffer_size</b>
-<dd>if you want atomic frames delivered to the callback, you
-should set this to the size of the biggest legal frame that
-you support. If the frame size is exceeded, there is no
-error, but the buffer will spill to the user callback when
-full, which you can detect by using
-<b>lws_remaining_packet_payload</b>. Notice that you
-just talk about frame size here, the LWS_PRE
-and post-padding are automatically also allocated on top.
-<dt><b>id</b>
-<dd>ignored by lws, but useful to contain user information bound
-to the selected protocol. For example if this protocol was
-called "myprotocol-v2", you might set id to 2, and the user
-code that acts differently according to the version can do so by
-switch (wsi->protocol->id), user code might use some bits as
-capability flags based on selected protocol version, etc.
-<dt><b>user</b>
-<dd>User provided context data at the protocol level.
-Accessible via lws_get_protocol(wsi)->user
-This should not be confused with wsi->user, it is not the same.
-The library completely ignores any value in here.
-</dl>
-<h3>Description</h3>
-<blockquote>
-This structure represents one protocol supported by the server. An
-array of these structures is passed to <b>lws_create_server</b>
-allows as many protocols as you like to be handled by one server.
-<p>
-The first protocol given has its callback used for user callbacks when
-there is no agreed protocol name, that's true during HTTP part of the
-</blockquote>
-<h3>connection and true if the client did not send a Protocol</h3>
-<blockquote>
-header.
-</blockquote>
-<hr>
-<h2>struct lws_ext_options - Option arguments to the extension. These are used in the negotiation at ws upgrade time. The helper function lws_ext_parse_options() uses these to generate callbacks</h2>
-<b>struct lws_ext_options</b> {<br>
- <i>const char *</i> <b>name</b>;<br>
- <i>enum lws_ext_options_types</i> <b>type</b>;<br>
-};<br>
-<h3>Members</h3>
-<dl>
-<dt><b>name</b>
-<dd>Option name, eg, "server_no_context_takeover"
-<dt><b>type</b>
-<dd>What kind of args the option can take
-</dl>
-<hr>
-<h2>struct lws_extension - An extension we know how to cope with</h2>
-<b>struct lws_extension</b> {<br>
- <i>const char *</i> <b>name</b>;<br>
- <i>lws_extension_callback_function *</i> <b>callback</b>;<br>
- <i>const char *</i> <b>client_offer</b>;<br>
-};<br>
-<h3>Members</h3>
-<dl>
-<dt><b>name</b>
-<dd>Formal extension name, eg, "permessage-deflate"
-<dt><b>callback</b>
-<dd>Service callback
-<dt><b>client_offer</b>
-<dd>String containing exts and options client offers
-</dl>
-<hr>
-<h2>struct lws_context_creation_info - parameters to create context with</h2>
-<b>struct lws_context_creation_info</b> {<br>
- <i>int</i> <b>port</b>;<br>
- <i>const char *</i> <b>iface</b>;<br>
- <i>const struct lws_protocols *</i> <b>protocols</b>;<br>
- <i>const struct lws_extension *</i> <b>extensions</b>;<br>
- <i>const struct lws_token_limits *</i> <b>token_limits</b>;<br>
- <i>const char *</i> <b>ssl_cert_filepath</b>;<br>
- <i>const char *</i> <b>ssl_private_key_filepath</b>;<br>
- <i>const char *</i> <b>ssl_ca_filepath</b>;<br>
- <i>const char *</i> <b>ssl_cipher_list</b>;<br>
- <i>const char *</i> <b>http_proxy_address</b>;<br>
- <i>unsigned int</i> <b>http_proxy_port</b>;<br>
- <i>int</i> <b>gid</b>;<br>
- <i>int</i> <b>uid</b>;<br>
- <i>unsigned int</i> <b>options</b>;<br>
- <i>void *</i> <b>user</b>;<br>
- <i>int</i> <b>ka_time</b>;<br>
- <i>int</i> <b>ka_probes</b>;<br>
- <i>int</i> <b>ka_interval</b>;<br>
-#ifdef LWS_OPENSSL_SUPPORT<br>
- <i>void *</i> <b>provided_client_ssl_ctx</b>;<br>
-#else<br>
- <i>void *</i> <b>provided_client_ssl_ctx</b>;<br>
-#endif<br>
- <i>short</i> <b>max_http_header_data</b>;<br>
- <i>short</i> <b>max_http_header_pool</b>;<br>
- <i>unsigned int</i> <b>count_threads</b>;<br>
- <i>unsigned int</i> <b>fd_limit_per_thread</b>;<br>
- <i>unsigned int</i> <b>timeout_secs</b>;<br>
- <i>const char *</i> <b>ecdh_curve</b>;<br>
- <i>const char *</i> <b>vhost_name</b>;<br>
- <i>const char *const *</i> <b>plugin_dirs</b>;<br>
- <i>const struct lws_protocol_vhost_options *</i> <b>pvo</b>;<br>
- <i>int</i> <b>keepalive_timeout</b>;<br>
- <i>const char *</i> <b>log_filepath</b>;<br>
- <i>const struct lws_http_mount *</i> <b>mounts</b>;<br>
- <i>const char *</i> <b>server_string</b>;<br>
- <i>unsigned int</i> <b>pt_serv_buf_size</b>;<br>
- <i>unsigned int</i> <b>max_http_header_data2</b>;<br>
- <i>long</i> <b>ssl_options_set</b>;<br>
- <i>long</i> <b>ssl_options_clear</b>;<br>
-};<br>
-<h3>Members</h3>
-<dl>
-<dt><b>port</b>
-<dd>VHOST: Port to listen on... you can use CONTEXT_PORT_NO_LISTEN to
-suppress listening on any port, that's what you want if you are
-not running a websocket server at all but just using it as a
-client
-<dt><b>iface</b>
-<dd>VHOST: NULL to bind the listen socket to all interfaces, or the
-interface name, eg, "eth2"
-If options specifies LWS_SERVER_OPTION_UNIX_SOCK, this member is
-the pathname of a UNIX domain socket. you can use the UNIX domain
-sockets in abstract namespace, by prepending an @ symbole to the
-socket name.
-<dt><b>protocols</b>
-<dd>VHOST: Array of structures listing supported protocols and a protocol-
-specific callback for each one. The list is ended with an
-entry that has a NULL callback pointer.
-It's not const because we write the owning_server member
-<dt><b>extensions</b>
-<dd>VHOST: NULL or array of lws_extension structs listing the
-extensions this context supports. If you configured with
---without-extensions, you should give NULL here.
-<dt><b>token_limits</b>
-<dd>CONTEXT: NULL or struct lws_token_limits pointer which is initialized
-with a token length limit for each possible WSI_TOKEN_***
-<dt><b>ssl_cert_filepath</b>
-<dd>VHOST: If libwebsockets was compiled to use ssl, and you want
-to listen using SSL, set to the filepath to fetch the
-server cert from, otherwise NULL for unencrypted
-<dt><b>ssl_private_key_filepath</b>
-<dd>VHOST: filepath to private key if wanting SSL mode;
-if this is set to NULL but sll_cert_filepath is set, the
-OPENSSL_CONTEXT_REQUIRES_PRIVATE_KEY callback is called
-to allow setting of the private key directly via openSSL
-library calls
-<dt><b>ssl_ca_filepath</b>
-<dd>VHOST: CA certificate filepath or NULL
-<dt><b>ssl_cipher_list</b>
-<dd>VHOST: List of valid ciphers to use (eg,
-"RC4-MD5:RC4-SHA:AES128-SHA:AES256-SHA:HIGH:!DSS:!aNULL"
-or you can leave it as NULL to get "DEFAULT"
-<dt><b>http_proxy_address</b>
-<dd>VHOST: If non-NULL, attempts to proxy via the given address.
-If proxy auth is required, use format
-"username:password<tt><b>server</b></tt>:port"
-<dt><b>http_proxy_port</b>
-<dd>VHOST: If http_proxy_address was non-NULL, uses this port at
-the address
-<dt><b>gid</b>
-<dd>CONTEXT: group id to change to after setting listen socket, or -1.
-<dt><b>uid</b>
-<dd>CONTEXT: user id to change to after setting listen socket, or -1.
-<dt><b>options</b>
-<dd>VHOST + CONTEXT: 0, or LWS_SERVER_OPTION_... bitfields
-<dt><b>user</b>
-<dd>CONTEXT: optional user pointer that can be recovered via the context
-pointer using lws_context_user
-<dt><b>ka_time</b>
-<dd>CONTEXT: 0 for no keepalive, otherwise apply this keepalive timeout to
-all libwebsocket sockets, client or server
-<dt><b>ka_probes</b>
-<dd>CONTEXT: if ka_time was nonzero, after the timeout expires how many
-times to try to get a response from the peer before giving up
-and killing the connection
-<dt><b>ka_interval</b>
-<dd>CONTEXT: if ka_time was nonzero, how long to wait before each ka_probes
-attempt
-<dt><b>provided_client_ssl_ctx</b>
-<dd>CONTEXT: If non-null, swap out libwebsockets ssl
-implementation for the one provided by provided_ssl_ctx.
-Libwebsockets no longer is responsible for freeing the context
-if this option is selected.
-<dt><b>provided_client_ssl_ctx</b>
-<dd>CONTEXT: If non-null, swap out libwebsockets ssl
-implementation for the one provided by provided_ssl_ctx.
-Libwebsockets no longer is responsible for freeing the context
-if this option is selected.
-<dt><b>max_http_header_data</b>
-<dd>CONTEXT: The max amount of header payload that can be handled
-in an http request (unrecognized header payload is dropped)
-<dt><b>max_http_header_pool</b>
-<dd>CONTEXT: The max number of connections with http headers that
-can be processed simultaneously (the corresponding memory is
-allocated for the lifetime of the context). If the pool is
-busy new incoming connections must wait for accept until one
-becomes free.
-<dt><b>count_threads</b>
-<dd>CONTEXT: how many contexts to create in an array, 0 = 1
-<dt><b>fd_limit_per_thread</b>
-<dd>CONTEXT: nonzero means restrict each service thread to this
-many fds, 0 means the default which is divide the process fd
-limit by the number of threads.
-<dt><b>timeout_secs</b>
-<dd>VHOST: various processes involving network roundtrips in the
-library are protected from hanging forever by timeouts. If
-nonzero, this member lets you set the timeout used in seconds.
-Otherwise a default timeout is used.
-<dt><b>ecdh_curve</b>
-<dd>VHOST: if NULL, defaults to initializing server with "prime256v1"
-<dt><b>vhost_name</b>
-<dd>VHOST: name of vhost, must match external DNS name used to
-access the site, like "warmcat.com" as it's used to match
-<dt><b>plugin_dirs</b>
-<dd>CONTEXT: NULL, or NULL-terminated array of directories to
-scan for lws protocol plugins at context creation time
-<dt><b>pvo</b>
-<dd>VHOST: pointer to optional linked list of per-vhost
-options made accessible to protocols
-<dt><b>keepalive_timeout</b>
-<dd>VHOST: (default = 0 = 60s) seconds to allow remote
-client to hold on to an idle HTTP/1.1 connection
-<dt><b>log_filepath</b>
-<dd>VHOST: filepath to append logs to... this is opened before
-any dropping of initial privileges
-<dt><b>mounts</b>
-<dd>VHOST: optional linked list of mounts for this vhost
-<dt><b>server_string</b>
-<dd>CONTEXT: string used in HTTP headers to identify server
-software, if NULL, "libwebsockets".
-<dt><b>pt_serv_buf_size</b>
-<dd>CONTEXT: 0 = default of 4096. This buffer is used by
-various service related features including file serving, it
-defines the max chunk of file that can be sent at once.
-At the risk of lws having to buffer failed large sends, it
-can be increased to, eg, 128KiB to improve throughput.
-<dt><b>max_http_header_data2</b>
-<dd>if <tt><b>max_http_header_data</b></tt> is 0 and this
-is nonzero, this will be used in place of the default. It's
-like this for compatibility with the original short version,
-this is unsigned int length.
-<dt><b>ssl_options_set</b>
-<dd>VHOST: Any bits set here will be set as SSL options
-<dt><b>ssl_options_clear</b>
-<dd>VHOST: Any bits set here will be cleared as SSL options
-</dl>
-<h3>Description</h3>
-<blockquote>
-<p>
-This is also used to create vhosts.... if LWS_SERVER_OPTION_EXPLICIT_VHOSTS
-is not given, then for backwards compatibility one vhost is created at
-context-creation time using the info from this struct.
-<p>
-If LWS_SERVER_OPTION_EXPLICIT_VHOSTS is given, then no vhosts are created
-at the same time as the context, they are expected to be created afterwards.
-</blockquote>
-<h3>Host</h3>
-<blockquote>
-header and / or SNI name for SSL.
-</blockquote>
-<hr>
-<h2>struct lws_client_connect_info - parameters to connect with when using lws_client_connect_via_info()</h2>
-<b>struct lws_client_connect_info</b> {<br>
- <i>struct lws_context *</i> <b>context</b>;<br>
- <i>const char *</i> <b>address</b>;<br>
- <i>int</i> <b>port</b>;<br>
- <i>int</i> <b>ssl_connection</b>;<br>
- <i>const char *</i> <b>path</b>;<br>
- <i>const char *</i> <b>host</b>;<br>
- <i>const char *</i> <b>origin</b>;<br>
- <i>const char *</i> <b>protocol</b>;<br>
- <i>int</i> <b>ietf_version_or_minus_one</b>;<br>
- <i>void *</i> <b>userdata</b>;<br>
- <i>const struct lws_extension *</i> <b>client_exts</b>;<br>
- <i>const char *</i> <b>method</b>;<br>
- <i>struct lws *</i> <b>parent_wsi</b>;<br>
- <i>const char *</i> <b>uri_replace_from</b>;<br>
- <i>const char *</i> <b>uri_replace_to</b>;<br>
- <i>struct lws_vhost *</i> <b>vhost</b>;<br>
-};<br>
-<h3>Members</h3>
-<dl>
-<dt><b>context</b>
-<dd>lws context to create connection in
-<dt><b>address</b>
-<dd>remote address to connect to
-<dt><b>port</b>
-<dd>remote port to connect to
-<dt><b>ssl_connection</b>
-<dd>nonzero for ssl
-<dt><b>path</b>
-<dd>uri path
-<dt><b>host</b>
-<dd>content of host header
-<dt><b>origin</b>
-<dd>content of origin header
-<dt><b>protocol</b>
-<dd>list of ws protocols
-<dt><b>ietf_version_or_minus_one</b>
-<dd>currently leave at 0 or -1
-<dt><b>userdata</b>
-<dd>if non-NULL, use this as wsi user_data instead of malloc it
-<dt><b>client_exts</b>
-<dd>array of extensions that may be used on connection
-<dt><b>method</b>
-<dd>if non-NULL, do this http method instead of ws[s] upgrade.
-use "GET" to be a simple http client connection
-<dt><b>parent_wsi</b>
-<dd>if another wsi is responsible for this connection, give it here.
-this is used to make sure if the parent closes so do any
-child connections first.
-<dt><b>uri_replace_from</b>
-<dd>if non-NULL, when this string is found in URIs in
-text/html content-encoding, it's replaced with <tt><b>uri_replace_to</b></tt>
-<dt><b>uri_replace_to</b>
-<dd>see above
-<dt><b>vhost</b>
-<dd>vhost to bind to (used to determine related SSL_CTX)
-</dl>
-<hr>
-<h2>lws_close_reason - Set reason and aux data to send with Close packet If you are going to return nonzero from the callback requesting the connection to close, you can optionally call this to set the reason the peer will be told if possible.</h2>
-<i>LWS_EXTERN void</i>
-<b>lws_close_reason</b>
-(<i>struct lws *</i> <b>wsi</b>,
-<i>enum lws_close_status</i> <b>status</b>,
-<i>unsigned char *</i> <b>buf</b>,
-<i>size_t</i> <b>len</b>)
-<h3>Arguments</h3>
-<dl>
-<dt><b>wsi</b>
-<dd>The websocket connection to set the close reason on
-<dt><b>status</b>
-<dd>A valid close status from websocket standard
-<dt><b>buf</b>
-<dd>NULL or buffer containing up to 124 bytes of auxiliary data
-<dt><b>len</b>
-<dd>Length of data in <tt><b>buf</b></tt> to send
-</dl>
-<hr>
--- /dev/null
+# Doxyfile 1.8.11
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+DOXYFILE_ENCODING = UTF-8
+PROJECT_NAME = "libwebsockets"
+PROJECT_NUMBER =
+PROJECT_BRIEF = "Lightweight C library for HTML5 websockets"
+PROJECT_LOGO = "./test-server/libwebsockets.org-logo.png"
+OUTPUT_DIRECTORY = "doc"
+CREATE_SUBDIRS = NO
+ALLOW_UNICODE_NAMES = NO
+OUTPUT_LANGUAGE = English
+BRIEF_MEMBER_DESC = YES
+REPEAT_BRIEF = YES
+ABBREVIATE_BRIEF =
+ALWAYS_DETAILED_SEC = NO
+INLINE_INHERITED_MEMB = NO
+FULL_PATH_NAMES = YES
+STRIP_FROM_PATH =
+STRIP_FROM_INC_PATH =
+SHORT_NAMES = NO
+JAVADOC_AUTOBRIEF = NO
+QT_AUTOBRIEF = NO
+MULTILINE_CPP_IS_BRIEF = NO
+INHERIT_DOCS = YES
+SEPARATE_MEMBER_PAGES = NO
+TAB_SIZE = 8
+ALIASES =
+TCL_SUBST =
+OPTIMIZE_OUTPUT_FOR_C = YES
+OPTIMIZE_OUTPUT_JAVA = NO
+OPTIMIZE_FOR_FORTRAN = NO
+OPTIMIZE_OUTPUT_VHDL = NO
+EXTENSION_MAPPING =
+MARKDOWN_SUPPORT = YES
+AUTOLINK_SUPPORT = YES
+BUILTIN_STL_SUPPORT = NO
+CPP_CLI_SUPPORT = NO
+SIP_SUPPORT = NO
+IDL_PROPERTY_SUPPORT = YES
+DISTRIBUTE_GROUP_DOC = NO
+GROUP_NESTED_COMPOUNDS = NO
+SUBGROUPING = YES
+INLINE_GROUPED_CLASSES = NO
+INLINE_SIMPLE_STRUCTS = NO
+TYPEDEF_HIDES_STRUCT = NO
+LOOKUP_CACHE_SIZE = 0
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+EXTRACT_ALL = NO
+EXTRACT_PRIVATE = NO
+EXTRACT_PACKAGE = NO
+EXTRACT_STATIC = NO
+EXTRACT_LOCAL_CLASSES = YES
+EXTRACT_LOCAL_METHODS = NO
+EXTRACT_ANON_NSPACES = NO
+HIDE_UNDOC_MEMBERS = NO
+HIDE_UNDOC_CLASSES = NO
+HIDE_FRIEND_COMPOUNDS = NO
+HIDE_IN_BODY_DOCS = NO
+INTERNAL_DOCS = NO
+CASE_SENSE_NAMES = YES
+HIDE_SCOPE_NAMES = NO
+HIDE_COMPOUND_REFERENCE= NO
+SHOW_INCLUDE_FILES = YES
+SHOW_GROUPED_MEMB_INC = YES
+FORCE_LOCAL_INCLUDES = NO
+INLINE_INFO = YES
+SORT_MEMBER_DOCS = YES
+SORT_BRIEF_DOCS = NO
+SORT_MEMBERS_CTORS_1ST = NO
+SORT_GROUP_NAMES = YES
+SORT_BY_SCOPE_NAME = NO
+STRICT_PROTO_MATCHING = YES
+GENERATE_TODOLIST = YES
+GENERATE_TESTLIST = YES
+GENERATE_BUGLIST = YES
+GENERATE_DEPRECATEDLIST= YES
+ENABLED_SECTIONS =
+MAX_INITIALIZER_LINES = 30
+SHOW_USED_FILES = YES
+SHOW_FILES = YES
+SHOW_NAMESPACES = YES
+FILE_VERSION_FILTER =
+LAYOUT_FILE =
+CITE_BIB_FILES =
+#---------------------------------------------------------------------------
+# Configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+QUIET = NO
+WARNINGS = YES
+WARN_IF_UNDOCUMENTED = NO
+WARN_IF_DOC_ERROR = YES
+WARN_NO_PARAMDOC = NO
+WARN_AS_ERROR = NO
+WARN_FORMAT = "$file:$line: $text"
+WARN_LOGFILE =
+#---------------------------------------------------------------------------
+# Configuration options related to the input files
+#---------------------------------------------------------------------------
+INPUT = lib/libwebsockets.h mainpage.md README.build.md README.lwsws.md README.coding.md README.generic-sessions.md README.test-apps.md
+INPUT_ENCODING = UTF-8
+FILE_PATTERNS = lib/*.c *.md
+RECURSIVE = NO
+EXCLUDE =
+EXCLUDE_SYMLINKS = NO
+EXCLUDE_PATTERNS =
+EXCLUDE_SYMBOLS =
+EXAMPLE_PATH =
+EXAMPLE_PATTERNS =
+EXAMPLE_RECURSIVE = NO
+IMAGE_PATH =
+INPUT_FILTER =
+FILTER_PATTERNS =
+FILTER_SOURCE_FILES = NO
+FILTER_SOURCE_PATTERNS =
+USE_MDFILE_AS_MAINPAGE = mainpage.md
+#---------------------------------------------------------------------------
+# Configuration options related to source browsing
+#---------------------------------------------------------------------------
+SOURCE_BROWSER = NO
+INLINE_SOURCES = YES
+STRIP_CODE_COMMENTS = YES
+REFERENCED_BY_RELATION = NO
+REFERENCES_RELATION = NO
+REFERENCES_LINK_SOURCE = YES
+SOURCE_TOOLTIPS = YES
+USE_HTAGS = NO
+VERBATIM_HEADERS = YES
+#---------------------------------------------------------------------------
+# Configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+ALPHABETICAL_INDEX = YES
+COLS_IN_ALPHA_INDEX = 5
+IGNORE_PREFIX =
+#---------------------------------------------------------------------------
+# Configuration options related to the HTML output
+#---------------------------------------------------------------------------
+GENERATE_HTML = YES
+HTML_OUTPUT = html
+HTML_FILE_EXTENSION = .html
+HTML_HEADER =
+HTML_FOOTER =
+HTML_STYLESHEET =
+HTML_EXTRA_STYLESHEET =
+HTML_EXTRA_FILES =
+HTML_COLORSTYLE_HUE = 220
+HTML_COLORSTYLE_SAT = 100
+HTML_COLORSTYLE_GAMMA = 80
+HTML_TIMESTAMP = NO
+HTML_DYNAMIC_SECTIONS = NO
+HTML_INDEX_NUM_ENTRIES = 100
+GENERATE_DOCSET = NO
+DOCSET_FEEDNAME = "Doxygen generated docs"
+DOCSET_BUNDLE_ID = org.doxygen.Project
+DOCSET_PUBLISHER_ID = org.doxygen.Publisher
+DOCSET_PUBLISHER_NAME = Publisher
+GENERATE_HTMLHELP = NO
+CHM_FILE =
+HHC_LOCATION =
+GENERATE_CHI = NO
+CHM_INDEX_ENCODING =
+BINARY_TOC = NO
+TOC_EXPAND = NO
+GENERATE_QHP = NO
+QCH_FILE =
+QHP_NAMESPACE = org.doxygen.Project
+QHP_VIRTUAL_FOLDER = doc
+QHP_CUST_FILTER_NAME =
+QHP_CUST_FILTER_ATTRS =
+QHP_SECT_FILTER_ATTRS =
+QHG_LOCATION =
+GENERATE_ECLIPSEHELP = NO
+ECLIPSE_DOC_ID = org.doxygen.Project
+DISABLE_INDEX = NO
+GENERATE_TREEVIEW = YES
+ENUM_VALUES_PER_LINE = 4
+TREEVIEW_WIDTH = 250
+EXT_LINKS_IN_WINDOW = NO
+FORMULA_FONTSIZE = 10
+FORMULA_TRANSPARENT = YES
+USE_MATHJAX = NO
+MATHJAX_FORMAT = HTML-CSS
+MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest
+MATHJAX_EXTENSIONS =
+MATHJAX_CODEFILE =
+SEARCHENGINE = NO
+SERVER_BASED_SEARCH = NO
+EXTERNAL_SEARCH = NO
+SEARCHENGINE_URL =
+SEARCHDATA_FILE = searchdata.xml
+EXTERNAL_SEARCH_ID =
+EXTRA_SEARCH_MAPPINGS =
+#---------------------------------------------------------------------------
+# Configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+GENERATE_LATEX = YES
+LATEX_OUTPUT = latex
+LATEX_CMD_NAME = latex
+MAKEINDEX_CMD_NAME = makeindex
+COMPACT_LATEX = NO
+PAPER_TYPE = a4
+EXTRA_PACKAGES =
+LATEX_HEADER =
+LATEX_FOOTER =
+LATEX_EXTRA_STYLESHEET =
+LATEX_EXTRA_FILES =
+PDF_HYPERLINKS = YES
+USE_PDFLATEX = YES
+LATEX_BATCHMODE = NO
+LATEX_HIDE_INDICES = NO
+LATEX_SOURCE_CODE = NO
+LATEX_BIB_STYLE = plain
+LATEX_TIMESTAMP = NO
+#---------------------------------------------------------------------------
+# Configuration options related to the RTF output
+#---------------------------------------------------------------------------
+GENERATE_RTF = NO
+RTF_OUTPUT = rtf
+COMPACT_RTF = NO
+RTF_HYPERLINKS = NO
+RTF_STYLESHEET_FILE =
+RTF_EXTENSIONS_FILE =
+RTF_SOURCE_CODE = NO
+#---------------------------------------------------------------------------
+# Configuration options related to the man page output
+#---------------------------------------------------------------------------
+GENERATE_MAN = NO
+MAN_OUTPUT = man
+MAN_EXTENSION = .3
+MAN_SUBDIR =
+MAN_LINKS = NO
+#---------------------------------------------------------------------------
+# Configuration options related to the XML output
+#---------------------------------------------------------------------------
+GENERATE_XML = NO
+XML_OUTPUT = xml
+XML_PROGRAMLISTING = YES
+#---------------------------------------------------------------------------
+# Configuration options related to the DOCBOOK output
+#---------------------------------------------------------------------------
+GENERATE_DOCBOOK = NO
+DOCBOOK_OUTPUT = docbook
+DOCBOOK_PROGRAMLISTING = NO
+#---------------------------------------------------------------------------
+# Configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+GENERATE_AUTOGEN_DEF = NO
+#---------------------------------------------------------------------------
+# Configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+GENERATE_PERLMOD = NO
+PERLMOD_LATEX = NO
+PERLMOD_PRETTY = YES
+PERLMOD_MAKEVAR_PREFIX =
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor
+#---------------------------------------------------------------------------
+ENABLE_PREPROCESSING = NO
+MACRO_EXPANSION = NO
+EXPAND_ONLY_PREDEF = NO
+SEARCH_INCLUDES = YES
+INCLUDE_PATH =
+INCLUDE_FILE_PATTERNS =
+PREDEFINED =
+EXPAND_AS_DEFINED =
+SKIP_FUNCTION_MACROS = YES
+#---------------------------------------------------------------------------
+# Configuration options related to external references
+#---------------------------------------------------------------------------
+TAGFILES =
+GENERATE_TAGFILE =
+ALLEXTERNALS = NO
+EXTERNAL_GROUPS = YES
+EXTERNAL_PAGES = YES
+PERL_PATH = /usr/bin/perl
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool
+#---------------------------------------------------------------------------
+CLASS_DIAGRAMS = YES
+MSCGEN_PATH =
+DIA_PATH =
+HIDE_UNDOC_RELATIONS = YES
+HAVE_DOT = NO
+DOT_NUM_THREADS = 0
+DOT_FONTNAME = Helvetica
+DOT_FONTSIZE = 10
+DOT_FONTPATH =
+CLASS_GRAPH = YES
+COLLABORATION_GRAPH = YES
+GROUP_GRAPHS = YES
+UML_LOOK = NO
+UML_LIMIT_NUM_FIELDS = 10
+TEMPLATE_RELATIONS = NO
+INCLUDE_GRAPH = YES
+INCLUDED_BY_GRAPH = YES
+CALL_GRAPH = NO
+CALLER_GRAPH = NO
+GRAPHICAL_HIERARCHY = YES
+DIRECTORY_GRAPH = YES
+DOT_IMAGE_FORMAT = png
+INTERACTIVE_SVG = NO
+DOT_PATH =
+DOTFILE_DIRS =
+MSCFILE_DIRS =
+DIAFILE_DIRS =
+PLANTUML_JAR_PATH =
+PLANTUML_INCLUDE_PATH =
+DOT_GRAPH_MAX_NODES = 50
+MAX_DOT_GRAPH_DEPTH = 0
+DOT_TRANSPARENT = NO
+DOT_MULTI_TARGETS = NO
+GENERATE_LEGEND = YES
+DOT_CLEANUP = YES
--- /dev/null
+##Libwebsockets API introduction
+
+Libwebsockets covers a lot of interesting features for people making embedded servers or clients
+
+ - http(s) serving and client operation
+ - ws(s) serving and client operation
+ - http(s) apis for file transfer and upload
+ - http POST form handling (including multipart)
+ - cookie-based sessions
+ - account management (including registration, email verification, lost pw etc)
+ - strong ssl PFS support (A+ on SSLlabs test)
+
+You can browse by api category <a href="modules.html">here</a>.
+++ /dev/null
-#!/usr/bin/perl -w
-
-use strict;
-
-## Copyright (c) 1998 Michael Zucchi, All Rights Reserved ##
-## Copyright (C) 2000, 1 Tim Waugh <twaugh@redhat.com> ##
-## Copyright (C) 2001 Simon Huggins ##
-## Copyright (C) 2005-2009 Randy Dunlap ##
-## ##
-## #define enhancements by Armin Kuster <akuster@mvista.com> ##
-## Copyright (c) 2000 MontaVista Software, Inc. ##
-## ##
-## This software falls under the GNU General Public License. ##
-## Please read the COPYING file for more information ##
-
-# w.o. 03-11-2000: added the '-filelist' option.
-
-# 18/01/2001 - Cleanups
-# Functions prototyped as foo(void) same as foo()
-# Stop eval'ing where we don't need to.
-# -- huggie@earth.li
-
-# 27/06/2001 - Allowed whitespace after initial "/**" and
-# allowed comments before function declarations.
-# -- Christian Kreibich <ck@whoop.org>
-
-# Still to do:
-# - add perldoc documentation
-# - Look more closely at some of the scarier bits :)
-
-# 26/05/2001 - Support for separate source and object trees.
-# Return error code.
-# Keith Owens <kaos@ocs.com.au>
-
-# 23/09/2001 - Added support for typedefs, structs, enums and unions
-# Support for Context section; can be terminated using empty line
-# Small fixes (like spaces vs. \s in regex)
-# -- Tim Jansen <tim@tjansen.de>
-
-
-#
-# This will read a 'c' file and scan for embedded comments in the
-# style of gnome comments (+minor extensions - see below).
-#
-
-# Note: This only supports 'c'.
-
-# usage:
-# kernel-doc [ -docbook | -html | -text | -man ] [ -no-doc-sections ]
-# [ -function funcname [ -function funcname ...] ] c file(s)s > outputfile
-# or
-# [ -nofunction funcname [ -function funcname ...] ] c file(s)s > outputfile
-#
-# Set output format using one of -docbook -html -text or -man. Default is man.
-#
-# -no-doc-sections
-# Do not output DOC: sections
-#
-# -function funcname
-# If set, then only generate documentation for the given function(s) or
-# DOC: section titles. All other functions and DOC: sections are ignored.
-#
-# -nofunction funcname
-# If set, then only generate documentation for the other function(s)/DOC:
-# sections. Cannot be used together with -function (yes, that's a bug --
-# perl hackers can fix it 8))
-#
-# c files - list of 'c' files to process
-#
-# All output goes to stdout, with errors to stderr.
-
-#
-# format of comments.
-# In the following table, (...)? signifies optional structure.
-# (...)* signifies 0 or more structure elements
-# /**
-# * function_name(:)? (- short description)?
-# (* @parameterx: (description of parameter x)?)*
-# (* a blank line)?
-# * (Description:)? (Description of function)?
-# * (section header: (section description)? )*
-# (*)?*/
-#
-# So .. the trivial example would be:
-#
-# /**
-# * my_function
-# */
-#
-# If the Description: header tag is omitted, then there must be a blank line
-# after the last parameter specification.
-# e.g.
-# /**
-# * my_function - does my stuff
-# * @my_arg: its mine damnit
-# *
-# * Does my stuff explained.
-# */
-#
-# or, could also use:
-# /**
-# * my_function - does my stuff
-# * @my_arg: its mine damnit
-# * Description: Does my stuff explained.
-# */
-# etc.
-#
-# Besides functions you can also write documentation for structs, unions,
-# enums and typedefs. Instead of the function name you must write the name
-# of the declaration; the struct/union/enum/typedef must always precede
-# the name. Nesting of declarations is not supported.
-# Use the argument mechanism to document members or constants.
-# e.g.
-# /**
-# * struct my_struct - short description
-# * @a: first member
-# * @b: second member
-# *
-# * Longer description
-# */
-# struct my_struct {
-# int a;
-# int b;
-# /* private: */
-# int c;
-# };
-#
-# All descriptions can be multiline, except the short function description.
-#
-# You can also add additional sections. When documenting kernel functions you
-# should document the "Context:" of the function, e.g. whether the functions
-# can be called form interrupts. Unlike other sections you can end it with an
-# empty line.
-# Example-sections should contain the string EXAMPLE so that they are marked
-# appropriately in DocBook.
-#
-# Example:
-# /**
-# * user_function - function that can only be called in user context
-# * @a: some argument
-# * Context: !in_interrupt()
-# *
-# * Some description
-# * Example:
-# * user_function(22);
-# */
-# ...
-#
-#
-# All descriptive text is further processed, scanning for the following special
-# patterns, which are highlighted appropriately.
-#
-# 'funcname()' - function
-# '$ENVVAR' - environmental variable
-# '&struct_name' - name of a structure (up to two words including 'struct')
-# '@parameter' - name of a parameter
-# '%CONST' - name of a constant.
-
-my $errors = 0;
-my $warnings = 0;
-my $anon_struct_union = 0;
-
-# match expressions used to find embedded type information
-my $type_constant = '\%([-_\w]+)';
-my $type_func = '(\w+)\(\)';
-my $type_param = '\@(\w+)';
-my $type_struct = '\&((struct\s*)*[_\w]+)';
-my $type_struct_xml = '\\&((struct\s*)*[_\w]+)';
-my $type_env = '(\$\w+)';
-
-# Output conversion substitutions.
-# One for each output format
-
-# these work fairly well
-my %highlights_html = ( $type_constant, "<i>\$1</i>",
- $type_func, "<b>\$1</b>",
- $type_struct_xml, "<i>\$1</i>",
- $type_env, "<b><i>\$1</i></b>",
- $type_param, "<tt><b>\$1</b></tt>" );
-my $local_lt = "\\\\\\\\lt:";
-my $local_gt = "\\\\\\\\gt:";
-my $blankline_html = $local_lt . "p" . $local_gt; # was "<p>"
-
-# XML, docbook format
-my %highlights_xml = ( "([^=])\\\"([^\\\"<]+)\\\"", "\$1<quote>\$2</quote>",
- $type_constant, "<constant>\$1</constant>",
- $type_func, "<function>\$1</function>",
- $type_struct_xml, "<structname>\$1</structname>",
- $type_env, "<envar>\$1</envar>",
- $type_param, "<parameter>\$1</parameter>" );
-my $blankline_xml = $local_lt . "/para" . $local_gt . $local_lt . "para" . $local_gt . "\n";
-
-# gnome, docbook format
-my %highlights_gnome = ( $type_constant, "<replaceable class=\"option\">\$1</replaceable>",
- $type_func, "<function>\$1</function>",
- $type_struct, "<structname>\$1</structname>",
- $type_env, "<envar>\$1</envar>",
- $type_param, "<parameter>\$1</parameter>" );
-my $blankline_gnome = "</para><para>\n";
-
-# these are pretty rough
-my %highlights_man = ( $type_constant, "\$1",
- $type_func, "\\\\fB\$1\\\\fP",
- $type_struct, "\\\\fI\$1\\\\fP",
- $type_param, "\\\\fI\$1\\\\fP" );
-my $blankline_man = "";
-
-# text-mode
-my %highlights_text = ( $type_constant, "\$1",
- $type_func, "\$1",
- $type_struct, "\$1",
- $type_param, "\$1" );
-my $blankline_text = "";
-
-
-sub usage {
- print "Usage: $0 [ -v ] [ -docbook | -html | -text | -man ] [ -no-doc-sections ]\n";
- print " [ -function funcname [ -function funcname ...] ]\n";
- print " [ -nofunction funcname [ -nofunction funcname ...] ]\n";
- print " c source file(s) > outputfile\n";
- print " -v : verbose output, more warnings & other info listed\n";
- exit 1;
-}
-
-# read arguments
-if ($#ARGV == -1) {
- usage();
-}
-
-my $verbose = 0;
-my $output_mode = "man";
-my $no_doc_sections = 0;
-my %highlights = %highlights_man;
-my $blankline = $blankline_man;
-my $modulename = "Kernel API";
-my $function_only = 0;
-my $man_date = ('January', 'February', 'March', 'April', 'May', 'June',
- 'July', 'August', 'September', 'October',
- 'November', 'December')[(localtime)[4]] .
- " " . ((localtime)[5]+1900);
-
-# Essentially these are globals
-# They probably want to be tidied up, made more localised or something.
-# CAVEAT EMPTOR! Some of the others I localised may not want to be, which
-# could cause "use of undefined value" or other bugs.
-my ($function, %function_table, %parametertypes, $declaration_purpose);
-my ($type, $declaration_name, $return_type);
-my ($newsection, $newcontents, $prototype, $filelist, $brcount, %source_map);
-
-if (defined($ENV{'KBUILD_VERBOSE'})) {
- $verbose = "$ENV{'KBUILD_VERBOSE'}";
-}
-
-# Generated docbook code is inserted in a template at a point where
-# docbook v3.1 requires a non-zero sequence of RefEntry's; see:
-# http://www.oasis-open.org/docbook/documentation/reference/html/refentry.html
-# We keep track of number of generated entries and generate a dummy
-# if needs be to ensure the expanded template can be postprocessed
-# into html.
-my $section_counter = 0;
-
-my $lineprefix="";
-
-# states
-# 0 - normal code
-# 1 - looking for function name
-# 2 - scanning field start.
-# 3 - scanning prototype.
-# 4 - documentation block
-my $state;
-my $in_doc_sect;
-
-#declaration types: can be
-# 'function', 'struct', 'union', 'enum', 'typedef'
-my $decl_type;
-
-my $doc_special = "\@\%\$\&";
-
-my $doc_start = '^/\*\*\s*$'; # Allow whitespace at end of comment start.
-my $doc_end = '\*/';
-my $doc_com = '\s*\*\s*';
-my $doc_decl = $doc_com . '(\w+)';
-my $doc_sect = $doc_com . '([' . $doc_special . ']?[\w\s]+):(.*)';
-my $doc_content = $doc_com . '(.*)';
-my $doc_block = $doc_com . 'DOC:\s*(.*)?';
-
-my %constants;
-my %parameterdescs;
-my @parameterlist;
-my %sections;
-my @sectionlist;
-my $sectcheck;
-my $struct_actual;
-
-my $contents = "";
-my $section_default = "Description"; # default section
-my $section_intro = "Introduction";
-my $section = $section_default;
-my $section_context = "Context";
-
-my $undescribed = "-- undescribed --";
-
-reset_state();
-
-while ($ARGV[0] =~ m/^-(.*)/) {
- my $cmd = shift @ARGV;
- if ($cmd eq "-html") {
- $output_mode = "html";
- %highlights = %highlights_html;
- $blankline = $blankline_html;
- } elsif ($cmd eq "-man") {
- $output_mode = "man";
- %highlights = %highlights_man;
- $blankline = $blankline_man;
- } elsif ($cmd eq "-text") {
- $output_mode = "text";
- %highlights = %highlights_text;
- $blankline = $blankline_text;
- } elsif ($cmd eq "-docbook") {
- $output_mode = "xml";
- %highlights = %highlights_xml;
- $blankline = $blankline_xml;
- } elsif ($cmd eq "-gnome") {
- $output_mode = "gnome";
- %highlights = %highlights_gnome;
- $blankline = $blankline_gnome;
- } elsif ($cmd eq "-module") { # not needed for XML, inherits from calling document
- $modulename = shift @ARGV;
- } elsif ($cmd eq "-function") { # to only output specific functions
- $function_only = 1;
- $function = shift @ARGV;
- $function_table{$function} = 1;
- } elsif ($cmd eq "-nofunction") { # to only output specific functions
- $function_only = 2;
- $function = shift @ARGV;
- $function_table{$function} = 1;
- } elsif ($cmd eq "-v") {
- $verbose = 1;
- } elsif (($cmd eq "-h") || ($cmd eq "--help")) {
- usage();
- } elsif ($cmd eq '-filelist') {
- $filelist = shift @ARGV;
- } elsif ($cmd eq '-no-doc-sections') {
- $no_doc_sections = 1;
- }
-}
-
-# get kernel version from env
-sub get_kernel_version() {
- my $version = 'unknown kernel version';
-
- if (defined($ENV{'KERNELVERSION'})) {
- $version = $ENV{'KERNELVERSION'};
- }
- return $version;
-}
-my $kernelversion = get_kernel_version();
-
-# generate a sequence of code that will splice in highlighting information
-# using the s// operator.
-my $dohighlight = "";
-foreach my $pattern (keys %highlights) {
-# print STDERR "scanning pattern:$pattern, highlight:($highlights{$pattern})\n";
- $dohighlight .= "\$contents =~ s:$pattern:$highlights{$pattern}:gs;\n";
-}
-
-##
-# dumps section contents to arrays/hashes intended for that purpose.
-#
-sub dump_section {
- my $file = shift;
- my $name = shift;
- my $contents = join "\n", @_;
-
- if ($name =~ m/$type_constant/) {
- $name = $1;
-# print STDERR "constant section '$1' = '$contents'\n";
- $constants{$name} = $contents;
- } elsif ($name =~ m/$type_param/) {
-# print STDERR "parameter def '$1' = '$contents'\n";
- $name = $1;
- $parameterdescs{$name} = $contents;
- $sectcheck = $sectcheck . $name . " ";
- } elsif ($name eq "@\.\.\.") {
-# print STDERR "parameter def '...' = '$contents'\n";
- $name = "...";
- $parameterdescs{$name} = $contents;
- $sectcheck = $sectcheck . $name . " ";
- } else {
-# print STDERR "other section '$name' = '$contents'\n";
- if (defined($sections{$name}) && ($sections{$name} ne "")) {
- print STDERR "Error(${file}:$.): duplicate section name '$name'\n";
- ++$errors;
- }
- $sections{$name} = $contents;
- push @sectionlist, $name;
- }
-}
-
-##
-# dump DOC: section after checking that it should go out
-#
-sub dump_doc_section {
- my $file = shift;
- my $name = shift;
- my $contents = join "\n", @_;
-
- if ($no_doc_sections) {
- return;
- }
-
- if (($function_only == 0) ||
- ( $function_only == 1 && defined($function_table{$name})) ||
- ( $function_only == 2 && !defined($function_table{$name})))
- {
- dump_section($file, $name, $contents);
- output_blockhead({'sectionlist' => \@sectionlist,
- 'sections' => \%sections,
- 'module' => $modulename,
- 'content-only' => ($function_only != 0), });
- }
-}
-
-##
-# output function
-#
-# parameterdescs, a hash.
-# function => "function name"
-# parameterlist => @list of parameters
-# parameterdescs => %parameter descriptions
-# sectionlist => @list of sections
-# sections => %section descriptions
-#
-
-sub output_highlight {
- my $contents = join "\n",@_;
- my $line;
-
-# DEBUG
-# if (!defined $contents) {
-# use Carp;
-# confess "output_highlight got called with no args?\n";
-# }
-
- if ($output_mode eq "html" || $output_mode eq "xml") {
- $contents = local_unescape($contents);
- # convert data read & converted thru xml_escape() into &xyz; format:
- $contents =~ s/\\\\\\/&/g;
- }
-# print STDERR "contents b4:$contents\n";
- eval $dohighlight;
- die $@ if $@;
-# print STDERR "contents af:$contents\n";
-
- foreach $line (split "\n", $contents) {
- if ($line eq ""){
- print $lineprefix, local_unescape($blankline);
- } else {
- $line =~ s/\\\\\\/\&/g;
- if ($output_mode eq "man" && substr($line, 0, 1) eq ".") {
- print "\\&$line";
- } else {
- print $lineprefix, $line;
- }
- }
- print "\n";
- }
-}
-
-#output sections in html
-sub output_section_html(%) {
- my %args = %{$_[0]};
- my $section;
-
- foreach $section (@{$args{'sectionlist'}}) {
- print "<h3>$section</h3>\n";
- print "<blockquote>\n";
- output_highlight($args{'sections'}{$section});
- print "</blockquote>\n";
- }
-}
-
-# output enum in html
-sub output_enum_html(%) {
- my %args = %{$_[0]};
- my ($parameter);
- my $count;
- print "<h2>enum " . $args{'enum'} . "</h2>\n";
-
- print "<b>enum " . $args{'enum'} . "</b> {<br>\n";
- $count = 0;
- foreach $parameter (@{$args{'parameterlist'}}) {
- print " <b>" . $parameter . "</b>";
- if ($count != $#{$args{'parameterlist'}}) {
- $count++;
- print ",\n";
- }
- print "<br>";
- }
- print "};<br>\n";
-
- print "<h3>Constants</h3>\n";
- print "<dl>\n";
- foreach $parameter (@{$args{'parameterlist'}}) {
- print "<dt><b>" . $parameter . "</b>\n";
- print "<dd>";
- output_highlight($args{'parameterdescs'}{$parameter});
- }
- print "</dl>\n";
- output_section_html(@_);
- print "<hr>\n";
-}
-
-# output typedef in html
-sub output_typedef_html(%) {
- my %args = %{$_[0]};
- my ($parameter);
- my $count;
- print "<h2>typedef " . $args{'typedef'} . "</h2>\n";
-
- print "<b>typedef " . $args{'typedef'} . "</b>\n";
- output_section_html(@_);
- print "<hr>\n";
-}
-
-# output struct in html
-sub output_struct_html(%) {
- my %args = %{$_[0]};
- my ($parameter);
-
- print "<h2>" . $args{'type'} . " " . $args{'struct'} . " - " . $args{'purpose'} . "</h2>\n";
- print "<b>" . $args{'type'} . " " . $args{'struct'} . "</b> {<br>\n";
- foreach $parameter (@{$args{'parameterlist'}}) {
- if ($parameter =~ /^#/) {
- print "$parameter<br>\n";
- next;
- }
- my $parameter_name = $parameter;
- $parameter_name =~ s/\[.*//;
-
- ($args{'parameterdescs'}{$parameter_name} ne $undescribed) || next;
- $type = $args{'parametertypes'}{$parameter};
- if ($type =~ m/([^\(]*\(\*)\s*\)\s*\(([^\)]*)\)/) {
- # pointer-to-function
- print " <i>$1</i><b>$parameter</b>) <i>($2)</i>;<br>\n";
- } elsif ($type =~ m/^(.*?)\s*(:.*)/) {
- # bitfield
- print " <i>$1</i> <b>$parameter</b>$2;<br>\n";
- } else {
- print " <i>$type</i> <b>$parameter</b>;<br>\n";
- }
- }
- print "};<br>\n";
-
- print "<h3>Members</h3>\n";
- print "<dl>\n";
- foreach $parameter (@{$args{'parameterlist'}}) {
- ($parameter =~ /^#/) && next;
-
- my $parameter_name = $parameter;
- $parameter_name =~ s/\[.*//;
-
- ($args{'parameterdescs'}{$parameter_name} ne $undescribed) || next;
- print "<dt><b>" . $parameter . "</b>\n";
- print "<dd>";
- output_highlight($args{'parameterdescs'}{$parameter_name});
- }
- print "</dl>\n";
- output_section_html(@_);
- print "<hr>\n";
-}
-
-# output function in html
-sub output_function_html(%) {
- my %args = %{$_[0]};
- my ($parameter, $section);
- my $count;
-
- print "<h2>" . $args{'function'} . " - " . $args{'purpose'} . "</h2>\n";
- print "<i>" . $args{'functiontype'} . "</i>\n";
- print "<b>" . $args{'function'} . "</b>\n";
- print "(";
- $count = 0;
- foreach $parameter (@{$args{'parameterlist'}}) {
- $type = $args{'parametertypes'}{$parameter};
- if ($type =~ m/([^\(]*\(\*)\s*\)\s*\(([^\)]*)\)/) {
- # pointer-to-function
- print "<i>$1</i><b>$parameter</b>) <i>($2)</i>";
- } else {
- print "<i>" . $type . "</i> <b>" . $parameter . "</b>";
- }
- if ($count != $#{$args{'parameterlist'}}) {
- $count++;
- print ",\n";
- }
- }
- print ")\n";
-
- print "<h3>Arguments</h3>\n";
- print "<dl>\n";
- foreach $parameter (@{$args{'parameterlist'}}) {
- my $parameter_name = $parameter;
- $parameter_name =~ s/\[.*//;
-
- ($args{'parameterdescs'}{$parameter_name} ne $undescribed) || next;
- print "<dt><b>" . $parameter . "</b>\n";
- print "<dd>";
- output_highlight($args{'parameterdescs'}{$parameter_name});
- }
- print "</dl>\n";
- output_section_html(@_);
- print "<hr>\n";
-}
-
-# output DOC: block header in html
-sub output_blockhead_html(%) {
- my %args = %{$_[0]};
- my ($parameter, $section);
- my $count;
-
- foreach $section (@{$args{'sectionlist'}}) {
- print "<h3>$section</h3>\n";
- print "<ul>\n";
- output_highlight($args{'sections'}{$section});
- print "</ul>\n";
- }
- print "<hr>\n";
-}
-
-sub output_section_xml(%) {
- my %args = %{$_[0]};
- my $section;
- # print out each section
- $lineprefix=" ";
- foreach $section (@{$args{'sectionlist'}}) {
- print "<refsect1>\n";
- print "<title>$section</title>\n";
- if ($section =~ m/EXAMPLE/i) {
- print "<informalexample><programlisting>\n";
- } else {
- print "<para>\n";
- }
- output_highlight($args{'sections'}{$section});
- if ($section =~ m/EXAMPLE/i) {
- print "</programlisting></informalexample>\n";
- } else {
- print "</para>\n";
- }
- print "</refsect1>\n";
- }
-}
-
-# output function in XML DocBook
-sub output_function_xml(%) {
- my %args = %{$_[0]};
- my ($parameter, $section);
- my $count;
- my $id;
-
- $id = "API-" . $args{'function'};
- $id =~ s/[^A-Za-z0-9]/-/g;
-
- print "<refentry id=\"$id\">\n";
- print "<refentryinfo>\n";
- print " <title>LINUX</title>\n";
- print " <productname>Kernel Hackers Manual</productname>\n";
- print " <date>$man_date</date>\n";
- print "</refentryinfo>\n";
- print "<refmeta>\n";
- print " <refentrytitle><phrase>" . $args{'function'} . "</phrase></refentrytitle>\n";
- print " <manvolnum>9</manvolnum>\n";
- print " <refmiscinfo class=\"version\">" . $kernelversion . "</refmiscinfo>\n";
- print "</refmeta>\n";
- print "<refnamediv>\n";
- print " <refname>" . $args{'function'} . "</refname>\n";
- print " <refpurpose>\n";
- print " ";
- output_highlight ($args{'purpose'});
- print " </refpurpose>\n";
- print "</refnamediv>\n";
-
- print "<refsynopsisdiv>\n";
- print " <title>Synopsis</title>\n";
- print " <funcsynopsis><funcprototype>\n";
- print " <funcdef>" . $args{'functiontype'} . " ";
- print "<function>" . $args{'function'} . " </function></funcdef>\n";
-
- $count = 0;
- if ($#{$args{'parameterlist'}} >= 0) {
- foreach $parameter (@{$args{'parameterlist'}}) {
- $type = $args{'parametertypes'}{$parameter};
- if ($type =~ m/([^\(]*\(\*)\s*\)\s*\(([^\)]*)\)/) {
- # pointer-to-function
- print " <paramdef>$1<parameter>$parameter</parameter>)\n";
- print " <funcparams>$2</funcparams></paramdef>\n";
- } else {
- print " <paramdef>" . $type;
- print " <parameter>$parameter</parameter></paramdef>\n";
- }
- }
- } else {
- print " <void/>\n";
- }
- print " </funcprototype></funcsynopsis>\n";
- print "</refsynopsisdiv>\n";
-
- # print parameters
- print "<refsect1>\n <title>Arguments</title>\n";
- if ($#{$args{'parameterlist'}} >= 0) {
- print " <variablelist>\n";
- foreach $parameter (@{$args{'parameterlist'}}) {
- my $parameter_name = $parameter;
- $parameter_name =~ s/\[.*//;
-
- print " <varlistentry>\n <term><parameter>$parameter</parameter></term>\n";
- print " <listitem>\n <para>\n";
- $lineprefix=" ";
- output_highlight($args{'parameterdescs'}{$parameter_name});
- print " </para>\n </listitem>\n </varlistentry>\n";
- }
- print " </variablelist>\n";
- } else {
- print " <para>\n None\n </para>\n";
- }
- print "</refsect1>\n";
-
- output_section_xml(@_);
- print "</refentry>\n\n";
-}
-
-# output struct in XML DocBook
-sub output_struct_xml(%) {
- my %args = %{$_[0]};
- my ($parameter, $section);
- my $id;
-
- $id = "API-struct-" . $args{'struct'};
- $id =~ s/[^A-Za-z0-9]/-/g;
-
- print "<refentry id=\"$id\">\n";
- print "<refentryinfo>\n";
- print " <title>LINUX</title>\n";
- print " <productname>Kernel Hackers Manual</productname>\n";
- print " <date>$man_date</date>\n";
- print "</refentryinfo>\n";
- print "<refmeta>\n";
- print " <refentrytitle><phrase>" . $args{'type'} . " " . $args{'struct'} . "</phrase></refentrytitle>\n";
- print " <manvolnum>9</manvolnum>\n";
- print " <refmiscinfo class=\"version\">" . $kernelversion . "</refmiscinfo>\n";
- print "</refmeta>\n";
- print "<refnamediv>\n";
- print " <refname>" . $args{'type'} . " " . $args{'struct'} . "</refname>\n";
- print " <refpurpose>\n";
- print " ";
- output_highlight ($args{'purpose'});
- print " </refpurpose>\n";
- print "</refnamediv>\n";
-
- print "<refsynopsisdiv>\n";
- print " <title>Synopsis</title>\n";
- print " <programlisting>\n";
- print $args{'type'} . " " . $args{'struct'} . " {\n";
- foreach $parameter (@{$args{'parameterlist'}}) {
- if ($parameter =~ /^#/) {
- print "$parameter\n";
- next;
- }
-
- my $parameter_name = $parameter;
- $parameter_name =~ s/\[.*//;
-
- defined($args{'parameterdescs'}{$parameter_name}) || next;
- ($args{'parameterdescs'}{$parameter_name} ne $undescribed) || next;
- $type = $args{'parametertypes'}{$parameter};
- if ($type =~ m/([^\(]*\(\*)\s*\)\s*\(([^\)]*)\)/) {
- # pointer-to-function
- print " $1 $parameter) ($2);\n";
- } elsif ($type =~ m/^(.*?)\s*(:.*)/) {
- # bitfield
- print " $1 $parameter$2;\n";
- } else {
- print " " . $type . " " . $parameter . ";\n";
- }
- }
- print "};";
- print " </programlisting>\n";
- print "</refsynopsisdiv>\n";
-
- print " <refsect1>\n";
- print " <title>Members</title>\n";
-
- if ($#{$args{'parameterlist'}} >= 0) {
- print " <variablelist>\n";
- foreach $parameter (@{$args{'parameterlist'}}) {
- ($parameter =~ /^#/) && next;
-
- my $parameter_name = $parameter;
- $parameter_name =~ s/\[.*//;
-
- defined($args{'parameterdescs'}{$parameter_name}) || next;
- ($args{'parameterdescs'}{$parameter_name} ne $undescribed) || next;
- print " <varlistentry>";
- print " <term>$parameter</term>\n";
- print " <listitem><para>\n";
- output_highlight($args{'parameterdescs'}{$parameter_name});
- print " </para></listitem>\n";
- print " </varlistentry>\n";
- }
- print " </variablelist>\n";
- } else {
- print " <para>\n None\n </para>\n";
- }
- print " </refsect1>\n";
-
- output_section_xml(@_);
-
- print "</refentry>\n\n";
-}
-
-# output enum in XML DocBook
-sub output_enum_xml(%) {
- my %args = %{$_[0]};
- my ($parameter, $section);
- my $count;
- my $id;
-
- $id = "API-enum-" . $args{'enum'};
- $id =~ s/[^A-Za-z0-9]/-/g;
-
- print "<refentry id=\"$id\">\n";
- print "<refentryinfo>\n";
- print " <title>LINUX</title>\n";
- print " <productname>Kernel Hackers Manual</productname>\n";
- print " <date>$man_date</date>\n";
- print "</refentryinfo>\n";
- print "<refmeta>\n";
- print " <refentrytitle><phrase>enum " . $args{'enum'} . "</phrase></refentrytitle>\n";
- print " <manvolnum>9</manvolnum>\n";
- print " <refmiscinfo class=\"version\">" . $kernelversion . "</refmiscinfo>\n";
- print "</refmeta>\n";
- print "<refnamediv>\n";
- print " <refname>enum " . $args{'enum'} . "</refname>\n";
- print " <refpurpose>\n";
- print " ";
- output_highlight ($args{'purpose'});
- print " </refpurpose>\n";
- print "</refnamediv>\n";
-
- print "<refsynopsisdiv>\n";
- print " <title>Synopsis</title>\n";
- print " <programlisting>\n";
- print "enum " . $args{'enum'} . " {\n";
- $count = 0;
- foreach $parameter (@{$args{'parameterlist'}}) {
- print " $parameter";
- if ($count != $#{$args{'parameterlist'}}) {
- $count++;
- print ",";
- }
- print "\n";
- }
- print "};";
- print " </programlisting>\n";
- print "</refsynopsisdiv>\n";
-
- print "<refsect1>\n";
- print " <title>Constants</title>\n";
- print " <variablelist>\n";
- foreach $parameter (@{$args{'parameterlist'}}) {
- my $parameter_name = $parameter;
- $parameter_name =~ s/\[.*//;
-
- print " <varlistentry>";
- print " <term>$parameter</term>\n";
- print " <listitem><para>\n";
- output_highlight($args{'parameterdescs'}{$parameter_name});
- print " </para></listitem>\n";
- print " </varlistentry>\n";
- }
- print " </variablelist>\n";
- print "</refsect1>\n";
-
- output_section_xml(@_);
-
- print "</refentry>\n\n";
-}
-
-# output typedef in XML DocBook
-sub output_typedef_xml(%) {
- my %args = %{$_[0]};
- my ($parameter, $section);
- my $id;
-
- $id = "API-typedef-" . $args{'typedef'};
- $id =~ s/[^A-Za-z0-9]/-/g;
-
- print "<refentry id=\"$id\">\n";
- print "<refentryinfo>\n";
- print " <title>LINUX</title>\n";
- print " <productname>Kernel Hackers Manual</productname>\n";
- print " <date>$man_date</date>\n";
- print "</refentryinfo>\n";
- print "<refmeta>\n";
- print " <refentrytitle><phrase>typedef " . $args{'typedef'} . "</phrase></refentrytitle>\n";
- print " <manvolnum>9</manvolnum>\n";
- print "</refmeta>\n";
- print "<refnamediv>\n";
- print " <refname>typedef " . $args{'typedef'} . "</refname>\n";
- print " <refpurpose>\n";
- print " ";
- output_highlight ($args{'purpose'});
- print " </refpurpose>\n";
- print "</refnamediv>\n";
-
- print "<refsynopsisdiv>\n";
- print " <title>Synopsis</title>\n";
- print " <synopsis>typedef " . $args{'typedef'} . ";</synopsis>\n";
- print "</refsynopsisdiv>\n";
-
- output_section_xml(@_);
-
- print "</refentry>\n\n";
-}
-
-# output in XML DocBook
-sub output_blockhead_xml(%) {
- my %args = %{$_[0]};
- my ($parameter, $section);
- my $count;
-
- my $id = $args{'module'};
- $id =~ s/[^A-Za-z0-9]/-/g;
-
- # print out each section
- $lineprefix=" ";
- foreach $section (@{$args{'sectionlist'}}) {
- if (!$args{'content-only'}) {
- print "<refsect1>\n <title>$section</title>\n";
- }
- if ($section =~ m/EXAMPLE/i) {
- print "<example><para>\n";
- } else {
- print "<para>\n";
- }
- output_highlight($args{'sections'}{$section});
- if ($section =~ m/EXAMPLE/i) {
- print "</para></example>\n";
- } else {
- print "</para>";
- }
- if (!$args{'content-only'}) {
- print "\n</refsect1>\n";
- }
- }
-
- print "\n\n";
-}
-
-# output in XML DocBook
-sub output_function_gnome {
- my %args = %{$_[0]};
- my ($parameter, $section);
- my $count;
- my $id;
-
- $id = $args{'module'} . "-" . $args{'function'};
- $id =~ s/[^A-Za-z0-9]/-/g;
-
- print "<sect2>\n";
- print " <title id=\"$id\">" . $args{'function'} . "</title>\n";
-
- print " <funcsynopsis>\n";
- print " <funcdef>" . $args{'functiontype'} . " ";
- print "<function>" . $args{'function'} . " ";
- print "</function></funcdef>\n";
-
- $count = 0;
- if ($#{$args{'parameterlist'}} >= 0) {
- foreach $parameter (@{$args{'parameterlist'}}) {
- $type = $args{'parametertypes'}{$parameter};
- if ($type =~ m/([^\(]*\(\*)\s*\)\s*\(([^\)]*)\)/) {
- # pointer-to-function
- print " <paramdef>$1 <parameter>$parameter</parameter>)\n";
- print " <funcparams>$2</funcparams></paramdef>\n";
- } else {
- print " <paramdef>" . $type;
- print " <parameter>$parameter</parameter></paramdef>\n";
- }
- }
- } else {
- print " <void>\n";
- }
- print " </funcsynopsis>\n";
- if ($#{$args{'parameterlist'}} >= 0) {
- print " <informaltable pgwide=\"1\" frame=\"none\" role=\"params\">\n";
- print "<tgroup cols=\"2\">\n";
- print "<colspec colwidth=\"2*\">\n";
- print "<colspec colwidth=\"8*\">\n";
- print "<tbody>\n";
- foreach $parameter (@{$args{'parameterlist'}}) {
- my $parameter_name = $parameter;
- $parameter_name =~ s/\[.*//;
-
- print " <row><entry align=\"right\"><parameter>$parameter</parameter></entry>\n";
- print " <entry>\n";
- $lineprefix=" ";
- output_highlight($args{'parameterdescs'}{$parameter_name});
- print " </entry></row>\n";
- }
- print " </tbody></tgroup></informaltable>\n";
- } else {
- print " <para>\n None\n </para>\n";
- }
-
- # print out each section
- $lineprefix=" ";
- foreach $section (@{$args{'sectionlist'}}) {
- print "<simplesect>\n <title>$section</title>\n";
- if ($section =~ m/EXAMPLE/i) {
- print "<example><programlisting>\n";
- } else {
- }
- print "<para>\n";
- output_highlight($args{'sections'}{$section});
- print "</para>\n";
- if ($section =~ m/EXAMPLE/i) {
- print "</programlisting></example>\n";
- } else {
- }
- print " </simplesect>\n";
- }
-
- print "</sect2>\n\n";
-}
-
-##
-# output function in man
-sub output_function_man(%) {
- my %args = %{$_[0]};
- my ($parameter, $section);
- my $count;
-
- print ".TH \"$args{'function'}\" 9 \"$args{'function'}\" \"$man_date\" \"Kernel Hacker's Manual\" LINUX\n";
-
- print ".SH NAME\n";
- print $args{'function'} . " \\- " . $args{'purpose'} . "\n";
-
- print ".SH SYNOPSIS\n";
- if ($args{'functiontype'} ne "") {
- print ".B \"" . $args{'functiontype'} . "\" " . $args{'function'} . "\n";
- } else {
- print ".B \"" . $args{'function'} . "\n";
- }
- $count = 0;
- my $parenth = "(";
- my $post = ",";
- foreach my $parameter (@{$args{'parameterlist'}}) {
- if ($count == $#{$args{'parameterlist'}}) {
- $post = ");";
- }
- $type = $args{'parametertypes'}{$parameter};
- if ($type =~ m/([^\(]*\(\*)\s*\)\s*\(([^\)]*)\)/) {
- # pointer-to-function
- print ".BI \"" . $parenth . $1 . "\" " . $parameter . " \") (" . $2 . ")" . $post . "\"\n";
- } else {
- $type =~ s/([^\*])$/$1 /;
- print ".BI \"" . $parenth . $type . "\" " . $parameter . " \"" . $post . "\"\n";
- }
- $count++;
- $parenth = "";
- }
-
- print ".SH ARGUMENTS\n";
- foreach $parameter (@{$args{'parameterlist'}}) {
- my $parameter_name = $parameter;
- $parameter_name =~ s/\[.*//;
-
- print ".IP \"" . $parameter . "\" 12\n";
- output_highlight($args{'parameterdescs'}{$parameter_name});
- }
- foreach $section (@{$args{'sectionlist'}}) {
- print ".SH \"", uc $section, "\"\n";
- output_highlight($args{'sections'}{$section});
- }
-}
-
-##
-# output enum in man
-sub output_enum_man(%) {
- my %args = %{$_[0]};
- my ($parameter, $section);
- my $count;
-
- print ".TH \"$args{'module'}\" 9 \"enum $args{'enum'}\" \"$man_date\" \"API Manual\" LINUX\n";
-
- print ".SH NAME\n";
- print "enum " . $args{'enum'} . " \\- " . $args{'purpose'} . "\n";
-
- print ".SH SYNOPSIS\n";
- print "enum " . $args{'enum'} . " {\n";
- $count = 0;
- foreach my $parameter (@{$args{'parameterlist'}}) {
- print ".br\n.BI \" $parameter\"\n";
- if ($count == $#{$args{'parameterlist'}}) {
- print "\n};\n";
- last;
- }
- else {
- print ", \n.br\n";
- }
- $count++;
- }
-
- print ".SH Constants\n";
- foreach $parameter (@{$args{'parameterlist'}}) {
- my $parameter_name = $parameter;
- $parameter_name =~ s/\[.*//;
-
- print ".IP \"" . $parameter . "\" 12\n";
- output_highlight($args{'parameterdescs'}{$parameter_name});
- }
- foreach $section (@{$args{'sectionlist'}}) {
- print ".SH \"$section\"\n";
- output_highlight($args{'sections'}{$section});
- }
-}
-
-##
-# output struct in man
-sub output_struct_man(%) {
- my %args = %{$_[0]};
- my ($parameter, $section);
-
- print ".TH \"$args{'module'}\" 9 \"" . $args{'type'} . " " . $args{'struct'} . "\" \"$man_date\" \"API Manual\" LINUX\n";
-
- print ".SH NAME\n";
- print $args{'type'} . " " . $args{'struct'} . " \\- " . $args{'purpose'} . "\n";
-
- print ".SH SYNOPSIS\n";
- print $args{'type'} . " " . $args{'struct'} . " {\n.br\n";
-
- foreach my $parameter (@{$args{'parameterlist'}}) {
- if ($parameter =~ /^#/) {
- print ".BI \"$parameter\"\n.br\n";
- next;
- }
- my $parameter_name = $parameter;
- $parameter_name =~ s/\[.*//;
-
- ($args{'parameterdescs'}{$parameter_name} ne $undescribed) || next;
- $type = $args{'parametertypes'}{$parameter};
- if ($type =~ m/([^\(]*\(\*)\s*\)\s*\(([^\)]*)\)/) {
- # pointer-to-function
- print ".BI \" " . $1 . "\" " . $parameter . " \") (" . $2 . ")" . "\"\n;\n";
- } elsif ($type =~ m/^(.*?)\s*(:.*)/) {
- # bitfield
- print ".BI \" " . $1 . "\ \" " . $parameter . $2 . " \"" . "\"\n;\n";
- } else {
- $type =~ s/([^\*])$/$1 /;
- print ".BI \" " . $type . "\" " . $parameter . " \"" . "\"\n;\n";
- }
- print "\n.br\n";
- }
- print "};\n.br\n";
-
- print ".SH Members\n";
- foreach $parameter (@{$args{'parameterlist'}}) {
- ($parameter =~ /^#/) && next;
-
- my $parameter_name = $parameter;
- $parameter_name =~ s/\[.*//;
-
- ($args{'parameterdescs'}{$parameter_name} ne $undescribed) || next;
- print ".IP \"" . $parameter . "\" 12\n";
- output_highlight($args{'parameterdescs'}{$parameter_name});
- }
- foreach $section (@{$args{'sectionlist'}}) {
- print ".SH \"$section\"\n";
- output_highlight($args{'sections'}{$section});
- }
-}
-
-##
-# output typedef in man
-sub output_typedef_man(%) {
- my %args = %{$_[0]};
- my ($parameter, $section);
-
- print ".TH \"$args{'module'}\" 9 \"$args{'typedef'}\" \"$man_date\" \"API Manual\" LINUX\n";
-
- print ".SH NAME\n";
- print "typedef " . $args{'typedef'} . " \\- " . $args{'purpose'} . "\n";
-
- foreach $section (@{$args{'sectionlist'}}) {
- print ".SH \"$section\"\n";
- output_highlight($args{'sections'}{$section});
- }
-}
-
-sub output_blockhead_man(%) {
- my %args = %{$_[0]};
- my ($parameter, $section);
- my $count;
-
- print ".TH \"$args{'module'}\" 9 \"$args{'module'}\" \"$man_date\" \"API Manual\" LINUX\n";
-
- foreach $section (@{$args{'sectionlist'}}) {
- print ".SH \"$section\"\n";
- output_highlight($args{'sections'}{$section});
- }
-}
-
-##
-# output in text
-sub output_function_text(%) {
- my %args = %{$_[0]};
- my ($parameter, $section);
- my $start;
-
- print "Name:\n\n";
- print $args{'function'} . " - " . $args{'purpose'} . "\n";
-
- print "\nSynopsis:\n\n";
- if ($args{'functiontype'} ne "") {
- $start = $args{'functiontype'} . " " . $args{'function'} . " (";
- } else {
- $start = $args{'function'} . " (";
- }
- print $start;
-
- my $count = 0;
- foreach my $parameter (@{$args{'parameterlist'}}) {
- $type = $args{'parametertypes'}{$parameter};
- if ($type =~ m/([^\(]*\(\*)\s*\)\s*\(([^\)]*)\)/) {
- # pointer-to-function
- print $1 . $parameter . ") (" . $2;
- } else {
- print $type . " " . $parameter;
- }
- if ($count != $#{$args{'parameterlist'}}) {
- $count++;
- print ",\n";
- print " " x length($start);
- } else {
- print ");\n\n";
- }
- }
-
- print "Arguments:\n\n";
- foreach $parameter (@{$args{'parameterlist'}}) {
- my $parameter_name = $parameter;
- $parameter_name =~ s/\[.*//;
-
- print $parameter . "\n\t" . $args{'parameterdescs'}{$parameter_name} . "\n";
- }
- output_section_text(@_);
-}
-
-#output sections in text
-sub output_section_text(%) {
- my %args = %{$_[0]};
- my $section;
-
- print "\n";
- foreach $section (@{$args{'sectionlist'}}) {
- print "$section:\n\n";
- output_highlight($args{'sections'}{$section});
- }
- print "\n\n";
-}
-
-# output enum in text
-sub output_enum_text(%) {
- my %args = %{$_[0]};
- my ($parameter);
- my $count;
- print "Enum:\n\n";
-
- print "enum " . $args{'enum'} . " - " . $args{'purpose'} . "\n\n";
- print "enum " . $args{'enum'} . " {\n";
- $count = 0;
- foreach $parameter (@{$args{'parameterlist'}}) {
- print "\t$parameter";
- if ($count != $#{$args{'parameterlist'}}) {
- $count++;
- print ",";
- }
- print "\n";
- }
- print "};\n\n";
-
- print "Constants:\n\n";
- foreach $parameter (@{$args{'parameterlist'}}) {
- print "$parameter\n\t";
- print $args{'parameterdescs'}{$parameter} . "\n";
- }
-
- output_section_text(@_);
-}
-
-# output typedef in text
-sub output_typedef_text(%) {
- my %args = %{$_[0]};
- my ($parameter);
- my $count;
- print "Typedef:\n\n";
-
- print "typedef " . $args{'typedef'} . " - " . $args{'purpose'} . "\n";
- output_section_text(@_);
-}
-
-# output struct as text
-sub output_struct_text(%) {
- my %args = %{$_[0]};
- my ($parameter);
-
- print $args{'type'} . " " . $args{'struct'} . " - " . $args{'purpose'} . "\n\n";
- print $args{'type'} . " " . $args{'struct'} . " {\n";
- foreach $parameter (@{$args{'parameterlist'}}) {
- if ($parameter =~ /^#/) {
- print "$parameter\n";
- next;
- }
-
- my $parameter_name = $parameter;
- $parameter_name =~ s/\[.*//;
-
- ($args{'parameterdescs'}{$parameter_name} ne $undescribed) || next;
- $type = $args{'parametertypes'}{$parameter};
- if ($type =~ m/([^\(]*\(\*)\s*\)\s*\(([^\)]*)\)/) {
- # pointer-to-function
- print "\t$1 $parameter) ($2);\n";
- } elsif ($type =~ m/^(.*?)\s*(:.*)/) {
- # bitfield
- print "\t$1 $parameter$2;\n";
- } else {
- print "\t" . $type . " " . $parameter . ";\n";
- }
- }
- print "};\n\n";
-
- print "Members:\n\n";
- foreach $parameter (@{$args{'parameterlist'}}) {
- ($parameter =~ /^#/) && next;
-
- my $parameter_name = $parameter;
- $parameter_name =~ s/\[.*//;
-
- ($args{'parameterdescs'}{$parameter_name} ne $undescribed) || next;
- print "$parameter\n\t";
- print $args{'parameterdescs'}{$parameter_name} . "\n";
- }
- print "\n";
- output_section_text(@_);
-}
-
-sub output_blockhead_text(%) {
- my %args = %{$_[0]};
- my ($parameter, $section);
-
- foreach $section (@{$args{'sectionlist'}}) {
- print " $section:\n";
- print " -> ";
- output_highlight($args{'sections'}{$section});
- }
-}
-
-##
-# generic output function for all types (function, struct/union, typedef, enum);
-# calls the generated, variable output_ function name based on
-# functype and output_mode
-sub output_declaration {
- no strict 'refs';
- my $name = shift;
- my $functype = shift;
- my $func = "output_${functype}_$output_mode";
- if (($function_only==0) ||
- ( $function_only == 1 && defined($function_table{$name})) ||
- ( $function_only == 2 && !defined($function_table{$name})))
- {
- &$func(@_);
- $section_counter++;
- }
-}
-
-##
-# generic output function - calls the right one based on current output mode.
-sub output_blockhead {
- no strict 'refs';
- my $func = "output_blockhead_" . $output_mode;
- &$func(@_);
- $section_counter++;
-}
-
-##
-# takes a declaration (struct, union, enum, typedef) and
-# invokes the right handler. NOT called for functions.
-sub dump_declaration($$) {
- no strict 'refs';
- my ($prototype, $file) = @_;
- my $func = "dump_" . $decl_type;
- &$func(@_);
-}
-
-sub dump_union($$) {
- dump_struct(@_);
-}
-
-sub dump_struct($$) {
- my $x = shift;
- my $file = shift;
- my $nested;
-
- if ($x =~ /(struct|union)\s+(\w+)\s*{(.*)}/) {
- #my $decl_type = $1;
- $declaration_name = $2;
- my $members = $3;
-
- # ignore embedded structs or unions
- $members =~ s/({.*})//g;
- $nested = $1;
-
- # ignore members marked private:
- $members =~ s/\/\*\s*private:.*?\/\*\s*public:.*?\*\///gos;
- $members =~ s/\/\*\s*private:.*//gos;
- # strip comments:
- $members =~ s/\/\*.*?\*\///gos;
- $nested =~ s/\/\*.*?\*\///gos;
- # strip kmemcheck_bitfield_{begin,end}.*;
- $members =~ s/kmemcheck_bitfield_.*?;//gos;
-
- create_parameterlist($members, ';', $file);
- check_sections($file, $declaration_name, "struct", $sectcheck, $struct_actual, $nested);
-
- output_declaration($declaration_name,
- 'struct',
- {'struct' => $declaration_name,
- 'module' => $modulename,
- 'parameterlist' => \@parameterlist,
- 'parameterdescs' => \%parameterdescs,
- 'parametertypes' => \%parametertypes,
- 'sectionlist' => \@sectionlist,
- 'sections' => \%sections,
- 'purpose' => $declaration_purpose,
- 'type' => $decl_type
- });
- }
- else {
- print STDERR "Error(${file}:$.): Cannot parse struct or union!\n";
- ++$errors;
- }
-}
-
-sub dump_enum($$) {
- my $x = shift;
- my $file = shift;
-
- $x =~ s@/\*.*?\*/@@gos; # strip comments.
- if ($x =~ /enum\s+(\w+)\s*{(.*)}/) {
- $declaration_name = $1;
- my $members = $2;
-
- foreach my $arg (split ',', $members) {
- $arg =~ s/^\s*(\w+).*/$1/;
- push @parameterlist, $arg;
- if (!$parameterdescs{$arg}) {
- $parameterdescs{$arg} = $undescribed;
- print STDERR "Warning(${file}:$.): Enum value '$arg' ".
- "not described in enum '$declaration_name'\n";
- }
-
- }
-
- output_declaration($declaration_name,
- 'enum',
- {'enum' => $declaration_name,
- 'module' => $modulename,
- 'parameterlist' => \@parameterlist,
- 'parameterdescs' => \%parameterdescs,
- 'sectionlist' => \@sectionlist,
- 'sections' => \%sections,
- 'purpose' => $declaration_purpose
- });
- }
- else {
- print STDERR "Error(${file}:$.): Cannot parse enum!\n";
- ++$errors;
- }
-}
-
-sub dump_typedef($$) {
- my $x = shift;
- my $file = shift;
-
- $x =~ s@/\*.*?\*/@@gos; # strip comments.
- while (($x =~ /\(*.\)\s*;$/) || ($x =~ /\[*.\]\s*;$/)) {
- $x =~ s/\(*.\)\s*;$/;/;
- $x =~ s/\[*.\]\s*;$/;/;
- }
-
- if ($x =~ /typedef.*\s+(\w+)\s*;/) {
- $declaration_name = $1;
-
- output_declaration($declaration_name,
- 'typedef',
- {'typedef' => $declaration_name,
- 'module' => $modulename,
- 'sectionlist' => \@sectionlist,
- 'sections' => \%sections,
- 'purpose' => $declaration_purpose
- });
- }
- else {
- print STDERR "Error(${file}:$.): Cannot parse typedef!\n";
- ++$errors;
- }
-}
-
-sub save_struct_actual($) {
- my $actual = shift;
-
- # strip all spaces from the actual param so that it looks like one string item
- $actual =~ s/\s*//g;
- $struct_actual = $struct_actual . $actual . " ";
-}
-
-sub create_parameterlist($$$) {
- my $args = shift;
- my $splitter = shift;
- my $file = shift;
- my $type;
- my $param;
-
- # temporarily replace commas inside function pointer definition
- while ($args =~ /(\([^\),]+),/) {
- $args =~ s/(\([^\),]+),/$1#/g;
- }
-
- foreach my $arg (split($splitter, $args)) {
- # strip comments
- $arg =~ s/\/\*.*\*\///;
- # strip leading/trailing spaces
- $arg =~ s/^\s*//;
- $arg =~ s/\s*$//;
- $arg =~ s/\s+/ /;
-
- if ($arg =~ /^#/) {
- # Treat preprocessor directive as a typeless variable just to fill
- # corresponding data structures "correctly". Catch it later in
- # output_* subs.
- push_parameter($arg, "", $file);
- } elsif ($arg =~ m/\(.+\)\s*\(/) {
- # pointer-to-function
- $arg =~ tr/#/,/;
- $arg =~ m/[^\(]+\(\*?\s*(\w*)\s*\)/;
- $param = $1;
- $type = $arg;
- $type =~ s/([^\(]+\(\*?)\s*$param/$1/;
- save_struct_actual($param);
- push_parameter($param, $type, $file);
- } elsif ($arg) {
- $arg =~ s/\s*:\s*/:/g;
- $arg =~ s/\s*\[/\[/g;
-
- my @args = split('\s*,\s*', $arg);
- if ($args[0] =~ m/\*/) {
- $args[0] =~ s/(\*+)\s*/ $1/;
- }
-
- my @first_arg;
- if ($args[0] =~ /^(.*\s+)(.*?\[.*\].*)$/) {
- shift @args;
- push(@first_arg, split('\s+', $1));
- push(@first_arg, $2);
- } else {
- @first_arg = split('\s+', shift @args);
- }
-
- unshift(@args, pop @first_arg);
- $type = join " ", @first_arg;
-
- foreach $param (@args) {
- if ($param =~ m/^(\*+)\s*(.*)/) {
- save_struct_actual($2);
- push_parameter($2, "$type $1", $file);
- }
- elsif ($param =~ m/(.*?):(\d+)/) {
- if ($type ne "") { # skip unnamed bit-fields
- save_struct_actual($1);
- push_parameter($1, "$type:$2", $file)
- }
- }
- else {
- save_struct_actual($param);
- push_parameter($param, $type, $file);
- }
- }
- }
- }
-}
-
-sub push_parameter($$$) {
- my $param = shift;
- my $type = shift;
- my $file = shift;
-
- if (($anon_struct_union == 1) && ($type eq "") &&
- ($param eq "}")) {
- return; # ignore the ending }; from anon. struct/union
- }
-
- $anon_struct_union = 0;
- my $param_name = $param;
- $param_name =~ s/\[.*//;
-
- if ($type eq "" && $param =~ /\.\.\.$/)
- {
- if (!defined $parameterdescs{$param} || $parameterdescs{$param} eq "") {
- $parameterdescs{$param} = "variable arguments";
- }
- }
- elsif ($type eq "" && ($param eq "" or $param eq "void"))
- {
- $param="void";
- $parameterdescs{void} = "no arguments";
- }
- elsif ($type eq "" && ($param eq "struct" or $param eq "union"))
- # handle unnamed (anonymous) union or struct:
- {
- $type = $param;
- $param = "{unnamed_" . $param . "}";
- $parameterdescs{$param} = "anonymous\n";
- $anon_struct_union = 1;
- }
-
- # warn if parameter has no description
- # (but ignore ones starting with # as these are not parameters
- # but inline preprocessor statements);
- # also ignore unnamed structs/unions;
- if (!$anon_struct_union) {
- if (!defined $parameterdescs{$param_name} && $param_name !~ /^#/) {
-
- $parameterdescs{$param_name} = $undescribed;
-
- if (($type eq 'function') || ($type eq 'enum')) {
- print STDERR "Warning(${file}:$.): Function parameter ".
- "or member '$param' not " .
- "described in '$declaration_name'\n";
- }
- print STDERR "Warning(${file}:$.):" .
- " No description found for parameter '$param'\n";
- ++$warnings;
- }
- }
-
- # strip spaces from $param so that it is one continous string
- # on @parameterlist;
- # this fixes a problem where check_sections() cannot find
- # a parameter like "addr[6 + 2]" because it actually appears
- # as "addr[6", "+", "2]" on the parameter list;
- # but it's better to maintain the param string unchanged for output,
- # so just weaken the string compare in check_sections() to ignore
- # "[blah" in a parameter string;
- ###$param =~ s/\s*//g;
- push @parameterlist, $param;
- $parametertypes{$param} = $type;
-}
-
-sub check_sections($$$$$$) {
- my ($file, $decl_name, $decl_type, $sectcheck, $prmscheck, $nested) = @_;
- my @sects = split ' ', $sectcheck;
- my @prms = split ' ', $prmscheck;
- my $err;
- my ($px, $sx);
- my $prm_clean; # strip trailing "[array size]" and/or beginning "*"
-
- foreach $sx (0 .. $#sects) {
- $err = 1;
- foreach $px (0 .. $#prms) {
- $prm_clean = $prms[$px];
- $prm_clean =~ s/\[.*\]//;
- $prm_clean =~ s/__attribute__\s*\(\([a-z,_\*\s\(\)]*\)\)//;
- # ignore array size in a parameter string;
- # however, the original param string may contain
- # spaces, e.g.: addr[6 + 2]
- # and this appears in @prms as "addr[6" since the
- # parameter list is split at spaces;
- # hence just ignore "[..." for the sections check;
- $prm_clean =~ s/\[.*//;
-
- ##$prm_clean =~ s/^\**//;
- if ($prm_clean eq $sects[$sx]) {
- $err = 0;
- last;
- }
- }
- if ($err) {
- if ($decl_type eq "function") {
- print STDERR "Warning(${file}:$.): " .
- "Excess function parameter " .
- "'$sects[$sx]' " .
- "description in '$decl_name'\n";
- ++$warnings;
- } else {
- if ($nested !~ m/\Q$sects[$sx]\E/) {
- print STDERR "Warning(${file}:$.): " .
- "Excess struct/union/enum/typedef member " .
- "'$sects[$sx]' " .
- "description in '$decl_name'\n";
- ++$warnings;
- }
- }
- }
- }
-}
-
-##
-# takes a function prototype and the name of the current file being
-# processed and spits out all the details stored in the global
-# arrays/hashes.
-sub dump_function($$) {
- my $prototype = shift;
- my $file = shift;
-
- $prototype =~ s/LWS_VISIBLE +//;
- $prototype =~ s/^static +//;
- $prototype =~ s/^extern +//;
- $prototype =~ s/^asmlinkage +//;
- $prototype =~ s/^inline +//;
- $prototype =~ s/^__inline__ +//;
- $prototype =~ s/^__inline +//;
- $prototype =~ s/^__always_inline +//;
- $prototype =~ s/^noinline +//;
- $prototype =~ s/__devinit +//;
- $prototype =~ s/__init +//;
- $prototype =~ s/^#\s*define\s+//; #ak added
- $prototype =~ s/__attribute__\s*\(\([a-z,]*\)\)//;
-
- # Yes, this truly is vile. We are looking for:
- # 1. Return type (may be nothing if we're looking at a macro)
- # 2. Function name
- # 3. Function parameters.
- #
- # All the while we have to watch out for function pointer parameters
- # (which IIRC is what the two sections are for), C types (these
- # regexps don't even start to express all the possibilities), and
- # so on.
- #
- # If you mess with these regexps, it's a good idea to check that
- # the following functions' documentation still comes out right:
- # - parport_register_device (function pointer parameters)
- # - atomic_set (macro)
- # - pci_match_device, __copy_to_user (long return type)
-
- if ($prototype =~ m/^()([a-zA-Z0-9_~:]+)\s*\(([^\(]*)\)/ ||
- $prototype =~ m/^(\w+)\s+([a-zA-Z0-9_~:]+)\s*\(([^\(]*)\)/ ||
- $prototype =~ m/^(\w+\s*\*)\s*([a-zA-Z0-9_~:]+)\s*\(([^\(]*)\)/ ||
- $prototype =~ m/^(\w+\s+\w+)\s+([a-zA-Z0-9_~:]+)\s*\(([^\(]*)\)/ ||
- $prototype =~ m/^(\w+\s+\w+\s*\*+)\s*([a-zA-Z0-9_~:]+)\s*\(([^\(]*)\)/ ||
- $prototype =~ m/^(\w+\s+\w+\s+\w+)\s+([a-zA-Z0-9_~:]+)\s*\(([^\(]*)\)/ ||
- $prototype =~ m/^(\w+\s+\w+\s+\w+\s*\*)\s*([a-zA-Z0-9_~:]+)\s*\(([^\(]*)\)/ ||
- $prototype =~ m/^()([a-zA-Z0-9_~:]+)\s*\(([^\{]*)\)/ ||
- $prototype =~ m/^(\w+)\s+([a-zA-Z0-9_~:]+)\s*\(([^\{]*)\)/ ||
- $prototype =~ m/^(\w+\s*\*)\s*([a-zA-Z0-9_~:]+)\s*\(([^\{]*)\)/ ||
- $prototype =~ m/^(\w+\s+\w+)\s+([a-zA-Z0-9_~:]+)\s*\(([^\{]*)\)/ ||
- $prototype =~ m/^(\w+\s+\w+\s*\*)\s*([a-zA-Z0-9_~:]+)\s*\(([^\{]*)\)/ ||
- $prototype =~ m/^(\w+\s+\w+\s+\w+)\s+([a-zA-Z0-9_~:]+)\s*\(([^\{]*)\)/ ||
- $prototype =~ m/^(\w+\s+\w+\s+\w+\s*\*)\s*([a-zA-Z0-9_~:]+)\s*\(([^\{]*)\)/ ||
- $prototype =~ m/^(\w+\s+\w+\s+\w+\s+\w+)\s+([a-zA-Z0-9_~:]+)\s*\(([^\{]*)\)/ ||
- $prototype =~ m/^(\w+\s+\w+\s+\w+\s+\w+\s*\*)\s*([a-zA-Z0-9_~:]+)\s*\(([^\{]*)\)/ ||
- $prototype =~ m/^(\w+\s+\w+\s*\*\s*\w+\s*\*\s*)\s*([a-zA-Z0-9_~:]+)\s*\(([^\{]*)\)/) {
- $return_type = $1;
- $declaration_name = $2;
- my $args = $3;
-
- create_parameterlist($args, ',', $file);
- } else {
- print STDERR "Error(${file}:$.): cannot understand prototype: '$prototype'\n";
- ++$errors;
- return;
- }
-
- my $prms = join " ", @parameterlist;
- check_sections($file, $declaration_name, "function", $sectcheck, $prms, "");
-
- output_declaration($declaration_name,
- 'function',
- {'function' => $declaration_name,
- 'module' => $modulename,
- 'functiontype' => $return_type,
- 'parameterlist' => \@parameterlist,
- 'parameterdescs' => \%parameterdescs,
- 'parametertypes' => \%parametertypes,
- 'sectionlist' => \@sectionlist,
- 'sections' => \%sections,
- 'purpose' => $declaration_purpose
- });
-}
-
-sub process_file($);
-
-# Read the file that maps relative names to absolute names for
-# separate source and object directories and for shadow trees.
-if (open(SOURCE_MAP, "<.tmp_filelist.txt")) {
- my ($relname, $absname);
- while(<SOURCE_MAP>) {
- chop();
- ($relname, $absname) = (split())[0..1];
- $relname =~ s:^/+::;
- $source_map{$relname} = $absname;
- }
- close(SOURCE_MAP);
-}
-
-if ($filelist) {
- open(FLIST,"<$filelist") or die "Can't open file list $filelist";
- while(<FLIST>) {
- chop;
- process_file($_);
- }
-}
-
-foreach (@ARGV) {
- chomp;
- process_file($_);
-}
-if ($verbose && $errors) {
- print STDERR "$errors errors\n";
-}
-if ($verbose && $warnings) {
- print STDERR "$warnings warnings\n";
-}
-
-exit($errors);
-
-sub reset_state {
- $function = "";
- %constants = ();
- %parameterdescs = ();
- %parametertypes = ();
- @parameterlist = ();
- %sections = ();
- @sectionlist = ();
- $sectcheck = "";
- $struct_actual = "";
- $prototype = "";
-
- $state = 0;
-}
-
-sub tracepoint_munge($) {
- my $file = shift;
- my $tracepointname = 0;
- my $tracepointargs = 0;
-
- if ($prototype =~ m/TRACE_EVENT\((.*?),/) {
- $tracepointname = $1;
- }
- if ($prototype =~ m/DEFINE_SINGLE_EVENT\((.*?),/) {
- $tracepointname = $1;
- }
- if ($prototype =~ m/DEFINE_EVENT\((.*?),(.*?),/) {
- $tracepointname = $2;
- }
- $tracepointname =~ s/^\s+//; #strip leading whitespace
- if ($prototype =~ m/TP_PROTO\((.*?)\)/) {
- $tracepointargs = $1;
- }
- if (($tracepointname eq 0) || ($tracepointargs eq 0)) {
- print STDERR "Warning(${file}:$.): Unrecognized tracepoint format: \n".
- "$prototype\n";
- } else {
- $prototype = "static inline void trace_$tracepointname($tracepointargs)";
- }
-}
-
-sub syscall_munge() {
- my $void = 0;
-
- $prototype =~ s@[\r\n\t]+@ @gos; # strip newlines/CR's/tabs
-## if ($prototype =~ m/SYSCALL_DEFINE0\s*\(\s*(a-zA-Z0-9_)*\s*\)/) {
- if ($prototype =~ m/SYSCALL_DEFINE0/) {
- $void = 1;
-## $prototype = "long sys_$1(void)";
- }
-
- $prototype =~ s/SYSCALL_DEFINE.*\(/long sys_/; # fix return type & func name
- if ($prototype =~ m/long (sys_.*?),/) {
- $prototype =~ s/,/\(/;
- } elsif ($void) {
- $prototype =~ s/\)/\(void\)/;
- }
-
- # now delete all of the odd-number commas in $prototype
- # so that arg types & arg names don't have a comma between them
- my $count = 0;
- my $len = length($prototype);
- if ($void) {
- $len = 0; # skip the for-loop
- }
- for (my $ix = 0; $ix < $len; $ix++) {
- if (substr($prototype, $ix, 1) eq ',') {
- $count++;
- if ($count % 2 == 1) {
- substr($prototype, $ix, 1) = ' ';
- }
- }
- }
-}
-
-sub process_state3_function($$) {
- my $x = shift;
- my $file = shift;
-
- $x =~ s@\/\/.*$@@gos; # strip C99-style comments to end of line
-
- if ($x =~ m#\s*/\*\s+MACDOC\s*#io || ($x =~ /^#/ && $x !~ /^#\s*define/)) {
- # do nothing
- }
- elsif ($x =~ /([^\{]*)/) {
- $prototype .= $1;
- }
-
- if (($x =~ /\{/) || ($x =~ /\#\s*define/) || ($x =~ /;/)) {
- $prototype =~ s@/\*.*?\*/@@gos; # strip comments.
- $prototype =~ s@[\r\n]+@ @gos; # strip newlines/cr's.
- $prototype =~ s@^\s+@@gos; # strip leading spaces
- if ($prototype =~ /SYSCALL_DEFINE/) {
- syscall_munge();
- }
- if ($prototype =~ /TRACE_EVENT/ || $prototype =~ /DEFINE_EVENT/ ||
- $prototype =~ /DEFINE_SINGLE_EVENT/)
- {
- tracepoint_munge($file);
- }
- dump_function($prototype, $file);
- reset_state();
- }
-}
-
-sub process_state3_type($$) {
- my $x = shift;
- my $file = shift;
-
- $x =~ s@[\r\n]+@ @gos; # strip newlines/cr's.
- $x =~ s@^\s+@@gos; # strip leading spaces
- $x =~ s@\s+$@@gos; # strip trailing spaces
- $x =~ s@\/\/.*$@@gos; # strip C99-style comments to end of line
-
- if ($x =~ /^#/) {
- # To distinguish preprocessor directive from regular declaration later.
- $x .= ";";
- }
-
- while (1) {
- if ( $x =~ /([^{};]*)([{};])(.*)/ ) {
- $prototype .= $1 . $2;
- ($2 eq '{') && $brcount++;
- ($2 eq '}') && $brcount--;
- if (($2 eq ';') && ($brcount == 0)) {
- dump_declaration($prototype, $file);
- reset_state();
- last;
- }
- $x = $3;
- } else {
- $prototype .= $x;
- last;
- }
- }
-}
-
-# xml_escape: replace <, >, and & in the text stream;
-#
-# however, formatting controls that are generated internally/locally in the
-# kernel-doc script are not escaped here; instead, they begin life like
-# $blankline_html (4 of '\' followed by a mnemonic + ':'), then these strings
-# are converted to their mnemonic-expected output, without the 4 * '\' & ':',
-# just before actual output; (this is done by local_unescape())
-sub xml_escape($) {
- my $text = shift;
- if (($output_mode eq "text") || ($output_mode eq "man")) {
- return $text;
- }
- $text =~ s/\&/\\\\\\amp;/g;
- $text =~ s/\</\\\\\\lt;/g;
- $text =~ s/\>/\\\\\\gt;/g;
- return $text;
-}
-
-# convert local escape strings to html
-# local escape strings look like: '\\\\menmonic:' (that's 4 backslashes)
-sub local_unescape($) {
- my $text = shift;
- if (($output_mode eq "text") || ($output_mode eq "man")) {
- return $text;
- }
- $text =~ s/\\\\\\\\lt:/</g;
- $text =~ s/\\\\\\\\gt:/>/g;
- return $text;
-}
-
-sub process_file($) {
- my $file;
- my $identifier;
- my $func;
- my $descr;
- my $in_purpose = 0;
- my $initial_section_counter = $section_counter;
-
- if (defined($ENV{'SRCTREE'})) {
- $file = "$ENV{'SRCTREE'}" . "/" . "@_";
- }
- else {
- $file = "@_";
- }
- if (defined($source_map{$file})) {
- $file = $source_map{$file};
- }
-
- if (!open(IN,"<$file")) {
- print STDERR "Error: Cannot open file $file\n";
- ++$errors;
- return;
- }
-
- $section_counter = 0;
- while (<IN>) {
- if ($state == 0) {
- if (/$doc_start/o) {
- $state = 1; # next line is always the function name
- $in_doc_sect = 0;
- }
- } elsif ($state == 1) { # this line is the function name (always)
- if (/$doc_block/o) {
- $state = 4;
- $contents = "";
- if ( $1 eq "" ) {
- $section = $section_intro;
- } else {
- $section = $1;
- }
- }
- elsif (/$doc_decl/o) {
- $identifier = $1;
- if (/\s*([\w\s]+?)\s*-/) {
- $identifier = $1;
- }
-
- $state = 2;
- if (/-(.*)/) {
- # strip leading/trailing/multiple spaces
- $descr= $1;
- $descr =~ s/^\s*//;
- $descr =~ s/\s*$//;
- $descr =~ s/\s+/ /;
- $declaration_purpose = xml_escape($descr);
- $in_purpose = 1;
- } else {
- $declaration_purpose = "";
- }
-
- if (($declaration_purpose eq "") && $verbose) {
- print STDERR "Warning(${file}:$.): missing initial short description on line:\n";
- print STDERR $_;
- ++$warnings;
- }
-
- if ($identifier =~ m/^struct/) {
- $decl_type = 'struct';
- } elsif ($identifier =~ m/^union/) {
- $decl_type = 'union';
- } elsif ($identifier =~ m/^enum/) {
- $decl_type = 'enum';
- } elsif ($identifier =~ m/^typedef/) {
- $decl_type = 'typedef';
- } else {
- $decl_type = 'function';
- }
-
- if ($verbose) {
- print STDERR "Info(${file}:$.): Scanning doc for $identifier\n";
- }
- } else {
- print STDERR "Warning(${file}:$.): Cannot understand $_ on line $.",
- " - I thought it was a doc line\n";
- ++$warnings;
- $state = 0;
- }
- } elsif ($state == 2) { # look for head: lines, and include content
- if (/$doc_sect/o) {
- $newsection = $1;
- $newcontents = $2;
-
- if (($contents ne "") && ($contents ne "\n")) {
- if (!$in_doc_sect && $verbose) {
- print STDERR "Warning(${file}:$.): contents before sections\n";
- ++$warnings;
- }
- dump_section($file, $section, xml_escape($contents));
- $section = $section_default;
- }
-
- $in_doc_sect = 1;
- $in_purpose = 0;
- $contents = $newcontents;
- if ($contents ne "") {
- while ((substr($contents, 0, 1) eq " ") ||
- substr($contents, 0, 1) eq "\t") {
- $contents = substr($contents, 1);
- }
- $contents .= "\n";
- }
- $section = $newsection;
- } elsif (/$doc_end/) {
-
- if ($contents ne "") {
- dump_section($file, $section, xml_escape($contents));
- $section = $section_default;
- $contents = "";
- }
- # look for doc_com + <text> + doc_end:
- if ($_ =~ m'\s*\*\s*[a-zA-Z_0-9:\.]+\*/') {
- print STDERR "Warning(${file}:$.): suspicious ending line: $_";
- ++$warnings;
- }
-
- $prototype = "";
- $state = 3;
- $brcount = 0;
-# print STDERR "end of doc comment, looking for prototype\n";
- } elsif (/$doc_content/) {
- # miguel-style comment kludge, look for blank lines after
- # @parameter line to signify start of description
- if ($1 eq "") {
- if ($section =~ m/^@/ || $section eq $section_context) {
- dump_section($file, $section, xml_escape($contents));
- $section = $section_default;
- $contents = "";
- } else {
- $contents .= "\n";
- }
- $in_purpose = 0;
- } elsif ($in_purpose == 1) {
- # Continued declaration purpose
- chomp($declaration_purpose);
- $declaration_purpose .= " " . xml_escape($1);
- } else {
- $contents .= $1 . "\n";
- }
- } else {
- # i dont know - bad line? ignore.
- print STDERR "Warning(${file}:$.): bad line: $_";
- ++$warnings;
- }
- } elsif ($state == 3) { # scanning for function '{' (end of prototype)
- if ($decl_type eq 'function') {
- process_state3_function($_, $file);
- } else {
- process_state3_type($_, $file);
- }
- } elsif ($state == 4) {
- # Documentation block
- if (/$doc_block/) {
- dump_doc_section($file, $section, xml_escape($contents));
- $contents = "";
- $function = "";
- %constants = ();
- %parameterdescs = ();
- %parametertypes = ();
- @parameterlist = ();
- %sections = ();
- @sectionlist = ();
- $prototype = "";
- if ( $1 eq "" ) {
- $section = $section_intro;
- } else {
- $section = $1;
- }
- }
- elsif (/$doc_end/)
- {
- dump_doc_section($file, $section, xml_escape($contents));
- $contents = "";
- $function = "";
- %constants = ();
- %parameterdescs = ();
- %parametertypes = ();
- @parameterlist = ();
- %sections = ();
- @sectionlist = ();
- $prototype = "";
- $state = 0;
- }
- elsif (/$doc_content/)
- {
- if ( $1 eq "" )
- {
- $contents .= $blankline;
- }
- else
- {
- $contents .= $1 . "\n";
- }
- }
- }
- }
- if ($initial_section_counter == $section_counter) {
- print STDERR "Warning(${file}): no structured comments found\n";
- if ($output_mode eq "xml") {
- # The template wants at least one RefEntry here; make one.
- print "<refentry>\n";
- print " <refnamediv>\n";
- print " <refname>\n";
- print " ${file}\n";
- print " </refname>\n";
- print " <refpurpose>\n";
- print " Document generation inconsistency\n";
- print " </refpurpose>\n";
- print " </refnamediv>\n";
- print " <refsect1>\n";
- print " <title>\n";
- print " Oops\n";
- print " </title>\n";
- print " <warning>\n";
- print " <para>\n";
- print " The template for this document tried to insert\n";
- print " the structured comment from the file\n";
- print " <filename>${file}</filename> at this point,\n";
- print " but none was found.\n";
- print " This dummy section is inserted to allow\n";
- print " generation to continue.\n";
- print " </para>\n";
- print " </warning>\n";
- print " </refsect1>\n";
- print "</refentry>\n";
- }
- }
-}
* For conditions of distribution and use, see copyright notice in zlib.h\r
*/\r
\r
-/* @(#) $Id$ */\r
+/* \param (#) $Id$ */\r
\r
#include "zutil.h"\r
\r
* For conditions of distribution and use, see copyright notice in zlib.h\r
*/\r
\r
-/* @(#) $Id$ */\r
+/* \param (#) $Id$ */\r
\r
#define ZLIB_INTERNAL\r
#include "zlib.h"\r
* factor of two increase in speed on a Power PC G4 (PPC7455) using gcc -O3.\r
*/\r
\r
-/* @(#) $Id$ */\r
+/* \param (#) $Id$ */\r
\r
/*\r
Note on the use of DYNAMIC_CRC_TABLE: there is no mutex or semaphore\r
*\r
*/\r
\r
-/* @(#) $Id$ */\r
+/* \param (#) $Id$ */\r
\r
#include "deflate.h"\r
\r
subject to change. Applications should only use zlib.h.\r
*/\r
\r
-/* @(#) $Id$ */\r
+/* \param (#) $Id$ */\r
\r
#ifndef DEFLATE_H\r
#define DEFLATE_H\r
* Compile this file with -DNO_GZCOMPRESS to avoid the compression code.\r
*/\r
\r
-/* @(#) $Id$ */\r
+/* \param (#) $Id$ */\r
\r
#include <stdio.h>\r
\r
* Addison-Wesley, 1983. ISBN 0-201-06672-6.\r
*/\r
\r
-/* @(#) $Id$ */\r
+/* \param (#) $Id$ */\r
\r
/* #define GEN_TREES_H */\r
\r
* For conditions of distribution and use, see copyright notice in zlib.h\r
*/\r
\r
-/* @(#) $Id$ */\r
+/* \param (#) $Id$ */\r
\r
#define ZLIB_INTERNAL\r
#include "zlib.h"\r
* For conditions of distribution and use, see copyright notice in zlib.h\r
*/\r
\r
-/* @(#) $Id$ */\r
+/* \param (#) $Id$ */\r
\r
#ifndef ZCONF_H\r
#define ZCONF_H\r
* For conditions of distribution and use, see copyright notice in zlib.h\r
*/\r
\r
-/* @(#) $Id$ */\r
+/* \param (#) $Id$ */\r
\r
#include "zutil.h"\r
\r
subject to change. Applications should only use zlib.h.\r
*/\r
\r
-/* @(#) $Id$ */\r
+/* \param (#) $Id$ */\r
\r
#ifndef ZUTIL_H\r
#define ZUTIL_H\r