basic-auth
authorAndy Green <andy@warmcat.com>
Sat, 3 Dec 2016 07:13:15 +0000 (15:13 +0800)
committerAndy Green <andy@warmcat.com>
Fri, 16 Dec 2016 14:08:13 +0000 (22:08 +0800)
32 files changed:
CMakeLists.txt
README.lwsws.md
doc/html/functions.html
doc/html/functions_vars.html
doc/html/group__client.html
doc/html/group__form-parsing.html
doc/html/group__sending-data.html
doc/html/group__smtp.html
doc/html/group__vhost-mounts.js
doc/html/libwebsockets_8h_source.html
doc/html/md_README_8build.html [new file with mode: 0644]
doc/html/md_README_8coding.html [new file with mode: 0644]
doc/html/md_README_8generic-sessions.html [new file with mode: 0644]
doc/html/md_README_8generic-table.html [new file with mode: 0644]
doc/html/md_README_8lwsws.html [new file with mode: 0644]
doc/html/md_README_8problems.html [new file with mode: 0644]
doc/html/md_README_8test-apps.html [new file with mode: 0644]
doc/html/menu.js [new file with mode: 0644]
doc/html/menudata.js [new file with mode: 0644]
doc/html/navtreedata.js
doc/html/navtreeindex0.js
doc/html/navtreeindex1.js
doc/html/navtreeindex2.js
doc/html/navtreeindex3.js
doc/html/navtreeindex4.js
doc/html/structlws__http__mount.html
doc/html/structlws__http__mount.js
lib/lejp-conf.c
lib/libwebsockets.h
lib/server.c
test-server/private/index.html [new file with mode: 0644]
test-server/test-server-v2.0.c

index 0fa36c1..0b9e273 100644 (file)
@@ -1512,6 +1512,10 @@ endif()
 if (NOT LWS_WITHOUT_TESTAPPS AND NOT LWS_WITHOUT_SERVER)
        install(FILES ${TEST_SERVER_DATA}
                        DESTINATION share/libwebsockets-test-server
+               COMPONENT examples)
+
+               install(FILES "${PROJECT_SOURCE_DIR}/test-server/private/index.html"
+                       DESTINATION share/libwebsockets-test-server/private
                        COMPONENT examples)
 if (LWS_WITH_CGI)
        set(CGI_TEST_SCRIPT "${PROJECT_SOURCE_DIR}/test-server/lws-cgi-test.sh")
index 5ea4a2a..da790be 100644 (file)
@@ -370,6 +370,36 @@ If you provide an extra mimetype entry
 Then any file is served, if the mimetype was not known then it is served without a
 Content-Type: header.
 
+7) A mount can be protected by HTTP Basic Auth.  This only makes sense when using
+https, since otherwise the password can be sniffed.
+
+You can add a `basic-auth` entry on a mount like this`
+
+```
+{
+        "mountpoint": "/basic-auth",
+        "origin": "file://_lws_ddir_/libwebsockets-test-server/private",
+        "basic-auth": "/var/www/balogins-private"
+}
+```
+
+Before serving anything, lws will signal to the browser that a username / password
+combination is required, and it will pop up a dialog.  When the user has filled it
+in, lwsws checks the user:password string against the text file named in the `basic-auth`
+entry.
+
+The file should contain user:pass one per line
+
+```
+testuser:testpass
+myuser:hispass
+```
+
+The file should be readable by lwsws, and for a little bit of extra security not
+have a file suffix, so lws would reject to serve it even if it could find it on
+a mount.
+
+
 @section lwswspl Lwsws Plugins
 
 Protcols and extensions may also be provided from "plugins", these are
index f608df6..e9f0570 100644 (file)
@@ -84,6 +84,9 @@ $(document).ready(function(){initNavTree('functions.html','');});
 
 
 <h3><a id="index_b"></a>- b -</h3><ul>
+<li>basic_auth_login_file
+: <a class="el" href="structlws__http__mount.html#a2f6c7dbc2d714b7259c67b7744d4ff98">lws_http_mount</a>
+</li>
 <li>bin
 : <a class="el" href="structlwsgw__hash__bin.html#ac92f50d9471058525d110597a4e0de6b">lwsgw_hash_bin</a>
 </li>
index c5615fd..d22e573 100644 (file)
@@ -84,6 +84,9 @@ $(document).ready(function(){initNavTree('functions_vars.html','');});
 
 
 <h3><a id="index_b"></a>- b -</h3><ul>
+<li>basic_auth_login_file
+: <a class="el" href="structlws__http__mount.html#a2f6c7dbc2d714b7259c67b7744d4ff98">lws_http_mount</a>
+</li>
 <li>bin
 : <a class="el" href="structlwsgw__hash__bin.html#ac92f50d9471058525d110597a4e0de6b">lwsgw_hash_bin</a>
 </li>
index ef3db81..cec5538 100644 (file)
@@ -119,7 +119,7 @@ LWS_VISIBLE LWS_EXTERN void&#160;</td><td class="memItemRight" valign="bottom"><
 
 <p><code>#include &lt;<a class="el" href="libwebsockets_8h.html">lib/libwebsockets.h</a>&gt;</code></p>
 <p>enum lws_client_connect_ssl_connection_flags - flags that may be used with struct <a class="el" href="structlws__client__connect__info.html">lws_client_connect_info</a> ssl_connection member to control if and how SSL checks apply to the client connection being created </p>
-<div class="fragment"><div class="line"><a name="l01983"></a><span class="lineno"> 1983</span>&#160;                                             {</div><div class="line"><a name="l01984"></a><span class="lineno"> 1984</span>&#160;        LCCSCF_USE_SSL                          = (1 &lt;&lt; 0),</div><div class="line"><a name="l01985"></a><span class="lineno"> 1985</span>&#160;        LCCSCF_ALLOW_SELFSIGNED                 = (1 &lt;&lt; 1),</div><div class="line"><a name="l01986"></a><span class="lineno"> 1986</span>&#160;        LCCSCF_SKIP_SERVER_CERT_HOSTNAME_CHECK  = (1 &lt;&lt; 2),</div><div class="line"><a name="l01987"></a><span class="lineno"> 1987</span>&#160;        LCCSCF_ALLOW_EXPIRED                    = (1 &lt;&lt; 3)</div><div class="line"><a name="l01988"></a><span class="lineno"> 1988</span>&#160;};</div></div><!-- fragment -->
+<div class="fragment"><div class="line"><a name="l01986"></a><span class="lineno"> 1986</span>&#160;                                             {</div><div class="line"><a name="l01987"></a><span class="lineno"> 1987</span>&#160;        LCCSCF_USE_SSL                          = (1 &lt;&lt; 0),</div><div class="line"><a name="l01988"></a><span class="lineno"> 1988</span>&#160;        LCCSCF_ALLOW_SELFSIGNED                 = (1 &lt;&lt; 1),</div><div class="line"><a name="l01989"></a><span class="lineno"> 1989</span>&#160;        LCCSCF_SKIP_SERVER_CERT_HOSTNAME_CHECK  = (1 &lt;&lt; 2),</div><div class="line"><a name="l01990"></a><span class="lineno"> 1990</span>&#160;        LCCSCF_ALLOW_EXPIRED                    = (1 &lt;&lt; 3)</div><div class="line"><a name="l01991"></a><span class="lineno"> 1991</span>&#160;};</div></div><!-- fragment -->
 </div>
 </div>
 <h2 class="groupheader">Function Documentation</h2>
index 51c0feb..0b3dfc3 100644 (file)
@@ -156,9 +156,9 @@ Functions</h2></td></tr>
 <tr><td class="fieldname"><a id="gga41a74a822771d3dce89751aa3bce28aea2d25de44865bd44e5a3903a2bab9ca83"></a>LWS_UFS_OPEN&#160;</td><td class="fielddoc"><p>a new file is starting to arrive </p>
 </td></tr>
 </table>
-<div class="fragment"><div class="line"><a name="l02825"></a><span class="lineno"> 2825</span>&#160;                               {</div><div class="line"><a name="l02826"></a><span class="lineno"> 2826</span>&#160;        <a class="code" href="group__form-parsing.html#gga41a74a822771d3dce89751aa3bce28aead3a958e7719ac273c3ba4f684f00c87f">LWS_UFS_CONTENT</a>,</div><div class="line"><a name="l02828"></a><span class="lineno"> 2828</span>&#160;        <a class="code" href="group__form-parsing.html#gga41a74a822771d3dce89751aa3bce28aea6ce2a55a4c3695cdb640c893d95bd3a7">LWS_UFS_FINAL_CONTENT</a>,</div><div class="line"><a name="l02830"></a><span class="lineno"> 2830</span>&#160;        <a class="code" href="group__form-parsing.html#gga41a74a822771d3dce89751aa3bce28aea2d25de44865bd44e5a3903a2bab9ca83">LWS_UFS_OPEN</a></div><div class="line"><a name="l02832"></a><span class="lineno"> 2832</span>&#160;};</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:2828</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:2830</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:2826</div></div>
+<div class="fragment"><div class="line"><a name="l02828"></a><span class="lineno"> 2828</span>&#160;                               {</div><div class="line"><a name="l02829"></a><span class="lineno"> 2829</span>&#160;        <a class="code" href="group__form-parsing.html#gga41a74a822771d3dce89751aa3bce28aead3a958e7719ac273c3ba4f684f00c87f">LWS_UFS_CONTENT</a>,</div><div class="line"><a name="l02831"></a><span class="lineno"> 2831</span>&#160;        <a class="code" href="group__form-parsing.html#gga41a74a822771d3dce89751aa3bce28aea6ce2a55a4c3695cdb640c893d95bd3a7">LWS_UFS_FINAL_CONTENT</a>,</div><div class="line"><a name="l02833"></a><span class="lineno"> 2833</span>&#160;        <a class="code" href="group__form-parsing.html#gga41a74a822771d3dce89751aa3bce28aea2d25de44865bd44e5a3903a2bab9ca83">LWS_UFS_OPEN</a></div><div class="line"><a name="l02835"></a><span class="lineno"> 2835</span>&#160;};</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:2831</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:2833</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:2829</div></div>
 </div><!-- fragment -->
 </div>
 </div>
index b299203..ae2bc06 100644 (file)
@@ -124,13 +124,13 @@ Functions</h2></td></tr>
 <tr><td class="fieldname"><a id="gga98b099cf8c1c7e38ad78501f270e193da220d8e8652d9b97fb66e476e2a60ffce"></a>LWS_WRITE_CLIENT_IGNORE_XOR_MASK&#160;</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="l03169"></a><span class="lineno"> 3169</span>&#160;                        {</div><div class="line"><a name="l03170"></a><span class="lineno"> 3170</span>&#160;        <a class="code" href="group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193da80e8f169fda236c56bfb795ed62903db">LWS_WRITE_TEXT</a>                                          = 0,</div><div class="line"><a name="l03174"></a><span class="lineno"> 3174</span>&#160;        <a class="code" href="group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193daf6486c0dba50c44198100717721d9ab2">LWS_WRITE_BINARY</a>                                        = 1,</div><div class="line"><a name="l03177"></a><span class="lineno"> 3177</span>&#160;        <a class="code" href="group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193da10047eb05b5e1c298151dc47a5b44826">LWS_WRITE_CONTINUATION</a>                                  = 2,</div><div class="line"><a name="l03180"></a><span class="lineno"> 3180</span>&#160;        <a class="code" href="group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193dabb6705e1d1327cdda5025be28f07712e">LWS_WRITE_HTTP</a>                                          = 3,</div><div class="line"><a name="l03183"></a><span class="lineno"> 3183</span>&#160;        <span class="comment">/* LWS_WRITE_CLOSE is handled by lws_close_reason() */</span></div><div class="line"><a name="l03184"></a><span class="lineno"> 3184</span>&#160;        LWS_WRITE_PING                                          = 5,</div><div class="line"><a name="l03185"></a><span class="lineno"> 3185</span>&#160;        LWS_WRITE_PONG                                          = 6,</div><div class="line"><a name="l03186"></a><span class="lineno"> 3186</span>&#160;</div><div class="line"><a name="l03187"></a><span class="lineno"> 3187</span>&#160;        <span class="comment">/* Same as write_http but we know this write ends the transaction */</span></div><div class="line"><a name="l03188"></a><span class="lineno"> 3188</span>&#160;        LWS_WRITE_HTTP_FINAL                                    = 7,</div><div class="line"><a name="l03189"></a><span class="lineno"> 3189</span>&#160;</div><div class="line"><a name="l03190"></a><span class="lineno"> 3190</span>&#160;        <span class="comment">/* HTTP2 */</span></div><div class="line"><a name="l03191"></a><span class="lineno"> 3191</span>&#160;</div><div class="line"><a name="l03192"></a><span class="lineno"> 3192</span>&#160;        <a class="code" href="group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193dafe5a38e940ce56708ac814627e9c0917">LWS_WRITE_HTTP_HEADERS</a>                                  = 8,</div><div class="line"><a name="l03199"></a><span class="lineno"> 3199</span>&#160;        <span class="comment">/****** add new things just above ---^ ******/</span></div><div class="line"><a name="l03200"></a><span class="lineno"> 3200</span>&#160;</div><div class="line"><a name="l03201"></a><span class="lineno"> 3201</span>&#160;        <span class="comment">/* flags */</span></div><div class="line"><a name="l03202"></a><span class="lineno"> 3202</span>&#160;</div><div class="line"><a name="l03203"></a><span class="lineno"> 3203</span>&#160;        <a class="code" href="group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193da115440f272a5d55518adfc8099acfee3">LWS_WRITE_NO_FIN</a> = 0x40,</div><div class="line"><a name="l03206"></a><span class="lineno"> 3206</span>&#160;        <a class="code" href="group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193da220d8e8652d9b97fb66e476e2a60ffce">LWS_WRITE_CLIENT_IGNORE_XOR_MASK</a> = 0x80</div><div class="line"><a name="l03210"></a><span class="lineno"> 3210</span>&#160;};</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:3180</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:3203</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:3170</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:3174</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:3206</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:3177</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:3192</div></div>
+<div class="fragment"><div class="line"><a name="l03172"></a><span class="lineno"> 3172</span>&#160;                        {</div><div class="line"><a name="l03173"></a><span class="lineno"> 3173</span>&#160;        <a class="code" href="group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193da80e8f169fda236c56bfb795ed62903db">LWS_WRITE_TEXT</a>                                          = 0,</div><div class="line"><a name="l03177"></a><span class="lineno"> 3177</span>&#160;        <a class="code" href="group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193daf6486c0dba50c44198100717721d9ab2">LWS_WRITE_BINARY</a>                                        = 1,</div><div class="line"><a name="l03180"></a><span class="lineno"> 3180</span>&#160;        <a class="code" href="group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193da10047eb05b5e1c298151dc47a5b44826">LWS_WRITE_CONTINUATION</a>                                  = 2,</div><div class="line"><a name="l03183"></a><span class="lineno"> 3183</span>&#160;        <a class="code" href="group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193dabb6705e1d1327cdda5025be28f07712e">LWS_WRITE_HTTP</a>                                          = 3,</div><div class="line"><a name="l03186"></a><span class="lineno"> 3186</span>&#160;        <span class="comment">/* LWS_WRITE_CLOSE is handled by lws_close_reason() */</span></div><div class="line"><a name="l03187"></a><span class="lineno"> 3187</span>&#160;        LWS_WRITE_PING                                          = 5,</div><div class="line"><a name="l03188"></a><span class="lineno"> 3188</span>&#160;        LWS_WRITE_PONG                                          = 6,</div><div class="line"><a name="l03189"></a><span class="lineno"> 3189</span>&#160;</div><div class="line"><a name="l03190"></a><span class="lineno"> 3190</span>&#160;        <span class="comment">/* Same as write_http but we know this write ends the transaction */</span></div><div class="line"><a name="l03191"></a><span class="lineno"> 3191</span>&#160;        LWS_WRITE_HTTP_FINAL                                    = 7,</div><div class="line"><a name="l03192"></a><span class="lineno"> 3192</span>&#160;</div><div class="line"><a name="l03193"></a><span class="lineno"> 3193</span>&#160;        <span class="comment">/* HTTP2 */</span></div><div class="line"><a name="l03194"></a><span class="lineno"> 3194</span>&#160;</div><div class="line"><a name="l03195"></a><span class="lineno"> 3195</span>&#160;        <a class="code" href="group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193dafe5a38e940ce56708ac814627e9c0917">LWS_WRITE_HTTP_HEADERS</a>                                  = 8,</div><div class="line"><a name="l03202"></a><span class="lineno"> 3202</span>&#160;        <span class="comment">/****** add new things just above ---^ ******/</span></div><div class="line"><a name="l03203"></a><span class="lineno"> 3203</span>&#160;</div><div class="line"><a name="l03204"></a><span class="lineno"> 3204</span>&#160;        <span class="comment">/* flags */</span></div><div class="line"><a name="l03205"></a><span class="lineno"> 3205</span>&#160;</div><div class="line"><a name="l03206"></a><span class="lineno"> 3206</span>&#160;        <a class="code" href="group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193da115440f272a5d55518adfc8099acfee3">LWS_WRITE_NO_FIN</a> = 0x40,</div><div class="line"><a name="l03209"></a><span class="lineno"> 3209</span>&#160;        <a class="code" href="group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193da220d8e8652d9b97fb66e476e2a60ffce">LWS_WRITE_CLIENT_IGNORE_XOR_MASK</a> = 0x80</div><div class="line"><a name="l03213"></a><span class="lineno"> 3213</span>&#160;};</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:3183</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:3206</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:3173</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:3177</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:3209</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:3180</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:3195</div></div>
 </div><!-- fragment -->
 </div>
 </div>
index d8d5acc..6629148 100644 (file)
@@ -149,15 +149,15 @@ Functions</h2></td></tr>
 <tr><td class="fieldname"><a id="gga116be79bf44f9dc2a97f46e051fe4dc0a2c2ed16ffc572326e3040684084b21d5"></a>LGSSMTP_SENT_QUIT&#160;</td><td class="fielddoc"><p>sent the session quit </p>
 </td></tr>
 </table>
-<div class="fragment"><div class="line"><a name="l04124"></a><span class="lineno"> 4124</span>&#160;                       {</div><div class="line"><a name="l04125"></a><span class="lineno"> 4125</span>&#160;        <a class="code" href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a29e5b0ecf75375b5a643faa3d6222b7c">LGSSMTP_IDLE</a>, </div><div class="line"><a name="l04126"></a><span class="lineno"> 4126</span>&#160;        <a class="code" href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0ab89442b7a3ca2b94c3cdcf33756eb933">LGSSMTP_CONNECTING</a>, </div><div class="line"><a name="l04127"></a><span class="lineno"> 4127</span>&#160;        <a class="code" href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0ab61778f70ecac007b334bb14942eb41d">LGSSMTP_CONNECTED</a>, </div><div class="line"><a name="l04128"></a><span class="lineno"> 4128</span>&#160;        <a class="code" href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a1dfec948a864205cec875f63cbe0d4ad">LGSSMTP_SENT_HELO</a>, </div><div class="line"><a name="l04129"></a><span class="lineno"> 4129</span>&#160;        <a class="code" href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a929bb4623ff3f585108aba2a1b047fab">LGSSMTP_SENT_FROM</a>, </div><div class="line"><a name="l04130"></a><span class="lineno"> 4130</span>&#160;        <a class="code" href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0aae20a0cb95b97a70f6b45d0ed2d5be83">LGSSMTP_SENT_TO</a>, </div><div class="line"><a name="l04131"></a><span class="lineno"> 4131</span>&#160;        <a class="code" href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a85e3c452950c09a79086bff4b9be5c14">LGSSMTP_SENT_DATA</a>, </div><div class="line"><a name="l04132"></a><span class="lineno"> 4132</span>&#160;        <a class="code" href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a38fba41f28d754e38079b31418a86a69">LGSSMTP_SENT_BODY</a>, </div><div class="line"><a name="l04133"></a><span class="lineno"> 4133</span>&#160;        <a class="code" href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a2c2ed16ffc572326e3040684084b21d5">LGSSMTP_SENT_QUIT</a>, </div><div class="line"><a name="l04134"></a><span class="lineno"> 4134</span>&#160;};</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:4127</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:4132</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:4125</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:4126</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:4130</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:4129</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:4133</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:4128</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:4131</div></div>
+<div class="fragment"><div class="line"><a name="l04127"></a><span class="lineno"> 4127</span>&#160;                       {</div><div class="line"><a name="l04128"></a><span class="lineno"> 4128</span>&#160;        <a class="code" href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a29e5b0ecf75375b5a643faa3d6222b7c">LGSSMTP_IDLE</a>, </div><div class="line"><a name="l04129"></a><span class="lineno"> 4129</span>&#160;        <a class="code" href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0ab89442b7a3ca2b94c3cdcf33756eb933">LGSSMTP_CONNECTING</a>, </div><div class="line"><a name="l04130"></a><span class="lineno"> 4130</span>&#160;        <a class="code" href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0ab61778f70ecac007b334bb14942eb41d">LGSSMTP_CONNECTED</a>, </div><div class="line"><a name="l04131"></a><span class="lineno"> 4131</span>&#160;        <a class="code" href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a1dfec948a864205cec875f63cbe0d4ad">LGSSMTP_SENT_HELO</a>, </div><div class="line"><a name="l04132"></a><span class="lineno"> 4132</span>&#160;        <a class="code" href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a929bb4623ff3f585108aba2a1b047fab">LGSSMTP_SENT_FROM</a>, </div><div class="line"><a name="l04133"></a><span class="lineno"> 4133</span>&#160;        <a class="code" href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0aae20a0cb95b97a70f6b45d0ed2d5be83">LGSSMTP_SENT_TO</a>, </div><div class="line"><a name="l04134"></a><span class="lineno"> 4134</span>&#160;        <a class="code" href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a85e3c452950c09a79086bff4b9be5c14">LGSSMTP_SENT_DATA</a>, </div><div class="line"><a name="l04135"></a><span class="lineno"> 4135</span>&#160;        <a class="code" href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a38fba41f28d754e38079b31418a86a69">LGSSMTP_SENT_BODY</a>, </div><div class="line"><a name="l04136"></a><span class="lineno"> 4136</span>&#160;        <a class="code" href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a2c2ed16ffc572326e3040684084b21d5">LGSSMTP_SENT_QUIT</a>, </div><div class="line"><a name="l04137"></a><span class="lineno"> 4137</span>&#160;};</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:4130</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:4135</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:4128</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:4129</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:4133</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:4132</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:4136</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:4131</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:4134</div></div>
 </div><!-- fragment -->
 </div>
 </div>
index 8a0fe07..1a4b064 100644 (file)
@@ -8,6 +8,7 @@ var group__vhost_mounts =
     ] ],
     [ "lws_http_mount", "structlws__http__mount.html", [
       [ "auth_mask", "structlws__http__mount.html#a614364c770b0bd4db464ad65cddab477", null ],
+      [ "basic_auth_login_file", "structlws__http__mount.html#a2f6c7dbc2d714b7259c67b7744d4ff98", 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 ],
index a83717f..b043814 100644 (file)
@@ -64,9 +64,9 @@ $(document).ready(function(){initNavTree('libwebsockets_8h_source.html','');});
 <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>&#160;<span class="comment">/*</span></div><div class="line"><a name="l00002"></a><span class="lineno">    2</span>&#160;<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>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00004"></a><span class="lineno">    4</span>&#160;<span class="comment"> * Copyright (C) 2010-2016 Andy Green &lt;andy@warmcat.com&gt;</span></div><div class="line"><a name="l00005"></a><span class="lineno">    5</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00006"></a><span class="lineno">    6</span>&#160;<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>&#160;<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>&#160;<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>&#160;<span class="comment"> *  version 2.1 of the License.</span></div><div class="line"><a name="l00010"></a><span class="lineno">   10</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00011"></a><span class="lineno">   11</span>&#160;<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>&#160;<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>&#160;<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>&#160;<span class="comment"> *  Lesser General Public License for more details.</span></div><div class="line"><a name="l00015"></a><span class="lineno">   15</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00016"></a><span class="lineno">   16</span>&#160;<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>&#160;<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>&#160;<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>&#160;<span class="comment"> *  MA  02110-1301  USA</span></div><div class="line"><a name="l00020"></a><span class="lineno">   20</span>&#160;<span class="comment"> */</span></div><div class="line"><a name="l00021"></a><span class="lineno">   21</span>&#160;</div><div class="line"><a name="l00024"></a><span class="lineno">   24</span>&#160;<span class="preprocessor">#ifndef LIBWEBSOCKET_H_3060898B846849FF9F88F5DB59B5950C</span></div><div class="line"><a name="l00025"></a><span class="lineno">   25</span>&#160;<span class="preprocessor">#define LIBWEBSOCKET_H_3060898B846849FF9F88F5DB59B5950C</span></div><div class="line"><a name="l00026"></a><span class="lineno">   26</span>&#160;</div><div class="line"><a name="l00027"></a><span class="lineno">   27</span>&#160;<span class="preprocessor">#ifdef __cplusplus</span></div><div class="line"><a name="l00028"></a><span class="lineno">   28</span>&#160;<span class="preprocessor">#include &lt;cstddef&gt;</span></div><div class="line"><a name="l00029"></a><span class="lineno">   29</span>&#160;<span class="preprocessor">#include &lt;cstdarg&gt;</span></div><div class="line"><a name="l00030"></a><span class="lineno">   30</span>&#160;<span class="preprocessor">#ifdef MBED_OPERATORS</span></div><div class="line"><a name="l00031"></a><span class="lineno">   31</span>&#160;<span class="preprocessor">#include &quot;mbed-drivers/mbed.h&quot;</span></div><div class="line"><a name="l00032"></a><span class="lineno">   32</span>&#160;<span class="preprocessor">#include &quot;sal-iface-eth/EthernetInterface.h&quot;</span></div><div class="line"><a name="l00033"></a><span class="lineno">   33</span>&#160;<span class="preprocessor">#include &quot;sockets/TCPListener.h&quot;</span></div><div class="line"><a name="l00034"></a><span class="lineno">   34</span>&#160;<span class="preprocessor">#include &quot;sal-stack-lwip/lwipv4_init.h&quot;</span></div><div class="line"><a name="l00035"></a><span class="lineno">   35</span>&#160;</div><div class="line"><a name="l00036"></a><span class="lineno">   36</span>&#160;<span class="keyword">namespace </span>{</div><div class="line"><a name="l00037"></a><span class="lineno">   37</span>&#160;}</div><div class="line"><a name="l00038"></a><span class="lineno">   38</span>&#160;<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>&#160;</div><div class="line"><a name="l00040"></a><span class="lineno">   40</span>&#160;</div><div class="line"><a name="l00041"></a><span class="lineno">   41</span>&#160;<span class="keyword">struct </span>sockaddr_in;</div><div class="line"><a name="l00042"></a><span class="lineno">   42</span>&#160;<span class="keyword">struct </span>lws;</div><div class="line"><a name="l00043"></a><span class="lineno">   43</span>&#160;</div><div class="line"><a name="l00044"></a><span class="lineno"><a class="line" href="classlws__conn.html">   44</a></span>&#160;<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>&#160;        <span class="keyword">public</span>:</div><div class="line"><a name="l00046"></a><span class="lineno">   46</span>&#160;        <a class="code" href="classlws__conn.html">lws_conn</a>():</div><div class="line"><a name="l00047"></a><span class="lineno">   47</span>&#160;                ts(NULL),</div><div class="line"><a name="l00048"></a><span class="lineno">   48</span>&#160;                wsi(NULL),</div><div class="line"><a name="l00049"></a><span class="lineno">   49</span>&#160;                writeable(1),</div><div class="line"><a name="l00050"></a><span class="lineno">   50</span>&#160;                awaiting_on_writeable(0)</div><div class="line"><a name="l00051"></a><span class="lineno">   51</span>&#160;        {</div><div class="line"><a name="l00052"></a><span class="lineno">   52</span>&#160;        }</div><div class="line"><a name="l00053"></a><span class="lineno">   53</span>&#160;</div><div class="line"><a name="l00054"></a><span class="lineno">   54</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l00055"></a><span class="lineno">   55</span>&#160;        <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>&#160;        <span class="keywordtype">int</span> actual_onRX(Socket *s);</div><div class="line"><a name="l00057"></a><span class="lineno">   57</span>&#160;        <span class="keywordtype">void</span> onRX(Socket *s);</div><div class="line"><a name="l00058"></a><span class="lineno">   58</span>&#160;        <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>&#160;        <span class="keywordtype">void</span> onDisconnect(TCPStream *s);</div><div class="line"><a name="l00060"></a><span class="lineno">   60</span>&#160;        <span class="keywordtype">void</span> onSent(Socket *s, uint16_t len);</div><div class="line"><a name="l00061"></a><span class="lineno">   61</span>&#160;        <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>&#160;</div><div class="line"><a name="l00063"></a><span class="lineno">   63</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l00064"></a><span class="lineno">   64</span>&#160;        TCPStream *ts;</div><div class="line"><a name="l00065"></a><span class="lineno">   65</span>&#160;</div><div class="line"><a name="l00066"></a><span class="lineno">   66</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l00067"></a><span class="lineno">   67</span>&#160;        <span class="keyword">struct </span>lws *wsi;</div><div class="line"><a name="l00068"></a><span class="lineno">   68</span>&#160;        <span class="keywordtype">char</span> writeable;</div><div class="line"><a name="l00069"></a><span class="lineno">   69</span>&#160;        <span class="keywordtype">char</span> awaiting_on_writeable;</div><div class="line"><a name="l00070"></a><span class="lineno">   70</span>&#160;};</div><div class="line"><a name="l00071"></a><span class="lineno">   71</span>&#160;</div><div class="line"><a name="l00072"></a><span class="lineno"><a class="line" href="classlws__conn__listener.html">   72</a></span>&#160;<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>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l00074"></a><span class="lineno">   74</span>&#160;        <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>&#160;                srv(SOCKET_STACK_LWIP_IPV4)</div><div class="line"><a name="l00076"></a><span class="lineno">   76</span>&#160;        {</div><div class="line"><a name="l00077"></a><span class="lineno">   77</span>&#160;                srv.setOnError(TCPStream::ErrorHandler_t(<span class="keyword">this</span>,</div><div class="line"><a name="l00078"></a><span class="lineno">   78</span>&#160;                                &amp;<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>&#160;        }</div><div class="line"><a name="l00080"></a><span class="lineno">   80</span>&#160;</div><div class="line"><a name="l00081"></a><span class="lineno">   81</span>&#160;        <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>&#160;<span class="keyword">protected</span>:</div><div class="line"><a name="l00084"></a><span class="lineno">   84</span>&#160;        <span class="keywordtype">void</span> onRX(Socket *s); </div><div class="line"><a name="l00085"></a><span class="lineno">   85</span>&#160;        <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>&#160;        <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>&#160;        <span class="keywordtype">void</span> onDisconnect(TCPStream *s); </div><div class="line"><a name="l00089"></a><span class="lineno">   89</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l00090"></a><span class="lineno">   90</span>&#160;        TCPListener srv;</div><div class="line"><a name="l00091"></a><span class="lineno">   91</span>&#160;};</div><div class="line"><a name="l00092"></a><span class="lineno">   92</span>&#160;</div><div class="line"><a name="l00093"></a><span class="lineno">   93</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l00094"></a><span class="lineno">   94</span>&#160;</div><div class="line"><a name="l00095"></a><span class="lineno">   95</span>&#160;<span class="keyword">extern</span> <span class="stringliteral">&quot;C&quot;</span> {</div><div class="line"><a name="l00096"></a><span class="lineno">   96</span>&#160;<span class="preprocessor">#else</span></div><div class="line"><a name="l00097"></a><span class="lineno">   97</span>&#160;<span class="preprocessor">#include &lt;stdarg.h&gt;</span></div><div class="line"><a name="l00098"></a><span class="lineno">   98</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l00099"></a><span class="lineno">   99</span>&#160;</div><div class="line"><a name="l00100"></a><span class="lineno">  100</span>&#160;<span class="preprocessor">#if defined(MBED_OPERATORS) || defined(LWS_WITH_ESP8266)</span></div><div class="line"><a name="l00101"></a><span class="lineno">  101</span>&#160;<span class="keyword">struct </span>sockaddr_in;</div><div class="line"><a name="l00102"></a><span class="lineno">  102</span>&#160;<span class="preprocessor">#define LWS_POSIX 0</span></div><div class="line"><a name="l00103"></a><span class="lineno">  103</span>&#160;<span class="preprocessor">#else</span></div><div class="line"><a name="l00104"></a><span class="lineno">  104</span>&#160;<span class="preprocessor">#define LWS_POSIX 1</span></div><div class="line"><a name="l00105"></a><span class="lineno">  105</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l00106"></a><span class="lineno">  106</span>&#160;</div><div class="line"><a name="l00107"></a><span class="lineno">  107</span>&#160;<span class="preprocessor">#include &quot;lws_config.h&quot;</span></div><div class="line"><a name="l00108"></a><span class="lineno">  108</span>&#160;</div><div class="line"><a name="l00109"></a><span class="lineno">  109</span>&#160;<span class="preprocessor">#if defined(WIN32) || defined(_WIN32)</span></div><div class="line"><a name="l00110"></a><span class="lineno">  110</span>&#160;<span class="preprocessor">#ifndef WIN32_LEAN_AND_MEAN</span></div><div class="line"><a name="l00111"></a><span class="lineno">  111</span>&#160;<span class="preprocessor">#define WIN32_LEAN_AND_MEAN</span></div><div class="line"><a name="l00112"></a><span class="lineno">  112</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l00113"></a><span class="lineno">  113</span>&#160;</div><div class="line"><a name="l00114"></a><span class="lineno">  114</span>&#160;<span class="preprocessor">#include &lt;winsock2.h&gt;</span></div><div class="line"><a name="l00115"></a><span class="lineno">  115</span>&#160;<span class="preprocessor">#include &lt;ws2tcpip.h&gt;</span></div><div class="line"><a name="l00116"></a><span class="lineno">  116</span>&#160;<span class="preprocessor">#include &lt;stddef.h&gt;</span></div><div class="line"><a name="l00117"></a><span class="lineno">  117</span>&#160;<span class="preprocessor">#include &lt;basetsd.h&gt;</span></div><div class="line"><a name="l00118"></a><span class="lineno">  118</span>&#160;<span class="preprocessor">#ifndef _WIN32_WCE</span></div><div class="line"><a name="l00119"></a><span class="lineno">  119</span>&#160;<span class="preprocessor">#include &lt;fcntl.h&gt;</span></div><div class="line"><a name="l00120"></a><span class="lineno">  120</span>&#160;<span class="preprocessor">#else</span></div><div class="line"><a name="l00121"></a><span class="lineno">  121</span>&#160;<span class="preprocessor">#define _O_RDONLY       0x0000</span></div><div class="line"><a name="l00122"></a><span class="lineno">  122</span>&#160;<span class="preprocessor">#define O_RDONLY        _O_RDONLY</span></div><div class="line"><a name="l00123"></a><span class="lineno">  123</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l00124"></a><span class="lineno">  124</span>&#160;</div><div class="line"><a name="l00125"></a><span class="lineno">  125</span>&#160;<span class="comment">// Visual studio older than 2015 and WIN_CE has only _stricmp</span></div><div class="line"><a name="l00126"></a><span class="lineno">  126</span>&#160;<span class="preprocessor">#if (defined(_MSC_VER) &amp;&amp; _MSC_VER &lt; 1900) || defined(_WIN32_WCE)</span></div><div class="line"><a name="l00127"></a><span class="lineno">  127</span>&#160;<span class="preprocessor">#define strcasecmp _stricmp</span></div><div class="line"><a name="l00128"></a><span class="lineno">  128</span>&#160;<span class="preprocessor">#elif !defined(__MINGW32__)</span></div><div class="line"><a name="l00129"></a><span class="lineno">  129</span>&#160;<span class="preprocessor">#define strcasecmp stricmp</span></div><div class="line"><a name="l00130"></a><span class="lineno">  130</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l00131"></a><span class="lineno">  131</span>&#160;<span class="preprocessor">#define getdtablesize() 30000</span></div><div class="line"><a name="l00132"></a><span class="lineno">  132</span>&#160;</div><div class="line"><a name="l00133"></a><span class="lineno">  133</span>&#160;<span class="preprocessor">#define LWS_INLINE __inline</span></div><div class="line"><a name="l00134"></a><span class="lineno">  134</span>&#160;<span class="preprocessor">#define LWS_VISIBLE</span></div><div class="line"><a name="l00135"></a><span class="lineno">  135</span>&#160;<span class="preprocessor">#define LWS_WARN_UNUSED_RESULT</span></div><div class="line"><a name="l00136"></a><span class="lineno">  136</span>&#160;<span class="preprocessor">#define LWS_WARN_DEPRECATED</span></div><div class="line"><a name="l00137"></a><span class="lineno">  137</span>&#160;</div><div class="line"><a name="l00138"></a><span class="lineno">  138</span>&#160;<span class="preprocessor">#ifdef LWS_DLL</span></div><div class="line"><a name="l00139"></a><span class="lineno">  139</span>&#160;<span class="preprocessor">#ifdef LWS_INTERNAL</span></div><div class="line"><a name="l00140"></a><span class="lineno">  140</span>&#160;<span class="preprocessor">#define LWS_EXTERN extern __declspec(dllexport)</span></div><div class="line"><a name="l00141"></a><span class="lineno">  141</span>&#160;<span class="preprocessor">#else</span></div><div class="line"><a name="l00142"></a><span class="lineno">  142</span>&#160;<span class="preprocessor">#define LWS_EXTERN extern __declspec(dllimport)</span></div><div class="line"><a name="l00143"></a><span class="lineno">  143</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l00144"></a><span class="lineno">  144</span>&#160;<span class="preprocessor">#else</span></div><div class="line"><a name="l00145"></a><span class="lineno">  145</span>&#160;<span class="preprocessor">#define LWS_EXTERN</span></div><div class="line"><a name="l00146"></a><span class="lineno">  146</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l00147"></a><span class="lineno">  147</span>&#160;</div><div class="line"><a name="l00148"></a><span class="lineno">  148</span>&#160;<span class="preprocessor">#define LWS_INVALID_FILE INVALID_HANDLE_VALUE</span></div><div class="line"><a name="l00149"></a><span class="lineno">  149</span>&#160;<span class="preprocessor">#define LWS_O_RDONLY _O_RDONLY</span></div><div class="line"><a name="l00150"></a><span class="lineno">  150</span>&#160;</div><div class="line"><a name="l00151"></a><span class="lineno">  151</span>&#160;<span class="preprocessor">#if !defined(__MINGW32__) &amp;&amp; (!defined(_MSC_VER) || _MSC_VER &lt; 1900) </span><span class="comment">/* Visual Studio 2015 already defines this in &lt;stdio.h&gt; */</span><span class="preprocessor"></span></div><div class="line"><a name="l00152"></a><span class="lineno">  152</span>&#160;<span class="preprocessor">#define lws_snprintf _snprintf</span></div><div class="line"><a name="l00153"></a><span class="lineno">  153</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l00154"></a><span class="lineno">  154</span>&#160;</div><div class="line"><a name="l00155"></a><span class="lineno">  155</span>&#160;<span class="preprocessor">#ifndef __func__</span></div><div class="line"><a name="l00156"></a><span class="lineno">  156</span>&#160;<span class="preprocessor">#define __func__ __FUNCTION__</span></div><div class="line"><a name="l00157"></a><span class="lineno">  157</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l00158"></a><span class="lineno">  158</span>&#160;</div><div class="line"><a name="l00159"></a><span class="lineno">  159</span>&#160;<span class="preprocessor">#else </span><span class="comment">/* NOT WIN32 */</span><span class="preprocessor"></span></div><div class="line"><a name="l00160"></a><span class="lineno">  160</span>&#160;<span class="preprocessor">#include &lt;unistd.h&gt;</span></div><div class="line"><a name="l00161"></a><span class="lineno">  161</span>&#160;</div><div class="line"><a name="l00162"></a><span class="lineno">  162</span>&#160;<span class="preprocessor">#if defined(__NetBSD__) || defined(__FreeBSD__)</span></div><div class="line"><a name="l00163"></a><span class="lineno">  163</span>&#160;<span class="preprocessor">#include &lt;netinet/in.h&gt;</span></div><div class="line"><a name="l00164"></a><span class="lineno">  164</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l00165"></a><span class="lineno">  165</span>&#160;</div><div class="line"><a name="l00166"></a><span class="lineno">  166</span>&#160;<span class="preprocessor">#define LWS_INLINE inline</span></div><div class="line"><a name="l00167"></a><span class="lineno">  167</span>&#160;<span class="preprocessor">#define LWS_O_RDONLY O_RDONLY</span></div><div class="line"><a name="l00168"></a><span class="lineno">  168</span>&#160;</div><div class="line"><a name="l00169"></a><span class="lineno">  169</span>&#160;<span class="preprocessor">#if !defined(MBED_OPERATORS) &amp;&amp; !defined(LWS_WITH_ESP8266)</span></div><div class="line"><a name="l00170"></a><span class="lineno">  170</span>&#160;<span class="preprocessor">#include &lt;poll.h&gt;</span></div><div class="line"><a name="l00171"></a><span class="lineno">  171</span>&#160;<span class="preprocessor">#include &lt;netdb.h&gt;</span></div><div class="line"><a name="l00172"></a><span class="lineno">  172</span>&#160;<span class="preprocessor">#define LWS_INVALID_FILE -1</span></div><div class="line"><a name="l00173"></a><span class="lineno">  173</span>&#160;<span class="preprocessor">#else</span></div><div class="line"><a name="l00174"></a><span class="lineno">  174</span>&#160;<span class="preprocessor">#define getdtablesize() (20)</span></div><div class="line"><a name="l00175"></a><span class="lineno">  175</span>&#160;<span class="preprocessor">#define LWS_INVALID_FILE NULL</span></div><div class="line"><a name="l00176"></a><span class="lineno">  176</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l00177"></a><span class="lineno">  177</span>&#160;</div><div class="line"><a name="l00178"></a><span class="lineno">  178</span>&#160;<span class="preprocessor">#if defined(__GNUC__)</span></div><div class="line"><a name="l00179"></a><span class="lineno">  179</span>&#160;</div><div class="line"><a name="l00180"></a><span class="lineno">  180</span>&#160;<span class="comment">/* warn_unused_result attribute only supported by GCC 3.4 or later */</span></div><div class="line"><a name="l00181"></a><span class="lineno">  181</span>&#160;<span class="preprocessor">#if __GNUC__ &gt;= 4 || (__GNUC__ == 3 &amp;&amp; __GNUC_MINOR__ &gt;= 4)</span></div><div class="line"><a name="l00182"></a><span class="lineno">  182</span>&#160;<span class="preprocessor">#define LWS_WARN_UNUSED_RESULT __attribute__((warn_unused_result))</span></div><div class="line"><a name="l00183"></a><span class="lineno">  183</span>&#160;<span class="preprocessor">#else</span></div><div class="line"><a name="l00184"></a><span class="lineno">  184</span>&#160;<span class="preprocessor">#define LWS_WARN_UNUSED_RESULT</span></div><div class="line"><a name="l00185"></a><span class="lineno">  185</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l00186"></a><span class="lineno">  186</span>&#160;</div><div class="line"><a name="l00187"></a><span class="lineno">  187</span>&#160;<span class="preprocessor">#define LWS_VISIBLE __attribute__((visibility(&quot;default&quot;)))</span></div><div class="line"><a name="l00188"></a><span class="lineno">  188</span>&#160;<span class="preprocessor">#define LWS_WARN_DEPRECATED __attribute__ ((deprecated))</span></div><div class="line"><a name="l00189"></a><span class="lineno">  189</span>&#160;<span class="preprocessor">#else</span></div><div class="line"><a name="l00190"></a><span class="lineno">  190</span>&#160;<span class="preprocessor">#define LWS_VISIBLE</span></div><div class="line"><a name="l00191"></a><span class="lineno">  191</span>&#160;<span class="preprocessor">#define LWS_WARN_UNUSED_RESULT</span></div><div class="line"><a name="l00192"></a><span class="lineno">  192</span>&#160;<span class="preprocessor">#define LWS_WARN_DEPRECATED</span></div><div class="line"><a name="l00193"></a><span class="lineno">  193</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l00194"></a><span class="lineno">  194</span>&#160;</div><div class="line"><a name="l00195"></a><span class="lineno">  195</span>&#160;<span class="preprocessor">#if defined(__ANDROID__)</span></div><div class="line"><a name="l00196"></a><span class="lineno">  196</span>&#160;<span class="preprocessor">#include &lt;unistd.h&gt;</span></div><div class="line"><a name="l00197"></a><span class="lineno">  197</span>&#160;<span class="preprocessor">#define getdtablesize() sysconf(_SC_OPEN_MAX)</span></div><div class="line"><a name="l00198"></a><span class="lineno">  198</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l00199"></a><span class="lineno">  199</span>&#160;</div><div class="line"><a name="l00200"></a><span class="lineno">  200</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l00201"></a><span class="lineno">  201</span>&#160;</div><div class="line"><a name="l00202"></a><span class="lineno">  202</span>&#160;<span class="preprocessor">#ifdef LWS_USE_LIBEV</span></div><div class="line"><a name="l00203"></a><span class="lineno">  203</span>&#160;<span class="preprocessor">#include &lt;ev.h&gt;</span></div><div class="line"><a name="l00204"></a><span class="lineno">  204</span>&#160;<span class="preprocessor">#endif </span><span class="comment">/* LWS_USE_LIBEV */</span><span class="preprocessor"></span></div><div class="line"><a name="l00205"></a><span class="lineno">  205</span>&#160;<span class="preprocessor">#ifdef LWS_USE_LIBUV</span></div><div class="line"><a name="l00206"></a><span class="lineno">  206</span>&#160;<span class="preprocessor">#include &lt;uv.h&gt;</span></div><div class="line"><a name="l00207"></a><span class="lineno">  207</span>&#160;<span class="preprocessor">#ifdef LWS_HAVE_UV_VERSION_H</span></div><div class="line"><a name="l00208"></a><span class="lineno">  208</span>&#160;<span class="preprocessor">#include &lt;uv-version.h&gt;</span></div><div class="line"><a name="l00209"></a><span class="lineno">  209</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l00210"></a><span class="lineno">  210</span>&#160;<span class="preprocessor">#endif </span><span class="comment">/* LWS_USE_LIBUV */</span><span class="preprocessor"></span></div><div class="line"><a name="l00211"></a><span class="lineno">  211</span>&#160;</div><div class="line"><a name="l00212"></a><span class="lineno">  212</span>&#160;<span class="preprocessor">#ifndef LWS_EXTERN</span></div><div class="line"><a name="l00213"></a><span class="lineno">  213</span>&#160;<span class="preprocessor">#define LWS_EXTERN extern</span></div><div class="line"><a name="l00214"></a><span class="lineno">  214</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l00215"></a><span class="lineno">  215</span>&#160;</div><div class="line"><a name="l00216"></a><span class="lineno">  216</span>&#160;<span class="preprocessor">#ifdef _WIN32</span></div><div class="line"><a name="l00217"></a><span class="lineno">  217</span>&#160;<span class="preprocessor">#define random rand</span></div><div class="line"><a name="l00218"></a><span class="lineno">  218</span>&#160;<span class="preprocessor">#else</span></div><div class="line"><a name="l00219"></a><span class="lineno">  219</span>&#160;<span class="preprocessor">#include &lt;sys/time.h&gt;</span></div><div class="line"><a name="l00220"></a><span class="lineno">  220</span>&#160;<span class="preprocessor">#include &lt;unistd.h&gt;</span></div><div class="line"><a name="l00221"></a><span class="lineno">  221</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l00222"></a><span class="lineno">  222</span>&#160;</div><div class="line"><a name="l00223"></a><span class="lineno">  223</span>&#160;<span class="preprocessor">#ifdef LWS_OPENSSL_SUPPORT</span></div><div class="line"><a name="l00224"></a><span class="lineno">  224</span>&#160;</div><div class="line"><a name="l00225"></a><span class="lineno">  225</span>&#160;<span class="preprocessor">#ifdef USE_WOLFSSL</span></div><div class="line"><a name="l00226"></a><span class="lineno">  226</span>&#160;<span class="preprocessor">#ifdef USE_OLD_CYASSL</span></div><div class="line"><a name="l00227"></a><span class="lineno">  227</span>&#160;<span class="preprocessor">#include &lt;cyassl/openssl/ssl.h&gt;</span></div><div class="line"><a name="l00228"></a><span class="lineno">  228</span>&#160;<span class="preprocessor">#include &lt;cyassl/error-ssl.h&gt;</span></div><div class="line"><a name="l00229"></a><span class="lineno">  229</span>&#160;<span class="preprocessor">#else</span></div><div class="line"><a name="l00230"></a><span class="lineno">  230</span>&#160;<span class="preprocessor">#include &lt;wolfssl/openssl/ssl.h&gt;</span></div><div class="line"><a name="l00231"></a><span class="lineno">  231</span>&#160;<span class="preprocessor">#include &lt;wolfssl/error-ssl.h&gt;</span></div><div class="line"><a name="l00232"></a><span class="lineno">  232</span>&#160;<span class="preprocessor">#endif </span><span class="comment">/* not USE_OLD_CYASSL */</span><span class="preprocessor"></span></div><div class="line"><a name="l00233"></a><span class="lineno">  233</span>&#160;<span class="preprocessor">#else</span></div><div class="line"><a name="l00234"></a><span class="lineno">  234</span>&#160;<span class="preprocessor">#if defined(LWS_USE_POLARSSL)</span></div><div class="line"><a name="l00235"></a><span class="lineno">  235</span>&#160;<span class="preprocessor">#include &lt;polarssl/ssl.h&gt;</span></div><div class="line"><a name="l00236"></a><span class="lineno"><a class="line" href="structlws__polarssl__context.html">  236</a></span>&#160;<span class="keyword">struct </span><a class="code" href="structlws__polarssl__context.html">lws_polarssl_context</a> {</div><div class="line"><a name="l00237"></a><span class="lineno"><a class="line" href="structlws__polarssl__context.html#a1872f2ea24878d807ae20ca8513674af">  237</a></span>&#160;        x509_crt <a class="code" href="structlws__polarssl__context.html#a1872f2ea24878d807ae20ca8513674af">ca</a>; </div><div class="line"><a name="l00238"></a><span class="lineno"><a class="line" href="structlws__polarssl__context.html#ae7e11c9129ff71c7ee71b3b2e320ff27">  238</a></span>&#160;        x509_crt <a class="code" href="structlws__polarssl__context.html#ae7e11c9129ff71c7ee71b3b2e320ff27">certificate</a>; </div><div class="line"><a name="l00239"></a><span class="lineno"><a class="line" href="structlws__polarssl__context.html#a919c33af37aab170f828d954de1fa270">  239</a></span>&#160;        rsa_context <a class="code" href="structlws__polarssl__context.html#a919c33af37aab170f828d954de1fa270">key</a>; </div><div class="line"><a name="l00240"></a><span class="lineno">  240</span>&#160;};</div><div class="line"><a name="l00241"></a><span class="lineno">  241</span>&#160;<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="l00242"></a><span class="lineno">  242</span>&#160;<span class="keyword">typedef</span> ssl_context SSL;</div><div class="line"><a name="l00243"></a><span class="lineno">  243</span>&#160;<span class="preprocessor">#else</span></div><div class="line"><a name="l00244"></a><span class="lineno">  244</span>&#160;<span class="preprocessor">#if defined(LWS_USE_MBEDTLS)</span></div><div class="line"><a name="l00245"></a><span class="lineno">  245</span>&#160;<span class="preprocessor">#include &lt;mbedtls/ssl.h&gt;</span></div><div class="line"><a name="l00246"></a><span class="lineno">  246</span>&#160;<span class="preprocessor">#else</span></div><div class="line"><a name="l00247"></a><span class="lineno">  247</span>&#160;<span class="preprocessor">#include &lt;openssl/ssl.h&gt;</span></div><div class="line"><a name="l00248"></a><span class="lineno">  248</span>&#160;<span class="preprocessor">#include &lt;openssl/err.h&gt;</span></div><div class="line"><a name="l00249"></a><span class="lineno">  249</span>&#160;<span class="preprocessor">#endif </span><span class="comment">/* not USE_MBEDTLS */</span><span class="preprocessor"></span></div><div class="line"><a name="l00250"></a><span class="lineno">  250</span>&#160;<span class="preprocessor">#endif </span><span class="comment">/* not USE_POLARSSL */</span><span class="preprocessor"></span></div><div class="line"><a name="l00251"></a><span class="lineno">  251</span>&#160;<span class="preprocessor">#endif </span><span class="comment">/* not USE_WOLFSSL */</span><span class="preprocessor"></span></div><div class="line"><a name="l00252"></a><span class="lineno">  252</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l00253"></a><span class="lineno">  253</span>&#160;</div><div class="line"><a name="l00254"></a><span class="lineno">  254</span>&#160;</div><div class="line"><a name="l00255"></a><span class="lineno">  255</span>&#160;<span class="preprocessor">#define CONTEXT_PORT_NO_LISTEN -1</span></div><div class="line"><a name="l00256"></a><span class="lineno">  256</span>&#160;</div><div class="line"><a name="l00267"></a><span class="lineno">  267</span>&#160;</div><div class="line"><a name="l00269"></a><span class="lineno">  269</span>&#160;<span class="keyword">enum</span> lws_log_levels {</div><div class="line"><a name="l00270"></a><span class="lineno">  270</span>&#160;        LLL_ERR = 1 &lt;&lt; 0,</div><div class="line"><a name="l00271"></a><span class="lineno">  271</span>&#160;        LLL_WARN = 1 &lt;&lt; 1,</div><div class="line"><a name="l00272"></a><span class="lineno">  272</span>&#160;        LLL_NOTICE = 1 &lt;&lt; 2,</div><div class="line"><a name="l00273"></a><span class="lineno">  273</span>&#160;        LLL_INFO = 1 &lt;&lt; 3,</div><div class="line"><a name="l00274"></a><span class="lineno">  274</span>&#160;        LLL_DEBUG = 1 &lt;&lt; 4,</div><div class="line"><a name="l00275"></a><span class="lineno">  275</span>&#160;        LLL_PARSER = 1 &lt;&lt; 5,</div><div class="line"><a name="l00276"></a><span class="lineno">  276</span>&#160;        LLL_HEADER = 1 &lt;&lt; 6,</div><div class="line"><a name="l00277"></a><span class="lineno">  277</span>&#160;        LLL_EXT = 1 &lt;&lt; 7,</div><div class="line"><a name="l00278"></a><span class="lineno">  278</span>&#160;        LLL_CLIENT = 1 &lt;&lt; 8,</div><div class="line"><a name="l00279"></a><span class="lineno">  279</span>&#160;        LLL_LATENCY = 1 &lt;&lt; 9,</div><div class="line"><a name="l00280"></a><span class="lineno">  280</span>&#160;</div><div class="line"><a name="l00281"></a><span class="lineno">  281</span>&#160;        LLL_COUNT = 10 <span class="comment">/* set to count of valid flags */</span></div><div class="line"><a name="l00282"></a><span class="lineno">  282</span>&#160;};</div><div class="line"><a name="l00283"></a><span class="lineno">  283</span>&#160;</div><div class="line"><a name="l00284"></a><span class="lineno">  284</span>&#160;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="l00285"></a><span class="lineno">  285</span>&#160;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="l00295"></a><span class="lineno">  295</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l00296"></a><span class="lineno">  296</span>&#160;<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="l00297"></a><span class="lineno">  297</span>&#160;</div><div class="line"><a name="l00298"></a><span class="lineno">  298</span>&#160;<span class="preprocessor">#define lwsl_err(...) _lws_log(LLL_ERR, __VA_ARGS__)</span></div><div class="line"><a name="l00299"></a><span class="lineno">  299</span>&#160;</div><div class="line"><a name="l00300"></a><span class="lineno">  300</span>&#160;<span class="preprocessor">#if !defined(LWS_WITH_NO_LOGS)</span></div><div class="line"><a name="l00301"></a><span class="lineno">  301</span>&#160;<span class="comment">/* notice, warn and log are always compiled in */</span></div><div class="line"><a name="l00302"></a><span class="lineno">  302</span>&#160;<span class="preprocessor">#define lwsl_warn(...) _lws_log(LLL_WARN, __VA_ARGS__)</span></div><div class="line"><a name="l00303"></a><span class="lineno">  303</span>&#160;<span class="preprocessor">#define lwsl_notice(...) _lws_log(LLL_NOTICE, __VA_ARGS__)</span></div><div class="line"><a name="l00304"></a><span class="lineno">  304</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l00305"></a><span class="lineno">  305</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l00306"></a><span class="lineno">  306</span>&#160;<span class="comment"> *  weaker logging can be deselected at configure time using --disable-debug</span></div><div class="line"><a name="l00307"></a><span class="lineno">  307</span>&#160;<span class="comment"> *  that gets rid of the overhead of checking while keeping _warn and _err</span></div><div class="line"><a name="l00308"></a><span class="lineno">  308</span>&#160;<span class="comment"> *  active</span></div><div class="line"><a name="l00309"></a><span class="lineno">  309</span>&#160;<span class="comment"> */</span></div><div class="line"><a name="l00310"></a><span class="lineno">  310</span>&#160;</div><div class="line"><a name="l00311"></a><span class="lineno">  311</span>&#160;<span class="preprocessor">#if defined(LWS_WITH_ESP8266)</span></div><div class="line"><a name="l00312"></a><span class="lineno">  312</span>&#160;<span class="preprocessor">#undef _DEBUG</span></div><div class="line"><a name="l00313"></a><span class="lineno">  313</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l00314"></a><span class="lineno">  314</span>&#160;</div><div class="line"><a name="l00315"></a><span class="lineno">  315</span>&#160;<span class="preprocessor">#ifdef _DEBUG</span></div><div class="line"><a name="l00316"></a><span class="lineno">  316</span>&#160;<span class="preprocessor">#if defined(LWS_WITH_NO_LOGS)</span></div><div class="line"><a name="l00317"></a><span class="lineno">  317</span>&#160;<span class="comment">/* notice, warn and log are always compiled in */</span></div><div class="line"><a name="l00318"></a><span class="lineno">  318</span>&#160;<span class="comment">//#define lwsl_err(...) _lws_log(LLL_ERR, __VA_ARGS__)</span></div><div class="line"><a name="l00319"></a><span class="lineno">  319</span>&#160;<span class="preprocessor">#define lwsl_warn(...) _lws_log(LLL_WARN, __VA_ARGS__)</span></div><div class="line"><a name="l00320"></a><span class="lineno">  320</span>&#160;<span class="preprocessor">#define lwsl_notice(...) _lws_log(LLL_NOTICE, __VA_ARGS__)</span></div><div class="line"><a name="l00321"></a><span class="lineno">  321</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l00322"></a><span class="lineno">  322</span>&#160;<span class="preprocessor">#define lwsl_info(...) _lws_log(LLL_INFO, __VA_ARGS__)</span></div><div class="line"><a name="l00323"></a><span class="lineno">  323</span>&#160;<span class="preprocessor">#define lwsl_debug(...) _lws_log(LLL_DEBUG, __VA_ARGS__)</span></div><div class="line"><a name="l00324"></a><span class="lineno">  324</span>&#160;<span class="preprocessor">#define lwsl_parser(...) _lws_log(LLL_PARSER, __VA_ARGS__)</span></div><div class="line"><a name="l00325"></a><span class="lineno">  325</span>&#160;<span class="preprocessor">#define lwsl_header(...)  _lws_log(LLL_HEADER, __VA_ARGS__)</span></div><div class="line"><a name="l00326"></a><span class="lineno">  326</span>&#160;<span class="preprocessor">#define lwsl_ext(...)  _lws_log(LLL_EXT, __VA_ARGS__)</span></div><div class="line"><a name="l00327"></a><span class="lineno">  327</span>&#160;<span class="preprocessor">#define lwsl_client(...) _lws_log(LLL_CLIENT, __VA_ARGS__)</span></div><div class="line"><a name="l00328"></a><span class="lineno">  328</span>&#160;<span class="preprocessor">#define lwsl_latency(...) _lws_log(LLL_LATENCY, __VA_ARGS__)</span></div><div class="line"><a name="l00329"></a><span class="lineno">  329</span>&#160;</div><div class="line"><a name="l00335"></a><span class="lineno">  335</span>&#160;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="l00336"></a><span class="lineno">  336</span>&#160;</div><div class="line"><a name="l00337"></a><span class="lineno">  337</span>&#160;<span class="preprocessor">#else </span><span class="comment">/* no debug */</span><span class="preprocessor"></span></div><div class="line"><a name="l00338"></a><span class="lineno">  338</span>&#160;<span class="preprocessor">#if defined(LWS_WITH_NO_LOGS)</span></div><div class="line"><a name="l00339"></a><span class="lineno">  339</span>&#160;<span class="comment">//#define lwsl_err(...) do {} while(0)</span></div><div class="line"><a name="l00340"></a><span class="lineno">  340</span>&#160;<span class="preprocessor">#define lwsl_warn(...) do {} while(0)</span></div><div class="line"><a name="l00341"></a><span class="lineno">  341</span>&#160;<span class="preprocessor">#define lwsl_notice(...) do {} while(0)</span></div><div class="line"><a name="l00342"></a><span class="lineno">  342</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l00343"></a><span class="lineno">  343</span>&#160;<span class="preprocessor">#define lwsl_info(...) do {} while(0)</span></div><div class="line"><a name="l00344"></a><span class="lineno">  344</span>&#160;<span class="preprocessor">#define lwsl_debug(...) do {} while(0)</span></div><div class="line"><a name="l00345"></a><span class="lineno">  345</span>&#160;<span class="preprocessor">#define lwsl_parser(...) do {} while(0)</span></div><div class="line"><a name="l00346"></a><span class="lineno">  346</span>&#160;<span class="preprocessor">#define lwsl_header(...) do {} while(0)</span></div><div class="line"><a name="l00347"></a><span class="lineno">  347</span>&#160;<span class="preprocessor">#define lwsl_ext(...) do {} while(0)</span></div><div class="line"><a name="l00348"></a><span class="lineno">  348</span>&#160;<span class="preprocessor">#define lwsl_client(...) do {} while(0)</span></div><div class="line"><a name="l00349"></a><span class="lineno">  349</span>&#160;<span class="preprocessor">#define lwsl_latency(...) do {} while(0)</span></div><div class="line"><a name="l00350"></a><span class="lineno">  350</span>&#160;<span class="preprocessor">#define lwsl_hexdump(a, b)</span></div><div class="line"><a name="l00351"></a><span class="lineno">  351</span>&#160;</div><div class="line"><a name="l00352"></a><span class="lineno">  352</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l00353"></a><span class="lineno">  353</span>&#160;</div><div class="line"><a name="l00364"></a><span class="lineno">  364</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">void</span></div><div class="line"><a name="l00365"></a><span class="lineno">  365</span>&#160;<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="l00366"></a><span class="lineno">  366</span>&#160;                  <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="l00367"></a><span class="lineno">  367</span>&#160;</div><div class="line"><a name="l00377"></a><span class="lineno">  377</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">void</span></div><div class="line"><a name="l00378"></a><span class="lineno">  378</span>&#160;<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="l00379"></a><span class="lineno">  379</span>&#160;</div><div class="line"><a name="l00381"></a><span class="lineno">  381</span>&#160;</div><div class="line"><a name="l00382"></a><span class="lineno">  382</span>&#160;</div><div class="line"><a name="l00383"></a><span class="lineno">  383</span>&#160;<span class="preprocessor">#include &lt;stddef.h&gt;</span></div><div class="line"><a name="l00384"></a><span class="lineno">  384</span>&#160;</div><div class="line"><a name="l00385"></a><span class="lineno">  385</span>&#160;<span class="preprocessor">#ifndef lws_container_of</span></div><div class="line"><a name="l00386"></a><span class="lineno">  386</span>&#160;<span class="preprocessor">#define lws_container_of(P,T,M) ((T *)((char *)(P) - offsetof(T, M)))</span></div><div class="line"><a name="l00387"></a><span class="lineno">  387</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l00388"></a><span class="lineno">  388</span>&#160;</div><div class="line"><a name="l00389"></a><span class="lineno">  389</span>&#160;</div><div class="line"><a name="l00390"></a><span class="lineno">  390</span>&#160;<span class="keyword">struct </span>lws;</div><div class="line"><a name="l00391"></a><span class="lineno">  391</span>&#160;<span class="preprocessor">#ifndef ARRAY_SIZE</span></div><div class="line"><a name="l00392"></a><span class="lineno">  392</span>&#160;<span class="preprocessor">#define ARRAY_SIZE(x) (sizeof(x) / sizeof(x[0]))</span></div><div class="line"><a name="l00393"></a><span class="lineno">  393</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l00394"></a><span class="lineno">  394</span>&#160;</div><div class="line"><a name="l00395"></a><span class="lineno">  395</span>&#160;<span class="comment">/* api change list for user code to test against */</span></div><div class="line"><a name="l00396"></a><span class="lineno">  396</span>&#160;</div><div class="line"><a name="l00397"></a><span class="lineno">  397</span>&#160;<span class="preprocessor">#define LWS_FEATURE_SERVE_HTTP_FILE_HAS_OTHER_HEADERS_ARG</span></div><div class="line"><a name="l00398"></a><span class="lineno">  398</span>&#160;</div><div class="line"><a name="l00399"></a><span class="lineno">  399</span>&#160;<span class="comment">/* the struct lws_protocols has the id field present */</span></div><div class="line"><a name="l00400"></a><span class="lineno">  400</span>&#160;<span class="preprocessor">#define LWS_FEATURE_PROTOCOLS_HAS_ID_FIELD</span></div><div class="line"><a name="l00401"></a><span class="lineno">  401</span>&#160;</div><div class="line"><a name="l00402"></a><span class="lineno">  402</span>&#160;<span class="comment">/* you can call lws_get_peer_write_allowance */</span></div><div class="line"><a name="l00403"></a><span class="lineno">  403</span>&#160;<span class="preprocessor">#define LWS_FEATURE_PROTOCOLS_HAS_PEER_WRITE_ALLOWANCE</span></div><div class="line"><a name="l00404"></a><span class="lineno">  404</span>&#160;</div><div class="line"><a name="l00405"></a><span class="lineno">  405</span>&#160;<span class="comment">/* extra parameter introduced in 917f43ab821 */</span></div><div class="line"><a name="l00406"></a><span class="lineno">  406</span>&#160;<span class="preprocessor">#define LWS_FEATURE_SERVE_HTTP_FILE_HAS_OTHER_HEADERS_LEN</span></div><div class="line"><a name="l00407"></a><span class="lineno">  407</span>&#160;</div><div class="line"><a name="l00408"></a><span class="lineno">  408</span>&#160;<span class="comment">/* File operations stuff exists */</span></div><div class="line"><a name="l00409"></a><span class="lineno">  409</span>&#160;<span class="preprocessor">#define LWS_FEATURE_FOPS</span></div><div class="line"><a name="l00410"></a><span class="lineno">  410</span>&#160;</div><div class="line"><a name="l00411"></a><span class="lineno">  411</span>&#160;</div><div class="line"><a name="l00412"></a><span class="lineno">  412</span>&#160;<span class="preprocessor">#if defined(_WIN32)</span></div><div class="line"><a name="l00413"></a><span class="lineno">  413</span>&#160;<span class="keyword">typedef</span> SOCKET lws_sockfd_type;</div><div class="line"><a name="l00414"></a><span class="lineno">  414</span>&#160;<span class="keyword">typedef</span> HANDLE lws_filefd_type;</div><div class="line"><a name="l00415"></a><span class="lineno">  415</span>&#160;<span class="preprocessor">#define lws_sockfd_valid(sfd) (!!sfd)</span></div><div class="line"><a name="l00416"></a><span class="lineno"><a class="line" href="structlws__pollfd.html">  416</a></span>&#160;<span class="keyword">struct </span><a class="code" href="structlws__pollfd.html">lws_pollfd</a> {</div><div class="line"><a name="l00417"></a><span class="lineno"><a class="line" href="structlws__pollfd.html#a714cf5ca90b41926117fdde9fa6542be">  417</a></span>&#160;        lws_sockfd_type <a class="code" href="structlws__pollfd.html#a714cf5ca90b41926117fdde9fa6542be">fd</a>; </div><div class="line"><a name="l00418"></a><span class="lineno"><a class="line" href="structlws__pollfd.html#ac393db6fc7fb6ed8fe7ca20936908ee9">  418</a></span>&#160;        SHORT <a class="code" href="structlws__pollfd.html#ac393db6fc7fb6ed8fe7ca20936908ee9">events</a>; </div><div class="line"><a name="l00419"></a><span class="lineno"><a class="line" href="structlws__pollfd.html#ae7cecfe7511c59d4a3a44f876d030932">  419</a></span>&#160;        SHORT <a class="code" href="structlws__pollfd.html#ae7cecfe7511c59d4a3a44f876d030932">revents</a>; </div><div class="line"><a name="l00420"></a><span class="lineno">  420</span>&#160;};</div><div class="line"><a name="l00421"></a><span class="lineno">  421</span>&#160;<span class="preprocessor">#define LWS_POLLHUP (FD_CLOSE)</span></div><div class="line"><a name="l00422"></a><span class="lineno">  422</span>&#160;<span class="preprocessor">#define LWS_POLLIN (FD_READ | FD_ACCEPT)</span></div><div class="line"><a name="l00423"></a><span class="lineno">  423</span>&#160;<span class="preprocessor">#define LWS_POLLOUT (FD_WRITE)</span></div><div class="line"><a name="l00424"></a><span class="lineno">  424</span>&#160;<span class="preprocessor">#else</span></div><div class="line"><a name="l00425"></a><span class="lineno">  425</span>&#160;</div><div class="line"><a name="l00426"></a><span class="lineno">  426</span>&#160;<span class="preprocessor">#if defined(MBED_OPERATORS)</span></div><div class="line"><a name="l00427"></a><span class="lineno">  427</span>&#160;<span class="comment">/* it&#39;s a class lws_conn * */</span></div><div class="line"><a name="l00428"></a><span class="lineno">  428</span>&#160;<span class="keyword">typedef</span> <span class="keywordtype">void</span> * lws_sockfd_type;</div><div class="line"><a name="l00429"></a><span class="lineno">  429</span>&#160;<span class="keyword">typedef</span> <span class="keywordtype">void</span> * lws_filefd_type;</div><div class="line"><a name="l00430"></a><span class="lineno">  430</span>&#160;<span class="preprocessor">#define lws_sockfd_valid(sfd) (!!sfd)</span></div><div class="line"><a name="l00431"></a><span class="lineno"><a class="line" href="structpollfd.html">  431</a></span>&#160;<span class="keyword">struct </span><a class="code" href="structpollfd.html">pollfd</a> {</div><div class="line"><a name="l00432"></a><span class="lineno"><a class="line" href="structpollfd.html#af084f089bdece61d177f85782d6673d0">  432</a></span>&#160;        lws_sockfd_type <a class="code" href="structpollfd.html#af084f089bdece61d177f85782d6673d0">fd</a>; </div><div class="line"><a name="l00433"></a><span class="lineno"><a class="line" href="structpollfd.html#ac9b2f2c5b1f9a7487eb57e67cd4960ef">  433</a></span>&#160;        <span class="keywordtype">short</span> <a class="code" href="structpollfd.html#ac9b2f2c5b1f9a7487eb57e67cd4960ef">events</a>; </div><div class="line"><a name="l00434"></a><span class="lineno"><a class="line" href="structpollfd.html#aafb457d11cac415faf0e1e2b825118c2">  434</a></span>&#160;        <span class="keywordtype">short</span> <a class="code" href="structpollfd.html#aafb457d11cac415faf0e1e2b825118c2">revents</a>; </div><div class="line"><a name="l00435"></a><span class="lineno">  435</span>&#160;};</div><div class="line"><a name="l00436"></a><span class="lineno">  436</span>&#160;<span class="preprocessor">#define POLLIN          0x0001</span></div><div class="line"><a name="l00437"></a><span class="lineno">  437</span>&#160;<span class="preprocessor">#define POLLPRI         0x0002</span></div><div class="line"><a name="l00438"></a><span class="lineno">  438</span>&#160;<span class="preprocessor">#define POLLOUT         0x0004</span></div><div class="line"><a name="l00439"></a><span class="lineno">  439</span>&#160;<span class="preprocessor">#define POLLERR         0x0008</span></div><div class="line"><a name="l00440"></a><span class="lineno">  440</span>&#160;<span class="preprocessor">#define POLLHUP         0x0010</span></div><div class="line"><a name="l00441"></a><span class="lineno">  441</span>&#160;<span class="preprocessor">#define POLLNVAL        0x0020</span></div><div class="line"><a name="l00442"></a><span class="lineno">  442</span>&#160;</div><div class="line"><a name="l00443"></a><span class="lineno">  443</span>&#160;<span class="keyword">struct </span>lws;</div><div class="line"><a name="l00444"></a><span class="lineno">  444</span>&#160;</div><div class="line"><a name="l00445"></a><span class="lineno">  445</span>&#160;<span class="keywordtype">void</span> * mbed3_create_tcp_stream_socket(<span class="keywordtype">void</span>);</div><div class="line"><a name="l00446"></a><span class="lineno">  446</span>&#160;<span class="keywordtype">void</span> mbed3_delete_tcp_stream_socket(<span class="keywordtype">void</span> *sockfd);</div><div class="line"><a name="l00447"></a><span class="lineno">  447</span>&#160;<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="l00448"></a><span class="lineno">  448</span>&#160;<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="l00449"></a><span class="lineno">  449</span>&#160;<span class="preprocessor">#else</span></div><div class="line"><a name="l00450"></a><span class="lineno">  450</span>&#160;<span class="preprocessor">#if defined(LWS_WITH_ESP8266)</span></div><div class="line"><a name="l00451"></a><span class="lineno">  451</span>&#160;</div><div class="line"><a name="l00452"></a><span class="lineno">  452</span>&#160;<span class="preprocessor">#include &lt;user_interface.h&gt;</span></div><div class="line"><a name="l00453"></a><span class="lineno">  453</span>&#160;<span class="preprocessor">#include &lt;espconn.h&gt;</span></div><div class="line"><a name="l00454"></a><span class="lineno">  454</span>&#160;</div><div class="line"><a name="l00455"></a><span class="lineno">  455</span>&#160;<span class="keyword">typedef</span> <span class="keyword">struct </span>espconn * lws_sockfd_type;</div><div class="line"><a name="l00456"></a><span class="lineno">  456</span>&#160;<span class="keyword">typedef</span> <span class="keywordtype">void</span> * lws_filefd_type;</div><div class="line"><a name="l00457"></a><span class="lineno">  457</span>&#160;<span class="preprocessor">#define lws_sockfd_valid(sfd) (!!sfd)</span></div><div class="line"><a name="l00458"></a><span class="lineno">  458</span>&#160;<span class="keyword">struct </span><a class="code" href="structpollfd.html">pollfd</a> {</div><div class="line"><a name="l00459"></a><span class="lineno">  459</span>&#160;        lws_sockfd_type fd; </div><div class="line"><a name="l00460"></a><span class="lineno">  460</span>&#160;        <span class="keywordtype">short</span> events; </div><div class="line"><a name="l00461"></a><span class="lineno">  461</span>&#160;        <span class="keywordtype">short</span> revents; </div><div class="line"><a name="l00462"></a><span class="lineno">  462</span>&#160;};</div><div class="line"><a name="l00463"></a><span class="lineno">  463</span>&#160;<span class="preprocessor">#define POLLIN          0x0001</span></div><div class="line"><a name="l00464"></a><span class="lineno">  464</span>&#160;<span class="preprocessor">#define POLLPRI         0x0002</span></div><div class="line"><a name="l00465"></a><span class="lineno">  465</span>&#160;<span class="preprocessor">#define POLLOUT         0x0004</span></div><div class="line"><a name="l00466"></a><span class="lineno">  466</span>&#160;<span class="preprocessor">#define POLLERR         0x0008</span></div><div class="line"><a name="l00467"></a><span class="lineno">  467</span>&#160;<span class="preprocessor">#define POLLHUP         0x0010</span></div><div class="line"><a name="l00468"></a><span class="lineno">  468</span>&#160;<span class="preprocessor">#define POLLNVAL        0x0020</span></div><div class="line"><a name="l00469"></a><span class="lineno">  469</span>&#160;</div><div class="line"><a name="l00470"></a><span class="lineno">  470</span>&#160;<span class="keyword">struct </span>lws_vhost;</div><div class="line"><a name="l00471"></a><span class="lineno">  471</span>&#160;</div><div class="line"><a name="l00472"></a><span class="lineno">  472</span>&#160;lws_sockfd_type esp8266_create_tcp_listen_socket(<span class="keyword">struct</span> lws_vhost *vh);</div><div class="line"><a name="l00473"></a><span class="lineno">  473</span>&#160;<span class="keywordtype">void</span> esp8266_tcp_stream_accept(lws_sockfd_type fd, <span class="keyword">struct</span> lws *wsi);</div><div class="line"><a name="l00474"></a><span class="lineno">  474</span>&#160;</div><div class="line"><a name="l00475"></a><span class="lineno">  475</span>&#160;<span class="preprocessor">#include &lt;os_type.h&gt;</span></div><div class="line"><a name="l00476"></a><span class="lineno">  476</span>&#160;<span class="preprocessor">#include &lt;osapi.h&gt;</span></div><div class="line"><a name="l00477"></a><span class="lineno">  477</span>&#160;<span class="preprocessor">#include &quot;ets_sys.h&quot;</span></div><div class="line"><a name="l00478"></a><span class="lineno">  478</span>&#160;</div><div class="line"><a name="l00479"></a><span class="lineno">  479</span>&#160;<span class="keywordtype">int</span> ets_snprintf(<span class="keywordtype">char</span> *str, <span class="keywordtype">size_t</span> size, <span class="keyword">const</span> <span class="keywordtype">char</span> *format, ...);</div><div class="line"><a name="l00480"></a><span class="lineno">  480</span>&#160;<span class="preprocessor">#define snprintf  ets_snprintf</span></div><div class="line"><a name="l00481"></a><span class="lineno">  481</span>&#160;</div><div class="line"><a name="l00482"></a><span class="lineno">  482</span>&#160;<span class="keyword">typedef</span> os_timer_t uv_timer_t;</div><div class="line"><a name="l00483"></a><span class="lineno">  483</span>&#160;<span class="keyword">typedef</span> <span class="keywordtype">void</span> uv_cb_t(uv_timer_t *);</div><div class="line"><a name="l00484"></a><span class="lineno">  484</span>&#160;</div><div class="line"><a name="l00485"></a><span class="lineno">  485</span>&#160;<span class="keywordtype">void</span> os_timer_disarm(<span class="keywordtype">void</span> *);</div><div class="line"><a name="l00486"></a><span class="lineno">  486</span>&#160;<span class="keywordtype">void</span> os_timer_setfn(os_timer_t *, os_timer_func_t *, <span class="keywordtype">void</span> *);</div><div class="line"><a name="l00487"></a><span class="lineno">  487</span>&#160;</div><div class="line"><a name="l00488"></a><span class="lineno">  488</span>&#160;<span class="keywordtype">void</span> ets_timer_arm_new(os_timer_t *, <span class="keywordtype">int</span>, <span class="keywordtype">int</span>, <span class="keywordtype">int</span>);</div><div class="line"><a name="l00489"></a><span class="lineno">  489</span>&#160;</div><div class="line"><a name="l00490"></a><span class="lineno">  490</span>&#160;<span class="comment">//void os_timer_arm(os_timer_t *, int, int);</span></div><div class="line"><a name="l00491"></a><span class="lineno">  491</span>&#160;</div><div class="line"><a name="l00492"></a><span class="lineno">  492</span>&#160;<span class="preprocessor">#define UV_VERSION_MAJOR 1</span></div><div class="line"><a name="l00493"></a><span class="lineno">  493</span>&#160;</div><div class="line"><a name="l00494"></a><span class="lineno">  494</span>&#160;<span class="preprocessor">#define lws_uv_getloop(a, b) (NULL)</span></div><div class="line"><a name="l00495"></a><span class="lineno">  495</span>&#160;</div><div class="line"><a name="l00496"></a><span class="lineno">  496</span>&#160;<span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> uv_timer_init(<span class="keywordtype">void</span> *l, uv_timer_t *t)</div><div class="line"><a name="l00497"></a><span class="lineno">  497</span>&#160;{</div><div class="line"><a name="l00498"></a><span class="lineno">  498</span>&#160;        (void)l;</div><div class="line"><a name="l00499"></a><span class="lineno">  499</span>&#160;        memset(t, 0, <span class="keyword">sizeof</span>(*t));</div><div class="line"><a name="l00500"></a><span class="lineno">  500</span>&#160;        os_timer_disarm(t);</div><div class="line"><a name="l00501"></a><span class="lineno">  501</span>&#160;}</div><div class="line"><a name="l00502"></a><span class="lineno">  502</span>&#160;</div><div class="line"><a name="l00503"></a><span class="lineno">  503</span>&#160;<span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> uv_timer_start(uv_timer_t *t, uv_cb_t *cb, <span class="keywordtype">int</span> first, <span class="keywordtype">int</span> rep)</div><div class="line"><a name="l00504"></a><span class="lineno">  504</span>&#160;{</div><div class="line"><a name="l00505"></a><span class="lineno">  505</span>&#160;        os_timer_setfn(t, (os_timer_func_t *)cb, t);</div><div class="line"><a name="l00506"></a><span class="lineno">  506</span>&#160;        <span class="comment">/* ms, repeat */</span></div><div class="line"><a name="l00507"></a><span class="lineno">  507</span>&#160;        os_timer_arm(t, first, !!rep);</div><div class="line"><a name="l00508"></a><span class="lineno">  508</span>&#160;}</div><div class="line"><a name="l00509"></a><span class="lineno">  509</span>&#160;</div><div class="line"><a name="l00510"></a><span class="lineno">  510</span>&#160;<span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> uv_timer_stop(uv_timer_t *t)</div><div class="line"><a name="l00511"></a><span class="lineno">  511</span>&#160;{</div><div class="line"><a name="l00512"></a><span class="lineno">  512</span>&#160;        os_timer_disarm(t);</div><div class="line"><a name="l00513"></a><span class="lineno">  513</span>&#160;}</div><div class="line"><a name="l00514"></a><span class="lineno">  514</span>&#160;</div><div class="line"><a name="l00515"></a><span class="lineno">  515</span>&#160;<span class="preprocessor">#else</span></div><div class="line"><a name="l00516"></a><span class="lineno">  516</span>&#160;<span class="keyword">typedef</span> <span class="keywordtype">int</span> lws_sockfd_type;</div><div class="line"><a name="l00517"></a><span class="lineno">  517</span>&#160;<span class="keyword">typedef</span> <span class="keywordtype">int</span> lws_filefd_type;</div><div class="line"><a name="l00518"></a><span class="lineno">  518</span>&#160;<span class="preprocessor">#define lws_sockfd_valid(sfd) (sfd &gt;= 0)</span></div><div class="line"><a name="l00519"></a><span class="lineno">  519</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l00520"></a><span class="lineno">  520</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l00521"></a><span class="lineno">  521</span>&#160;</div><div class="line"><a name="l00522"></a><span class="lineno">  522</span>&#160;<span class="preprocessor">#define lws_pollfd pollfd</span></div><div class="line"><a name="l00523"></a><span class="lineno">  523</span>&#160;<span class="preprocessor">#define LWS_POLLHUP (POLLHUP|POLLERR)</span></div><div class="line"><a name="l00524"></a><span class="lineno">  524</span>&#160;<span class="preprocessor">#define LWS_POLLIN (POLLIN)</span></div><div class="line"><a name="l00525"></a><span class="lineno">  525</span>&#160;<span class="preprocessor">#define LWS_POLLOUT (POLLOUT)</span></div><div class="line"><a name="l00526"></a><span class="lineno">  526</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l00527"></a><span class="lineno">  527</span>&#160;</div><div class="line"><a name="l00530"></a><span class="lineno"><a class="line" href="structlws__pollargs.html">  530</a></span>&#160;<span class="keyword">struct </span><a class="code" href="structlws__pollargs.html">lws_pollargs</a> {</div><div class="line"><a name="l00531"></a><span class="lineno"><a class="line" href="structlws__pollargs.html#af14a48ef4e78128aef9a76902b104a81">  531</a></span>&#160;        lws_sockfd_type <a class="code" href="structlws__pollargs.html#af14a48ef4e78128aef9a76902b104a81">fd</a>;     </div><div class="line"><a name="l00532"></a><span class="lineno"><a class="line" href="structlws__pollargs.html#a00bbffea9f55de342783e32d71ce1de6">  532</a></span>&#160;        <span class="keywordtype">int</span> <a class="code" href="structlws__pollargs.html#a00bbffea9f55de342783e32d71ce1de6">events</a>;             </div><div class="line"><a name="l00533"></a><span class="lineno"><a class="line" href="structlws__pollargs.html#a437fec0de5cf264371e1ab5a401e86d8">  533</a></span>&#160;        <span class="keywordtype">int</span> <a class="code" href="structlws__pollargs.html#a437fec0de5cf264371e1ab5a401e86d8">prev_events</a>;        </div><div class="line"><a name="l00534"></a><span class="lineno">  534</span>&#160;};</div><div class="line"><a name="l00535"></a><span class="lineno">  535</span>&#160;</div><div class="line"><a name="l00536"></a><span class="lineno">  536</span>&#160;<span class="keyword">struct </span><a class="code" href="structlws__tokens.html">lws_tokens</a>;</div><div class="line"><a name="l00537"></a><span class="lineno">  537</span>&#160;<span class="keyword">struct </span><a class="code" href="structlws__token__limits.html">lws_token_limits</a>;</div><div class="line"><a name="l00538"></a><span class="lineno">  538</span>&#160;</div><div class="line"><a name="l00546"></a><span class="lineno">  546</span>&#160;</div><div class="line"><a name="l00548"></a><span class="lineno">  548</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l00549"></a><span class="lineno">  549</span>&#160;<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="l00550"></a><span class="lineno">  550</span>&#160;<span class="comment"> * add it at where specified so existing users are unaffected.</span></div><div class="line"><a name="l00551"></a><span class="lineno">  551</span>&#160;<span class="comment"> */</span></div><div class="line"><a name="l00553"></a><span class="lineno"><a class="line" href="group__wsclose.html#gae399c571df32ba532c0ca67da9284985">  553</a></span>&#160;<span class="keyword">enum</span> <a class="code" href="group__wsclose.html#gae399c571df32ba532c0ca67da9284985">lws_close_status</a> {</div><div class="line"><a name="l00554"></a><span class="lineno">  554</span>&#160;        LWS_CLOSE_STATUS_NOSTATUS                               =    0,</div><div class="line"><a name="l00555"></a><span class="lineno"><a class="line" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a3ffa38d5081b85fb739e02a747ccf2c4">  555</a></span>&#160;        <a class="code" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a3ffa38d5081b85fb739e02a747ccf2c4">LWS_CLOSE_STATUS_NORMAL</a>                                 = 1000,</div><div class="line"><a name="l00558"></a><span class="lineno"><a class="line" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a9737a68759e739856b150ff9dfa30218">  558</a></span>&#160;        <a class="code" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a9737a68759e739856b150ff9dfa30218">LWS_CLOSE_STATUS_GOINGAWAY</a>                              = 1001,</div><div class="line"><a name="l00561"></a><span class="lineno"><a class="line" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a1bb501d212fa4d57053db681b1dfab98">  561</a></span>&#160;        <a class="code" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a1bb501d212fa4d57053db681b1dfab98">LWS_CLOSE_STATUS_PROTOCOL_ERR</a>                           = 1002,</div><div class="line"><a name="l00564"></a><span class="lineno"><a class="line" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a462c99b05459df700919cfd3f53c8276">  564</a></span>&#160;        <a class="code" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a462c99b05459df700919cfd3f53c8276">LWS_CLOSE_STATUS_UNACCEPTABLE_OPCODE</a>                    = 1003,</div><div class="line"><a name="l00569"></a><span class="lineno"><a class="line" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985af90cb98d983ad3d4c79df9b6f3d4a4d2">  569</a></span>&#160;        <a class="code" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985af90cb98d983ad3d4c79df9b6f3d4a4d2">LWS_CLOSE_STATUS_RESERVED</a>                               = 1004,</div><div class="line"><a name="l00571"></a><span class="lineno"><a class="line" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a4b8a3b7ce6f731e5248e4b0fb64a5044">  571</a></span>&#160;        <a class="code" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a4b8a3b7ce6f731e5248e4b0fb64a5044">LWS_CLOSE_STATUS_NO_STATUS</a>                              = 1005,</div><div class="line"><a name="l00576"></a><span class="lineno"><a class="line" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a68b3d34bebd88547dcfa5cadba0acd6c">  576</a></span>&#160;        <a class="code" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a68b3d34bebd88547dcfa5cadba0acd6c">LWS_CLOSE_STATUS_ABNORMAL_CLOSE</a>                         = 1006,</div><div class="line"><a name="l00582"></a><span class="lineno"><a class="line" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a7aef2da0062da606eeb35aaca5cf9050">  582</a></span>&#160;        <a class="code" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a7aef2da0062da606eeb35aaca5cf9050">LWS_CLOSE_STATUS_INVALID_PAYLOAD</a>                        = 1007,</div><div class="line"><a name="l00587"></a><span class="lineno"><a class="line" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985ad09e68295eabdddcba4e332fbea70ae5">  587</a></span>&#160;        <a class="code" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985ad09e68295eabdddcba4e332fbea70ae5">LWS_CLOSE_STATUS_POLICY_VIOLATION</a>                       = 1008,</div><div class="line"><a name="l00593"></a><span class="lineno"><a class="line" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a2e1f0113494a58e762eed3d22e7080d8">  593</a></span>&#160;        <a class="code" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a2e1f0113494a58e762eed3d22e7080d8">LWS_CLOSE_STATUS_MESSAGE_TOO_LARGE</a>                      = 1009,</div><div class="line"><a name="l00597"></a><span class="lineno"><a class="line" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985ac6a161822783ee873be1c66f48d14e0e">  597</a></span>&#160;        <a class="code" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985ac6a161822783ee873be1c66f48d14e0e">LWS_CLOSE_STATUS_EXTENSION_REQUIRED</a>                     = 1010,</div><div class="line"><a name="l00605"></a><span class="lineno"><a class="line" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985ad0869604d79e13700ae5d196a431b350">  605</a></span>&#160;        <a class="code" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985ad0869604d79e13700ae5d196a431b350">LWS_CLOSE_STATUS_UNEXPECTED_CONDITION</a>                   = 1011,</div><div class="line"><a name="l00609"></a><span class="lineno"><a class="line" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985ad2b477a91c8445bf34ecd43977f9b390">  609</a></span>&#160;        <a class="code" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985ad2b477a91c8445bf34ecd43977f9b390">LWS_CLOSE_STATUS_TLS_FAILURE</a>                            = 1015,</div><div class="line"><a name="l00616"></a><span class="lineno">  616</span>&#160;        <span class="comment">/****** add new things just above ---^ ******/</span></div><div class="line"><a name="l00617"></a><span class="lineno">  617</span>&#160;</div><div class="line"><a name="l00618"></a><span class="lineno">  618</span>&#160;        LWS_CLOSE_STATUS_NOSTATUS_CONTEXT_DESTROY               = 9999,</div><div class="line"><a name="l00619"></a><span class="lineno">  619</span>&#160;};</div><div class="line"><a name="l00620"></a><span class="lineno">  620</span>&#160;</div><div class="line"><a name="l00633"></a><span class="lineno">  633</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">void</span></div><div class="line"><a name="l00634"></a><span class="lineno">  634</span>&#160;<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="l00635"></a><span class="lineno">  635</span>&#160;                 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *buf, <span class="keywordtype">size_t</span> len);</div><div class="line"><a name="l00636"></a><span class="lineno">  636</span>&#160;</div><div class="line"><a name="l00638"></a><span class="lineno">  638</span>&#160;</div><div class="line"><a name="l00639"></a><span class="lineno">  639</span>&#160;<span class="keyword">struct </span>lws;</div><div class="line"><a name="l00640"></a><span class="lineno">  640</span>&#160;<span class="keyword">struct </span>lws_context;</div><div class="line"><a name="l00641"></a><span class="lineno">  641</span>&#160;<span class="comment">/* needed even with extensions disabled for create context */</span></div><div class="line"><a name="l00642"></a><span class="lineno">  642</span>&#160;<span class="keyword">struct </span><a class="code" href="structlws__extension.html">lws_extension</a>;</div><div class="line"><a name="l00643"></a><span class="lineno">  643</span>&#160;</div><div class="line"><a name="l00655"></a><span class="lineno">  655</span>&#160;</div><div class="line"><a name="l00657"></a><span class="lineno">  657</span>&#160;</div><div class="line"><a name="l00658"></a><span class="lineno">  658</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l00659"></a><span class="lineno">  659</span>&#160;<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="l00660"></a><span class="lineno">  660</span>&#160;<span class="comment"> * add it at where specified so existing users are unaffected.</span></div><div class="line"><a name="l00661"></a><span class="lineno">  661</span>&#160;<span class="comment"> */</span></div><div class="line"><a name="l00663"></a><span class="lineno"><a class="line" href="group__usercb.html#gad62860e19975ba4c4af401c3cdb6abf7">  663</a></span>&#160;<span class="keyword">enum</span> <a class="code" href="group__usercb.html#gad62860e19975ba4c4af401c3cdb6abf7">lws_callback_reasons</a> {</div><div class="line"><a name="l00664"></a><span class="lineno"><a class="line" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a24d39bf1cfc0bad9d92da9ac1717e439">  664</a></span>&#160;        <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a24d39bf1cfc0bad9d92da9ac1717e439">LWS_CALLBACK_ESTABLISHED</a>                                =  0,</div><div class="line"><a name="l00668"></a><span class="lineno"><a class="line" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ad8c6207b0c4e732f3d507f0fb79370e8">  668</a></span>&#160;        <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ad8c6207b0c4e732f3d507f0fb79370e8">LWS_CALLBACK_CLIENT_CONNECTION_ERROR</a>                    =  1,</div><div class="line"><a name="l00712"></a><span class="lineno"><a class="line" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aa536e574a642ff3ab9e12bff7ba2c6a2">  712</a></span>&#160;        <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aa536e574a642ff3ab9e12bff7ba2c6a2">LWS_CALLBACK_CLIENT_FILTER_PRE_ESTABLISH</a>                =  2,</div><div class="line"><a name="l00719"></a><span class="lineno"><a class="line" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a7e12418eec9bce85735e6460176ab604">  719</a></span>&#160;        <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a7e12418eec9bce85735e6460176ab604">LWS_CALLBACK_CLIENT_ESTABLISHED</a>                         =  3,</div><div class="line"><a name="l00722"></a><span class="lineno"><a class="line" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a48a9590e5e18c7920282e094a0bfd9d8">  722</a></span>&#160;        <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a48a9590e5e18c7920282e094a0bfd9d8">LWS_CALLBACK_CLOSED</a>                                     =  4,</div><div class="line"><a name="l00724"></a><span class="lineno"><a class="line" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a838b18d255c1b94a533287ba302a2eba">  724</a></span>&#160;        <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a838b18d255c1b94a533287ba302a2eba">LWS_CALLBACK_CLOSED_HTTP</a>                                =  5,</div><div class="line"><a name="l00726"></a><span class="lineno"><a class="line" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a492c1b1c0ac0ed980042ee732fe2990c">  726</a></span>&#160;        <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a492c1b1c0ac0ed980042ee732fe2990c">LWS_CALLBACK_RECEIVE</a>                                    =  6,</div><div class="line"><a name="l00730"></a><span class="lineno"><a class="line" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a2db02fc6e1c17ab62b52109d1aa9d738">  730</a></span>&#160;        <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a2db02fc6e1c17ab62b52109d1aa9d738">LWS_CALLBACK_RECEIVE_PONG</a>                               =  7,</div><div class="line"><a name="l00732"></a><span class="lineno"><a class="line" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7abbbe7a0a67c5866ca9109d46823fc5b1">  732</a></span>&#160;        <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7abbbe7a0a67c5866ca9109d46823fc5b1">LWS_CALLBACK_CLIENT_RECEIVE</a>                             =  8,</div><div class="line"><a name="l00735"></a><span class="lineno"><a class="line" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a136a7cec11c3afd13245623bd84e76c9">  735</a></span>&#160;        <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a136a7cec11c3afd13245623bd84e76c9">LWS_CALLBACK_CLIENT_RECEIVE_PONG</a>                        =  9,</div><div class="line"><a name="l00737"></a><span class="lineno"><a class="line" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a8e8b2e6dbeac76d8d126947d2166a514">  737</a></span>&#160;        <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a8e8b2e6dbeac76d8d126947d2166a514">LWS_CALLBACK_CLIENT_WRITEABLE</a>                           = 10,</div><div class="line"><a name="l00745"></a><span class="lineno"><a class="line" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a7ec8e2e9557ee02a4fc9f7dec7e2babc">  745</a></span>&#160;        <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a7ec8e2e9557ee02a4fc9f7dec7e2babc">LWS_CALLBACK_SERVER_WRITEABLE</a>                           = 11,</div><div class="line"><a name="l00747"></a><span class="lineno"><a class="line" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ae8d1de0bb56e03aa58cb4d44b18edd2e">  747</a></span>&#160;        <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ae8d1de0bb56e03aa58cb4d44b18edd2e">LWS_CALLBACK_HTTP</a>                                       = 12,</div><div class="line"><a name="l00761"></a><span class="lineno"><a class="line" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ac4c68e00efcf1ff7bda7ada462aff8ae">  761</a></span>&#160;        <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ac4c68e00efcf1ff7bda7ada462aff8ae">LWS_CALLBACK_HTTP_BODY</a>                                  = 13,</div><div class="line"><a name="l00764"></a><span class="lineno"><a class="line" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a2fce9a8608220f32abbf1422a5498804">  764</a></span>&#160;        <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a2fce9a8608220f32abbf1422a5498804">LWS_CALLBACK_HTTP_BODY_COMPLETION</a>                       = 14,</div><div class="line"><a name="l00766"></a><span class="lineno"><a class="line" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aa627548e1296e654fcfab463ec3c9587">  766</a></span>&#160;        <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aa627548e1296e654fcfab463ec3c9587">LWS_CALLBACK_HTTP_FILE_COMPLETION</a>                       = 15,</div><div class="line"><a name="l00768"></a><span class="lineno"><a class="line" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7afedadfb3cde37a8ea4c84ed535f26d09">  768</a></span>&#160;        <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7afedadfb3cde37a8ea4c84ed535f26d09">LWS_CALLBACK_HTTP_WRITEABLE</a>                             = 16,</div><div class="line"><a name="l00770"></a><span class="lineno"><a class="line" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a026502768778b8d79d62dd0fe4375fc6">  770</a></span>&#160;        <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a026502768778b8d79d62dd0fe4375fc6">LWS_CALLBACK_FILTER_NETWORK_CONNECTION</a>                  = 17,</div><div class="line"><a name="l00781"></a><span class="lineno"><a class="line" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a75199176c82c1a56e4a6bbf1cc30c12c">  781</a></span>&#160;        <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a75199176c82c1a56e4a6bbf1cc30c12c">LWS_CALLBACK_FILTER_HTTP_CONNECTION</a>                     = 18,</div><div class="line"><a name="l00793"></a><span class="lineno"><a class="line" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ae9734e1d7af2abf291665ce9e4a728d3">  793</a></span>&#160;        <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ae9734e1d7af2abf291665ce9e4a728d3">LWS_CALLBACK_SERVER_NEW_CLIENT_INSTANTIATED</a>             = 19,</div><div class="line"><a name="l00801"></a><span class="lineno"><a class="line" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7accd8753672d319a30b4b4c2fb775e84d">  801</a></span>&#160;        <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7accd8753672d319a30b4b4c2fb775e84d">LWS_CALLBACK_FILTER_PROTOCOL_CONNECTION</a>                 = 20,</div><div class="line"><a name="l00813"></a><span class="lineno"><a class="line" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ae4986291b7a810fe290851d73bebeb1c">  813</a></span>&#160;        <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ae4986291b7a810fe290851d73bebeb1c">LWS_CALLBACK_OPENSSL_LOAD_EXTRA_CLIENT_VERIFY_CERTS</a>     = 21,</div><div class="line"><a name="l00820"></a><span class="lineno"><a class="line" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a06006e98d27e1e884364d88317f83493">  820</a></span>&#160;        <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a06006e98d27e1e884364d88317f83493">LWS_CALLBACK_OPENSSL_LOAD_EXTRA_SERVER_VERIFY_CERTS</a>     = 22,</div><div class="line"><a name="l00826"></a><span class="lineno"><a class="line" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ae5ad65d779b7eab32ab67ceff91a3bac">  826</a></span>&#160;        <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ae5ad65d779b7eab32ab67ceff91a3bac">LWS_CALLBACK_OPENSSL_PERFORM_CLIENT_CERT_VERIFICATION</a>   = 23,</div><div class="line"><a name="l00844"></a><span class="lineno"><a class="line" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a909cc2a7018864b0b71abacc4058fd8f">  844</a></span>&#160;        <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a909cc2a7018864b0b71abacc4058fd8f">LWS_CALLBACK_CLIENT_APPEND_HANDSHAKE_HEADER</a>             = 24,</div><div class="line"><a name="l00868"></a><span class="lineno"><a class="line" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a390da3639296660a78cc1a5dcb19037e">  868</a></span>&#160;        <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a390da3639296660a78cc1a5dcb19037e">LWS_CALLBACK_CONFIRM_EXTENSION_OKAY</a>                     = 25,</div><div class="line"><a name="l00879"></a><span class="lineno"><a class="line" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a1ce5b22039ca37ee224d00047596ea46">  879</a></span>&#160;        <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a1ce5b22039ca37ee224d00047596ea46">LWS_CALLBACK_CLIENT_CONFIRM_EXTENSION_SUPPORTED</a>         = 26,</div><div class="line"><a name="l00888"></a><span class="lineno"><a class="line" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ad5d34583e3556e153eda91620b48cc49">  888</a></span>&#160;        <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ad5d34583e3556e153eda91620b48cc49">LWS_CALLBACK_PROTOCOL_INIT</a>                              = 27,</div><div class="line"><a name="l00891"></a><span class="lineno"><a class="line" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a54269ca88508e6efd3afdb9d360a9caa">  891</a></span>&#160;        <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a54269ca88508e6efd3afdb9d360a9caa">LWS_CALLBACK_PROTOCOL_DESTROY</a>                           = 28,</div><div class="line"><a name="l00896"></a><span class="lineno"><a class="line" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7afd8fd77a1cc9405fcb4f26915d7f2d01">  896</a></span>&#160;        <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7afd8fd77a1cc9405fcb4f26915d7f2d01">LWS_CALLBACK_WSI_CREATE</a>                                 = 29,</div><div class="line"><a name="l00898"></a><span class="lineno"><a class="line" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aca834dc035b7f7486f9ce40fde54fe9e">  898</a></span>&#160;        <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aca834dc035b7f7486f9ce40fde54fe9e">LWS_CALLBACK_WSI_DESTROY</a>                                = 30,</div><div class="line"><a name="l00900"></a><span class="lineno"><a class="line" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7adfb41c92e2522712207ef7f2462b5e34">  900</a></span>&#160;        <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7adfb41c92e2522712207ef7f2462b5e34">LWS_CALLBACK_GET_THREAD_ID</a>                              = 31,</div><div class="line"><a name="l00905"></a><span class="lineno">  905</span>&#160;        <span class="comment">/* external poll() management support */</span></div><div class="line"><a name="l00906"></a><span class="lineno"><a class="line" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ab69783a9fbf2ca71ad70706bda77b412">  906</a></span>&#160;        <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ab69783a9fbf2ca71ad70706bda77b412">LWS_CALLBACK_ADD_POLL_FD</a>                                = 32,</div><div class="line"><a name="l00922"></a><span class="lineno"><a class="line" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a1df60f314710236f9b53efbf468da768">  922</a></span>&#160;        <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a1df60f314710236f9b53efbf468da768">LWS_CALLBACK_DEL_POLL_FD</a>                                = 33,</div><div class="line"><a name="l00928"></a><span class="lineno"><a class="line" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aa87d2e82fffa42c3680c7403ef94216e">  928</a></span>&#160;        <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aa87d2e82fffa42c3680c7403ef94216e">LWS_CALLBACK_CHANGE_MODE_POLL_FD</a>                        = 34,</div><div class="line"><a name="l00936"></a><span class="lineno"><a class="line" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a8909732521d379179003d97ab7a05428">  936</a></span>&#160;        <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a8909732521d379179003d97ab7a05428">LWS_CALLBACK_LOCK_POLL</a>                                  = 35,</div><div class="line"><a name="l00948"></a><span class="lineno"><a class="line" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a0e9e3dd667c0c42cdbe1a3d921f4fd79">  948</a></span>&#160;        <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a0e9e3dd667c0c42cdbe1a3d921f4fd79">LWS_CALLBACK_UNLOCK_POLL</a>                                = 36,</div><div class="line"><a name="l00951"></a><span class="lineno"><a class="line" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aa46f705dcf97502e95627ffde614f98b">  951</a></span>&#160;        <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aa46f705dcf97502e95627ffde614f98b">LWS_CALLBACK_OPENSSL_CONTEXT_REQUIRES_PRIVATE_KEY</a>       = 37,</div><div class="line"><a name="l00959"></a><span class="lineno"><a class="line" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ac3fc5bbb55e69f90396526287ee84a51">  959</a></span>&#160;        <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ac3fc5bbb55e69f90396526287ee84a51">LWS_CALLBACK_WS_PEER_INITIATED_CLOSE</a>                    = 38,</div><div class="line"><a name="l00968"></a><span class="lineno">  968</span>&#160;        LWS_CALLBACK_WS_EXT_DEFAULTS                            = 39,</div><div class="line"><a name="l00971"></a><span class="lineno">  971</span>&#160;        LWS_CALLBACK_CGI                                        = 40,</div><div class="line"><a name="l00973"></a><span class="lineno">  973</span>&#160;        LWS_CALLBACK_CGI_TERMINATED                             = 41,</div><div class="line"><a name="l00975"></a><span class="lineno">  975</span>&#160;        LWS_CALLBACK_CGI_STDIN_DATA                             = 42,</div><div class="line"><a name="l00977"></a><span class="lineno">  977</span>&#160;        LWS_CALLBACK_CGI_STDIN_COMPLETED                        = 43,</div><div class="line"><a name="l00979"></a><span class="lineno">  979</span>&#160;        LWS_CALLBACK_ESTABLISHED_CLIENT_HTTP                    = 44,</div><div class="line"><a name="l00981"></a><span class="lineno">  981</span>&#160;        LWS_CALLBACK_CLOSED_CLIENT_HTTP                         = 45,</div><div class="line"><a name="l00983"></a><span class="lineno">  983</span>&#160;        LWS_CALLBACK_RECEIVE_CLIENT_HTTP                        = 46,</div><div class="line"><a name="l00985"></a><span class="lineno">  985</span>&#160;        LWS_CALLBACK_COMPLETED_CLIENT_HTTP                      = 47,</div><div class="line"><a name="l00987"></a><span class="lineno">  987</span>&#160;        LWS_CALLBACK_RECEIVE_CLIENT_HTTP_READ                   = 48,</div><div class="line"><a name="l00989"></a><span class="lineno">  989</span>&#160;        LWS_CALLBACK_HTTP_BIND_PROTOCOL                         = 49,</div><div class="line"><a name="l00991"></a><span class="lineno">  991</span>&#160;        LWS_CALLBACK_HTTP_DROP_PROTOCOL                         = 50,</div><div class="line"><a name="l00993"></a><span class="lineno">  993</span>&#160;        LWS_CALLBACK_CHECK_ACCESS_RIGHTS                        = 51,</div><div class="line"><a name="l00995"></a><span class="lineno">  995</span>&#160;        LWS_CALLBACK_PROCESS_HTML                               = 52,</div><div class="line"><a name="l00997"></a><span class="lineno">  997</span>&#160;        LWS_CALLBACK_ADD_HEADERS                                = 53,</div><div class="line"><a name="l00999"></a><span class="lineno">  999</span>&#160;        LWS_CALLBACK_SESSION_INFO                               = 54,</div><div class="line"><a name="l01002"></a><span class="lineno"> 1002</span>&#160;        LWS_CALLBACK_GS_EVENT                                   = 55,</div><div class="line"><a name="l01004"></a><span class="lineno"><a class="line" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aa5cc921b7697743017a533822a3d556a"> 1004</a></span>&#160;        <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aa5cc921b7697743017a533822a3d556a">LWS_CALLBACK_HTTP_PMO</a>                                   = 56,</div><div class="line"><a name="l01009"></a><span class="lineno"><a class="line" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aeb0cec65ec82a713cd01e9ca9aeeb5e6"> 1009</a></span>&#160;        <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aeb0cec65ec82a713cd01e9ca9aeeb5e6">LWS_CALLBACK_CLIENT_HTTP_WRITEABLE</a>                      = 57,</div><div class="line"><a name="l01019"></a><span class="lineno"> 1019</span>&#160;        <span class="comment">/****** add new things just above ---^ ******/</span></div><div class="line"><a name="l01020"></a><span class="lineno"> 1020</span>&#160;</div><div class="line"><a name="l01021"></a><span class="lineno"><a class="line" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a982579753e70e59a9ea13ce628ac891a"> 1021</a></span>&#160;        <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a982579753e70e59a9ea13ce628ac891a">LWS_CALLBACK_USER</a> = 1000,</div><div class="line"><a name="l01023"></a><span class="lineno"> 1023</span>&#160;};</div><div class="line"><a name="l01024"></a><span class="lineno"> 1024</span>&#160;</div><div class="line"><a name="l01025"></a><span class="lineno"> 1025</span>&#160;</div><div class="line"><a name="l01026"></a><span class="lineno"> 1026</span>&#160;</div><div class="line"><a name="l01042"></a><span class="lineno"> 1042</span>&#160;<span class="keyword">typedef</span> <span class="keywordtype">int</span></div><div class="line"><a name="l01043"></a><span class="lineno"><a class="line" href="group__usercb.html#gad4fcb82e68d60ffacca61a3f783a0a2f"> 1043</a></span>&#160;<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="l01044"></a><span class="lineno"> 1044</span>&#160;                    <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="l01046"></a><span class="lineno"> 1046</span>&#160;</div><div class="line"><a name="l01056"></a><span class="lineno"> 1056</span>&#160;</div><div class="line"><a name="l01058"></a><span class="lineno"> 1058</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l01059"></a><span class="lineno"> 1059</span>&#160;<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="l01060"></a><span class="lineno"> 1060</span>&#160;<span class="comment"> * add it at where specified so existing users are unaffected.</span></div><div class="line"><a name="l01061"></a><span class="lineno"> 1061</span>&#160;<span class="comment"> */</span></div><div class="line"><a name="l01062"></a><span class="lineno"> 1062</span>&#160;<span class="keyword">enum</span> lws_extension_callback_reasons {</div><div class="line"><a name="l01063"></a><span class="lineno"> 1063</span>&#160;        LWS_EXT_CB_SERVER_CONTEXT_CONSTRUCT             =  0,</div><div class="line"><a name="l01064"></a><span class="lineno"> 1064</span>&#160;        LWS_EXT_CB_CLIENT_CONTEXT_CONSTRUCT             =  1,</div><div class="line"><a name="l01065"></a><span class="lineno"> 1065</span>&#160;        LWS_EXT_CB_SERVER_CONTEXT_DESTRUCT              =  2,</div><div class="line"><a name="l01066"></a><span class="lineno"> 1066</span>&#160;        LWS_EXT_CB_CLIENT_CONTEXT_DESTRUCT              =  3,</div><div class="line"><a name="l01067"></a><span class="lineno"> 1067</span>&#160;        LWS_EXT_CB_CONSTRUCT                            =  4,</div><div class="line"><a name="l01068"></a><span class="lineno"> 1068</span>&#160;        LWS_EXT_CB_CLIENT_CONSTRUCT                     =  5,</div><div class="line"><a name="l01069"></a><span class="lineno"> 1069</span>&#160;        LWS_EXT_CB_CHECK_OK_TO_REALLY_CLOSE             =  6,</div><div class="line"><a name="l01070"></a><span class="lineno"> 1070</span>&#160;        LWS_EXT_CB_CHECK_OK_TO_PROPOSE_EXTENSION        =  7,</div><div class="line"><a name="l01071"></a><span class="lineno"> 1071</span>&#160;        LWS_EXT_CB_DESTROY                              =  8,</div><div class="line"><a name="l01072"></a><span class="lineno"> 1072</span>&#160;        LWS_EXT_CB_DESTROY_ANY_WSI_CLOSING              =  9,</div><div class="line"><a name="l01073"></a><span class="lineno"> 1073</span>&#160;        LWS_EXT_CB_ANY_WSI_ESTABLISHED                  = 10,</div><div class="line"><a name="l01074"></a><span class="lineno"> 1074</span>&#160;        LWS_EXT_CB_PACKET_RX_PREPARSE                   = 11,</div><div class="line"><a name="l01075"></a><span class="lineno"> 1075</span>&#160;        LWS_EXT_CB_PACKET_TX_PRESEND                    = 12,</div><div class="line"><a name="l01076"></a><span class="lineno"> 1076</span>&#160;        LWS_EXT_CB_PACKET_TX_DO_SEND                    = 13,</div><div class="line"><a name="l01077"></a><span class="lineno"> 1077</span>&#160;        LWS_EXT_CB_HANDSHAKE_REPLY_TX                   = 14,</div><div class="line"><a name="l01078"></a><span class="lineno"> 1078</span>&#160;        LWS_EXT_CB_FLUSH_PENDING_TX                     = 15,</div><div class="line"><a name="l01079"></a><span class="lineno"> 1079</span>&#160;        LWS_EXT_CB_EXTENDED_PAYLOAD_RX                  = 16,</div><div class="line"><a name="l01080"></a><span class="lineno"> 1080</span>&#160;        LWS_EXT_CB_CAN_PROXY_CLIENT_CONNECTION          = 17,</div><div class="line"><a name="l01081"></a><span class="lineno"> 1081</span>&#160;        LWS_EXT_CB_1HZ                                  = 18,</div><div class="line"><a name="l01082"></a><span class="lineno"> 1082</span>&#160;        LWS_EXT_CB_REQUEST_ON_WRITEABLE                 = 19,</div><div class="line"><a name="l01083"></a><span class="lineno"> 1083</span>&#160;        LWS_EXT_CB_IS_WRITEABLE                         = 20,</div><div class="line"><a name="l01084"></a><span class="lineno"> 1084</span>&#160;        LWS_EXT_CB_PAYLOAD_TX                           = 21,</div><div class="line"><a name="l01085"></a><span class="lineno"> 1085</span>&#160;        LWS_EXT_CB_PAYLOAD_RX                           = 22,</div><div class="line"><a name="l01086"></a><span class="lineno"> 1086</span>&#160;        LWS_EXT_CB_OPTION_DEFAULT                       = 23,</div><div class="line"><a name="l01087"></a><span class="lineno"> 1087</span>&#160;        LWS_EXT_CB_OPTION_SET                           = 24,</div><div class="line"><a name="l01088"></a><span class="lineno"> 1088</span>&#160;        LWS_EXT_CB_OPTION_CONFIRM                       = 25,</div><div class="line"><a name="l01089"></a><span class="lineno"> 1089</span>&#160;        LWS_EXT_CB_NAMED_OPTION_SET                     = 26,</div><div class="line"><a name="l01090"></a><span class="lineno"> 1090</span>&#160;</div><div class="line"><a name="l01091"></a><span class="lineno"> 1091</span>&#160;        <span class="comment">/****** add new things just above ---^ ******/</span></div><div class="line"><a name="l01092"></a><span class="lineno"> 1092</span>&#160;};</div><div class="line"><a name="l01093"></a><span class="lineno"> 1093</span>&#160;</div><div class="line"><a name="l01095"></a><span class="lineno"><a class="line" href="group__extensions.html#gacc9f55936dc165257a2e1f7d47bce89e"> 1095</a></span>&#160;<span class="keyword">enum</span> <a class="code" href="group__extensions.html#gacc9f55936dc165257a2e1f7d47bce89e">lws_ext_options_types</a> {</div><div class="line"><a name="l01096"></a><span class="lineno"><a class="line" href="group__extensions.html#ggacc9f55936dc165257a2e1f7d47bce89eaabcf56c456c1ff6e81dc82586a16f14c"> 1096</a></span>&#160;        <a class="code" href="group__extensions.html#ggacc9f55936dc165257a2e1f7d47bce89eaabcf56c456c1ff6e81dc82586a16f14c">EXTARG_NONE</a>, </div><div class="line"><a name="l01097"></a><span class="lineno"><a class="line" href="group__extensions.html#ggacc9f55936dc165257a2e1f7d47bce89ea1c86adf924c8786a12bee9687094673e"> 1097</a></span>&#160;        <a class="code" href="group__extensions.html#ggacc9f55936dc165257a2e1f7d47bce89ea1c86adf924c8786a12bee9687094673e">EXTARG_DEC</a>,  </div><div class="line"><a name="l01098"></a><span class="lineno"><a class="line" href="group__extensions.html#ggacc9f55936dc165257a2e1f7d47bce89ea5265abe3e1c3f64412f2affe7bffd880"> 1098</a></span>&#160;        <a class="code" href="group__extensions.html#ggacc9f55936dc165257a2e1f7d47bce89ea5265abe3e1c3f64412f2affe7bffd880">EXTARG_OPT_DEC</a> </div><div class="line"><a name="l01100"></a><span class="lineno"> 1100</span>&#160;        <span class="comment">/* Add new things just above here ---^</span></div><div class="line"><a name="l01101"></a><span class="lineno"> 1101</span>&#160;<span class="comment">         * This is part of the ABI, don&#39;t needlessly break compatibility */</span></div><div class="line"><a name="l01102"></a><span class="lineno"> 1102</span>&#160;};</div><div class="line"><a name="l01103"></a><span class="lineno"> 1103</span>&#160;</div><div class="line"><a name="l01108"></a><span class="lineno"><a class="line" href="structlws__ext__options.html"> 1108</a></span>&#160;<span class="keyword">struct </span><a class="code" href="structlws__ext__options.html">lws_ext_options</a> {</div><div class="line"><a name="l01109"></a><span class="lineno"><a class="line" href="structlws__ext__options.html#a1769e4a9805bbdda227821e9578ddc7e"> 1109</a></span>&#160;        <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="l01110"></a><span class="lineno"><a class="line" href="structlws__ext__options.html#a7c4dbd62dbeba63a9d50d2306bd1cc61"> 1110</a></span>&#160;        <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="l01112"></a><span class="lineno"> 1112</span>&#160;        <span class="comment">/* Add new things just above here ---^</span></div><div class="line"><a name="l01113"></a><span class="lineno"> 1113</span>&#160;<span class="comment">         * This is part of the ABI, don&#39;t needlessly break compatibility */</span></div><div class="line"><a name="l01114"></a><span class="lineno"> 1114</span>&#160;};</div><div class="line"><a name="l01115"></a><span class="lineno"> 1115</span>&#160;</div><div class="line"><a name="l01117"></a><span class="lineno"><a class="line" href="structlws__ext__option__arg.html"> 1117</a></span>&#160;<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="l01118"></a><span class="lineno"><a class="line" href="structlws__ext__option__arg.html#a0a320c56b79271b8f059eeaad9423ac9"> 1118</a></span>&#160;        <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="l01119"></a><span class="lineno"><a class="line" href="structlws__ext__option__arg.html#af57fffcfa253dfa8d98681ac1fb1785f"> 1119</a></span>&#160;        <span class="keywordtype">int</span> <a class="code" href="structlws__ext__option__arg.html#af57fffcfa253dfa8d98681ac1fb1785f">option_index</a>; </div><div class="line"><a name="l01120"></a><span class="lineno"><a class="line" href="structlws__ext__option__arg.html#a0b1f7b30c3ceaf5f1bf9d105c24568d1"> 1120</a></span>&#160;        <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="l01121"></a><span class="lineno"><a class="line" href="structlws__ext__option__arg.html#af37f0b6caa7735af51a1ac12b68d5bc5"> 1121</a></span>&#160;        <span class="keywordtype">int</span> <a class="code" href="structlws__ext__option__arg.html#af37f0b6caa7735af51a1ac12b68d5bc5">len</a>; </div><div class="line"><a name="l01122"></a><span class="lineno"> 1122</span>&#160;};</div><div class="line"><a name="l01123"></a><span class="lineno"> 1123</span>&#160;</div><div class="line"><a name="l01184"></a><span class="lineno"> 1184</span>&#160;<span class="keyword">typedef</span> <span class="keywordtype">int</span></div><div class="line"><a name="l01185"></a><span class="lineno"><a class="line" href="group__extensions.html#gaae7169b2cd346b34fa33d0250db2afd0"> 1185</a></span>&#160;<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="l01186"></a><span class="lineno"> 1186</span>&#160;                              <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="l01187"></a><span class="lineno"> 1187</span>&#160;                              <span class="keyword">enum</span> lws_extension_callback_reasons reason,</div><div class="line"><a name="l01188"></a><span class="lineno"> 1188</span>&#160;                              <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="l01189"></a><span class="lineno"> 1189</span>&#160;</div><div class="line"><a name="l01191"></a><span class="lineno"><a class="line" href="structlws__extension.html"> 1191</a></span>&#160;<span class="keyword">struct </span><a class="code" href="structlws__extension.html">lws_extension</a> {</div><div class="line"><a name="l01192"></a><span class="lineno"><a class="line" href="structlws__extension.html#a1e5018c883d85176f5c2152176843f9e"> 1192</a></span>&#160;        <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="l01193"></a><span class="lineno"><a class="line" href="structlws__extension.html#afa21f3b3c8c2c9212a276c52b680c3af"> 1193</a></span>&#160;        <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="l01194"></a><span class="lineno"><a class="line" href="structlws__extension.html#a36b06c213aedb02bf9a402651751855b"> 1194</a></span>&#160;        <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="l01196"></a><span class="lineno"> 1196</span>&#160;        <span class="comment">/* Add new things just above here ---^</span></div><div class="line"><a name="l01197"></a><span class="lineno"> 1197</span>&#160;<span class="comment">         * This is part of the ABI, don&#39;t needlessly break compatibility */</span></div><div class="line"><a name="l01198"></a><span class="lineno"> 1198</span>&#160;};</div><div class="line"><a name="l01199"></a><span class="lineno"> 1199</span>&#160;</div><div class="line"><a name="l01208"></a><span class="lineno"> 1208</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l01209"></a><span class="lineno"> 1209</span>&#160;<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="l01210"></a><span class="lineno"> 1210</span>&#160;                         <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="l01211"></a><span class="lineno"> 1211</span>&#160;</div><div class="line"><a name="l01212"></a><span class="lineno"> 1212</span>&#160;<span class="preprocessor">#ifndef LWS_NO_EXTENSIONS</span></div><div class="line"><a name="l01213"></a><span class="lineno"> 1213</span>&#160;<span class="comment">/* lws_get_internal_extensions() - DEPRECATED</span></div><div class="line"><a name="l01214"></a><span class="lineno"> 1214</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l01215"></a><span class="lineno"> 1215</span>&#160;<span class="comment"> * \Deprecated There is no longer a set internal extensions table.  The table is provided</span></div><div class="line"><a name="l01216"></a><span class="lineno"> 1216</span>&#160;<span class="comment"> * by user code along with application-specific settings.  See the test</span></div><div class="line"><a name="l01217"></a><span class="lineno"> 1217</span>&#160;<span class="comment"> * client and server for how to do.</span></div><div class="line"><a name="l01218"></a><span class="lineno"> 1218</span>&#160;<span class="comment"> */</span></div><div class="line"><a name="l01219"></a><span class="lineno"> 1219</span>&#160;<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="l01220"></a><span class="lineno"> 1220</span>&#160;lws_get_internal_extensions(<span class="keywordtype">void</span>) { <span class="keywordflow">return</span> NULL; }</div><div class="line"><a name="l01221"></a><span class="lineno"> 1221</span>&#160;</div><div class="line"><a name="l01232"></a><span class="lineno"> 1232</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span> LWS_WARN_UNUSED_RESULT</div><div class="line"><a name="l01233"></a><span class="lineno"> 1233</span>&#160;<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="l01234"></a><span class="lineno"> 1234</span>&#160;                       <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="l01235"></a><span class="lineno"> 1235</span>&#160;                       <span class="keyword">const</span> <span class="keywordtype">char</span> *o, <span class="keywordtype">int</span> len);</div><div class="line"><a name="l01236"></a><span class="lineno"> 1236</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l01237"></a><span class="lineno"> 1237</span>&#160;</div><div class="line"><a name="l01250"></a><span class="lineno"> 1250</span>&#160;LWS_EXTERN</div><div class="line"><a name="l01251"></a><span class="lineno"> 1251</span>&#160;<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="l01252"></a><span class="lineno"> 1252</span>&#160;        <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="l01253"></a><span class="lineno"> 1253</span>&#160;        <span class="keyword">struct</span> lws *wsi, <span class="keyword">enum</span> lws_extension_callback_reasons reason,</div><div class="line"><a name="l01254"></a><span class="lineno"> 1254</span>&#160;        <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="l01255"></a><span class="lineno"> 1255</span>&#160;</div><div class="line"><a name="l01256"></a><span class="lineno"> 1256</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l01257"></a><span class="lineno"> 1257</span>&#160;<span class="comment"> * The internal exts are part of the public abi</span></div><div class="line"><a name="l01258"></a><span class="lineno"> 1258</span>&#160;<span class="comment"> * If we add more extensions, publish the callback here  ------v</span></div><div class="line"><a name="l01259"></a><span class="lineno"> 1259</span>&#160;<span class="comment"> */</span></div><div class="line"><a name="l01261"></a><span class="lineno"> 1261</span>&#160;</div><div class="line"><a name="l01277"></a><span class="lineno"> 1277</span>&#160;</div><div class="line"><a name="l01281"></a><span class="lineno"><a class="line" href="structlws__protocols.html"> 1281</a></span>&#160;<span class="keyword">struct </span><a class="code" href="structlws__protocols.html">lws_protocols</a> {</div><div class="line"><a name="l01282"></a><span class="lineno"><a class="line" href="structlws__protocols.html#a0e63edb457a613c3fa4271e0a8f19624"> 1282</a></span>&#160;        <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="l01285"></a><span class="lineno"><a class="line" href="structlws__protocols.html#acabf94c1a9bfe7be0387fbb0e0c56b2d"> 1285</a></span>&#160;        <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="l01289"></a><span class="lineno"><a class="line" href="structlws__protocols.html#a9bbd85f591ffb4259711cb5acbb05bea"> 1289</a></span>&#160;        <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="l01294"></a><span class="lineno"><a class="line" href="structlws__protocols.html#a0d1d4996d81b2f5e125bcec981e461c5"> 1294</a></span>&#160;        <span class="keywordtype">size_t</span> <a class="code" href="structlws__protocols.html#a0d1d4996d81b2f5e125bcec981e461c5">rx_buffer_size</a>;</div><div class="line"><a name="l01303"></a><span class="lineno"><a class="line" href="structlws__protocols.html#a6b632018590c2b1bbe43fbab6d5e6fac"> 1303</a></span>&#160;        <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="l01310"></a><span class="lineno"><a class="line" href="structlws__protocols.html#a3cbd903ad076736ae934a54cae36580e"> 1310</a></span>&#160;        <span class="keywordtype">void</span> *<a class="code" href="structlws__protocols.html#a3cbd903ad076736ae934a54cae36580e">user</a>; </div><div class="line"><a name="l01313"></a><span class="lineno"> 1313</span>&#160;        <span class="comment">/* Add new things just above here ---^</span></div><div class="line"><a name="l01314"></a><span class="lineno"> 1314</span>&#160;<span class="comment">         * This is part of the ABI, don&#39;t needlessly break compatibility */</span></div><div class="line"><a name="l01315"></a><span class="lineno"> 1315</span>&#160;};</div><div class="line"><a name="l01316"></a><span class="lineno"> 1316</span>&#160;</div><div class="line"><a name="l01317"></a><span class="lineno"> 1317</span>&#160;<span class="keyword">struct </span>lws_vhost;</div><div class="line"><a name="l01318"></a><span class="lineno"> 1318</span>&#160;</div><div class="line"><a name="l01327"></a><span class="lineno"> 1327</span>&#160;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="l01328"></a><span class="lineno"> 1328</span>&#160;<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="l01329"></a><span class="lineno"> 1329</span>&#160;</div><div class="line"><a name="l01339"></a><span class="lineno"> 1339</span>&#160;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="l01340"></a><span class="lineno"> 1340</span>&#160;<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="l01341"></a><span class="lineno"> 1341</span>&#160;</div><div class="line"><a name="l01343"></a><span class="lineno"> 1343</span>&#160;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="l01344"></a><span class="lineno"> 1344</span>&#160;<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="l01345"></a><span class="lineno"> 1345</span>&#160;</div><div class="line"><a name="l01356"></a><span class="lineno"> 1356</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">void</span> *</div><div class="line"><a name="l01357"></a><span class="lineno"> 1357</span>&#160;<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="l01358"></a><span class="lineno"> 1358</span>&#160;                            <span class="keywordtype">int</span> size);</div><div class="line"><a name="l01359"></a><span class="lineno"> 1359</span>&#160;</div><div class="line"><a name="l01369"></a><span class="lineno"> 1369</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">void</span> *</div><div class="line"><a name="l01370"></a><span class="lineno"> 1370</span>&#160;<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="l01371"></a><span class="lineno"> 1371</span>&#160;</div><div class="line"><a name="l01380"></a><span class="lineno"> 1380</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l01381"></a><span class="lineno"> 1381</span>&#160;<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="l01382"></a><span class="lineno"> 1382</span>&#160;</div><div class="line"><a name="l01383"></a><span class="lineno"> 1383</span>&#160;<span class="preprocessor">#ifdef LWS_WITH_PLUGINS</span></div><div class="line"><a name="l01384"></a><span class="lineno"> 1384</span>&#160;</div><div class="line"><a name="l01385"></a><span class="lineno"> 1385</span>&#160;<span class="comment">/* PLUGINS implies LIBUV */</span></div><div class="line"><a name="l01386"></a><span class="lineno"> 1386</span>&#160;</div><div class="line"><a name="l01387"></a><span class="lineno"> 1387</span>&#160;<span class="preprocessor">#define LWS_PLUGIN_API_MAGIC 180</span></div><div class="line"><a name="l01388"></a><span class="lineno"> 1388</span>&#160;</div><div class="line"><a name="l01390"></a><span class="lineno"><a class="line" href="structlws__plugin__capability.html"> 1390</a></span>&#160;<span class="keyword">struct </span><a class="code" href="structlws__plugin__capability.html">lws_plugin_capability</a> {</div><div class="line"><a name="l01391"></a><span class="lineno"><a class="line" href="structlws__plugin__capability.html#a523c7cde6f15bba345f56493dcf6b32a"> 1391</a></span>&#160;        <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="l01392"></a><span class="lineno"><a class="line" href="structlws__plugin__capability.html#a6a4d9d01e770f378ddadc77b37522033"> 1392</a></span>&#160;        <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="l01393"></a><span class="lineno"><a class="line" href="structlws__plugin__capability.html#ae38f7cf1246b9ca3af3cbf9d46b7090f"> 1393</a></span>&#160;        <span class="keywordtype">int</span> <a class="code" href="structlws__plugin__capability.html#ae38f7cf1246b9ca3af3cbf9d46b7090f">count_protocols</a>; </div><div class="line"><a name="l01394"></a><span class="lineno"><a class="line" href="structlws__plugin__capability.html#a7936f0eb93d79dea76b903d0f8a5f623"> 1394</a></span>&#160;        <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="l01395"></a><span class="lineno"><a class="line" href="structlws__plugin__capability.html#abcf51db969522fdda9aaf902e65739d3"> 1395</a></span>&#160;        <span class="keywordtype">int</span> <a class="code" href="structlws__plugin__capability.html#abcf51db969522fdda9aaf902e65739d3">count_extensions</a>; </div><div class="line"><a name="l01396"></a><span class="lineno"> 1396</span>&#160;};</div><div class="line"><a name="l01397"></a><span class="lineno"> 1397</span>&#160;</div><div class="line"><a name="l01398"></a><span class="lineno"> 1398</span>&#160;<span class="keyword">typedef</span> int (*lws_plugin_init_func)(<span class="keyword">struct </span>lws_context *,</div><div class="line"><a name="l01399"></a><span class="lineno"> 1399</span>&#160;                                    <span class="keyword">struct </span><a class="code" href="structlws__plugin__capability.html">lws_plugin_capability</a> *);</div><div class="line"><a name="l01400"></a><span class="lineno"> 1400</span>&#160;<span class="keyword">typedef</span> int (*lws_plugin_destroy_func)(<span class="keyword">struct </span>lws_context *);</div><div class="line"><a name="l01401"></a><span class="lineno"> 1401</span>&#160;</div><div class="line"><a name="l01403"></a><span class="lineno"><a class="line" href="structlws__plugin.html"> 1403</a></span>&#160;<span class="keyword">struct </span><a class="code" href="structlws__plugin.html">lws_plugin</a> {</div><div class="line"><a name="l01404"></a><span class="lineno"><a class="line" href="structlws__plugin.html#a65dffd68fd267ce17b988790d1d35f22"> 1404</a></span>&#160;        <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="l01405"></a><span class="lineno"> 1405</span>&#160;<span class="preprocessor">#if (UV_VERSION_MAJOR &gt; 0)</span></div><div class="line"><a name="l01406"></a><span class="lineno"><a class="line" href="structlws__plugin.html#af9e1042dc1de5b9d202c2f5fd1834330"> 1406</a></span>&#160;        uv_lib_t <a class="code" href="structlws__plugin.html#af9e1042dc1de5b9d202c2f5fd1834330">lib</a>; </div><div class="line"><a name="l01407"></a><span class="lineno"> 1407</span>&#160;<span class="preprocessor">#else</span></div><div class="line"><a name="l01408"></a><span class="lineno"><a class="line" href="structlws__plugin.html#a4ef37a43653715b6c69cbf8a7be747f4"> 1408</a></span>&#160;        <span class="keywordtype">void</span> *<a class="code" href="structlws__plugin.html#a4ef37a43653715b6c69cbf8a7be747f4">l</a>; </div><div class="line"><a name="l01409"></a><span class="lineno"> 1409</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l01410"></a><span class="lineno"><a class="line" href="structlws__plugin.html#af4ac8fcb79e10e0c2d960e1804d98105"> 1410</a></span>&#160;        <span class="keywordtype">char</span> <a class="code" href="structlws__plugin.html#af4ac8fcb79e10e0c2d960e1804d98105">name</a>[64]; </div><div class="line"><a name="l01411"></a><span class="lineno"><a class="line" href="structlws__plugin.html#ac7f1fdfe8cf8a21f8ee9720c21934a3f"> 1411</a></span>&#160;        <span class="keyword">struct </span><a class="code" href="structlws__plugin__capability.html">lws_plugin_capability</a> caps; </div><div class="line"><a name="l01412"></a><span class="lineno"> 1412</span>&#160;};</div><div class="line"><a name="l01413"></a><span class="lineno"> 1413</span>&#160;</div><div class="line"><a name="l01414"></a><span class="lineno"> 1414</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l01415"></a><span class="lineno"> 1415</span>&#160;</div><div class="line"><a name="l01417"></a><span class="lineno"> 1417</span>&#160;</div><div class="line"><a name="l01418"></a><span class="lineno"> 1418</span>&#160;</div><div class="line"><a name="l01427"></a><span class="lineno"> 1427</span>&#160;</div><div class="line"><a name="l01429"></a><span class="lineno"> 1429</span>&#160;<span class="preprocessor">#define LWSGS_EMAIL_CONTENT_SIZE 16384</span></div><div class="line"><a name="l01430"></a><span class="lineno"> 1430</span>&#160;</div><div class="line"><a name="l01432"></a><span class="lineno"> 1432</span>&#160;<span class="comment">/* SHA-1 binary and hexified versions */</span></div><div class="line"><a name="l01434"></a><span class="lineno"><a class="line" href="structlwsgw__hash__bin.html#ac92f50d9471058525d110597a4e0de6b"> 1434</a></span>&#160;<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="l01436"></a><span class="lineno"><a class="line" href="structlwsgw__hash.html#a29435f5cf78747d4257695b0f141d164"> 1436</a></span>&#160;<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="l01437"></a><span class="lineno"> 1437</span>&#160;</div><div class="line"><a name="l01439"></a><span class="lineno"><a class="line" href="group__generic-sessions.html#ga7c2dc7bfb4ccb91c5d771f9e9ea237e1"> 1439</a></span>&#160;<span class="keyword">enum</span> <a class="code" href="group__generic-sessions.html#ga7c2dc7bfb4ccb91c5d771f9e9ea237e1">lwsgs_auth_bits</a> {</div><div class="line"><a name="l01440"></a><span class="lineno"><a class="line" href="group__generic-sessions.html#gga7c2dc7bfb4ccb91c5d771f9e9ea237e1a81e63075115dedd150265d81b8f7fa57"> 1440</a></span>&#160;        <a class="code" href="group__generic-sessions.html#gga7c2dc7bfb4ccb91c5d771f9e9ea237e1a81e63075115dedd150265d81b8f7fa57">LWSGS_AUTH_LOGGED_IN</a> = 1, </div><div class="line"><a name="l01441"></a><span class="lineno"><a class="line" href="group__generic-sessions.html#gga7c2dc7bfb4ccb91c5d771f9e9ea237e1a0657a9e846814781b128c397fe4b10bf"> 1441</a></span>&#160;        <a class="code" href="group__generic-sessions.html#gga7c2dc7bfb4ccb91c5d771f9e9ea237e1a0657a9e846814781b128c397fe4b10bf">LWSGS_AUTH_ADMIN</a> = 2,   </div><div class="line"><a name="l01442"></a><span class="lineno"><a class="line" href="group__generic-sessions.html#gga7c2dc7bfb4ccb91c5d771f9e9ea237e1a5a607e4668d20cadada62c4b8007f887"> 1442</a></span>&#160;        <a class="code" href="group__generic-sessions.html#gga7c2dc7bfb4ccb91c5d771f9e9ea237e1a5a607e4668d20cadada62c4b8007f887">LWSGS_AUTH_VERIFIED</a> = 4,  </div><div class="line"><a name="l01443"></a><span class="lineno"><a class="line" href="group__generic-sessions.html#gga7c2dc7bfb4ccb91c5d771f9e9ea237e1a2cd8fb86e3b85c106e7711c03f0ddd0a"> 1443</a></span>&#160;        <a class="code" href="group__generic-sessions.html#gga7c2dc7bfb4ccb91c5d771f9e9ea237e1a2cd8fb86e3b85c106e7711c03f0ddd0a">LWSGS_AUTH_FORGOT_FLOW</a> = 8,     </div><div class="line"><a name="l01444"></a><span class="lineno"> 1444</span>&#160;};</div><div class="line"><a name="l01445"></a><span class="lineno"> 1445</span>&#160;</div><div class="line"><a name="l01447"></a><span class="lineno"><a class="line" href="structlws__session__info.html"> 1447</a></span>&#160;<span class="keyword">struct </span><a class="code" href="structlws__session__info.html">lws_session_info</a> {</div><div class="line"><a name="l01448"></a><span class="lineno"><a class="line" href="structlws__session__info.html#a3d57a70b6e7181d95a8bec429b1a7697"> 1448</a></span>&#160;        <span class="keywordtype">char</span> username[32]; </div><div class="line"><a name="l01449"></a><span class="lineno"><a class="line" href="structlws__session__info.html#a94b813cfc6b0da4b182659de30038ad3"> 1449</a></span>&#160;        <span class="keywordtype">char</span> email[100]; </div><div class="line"><a name="l01450"></a><span class="lineno"><a class="line" href="structlws__session__info.html#a53eed02325e8717a53297391e3e98fac"> 1450</a></span>&#160;        <span class="keywordtype">char</span> ip[72]; </div><div class="line"><a name="l01451"></a><span class="lineno"><a class="line" href="structlws__session__info.html#afb924864b70f40372920688a5c1c895e"> 1451</a></span>&#160;        <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="l01453"></a><span class="lineno"><a class="line" href="structlws__session__info.html#a4353b5dd19400b2b15edfd7cee1e4cd5"> 1453</a></span>&#160;        <span class="keywordtype">char</span> session[42]; </div><div class="line"><a name="l01454"></a><span class="lineno"> 1454</span>&#160;};</div><div class="line"><a name="l01455"></a><span class="lineno"> 1455</span>&#160;</div><div class="line"><a name="l01457"></a><span class="lineno"><a class="line" href="group__generic-sessions.html#gaa93946b3d921072209d5cd8cdfa5332e"> 1457</a></span>&#160;<span class="keyword">enum</span> <a class="code" href="group__generic-sessions.html#gaa93946b3d921072209d5cd8cdfa5332e">lws_gs_event</a> {</div><div class="line"><a name="l01458"></a><span class="lineno"><a class="line" href="group__generic-sessions.html#ggaa93946b3d921072209d5cd8cdfa5332ea596010a165bf13473c5eea3a34cd4308"> 1458</a></span>&#160;        <a class="code" href="group__generic-sessions.html#ggaa93946b3d921072209d5cd8cdfa5332ea596010a165bf13473c5eea3a34cd4308">LWSGSE_CREATED</a>, </div><div class="line"><a name="l01459"></a><span class="lineno"><a class="line" href="group__generic-sessions.html#ggaa93946b3d921072209d5cd8cdfa5332ead908cdc5689c5d22c9d3c8934e94dcde"> 1459</a></span>&#160;        <a class="code" href="group__generic-sessions.html#ggaa93946b3d921072209d5cd8cdfa5332ead908cdc5689c5d22c9d3c8934e94dcde">LWSGSE_DELETED</a>  </div><div class="line"><a name="l01460"></a><span class="lineno"> 1460</span>&#160;};</div><div class="line"><a name="l01461"></a><span class="lineno"> 1461</span>&#160;</div><div class="line"><a name="l01463"></a><span class="lineno"><a class="line" href="structlws__gs__event__args.html"> 1463</a></span>&#160;<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="l01464"></a><span class="lineno"><a class="line" href="structlws__gs__event__args.html#a477274f8ca22ba7411b9285b9dc8dd06"> 1464</a></span>&#160;        <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="l01465"></a><span class="lineno"><a class="line" href="structlws__gs__event__args.html#a2bec693d8a43730d487004a44326178b"> 1465</a></span>&#160;        <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="l01466"></a><span class="lineno"><a class="line" href="structlws__gs__event__args.html#acd17e4f9f91f7f9a8f0fbf0744a3a463"> 1466</a></span>&#160;        <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="l01467"></a><span class="lineno"> 1467</span>&#160;};</div><div class="line"><a name="l01468"></a><span class="lineno"> 1468</span>&#160;</div><div class="line"><a name="l01470"></a><span class="lineno"> 1470</span>&#160;</div><div class="line"><a name="l01471"></a><span class="lineno"> 1471</span>&#160;</div><div class="line"><a name="l01485"></a><span class="lineno"> 1485</span>&#160;</div><div class="line"><a name="l01487"></a><span class="lineno"> 1487</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l01488"></a><span class="lineno"> 1488</span>&#160;<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="l01489"></a><span class="lineno"> 1489</span>&#160;<span class="comment"> * add it at where specified so existing users are unaffected.</span></div><div class="line"><a name="l01490"></a><span class="lineno"> 1490</span>&#160;<span class="comment"> */</span></div><div class="line"><a name="l01491"></a><span class="lineno"> 1491</span>&#160;</div><div class="line"><a name="l01493"></a><span class="lineno"><a class="line" href="group__context-and-vhost.html#ga41c2d763f78cc248df3b9f8645dbd2a5"> 1493</a></span>&#160;<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="l01494"></a><span class="lineno"><a class="line" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a274ed462a1a9239eb6ddf9007f5b7092"> 1494</a></span>&#160;        <a class="code" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a274ed462a1a9239eb6ddf9007f5b7092">LWS_SERVER_OPTION_REQUIRE_VALID_OPENSSL_CLIENT_CERT</a>     = (1 &lt;&lt; 1) |</div><div class="line"><a name="l01495"></a><span class="lineno"> 1495</span>&#160;                                                                  (1 &lt;&lt; 12),</div><div class="line"><a name="l01499"></a><span class="lineno"><a class="line" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a6582c985ee0ceaadc1d277030eae2d7c"> 1499</a></span>&#160;        <a class="code" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a6582c985ee0ceaadc1d277030eae2d7c">LWS_SERVER_OPTION_SKIP_SERVER_CANONICAL_NAME</a>            = (1 &lt;&lt; 2),</div><div class="line"><a name="l01501"></a><span class="lineno"><a class="line" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a1cc4562d05cba52a6dfa0697a65ade0d"> 1501</a></span>&#160;        <a class="code" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a1cc4562d05cba52a6dfa0697a65ade0d">LWS_SERVER_OPTION_ALLOW_NON_SSL_ON_SSL_PORT</a>             = (1 &lt;&lt; 3) |</div><div class="line"><a name="l01502"></a><span class="lineno"> 1502</span>&#160;                                                                  (1 &lt;&lt; 12),</div><div class="line"><a name="l01506"></a><span class="lineno"><a class="line" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a273d9975675130de0c6dc937dde7c8a6"> 1506</a></span>&#160;        <a class="code" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a273d9975675130de0c6dc937dde7c8a6">LWS_SERVER_OPTION_LIBEV</a>                                 = (1 &lt;&lt; 4),</div><div class="line"><a name="l01508"></a><span class="lineno"><a class="line" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a34ab36e68c0d593b6f19b8d5ef1240a9"> 1508</a></span>&#160;        <a class="code" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a34ab36e68c0d593b6f19b8d5ef1240a9">LWS_SERVER_OPTION_DISABLE_IPV6</a>                          = (1 &lt;&lt; 5),</div><div class="line"><a name="l01510"></a><span class="lineno"><a class="line" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a4933347a821e73c3f1e13fb6bfc7ad93"> 1510</a></span>&#160;        <a class="code" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a4933347a821e73c3f1e13fb6bfc7ad93">LWS_SERVER_OPTION_DISABLE_OS_CA_CERTS</a>                   = (1 &lt;&lt; 6),</div><div class="line"><a name="l01513"></a><span class="lineno"><a class="line" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5ac56a8a6590e74a8016d0fae09fb404fc"> 1513</a></span>&#160;        <a class="code" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5ac56a8a6590e74a8016d0fae09fb404fc">LWS_SERVER_OPTION_PEER_CERT_NOT_REQUIRED</a>                = (1 &lt;&lt; 7),</div><div class="line"><a name="l01515"></a><span class="lineno"><a class="line" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5aa0158b4e85420811e6b0f1378c6ded0f"> 1515</a></span>&#160;        <a class="code" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5aa0158b4e85420811e6b0f1378c6ded0f">LWS_SERVER_OPTION_VALIDATE_UTF8</a>                         = (1 &lt;&lt; 8),</div><div class="line"><a name="l01517"></a><span class="lineno"><a class="line" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a1b2f8bde0f62adc7ebe81b2043f34c0c"> 1517</a></span>&#160;        <a class="code" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a1b2f8bde0f62adc7ebe81b2043f34c0c">LWS_SERVER_OPTION_SSL_ECDH</a>                              = (1 &lt;&lt; 9) |</div><div class="line"><a name="l01518"></a><span class="lineno"> 1518</span>&#160;                                                                  (1 &lt;&lt; 12),</div><div class="line"><a name="l01520"></a><span class="lineno"><a class="line" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5aff121db04a10cf8b2c5df9d4f2b89f1e"> 1520</a></span>&#160;        <a class="code" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5aff121db04a10cf8b2c5df9d4f2b89f1e">LWS_SERVER_OPTION_LIBUV</a>                                 = (1 &lt;&lt; 10),</div><div class="line"><a name="l01522"></a><span class="lineno"><a class="line" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a4832187186c4d130c68051214cd42ada"> 1522</a></span>&#160;        <a class="code" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a4832187186c4d130c68051214cd42ada">LWS_SERVER_OPTION_REDIRECT_HTTP_TO_HTTPS</a>                = (1 &lt;&lt; 11) |</div><div class="line"><a name="l01523"></a><span class="lineno"> 1523</span>&#160;                                                                  (1 &lt;&lt; 12),</div><div class="line"><a name="l01526"></a><span class="lineno"><a class="line" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a7fed6a527c8d5e0acac1b4179644583a"> 1526</a></span>&#160;        <a class="code" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a7fed6a527c8d5e0acac1b4179644583a">LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT</a>                    = (1 &lt;&lt; 12),</div><div class="line"><a name="l01528"></a><span class="lineno"><a class="line" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5accc9d0d11d1124a21659586164b0962e"> 1528</a></span>&#160;        <a class="code" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5accc9d0d11d1124a21659586164b0962e">LWS_SERVER_OPTION_EXPLICIT_VHOSTS</a>                       = (1 &lt;&lt; 13),</div><div class="line"><a name="l01531"></a><span class="lineno"><a class="line" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a9637e9001d8c8b2521086bcafbd8a941"> 1531</a></span>&#160;        <a class="code" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a9637e9001d8c8b2521086bcafbd8a941">LWS_SERVER_OPTION_UNIX_SOCK</a>                             = (1 &lt;&lt; 14),</div><div class="line"><a name="l01533"></a><span class="lineno"><a class="line" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5ac962efd35abf6c402f9fb14aa14f5016"> 1533</a></span>&#160;        <a class="code" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5ac962efd35abf6c402f9fb14aa14f5016">LWS_SERVER_OPTION_STS</a>                                   = (1 &lt;&lt; 15),</div><div class="line"><a name="l01536"></a><span class="lineno"><a class="line" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5af62887536e25e053e68741006dba46d8"> 1536</a></span>&#160;        <a class="code" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5af62887536e25e053e68741006dba46d8">LWS_SERVER_OPTION_IPV6_V6ONLY_MODIFY</a>                    = (1 &lt;&lt; 16),</div><div class="line"><a name="l01538"></a><span class="lineno"><a class="line" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5aca5d42820b65eac5618ec3f0bd8a1160"> 1538</a></span>&#160;        <a class="code" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5aca5d42820b65eac5618ec3f0bd8a1160">LWS_SERVER_OPTION_IPV6_V6ONLY_VALUE</a>                     = (1 &lt;&lt; 17),</div><div class="line"><a name="l01540"></a><span class="lineno"><a class="line" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a87a824b2e812f4c3e7f2c4a1ea4f8abd"> 1540</a></span>&#160;        <a class="code" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a87a824b2e812f4c3e7f2c4a1ea4f8abd">LWS_SERVER_OPTION_UV_NO_SIGSEGV_SIGFPE_SPIN</a>             = (1 &lt;&lt; 18),</div><div class="line"><a name="l01547"></a><span class="lineno"> 1547</span>&#160;        <span class="comment">/****** add new things just above ---^ ******/</span></div><div class="line"><a name="l01548"></a><span class="lineno"> 1548</span>&#160;};</div><div class="line"><a name="l01549"></a><span class="lineno"> 1549</span>&#160;</div><div class="line"><a name="l01550"></a><span class="lineno"> 1550</span>&#160;<span class="preprocessor">#define lws_check_opt(c, f) (((c) &amp; (f)) == (f))</span></div><div class="line"><a name="l01551"></a><span class="lineno"> 1551</span>&#160;</div><div class="line"><a name="l01561"></a><span class="lineno"><a class="line" href="structlws__context__creation__info.html"> 1561</a></span>&#160;<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="l01562"></a><span class="lineno"><a class="line" href="structlws__context__creation__info.html#a424a5ce268d6903e42243be94487ab85"> 1562</a></span>&#160;        <span class="keywordtype">int</span> <a class="code" href="structlws__context__creation__info.html#a424a5ce268d6903e42243be94487ab85">port</a>;</div><div class="line"><a name="l01567"></a><span class="lineno"><a class="line" href="structlws__context__creation__info.html#a75434932bb5df54665ea678eb8ac104a"> 1567</a></span>&#160;        <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="l01574"></a><span class="lineno"><a class="line" href="structlws__context__creation__info.html#abb90ffb3e6d6db2db20f529d61bd9122"> 1574</a></span>&#160;        <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="l01578"></a><span class="lineno"><a class="line" href="structlws__context__creation__info.html#a4a3d1155fc52f5048b481884f6fb947c"> 1578</a></span>&#160;        <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="l01581"></a><span class="lineno"><a class="line" href="structlws__context__creation__info.html#ac8a75b7b259a3c3a5fbb4219a3f06c29"> 1581</a></span>&#160;        <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="l01584"></a><span class="lineno"><a class="line" href="structlws__context__creation__info.html#af3fb447be15c4fcb01d3285a6678ab54"> 1584</a></span>&#160;        <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="l01586"></a><span class="lineno"><a class="line" href="structlws__context__creation__info.html#ac62b0f0e8e402412ba5011d15c244103"> 1586</a></span>&#160;        <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="l01590"></a><span class="lineno"><a class="line" href="structlws__context__creation__info.html#ab9ec8893e0f7843cf5d783d2f350ef14"> 1590</a></span>&#160;        <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="l01596"></a><span class="lineno"><a class="line" href="structlws__context__creation__info.html#a4f8e65c3a059d3b586fafa9ef3282c29"> 1596</a></span>&#160;        <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="l01598"></a><span class="lineno"><a class="line" href="structlws__context__creation__info.html#a3e1516fd7fed26bfa77c0246ed26c2eb"> 1598</a></span>&#160;        <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="l01602"></a><span class="lineno"><a class="line" href="structlws__context__creation__info.html#aef917c0b23976a264d2474901b4f5aa3"> 1602</a></span>&#160;        <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="l01605"></a><span class="lineno"><a class="line" href="structlws__context__creation__info.html#a7b59f2bdc869871e7bde232db94f5ca6"> 1605</a></span>&#160;        <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="l01607"></a><span class="lineno"><a class="line" href="structlws__context__creation__info.html#a9c9d22437de92c197f3cee52912b2c03"> 1607</a></span>&#160;        <span class="keywordtype">int</span> <a class="code" href="structlws__context__creation__info.html#a9c9d22437de92c197f3cee52912b2c03">gid</a>;</div><div class="line"><a name="l01609"></a><span class="lineno"><a class="line" href="structlws__context__creation__info.html#ac105b4180008cb3e672d57beead8382e"> 1609</a></span>&#160;        <span class="keywordtype">int</span> <a class="code" href="structlws__context__creation__info.html#ac105b4180008cb3e672d57beead8382e">uid</a>;</div><div class="line"><a name="l01611"></a><span class="lineno"><a class="line" href="structlws__context__creation__info.html#a9d3b17a25e1fbc772f21eb4959a82724"> 1611</a></span>&#160;        <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="l01613"></a><span class="lineno"><a class="line" href="structlws__context__creation__info.html#a0e9d94cdfb893d777b4a4db81e7b5ac0"> 1613</a></span>&#160;        <span class="keywordtype">void</span> *<a class="code" href="structlws__context__creation__info.html#a0e9d94cdfb893d777b4a4db81e7b5ac0">user</a>;</div><div class="line"><a name="l01616"></a><span class="lineno"><a class="line" href="structlws__context__creation__info.html#ac583ce92b8e1c949cb6fef6bfe713d56"> 1616</a></span>&#160;        <span class="keywordtype">int</span> <a class="code" href="structlws__context__creation__info.html#ac583ce92b8e1c949cb6fef6bfe713d56">ka_time</a>;</div><div class="line"><a name="l01619"></a><span class="lineno"><a class="line" href="structlws__context__creation__info.html#a3baab4285c679fbe027c2504621d7410"> 1619</a></span>&#160;        <span class="keywordtype">int</span> <a class="code" href="structlws__context__creation__info.html#a3baab4285c679fbe027c2504621d7410">ka_probes</a>;</div><div class="line"><a name="l01623"></a><span class="lineno"><a class="line" href="structlws__context__creation__info.html#a381342a398883d6204955ff3c1849ddd"> 1623</a></span>&#160;        <span class="keywordtype">int</span> <a class="code" href="structlws__context__creation__info.html#a381342a398883d6204955ff3c1849ddd">ka_interval</a>;</div><div class="line"><a name="l01626"></a><span class="lineno"> 1626</span>&#160;<span class="preprocessor">#ifdef LWS_OPENSSL_SUPPORT</span></div><div class="line"><a name="l01627"></a><span class="lineno"><a class="line" href="structlws__context__creation__info.html#a1654d41bea6fb2f619b57e6a264b26a4"> 1627</a></span>&#160;        <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="l01632"></a><span class="lineno"> 1632</span>&#160;<span class="preprocessor">#else </span><span class="comment">/* maintain structure layout either way */</span><span class="preprocessor"></span></div><div class="line"><a name="l01633"></a><span class="lineno"><a class="line" href="structlws__context__creation__info.html#a0e790dda6202604f73a03b6149bc12bb"> 1633</a></span>&#160;        <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="l01634"></a><span class="lineno"> 1634</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l01635"></a><span class="lineno"> 1635</span>&#160;</div><div class="line"><a name="l01636"></a><span class="lineno"><a class="line" href="structlws__context__creation__info.html#a0cdfd3c484689ba6f0f2cc91b38ce948"> 1636</a></span>&#160;        <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="l01639"></a><span class="lineno"><a class="line" href="structlws__context__creation__info.html#a0b154e79abc1167ba4ac3539f4af6720"> 1639</a></span>&#160;        <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="l01646"></a><span class="lineno"><a class="line" href="structlws__context__creation__info.html#ae52f3237e144e9ddcab5e2cf91d1e419"> 1646</a></span>&#160;        <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="l01648"></a><span class="lineno"><a class="line" href="structlws__context__creation__info.html#a45e63e24c88289e0c8352377ef4d3646"> 1648</a></span>&#160;        <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="l01652"></a><span class="lineno"><a class="line" href="structlws__context__creation__info.html#a6cfa3d51df2def3349a5cbf0d712822d"> 1652</a></span>&#160;        <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="l01657"></a><span class="lineno"><a class="line" href="structlws__context__creation__info.html#afa5d4e7d9f86b58a1c6fac14f0a5f5f9"> 1657</a></span>&#160;        <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="l01659"></a><span class="lineno"><a class="line" href="structlws__context__creation__info.html#ad50db098a208f045f7811207d2bee4b9"> 1659</a></span>&#160;        <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="l01663"></a><span class="lineno"><a class="line" href="structlws__context__creation__info.html#a8122cfc0810bafe51edb3ba6bf9a1251"> 1663</a></span>&#160;        <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="l01666"></a><span class="lineno"><a class="line" href="structlws__context__creation__info.html#a999866fcd15dbd621773436f97190458"> 1666</a></span>&#160;        <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="l01669"></a><span class="lineno"><a class="line" href="structlws__context__creation__info.html#a81697c6b763b5ef3ee52862bc70b07d6"> 1669</a></span>&#160;        <span class="keywordtype">int</span> <a class="code" href="structlws__context__creation__info.html#a81697c6b763b5ef3ee52862bc70b07d6">keepalive_timeout</a>;</div><div class="line"><a name="l01672"></a><span class="lineno"><a class="line" href="structlws__context__creation__info.html#ad0e95ba721f7bd2b676719f8093c23a2"> 1672</a></span>&#160;        <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="l01675"></a><span class="lineno"><a class="line" href="structlws__context__creation__info.html#a13ffbb0d010309669611f8c4eda7d7f8"> 1675</a></span>&#160;        <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="l01677"></a><span class="lineno"><a class="line" href="structlws__context__creation__info.html#a137a9b9de4f6a7993fed8746d551e616"> 1677</a></span>&#160;        <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="l01680"></a><span class="lineno"><a class="line" href="structlws__context__creation__info.html#a57f88c0745adbd1d6b9b619b8de30209"> 1680</a></span>&#160;        <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="l01686"></a><span class="lineno"><a class="line" href="structlws__context__creation__info.html#aa8d9e85e137f35fb006f2e4a53f0887a"> 1686</a></span>&#160;        <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="l01691"></a><span class="lineno"><a class="line" href="structlws__context__creation__info.html#a704940261951ced6b5d8191bd8b9bb2d"> 1691</a></span>&#160;        <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="l01693"></a><span class="lineno"><a class="line" href="structlws__context__creation__info.html#adb0bc0b28cd7d90ab306723d8ffa96fa"> 1693</a></span>&#160;        <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="l01695"></a><span class="lineno"><a class="line" href="structlws__context__creation__info.html#a33a1a25a7df3793f59047e20dd580078"> 1695</a></span>&#160;        <span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> <a class="code" href="structlws__context__creation__info.html#a33a1a25a7df3793f59047e20dd580078">ws_ping_pong_interval</a>;</div><div class="line"><a name="l01707"></a><span class="lineno"><a class="line" href="structlws__context__creation__info.html#a8ca0ec6b8675c13849bbdcdc0d50c9a3"> 1707</a></span>&#160;        <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#a8ca0ec6b8675c13849bbdcdc0d50c9a3">headers</a>;</div><div class="line"><a name="l01711"></a><span class="lineno"><a class="line" href="structlws__context__creation__info.html#a6b059b7ee248cba72a3a4fd6141b0b34"> 1711</a></span>&#160;        <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#a6b059b7ee248cba72a3a4fd6141b0b34">reject_service_keywords</a>;</div><div class="line"><a name="l01719"></a><span class="lineno"> 1719</span>&#160;        <span class="comment">/* Add new things just above here ---^</span></div><div class="line"><a name="l01720"></a><span class="lineno"> 1720</span>&#160;<span class="comment">         * This is part of the ABI, don&#39;t needlessly break compatibility</span></div><div class="line"><a name="l01721"></a><span class="lineno"> 1721</span>&#160;<span class="comment">         *</span></div><div class="line"><a name="l01722"></a><span class="lineno"> 1722</span>&#160;<span class="comment">         * The below is to ensure later library versions with new</span></div><div class="line"><a name="l01723"></a><span class="lineno"> 1723</span>&#160;<span class="comment">         * members added above will see 0 (default) even if the app</span></div><div class="line"><a name="l01724"></a><span class="lineno"> 1724</span>&#160;<span class="comment">         * was not built against the newer headers.</span></div><div class="line"><a name="l01725"></a><span class="lineno"> 1725</span>&#160;<span class="comment">         */</span></div><div class="line"><a name="l01726"></a><span class="lineno"> 1726</span>&#160;</div><div class="line"><a name="l01727"></a><span class="lineno"><a class="line" href="structlws__context__creation__info.html#afce3b59950eca3203faa07381bbed5d7"> 1727</a></span>&#160;        <span class="keywordtype">void</span> *_unused[8]; </div><div class="line"><a name="l01728"></a><span class="lineno"> 1728</span>&#160;};</div><div class="line"><a name="l01729"></a><span class="lineno"> 1729</span>&#160;</div><div class="line"><a name="l01764"></a><span class="lineno"> 1764</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keyword">struct </span>lws_context *</div><div class="line"><a name="l01765"></a><span class="lineno"> 1765</span>&#160;<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="l01766"></a><span class="lineno"> 1766</span>&#160;</div><div class="line"><a name="l01775"></a><span class="lineno"> 1775</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">void</span></div><div class="line"><a name="l01776"></a><span class="lineno"> 1776</span>&#160;<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="l01777"></a><span class="lineno"> 1777</span>&#160;</div><div class="line"><a name="l01795"></a><span class="lineno"> 1795</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l01796"></a><span class="lineno"> 1796</span>&#160;<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="l01797"></a><span class="lineno"> 1797</span>&#160;</div><div class="line"><a name="l01798"></a><span class="lineno"> 1798</span>&#160;</div><div class="line"><a name="l01799"></a><span class="lineno"> 1799</span>&#160;<span class="keyword">struct </span>lws_vhost;</div><div class="line"><a name="l01800"></a><span class="lineno"> 1800</span>&#160;</div><div class="line"><a name="l01810"></a><span class="lineno"> 1810</span>&#160;LWS_EXTERN LWS_VISIBLE <span class="keyword">struct </span>lws_vhost *</div><div class="line"><a name="l01811"></a><span class="lineno"> 1811</span>&#160;<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="l01812"></a><span class="lineno"> 1812</span>&#160;                 <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="l01813"></a><span class="lineno"> 1813</span>&#160;</div><div class="line"><a name="l01828"></a><span class="lineno"> 1828</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l01829"></a><span class="lineno"> 1829</span>&#160;<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="l01830"></a><span class="lineno"> 1830</span>&#160;                         <span class="keywordtype">char</span> **config_strings, <span class="keywordtype">int</span> *len);</div><div class="line"><a name="l01831"></a><span class="lineno"> 1831</span>&#160;</div><div class="line"><a name="l01847"></a><span class="lineno"> 1847</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l01848"></a><span class="lineno"> 1848</span>&#160;<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="l01849"></a><span class="lineno"> 1849</span>&#160;                        <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="l01850"></a><span class="lineno"> 1850</span>&#160;                        <span class="keywordtype">char</span> **config_strings, <span class="keywordtype">int</span> *len);</div><div class="line"><a name="l01851"></a><span class="lineno"> 1851</span>&#160;</div><div class="line"><a name="l01853"></a><span class="lineno"> 1853</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keyword">struct </span>lws_vhost *</div><div class="line"><a name="l01854"></a><span class="lineno"> 1854</span>&#160;<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="l01855"></a><span class="lineno"> 1855</span>&#160;</div><div class="line"><a name="l01861"></a><span class="lineno"> 1861</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keyword">struct </span>lws_vhost *</div><div class="line"><a name="l01862"></a><span class="lineno"> 1862</span>&#160;<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="l01863"></a><span class="lineno"> 1863</span>&#160;</div><div class="line"><a name="l01871"></a><span class="lineno"> 1871</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l01872"></a><span class="lineno"> 1872</span>&#160;<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="l01873"></a><span class="lineno"> 1873</span>&#160;</div><div class="line"><a name="l01881"></a><span class="lineno"> 1881</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l01882"></a><span class="lineno"> 1882</span>&#160;<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="l01883"></a><span class="lineno"> 1883</span>&#160;</div><div class="line"><a name="l01893"></a><span class="lineno"> 1893</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">void</span> *</div><div class="line"><a name="l01894"></a><span class="lineno"> 1894</span>&#160;<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="l01895"></a><span class="lineno"> 1895</span>&#160;</div><div class="line"><a name="l01901"></a><span class="lineno"> 1901</span>&#160;</div><div class="line"><a name="l01908"></a><span class="lineno"><a class="line" href="structlws__protocol__vhost__options.html"> 1908</a></span>&#160;<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="l01909"></a><span class="lineno"><a class="line" href="structlws__protocol__vhost__options.html#abc714ddb4171756fc8196e9823a1e21c"> 1909</a></span>&#160;        <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="l01910"></a><span class="lineno"><a class="line" href="structlws__protocol__vhost__options.html#afd99fbc90be51ea2465b550c2ec47822"> 1910</a></span>&#160;        <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="l01911"></a><span class="lineno"><a class="line" href="structlws__protocol__vhost__options.html#acf9db77f8eb64cd4e314be9b43d8a8b9"> 1911</a></span>&#160;        <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="l01912"></a><span class="lineno"><a class="line" href="structlws__protocol__vhost__options.html#a0640a92513c70ee6b9b295a9ad1658e7"> 1912</a></span>&#160;        <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="l01913"></a><span class="lineno"> 1913</span>&#160;};</div><div class="line"><a name="l01914"></a><span class="lineno"> 1914</span>&#160;</div><div class="line"><a name="l01919"></a><span class="lineno"><a class="line" href="group__vhost-mounts.html#ga31eca18e50cb4357480f2fcad36ff437"> 1919</a></span>&#160;<span class="keyword">enum</span> <a class="code" href="group__vhost-mounts.html#ga31eca18e50cb4357480f2fcad36ff437">lws_mount_protocols</a> {</div><div class="line"><a name="l01920"></a><span class="lineno"><a class="line" href="group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437a1e9f0842b0e85db50fe648ed4ba9a4b0"> 1920</a></span>&#160;        <a class="code" href="group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437a1e9f0842b0e85db50fe648ed4ba9a4b0">LWSMPRO_HTTP</a>            = 0, </div><div class="line"><a name="l01921"></a><span class="lineno"><a class="line" href="group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437afbd10eb4777517ed1f6bfdcf3b9ea1d1"> 1921</a></span>&#160;        <a class="code" href="group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437afbd10eb4777517ed1f6bfdcf3b9ea1d1">LWSMPRO_HTTPS</a>           = 1, </div><div class="line"><a name="l01922"></a><span class="lineno"><a class="line" href="group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437a42f2361cfe76cd287fa8fcfc502357e2"> 1922</a></span>&#160;        <a class="code" href="group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437a42f2361cfe76cd287fa8fcfc502357e2">LWSMPRO_FILE</a>            = 2, </div><div class="line"><a name="l01923"></a><span class="lineno"><a class="line" href="group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437a13ab58b01ac6e05f595977f1e0f0db69"> 1923</a></span>&#160;        <a class="code" href="group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437a13ab58b01ac6e05f595977f1e0f0db69">LWSMPRO_CGI</a>             = 3, </div><div class="line"><a name="l01924"></a><span class="lineno"><a class="line" href="group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437aec137a2434851bd856ceebfb697b9970"> 1924</a></span>&#160;        <a class="code" href="group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437aec137a2434851bd856ceebfb697b9970">LWSMPRO_REDIR_HTTP</a>      = 4, </div><div class="line"><a name="l01925"></a><span class="lineno"><a class="line" href="group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437a8894d16316863077dfe530963ca59f67"> 1925</a></span>&#160;        <a class="code" href="group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437a8894d16316863077dfe530963ca59f67">LWSMPRO_REDIR_HTTPS</a>     = 5, </div><div class="line"><a name="l01926"></a><span class="lineno"><a class="line" href="group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437a946a88cf9c852eed2c0317f4115d19da"> 1926</a></span>&#160;        <a class="code" href="group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437a946a88cf9c852eed2c0317f4115d19da">LWSMPRO_CALLBACK</a>        = 6, </div><div class="line"><a name="l01927"></a><span class="lineno"> 1927</span>&#160;};</div><div class="line"><a name="l01928"></a><span class="lineno"> 1928</span>&#160;</div><div class="line"><a name="l01933"></a><span class="lineno"><a class="line" href="structlws__http__mount.html"> 1933</a></span>&#160;<span class="keyword">struct </span><a class="code" href="structlws__http__mount.html">lws_http_mount</a> {</div><div class="line"><a name="l01934"></a><span class="lineno"><a class="line" href="structlws__http__mount.html#a0109baf93f23c07c824c997c3533ee44"> 1934</a></span>&#160;        <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__http__mount.html#a0109baf93f23c07c824c997c3533ee44">mount_next</a>;</div><div class="line"><a name="l01936"></a><span class="lineno"><a class="line" href="structlws__http__mount.html#aa2391bfcada0b7a290b3c6651f64586c"> 1936</a></span>&#160;        <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="l01938"></a><span class="lineno"><a class="line" href="structlws__http__mount.html#a21d86fd6043ec00e121ababbc29af39a"> 1938</a></span>&#160;        <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="l01940"></a><span class="lineno"><a class="line" href="structlws__http__mount.html#ae90d1efe7178199fad39de2926902ee4"> 1940</a></span>&#160;        <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="l01942"></a><span class="lineno"><a class="line" href="structlws__http__mount.html#a05347d92c3d379809564bd4f3eab259b"> 1942</a></span>&#160;        <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="l01945"></a><span class="lineno"><a class="line" href="structlws__http__mount.html#ae7b5c0f4c5408061e6ea3a8d281f45af"> 1945</a></span>&#160;        <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="l01949"></a><span class="lineno"><a class="line" href="structlws__http__mount.html#a4437423df85ee3dbcae0e15974c89ec7"> 1949</a></span>&#160;        <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="l01951"></a><span class="lineno"><a class="line" href="structlws__http__mount.html#a11ea62b952710d59733dbcf9794a5773"> 1951</a></span>&#160;        <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="l01954"></a><span class="lineno"><a class="line" href="structlws__http__mount.html#a4a7239d6d4c03986e6e1a72abb6c83aa"> 1954</a></span>&#160;        <span class="keywordtype">int</span> <a class="code" href="structlws__http__mount.html#a4a7239d6d4c03986e6e1a72abb6c83aa">cgi_timeout</a>;</div><div class="line"><a name="l01956"></a><span class="lineno"><a class="line" href="structlws__http__mount.html#a4283e30ea89d27ae7d061ad760d1d146"> 1956</a></span>&#160;        <span class="keywordtype">int</span> <a class="code" href="structlws__http__mount.html#a4283e30ea89d27ae7d061ad760d1d146">cache_max_age</a>;</div><div class="line"><a name="l01958"></a><span class="lineno"><a class="line" href="structlws__http__mount.html#a614364c770b0bd4db464ad65cddab477"> 1958</a></span>&#160;        <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="l01961"></a><span class="lineno"><a class="line" href="structlws__http__mount.html#a8316dd183ffbef50419a5a4968d35d84"> 1961</a></span>&#160;        <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> cache_reusable:1; </div><div class="line"><a name="l01962"></a><span class="lineno"><a class="line" href="structlws__http__mount.html#ae137203040c6153694bd88a708da5395"> 1962</a></span>&#160;        <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> cache_revalidate:1; </div><div class="line"><a name="l01963"></a><span class="lineno"><a class="line" href="structlws__http__mount.html#aabec1a326780aafe11b977000983be0c"> 1963</a></span>&#160;        <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> cache_intermediaries:1; </div><div class="line"><a name="l01965"></a><span class="lineno"><a class="line" href="structlws__http__mount.html#a6a9b1492a0b9749e39bd19932717a0b7"> 1965</a></span>&#160;        <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="l01966"></a><span class="lineno"><a class="line" href="structlws__http__mount.html#ac8489b60b8f969eb19c9abbdeac90743"> 1966</a></span>&#160;        <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="l01967"></a><span class="lineno"> 1967</span>&#160;};</div><div class="line"><a name="l01970"></a><span class="lineno"> 1970</span>&#160;</div><div class="line"><a name="l01976"></a><span class="lineno"> 1976</span>&#160;</div><div class="line"><a name="l01983"></a><span class="lineno"><a class="line" href="group__client.html#ga96f3dbad54b2853969cfa933d66871ce"> 1983</a></span>&#160;<span class="keyword">enum</span> <a class="code" href="group__client.html#ga96f3dbad54b2853969cfa933d66871ce">lws_client_connect_ssl_connection_flags</a> {</div><div class="line"><a name="l01984"></a><span class="lineno"> 1984</span>&#160;        LCCSCF_USE_SSL                          = (1 &lt;&lt; 0),</div><div class="line"><a name="l01985"></a><span class="lineno"> 1985</span>&#160;        LCCSCF_ALLOW_SELFSIGNED                 = (1 &lt;&lt; 1),</div><div class="line"><a name="l01986"></a><span class="lineno"> 1986</span>&#160;        LCCSCF_SKIP_SERVER_CERT_HOSTNAME_CHECK  = (1 &lt;&lt; 2),</div><div class="line"><a name="l01987"></a><span class="lineno"> 1987</span>&#160;        LCCSCF_ALLOW_EXPIRED                    = (1 &lt;&lt; 3)</div><div class="line"><a name="l01988"></a><span class="lineno"> 1988</span>&#160;};</div><div class="line"><a name="l01989"></a><span class="lineno"> 1989</span>&#160;</div><div class="line"><a name="l01993"></a><span class="lineno"><a class="line" href="structlws__client__connect__info.html"> 1993</a></span>&#160;<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="l01994"></a><span class="lineno"><a class="line" href="structlws__client__connect__info.html#afe999d133cc240a0bfd02aade0514cfd"> 1994</a></span>&#160;        <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="l01996"></a><span class="lineno"><a class="line" href="structlws__client__connect__info.html#aa364094f94ef1bcaaabbd9161971d502"> 1996</a></span>&#160;        <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="l01998"></a><span class="lineno"><a class="line" href="structlws__client__connect__info.html#a1af124d81c3c22a46d39387c5bc3d6b9"> 1998</a></span>&#160;        <span class="keywordtype">int</span> <a class="code" href="structlws__client__connect__info.html#a1af124d81c3c22a46d39387c5bc3d6b9">port</a>;</div><div class="line"><a name="l02000"></a><span class="lineno"><a class="line" href="structlws__client__connect__info.html#a9862297827639238a7a0b4054c3ddf3d"> 2000</a></span>&#160;        <span class="keywordtype">int</span> <a class="code" href="structlws__client__connect__info.html#a9862297827639238a7a0b4054c3ddf3d">ssl_connection</a>;</div><div class="line"><a name="l02002"></a><span class="lineno"><a class="line" href="structlws__client__connect__info.html#a76a8388733f114fb8fd3643874781185"> 2002</a></span>&#160;        <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="l02004"></a><span class="lineno"><a class="line" href="structlws__client__connect__info.html#a9b36d47c3422329df32c21040a35ebc7"> 2004</a></span>&#160;        <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="l02006"></a><span class="lineno"><a class="line" href="structlws__client__connect__info.html#a8595f83e64147cb687b6418cf500dd4c"> 2006</a></span>&#160;        <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="l02008"></a><span class="lineno"><a class="line" href="structlws__client__connect__info.html#aba35adfb74845a5fd0c3dc141cbdddd2"> 2008</a></span>&#160;        <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="l02010"></a><span class="lineno"><a class="line" href="structlws__client__connect__info.html#a69abb5aeed755750b9755e5c91db6895"> 2010</a></span>&#160;        <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="l02012"></a><span class="lineno"><a class="line" href="structlws__client__connect__info.html#a9831b9f9ab54a1aec4bb15324f1c3836"> 2012</a></span>&#160;        <span class="keywordtype">void</span> *<a class="code" href="structlws__client__connect__info.html#a9831b9f9ab54a1aec4bb15324f1c3836">userdata</a>;</div><div class="line"><a name="l02014"></a><span class="lineno"><a class="line" href="structlws__client__connect__info.html#a7732b996e977393c3e1076be2a8ded6c"> 2014</a></span>&#160;        <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="l02016"></a><span class="lineno"><a class="line" href="structlws__client__connect__info.html#aa9e8e3da4e783a0651b0dea62c2dd1db"> 2016</a></span>&#160;        <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="l02019"></a><span class="lineno"><a class="line" href="structlws__client__connect__info.html#a6843a60e1050b10db9d98d7eeb45f587"> 2019</a></span>&#160;        <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="l02023"></a><span class="lineno"><a class="line" href="structlws__client__connect__info.html#a03c305fdca809667b6a9a83b3edfd83a"> 2023</a></span>&#160;        <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="l02026"></a><span class="lineno"><a class="line" href="structlws__client__connect__info.html#a9959ba103d3d2484e559a9f7879eebe3"> 2026</a></span>&#160;        <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="l02028"></a><span class="lineno"><a class="line" href="structlws__client__connect__info.html#a3893181d728f326f9f5b47c1459cb8be"> 2028</a></span>&#160;        <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="l02030"></a><span class="lineno"><a class="line" href="structlws__client__connect__info.html#a065063b5117ecd0a59567c97f04bda2e"> 2030</a></span>&#160;        <span class="keyword">struct </span>lws **<a class="code" href="structlws__client__connect__info.html#a065063b5117ecd0a59567c97f04bda2e">pwsi</a>;</div><div class="line"><a name="l02042"></a><span class="lineno"> 2042</span>&#160;        <span class="comment">/* Add new things just above here ---^</span></div><div class="line"><a name="l02043"></a><span class="lineno"> 2043</span>&#160;<span class="comment">         * This is part of the ABI, don&#39;t needlessly break compatibility</span></div><div class="line"><a name="l02044"></a><span class="lineno"> 2044</span>&#160;<span class="comment">         *</span></div><div class="line"><a name="l02045"></a><span class="lineno"> 2045</span>&#160;<span class="comment">         * The below is to ensure later library versions with new</span></div><div class="line"><a name="l02046"></a><span class="lineno"> 2046</span>&#160;<span class="comment">         * members added above will see 0 (default) even if the app</span></div><div class="line"><a name="l02047"></a><span class="lineno"> 2047</span>&#160;<span class="comment">         * was not built against the newer headers.</span></div><div class="line"><a name="l02048"></a><span class="lineno"> 2048</span>&#160;<span class="comment">         */</span></div><div class="line"><a name="l02049"></a><span class="lineno"> 2049</span>&#160;</div><div class="line"><a name="l02050"></a><span class="lineno"><a class="line" href="structlws__client__connect__info.html#ad47f50d1633dc5df74548606c9a66d73"> 2050</a></span>&#160;        <span class="keywordtype">void</span> *_unused[4]; </div><div class="line"><a name="l02051"></a><span class="lineno"> 2051</span>&#160;};</div><div class="line"><a name="l02052"></a><span class="lineno"> 2052</span>&#160;</div><div class="line"><a name="l02060"></a><span class="lineno"> 2060</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keyword">struct </span>lws *</div><div class="line"><a name="l02061"></a><span class="lineno"> 2061</span>&#160;<a class="code" href="group__client.html#ga0c966136905f467816307cfba6deb5fd">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="l02062"></a><span class="lineno"> 2062</span>&#160;</div><div class="line"><a name="l02083"></a><span class="lineno"> 2083</span>&#160;<span class="comment">/* deprecated, use lws_client_connect_via_info() */</span></div><div class="line"><a name="l02084"></a><span class="lineno"> 2084</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keyword">struct </span>lws * LWS_WARN_UNUSED_RESULT</div><div class="line"><a name="l02085"></a><span class="lineno"> 2085</span>&#160;<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="l02086"></a><span class="lineno"> 2086</span>&#160;                   <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="l02087"></a><span class="lineno"> 2087</span>&#160;                   <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="l02088"></a><span class="lineno"> 2088</span>&#160;                   <span class="keywordtype">int</span> ietf_version_or_minus_one) LWS_WARN_DEPRECATED;</div><div class="line"><a name="l02089"></a><span class="lineno"> 2089</span>&#160;<span class="comment">/* deprecated, use lws_client_connect_via_info() */</span></div><div class="line"><a name="l02110"></a><span class="lineno"> 2110</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keyword">struct </span>lws * LWS_WARN_UNUSED_RESULT</div><div class="line"><a name="l02111"></a><span class="lineno"> 2111</span>&#160;<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="l02112"></a><span class="lineno"> 2112</span>&#160;                            <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="l02113"></a><span class="lineno"> 2113</span>&#160;                            <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="l02114"></a><span class="lineno"> 2114</span>&#160;                            <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="l02115"></a><span class="lineno"> 2115</span>&#160;                            <span class="keywordtype">void</span> *userdata) LWS_WARN_DEPRECATED;</div><div class="line"><a name="l02116"></a><span class="lineno"> 2116</span>&#160;</div><div class="line"><a name="l02142"></a><span class="lineno"> 2142</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l02143"></a><span class="lineno"> 2143</span>&#160;<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="l02144"></a><span class="lineno"> 2144</span>&#160;                          <span class="keyword">struct</span> lws_vhost *vhost);</div><div class="line"><a name="l02145"></a><span class="lineno"> 2145</span>&#160;</div><div class="line"><a name="l02146"></a><span class="lineno"> 2146</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l02147"></a><span class="lineno"> 2147</span>&#160;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="l02148"></a><span class="lineno"> 2148</span>&#160;</div><div class="line"><a name="l02156"></a><span class="lineno"> 2156</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span></div><div class="line"><a name="l02157"></a><span class="lineno"> 2157</span>&#160;<a class="code" href="group__client.html#ga715efffc0c4e8fbf72a4293008eb2187">lws_http_client_http_response</a>(<span class="keyword">struct</span> lws *wsi);</div><div class="line"><a name="l02158"></a><span class="lineno"> 2158</span>&#160;</div><div class="line"><a name="l02159"></a><span class="lineno"> 2159</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">void</span></div><div class="line"><a name="l02160"></a><span class="lineno"> 2160</span>&#160;lws_client_http_body_pending(<span class="keyword">struct</span> lws *wsi, <span class="keywordtype">int</span> something_left_to_send);</div><div class="line"><a name="l02161"></a><span class="lineno"> 2161</span>&#160;</div><div class="line"><a name="l02182"></a><span class="lineno"> 2182</span>&#160;</div><div class="line"><a name="l02191"></a><span class="lineno"> 2191</span>&#160;</div><div class="line"><a name="l02224"></a><span class="lineno"> 2224</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l02225"></a><span class="lineno"> 2225</span>&#160;<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="l02226"></a><span class="lineno"> 2226</span>&#160;</div><div class="line"><a name="l02238"></a><span class="lineno"> 2238</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l02239"></a><span class="lineno"> 2239</span>&#160;<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="l02240"></a><span class="lineno"> 2240</span>&#160;</div><div class="line"><a name="l02256"></a><span class="lineno"> 2256</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">void</span></div><div class="line"><a name="l02257"></a><span class="lineno"> 2257</span>&#160;<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="l02258"></a><span class="lineno"> 2258</span>&#160;</div><div class="line"><a name="l02270"></a><span class="lineno"> 2270</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">void</span></div><div class="line"><a name="l02271"></a><span class="lineno"> 2271</span>&#160;<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="l02272"></a><span class="lineno"> 2272</span>&#160;</div><div class="line"><a name="l02299"></a><span class="lineno"> 2299</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l02300"></a><span class="lineno"> 2300</span>&#160;<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="l02301"></a><span class="lineno"> 2301</span>&#160;</div><div class="line"><a name="l02311"></a><span class="lineno"> 2311</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l02312"></a><span class="lineno"> 2312</span>&#160;<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="l02313"></a><span class="lineno"> 2313</span>&#160;                   <span class="keywordtype">int</span> tsi);</div><div class="line"><a name="l02314"></a><span class="lineno"> 2314</span>&#160;</div><div class="line"><a name="l02332"></a><span class="lineno"> 2332</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l02333"></a><span class="lineno"> 2333</span>&#160;<a class="code" href="group__service.html#ga4fd9d714434ca499e2b3f7dbba86f241">lws_service_adjust_timeout</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="l02334"></a><span class="lineno"> 2334</span>&#160;</div><div class="line"><a name="l02335"></a><span class="lineno"> 2335</span>&#160;<span class="comment">/* Backwards compatibility */</span></div><div class="line"><a name="l02336"></a><span class="lineno"> 2336</span>&#160;<span class="preprocessor">#define lws_plat_service_tsi lws_service_tsi</span></div><div class="line"><a name="l02337"></a><span class="lineno"> 2337</span>&#160;</div><div class="line"><a name="l02339"></a><span class="lineno"> 2339</span>&#160;</div><div class="line"><a name="l02345"></a><span class="lineno"> 2345</span>&#160;</div><div class="line"><a name="l02352"></a><span class="lineno"> 2352</span>&#160;</div><div class="line"><a name="l02364"></a><span class="lineno"> 2364</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keyword">const</span> <span class="keywordtype">char</span> *</div><div class="line"><a name="l02365"></a><span class="lineno"> 2365</span>&#160;<a class="code" href="group__httpft.html#gab4da87a4800413f15e7aba649fb1d77c">lws_get_mimetype</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> *file, <span class="keyword">const</span> <span class="keyword">struct</span> <a class="code" href="structlws__http__mount.html">lws_http_mount</a> *m);</div><div class="line"><a name="l02366"></a><span class="lineno"> 2366</span>&#160;</div><div class="line"><a name="l02385"></a><span class="lineno"> 2385</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l02386"></a><span class="lineno"> 2386</span>&#160;<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="l02387"></a><span class="lineno"> 2387</span>&#160;                    <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="l02388"></a><span class="lineno"> 2388</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l02389"></a><span class="lineno"> 2389</span>&#160;lws_serve_http_file_fragment(<span class="keyword">struct</span> lws *wsi);</div><div class="line"><a name="l02391"></a><span class="lineno"> 2391</span>&#160;</div><div class="line"><a name="l02402"></a><span class="lineno"> 2402</span>&#160;</div><div class="line"><a name="l02403"></a><span class="lineno"> 2403</span>&#160;<span class="keyword">enum</span> http_status {</div><div class="line"><a name="l02404"></a><span class="lineno"> 2404</span>&#160;        HTTP_STATUS_OK                                          = 200,</div><div class="line"><a name="l02405"></a><span class="lineno"> 2405</span>&#160;        HTTP_STATUS_NO_CONTENT                                  = 204,</div><div class="line"><a name="l02406"></a><span class="lineno"> 2406</span>&#160;</div><div class="line"><a name="l02407"></a><span class="lineno"> 2407</span>&#160;        HTTP_STATUS_MOVED_PERMANENTLY                           = 301,</div><div class="line"><a name="l02408"></a><span class="lineno"> 2408</span>&#160;        HTTP_STATUS_FOUND                                       = 302,</div><div class="line"><a name="l02409"></a><span class="lineno"> 2409</span>&#160;        HTTP_STATUS_SEE_OTHER                                   = 303,</div><div class="line"><a name="l02410"></a><span class="lineno"> 2410</span>&#160;</div><div class="line"><a name="l02411"></a><span class="lineno"> 2411</span>&#160;        HTTP_STATUS_BAD_REQUEST                                 = 400,</div><div class="line"><a name="l02412"></a><span class="lineno"> 2412</span>&#160;        HTTP_STATUS_UNAUTHORIZED,</div><div class="line"><a name="l02413"></a><span class="lineno"> 2413</span>&#160;        HTTP_STATUS_PAYMENT_REQUIRED,</div><div class="line"><a name="l02414"></a><span class="lineno"> 2414</span>&#160;        HTTP_STATUS_FORBIDDEN,</div><div class="line"><a name="l02415"></a><span class="lineno"> 2415</span>&#160;        HTTP_STATUS_NOT_FOUND,</div><div class="line"><a name="l02416"></a><span class="lineno"> 2416</span>&#160;        HTTP_STATUS_METHOD_NOT_ALLOWED,</div><div class="line"><a name="l02417"></a><span class="lineno"> 2417</span>&#160;        HTTP_STATUS_NOT_ACCEPTABLE,</div><div class="line"><a name="l02418"></a><span class="lineno"> 2418</span>&#160;        HTTP_STATUS_PROXY_AUTH_REQUIRED,</div><div class="line"><a name="l02419"></a><span class="lineno"> 2419</span>&#160;        HTTP_STATUS_REQUEST_TIMEOUT,</div><div class="line"><a name="l02420"></a><span class="lineno"> 2420</span>&#160;        HTTP_STATUS_CONFLICT,</div><div class="line"><a name="l02421"></a><span class="lineno"> 2421</span>&#160;        HTTP_STATUS_GONE,</div><div class="line"><a name="l02422"></a><span class="lineno"> 2422</span>&#160;        HTTP_STATUS_LENGTH_REQUIRED,</div><div class="line"><a name="l02423"></a><span class="lineno"> 2423</span>&#160;        HTTP_STATUS_PRECONDITION_FAILED,</div><div class="line"><a name="l02424"></a><span class="lineno"> 2424</span>&#160;        HTTP_STATUS_REQ_ENTITY_TOO_LARGE,</div><div class="line"><a name="l02425"></a><span class="lineno"> 2425</span>&#160;        HTTP_STATUS_REQ_URI_TOO_LONG,</div><div class="line"><a name="l02426"></a><span class="lineno"> 2426</span>&#160;        HTTP_STATUS_UNSUPPORTED_MEDIA_TYPE,</div><div class="line"><a name="l02427"></a><span class="lineno"> 2427</span>&#160;        HTTP_STATUS_REQ_RANGE_NOT_SATISFIABLE,</div><div class="line"><a name="l02428"></a><span class="lineno"> 2428</span>&#160;        HTTP_STATUS_EXPECTATION_FAILED,</div><div class="line"><a name="l02429"></a><span class="lineno"> 2429</span>&#160;</div><div class="line"><a name="l02430"></a><span class="lineno"> 2430</span>&#160;        HTTP_STATUS_INTERNAL_SERVER_ERROR                       = 500,</div><div class="line"><a name="l02431"></a><span class="lineno"> 2431</span>&#160;        HTTP_STATUS_NOT_IMPLEMENTED,</div><div class="line"><a name="l02432"></a><span class="lineno"> 2432</span>&#160;        HTTP_STATUS_BAD_GATEWAY,</div><div class="line"><a name="l02433"></a><span class="lineno"> 2433</span>&#160;        HTTP_STATUS_SERVICE_UNAVAILABLE,</div><div class="line"><a name="l02434"></a><span class="lineno"> 2434</span>&#160;        HTTP_STATUS_GATEWAY_TIMEOUT,</div><div class="line"><a name="l02435"></a><span class="lineno"> 2435</span>&#160;        HTTP_STATUS_HTTP_VERSION_NOT_SUPPORTED,</div><div class="line"><a name="l02436"></a><span class="lineno"> 2436</span>&#160;};</div><div class="line"><a name="l02437"></a><span class="lineno"> 2437</span>&#160;</div><div class="line"><a name="l02438"></a><span class="lineno"><a class="line" href="structlws__process__html__args.html"> 2438</a></span>&#160;<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="l02439"></a><span class="lineno"><a class="line" href="structlws__process__html__args.html#a11859d8bedd379fbf64543b25c65fe14"> 2439</a></span>&#160;        <span class="keywordtype">char</span> *<a class="code" href="structlws__process__html__args.html#a11859d8bedd379fbf64543b25c65fe14">p</a>; </div><div class="line"><a name="l02440"></a><span class="lineno"><a class="line" href="structlws__process__html__args.html#a754513f2311241cabb0cd1c90d7307ef"> 2440</a></span>&#160;        <span class="keywordtype">int</span> <a class="code" href="structlws__process__html__args.html#a754513f2311241cabb0cd1c90d7307ef">len</a>; </div><div class="line"><a name="l02441"></a><span class="lineno"><a class="line" href="structlws__process__html__args.html#a8be7fd396a1942ea2449a2fda990ff99"> 2441</a></span>&#160;        <span class="keywordtype">int</span> <a class="code" href="structlws__process__html__args.html#a8be7fd396a1942ea2449a2fda990ff99">max_len</a>; </div><div class="line"><a name="l02442"></a><span class="lineno"><a class="line" href="structlws__process__html__args.html#a362547891ee0d693f3900a1f807ea475"> 2442</a></span>&#160;        <span class="keywordtype">int</span> <span class="keyword">final</span>; </div><div class="line"><a name="l02443"></a><span class="lineno"> 2443</span>&#160;};</div><div class="line"><a name="l02444"></a><span class="lineno"> 2444</span>&#160;</div><div class="line"><a name="l02445"></a><span class="lineno"> 2445</span>&#160;<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="l02446"></a><span class="lineno"> 2446</span>&#160;</div><div class="line"><a name="l02447"></a><span class="lineno"><a class="line" href="structlws__process__html__state.html"> 2447</a></span>&#160;<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="l02448"></a><span class="lineno"><a class="line" href="structlws__process__html__state.html#af0732884ef891e24fe5fa237ebaa21a3"> 2448</a></span>&#160;        <span class="keywordtype">char</span> *<a class="code" href="structlws__process__html__state.html#af0732884ef891e24fe5fa237ebaa21a3">start</a>; </div><div class="line"><a name="l02449"></a><span class="lineno"><a class="line" href="structlws__process__html__state.html#a71982bc1cbd8cf876ca0f545144404eb"> 2449</a></span>&#160;        <span class="keywordtype">char</span> swallow[16]; </div><div class="line"><a name="l02450"></a><span class="lineno"><a class="line" href="structlws__process__html__state.html#a53234f2948812c7208a256f9f5b23c20"> 2450</a></span>&#160;        <span class="keywordtype">int</span> <a class="code" href="structlws__process__html__state.html#a53234f2948812c7208a256f9f5b23c20">pos</a>; </div><div class="line"><a name="l02451"></a><span class="lineno"><a class="line" href="structlws__process__html__state.html#af21119890fdfebe28fb5c4dabfc1bdf5"> 2451</a></span>&#160;        <span class="keywordtype">void</span> *<a class="code" href="structlws__process__html__state.html#af21119890fdfebe28fb5c4dabfc1bdf5">data</a>; </div><div class="line"><a name="l02452"></a><span class="lineno"><a class="line" href="structlws__process__html__state.html#a3b113e00c03a2fded51b1c85ff5bf077"> 2452</a></span>&#160;        <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="l02453"></a><span class="lineno"><a class="line" href="structlws__process__html__state.html#adcafd17704775b4bbeea9561fb340968"> 2453</a></span>&#160;        <span class="keywordtype">int</span> <a class="code" href="structlws__process__html__state.html#adcafd17704775b4bbeea9561fb340968">count_vars</a>; </div><div class="line"><a name="l02455"></a><span class="lineno"><a class="line" href="structlws__process__html__state.html#a693d2fb45378afee5da29b539c1ea644"> 2455</a></span>&#160;        lws_process_html_state_cb replace; </div><div class="line"><a name="l02456"></a><span class="lineno"> 2456</span>&#160;};</div><div class="line"><a name="l02457"></a><span class="lineno"> 2457</span>&#160;</div><div class="line"><a name="l02462"></a><span class="lineno"> 2462</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l02463"></a><span class="lineno"> 2463</span>&#160;<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="l02464"></a><span class="lineno"> 2464</span>&#160;                         <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="l02466"></a><span class="lineno"> 2466</span>&#160;</div><div class="line"><a name="l02499"></a><span class="lineno"> 2499</span>&#160;</div><div class="line"><a name="l02507"></a><span class="lineno"><a class="line" href="structlws__tokens.html"> 2507</a></span>&#160;<span class="keyword">struct </span><a class="code" href="structlws__tokens.html">lws_tokens</a> {</div><div class="line"><a name="l02508"></a><span class="lineno"><a class="line" href="structlws__tokens.html#a9f3635412bc71a5cb78e9862b55f10cd"> 2508</a></span>&#160;        <span class="keywordtype">char</span> *<a class="code" href="structlws__tokens.html#a9f3635412bc71a5cb78e9862b55f10cd">token</a>; </div><div class="line"><a name="l02509"></a><span class="lineno"><a class="line" href="structlws__tokens.html#a855b7375d1d58516c0ecd4b60e9a7766"> 2509</a></span>&#160;        <span class="keywordtype">int</span> <a class="code" href="structlws__tokens.html#a855b7375d1d58516c0ecd4b60e9a7766">token_len</a>; </div><div class="line"><a name="l02510"></a><span class="lineno"> 2510</span>&#160;};</div><div class="line"><a name="l02511"></a><span class="lineno"> 2511</span>&#160;</div><div class="line"><a name="l02512"></a><span class="lineno"> 2512</span>&#160;<span class="comment">/* enum lws_token_indexes</span></div><div class="line"><a name="l02513"></a><span class="lineno"> 2513</span>&#160;<span class="comment"> * these have to be kept in sync with lextable.h / minilex.c</span></div><div class="line"><a name="l02514"></a><span class="lineno"> 2514</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l02515"></a><span class="lineno"> 2515</span>&#160;<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="l02516"></a><span class="lineno"> 2516</span>&#160;<span class="comment"> * add it at where specified so existing users are unaffected.</span></div><div class="line"><a name="l02517"></a><span class="lineno"> 2517</span>&#160;<span class="comment"> */</span></div><div class="line"><a name="l02518"></a><span class="lineno"> 2518</span>&#160;<span class="keyword">enum</span> lws_token_indexes {</div><div class="line"><a name="l02519"></a><span class="lineno"> 2519</span>&#160;        WSI_TOKEN_GET_URI                                       =  0,</div><div class="line"><a name="l02520"></a><span class="lineno"> 2520</span>&#160;        WSI_TOKEN_POST_URI                                      =  1,</div><div class="line"><a name="l02521"></a><span class="lineno"> 2521</span>&#160;        WSI_TOKEN_OPTIONS_URI                                   =  2,</div><div class="line"><a name="l02522"></a><span class="lineno"> 2522</span>&#160;        WSI_TOKEN_HOST                                          =  3,</div><div class="line"><a name="l02523"></a><span class="lineno"> 2523</span>&#160;        WSI_TOKEN_CONNECTION                                    =  4,</div><div class="line"><a name="l02524"></a><span class="lineno"> 2524</span>&#160;        WSI_TOKEN_UPGRADE                                       =  5,</div><div class="line"><a name="l02525"></a><span class="lineno"> 2525</span>&#160;        WSI_TOKEN_ORIGIN                                        =  6,</div><div class="line"><a name="l02526"></a><span class="lineno"> 2526</span>&#160;        WSI_TOKEN_DRAFT                                         =  7,</div><div class="line"><a name="l02527"></a><span class="lineno"> 2527</span>&#160;        WSI_TOKEN_CHALLENGE                                     =  8,</div><div class="line"><a name="l02528"></a><span class="lineno"> 2528</span>&#160;        WSI_TOKEN_EXTENSIONS                                    =  9,</div><div class="line"><a name="l02529"></a><span class="lineno"> 2529</span>&#160;        WSI_TOKEN_KEY1                                          = 10,</div><div class="line"><a name="l02530"></a><span class="lineno"> 2530</span>&#160;        WSI_TOKEN_KEY2                                          = 11,</div><div class="line"><a name="l02531"></a><span class="lineno"> 2531</span>&#160;        WSI_TOKEN_PROTOCOL                                      = 12,</div><div class="line"><a name="l02532"></a><span class="lineno"> 2532</span>&#160;        WSI_TOKEN_ACCEPT                                        = 13,</div><div class="line"><a name="l02533"></a><span class="lineno"> 2533</span>&#160;        WSI_TOKEN_NONCE                                         = 14,</div><div class="line"><a name="l02534"></a><span class="lineno"> 2534</span>&#160;        WSI_TOKEN_HTTP                                          = 15,</div><div class="line"><a name="l02535"></a><span class="lineno"> 2535</span>&#160;        WSI_TOKEN_HTTP2_SETTINGS                                = 16,</div><div class="line"><a name="l02536"></a><span class="lineno"> 2536</span>&#160;        WSI_TOKEN_HTTP_ACCEPT                                   = 17,</div><div class="line"><a name="l02537"></a><span class="lineno"> 2537</span>&#160;        WSI_TOKEN_HTTP_AC_REQUEST_HEADERS                       = 18,</div><div class="line"><a name="l02538"></a><span class="lineno"> 2538</span>&#160;        WSI_TOKEN_HTTP_IF_MODIFIED_SINCE                        = 19,</div><div class="line"><a name="l02539"></a><span class="lineno"> 2539</span>&#160;        WSI_TOKEN_HTTP_IF_NONE_MATCH                            = 20,</div><div class="line"><a name="l02540"></a><span class="lineno"> 2540</span>&#160;        WSI_TOKEN_HTTP_ACCEPT_ENCODING                          = 21,</div><div class="line"><a name="l02541"></a><span class="lineno"> 2541</span>&#160;        WSI_TOKEN_HTTP_ACCEPT_LANGUAGE                          = 22,</div><div class="line"><a name="l02542"></a><span class="lineno"> 2542</span>&#160;        WSI_TOKEN_HTTP_PRAGMA                                   = 23,</div><div class="line"><a name="l02543"></a><span class="lineno"> 2543</span>&#160;        WSI_TOKEN_HTTP_CACHE_CONTROL                            = 24,</div><div class="line"><a name="l02544"></a><span class="lineno"> 2544</span>&#160;        WSI_TOKEN_HTTP_AUTHORIZATION                            = 25,</div><div class="line"><a name="l02545"></a><span class="lineno"> 2545</span>&#160;        WSI_TOKEN_HTTP_COOKIE                                   = 26,</div><div class="line"><a name="l02546"></a><span class="lineno"> 2546</span>&#160;        WSI_TOKEN_HTTP_CONTENT_LENGTH                           = 27,</div><div class="line"><a name="l02547"></a><span class="lineno"> 2547</span>&#160;        WSI_TOKEN_HTTP_CONTENT_TYPE                             = 28,</div><div class="line"><a name="l02548"></a><span class="lineno"> 2548</span>&#160;        WSI_TOKEN_HTTP_DATE                                     = 29,</div><div class="line"><a name="l02549"></a><span class="lineno"> 2549</span>&#160;        WSI_TOKEN_HTTP_RANGE                                    = 30,</div><div class="line"><a name="l02550"></a><span class="lineno"> 2550</span>&#160;        WSI_TOKEN_HTTP_REFERER                                  = 31,</div><div class="line"><a name="l02551"></a><span class="lineno"> 2551</span>&#160;        WSI_TOKEN_KEY                                           = 32,</div><div class="line"><a name="l02552"></a><span class="lineno"> 2552</span>&#160;        WSI_TOKEN_VERSION                                       = 33,</div><div class="line"><a name="l02553"></a><span class="lineno"> 2553</span>&#160;        WSI_TOKEN_SWORIGIN                                      = 34,</div><div class="line"><a name="l02554"></a><span class="lineno"> 2554</span>&#160;</div><div class="line"><a name="l02555"></a><span class="lineno"> 2555</span>&#160;        WSI_TOKEN_HTTP_COLON_AUTHORITY                          = 35,</div><div class="line"><a name="l02556"></a><span class="lineno"> 2556</span>&#160;        WSI_TOKEN_HTTP_COLON_METHOD                             = 36,</div><div class="line"><a name="l02557"></a><span class="lineno"> 2557</span>&#160;        WSI_TOKEN_HTTP_COLON_PATH                               = 37,</div><div class="line"><a name="l02558"></a><span class="lineno"> 2558</span>&#160;        WSI_TOKEN_HTTP_COLON_SCHEME                             = 38,</div><div class="line"><a name="l02559"></a><span class="lineno"> 2559</span>&#160;        WSI_TOKEN_HTTP_COLON_STATUS                             = 39,</div><div class="line"><a name="l02560"></a><span class="lineno"> 2560</span>&#160;</div><div class="line"><a name="l02561"></a><span class="lineno"> 2561</span>&#160;        WSI_TOKEN_HTTP_ACCEPT_CHARSET                           = 40,</div><div class="line"><a name="l02562"></a><span class="lineno"> 2562</span>&#160;        WSI_TOKEN_HTTP_ACCEPT_RANGES                            = 41,</div><div class="line"><a name="l02563"></a><span class="lineno"> 2563</span>&#160;        WSI_TOKEN_HTTP_ACCESS_CONTROL_ALLOW_ORIGIN              = 42,</div><div class="line"><a name="l02564"></a><span class="lineno"> 2564</span>&#160;        WSI_TOKEN_HTTP_AGE                                      = 43,</div><div class="line"><a name="l02565"></a><span class="lineno"> 2565</span>&#160;        WSI_TOKEN_HTTP_ALLOW                                    = 44,</div><div class="line"><a name="l02566"></a><span class="lineno"> 2566</span>&#160;        WSI_TOKEN_HTTP_CONTENT_DISPOSITION                      = 45,</div><div class="line"><a name="l02567"></a><span class="lineno"> 2567</span>&#160;        WSI_TOKEN_HTTP_CONTENT_ENCODING                         = 46,</div><div class="line"><a name="l02568"></a><span class="lineno"> 2568</span>&#160;        WSI_TOKEN_HTTP_CONTENT_LANGUAGE                         = 47,</div><div class="line"><a name="l02569"></a><span class="lineno"> 2569</span>&#160;        WSI_TOKEN_HTTP_CONTENT_LOCATION                         = 48,</div><div class="line"><a name="l02570"></a><span class="lineno"> 2570</span>&#160;        WSI_TOKEN_HTTP_CONTENT_RANGE                            = 49,</div><div class="line"><a name="l02571"></a><span class="lineno"> 2571</span>&#160;        WSI_TOKEN_HTTP_ETAG                                     = 50,</div><div class="line"><a name="l02572"></a><span class="lineno"> 2572</span>&#160;        WSI_TOKEN_HTTP_EXPECT                                   = 51,</div><div class="line"><a name="l02573"></a><span class="lineno"> 2573</span>&#160;        WSI_TOKEN_HTTP_EXPIRES                                  = 52,</div><div class="line"><a name="l02574"></a><span class="lineno"> 2574</span>&#160;        WSI_TOKEN_HTTP_FROM                                     = 53,</div><div class="line"><a name="l02575"></a><span class="lineno"> 2575</span>&#160;        WSI_TOKEN_HTTP_IF_MATCH                                 = 54,</div><div class="line"><a name="l02576"></a><span class="lineno"> 2576</span>&#160;        WSI_TOKEN_HTTP_IF_RANGE                                 = 55,</div><div class="line"><a name="l02577"></a><span class="lineno"> 2577</span>&#160;        WSI_TOKEN_HTTP_IF_UNMODIFIED_SINCE                      = 56,</div><div class="line"><a name="l02578"></a><span class="lineno"> 2578</span>&#160;        WSI_TOKEN_HTTP_LAST_MODIFIED                            = 57,</div><div class="line"><a name="l02579"></a><span class="lineno"> 2579</span>&#160;        WSI_TOKEN_HTTP_LINK                                     = 58,</div><div class="line"><a name="l02580"></a><span class="lineno"> 2580</span>&#160;        WSI_TOKEN_HTTP_LOCATION                                 = 59,</div><div class="line"><a name="l02581"></a><span class="lineno"> 2581</span>&#160;        WSI_TOKEN_HTTP_MAX_FORWARDS                             = 60,</div><div class="line"><a name="l02582"></a><span class="lineno"> 2582</span>&#160;        WSI_TOKEN_HTTP_PROXY_AUTHENTICATE                       = 61,</div><div class="line"><a name="l02583"></a><span class="lineno"> 2583</span>&#160;        WSI_TOKEN_HTTP_PROXY_AUTHORIZATION                      = 62,</div><div class="line"><a name="l02584"></a><span class="lineno"> 2584</span>&#160;        WSI_TOKEN_HTTP_REFRESH                                  = 63,</div><div class="line"><a name="l02585"></a><span class="lineno"> 2585</span>&#160;        WSI_TOKEN_HTTP_RETRY_AFTER                              = 64,</div><div class="line"><a name="l02586"></a><span class="lineno"> 2586</span>&#160;        WSI_TOKEN_HTTP_SERVER                                   = 65,</div><div class="line"><a name="l02587"></a><span class="lineno"> 2587</span>&#160;        WSI_TOKEN_HTTP_SET_COOKIE                               = 66,</div><div class="line"><a name="l02588"></a><span class="lineno"> 2588</span>&#160;        WSI_TOKEN_HTTP_STRICT_TRANSPORT_SECURITY                = 67,</div><div class="line"><a name="l02589"></a><span class="lineno"> 2589</span>&#160;        WSI_TOKEN_HTTP_TRANSFER_ENCODING                        = 68,</div><div class="line"><a name="l02590"></a><span class="lineno"> 2590</span>&#160;        WSI_TOKEN_HTTP_USER_AGENT                               = 69,</div><div class="line"><a name="l02591"></a><span class="lineno"> 2591</span>&#160;        WSI_TOKEN_HTTP_VARY                                     = 70,</div><div class="line"><a name="l02592"></a><span class="lineno"> 2592</span>&#160;        WSI_TOKEN_HTTP_VIA                                      = 71,</div><div class="line"><a name="l02593"></a><span class="lineno"> 2593</span>&#160;        WSI_TOKEN_HTTP_WWW_AUTHENTICATE                         = 72,</div><div class="line"><a name="l02594"></a><span class="lineno"> 2594</span>&#160;</div><div class="line"><a name="l02595"></a><span class="lineno"> 2595</span>&#160;        WSI_TOKEN_PATCH_URI                                     = 73,</div><div class="line"><a name="l02596"></a><span class="lineno"> 2596</span>&#160;        WSI_TOKEN_PUT_URI                                       = 74,</div><div class="line"><a name="l02597"></a><span class="lineno"> 2597</span>&#160;        WSI_TOKEN_DELETE_URI                                    = 75,</div><div class="line"><a name="l02598"></a><span class="lineno"> 2598</span>&#160;</div><div class="line"><a name="l02599"></a><span class="lineno"> 2599</span>&#160;        WSI_TOKEN_HTTP_URI_ARGS                                 = 76,</div><div class="line"><a name="l02600"></a><span class="lineno"> 2600</span>&#160;        WSI_TOKEN_PROXY                                         = 77,</div><div class="line"><a name="l02601"></a><span class="lineno"> 2601</span>&#160;        WSI_TOKEN_HTTP_X_REAL_IP                                = 78,</div><div class="line"><a name="l02602"></a><span class="lineno"> 2602</span>&#160;        WSI_TOKEN_HTTP1_0                                       = 79,</div><div class="line"><a name="l02603"></a><span class="lineno"> 2603</span>&#160;</div><div class="line"><a name="l02604"></a><span class="lineno"> 2604</span>&#160;        <span class="comment">/****** add new things just above ---^ ******/</span></div><div class="line"><a name="l02605"></a><span class="lineno"> 2605</span>&#160;</div><div class="line"><a name="l02606"></a><span class="lineno"> 2606</span>&#160;        <span class="comment">/* use token storage to stash these internally, not for</span></div><div class="line"><a name="l02607"></a><span class="lineno"> 2607</span>&#160;<span class="comment">         * user use */</span></div><div class="line"><a name="l02608"></a><span class="lineno"> 2608</span>&#160;</div><div class="line"><a name="l02609"></a><span class="lineno"> 2609</span>&#160;        _WSI_TOKEN_CLIENT_SENT_PROTOCOLS,</div><div class="line"><a name="l02610"></a><span class="lineno"> 2610</span>&#160;        _WSI_TOKEN_CLIENT_PEER_ADDRESS,</div><div class="line"><a name="l02611"></a><span class="lineno"> 2611</span>&#160;        _WSI_TOKEN_CLIENT_URI,</div><div class="line"><a name="l02612"></a><span class="lineno"> 2612</span>&#160;        _WSI_TOKEN_CLIENT_HOST,</div><div class="line"><a name="l02613"></a><span class="lineno"> 2613</span>&#160;        _WSI_TOKEN_CLIENT_ORIGIN,</div><div class="line"><a name="l02614"></a><span class="lineno"> 2614</span>&#160;        _WSI_TOKEN_CLIENT_METHOD,</div><div class="line"><a name="l02615"></a><span class="lineno"> 2615</span>&#160;</div><div class="line"><a name="l02616"></a><span class="lineno"> 2616</span>&#160;        <span class="comment">/* always last real token index*/</span></div><div class="line"><a name="l02617"></a><span class="lineno"> 2617</span>&#160;        WSI_TOKEN_COUNT,</div><div class="line"><a name="l02618"></a><span class="lineno"> 2618</span>&#160;</div><div class="line"><a name="l02619"></a><span class="lineno"> 2619</span>&#160;        <span class="comment">/* parser state additions, no storage associated */</span></div><div class="line"><a name="l02620"></a><span class="lineno"> 2620</span>&#160;        WSI_TOKEN_NAME_PART,</div><div class="line"><a name="l02621"></a><span class="lineno"> 2621</span>&#160;        WSI_TOKEN_SKIPPING,</div><div class="line"><a name="l02622"></a><span class="lineno"> 2622</span>&#160;        WSI_TOKEN_SKIPPING_SAW_CR,</div><div class="line"><a name="l02623"></a><span class="lineno"> 2623</span>&#160;        WSI_PARSING_COMPLETE,</div><div class="line"><a name="l02624"></a><span class="lineno"> 2624</span>&#160;        WSI_INIT_TOKEN_MUXURL,</div><div class="line"><a name="l02625"></a><span class="lineno"> 2625</span>&#160;};</div><div class="line"><a name="l02626"></a><span class="lineno"> 2626</span>&#160;</div><div class="line"><a name="l02627"></a><span class="lineno"><a class="line" href="structlws__token__limits.html"> 2627</a></span>&#160;<span class="keyword">struct </span><a class="code" href="structlws__token__limits.html">lws_token_limits</a> {</div><div class="line"><a name="l02628"></a><span class="lineno"><a class="line" href="structlws__token__limits.html#a6ec712306cbf8585bce7a56758a3ceff"> 2628</a></span>&#160;        <span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> token_limit[WSI_TOKEN_COUNT]; </div><div class="line"><a name="l02629"></a><span class="lineno"> 2629</span>&#160;};</div><div class="line"><a name="l02630"></a><span class="lineno"> 2630</span>&#160;</div><div class="line"><a name="l02636"></a><span class="lineno"> 2636</span>&#160;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="l02637"></a><span class="lineno"> 2637</span>&#160;<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="l02638"></a><span class="lineno"> 2638</span>&#160;</div><div class="line"><a name="l02639"></a><span class="lineno"> 2639</span>&#160;</div><div class="line"><a name="l02648"></a><span class="lineno"> 2648</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span> LWS_WARN_UNUSED_RESULT</div><div class="line"><a name="l02649"></a><span class="lineno"> 2649</span>&#160;<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="l02650"></a><span class="lineno"> 2650</span>&#160;</div><div class="line"><a name="l02660"></a><span class="lineno"> 2660</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span> LWS_WARN_UNUSED_RESULT</div><div class="line"><a name="l02661"></a><span class="lineno"> 2661</span>&#160;<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="l02662"></a><span class="lineno"> 2662</span>&#160;</div><div class="line"><a name="l02676"></a><span class="lineno"> 2676</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l02677"></a><span class="lineno"> 2677</span>&#160;<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="l02678"></a><span class="lineno"> 2678</span>&#160;</div><div class="line"><a name="l02696"></a><span class="lineno"> 2696</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l02697"></a><span class="lineno"> 2697</span>&#160;<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="l02698"></a><span class="lineno"> 2698</span>&#160;                      <span class="keyword">enum</span> lws_token_indexes h, <span class="keywordtype">int</span> frag_idx);</div><div class="line"><a name="l02699"></a><span class="lineno"> 2699</span>&#160;</div><div class="line"><a name="l02710"></a><span class="lineno"> 2710</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keyword">const</span> <span class="keywordtype">char</span> *</div><div class="line"><a name="l02711"></a><span class="lineno"> 2711</span>&#160;<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="l02713"></a><span class="lineno"> 2713</span>&#160;</div><div class="line"><a name="l02728"></a><span class="lineno"> 2728</span>&#160;</div><div class="line"><a name="l02739"></a><span class="lineno"> 2739</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span> LWS_WARN_UNUSED_RESULT</div><div class="line"><a name="l02740"></a><span class="lineno"> 2740</span>&#160;<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="l02741"></a><span class="lineno"> 2741</span>&#160;                           <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="l02742"></a><span class="lineno"> 2742</span>&#160;                           <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *end);</div><div class="line"><a name="l02755"></a><span class="lineno"> 2755</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span> LWS_WARN_UNUSED_RESULT</div><div class="line"><a name="l02756"></a><span class="lineno"> 2756</span>&#160;<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="l02757"></a><span class="lineno"> 2757</span>&#160;                            <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="l02758"></a><span class="lineno"> 2758</span>&#160;                            <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="l02772"></a><span class="lineno"> 2772</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span> LWS_WARN_UNUSED_RESULT</div><div class="line"><a name="l02773"></a><span class="lineno"> 2773</span>&#160;<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="l02774"></a><span class="lineno"> 2774</span>&#160;                             <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="l02775"></a><span class="lineno"> 2775</span>&#160;                             <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="l02786"></a><span class="lineno"> 2786</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span> LWS_WARN_UNUSED_RESULT</div><div class="line"><a name="l02787"></a><span class="lineno"> 2787</span>&#160;<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="l02788"></a><span class="lineno"> 2788</span>&#160;                                   <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> content_length,</div><div class="line"><a name="l02789"></a><span class="lineno"> 2789</span>&#160;                                   <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="l02799"></a><span class="lineno"> 2799</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span> LWS_WARN_UNUSED_RESULT</div><div class="line"><a name="l02800"></a><span class="lineno"> 2800</span>&#160;<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="l02801"></a><span class="lineno"> 2801</span>&#160;                         <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *end);</div><div class="line"><a name="l02803"></a><span class="lineno"> 2803</span>&#160;</div><div class="line"><a name="l02822"></a><span class="lineno"> 2822</span>&#160;</div><div class="line"><a name="l02825"></a><span class="lineno"><a class="line" href="group__form-parsing.html#ga41a74a822771d3dce89751aa3bce28ae"> 2825</a></span>&#160;<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="l02826"></a><span class="lineno"><a class="line" href="group__form-parsing.html#gga41a74a822771d3dce89751aa3bce28aead3a958e7719ac273c3ba4f684f00c87f"> 2826</a></span>&#160;        <a class="code" href="group__form-parsing.html#gga41a74a822771d3dce89751aa3bce28aead3a958e7719ac273c3ba4f684f00c87f">LWS_UFS_CONTENT</a>,</div><div class="line"><a name="l02828"></a><span class="lineno"><a class="line" href="group__form-parsing.html#gga41a74a822771d3dce89751aa3bce28aea6ce2a55a4c3695cdb640c893d95bd3a7"> 2828</a></span>&#160;        <a class="code" href="group__form-parsing.html#gga41a74a822771d3dce89751aa3bce28aea6ce2a55a4c3695cdb640c893d95bd3a7">LWS_UFS_FINAL_CONTENT</a>,</div><div class="line"><a name="l02830"></a><span class="lineno"><a class="line" href="group__form-parsing.html#gga41a74a822771d3dce89751aa3bce28aea2d25de44865bd44e5a3903a2bab9ca83"> 2830</a></span>&#160;        <a class="code" href="group__form-parsing.html#gga41a74a822771d3dce89751aa3bce28aea2d25de44865bd44e5a3903a2bab9ca83">LWS_UFS_OPEN</a></div><div class="line"><a name="l02832"></a><span class="lineno"> 2832</span>&#160;};</div><div class="line"><a name="l02833"></a><span class="lineno"> 2833</span>&#160;</div><div class="line"><a name="l02847"></a><span class="lineno"><a class="line" href="group__form-parsing.html#ga5a70527c0861c2ffa3d29333a6aa7f8e"> 2847</a></span>&#160;<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="l02848"></a><span class="lineno"> 2848</span>&#160;                        <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="l02849"></a><span class="lineno"> 2849</span>&#160;                        <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="l02850"></a><span class="lineno"> 2850</span>&#160;</div><div class="line"><a name="l02853"></a><span class="lineno"> 2853</span>&#160;<span class="keyword">struct </span>lws_spa;</div><div class="line"><a name="l02854"></a><span class="lineno"> 2854</span>&#160;</div><div class="line"><a name="l02873"></a><span class="lineno"> 2873</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keyword">struct </span>lws_spa *</div><div class="line"><a name="l02874"></a><span class="lineno"> 2874</span>&#160;<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="l02875"></a><span class="lineno"> 2875</span>&#160;               <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="l02876"></a><span class="lineno"> 2876</span>&#160;               <span class="keywordtype">void</span> *opt_data);</div><div class="line"><a name="l02877"></a><span class="lineno"> 2877</span>&#160;</div><div class="line"><a name="l02885"></a><span class="lineno"> 2885</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l02886"></a><span class="lineno"> 2886</span>&#160;<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="l02887"></a><span class="lineno"> 2887</span>&#160;</div><div class="line"><a name="l02893"></a><span class="lineno"> 2893</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l02894"></a><span class="lineno"> 2894</span>&#160;<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="l02895"></a><span class="lineno"> 2895</span>&#160;</div><div class="line"><a name="l02902"></a><span class="lineno"> 2902</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l02903"></a><span class="lineno"> 2903</span>&#160;<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="l02904"></a><span class="lineno"> 2904</span>&#160;</div><div class="line"><a name="l02910"></a><span class="lineno"> 2910</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keyword">const</span> <span class="keywordtype">char</span> *</div><div class="line"><a name="l02911"></a><span class="lineno"> 2911</span>&#160;<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="l02912"></a><span class="lineno"> 2912</span>&#160;</div><div class="line"><a name="l02918"></a><span class="lineno"> 2918</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l02919"></a><span class="lineno"> 2919</span>&#160;<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="l02921"></a><span class="lineno"> 2921</span>&#160;</div><div class="line"><a name="l02932"></a><span class="lineno"> 2932</span>&#160;</div><div class="line"><a name="l02943"></a><span class="lineno"> 2943</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keyword">const</span> <span class="keywordtype">char</span> *</div><div class="line"><a name="l02944"></a><span class="lineno"> 2944</span>&#160;<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="l02945"></a><span class="lineno"> 2945</span>&#160;</div><div class="line"><a name="l02946"></a><span class="lineno"> 2946</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l02947"></a><span class="lineno"> 2947</span>&#160;<span class="comment"> * URLDECODE 1 / 2</span></div><div class="line"><a name="l02948"></a><span class="lineno"> 2948</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l02949"></a><span class="lineno"> 2949</span>&#160;<span class="comment"> * This simple urldecode only operates until the first &#39;\0&#39; and requires the</span></div><div class="line"><a name="l02950"></a><span class="lineno"> 2950</span>&#160;<span class="comment"> * data to exist all at once</span></div><div class="line"><a name="l02951"></a><span class="lineno"> 2951</span>&#160;<span class="comment"> */</span></div><div class="line"><a name="l02964"></a><span class="lineno"> 2964</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l02965"></a><span class="lineno"> 2965</span>&#160;<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="l02967"></a><span class="lineno"> 2967</span>&#160;</div><div class="line"><a name="l02976"></a><span class="lineno"> 2976</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l02977"></a><span class="lineno"> 2977</span>&#160;<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="l02978"></a><span class="lineno"> 2978</span>&#160;                       <span class="keyword">const</span> <span class="keywordtype">char</span> *html_body);</div><div class="line"><a name="l02979"></a><span class="lineno"> 2979</span>&#160;</div><div class="line"><a name="l02990"></a><span class="lineno"> 2990</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span> LWS_WARN_UNUSED_RESULT</div><div class="line"><a name="l02991"></a><span class="lineno"> 2991</span>&#160;<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="l02992"></a><span class="lineno"> 2992</span>&#160;                  <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="l02993"></a><span class="lineno"> 2993</span>&#160;</div><div class="line"><a name="l03002"></a><span class="lineno"> 3002</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span> LWS_WARN_UNUSED_RESULT</div><div class="line"><a name="l03003"></a><span class="lineno"> 3003</span>&#160;<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="l03005"></a><span class="lineno"> 3005</span>&#160;</div><div class="line"><a name="l03013"></a><span class="lineno"> 3013</span>&#160;</div><div class="line"><a name="l03024"></a><span class="lineno"> 3024</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keyword">const</span> <span class="keywordtype">char</span> *</div><div class="line"><a name="l03025"></a><span class="lineno"> 3025</span>&#160;<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="l03026"></a><span class="lineno"> 3026</span>&#160;</div><div class="line"><a name="l03037"></a><span class="lineno"> 3037</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keyword">const</span> <span class="keywordtype">char</span> *</div><div class="line"><a name="l03038"></a><span class="lineno"> 3038</span>&#160;<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="l03040"></a><span class="lineno"> 3040</span>&#160;</div><div class="line"><a name="l03047"></a><span class="lineno"> 3047</span>&#160;</div><div class="line"><a name="l03049"></a><span class="lineno"> 3049</span>&#160;<span class="preprocessor">#ifdef LWS_USE_LIBEV</span></div><div class="line"><a name="l03050"></a><span class="lineno"> 3050</span>&#160;<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="l03051"></a><span class="lineno"> 3051</span>&#160;</div><div class="line"><a name="l03052"></a><span class="lineno"> 3052</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l03053"></a><span class="lineno"> 3053</span>&#160;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="l03054"></a><span class="lineno"> 3054</span>&#160;                  lws_ev_signal_cb_t *cb);</div><div class="line"><a name="l03055"></a><span class="lineno"> 3055</span>&#160;</div><div class="line"><a name="l03056"></a><span class="lineno"> 3056</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l03057"></a><span class="lineno"> 3057</span>&#160;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="l03058"></a><span class="lineno"> 3058</span>&#160;</div><div class="line"><a name="l03059"></a><span class="lineno"> 3059</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">void</span></div><div class="line"><a name="l03060"></a><span class="lineno"> 3060</span>&#160;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="l03061"></a><span class="lineno"> 3061</span>&#160;<span class="preprocessor">#endif </span><span class="comment">/* LWS_USE_LIBEV */</span><span class="preprocessor"></span></div><div class="line"><a name="l03062"></a><span class="lineno"> 3062</span>&#160;</div><div class="line"><a name="l03064"></a><span class="lineno"> 3064</span>&#160;</div><div class="line"><a name="l03071"></a><span class="lineno"> 3071</span>&#160;<span class="preprocessor">#ifdef LWS_USE_LIBUV</span></div><div class="line"><a name="l03073"></a><span class="lineno"> 3073</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l03074"></a><span class="lineno"> 3074</span>&#160;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="l03075"></a><span class="lineno"> 3075</span>&#160;                  uv_signal_cb cb);</div><div class="line"><a name="l03076"></a><span class="lineno"> 3076</span>&#160;</div><div class="line"><a name="l03077"></a><span class="lineno"> 3077</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">void</span></div><div class="line"><a name="l03078"></a><span class="lineno"> 3078</span>&#160;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="l03079"></a><span class="lineno"> 3079</span>&#160;</div><div class="line"><a name="l03080"></a><span class="lineno"> 3080</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">void</span></div><div class="line"><a name="l03081"></a><span class="lineno"> 3081</span>&#160;lws_libuv_stop(<span class="keyword">struct</span> lws_context *context);</div><div class="line"><a name="l03082"></a><span class="lineno"> 3082</span>&#160;</div><div class="line"><a name="l03083"></a><span class="lineno"> 3083</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l03084"></a><span class="lineno"> 3084</span>&#160;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="l03085"></a><span class="lineno"> 3085</span>&#160;</div><div class="line"><a name="l03086"></a><span class="lineno"> 3086</span>&#160;LWS_VISIBLE LWS_EXTERN uv_loop_t *</div><div class="line"><a name="l03087"></a><span class="lineno"> 3087</span>&#160;lws_uv_getloop(<span class="keyword">struct</span> lws_context *context, <span class="keywordtype">int</span> tsi);</div><div class="line"><a name="l03088"></a><span class="lineno"> 3088</span>&#160;</div><div class="line"><a name="l03089"></a><span class="lineno"> 3089</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">void</span></div><div class="line"><a name="l03090"></a><span class="lineno"> 3090</span>&#160;lws_uv_sigint_cb(uv_signal_t *watcher, <span class="keywordtype">int</span> signum);</div><div class="line"><a name="l03091"></a><span class="lineno"> 3091</span>&#160;<span class="preprocessor">#endif </span><span class="comment">/* LWS_USE_LIBUV */</span><span class="preprocessor"></span></div><div class="line"><a name="l03092"></a><span class="lineno"> 3092</span>&#160;</div><div class="line"><a name="l03099"></a><span class="lineno"> 3099</span>&#160;</div><div class="line"><a name="l03100"></a><span class="lineno"> 3100</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l03101"></a><span class="lineno"> 3101</span>&#160;<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="l03102"></a><span class="lineno"> 3102</span>&#160;<span class="comment"> * add it at where specified so existing users are unaffected.</span></div><div class="line"><a name="l03103"></a><span class="lineno"> 3103</span>&#160;<span class="comment"> */</span></div><div class="line"><a name="l03104"></a><span class="lineno"> 3104</span>&#160;<span class="keyword">enum</span> pending_timeout {</div><div class="line"><a name="l03105"></a><span class="lineno"> 3105</span>&#160;        NO_PENDING_TIMEOUT                                      =  0,</div><div class="line"><a name="l03106"></a><span class="lineno"> 3106</span>&#160;        PENDING_TIMEOUT_AWAITING_PROXY_RESPONSE                 =  1,</div><div class="line"><a name="l03107"></a><span class="lineno"> 3107</span>&#160;        PENDING_TIMEOUT_AWAITING_CONNECT_RESPONSE               =  2,</div><div class="line"><a name="l03108"></a><span class="lineno"> 3108</span>&#160;        PENDING_TIMEOUT_ESTABLISH_WITH_SERVER                   =  3,</div><div class="line"><a name="l03109"></a><span class="lineno"> 3109</span>&#160;        PENDING_TIMEOUT_AWAITING_SERVER_RESPONSE                =  4,</div><div class="line"><a name="l03110"></a><span class="lineno"> 3110</span>&#160;        PENDING_TIMEOUT_AWAITING_PING                           =  5,</div><div class="line"><a name="l03111"></a><span class="lineno"> 3111</span>&#160;        PENDING_TIMEOUT_CLOSE_ACK                               =  6,</div><div class="line"><a name="l03112"></a><span class="lineno"> 3112</span>&#160;        PENDING_TIMEOUT_AWAITING_EXTENSION_CONNECT_RESPONSE     =  7,</div><div class="line"><a name="l03113"></a><span class="lineno"> 3113</span>&#160;        PENDING_TIMEOUT_SENT_CLIENT_HANDSHAKE                   =  8,</div><div class="line"><a name="l03114"></a><span class="lineno"> 3114</span>&#160;        PENDING_TIMEOUT_SSL_ACCEPT                              =  9,</div><div class="line"><a name="l03115"></a><span class="lineno"> 3115</span>&#160;        PENDING_TIMEOUT_HTTP_CONTENT                            = 10,</div><div class="line"><a name="l03116"></a><span class="lineno"> 3116</span>&#160;        PENDING_TIMEOUT_AWAITING_CLIENT_HS_SEND                 = 11,</div><div class="line"><a name="l03117"></a><span class="lineno"> 3117</span>&#160;        PENDING_FLUSH_STORED_SEND_BEFORE_CLOSE                  = 12,</div><div class="line"><a name="l03118"></a><span class="lineno"> 3118</span>&#160;        PENDING_TIMEOUT_SHUTDOWN_FLUSH                          = 13,</div><div class="line"><a name="l03119"></a><span class="lineno"> 3119</span>&#160;        PENDING_TIMEOUT_CGI                                     = 14,</div><div class="line"><a name="l03120"></a><span class="lineno"> 3120</span>&#160;        PENDING_TIMEOUT_HTTP_KEEPALIVE_IDLE                     = 15,</div><div class="line"><a name="l03121"></a><span class="lineno"> 3121</span>&#160;        PENDING_TIMEOUT_WS_PONG_CHECK_SEND_PING                 = 16,</div><div class="line"><a name="l03122"></a><span class="lineno"> 3122</span>&#160;        PENDING_TIMEOUT_WS_PONG_CHECK_GET_PONG                  = 17,</div><div class="line"><a name="l03123"></a><span class="lineno"> 3123</span>&#160;        PENDING_TIMEOUT_CLIENT_ISSUE_PAYLOAD                    = 18,</div><div class="line"><a name="l03124"></a><span class="lineno"> 3124</span>&#160;</div><div class="line"><a name="l03125"></a><span class="lineno"> 3125</span>&#160;        <span class="comment">/****** add new things just above ---^ ******/</span></div><div class="line"><a name="l03126"></a><span class="lineno"> 3126</span>&#160;};</div><div class="line"><a name="l03127"></a><span class="lineno"> 3127</span>&#160;</div><div class="line"><a name="l03137"></a><span class="lineno"> 3137</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">void</span></div><div class="line"><a name="l03138"></a><span class="lineno"> 3138</span>&#160;<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="l03140"></a><span class="lineno"> 3140</span>&#160;</div><div class="line"><a name="l03146"></a><span class="lineno"> 3146</span>&#160;<span class="preprocessor">#if !defined(LWS_SIZEOFPTR)</span></div><div class="line"><a name="l03147"></a><span class="lineno"> 3147</span>&#160;<span class="preprocessor">#define LWS_SIZEOFPTR (sizeof (void *))</span></div><div class="line"><a name="l03148"></a><span class="lineno"> 3148</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l03149"></a><span class="lineno"> 3149</span>&#160;<span class="preprocessor">#if !defined(u_int64_t)</span></div><div class="line"><a name="l03150"></a><span class="lineno"> 3150</span>&#160;<span class="preprocessor">#define u_int64_t unsigned long long</span></div><div class="line"><a name="l03151"></a><span class="lineno"> 3151</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l03152"></a><span class="lineno"> 3152</span>&#160;</div><div class="line"><a name="l03153"></a><span class="lineno"> 3153</span>&#160;<span class="preprocessor">#if defined(__x86_64__)</span></div><div class="line"><a name="l03154"></a><span class="lineno"> 3154</span>&#160;<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="l03155"></a><span class="lineno"> 3155</span>&#160;<span class="preprocessor">#else</span></div><div class="line"><a name="l03156"></a><span class="lineno"> 3156</span>&#160;<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="l03157"></a><span class="lineno"> 3157</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l03158"></a><span class="lineno"> 3158</span>&#160;<span class="preprocessor">#define _LWS_PAD(n) (((n) % _LWS_PAD_SIZE) ? \</span></div><div class="line"><a name="l03159"></a><span class="lineno"> 3159</span>&#160;<span class="preprocessor">                ((n) + (_LWS_PAD_SIZE - ((n) % _LWS_PAD_SIZE))) : (n))</span></div><div class="line"><a name="l03160"></a><span class="lineno"> 3160</span>&#160;<span class="preprocessor">#define LWS_PRE _LWS_PAD(4 + 10)</span></div><div class="line"><a name="l03161"></a><span class="lineno"> 3161</span>&#160;<span class="comment">/* used prior to 1.7 and retained for backward compatibility */</span></div><div class="line"><a name="l03162"></a><span class="lineno"> 3162</span>&#160;<span class="preprocessor">#define LWS_SEND_BUFFER_PRE_PADDING LWS_PRE</span></div><div class="line"><a name="l03163"></a><span class="lineno"> 3163</span>&#160;<span class="preprocessor">#define LWS_SEND_BUFFER_POST_PADDING 0</span></div><div class="line"><a name="l03164"></a><span class="lineno"> 3164</span>&#160;</div><div class="line"><a name="l03165"></a><span class="lineno"> 3165</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l03166"></a><span class="lineno"> 3166</span>&#160;<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="l03167"></a><span class="lineno"> 3167</span>&#160;<span class="comment"> * add it at where specified so existing users are unaffected.</span></div><div class="line"><a name="l03168"></a><span class="lineno"> 3168</span>&#160;<span class="comment"> */</span></div><div class="line"><a name="l03169"></a><span class="lineno"><a class="line" href="group__sending-data.html#ga98b099cf8c1c7e38ad78501f270e193d"> 3169</a></span>&#160;<span class="keyword">enum</span> <a class="code" href="group__sending-data.html#ga98b099cf8c1c7e38ad78501f270e193d">lws_write_protocol</a> {</div><div class="line"><a name="l03170"></a><span class="lineno"><a class="line" href="group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193da80e8f169fda236c56bfb795ed62903db"> 3170</a></span>&#160;        <a class="code" href="group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193da80e8f169fda236c56bfb795ed62903db">LWS_WRITE_TEXT</a>                                          = 0,</div><div class="line"><a name="l03174"></a><span class="lineno"><a class="line" href="group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193daf6486c0dba50c44198100717721d9ab2"> 3174</a></span>&#160;        <a class="code" href="group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193daf6486c0dba50c44198100717721d9ab2">LWS_WRITE_BINARY</a>                                        = 1,</div><div class="line"><a name="l03177"></a><span class="lineno"><a class="line" href="group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193da10047eb05b5e1c298151dc47a5b44826"> 3177</a></span>&#160;        <a class="code" href="group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193da10047eb05b5e1c298151dc47a5b44826">LWS_WRITE_CONTINUATION</a>                                  = 2,</div><div class="line"><a name="l03180"></a><span class="lineno"><a class="line" href="group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193dabb6705e1d1327cdda5025be28f07712e"> 3180</a></span>&#160;        <a class="code" href="group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193dabb6705e1d1327cdda5025be28f07712e">LWS_WRITE_HTTP</a>                                          = 3,</div><div class="line"><a name="l03183"></a><span class="lineno"> 3183</span>&#160;        <span class="comment">/* LWS_WRITE_CLOSE is handled by lws_close_reason() */</span></div><div class="line"><a name="l03184"></a><span class="lineno"> 3184</span>&#160;        LWS_WRITE_PING                                          = 5,</div><div class="line"><a name="l03185"></a><span class="lineno"> 3185</span>&#160;        LWS_WRITE_PONG                                          = 6,</div><div class="line"><a name="l03186"></a><span class="lineno"> 3186</span>&#160;</div><div class="line"><a name="l03187"></a><span class="lineno"> 3187</span>&#160;        <span class="comment">/* Same as write_http but we know this write ends the transaction */</span></div><div class="line"><a name="l03188"></a><span class="lineno"> 3188</span>&#160;        LWS_WRITE_HTTP_FINAL                                    = 7,</div><div class="line"><a name="l03189"></a><span class="lineno"> 3189</span>&#160;</div><div class="line"><a name="l03190"></a><span class="lineno"> 3190</span>&#160;        <span class="comment">/* HTTP2 */</span></div><div class="line"><a name="l03191"></a><span class="lineno"> 3191</span>&#160;</div><div class="line"><a name="l03192"></a><span class="lineno"><a class="line" href="group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193dafe5a38e940ce56708ac814627e9c0917"> 3192</a></span>&#160;        <a class="code" href="group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193dafe5a38e940ce56708ac814627e9c0917">LWS_WRITE_HTTP_HEADERS</a>                                  = 8,</div><div class="line"><a name="l03199"></a><span class="lineno"> 3199</span>&#160;        <span class="comment">/****** add new things just above ---^ ******/</span></div><div class="line"><a name="l03200"></a><span class="lineno"> 3200</span>&#160;</div><div class="line"><a name="l03201"></a><span class="lineno"> 3201</span>&#160;        <span class="comment">/* flags */</span></div><div class="line"><a name="l03202"></a><span class="lineno"> 3202</span>&#160;</div><div class="line"><a name="l03203"></a><span class="lineno"><a class="line" href="group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193da115440f272a5d55518adfc8099acfee3"> 3203</a></span>&#160;        <a class="code" href="group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193da115440f272a5d55518adfc8099acfee3">LWS_WRITE_NO_FIN</a> = 0x40,</div><div class="line"><a name="l03206"></a><span class="lineno"><a class="line" href="group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193da220d8e8652d9b97fb66e476e2a60ffce"> 3206</a></span>&#160;        <a class="code" href="group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193da220d8e8652d9b97fb66e476e2a60ffce">LWS_WRITE_CLIENT_IGNORE_XOR_MASK</a> = 0x80</div><div class="line"><a name="l03210"></a><span class="lineno"> 3210</span>&#160;};</div><div class="line"><a name="l03211"></a><span class="lineno"> 3211</span>&#160;</div><div class="line"><a name="l03212"></a><span class="lineno"> 3212</span>&#160;</div><div class="line"><a name="l03299"></a><span class="lineno"> 3299</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l03300"></a><span class="lineno"> 3300</span>&#160;<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="l03301"></a><span class="lineno"> 3301</span>&#160;          <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="l03302"></a><span class="lineno"> 3302</span>&#160;</div><div class="line"><a name="l03303"></a><span class="lineno"> 3303</span>&#160;<span class="comment">/* helper for case where buffer may be const */</span></div><div class="line"><a name="l03304"></a><span class="lineno"> 3304</span>&#160;<span class="preprocessor">#define lws_write_http(wsi, buf, len) \</span></div><div class="line"><a name="l03305"></a><span class="lineno"> 3305</span>&#160;<span class="preprocessor">        lws_write(wsi, (unsigned char *)(buf), len, LWS_WRITE_HTTP)</span></div><div class="line"><a name="l03306"></a><span class="lineno"> 3306</span>&#160;</div><div class="line"><a name="l03326"></a><span class="lineno"> 3326</span>&#160;</div><div class="line"><a name="l03339"></a><span class="lineno"> 3339</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l03340"></a><span class="lineno"> 3340</span>&#160;<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="l03341"></a><span class="lineno"> 3341</span>&#160;</div><div class="line"><a name="l03355"></a><span class="lineno"> 3355</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l03356"></a><span class="lineno"> 3356</span>&#160;<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="l03357"></a><span class="lineno"> 3357</span>&#160;                                      <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="l03358"></a><span class="lineno"> 3358</span>&#160;</div><div class="line"><a name="l03372"></a><span class="lineno"> 3372</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l03373"></a><span class="lineno"> 3373</span>&#160;<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="l03374"></a><span class="lineno"> 3374</span>&#160;                                      <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="l03375"></a><span class="lineno"> 3375</span>&#160;</div><div class="line"><a name="l03388"></a><span class="lineno"> 3388</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l03389"></a><span class="lineno"> 3389</span>&#160;<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="l03390"></a><span class="lineno"> 3390</span>&#160;                          <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="l03391"></a><span class="lineno"> 3391</span>&#160;</div><div class="line"><a name="l03404"></a><span class="lineno"> 3404</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l03405"></a><span class="lineno"> 3405</span>&#160;<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="l03406"></a><span class="lineno"> 3406</span>&#160;                          <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="l03407"></a><span class="lineno"> 3407</span>&#160;</div><div class="line"><a name="l03421"></a><span class="lineno"> 3421</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l03422"></a><span class="lineno"> 3422</span>&#160;<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="l03423"></a><span class="lineno"> 3423</span>&#160;</div><div class="line"><a name="l03424"></a><span class="lineno"> 3424</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l03425"></a><span class="lineno"> 3425</span>&#160;lws_callback_http_dummy(<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="l03426"></a><span class="lineno"> 3426</span>&#160;                    <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="l03427"></a><span class="lineno"> 3427</span>&#160;</div><div class="line"><a name="l03435"></a><span class="lineno"> 3435</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l03436"></a><span class="lineno"> 3436</span>&#160;<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="l03437"></a><span class="lineno"> 3437</span>&#160;</div><div class="line"><a name="l03459"></a><span class="lineno"> 3459</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">size_t</span></div><div class="line"><a name="l03460"></a><span class="lineno"> 3460</span>&#160;<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="l03462"></a><span class="lineno"> 3462</span>&#160;</div><div class="line"><a name="l03473"></a><span class="lineno"> 3473</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l03474"></a><span class="lineno"> 3474</span>&#160;<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="l03475"></a><span class="lineno"> 3475</span>&#160;</div><div class="line"><a name="l03485"></a><span class="lineno"> 3485</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">void</span></div><div class="line"><a name="l03486"></a><span class="lineno"> 3486</span>&#160;<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="l03487"></a><span class="lineno"> 3487</span>&#160;                               <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="l03488"></a><span class="lineno"> 3488</span>&#160;</div><div class="line"><a name="l03505"></a><span class="lineno"> 3505</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">size_t</span></div><div class="line"><a name="l03506"></a><span class="lineno"> 3506</span>&#160;<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="l03507"></a><span class="lineno"> 3507</span>&#160;</div><div class="line"><a name="l03508"></a><span class="lineno"> 3508</span>&#160;</div><div class="line"><a name="l03517"></a><span class="lineno"> 3517</span>&#160;</div><div class="line"><a name="l03530"></a><span class="lineno"> 3530</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keyword">struct </span>lws *</div><div class="line"><a name="l03531"></a><span class="lineno"> 3531</span>&#160;<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="l03554"></a><span class="lineno"> 3554</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keyword">struct </span>lws *</div><div class="line"><a name="l03555"></a><span class="lineno"> 3555</span>&#160;<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="l03556"></a><span class="lineno"> 3556</span>&#160;                <span class="keyword">const</span> <span class="keywordtype">char</span> *readbuf, <span class="keywordtype">size_t</span> len);</div><div class="line"><a name="l03558"></a><span class="lineno"> 3558</span>&#160;</div><div class="line"><a name="l03564"></a><span class="lineno"> 3564</span>&#160;</div><div class="line"><a name="l03575"></a><span class="lineno"> 3575</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keyword">const</span> <span class="keywordtype">char</span> * LWS_WARN_UNUSED_RESULT</div><div class="line"><a name="l03576"></a><span class="lineno"> 3576</span>&#160;<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="l03577"></a><span class="lineno"> 3577</span>&#160;</div><div class="line"><a name="l03592"></a><span class="lineno"> 3592</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">void</span></div><div class="line"><a name="l03593"></a><span class="lineno"> 3593</span>&#160;<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="l03594"></a><span class="lineno"> 3594</span>&#160;                       <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="l03595"></a><span class="lineno"> 3595</span>&#160;</div><div class="line"><a name="l03606"></a><span class="lineno"> 3606</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keyword">const</span> <span class="keywordtype">char</span> *</div><div class="line"><a name="l03607"></a><span class="lineno"> 3607</span>&#160;<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="l03608"></a><span class="lineno"> 3608</span>&#160;<span class="preprocessor">#ifndef LWS_WITH_ESP8266</span></div><div class="line"><a name="l03609"></a><span class="lineno"> 3609</span>&#160;</div><div class="line"><a name="l03620"></a><span class="lineno"> 3620</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l03621"></a><span class="lineno"> 3621</span>&#160;<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="l03622"></a><span class="lineno"> 3622</span>&#160;                    <span class="keywordtype">size_t</span> addrlen);</div><div class="line"><a name="l03624"></a><span class="lineno"> 3624</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l03625"></a><span class="lineno"> 3625</span>&#160;</div><div class="line"><a name="l03631"></a><span class="lineno"> 3631</span>&#160;</div><div class="line"><a name="l03644"></a><span class="lineno"> 3644</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l03645"></a><span class="lineno"> 3645</span>&#160;<a class="code" href="group__misc.html#ga9f37d0e357de2ab4170723fcdb665d21">lws_snprintf</a>(<span class="keywordtype">char</span> *str, <span class="keywordtype">size_t</span> size, <span class="keyword">const</span> <span class="keywordtype">char</span> *format, ...);</div><div class="line"><a name="l03646"></a><span class="lineno"> 3646</span>&#160;</div><div class="line"><a name="l03658"></a><span class="lineno"> 3658</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l03659"></a><span class="lineno"> 3659</span>&#160;<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="l03667"></a><span class="lineno"> 3667</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span> LWS_WARN_UNUSED_RESULT</div><div class="line"><a name="l03668"></a><span class="lineno"> 3668</span>&#160;<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="l03674"></a><span class="lineno"> 3674</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keyword">const</span> <span class="keywordtype">char</span> * LWS_WARN_UNUSED_RESULT</div><div class="line"><a name="l03675"></a><span class="lineno"> 3675</span>&#160;<a class="code" href="group__misc.html#gac6abfc0b2bd5b2f09281a4432bb2f5f0">lws_get_library_version</a>(<span class="keywordtype">void</span>);</div><div class="line"><a name="l03676"></a><span class="lineno"> 3676</span>&#160;</div><div class="line"><a name="l03683"></a><span class="lineno"> 3683</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">void</span> *</div><div class="line"><a name="l03684"></a><span class="lineno"> 3684</span>&#160;<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="l03685"></a><span class="lineno"> 3685</span>&#160;</div><div class="line"><a name="l03697"></a><span class="lineno"> 3697</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span> LWS_WARN_UNUSED_RESULT</div><div class="line"><a name="l03698"></a><span class="lineno"> 3698</span>&#160;<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="l03699"></a><span class="lineno"> 3699</span>&#160;              <span class="keyword">const</span> <span class="keywordtype">char</span> **path);</div><div class="line"><a name="l03700"></a><span class="lineno"> 3700</span>&#160;</div><div class="line"><a name="l03704"></a><span class="lineno"> 3704</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span></div><div class="line"><a name="l03705"></a><span class="lineno"> 3705</span>&#160;<a class="code" href="group__misc.html#ga33bf2635033710b25f931b57ed663e1e">lws_now_secs</a>(<span class="keywordtype">void</span>);</div><div class="line"><a name="l03706"></a><span class="lineno"> 3706</span>&#160;</div><div class="line"><a name="l03716"></a><span class="lineno"> 3716</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keyword">struct </span>lws_context * LWS_WARN_UNUSED_RESULT</div><div class="line"><a name="l03717"></a><span class="lineno"> 3717</span>&#160;<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="l03718"></a><span class="lineno"> 3718</span>&#160;</div><div class="line"><a name="l03728"></a><span class="lineno"> 3728</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span> LWS_WARN_UNUSED_RESULT</div><div class="line"><a name="l03729"></a><span class="lineno"> 3729</span>&#160;<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="l03730"></a><span class="lineno"> 3730</span>&#160;</div><div class="line"><a name="l03738"></a><span class="lineno"> 3738</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keyword">struct </span>lws * LWS_WARN_UNUSED_RESULT</div><div class="line"><a name="l03739"></a><span class="lineno"> 3739</span>&#160;<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="l03740"></a><span class="lineno"> 3740</span>&#160;</div><div class="line"><a name="l03747"></a><span class="lineno"> 3747</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keyword">struct </span>lws * LWS_WARN_UNUSED_RESULT</div><div class="line"><a name="l03748"></a><span class="lineno"> 3748</span>&#160;<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="l03749"></a><span class="lineno"> 3749</span>&#160;</div><div class="line"><a name="l03750"></a><span class="lineno"> 3750</span>&#160;</div><div class="line"><a name="l03751"></a><span class="lineno"> 3751</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l03752"></a><span class="lineno"> 3752</span>&#160;<span class="comment"> * \deprecated DEPRECATED Note: this is not normally needed as a user api.</span></div><div class="line"><a name="l03753"></a><span class="lineno"> 3753</span>&#160;<span class="comment"> * It&#39;s provided in case it is</span></div><div class="line"><a name="l03754"></a><span class="lineno"> 3754</span>&#160;<span class="comment"> * useful when integrating with other app poll loop service code.</span></div><div class="line"><a name="l03755"></a><span class="lineno"> 3755</span>&#160;<span class="comment"> */</span></div><div class="line"><a name="l03756"></a><span class="lineno"> 3756</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l03757"></a><span class="lineno"> 3757</span>&#160;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="l03758"></a><span class="lineno"> 3758</span>&#160;</div><div class="line"><a name="l03766"></a><span class="lineno"> 3766</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">void</span></div><div class="line"><a name="l03767"></a><span class="lineno"> 3767</span>&#160;<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="l03769"></a><span class="lineno"> 3769</span>&#160;</div><div class="line"><a name="l03775"></a><span class="lineno"> 3775</span>&#160;</div><div class="line"><a name="l03782"></a><span class="lineno"> 3782</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span> LWS_WARN_UNUSED_RESULT</div><div class="line"><a name="l03783"></a><span class="lineno"> 3783</span>&#160;<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="l03784"></a><span class="lineno"> 3784</span>&#160;</div><div class="line"><a name="l03789"></a><span class="lineno"> 3789</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l03790"></a><span class="lineno"> 3790</span>&#160;<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="l03791"></a><span class="lineno"> 3791</span>&#160;</div><div class="line"><a name="l03796"></a><span class="lineno"> 3796</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span></div><div class="line"><a name="l03797"></a><span class="lineno"> 3797</span>&#160;<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="l03798"></a><span class="lineno"> 3798</span>&#160;</div><div class="line"><a name="l03815"></a><span class="lineno"> 3815</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span> LWS_WARN_UNUSED_RESULT</div><div class="line"><a name="l03816"></a><span class="lineno"> 3816</span>&#160;<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="l03817"></a><span class="lineno"> 3817</span>&#160;</div><div class="line"><a name="l03827"></a><span class="lineno"> 3827</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span> LWS_WARN_UNUSED_RESULT</div><div class="line"><a name="l03828"></a><span class="lineno"> 3828</span>&#160;<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="l03829"></a><span class="lineno"> 3829</span>&#160;</div><div class="line"><a name="l03838"></a><span class="lineno"> 3838</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l03839"></a><span class="lineno"> 3839</span>&#160;<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="l03844"></a><span class="lineno"> 3844</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l03845"></a><span class="lineno"> 3845</span>&#160;<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="l03847"></a><span class="lineno"> 3847</span>&#160;</div><div class="line"><a name="l03848"></a><span class="lineno"> 3848</span>&#160;</div><div class="line"><a name="l03854"></a><span class="lineno"> 3854</span>&#160;<span class="preprocessor">#ifdef LWS_SHA1_USE_OPENSSL_NAME</span></div><div class="line"><a name="l03856"></a><span class="lineno"> 3856</span>&#160;<span class="preprocessor">#define lws_SHA1 SHA1</span></div><div class="line"><a name="l03857"></a><span class="lineno"> 3857</span>&#160;<span class="preprocessor">#else</span></div><div class="line"><a name="l03858"></a><span class="lineno"> 3858</span>&#160;</div><div class="line"><a name="l03867"></a><span class="lineno"> 3867</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *</div><div class="line"><a name="l03868"></a><span class="lineno"> 3868</span>&#160;<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="l03869"></a><span class="lineno"> 3869</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l03870"></a><span class="lineno"> 3870</span>&#160;</div><div class="line"><a name="l03880"></a><span class="lineno"> 3880</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l03881"></a><span class="lineno"> 3881</span>&#160;<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="l03891"></a><span class="lineno"> 3891</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l03892"></a><span class="lineno"> 3892</span>&#160;<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="l03894"></a><span class="lineno"> 3894</span>&#160;</div><div class="line"><a name="l03895"></a><span class="lineno"> 3895</span>&#160;</div><div class="line"><a name="l03905"></a><span class="lineno"> 3905</span>&#160;<span class="preprocessor">#ifdef LWS_WITH_CGI</span></div><div class="line"><a name="l03906"></a><span class="lineno"> 3906</span>&#160;<span class="keyword">enum</span> lws_enum_stdinouterr {</div><div class="line"><a name="l03907"></a><span class="lineno"> 3907</span>&#160;        LWS_STDIN = 0,</div><div class="line"><a name="l03908"></a><span class="lineno"> 3908</span>&#160;        LWS_STDOUT = 1,</div><div class="line"><a name="l03909"></a><span class="lineno"> 3909</span>&#160;        LWS_STDERR = 2,</div><div class="line"><a name="l03910"></a><span class="lineno"> 3910</span>&#160;};</div><div class="line"><a name="l03911"></a><span class="lineno"> 3911</span>&#160;</div><div class="line"><a name="l03912"></a><span class="lineno"> 3912</span>&#160;<span class="keyword">enum</span> lws_cgi_hdr_state {</div><div class="line"><a name="l03913"></a><span class="lineno"> 3913</span>&#160;        LCHS_HEADER,</div><div class="line"><a name="l03914"></a><span class="lineno"> 3914</span>&#160;        LCHS_CR1,</div><div class="line"><a name="l03915"></a><span class="lineno"> 3915</span>&#160;        LCHS_LF1,</div><div class="line"><a name="l03916"></a><span class="lineno"> 3916</span>&#160;        LCHS_CR2,</div><div class="line"><a name="l03917"></a><span class="lineno"> 3917</span>&#160;        LCHS_LF2,</div><div class="line"><a name="l03918"></a><span class="lineno"> 3918</span>&#160;        LHCS_PAYLOAD,</div><div class="line"><a name="l03919"></a><span class="lineno"> 3919</span>&#160;        LCHS_SINGLE_0A,</div><div class="line"><a name="l03920"></a><span class="lineno"> 3920</span>&#160;};</div><div class="line"><a name="l03921"></a><span class="lineno"> 3921</span>&#160;</div><div class="line"><a name="l03922"></a><span class="lineno"><a class="line" href="structlws__cgi__args.html"> 3922</a></span>&#160;<span class="keyword">struct </span><a class="code" href="structlws__cgi__args.html">lws_cgi_args</a> {</div><div class="line"><a name="l03923"></a><span class="lineno"><a class="line" href="structlws__cgi__args.html#a4ccc1058e7e914a26eef31ab2ad46aa1"> 3923</a></span>&#160;        <span class="keyword">struct </span>lws **<a class="code" href="structlws__cgi__args.html#a4ccc1058e7e914a26eef31ab2ad46aa1">stdwsi</a>; </div><div class="line"><a name="l03924"></a><span class="lineno"><a class="line" href="structlws__cgi__args.html#adeee220b29aeacc34632c38e50f0f5a5"> 3924</a></span>&#160;        <span class="keyword">enum</span> lws_enum_stdinouterr ch; </div><div class="line"><a name="l03925"></a><span class="lineno"><a class="line" href="structlws__cgi__args.html#a8ac842084688c02f3f94694ef700d8f7"> 3925</a></span>&#160;        <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="l03926"></a><span class="lineno"><a class="line" href="structlws__cgi__args.html#a741c11b9aa05997ec45a3400d7fb7739"> 3926</a></span>&#160;        <span class="keyword">enum</span> lws_cgi_hdr_state hdr_state; </div><div class="line"><a name="l03927"></a><span class="lineno"><a class="line" href="structlws__cgi__args.html#a36e5c256433c187bd0eaa9c1ca667f1d"> 3927</a></span>&#160;        <span class="keywordtype">int</span> <a class="code" href="structlws__cgi__args.html#a36e5c256433c187bd0eaa9c1ca667f1d">len</a>; </div><div class="line"><a name="l03928"></a><span class="lineno"> 3928</span>&#160;};</div><div class="line"><a name="l03929"></a><span class="lineno"> 3929</span>&#160;</div><div class="line"><a name="l03930"></a><span class="lineno"> 3930</span>&#160;</div><div class="line"><a name="l03940"></a><span class="lineno"> 3940</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l03941"></a><span class="lineno"> 3941</span>&#160;<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="l03942"></a><span class="lineno"> 3942</span>&#160;        <span class="keywordtype">int</span> script_uri_path_len, <span class="keywordtype">int</span> timeout_secs,</div><div class="line"><a name="l03943"></a><span class="lineno"> 3943</span>&#160;        <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="l03944"></a><span class="lineno"> 3944</span>&#160;</div><div class="line"><a name="l03950"></a><span class="lineno"> 3950</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l03951"></a><span class="lineno"> 3951</span>&#160;<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="l03952"></a><span class="lineno"> 3952</span>&#160;</div><div class="line"><a name="l03958"></a><span class="lineno"> 3958</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l03959"></a><span class="lineno"> 3959</span>&#160;<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="l03960"></a><span class="lineno"> 3960</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l03961"></a><span class="lineno"> 3961</span>&#160;</div><div class="line"><a name="l03963"></a><span class="lineno"> 3963</span>&#160;</div><div class="line"><a name="l03980"></a><span class="lineno"> 3980</span>&#160;</div><div class="line"><a name="l03986"></a><span class="lineno"><a class="line" href="structlws__plat__file__ops.html"> 3986</a></span>&#160;<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="l03987"></a><span class="lineno"><a class="line" href="structlws__plat__file__ops.html#ad37a97abc68d0af967cef874f4d8df32"> 3987</a></span>&#160;        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="l03988"></a><span class="lineno"> 3988</span>&#160;                                <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> *filelen, <span class="keywordtype">int</span> flags);</div><div class="line"><a name="l03992"></a><span class="lineno"><a class="line" href="structlws__plat__file__ops.html#a034ec96f2fbaf52b4aa3e82d20795f7b"> 3992</a></span>&#160;        int (*close)(<span class="keyword">struct </span>lws *wsi, lws_filefd_type fd);</div><div class="line"><a name="l03994"></a><span class="lineno"><a class="line" href="structlws__plat__file__ops.html#abfcda19b003dcc13c61ff9e2bb4ff869"> 3994</a></span>&#160;        <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="l03995"></a><span class="lineno"> 3995</span>&#160;                                  <span class="keywordtype">long</span> offset_from_cur_pos);</div><div class="line"><a name="l03997"></a><span class="lineno"><a class="line" href="structlws__plat__file__ops.html#a01f483807a9862736b17ba9ed5110c40"> 3997</a></span>&#160;        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="l03998"></a><span class="lineno"> 3998</span>&#160;                    <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="l04000"></a><span class="lineno"><a class="line" href="structlws__plat__file__ops.html#a1fae8330ee94649a3551e31a30809793"> 4000</a></span>&#160;        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="l04001"></a><span class="lineno"> 4001</span>&#160;                     <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="l04004"></a><span class="lineno"> 4004</span>&#160;        <span class="comment">/* Add new things just above here ---^</span></div><div class="line"><a name="l04005"></a><span class="lineno"> 4005</span>&#160;<span class="comment">         * This is part of the ABI, don&#39;t needlessly break compatibility */</span></div><div class="line"><a name="l04006"></a><span class="lineno"> 4006</span>&#160;};</div><div class="line"><a name="l04007"></a><span class="lineno"> 4007</span>&#160;</div><div class="line"><a name="l04013"></a><span class="lineno"> 4013</span>&#160;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="l04014"></a><span class="lineno"> 4014</span>&#160;<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="l04015"></a><span class="lineno"> 4015</span>&#160;</div><div class="line"><a name="l04024"></a><span class="lineno"> 4024</span>&#160;<span class="keyword">static</span> LWS_INLINE lws_filefd_type LWS_WARN_UNUSED_RESULT</div><div class="line"><a name="l04025"></a><span class="lineno"> 4025</span>&#160;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="l04026"></a><span class="lineno"> 4026</span>&#160;                   <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> *filelen, <span class="keywordtype">int</span> flags)</div><div class="line"><a name="l04027"></a><span class="lineno"> 4027</span>&#160;{</div><div class="line"><a name="l04028"></a><span class="lineno"> 4028</span>&#160;        <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))-&gt;<a class="code" href="structlws__plat__file__ops.html#ad37a97abc68d0af967cef874f4d8df32">open</a>(wsi, filename,</div><div class="line"><a name="l04029"></a><span class="lineno"> 4029</span>&#160;                                                    filelen, flags);</div><div class="line"><a name="l04030"></a><span class="lineno"> 4030</span>&#160;}</div><div class="line"><a name="l04031"></a><span class="lineno"> 4031</span>&#160;</div><div class="line"><a name="l04038"></a><span class="lineno"> 4038</span>&#160;<span class="keyword">static</span> LWS_INLINE <span class="keywordtype">int</span></div><div class="line"><a name="l04039"></a><span class="lineno"> 4039</span>&#160;lws_plat_file_close(<span class="keyword">struct</span> lws *wsi, lws_filefd_type fd)</div><div class="line"><a name="l04040"></a><span class="lineno"> 4040</span>&#160;{</div><div class="line"><a name="l04041"></a><span class="lineno"> 4041</span>&#160;        <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))-&gt;<a class="code" href="structlws__plat__file__ops.html#a034ec96f2fbaf52b4aa3e82d20795f7b">close</a>(wsi, fd);</div><div class="line"><a name="l04042"></a><span class="lineno"> 4042</span>&#160;}</div><div class="line"><a name="l04043"></a><span class="lineno"> 4043</span>&#160;</div><div class="line"><a name="l04051"></a><span class="lineno"> 4051</span>&#160;<span class="keyword">static</span> LWS_INLINE <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span></div><div class="line"><a name="l04052"></a><span class="lineno"> 4052</span>&#160;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="l04053"></a><span class="lineno"> 4053</span>&#160;{</div><div class="line"><a name="l04054"></a><span class="lineno"> 4054</span>&#160;        <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))-&gt;<a class="code" href="structlws__plat__file__ops.html#abfcda19b003dcc13c61ff9e2bb4ff869">seek_cur</a>(wsi, fd, offset);</div><div class="line"><a name="l04055"></a><span class="lineno"> 4055</span>&#160;}</div><div class="line"><a name="l04065"></a><span class="lineno"> 4065</span>&#160;<span class="keyword">static</span> LWS_INLINE <span class="keywordtype">int</span> LWS_WARN_UNUSED_RESULT</div><div class="line"><a name="l04066"></a><span class="lineno"> 4066</span>&#160;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="l04067"></a><span class="lineno"> 4067</span>&#160;                   <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="l04068"></a><span class="lineno"> 4068</span>&#160;{</div><div class="line"><a name="l04069"></a><span class="lineno"> 4069</span>&#160;        <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))-&gt;<a class="code" href="structlws__plat__file__ops.html#a01f483807a9862736b17ba9ed5110c40">read</a>(wsi, fd, amount, buf,</div><div class="line"><a name="l04070"></a><span class="lineno"> 4070</span>&#160;                                                        len);</div><div class="line"><a name="l04071"></a><span class="lineno"> 4071</span>&#160;}</div><div class="line"><a name="l04081"></a><span class="lineno"> 4081</span>&#160;<span class="keyword">static</span> LWS_INLINE <span class="keywordtype">int</span> LWS_WARN_UNUSED_RESULT</div><div class="line"><a name="l04082"></a><span class="lineno"> 4082</span>&#160;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="l04083"></a><span class="lineno"> 4083</span>&#160;                    <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="l04084"></a><span class="lineno"> 4084</span>&#160;{</div><div class="line"><a name="l04085"></a><span class="lineno"> 4085</span>&#160;        <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))-&gt;<a class="code" href="structlws__plat__file__ops.html#a1fae8330ee94649a3551e31a30809793">write</a>(wsi, fd, amount, buf,</div><div class="line"><a name="l04086"></a><span class="lineno"> 4086</span>&#160;                                                         len);</div><div class="line"><a name="l04087"></a><span class="lineno"> 4087</span>&#160;}</div><div class="line"><a name="l04089"></a><span class="lineno"> 4089</span>&#160;</div><div class="line"><a name="l04121"></a><span class="lineno"> 4121</span>&#160;<span class="preprocessor">#ifdef LWS_WITH_SMTP</span></div><div class="line"><a name="l04122"></a><span class="lineno"> 4122</span>&#160;</div><div class="line"><a name="l04124"></a><span class="lineno"><a class="line" href="group__smtp.html#ga116be79bf44f9dc2a97f46e051fe4dc0"> 4124</a></span>&#160;<span class="keyword">enum</span> <a class="code" href="group__smtp.html#ga116be79bf44f9dc2a97f46e051fe4dc0">lwsgs_smtp_states</a> {</div><div class="line"><a name="l04125"></a><span class="lineno"><a class="line" href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a29e5b0ecf75375b5a643faa3d6222b7c"> 4125</a></span>&#160;        <a class="code" href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a29e5b0ecf75375b5a643faa3d6222b7c">LGSSMTP_IDLE</a>, </div><div class="line"><a name="l04126"></a><span class="lineno"><a class="line" href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0ab89442b7a3ca2b94c3cdcf33756eb933"> 4126</a></span>&#160;        <a class="code" href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0ab89442b7a3ca2b94c3cdcf33756eb933">LGSSMTP_CONNECTING</a>, </div><div class="line"><a name="l04127"></a><span class="lineno"><a class="line" href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0ab61778f70ecac007b334bb14942eb41d"> 4127</a></span>&#160;        <a class="code" href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0ab61778f70ecac007b334bb14942eb41d">LGSSMTP_CONNECTED</a>, </div><div class="line"><a name="l04128"></a><span class="lineno"><a class="line" href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a1dfec948a864205cec875f63cbe0d4ad"> 4128</a></span>&#160;        <a class="code" href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a1dfec948a864205cec875f63cbe0d4ad">LGSSMTP_SENT_HELO</a>, </div><div class="line"><a name="l04129"></a><span class="lineno"><a class="line" href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a929bb4623ff3f585108aba2a1b047fab"> 4129</a></span>&#160;        <a class="code" href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a929bb4623ff3f585108aba2a1b047fab">LGSSMTP_SENT_FROM</a>, </div><div class="line"><a name="l04130"></a><span class="lineno"><a class="line" href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0aae20a0cb95b97a70f6b45d0ed2d5be83"> 4130</a></span>&#160;        <a class="code" href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0aae20a0cb95b97a70f6b45d0ed2d5be83">LGSSMTP_SENT_TO</a>, </div><div class="line"><a name="l04131"></a><span class="lineno"><a class="line" href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a85e3c452950c09a79086bff4b9be5c14"> 4131</a></span>&#160;        <a class="code" href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a85e3c452950c09a79086bff4b9be5c14">LGSSMTP_SENT_DATA</a>, </div><div class="line"><a name="l04132"></a><span class="lineno"><a class="line" href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a38fba41f28d754e38079b31418a86a69"> 4132</a></span>&#160;        <a class="code" href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a38fba41f28d754e38079b31418a86a69">LGSSMTP_SENT_BODY</a>, </div><div class="line"><a name="l04133"></a><span class="lineno"><a class="line" href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a2c2ed16ffc572326e3040684084b21d5"> 4133</a></span>&#160;        <a class="code" href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a2c2ed16ffc572326e3040684084b21d5">LGSSMTP_SENT_QUIT</a>, </div><div class="line"><a name="l04134"></a><span class="lineno"> 4134</span>&#160;};</div><div class="line"><a name="l04135"></a><span class="lineno"> 4135</span>&#160;</div><div class="line"><a name="l04137"></a><span class="lineno"><a class="line" href="structlws__email.html"> 4137</a></span>&#160;<span class="keyword">struct </span><a class="code" href="structlws__email.html">lws_email</a> {</div><div class="line"><a name="l04138"></a><span class="lineno"><a class="line" href="structlws__email.html#add1341456045382c183f4c763bdea6bc"> 4138</a></span>&#160;        <span class="keywordtype">void</span> *<a class="code" href="structlws__email.html#add1341456045382c183f4c763bdea6bc">data</a>;</div><div class="line"><a name="l04140"></a><span class="lineno"><a class="line" href="structlws__email.html#ab5fbf121195a8e67509c78a42cfbe168"> 4140</a></span>&#160;        uv_loop_t *<a class="code" href="structlws__email.html#ab5fbf121195a8e67509c78a42cfbe168">loop</a>;</div><div class="line"><a name="l04143"></a><span class="lineno"><a class="line" href="structlws__email.html#a472ae23fc9fca6599e5c512bc21458d2"> 4143</a></span>&#160;        <span class="keywordtype">char</span> email_smtp_ip[32]; </div><div class="line"><a name="l04144"></a><span class="lineno"><a class="line" href="structlws__email.html#a939e5d7ee0339a16de73bde71ab4d4d9"> 4144</a></span>&#160;        <span class="keywordtype">char</span> email_helo[32];    </div><div class="line"><a name="l04145"></a><span class="lineno"><a class="line" href="structlws__email.html#af7f0ae934347d81071f63a963301f9e2"> 4145</a></span>&#160;        <span class="keywordtype">char</span> email_from[100];   </div><div class="line"><a name="l04146"></a><span class="lineno"><a class="line" href="structlws__email.html#a6453a8b92b3de6d2c2101af3edce685e"> 4146</a></span>&#160;        <span class="keywordtype">char</span> email_to[100];     </div><div class="line"><a name="l04148"></a><span class="lineno"><a class="line" href="structlws__email.html#a7bbc1964889c984b3da723c86a210e05"> 4148</a></span>&#160;        <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="l04151"></a><span class="lineno"> 4151</span>&#160;        <span class="comment">/* Fill all the callbacks before init */</span></div><div class="line"><a name="l04152"></a><span class="lineno"> 4152</span>&#160;</div><div class="line"><a name="l04153"></a><span class="lineno"><a class="line" href="structlws__email.html#ad8dc60353ee246d84dd59ec0591e9719"> 4153</a></span>&#160;        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="l04158"></a><span class="lineno"><a class="line" href="structlws__email.html#a39ef6263d58eb40cca417c8697b227d8"> 4158</a></span>&#160;        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="l04163"></a><span class="lineno"><a class="line" href="structlws__email.html#a2aff78c8e04db243052aa91b4d87e987"> 4163</a></span>&#160;        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="l04169"></a><span class="lineno"> 4169</span>&#160;        <span class="comment">/* private things */</span></div><div class="line"><a name="l04170"></a><span class="lineno"><a class="line" href="structlws__email.html#a77723e2f2b940b1c879ef5e1cd88c2be"> 4170</a></span>&#160;        uv_timer_t <a class="code" href="structlws__email.html#a77723e2f2b940b1c879ef5e1cd88c2be">timeout_email</a>; </div><div class="line"><a name="l04171"></a><span class="lineno"><a class="line" href="structlws__email.html#ac6115d3cbef2e8bac62cc00895bf5fd3"> 4171</a></span>&#160;        <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="l04172"></a><span class="lineno"><a class="line" href="structlws__email.html#a5f53d4c5a1e34b0dcaa8787e2eabb1b3"> 4172</a></span>&#160;        uv_connect_t <a class="code" href="structlws__email.html#a5f53d4c5a1e34b0dcaa8787e2eabb1b3">email_connect_req</a>; </div><div class="line"><a name="l04173"></a><span class="lineno"><a class="line" href="structlws__email.html#a01f31934166dc6d01e8a375012f8ad1e"> 4173</a></span>&#160;        uv_tcp_t <a class="code" href="structlws__email.html#a01f31934166dc6d01e8a375012f8ad1e">email_client</a>; </div><div class="line"><a name="l04174"></a><span class="lineno"><a class="line" href="structlws__email.html#a9747ca85597788c2d118d287df47b7c1"> 4174</a></span>&#160;        time_t <a class="code" href="structlws__email.html#a9747ca85597788c2d118d287df47b7c1">email_connect_started</a>; </div><div class="line"><a name="l04175"></a><span class="lineno"><a class="line" href="structlws__email.html#a8f34ec0643a817be67ef4276aeb7fb82"> 4175</a></span>&#160;        <span class="keywordtype">char</span> <a class="code" href="structlws__email.html#a8f34ec0643a817be67ef4276aeb7fb82">email_buf</a>[256]; </div><div class="line"><a name="l04176"></a><span class="lineno"><a class="line" href="structlws__email.html#a6fff03c5a5d369a2aa3cab0c897b1bed"> 4176</a></span>&#160;        <span class="keywordtype">char</span> *<a class="code" href="structlws__email.html#a6fff03c5a5d369a2aa3cab0c897b1bed">content</a>; </div><div class="line"><a name="l04177"></a><span class="lineno"> 4177</span>&#160;};</div><div class="line"><a name="l04178"></a><span class="lineno"> 4178</span>&#160;</div><div class="line"><a name="l04188"></a><span class="lineno"> 4188</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l04189"></a><span class="lineno"> 4189</span>&#160;<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="l04190"></a><span class="lineno"> 4190</span>&#160;</div><div class="line"><a name="l04199"></a><span class="lineno"> 4199</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">void</span></div><div class="line"><a name="l04200"></a><span class="lineno"> 4200</span>&#160;<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="l04208"></a><span class="lineno"> 4208</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">void</span></div><div class="line"><a name="l04209"></a><span class="lineno"> 4209</span>&#160;<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="l04210"></a><span class="lineno"> 4210</span>&#160;</div><div class="line"><a name="l04211"></a><span class="lineno"> 4211</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l04212"></a><span class="lineno"> 4212</span>&#160;</div><div class="line"><a name="l04213"></a><span class="lineno"> 4213</span>&#160;</div><div class="line"><a name="l04214"></a><span class="lineno"> 4214</span>&#160;<span class="preprocessor">#ifdef __cplusplus</span></div><div class="line"><a name="l04215"></a><span class="lineno"> 4215</span>&#160;}</div><div class="line"><a name="l04216"></a><span class="lineno"> 4216</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l04217"></a><span class="lineno"> 4217</span>&#160;</div><div class="line"><a name="l04218"></a><span class="lineno"> 4218</span>&#160;<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>
+<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>&#160;<span class="comment">/*</span></div><div class="line"><a name="l00002"></a><span class="lineno">    2</span>&#160;<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>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00004"></a><span class="lineno">    4</span>&#160;<span class="comment"> * Copyright (C) 2010-2016 Andy Green &lt;andy@warmcat.com&gt;</span></div><div class="line"><a name="l00005"></a><span class="lineno">    5</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00006"></a><span class="lineno">    6</span>&#160;<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>&#160;<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>&#160;<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>&#160;<span class="comment"> *  version 2.1 of the License.</span></div><div class="line"><a name="l00010"></a><span class="lineno">   10</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00011"></a><span class="lineno">   11</span>&#160;<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>&#160;<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>&#160;<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>&#160;<span class="comment"> *  Lesser General Public License for more details.</span></div><div class="line"><a name="l00015"></a><span class="lineno">   15</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00016"></a><span class="lineno">   16</span>&#160;<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>&#160;<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>&#160;<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>&#160;<span class="comment"> *  MA  02110-1301  USA</span></div><div class="line"><a name="l00020"></a><span class="lineno">   20</span>&#160;<span class="comment"> */</span></div><div class="line"><a name="l00021"></a><span class="lineno">   21</span>&#160;</div><div class="line"><a name="l00024"></a><span class="lineno">   24</span>&#160;<span class="preprocessor">#ifndef LIBWEBSOCKET_H_3060898B846849FF9F88F5DB59B5950C</span></div><div class="line"><a name="l00025"></a><span class="lineno">   25</span>&#160;<span class="preprocessor">#define LIBWEBSOCKET_H_3060898B846849FF9F88F5DB59B5950C</span></div><div class="line"><a name="l00026"></a><span class="lineno">   26</span>&#160;</div><div class="line"><a name="l00027"></a><span class="lineno">   27</span>&#160;<span class="preprocessor">#ifdef __cplusplus</span></div><div class="line"><a name="l00028"></a><span class="lineno">   28</span>&#160;<span class="preprocessor">#include &lt;cstddef&gt;</span></div><div class="line"><a name="l00029"></a><span class="lineno">   29</span>&#160;<span class="preprocessor">#include &lt;cstdarg&gt;</span></div><div class="line"><a name="l00030"></a><span class="lineno">   30</span>&#160;<span class="preprocessor">#ifdef MBED_OPERATORS</span></div><div class="line"><a name="l00031"></a><span class="lineno">   31</span>&#160;<span class="preprocessor">#include &quot;mbed-drivers/mbed.h&quot;</span></div><div class="line"><a name="l00032"></a><span class="lineno">   32</span>&#160;<span class="preprocessor">#include &quot;sal-iface-eth/EthernetInterface.h&quot;</span></div><div class="line"><a name="l00033"></a><span class="lineno">   33</span>&#160;<span class="preprocessor">#include &quot;sockets/TCPListener.h&quot;</span></div><div class="line"><a name="l00034"></a><span class="lineno">   34</span>&#160;<span class="preprocessor">#include &quot;sal-stack-lwip/lwipv4_init.h&quot;</span></div><div class="line"><a name="l00035"></a><span class="lineno">   35</span>&#160;</div><div class="line"><a name="l00036"></a><span class="lineno">   36</span>&#160;<span class="keyword">namespace </span>{</div><div class="line"><a name="l00037"></a><span class="lineno">   37</span>&#160;}</div><div class="line"><a name="l00038"></a><span class="lineno">   38</span>&#160;<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>&#160;</div><div class="line"><a name="l00040"></a><span class="lineno">   40</span>&#160;</div><div class="line"><a name="l00041"></a><span class="lineno">   41</span>&#160;<span class="keyword">struct </span>sockaddr_in;</div><div class="line"><a name="l00042"></a><span class="lineno">   42</span>&#160;<span class="keyword">struct </span>lws;</div><div class="line"><a name="l00043"></a><span class="lineno">   43</span>&#160;</div><div class="line"><a name="l00044"></a><span class="lineno"><a class="line" href="classlws__conn.html">   44</a></span>&#160;<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>&#160;        <span class="keyword">public</span>:</div><div class="line"><a name="l00046"></a><span class="lineno">   46</span>&#160;        <a class="code" href="classlws__conn.html">lws_conn</a>():</div><div class="line"><a name="l00047"></a><span class="lineno">   47</span>&#160;                ts(NULL),</div><div class="line"><a name="l00048"></a><span class="lineno">   48</span>&#160;                wsi(NULL),</div><div class="line"><a name="l00049"></a><span class="lineno">   49</span>&#160;                writeable(1),</div><div class="line"><a name="l00050"></a><span class="lineno">   50</span>&#160;                awaiting_on_writeable(0)</div><div class="line"><a name="l00051"></a><span class="lineno">   51</span>&#160;        {</div><div class="line"><a name="l00052"></a><span class="lineno">   52</span>&#160;        }</div><div class="line"><a name="l00053"></a><span class="lineno">   53</span>&#160;</div><div class="line"><a name="l00054"></a><span class="lineno">   54</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l00055"></a><span class="lineno">   55</span>&#160;        <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>&#160;        <span class="keywordtype">int</span> actual_onRX(Socket *s);</div><div class="line"><a name="l00057"></a><span class="lineno">   57</span>&#160;        <span class="keywordtype">void</span> onRX(Socket *s);</div><div class="line"><a name="l00058"></a><span class="lineno">   58</span>&#160;        <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>&#160;        <span class="keywordtype">void</span> onDisconnect(TCPStream *s);</div><div class="line"><a name="l00060"></a><span class="lineno">   60</span>&#160;        <span class="keywordtype">void</span> onSent(Socket *s, uint16_t len);</div><div class="line"><a name="l00061"></a><span class="lineno">   61</span>&#160;        <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>&#160;</div><div class="line"><a name="l00063"></a><span class="lineno">   63</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l00064"></a><span class="lineno">   64</span>&#160;        TCPStream *ts;</div><div class="line"><a name="l00065"></a><span class="lineno">   65</span>&#160;</div><div class="line"><a name="l00066"></a><span class="lineno">   66</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l00067"></a><span class="lineno">   67</span>&#160;        <span class="keyword">struct </span>lws *wsi;</div><div class="line"><a name="l00068"></a><span class="lineno">   68</span>&#160;        <span class="keywordtype">char</span> writeable;</div><div class="line"><a name="l00069"></a><span class="lineno">   69</span>&#160;        <span class="keywordtype">char</span> awaiting_on_writeable;</div><div class="line"><a name="l00070"></a><span class="lineno">   70</span>&#160;};</div><div class="line"><a name="l00071"></a><span class="lineno">   71</span>&#160;</div><div class="line"><a name="l00072"></a><span class="lineno"><a class="line" href="classlws__conn__listener.html">   72</a></span>&#160;<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>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l00074"></a><span class="lineno">   74</span>&#160;        <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>&#160;                srv(SOCKET_STACK_LWIP_IPV4)</div><div class="line"><a name="l00076"></a><span class="lineno">   76</span>&#160;        {</div><div class="line"><a name="l00077"></a><span class="lineno">   77</span>&#160;                srv.setOnError(TCPStream::ErrorHandler_t(<span class="keyword">this</span>,</div><div class="line"><a name="l00078"></a><span class="lineno">   78</span>&#160;                                &amp;<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>&#160;        }</div><div class="line"><a name="l00080"></a><span class="lineno">   80</span>&#160;</div><div class="line"><a name="l00081"></a><span class="lineno">   81</span>&#160;        <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>&#160;<span class="keyword">protected</span>:</div><div class="line"><a name="l00084"></a><span class="lineno">   84</span>&#160;        <span class="keywordtype">void</span> onRX(Socket *s); </div><div class="line"><a name="l00085"></a><span class="lineno">   85</span>&#160;        <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>&#160;        <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>&#160;        <span class="keywordtype">void</span> onDisconnect(TCPStream *s); </div><div class="line"><a name="l00089"></a><span class="lineno">   89</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l00090"></a><span class="lineno">   90</span>&#160;        TCPListener srv;</div><div class="line"><a name="l00091"></a><span class="lineno">   91</span>&#160;};</div><div class="line"><a name="l00092"></a><span class="lineno">   92</span>&#160;</div><div class="line"><a name="l00093"></a><span class="lineno">   93</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l00094"></a><span class="lineno">   94</span>&#160;</div><div class="line"><a name="l00095"></a><span class="lineno">   95</span>&#160;<span class="keyword">extern</span> <span class="stringliteral">&quot;C&quot;</span> {</div><div class="line"><a name="l00096"></a><span class="lineno">   96</span>&#160;<span class="preprocessor">#else</span></div><div class="line"><a name="l00097"></a><span class="lineno">   97</span>&#160;<span class="preprocessor">#include &lt;stdarg.h&gt;</span></div><div class="line"><a name="l00098"></a><span class="lineno">   98</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l00099"></a><span class="lineno">   99</span>&#160;</div><div class="line"><a name="l00100"></a><span class="lineno">  100</span>&#160;<span class="preprocessor">#if defined(MBED_OPERATORS) || defined(LWS_WITH_ESP8266)</span></div><div class="line"><a name="l00101"></a><span class="lineno">  101</span>&#160;<span class="keyword">struct </span>sockaddr_in;</div><div class="line"><a name="l00102"></a><span class="lineno">  102</span>&#160;<span class="preprocessor">#define LWS_POSIX 0</span></div><div class="line"><a name="l00103"></a><span class="lineno">  103</span>&#160;<span class="preprocessor">#else</span></div><div class="line"><a name="l00104"></a><span class="lineno">  104</span>&#160;<span class="preprocessor">#define LWS_POSIX 1</span></div><div class="line"><a name="l00105"></a><span class="lineno">  105</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l00106"></a><span class="lineno">  106</span>&#160;</div><div class="line"><a name="l00107"></a><span class="lineno">  107</span>&#160;<span class="preprocessor">#include &quot;lws_config.h&quot;</span></div><div class="line"><a name="l00108"></a><span class="lineno">  108</span>&#160;</div><div class="line"><a name="l00109"></a><span class="lineno">  109</span>&#160;<span class="preprocessor">#if defined(WIN32) || defined(_WIN32)</span></div><div class="line"><a name="l00110"></a><span class="lineno">  110</span>&#160;<span class="preprocessor">#ifndef WIN32_LEAN_AND_MEAN</span></div><div class="line"><a name="l00111"></a><span class="lineno">  111</span>&#160;<span class="preprocessor">#define WIN32_LEAN_AND_MEAN</span></div><div class="line"><a name="l00112"></a><span class="lineno">  112</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l00113"></a><span class="lineno">  113</span>&#160;</div><div class="line"><a name="l00114"></a><span class="lineno">  114</span>&#160;<span class="preprocessor">#include &lt;winsock2.h&gt;</span></div><div class="line"><a name="l00115"></a><span class="lineno">  115</span>&#160;<span class="preprocessor">#include &lt;ws2tcpip.h&gt;</span></div><div class="line"><a name="l00116"></a><span class="lineno">  116</span>&#160;<span class="preprocessor">#include &lt;stddef.h&gt;</span></div><div class="line"><a name="l00117"></a><span class="lineno">  117</span>&#160;<span class="preprocessor">#include &lt;basetsd.h&gt;</span></div><div class="line"><a name="l00118"></a><span class="lineno">  118</span>&#160;<span class="preprocessor">#ifndef _WIN32_WCE</span></div><div class="line"><a name="l00119"></a><span class="lineno">  119</span>&#160;<span class="preprocessor">#include &lt;fcntl.h&gt;</span></div><div class="line"><a name="l00120"></a><span class="lineno">  120</span>&#160;<span class="preprocessor">#else</span></div><div class="line"><a name="l00121"></a><span class="lineno">  121</span>&#160;<span class="preprocessor">#define _O_RDONLY       0x0000</span></div><div class="line"><a name="l00122"></a><span class="lineno">  122</span>&#160;<span class="preprocessor">#define O_RDONLY        _O_RDONLY</span></div><div class="line"><a name="l00123"></a><span class="lineno">  123</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l00124"></a><span class="lineno">  124</span>&#160;</div><div class="line"><a name="l00125"></a><span class="lineno">  125</span>&#160;<span class="comment">// Visual studio older than 2015 and WIN_CE has only _stricmp</span></div><div class="line"><a name="l00126"></a><span class="lineno">  126</span>&#160;<span class="preprocessor">#if (defined(_MSC_VER) &amp;&amp; _MSC_VER &lt; 1900) || defined(_WIN32_WCE)</span></div><div class="line"><a name="l00127"></a><span class="lineno">  127</span>&#160;<span class="preprocessor">#define strcasecmp _stricmp</span></div><div class="line"><a name="l00128"></a><span class="lineno">  128</span>&#160;<span class="preprocessor">#elif !defined(__MINGW32__)</span></div><div class="line"><a name="l00129"></a><span class="lineno">  129</span>&#160;<span class="preprocessor">#define strcasecmp stricmp</span></div><div class="line"><a name="l00130"></a><span class="lineno">  130</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l00131"></a><span class="lineno">  131</span>&#160;<span class="preprocessor">#define getdtablesize() 30000</span></div><div class="line"><a name="l00132"></a><span class="lineno">  132</span>&#160;</div><div class="line"><a name="l00133"></a><span class="lineno">  133</span>&#160;<span class="preprocessor">#define LWS_INLINE __inline</span></div><div class="line"><a name="l00134"></a><span class="lineno">  134</span>&#160;<span class="preprocessor">#define LWS_VISIBLE</span></div><div class="line"><a name="l00135"></a><span class="lineno">  135</span>&#160;<span class="preprocessor">#define LWS_WARN_UNUSED_RESULT</span></div><div class="line"><a name="l00136"></a><span class="lineno">  136</span>&#160;<span class="preprocessor">#define LWS_WARN_DEPRECATED</span></div><div class="line"><a name="l00137"></a><span class="lineno">  137</span>&#160;</div><div class="line"><a name="l00138"></a><span class="lineno">  138</span>&#160;<span class="preprocessor">#ifdef LWS_DLL</span></div><div class="line"><a name="l00139"></a><span class="lineno">  139</span>&#160;<span class="preprocessor">#ifdef LWS_INTERNAL</span></div><div class="line"><a name="l00140"></a><span class="lineno">  140</span>&#160;<span class="preprocessor">#define LWS_EXTERN extern __declspec(dllexport)</span></div><div class="line"><a name="l00141"></a><span class="lineno">  141</span>&#160;<span class="preprocessor">#else</span></div><div class="line"><a name="l00142"></a><span class="lineno">  142</span>&#160;<span class="preprocessor">#define LWS_EXTERN extern __declspec(dllimport)</span></div><div class="line"><a name="l00143"></a><span class="lineno">  143</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l00144"></a><span class="lineno">  144</span>&#160;<span class="preprocessor">#else</span></div><div class="line"><a name="l00145"></a><span class="lineno">  145</span>&#160;<span class="preprocessor">#define LWS_EXTERN</span></div><div class="line"><a name="l00146"></a><span class="lineno">  146</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l00147"></a><span class="lineno">  147</span>&#160;</div><div class="line"><a name="l00148"></a><span class="lineno">  148</span>&#160;<span class="preprocessor">#define LWS_INVALID_FILE INVALID_HANDLE_VALUE</span></div><div class="line"><a name="l00149"></a><span class="lineno">  149</span>&#160;<span class="preprocessor">#define LWS_O_RDONLY _O_RDONLY</span></div><div class="line"><a name="l00150"></a><span class="lineno">  150</span>&#160;</div><div class="line"><a name="l00151"></a><span class="lineno">  151</span>&#160;<span class="preprocessor">#if !defined(__MINGW32__) &amp;&amp; (!defined(_MSC_VER) || _MSC_VER &lt; 1900) </span><span class="comment">/* Visual Studio 2015 already defines this in &lt;stdio.h&gt; */</span><span class="preprocessor"></span></div><div class="line"><a name="l00152"></a><span class="lineno">  152</span>&#160;<span class="preprocessor">#define lws_snprintf _snprintf</span></div><div class="line"><a name="l00153"></a><span class="lineno">  153</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l00154"></a><span class="lineno">  154</span>&#160;</div><div class="line"><a name="l00155"></a><span class="lineno">  155</span>&#160;<span class="preprocessor">#ifndef __func__</span></div><div class="line"><a name="l00156"></a><span class="lineno">  156</span>&#160;<span class="preprocessor">#define __func__ __FUNCTION__</span></div><div class="line"><a name="l00157"></a><span class="lineno">  157</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l00158"></a><span class="lineno">  158</span>&#160;</div><div class="line"><a name="l00159"></a><span class="lineno">  159</span>&#160;<span class="preprocessor">#else </span><span class="comment">/* NOT WIN32 */</span><span class="preprocessor"></span></div><div class="line"><a name="l00160"></a><span class="lineno">  160</span>&#160;<span class="preprocessor">#include &lt;unistd.h&gt;</span></div><div class="line"><a name="l00161"></a><span class="lineno">  161</span>&#160;</div><div class="line"><a name="l00162"></a><span class="lineno">  162</span>&#160;<span class="preprocessor">#if defined(__NetBSD__) || defined(__FreeBSD__)</span></div><div class="line"><a name="l00163"></a><span class="lineno">  163</span>&#160;<span class="preprocessor">#include &lt;netinet/in.h&gt;</span></div><div class="line"><a name="l00164"></a><span class="lineno">  164</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l00165"></a><span class="lineno">  165</span>&#160;</div><div class="line"><a name="l00166"></a><span class="lineno">  166</span>&#160;<span class="preprocessor">#define LWS_INLINE inline</span></div><div class="line"><a name="l00167"></a><span class="lineno">  167</span>&#160;<span class="preprocessor">#define LWS_O_RDONLY O_RDONLY</span></div><div class="line"><a name="l00168"></a><span class="lineno">  168</span>&#160;</div><div class="line"><a name="l00169"></a><span class="lineno">  169</span>&#160;<span class="preprocessor">#if !defined(MBED_OPERATORS) &amp;&amp; !defined(LWS_WITH_ESP8266)</span></div><div class="line"><a name="l00170"></a><span class="lineno">  170</span>&#160;<span class="preprocessor">#include &lt;poll.h&gt;</span></div><div class="line"><a name="l00171"></a><span class="lineno">  171</span>&#160;<span class="preprocessor">#include &lt;netdb.h&gt;</span></div><div class="line"><a name="l00172"></a><span class="lineno">  172</span>&#160;<span class="preprocessor">#define LWS_INVALID_FILE -1</span></div><div class="line"><a name="l00173"></a><span class="lineno">  173</span>&#160;<span class="preprocessor">#else</span></div><div class="line"><a name="l00174"></a><span class="lineno">  174</span>&#160;<span class="preprocessor">#define getdtablesize() (20)</span></div><div class="line"><a name="l00175"></a><span class="lineno">  175</span>&#160;<span class="preprocessor">#define LWS_INVALID_FILE NULL</span></div><div class="line"><a name="l00176"></a><span class="lineno">  176</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l00177"></a><span class="lineno">  177</span>&#160;</div><div class="line"><a name="l00178"></a><span class="lineno">  178</span>&#160;<span class="preprocessor">#if defined(__GNUC__)</span></div><div class="line"><a name="l00179"></a><span class="lineno">  179</span>&#160;</div><div class="line"><a name="l00180"></a><span class="lineno">  180</span>&#160;<span class="comment">/* warn_unused_result attribute only supported by GCC 3.4 or later */</span></div><div class="line"><a name="l00181"></a><span class="lineno">  181</span>&#160;<span class="preprocessor">#if __GNUC__ &gt;= 4 || (__GNUC__ == 3 &amp;&amp; __GNUC_MINOR__ &gt;= 4)</span></div><div class="line"><a name="l00182"></a><span class="lineno">  182</span>&#160;<span class="preprocessor">#define LWS_WARN_UNUSED_RESULT __attribute__((warn_unused_result))</span></div><div class="line"><a name="l00183"></a><span class="lineno">  183</span>&#160;<span class="preprocessor">#else</span></div><div class="line"><a name="l00184"></a><span class="lineno">  184</span>&#160;<span class="preprocessor">#define LWS_WARN_UNUSED_RESULT</span></div><div class="line"><a name="l00185"></a><span class="lineno">  185</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l00186"></a><span class="lineno">  186</span>&#160;</div><div class="line"><a name="l00187"></a><span class="lineno">  187</span>&#160;<span class="preprocessor">#define LWS_VISIBLE __attribute__((visibility(&quot;default&quot;)))</span></div><div class="line"><a name="l00188"></a><span class="lineno">  188</span>&#160;<span class="preprocessor">#define LWS_WARN_DEPRECATED __attribute__ ((deprecated))</span></div><div class="line"><a name="l00189"></a><span class="lineno">  189</span>&#160;<span class="preprocessor">#else</span></div><div class="line"><a name="l00190"></a><span class="lineno">  190</span>&#160;<span class="preprocessor">#define LWS_VISIBLE</span></div><div class="line"><a name="l00191"></a><span class="lineno">  191</span>&#160;<span class="preprocessor">#define LWS_WARN_UNUSED_RESULT</span></div><div class="line"><a name="l00192"></a><span class="lineno">  192</span>&#160;<span class="preprocessor">#define LWS_WARN_DEPRECATED</span></div><div class="line"><a name="l00193"></a><span class="lineno">  193</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l00194"></a><span class="lineno">  194</span>&#160;</div><div class="line"><a name="l00195"></a><span class="lineno">  195</span>&#160;<span class="preprocessor">#if defined(__ANDROID__)</span></div><div class="line"><a name="l00196"></a><span class="lineno">  196</span>&#160;<span class="preprocessor">#include &lt;unistd.h&gt;</span></div><div class="line"><a name="l00197"></a><span class="lineno">  197</span>&#160;<span class="preprocessor">#define getdtablesize() sysconf(_SC_OPEN_MAX)</span></div><div class="line"><a name="l00198"></a><span class="lineno">  198</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l00199"></a><span class="lineno">  199</span>&#160;</div><div class="line"><a name="l00200"></a><span class="lineno">  200</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l00201"></a><span class="lineno">  201</span>&#160;</div><div class="line"><a name="l00202"></a><span class="lineno">  202</span>&#160;<span class="preprocessor">#ifdef LWS_USE_LIBEV</span></div><div class="line"><a name="l00203"></a><span class="lineno">  203</span>&#160;<span class="preprocessor">#include &lt;ev.h&gt;</span></div><div class="line"><a name="l00204"></a><span class="lineno">  204</span>&#160;<span class="preprocessor">#endif </span><span class="comment">/* LWS_USE_LIBEV */</span><span class="preprocessor"></span></div><div class="line"><a name="l00205"></a><span class="lineno">  205</span>&#160;<span class="preprocessor">#ifdef LWS_USE_LIBUV</span></div><div class="line"><a name="l00206"></a><span class="lineno">  206</span>&#160;<span class="preprocessor">#include &lt;uv.h&gt;</span></div><div class="line"><a name="l00207"></a><span class="lineno">  207</span>&#160;<span class="preprocessor">#ifdef LWS_HAVE_UV_VERSION_H</span></div><div class="line"><a name="l00208"></a><span class="lineno">  208</span>&#160;<span class="preprocessor">#include &lt;uv-version.h&gt;</span></div><div class="line"><a name="l00209"></a><span class="lineno">  209</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l00210"></a><span class="lineno">  210</span>&#160;<span class="preprocessor">#endif </span><span class="comment">/* LWS_USE_LIBUV */</span><span class="preprocessor"></span></div><div class="line"><a name="l00211"></a><span class="lineno">  211</span>&#160;</div><div class="line"><a name="l00212"></a><span class="lineno">  212</span>&#160;<span class="preprocessor">#ifndef LWS_EXTERN</span></div><div class="line"><a name="l00213"></a><span class="lineno">  213</span>&#160;<span class="preprocessor">#define LWS_EXTERN extern</span></div><div class="line"><a name="l00214"></a><span class="lineno">  214</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l00215"></a><span class="lineno">  215</span>&#160;</div><div class="line"><a name="l00216"></a><span class="lineno">  216</span>&#160;<span class="preprocessor">#ifdef _WIN32</span></div><div class="line"><a name="l00217"></a><span class="lineno">  217</span>&#160;<span class="preprocessor">#define random rand</span></div><div class="line"><a name="l00218"></a><span class="lineno">  218</span>&#160;<span class="preprocessor">#else</span></div><div class="line"><a name="l00219"></a><span class="lineno">  219</span>&#160;<span class="preprocessor">#include &lt;sys/time.h&gt;</span></div><div class="line"><a name="l00220"></a><span class="lineno">  220</span>&#160;<span class="preprocessor">#include &lt;unistd.h&gt;</span></div><div class="line"><a name="l00221"></a><span class="lineno">  221</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l00222"></a><span class="lineno">  222</span>&#160;</div><div class="line"><a name="l00223"></a><span class="lineno">  223</span>&#160;<span class="preprocessor">#ifdef LWS_OPENSSL_SUPPORT</span></div><div class="line"><a name="l00224"></a><span class="lineno">  224</span>&#160;</div><div class="line"><a name="l00225"></a><span class="lineno">  225</span>&#160;<span class="preprocessor">#ifdef USE_WOLFSSL</span></div><div class="line"><a name="l00226"></a><span class="lineno">  226</span>&#160;<span class="preprocessor">#ifdef USE_OLD_CYASSL</span></div><div class="line"><a name="l00227"></a><span class="lineno">  227</span>&#160;<span class="preprocessor">#include &lt;cyassl/openssl/ssl.h&gt;</span></div><div class="line"><a name="l00228"></a><span class="lineno">  228</span>&#160;<span class="preprocessor">#include &lt;cyassl/error-ssl.h&gt;</span></div><div class="line"><a name="l00229"></a><span class="lineno">  229</span>&#160;<span class="preprocessor">#else</span></div><div class="line"><a name="l00230"></a><span class="lineno">  230</span>&#160;<span class="preprocessor">#include &lt;wolfssl/openssl/ssl.h&gt;</span></div><div class="line"><a name="l00231"></a><span class="lineno">  231</span>&#160;<span class="preprocessor">#include &lt;wolfssl/error-ssl.h&gt;</span></div><div class="line"><a name="l00232"></a><span class="lineno">  232</span>&#160;<span class="preprocessor">#endif </span><span class="comment">/* not USE_OLD_CYASSL */</span><span class="preprocessor"></span></div><div class="line"><a name="l00233"></a><span class="lineno">  233</span>&#160;<span class="preprocessor">#else</span></div><div class="line"><a name="l00234"></a><span class="lineno">  234</span>&#160;<span class="preprocessor">#if defined(LWS_USE_POLARSSL)</span></div><div class="line"><a name="l00235"></a><span class="lineno">  235</span>&#160;<span class="preprocessor">#include &lt;polarssl/ssl.h&gt;</span></div><div class="line"><a name="l00236"></a><span class="lineno"><a class="line" href="structlws__polarssl__context.html">  236</a></span>&#160;<span class="keyword">struct </span><a class="code" href="structlws__polarssl__context.html">lws_polarssl_context</a> {</div><div class="line"><a name="l00237"></a><span class="lineno"><a class="line" href="structlws__polarssl__context.html#a1872f2ea24878d807ae20ca8513674af">  237</a></span>&#160;        x509_crt <a class="code" href="structlws__polarssl__context.html#a1872f2ea24878d807ae20ca8513674af">ca</a>; </div><div class="line"><a name="l00238"></a><span class="lineno"><a class="line" href="structlws__polarssl__context.html#ae7e11c9129ff71c7ee71b3b2e320ff27">  238</a></span>&#160;        x509_crt <a class="code" href="structlws__polarssl__context.html#ae7e11c9129ff71c7ee71b3b2e320ff27">certificate</a>; </div><div class="line"><a name="l00239"></a><span class="lineno"><a class="line" href="structlws__polarssl__context.html#a919c33af37aab170f828d954de1fa270">  239</a></span>&#160;        rsa_context <a class="code" href="structlws__polarssl__context.html#a919c33af37aab170f828d954de1fa270">key</a>; </div><div class="line"><a name="l00240"></a><span class="lineno">  240</span>&#160;};</div><div class="line"><a name="l00241"></a><span class="lineno">  241</span>&#160;<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="l00242"></a><span class="lineno">  242</span>&#160;<span class="keyword">typedef</span> ssl_context SSL;</div><div class="line"><a name="l00243"></a><span class="lineno">  243</span>&#160;<span class="preprocessor">#else</span></div><div class="line"><a name="l00244"></a><span class="lineno">  244</span>&#160;<span class="preprocessor">#if defined(LWS_USE_MBEDTLS)</span></div><div class="line"><a name="l00245"></a><span class="lineno">  245</span>&#160;<span class="preprocessor">#include &lt;mbedtls/ssl.h&gt;</span></div><div class="line"><a name="l00246"></a><span class="lineno">  246</span>&#160;<span class="preprocessor">#else</span></div><div class="line"><a name="l00247"></a><span class="lineno">  247</span>&#160;<span class="preprocessor">#include &lt;openssl/ssl.h&gt;</span></div><div class="line"><a name="l00248"></a><span class="lineno">  248</span>&#160;<span class="preprocessor">#include &lt;openssl/err.h&gt;</span></div><div class="line"><a name="l00249"></a><span class="lineno">  249</span>&#160;<span class="preprocessor">#endif </span><span class="comment">/* not USE_MBEDTLS */</span><span class="preprocessor"></span></div><div class="line"><a name="l00250"></a><span class="lineno">  250</span>&#160;<span class="preprocessor">#endif </span><span class="comment">/* not USE_POLARSSL */</span><span class="preprocessor"></span></div><div class="line"><a name="l00251"></a><span class="lineno">  251</span>&#160;<span class="preprocessor">#endif </span><span class="comment">/* not USE_WOLFSSL */</span><span class="preprocessor"></span></div><div class="line"><a name="l00252"></a><span class="lineno">  252</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l00253"></a><span class="lineno">  253</span>&#160;</div><div class="line"><a name="l00254"></a><span class="lineno">  254</span>&#160;</div><div class="line"><a name="l00255"></a><span class="lineno">  255</span>&#160;<span class="preprocessor">#define CONTEXT_PORT_NO_LISTEN -1</span></div><div class="line"><a name="l00256"></a><span class="lineno">  256</span>&#160;</div><div class="line"><a name="l00267"></a><span class="lineno">  267</span>&#160;</div><div class="line"><a name="l00269"></a><span class="lineno">  269</span>&#160;<span class="keyword">enum</span> lws_log_levels {</div><div class="line"><a name="l00270"></a><span class="lineno">  270</span>&#160;        LLL_ERR = 1 &lt;&lt; 0,</div><div class="line"><a name="l00271"></a><span class="lineno">  271</span>&#160;        LLL_WARN = 1 &lt;&lt; 1,</div><div class="line"><a name="l00272"></a><span class="lineno">  272</span>&#160;        LLL_NOTICE = 1 &lt;&lt; 2,</div><div class="line"><a name="l00273"></a><span class="lineno">  273</span>&#160;        LLL_INFO = 1 &lt;&lt; 3,</div><div class="line"><a name="l00274"></a><span class="lineno">  274</span>&#160;        LLL_DEBUG = 1 &lt;&lt; 4,</div><div class="line"><a name="l00275"></a><span class="lineno">  275</span>&#160;        LLL_PARSER = 1 &lt;&lt; 5,</div><div class="line"><a name="l00276"></a><span class="lineno">  276</span>&#160;        LLL_HEADER = 1 &lt;&lt; 6,</div><div class="line"><a name="l00277"></a><span class="lineno">  277</span>&#160;        LLL_EXT = 1 &lt;&lt; 7,</div><div class="line"><a name="l00278"></a><span class="lineno">  278</span>&#160;        LLL_CLIENT = 1 &lt;&lt; 8,</div><div class="line"><a name="l00279"></a><span class="lineno">  279</span>&#160;        LLL_LATENCY = 1 &lt;&lt; 9,</div><div class="line"><a name="l00280"></a><span class="lineno">  280</span>&#160;</div><div class="line"><a name="l00281"></a><span class="lineno">  281</span>&#160;        LLL_COUNT = 10 <span class="comment">/* set to count of valid flags */</span></div><div class="line"><a name="l00282"></a><span class="lineno">  282</span>&#160;};</div><div class="line"><a name="l00283"></a><span class="lineno">  283</span>&#160;</div><div class="line"><a name="l00284"></a><span class="lineno">  284</span>&#160;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="l00285"></a><span class="lineno">  285</span>&#160;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="l00295"></a><span class="lineno">  295</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l00296"></a><span class="lineno">  296</span>&#160;<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="l00297"></a><span class="lineno">  297</span>&#160;</div><div class="line"><a name="l00298"></a><span class="lineno">  298</span>&#160;<span class="preprocessor">#define lwsl_err(...) _lws_log(LLL_ERR, __VA_ARGS__)</span></div><div class="line"><a name="l00299"></a><span class="lineno">  299</span>&#160;</div><div class="line"><a name="l00300"></a><span class="lineno">  300</span>&#160;<span class="preprocessor">#if !defined(LWS_WITH_NO_LOGS)</span></div><div class="line"><a name="l00301"></a><span class="lineno">  301</span>&#160;<span class="comment">/* notice, warn and log are always compiled in */</span></div><div class="line"><a name="l00302"></a><span class="lineno">  302</span>&#160;<span class="preprocessor">#define lwsl_warn(...) _lws_log(LLL_WARN, __VA_ARGS__)</span></div><div class="line"><a name="l00303"></a><span class="lineno">  303</span>&#160;<span class="preprocessor">#define lwsl_notice(...) _lws_log(LLL_NOTICE, __VA_ARGS__)</span></div><div class="line"><a name="l00304"></a><span class="lineno">  304</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l00305"></a><span class="lineno">  305</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l00306"></a><span class="lineno">  306</span>&#160;<span class="comment"> *  weaker logging can be deselected at configure time using --disable-debug</span></div><div class="line"><a name="l00307"></a><span class="lineno">  307</span>&#160;<span class="comment"> *  that gets rid of the overhead of checking while keeping _warn and _err</span></div><div class="line"><a name="l00308"></a><span class="lineno">  308</span>&#160;<span class="comment"> *  active</span></div><div class="line"><a name="l00309"></a><span class="lineno">  309</span>&#160;<span class="comment"> */</span></div><div class="line"><a name="l00310"></a><span class="lineno">  310</span>&#160;</div><div class="line"><a name="l00311"></a><span class="lineno">  311</span>&#160;<span class="preprocessor">#if defined(LWS_WITH_ESP8266)</span></div><div class="line"><a name="l00312"></a><span class="lineno">  312</span>&#160;<span class="preprocessor">#undef _DEBUG</span></div><div class="line"><a name="l00313"></a><span class="lineno">  313</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l00314"></a><span class="lineno">  314</span>&#160;</div><div class="line"><a name="l00315"></a><span class="lineno">  315</span>&#160;<span class="preprocessor">#ifdef _DEBUG</span></div><div class="line"><a name="l00316"></a><span class="lineno">  316</span>&#160;<span class="preprocessor">#if defined(LWS_WITH_NO_LOGS)</span></div><div class="line"><a name="l00317"></a><span class="lineno">  317</span>&#160;<span class="comment">/* notice, warn and log are always compiled in */</span></div><div class="line"><a name="l00318"></a><span class="lineno">  318</span>&#160;<span class="comment">//#define lwsl_err(...) _lws_log(LLL_ERR, __VA_ARGS__)</span></div><div class="line"><a name="l00319"></a><span class="lineno">  319</span>&#160;<span class="preprocessor">#define lwsl_warn(...) _lws_log(LLL_WARN, __VA_ARGS__)</span></div><div class="line"><a name="l00320"></a><span class="lineno">  320</span>&#160;<span class="preprocessor">#define lwsl_notice(...) _lws_log(LLL_NOTICE, __VA_ARGS__)</span></div><div class="line"><a name="l00321"></a><span class="lineno">  321</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l00322"></a><span class="lineno">  322</span>&#160;<span class="preprocessor">#define lwsl_info(...) _lws_log(LLL_INFO, __VA_ARGS__)</span></div><div class="line"><a name="l00323"></a><span class="lineno">  323</span>&#160;<span class="preprocessor">#define lwsl_debug(...) _lws_log(LLL_DEBUG, __VA_ARGS__)</span></div><div class="line"><a name="l00324"></a><span class="lineno">  324</span>&#160;<span class="preprocessor">#define lwsl_parser(...) _lws_log(LLL_PARSER, __VA_ARGS__)</span></div><div class="line"><a name="l00325"></a><span class="lineno">  325</span>&#160;<span class="preprocessor">#define lwsl_header(...)  _lws_log(LLL_HEADER, __VA_ARGS__)</span></div><div class="line"><a name="l00326"></a><span class="lineno">  326</span>&#160;<span class="preprocessor">#define lwsl_ext(...)  _lws_log(LLL_EXT, __VA_ARGS__)</span></div><div class="line"><a name="l00327"></a><span class="lineno">  327</span>&#160;<span class="preprocessor">#define lwsl_client(...) _lws_log(LLL_CLIENT, __VA_ARGS__)</span></div><div class="line"><a name="l00328"></a><span class="lineno">  328</span>&#160;<span class="preprocessor">#define lwsl_latency(...) _lws_log(LLL_LATENCY, __VA_ARGS__)</span></div><div class="line"><a name="l00329"></a><span class="lineno">  329</span>&#160;</div><div class="line"><a name="l00335"></a><span class="lineno">  335</span>&#160;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="l00336"></a><span class="lineno">  336</span>&#160;</div><div class="line"><a name="l00337"></a><span class="lineno">  337</span>&#160;<span class="preprocessor">#else </span><span class="comment">/* no debug */</span><span class="preprocessor"></span></div><div class="line"><a name="l00338"></a><span class="lineno">  338</span>&#160;<span class="preprocessor">#if defined(LWS_WITH_NO_LOGS)</span></div><div class="line"><a name="l00339"></a><span class="lineno">  339</span>&#160;<span class="comment">//#define lwsl_err(...) do {} while(0)</span></div><div class="line"><a name="l00340"></a><span class="lineno">  340</span>&#160;<span class="preprocessor">#define lwsl_warn(...) do {} while(0)</span></div><div class="line"><a name="l00341"></a><span class="lineno">  341</span>&#160;<span class="preprocessor">#define lwsl_notice(...) do {} while(0)</span></div><div class="line"><a name="l00342"></a><span class="lineno">  342</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l00343"></a><span class="lineno">  343</span>&#160;<span class="preprocessor">#define lwsl_info(...) do {} while(0)</span></div><div class="line"><a name="l00344"></a><span class="lineno">  344</span>&#160;<span class="preprocessor">#define lwsl_debug(...) do {} while(0)</span></div><div class="line"><a name="l00345"></a><span class="lineno">  345</span>&#160;<span class="preprocessor">#define lwsl_parser(...) do {} while(0)</span></div><div class="line"><a name="l00346"></a><span class="lineno">  346</span>&#160;<span class="preprocessor">#define lwsl_header(...) do {} while(0)</span></div><div class="line"><a name="l00347"></a><span class="lineno">  347</span>&#160;<span class="preprocessor">#define lwsl_ext(...) do {} while(0)</span></div><div class="line"><a name="l00348"></a><span class="lineno">  348</span>&#160;<span class="preprocessor">#define lwsl_client(...) do {} while(0)</span></div><div class="line"><a name="l00349"></a><span class="lineno">  349</span>&#160;<span class="preprocessor">#define lwsl_latency(...) do {} while(0)</span></div><div class="line"><a name="l00350"></a><span class="lineno">  350</span>&#160;<span class="preprocessor">#define lwsl_hexdump(a, b)</span></div><div class="line"><a name="l00351"></a><span class="lineno">  351</span>&#160;</div><div class="line"><a name="l00352"></a><span class="lineno">  352</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l00353"></a><span class="lineno">  353</span>&#160;</div><div class="line"><a name="l00364"></a><span class="lineno">  364</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">void</span></div><div class="line"><a name="l00365"></a><span class="lineno">  365</span>&#160;<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="l00366"></a><span class="lineno">  366</span>&#160;                  <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="l00367"></a><span class="lineno">  367</span>&#160;</div><div class="line"><a name="l00377"></a><span class="lineno">  377</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">void</span></div><div class="line"><a name="l00378"></a><span class="lineno">  378</span>&#160;<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="l00379"></a><span class="lineno">  379</span>&#160;</div><div class="line"><a name="l00381"></a><span class="lineno">  381</span>&#160;</div><div class="line"><a name="l00382"></a><span class="lineno">  382</span>&#160;</div><div class="line"><a name="l00383"></a><span class="lineno">  383</span>&#160;<span class="preprocessor">#include &lt;stddef.h&gt;</span></div><div class="line"><a name="l00384"></a><span class="lineno">  384</span>&#160;</div><div class="line"><a name="l00385"></a><span class="lineno">  385</span>&#160;<span class="preprocessor">#ifndef lws_container_of</span></div><div class="line"><a name="l00386"></a><span class="lineno">  386</span>&#160;<span class="preprocessor">#define lws_container_of(P,T,M) ((T *)((char *)(P) - offsetof(T, M)))</span></div><div class="line"><a name="l00387"></a><span class="lineno">  387</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l00388"></a><span class="lineno">  388</span>&#160;</div><div class="line"><a name="l00389"></a><span class="lineno">  389</span>&#160;</div><div class="line"><a name="l00390"></a><span class="lineno">  390</span>&#160;<span class="keyword">struct </span>lws;</div><div class="line"><a name="l00391"></a><span class="lineno">  391</span>&#160;<span class="preprocessor">#ifndef ARRAY_SIZE</span></div><div class="line"><a name="l00392"></a><span class="lineno">  392</span>&#160;<span class="preprocessor">#define ARRAY_SIZE(x) (sizeof(x) / sizeof(x[0]))</span></div><div class="line"><a name="l00393"></a><span class="lineno">  393</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l00394"></a><span class="lineno">  394</span>&#160;</div><div class="line"><a name="l00395"></a><span class="lineno">  395</span>&#160;<span class="comment">/* api change list for user code to test against */</span></div><div class="line"><a name="l00396"></a><span class="lineno">  396</span>&#160;</div><div class="line"><a name="l00397"></a><span class="lineno">  397</span>&#160;<span class="preprocessor">#define LWS_FEATURE_SERVE_HTTP_FILE_HAS_OTHER_HEADERS_ARG</span></div><div class="line"><a name="l00398"></a><span class="lineno">  398</span>&#160;</div><div class="line"><a name="l00399"></a><span class="lineno">  399</span>&#160;<span class="comment">/* the struct lws_protocols has the id field present */</span></div><div class="line"><a name="l00400"></a><span class="lineno">  400</span>&#160;<span class="preprocessor">#define LWS_FEATURE_PROTOCOLS_HAS_ID_FIELD</span></div><div class="line"><a name="l00401"></a><span class="lineno">  401</span>&#160;</div><div class="line"><a name="l00402"></a><span class="lineno">  402</span>&#160;<span class="comment">/* you can call lws_get_peer_write_allowance */</span></div><div class="line"><a name="l00403"></a><span class="lineno">  403</span>&#160;<span class="preprocessor">#define LWS_FEATURE_PROTOCOLS_HAS_PEER_WRITE_ALLOWANCE</span></div><div class="line"><a name="l00404"></a><span class="lineno">  404</span>&#160;</div><div class="line"><a name="l00405"></a><span class="lineno">  405</span>&#160;<span class="comment">/* extra parameter introduced in 917f43ab821 */</span></div><div class="line"><a name="l00406"></a><span class="lineno">  406</span>&#160;<span class="preprocessor">#define LWS_FEATURE_SERVE_HTTP_FILE_HAS_OTHER_HEADERS_LEN</span></div><div class="line"><a name="l00407"></a><span class="lineno">  407</span>&#160;</div><div class="line"><a name="l00408"></a><span class="lineno">  408</span>&#160;<span class="comment">/* File operations stuff exists */</span></div><div class="line"><a name="l00409"></a><span class="lineno">  409</span>&#160;<span class="preprocessor">#define LWS_FEATURE_FOPS</span></div><div class="line"><a name="l00410"></a><span class="lineno">  410</span>&#160;</div><div class="line"><a name="l00411"></a><span class="lineno">  411</span>&#160;</div><div class="line"><a name="l00412"></a><span class="lineno">  412</span>&#160;<span class="preprocessor">#if defined(_WIN32)</span></div><div class="line"><a name="l00413"></a><span class="lineno">  413</span>&#160;<span class="keyword">typedef</span> SOCKET lws_sockfd_type;</div><div class="line"><a name="l00414"></a><span class="lineno">  414</span>&#160;<span class="keyword">typedef</span> HANDLE lws_filefd_type;</div><div class="line"><a name="l00415"></a><span class="lineno">  415</span>&#160;<span class="preprocessor">#define lws_sockfd_valid(sfd) (!!sfd)</span></div><div class="line"><a name="l00416"></a><span class="lineno"><a class="line" href="structlws__pollfd.html">  416</a></span>&#160;<span class="keyword">struct </span><a class="code" href="structlws__pollfd.html">lws_pollfd</a> {</div><div class="line"><a name="l00417"></a><span class="lineno"><a class="line" href="structlws__pollfd.html#a714cf5ca90b41926117fdde9fa6542be">  417</a></span>&#160;        lws_sockfd_type <a class="code" href="structlws__pollfd.html#a714cf5ca90b41926117fdde9fa6542be">fd</a>; </div><div class="line"><a name="l00418"></a><span class="lineno"><a class="line" href="structlws__pollfd.html#ac393db6fc7fb6ed8fe7ca20936908ee9">  418</a></span>&#160;        SHORT <a class="code" href="structlws__pollfd.html#ac393db6fc7fb6ed8fe7ca20936908ee9">events</a>; </div><div class="line"><a name="l00419"></a><span class="lineno"><a class="line" href="structlws__pollfd.html#ae7cecfe7511c59d4a3a44f876d030932">  419</a></span>&#160;        SHORT <a class="code" href="structlws__pollfd.html#ae7cecfe7511c59d4a3a44f876d030932">revents</a>; </div><div class="line"><a name="l00420"></a><span class="lineno">  420</span>&#160;};</div><div class="line"><a name="l00421"></a><span class="lineno">  421</span>&#160;<span class="preprocessor">#define LWS_POLLHUP (FD_CLOSE)</span></div><div class="line"><a name="l00422"></a><span class="lineno">  422</span>&#160;<span class="preprocessor">#define LWS_POLLIN (FD_READ | FD_ACCEPT)</span></div><div class="line"><a name="l00423"></a><span class="lineno">  423</span>&#160;<span class="preprocessor">#define LWS_POLLOUT (FD_WRITE)</span></div><div class="line"><a name="l00424"></a><span class="lineno">  424</span>&#160;<span class="preprocessor">#else</span></div><div class="line"><a name="l00425"></a><span class="lineno">  425</span>&#160;</div><div class="line"><a name="l00426"></a><span class="lineno">  426</span>&#160;<span class="preprocessor">#if defined(MBED_OPERATORS)</span></div><div class="line"><a name="l00427"></a><span class="lineno">  427</span>&#160;<span class="comment">/* it&#39;s a class lws_conn * */</span></div><div class="line"><a name="l00428"></a><span class="lineno">  428</span>&#160;<span class="keyword">typedef</span> <span class="keywordtype">void</span> * lws_sockfd_type;</div><div class="line"><a name="l00429"></a><span class="lineno">  429</span>&#160;<span class="keyword">typedef</span> <span class="keywordtype">void</span> * lws_filefd_type;</div><div class="line"><a name="l00430"></a><span class="lineno">  430</span>&#160;<span class="preprocessor">#define lws_sockfd_valid(sfd) (!!sfd)</span></div><div class="line"><a name="l00431"></a><span class="lineno"><a class="line" href="structpollfd.html">  431</a></span>&#160;<span class="keyword">struct </span><a class="code" href="structpollfd.html">pollfd</a> {</div><div class="line"><a name="l00432"></a><span class="lineno"><a class="line" href="structpollfd.html#af084f089bdece61d177f85782d6673d0">  432</a></span>&#160;        lws_sockfd_type <a class="code" href="structpollfd.html#af084f089bdece61d177f85782d6673d0">fd</a>; </div><div class="line"><a name="l00433"></a><span class="lineno"><a class="line" href="structpollfd.html#ac9b2f2c5b1f9a7487eb57e67cd4960ef">  433</a></span>&#160;        <span class="keywordtype">short</span> <a class="code" href="structpollfd.html#ac9b2f2c5b1f9a7487eb57e67cd4960ef">events</a>; </div><div class="line"><a name="l00434"></a><span class="lineno"><a class="line" href="structpollfd.html#aafb457d11cac415faf0e1e2b825118c2">  434</a></span>&#160;        <span class="keywordtype">short</span> <a class="code" href="structpollfd.html#aafb457d11cac415faf0e1e2b825118c2">revents</a>; </div><div class="line"><a name="l00435"></a><span class="lineno">  435</span>&#160;};</div><div class="line"><a name="l00436"></a><span class="lineno">  436</span>&#160;<span class="preprocessor">#define POLLIN          0x0001</span></div><div class="line"><a name="l00437"></a><span class="lineno">  437</span>&#160;<span class="preprocessor">#define POLLPRI         0x0002</span></div><div class="line"><a name="l00438"></a><span class="lineno">  438</span>&#160;<span class="preprocessor">#define POLLOUT         0x0004</span></div><div class="line"><a name="l00439"></a><span class="lineno">  439</span>&#160;<span class="preprocessor">#define POLLERR         0x0008</span></div><div class="line"><a name="l00440"></a><span class="lineno">  440</span>&#160;<span class="preprocessor">#define POLLHUP         0x0010</span></div><div class="line"><a name="l00441"></a><span class="lineno">  441</span>&#160;<span class="preprocessor">#define POLLNVAL        0x0020</span></div><div class="line"><a name="l00442"></a><span class="lineno">  442</span>&#160;</div><div class="line"><a name="l00443"></a><span class="lineno">  443</span>&#160;<span class="keyword">struct </span>lws;</div><div class="line"><a name="l00444"></a><span class="lineno">  444</span>&#160;</div><div class="line"><a name="l00445"></a><span class="lineno">  445</span>&#160;<span class="keywordtype">void</span> * mbed3_create_tcp_stream_socket(<span class="keywordtype">void</span>);</div><div class="line"><a name="l00446"></a><span class="lineno">  446</span>&#160;<span class="keywordtype">void</span> mbed3_delete_tcp_stream_socket(<span class="keywordtype">void</span> *sockfd);</div><div class="line"><a name="l00447"></a><span class="lineno">  447</span>&#160;<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="l00448"></a><span class="lineno">  448</span>&#160;<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="l00449"></a><span class="lineno">  449</span>&#160;<span class="preprocessor">#else</span></div><div class="line"><a name="l00450"></a><span class="lineno">  450</span>&#160;<span class="preprocessor">#if defined(LWS_WITH_ESP8266)</span></div><div class="line"><a name="l00451"></a><span class="lineno">  451</span>&#160;</div><div class="line"><a name="l00452"></a><span class="lineno">  452</span>&#160;<span class="preprocessor">#include &lt;user_interface.h&gt;</span></div><div class="line"><a name="l00453"></a><span class="lineno">  453</span>&#160;<span class="preprocessor">#include &lt;espconn.h&gt;</span></div><div class="line"><a name="l00454"></a><span class="lineno">  454</span>&#160;</div><div class="line"><a name="l00455"></a><span class="lineno">  455</span>&#160;<span class="keyword">typedef</span> <span class="keyword">struct </span>espconn * lws_sockfd_type;</div><div class="line"><a name="l00456"></a><span class="lineno">  456</span>&#160;<span class="keyword">typedef</span> <span class="keywordtype">void</span> * lws_filefd_type;</div><div class="line"><a name="l00457"></a><span class="lineno">  457</span>&#160;<span class="preprocessor">#define lws_sockfd_valid(sfd) (!!sfd)</span></div><div class="line"><a name="l00458"></a><span class="lineno">  458</span>&#160;<span class="keyword">struct </span><a class="code" href="structpollfd.html">pollfd</a> {</div><div class="line"><a name="l00459"></a><span class="lineno">  459</span>&#160;        lws_sockfd_type fd; </div><div class="line"><a name="l00460"></a><span class="lineno">  460</span>&#160;        <span class="keywordtype">short</span> events; </div><div class="line"><a name="l00461"></a><span class="lineno">  461</span>&#160;        <span class="keywordtype">short</span> revents; </div><div class="line"><a name="l00462"></a><span class="lineno">  462</span>&#160;};</div><div class="line"><a name="l00463"></a><span class="lineno">  463</span>&#160;<span class="preprocessor">#define POLLIN          0x0001</span></div><div class="line"><a name="l00464"></a><span class="lineno">  464</span>&#160;<span class="preprocessor">#define POLLPRI         0x0002</span></div><div class="line"><a name="l00465"></a><span class="lineno">  465</span>&#160;<span class="preprocessor">#define POLLOUT         0x0004</span></div><div class="line"><a name="l00466"></a><span class="lineno">  466</span>&#160;<span class="preprocessor">#define POLLERR         0x0008</span></div><div class="line"><a name="l00467"></a><span class="lineno">  467</span>&#160;<span class="preprocessor">#define POLLHUP         0x0010</span></div><div class="line"><a name="l00468"></a><span class="lineno">  468</span>&#160;<span class="preprocessor">#define POLLNVAL        0x0020</span></div><div class="line"><a name="l00469"></a><span class="lineno">  469</span>&#160;</div><div class="line"><a name="l00470"></a><span class="lineno">  470</span>&#160;<span class="keyword">struct </span>lws_vhost;</div><div class="line"><a name="l00471"></a><span class="lineno">  471</span>&#160;</div><div class="line"><a name="l00472"></a><span class="lineno">  472</span>&#160;lws_sockfd_type esp8266_create_tcp_listen_socket(<span class="keyword">struct</span> lws_vhost *vh);</div><div class="line"><a name="l00473"></a><span class="lineno">  473</span>&#160;<span class="keywordtype">void</span> esp8266_tcp_stream_accept(lws_sockfd_type fd, <span class="keyword">struct</span> lws *wsi);</div><div class="line"><a name="l00474"></a><span class="lineno">  474</span>&#160;</div><div class="line"><a name="l00475"></a><span class="lineno">  475</span>&#160;<span class="preprocessor">#include &lt;os_type.h&gt;</span></div><div class="line"><a name="l00476"></a><span class="lineno">  476</span>&#160;<span class="preprocessor">#include &lt;osapi.h&gt;</span></div><div class="line"><a name="l00477"></a><span class="lineno">  477</span>&#160;<span class="preprocessor">#include &quot;ets_sys.h&quot;</span></div><div class="line"><a name="l00478"></a><span class="lineno">  478</span>&#160;</div><div class="line"><a name="l00479"></a><span class="lineno">  479</span>&#160;<span class="keywordtype">int</span> ets_snprintf(<span class="keywordtype">char</span> *str, <span class="keywordtype">size_t</span> size, <span class="keyword">const</span> <span class="keywordtype">char</span> *format, ...);</div><div class="line"><a name="l00480"></a><span class="lineno">  480</span>&#160;<span class="preprocessor">#define snprintf  ets_snprintf</span></div><div class="line"><a name="l00481"></a><span class="lineno">  481</span>&#160;</div><div class="line"><a name="l00482"></a><span class="lineno">  482</span>&#160;<span class="keyword">typedef</span> os_timer_t uv_timer_t;</div><div class="line"><a name="l00483"></a><span class="lineno">  483</span>&#160;<span class="keyword">typedef</span> <span class="keywordtype">void</span> uv_cb_t(uv_timer_t *);</div><div class="line"><a name="l00484"></a><span class="lineno">  484</span>&#160;</div><div class="line"><a name="l00485"></a><span class="lineno">  485</span>&#160;<span class="keywordtype">void</span> os_timer_disarm(<span class="keywordtype">void</span> *);</div><div class="line"><a name="l00486"></a><span class="lineno">  486</span>&#160;<span class="keywordtype">void</span> os_timer_setfn(os_timer_t *, os_timer_func_t *, <span class="keywordtype">void</span> *);</div><div class="line"><a name="l00487"></a><span class="lineno">  487</span>&#160;</div><div class="line"><a name="l00488"></a><span class="lineno">  488</span>&#160;<span class="keywordtype">void</span> ets_timer_arm_new(os_timer_t *, <span class="keywordtype">int</span>, <span class="keywordtype">int</span>, <span class="keywordtype">int</span>);</div><div class="line"><a name="l00489"></a><span class="lineno">  489</span>&#160;</div><div class="line"><a name="l00490"></a><span class="lineno">  490</span>&#160;<span class="comment">//void os_timer_arm(os_timer_t *, int, int);</span></div><div class="line"><a name="l00491"></a><span class="lineno">  491</span>&#160;</div><div class="line"><a name="l00492"></a><span class="lineno">  492</span>&#160;<span class="preprocessor">#define UV_VERSION_MAJOR 1</span></div><div class="line"><a name="l00493"></a><span class="lineno">  493</span>&#160;</div><div class="line"><a name="l00494"></a><span class="lineno">  494</span>&#160;<span class="preprocessor">#define lws_uv_getloop(a, b) (NULL)</span></div><div class="line"><a name="l00495"></a><span class="lineno">  495</span>&#160;</div><div class="line"><a name="l00496"></a><span class="lineno">  496</span>&#160;<span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> uv_timer_init(<span class="keywordtype">void</span> *l, uv_timer_t *t)</div><div class="line"><a name="l00497"></a><span class="lineno">  497</span>&#160;{</div><div class="line"><a name="l00498"></a><span class="lineno">  498</span>&#160;        (void)l;</div><div class="line"><a name="l00499"></a><span class="lineno">  499</span>&#160;        memset(t, 0, <span class="keyword">sizeof</span>(*t));</div><div class="line"><a name="l00500"></a><span class="lineno">  500</span>&#160;        os_timer_disarm(t);</div><div class="line"><a name="l00501"></a><span class="lineno">  501</span>&#160;}</div><div class="line"><a name="l00502"></a><span class="lineno">  502</span>&#160;</div><div class="line"><a name="l00503"></a><span class="lineno">  503</span>&#160;<span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> uv_timer_start(uv_timer_t *t, uv_cb_t *cb, <span class="keywordtype">int</span> first, <span class="keywordtype">int</span> rep)</div><div class="line"><a name="l00504"></a><span class="lineno">  504</span>&#160;{</div><div class="line"><a name="l00505"></a><span class="lineno">  505</span>&#160;        os_timer_setfn(t, (os_timer_func_t *)cb, t);</div><div class="line"><a name="l00506"></a><span class="lineno">  506</span>&#160;        <span class="comment">/* ms, repeat */</span></div><div class="line"><a name="l00507"></a><span class="lineno">  507</span>&#160;        os_timer_arm(t, first, !!rep);</div><div class="line"><a name="l00508"></a><span class="lineno">  508</span>&#160;}</div><div class="line"><a name="l00509"></a><span class="lineno">  509</span>&#160;</div><div class="line"><a name="l00510"></a><span class="lineno">  510</span>&#160;<span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> uv_timer_stop(uv_timer_t *t)</div><div class="line"><a name="l00511"></a><span class="lineno">  511</span>&#160;{</div><div class="line"><a name="l00512"></a><span class="lineno">  512</span>&#160;        os_timer_disarm(t);</div><div class="line"><a name="l00513"></a><span class="lineno">  513</span>&#160;}</div><div class="line"><a name="l00514"></a><span class="lineno">  514</span>&#160;</div><div class="line"><a name="l00515"></a><span class="lineno">  515</span>&#160;<span class="preprocessor">#else</span></div><div class="line"><a name="l00516"></a><span class="lineno">  516</span>&#160;<span class="keyword">typedef</span> <span class="keywordtype">int</span> lws_sockfd_type;</div><div class="line"><a name="l00517"></a><span class="lineno">  517</span>&#160;<span class="keyword">typedef</span> <span class="keywordtype">int</span> lws_filefd_type;</div><div class="line"><a name="l00518"></a><span class="lineno">  518</span>&#160;<span class="preprocessor">#define lws_sockfd_valid(sfd) (sfd &gt;= 0)</span></div><div class="line"><a name="l00519"></a><span class="lineno">  519</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l00520"></a><span class="lineno">  520</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l00521"></a><span class="lineno">  521</span>&#160;</div><div class="line"><a name="l00522"></a><span class="lineno">  522</span>&#160;<span class="preprocessor">#define lws_pollfd pollfd</span></div><div class="line"><a name="l00523"></a><span class="lineno">  523</span>&#160;<span class="preprocessor">#define LWS_POLLHUP (POLLHUP|POLLERR)</span></div><div class="line"><a name="l00524"></a><span class="lineno">  524</span>&#160;<span class="preprocessor">#define LWS_POLLIN (POLLIN)</span></div><div class="line"><a name="l00525"></a><span class="lineno">  525</span>&#160;<span class="preprocessor">#define LWS_POLLOUT (POLLOUT)</span></div><div class="line"><a name="l00526"></a><span class="lineno">  526</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l00527"></a><span class="lineno">  527</span>&#160;</div><div class="line"><a name="l00530"></a><span class="lineno"><a class="line" href="structlws__pollargs.html">  530</a></span>&#160;<span class="keyword">struct </span><a class="code" href="structlws__pollargs.html">lws_pollargs</a> {</div><div class="line"><a name="l00531"></a><span class="lineno"><a class="line" href="structlws__pollargs.html#af14a48ef4e78128aef9a76902b104a81">  531</a></span>&#160;        lws_sockfd_type <a class="code" href="structlws__pollargs.html#af14a48ef4e78128aef9a76902b104a81">fd</a>;     </div><div class="line"><a name="l00532"></a><span class="lineno"><a class="line" href="structlws__pollargs.html#a00bbffea9f55de342783e32d71ce1de6">  532</a></span>&#160;        <span class="keywordtype">int</span> <a class="code" href="structlws__pollargs.html#a00bbffea9f55de342783e32d71ce1de6">events</a>;             </div><div class="line"><a name="l00533"></a><span class="lineno"><a class="line" href="structlws__pollargs.html#a437fec0de5cf264371e1ab5a401e86d8">  533</a></span>&#160;        <span class="keywordtype">int</span> <a class="code" href="structlws__pollargs.html#a437fec0de5cf264371e1ab5a401e86d8">prev_events</a>;        </div><div class="line"><a name="l00534"></a><span class="lineno">  534</span>&#160;};</div><div class="line"><a name="l00535"></a><span class="lineno">  535</span>&#160;</div><div class="line"><a name="l00536"></a><span class="lineno">  536</span>&#160;<span class="keyword">struct </span><a class="code" href="structlws__tokens.html">lws_tokens</a>;</div><div class="line"><a name="l00537"></a><span class="lineno">  537</span>&#160;<span class="keyword">struct </span><a class="code" href="structlws__token__limits.html">lws_token_limits</a>;</div><div class="line"><a name="l00538"></a><span class="lineno">  538</span>&#160;</div><div class="line"><a name="l00546"></a><span class="lineno">  546</span>&#160;</div><div class="line"><a name="l00548"></a><span class="lineno">  548</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l00549"></a><span class="lineno">  549</span>&#160;<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="l00550"></a><span class="lineno">  550</span>&#160;<span class="comment"> * add it at where specified so existing users are unaffected.</span></div><div class="line"><a name="l00551"></a><span class="lineno">  551</span>&#160;<span class="comment"> */</span></div><div class="line"><a name="l00553"></a><span class="lineno"><a class="line" href="group__wsclose.html#gae399c571df32ba532c0ca67da9284985">  553</a></span>&#160;<span class="keyword">enum</span> <a class="code" href="group__wsclose.html#gae399c571df32ba532c0ca67da9284985">lws_close_status</a> {</div><div class="line"><a name="l00554"></a><span class="lineno">  554</span>&#160;        LWS_CLOSE_STATUS_NOSTATUS                               =    0,</div><div class="line"><a name="l00555"></a><span class="lineno"><a class="line" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a3ffa38d5081b85fb739e02a747ccf2c4">  555</a></span>&#160;        <a class="code" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a3ffa38d5081b85fb739e02a747ccf2c4">LWS_CLOSE_STATUS_NORMAL</a>                                 = 1000,</div><div class="line"><a name="l00558"></a><span class="lineno"><a class="line" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a9737a68759e739856b150ff9dfa30218">  558</a></span>&#160;        <a class="code" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a9737a68759e739856b150ff9dfa30218">LWS_CLOSE_STATUS_GOINGAWAY</a>                              = 1001,</div><div class="line"><a name="l00561"></a><span class="lineno"><a class="line" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a1bb501d212fa4d57053db681b1dfab98">  561</a></span>&#160;        <a class="code" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a1bb501d212fa4d57053db681b1dfab98">LWS_CLOSE_STATUS_PROTOCOL_ERR</a>                           = 1002,</div><div class="line"><a name="l00564"></a><span class="lineno"><a class="line" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a462c99b05459df700919cfd3f53c8276">  564</a></span>&#160;        <a class="code" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a462c99b05459df700919cfd3f53c8276">LWS_CLOSE_STATUS_UNACCEPTABLE_OPCODE</a>                    = 1003,</div><div class="line"><a name="l00569"></a><span class="lineno"><a class="line" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985af90cb98d983ad3d4c79df9b6f3d4a4d2">  569</a></span>&#160;        <a class="code" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985af90cb98d983ad3d4c79df9b6f3d4a4d2">LWS_CLOSE_STATUS_RESERVED</a>                               = 1004,</div><div class="line"><a name="l00571"></a><span class="lineno"><a class="line" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a4b8a3b7ce6f731e5248e4b0fb64a5044">  571</a></span>&#160;        <a class="code" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a4b8a3b7ce6f731e5248e4b0fb64a5044">LWS_CLOSE_STATUS_NO_STATUS</a>                              = 1005,</div><div class="line"><a name="l00576"></a><span class="lineno"><a class="line" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a68b3d34bebd88547dcfa5cadba0acd6c">  576</a></span>&#160;        <a class="code" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a68b3d34bebd88547dcfa5cadba0acd6c">LWS_CLOSE_STATUS_ABNORMAL_CLOSE</a>                         = 1006,</div><div class="line"><a name="l00582"></a><span class="lineno"><a class="line" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a7aef2da0062da606eeb35aaca5cf9050">  582</a></span>&#160;        <a class="code" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a7aef2da0062da606eeb35aaca5cf9050">LWS_CLOSE_STATUS_INVALID_PAYLOAD</a>                        = 1007,</div><div class="line"><a name="l00587"></a><span class="lineno"><a class="line" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985ad09e68295eabdddcba4e332fbea70ae5">  587</a></span>&#160;        <a class="code" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985ad09e68295eabdddcba4e332fbea70ae5">LWS_CLOSE_STATUS_POLICY_VIOLATION</a>                       = 1008,</div><div class="line"><a name="l00593"></a><span class="lineno"><a class="line" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a2e1f0113494a58e762eed3d22e7080d8">  593</a></span>&#160;        <a class="code" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a2e1f0113494a58e762eed3d22e7080d8">LWS_CLOSE_STATUS_MESSAGE_TOO_LARGE</a>                      = 1009,</div><div class="line"><a name="l00597"></a><span class="lineno"><a class="line" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985ac6a161822783ee873be1c66f48d14e0e">  597</a></span>&#160;        <a class="code" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985ac6a161822783ee873be1c66f48d14e0e">LWS_CLOSE_STATUS_EXTENSION_REQUIRED</a>                     = 1010,</div><div class="line"><a name="l00605"></a><span class="lineno"><a class="line" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985ad0869604d79e13700ae5d196a431b350">  605</a></span>&#160;        <a class="code" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985ad0869604d79e13700ae5d196a431b350">LWS_CLOSE_STATUS_UNEXPECTED_CONDITION</a>                   = 1011,</div><div class="line"><a name="l00609"></a><span class="lineno"><a class="line" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985ad2b477a91c8445bf34ecd43977f9b390">  609</a></span>&#160;        <a class="code" href="group__wsclose.html#ggae399c571df32ba532c0ca67da9284985ad2b477a91c8445bf34ecd43977f9b390">LWS_CLOSE_STATUS_TLS_FAILURE</a>                            = 1015,</div><div class="line"><a name="l00616"></a><span class="lineno">  616</span>&#160;        <span class="comment">/****** add new things just above ---^ ******/</span></div><div class="line"><a name="l00617"></a><span class="lineno">  617</span>&#160;</div><div class="line"><a name="l00618"></a><span class="lineno">  618</span>&#160;        LWS_CLOSE_STATUS_NOSTATUS_CONTEXT_DESTROY               = 9999,</div><div class="line"><a name="l00619"></a><span class="lineno">  619</span>&#160;};</div><div class="line"><a name="l00620"></a><span class="lineno">  620</span>&#160;</div><div class="line"><a name="l00633"></a><span class="lineno">  633</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">void</span></div><div class="line"><a name="l00634"></a><span class="lineno">  634</span>&#160;<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="l00635"></a><span class="lineno">  635</span>&#160;                 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *buf, <span class="keywordtype">size_t</span> len);</div><div class="line"><a name="l00636"></a><span class="lineno">  636</span>&#160;</div><div class="line"><a name="l00638"></a><span class="lineno">  638</span>&#160;</div><div class="line"><a name="l00639"></a><span class="lineno">  639</span>&#160;<span class="keyword">struct </span>lws;</div><div class="line"><a name="l00640"></a><span class="lineno">  640</span>&#160;<span class="keyword">struct </span>lws_context;</div><div class="line"><a name="l00641"></a><span class="lineno">  641</span>&#160;<span class="comment">/* needed even with extensions disabled for create context */</span></div><div class="line"><a name="l00642"></a><span class="lineno">  642</span>&#160;<span class="keyword">struct </span><a class="code" href="structlws__extension.html">lws_extension</a>;</div><div class="line"><a name="l00643"></a><span class="lineno">  643</span>&#160;</div><div class="line"><a name="l00655"></a><span class="lineno">  655</span>&#160;</div><div class="line"><a name="l00657"></a><span class="lineno">  657</span>&#160;</div><div class="line"><a name="l00658"></a><span class="lineno">  658</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l00659"></a><span class="lineno">  659</span>&#160;<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="l00660"></a><span class="lineno">  660</span>&#160;<span class="comment"> * add it at where specified so existing users are unaffected.</span></div><div class="line"><a name="l00661"></a><span class="lineno">  661</span>&#160;<span class="comment"> */</span></div><div class="line"><a name="l00663"></a><span class="lineno"><a class="line" href="group__usercb.html#gad62860e19975ba4c4af401c3cdb6abf7">  663</a></span>&#160;<span class="keyword">enum</span> <a class="code" href="group__usercb.html#gad62860e19975ba4c4af401c3cdb6abf7">lws_callback_reasons</a> {</div><div class="line"><a name="l00664"></a><span class="lineno"><a class="line" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a24d39bf1cfc0bad9d92da9ac1717e439">  664</a></span>&#160;        <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a24d39bf1cfc0bad9d92da9ac1717e439">LWS_CALLBACK_ESTABLISHED</a>                                =  0,</div><div class="line"><a name="l00668"></a><span class="lineno"><a class="line" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ad8c6207b0c4e732f3d507f0fb79370e8">  668</a></span>&#160;        <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ad8c6207b0c4e732f3d507f0fb79370e8">LWS_CALLBACK_CLIENT_CONNECTION_ERROR</a>                    =  1,</div><div class="line"><a name="l00712"></a><span class="lineno"><a class="line" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aa536e574a642ff3ab9e12bff7ba2c6a2">  712</a></span>&#160;        <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aa536e574a642ff3ab9e12bff7ba2c6a2">LWS_CALLBACK_CLIENT_FILTER_PRE_ESTABLISH</a>                =  2,</div><div class="line"><a name="l00719"></a><span class="lineno"><a class="line" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a7e12418eec9bce85735e6460176ab604">  719</a></span>&#160;        <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a7e12418eec9bce85735e6460176ab604">LWS_CALLBACK_CLIENT_ESTABLISHED</a>                         =  3,</div><div class="line"><a name="l00722"></a><span class="lineno"><a class="line" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a48a9590e5e18c7920282e094a0bfd9d8">  722</a></span>&#160;        <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a48a9590e5e18c7920282e094a0bfd9d8">LWS_CALLBACK_CLOSED</a>                                     =  4,</div><div class="line"><a name="l00724"></a><span class="lineno"><a class="line" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a838b18d255c1b94a533287ba302a2eba">  724</a></span>&#160;        <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a838b18d255c1b94a533287ba302a2eba">LWS_CALLBACK_CLOSED_HTTP</a>                                =  5,</div><div class="line"><a name="l00726"></a><span class="lineno"><a class="line" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a492c1b1c0ac0ed980042ee732fe2990c">  726</a></span>&#160;        <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a492c1b1c0ac0ed980042ee732fe2990c">LWS_CALLBACK_RECEIVE</a>                                    =  6,</div><div class="line"><a name="l00730"></a><span class="lineno"><a class="line" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a2db02fc6e1c17ab62b52109d1aa9d738">  730</a></span>&#160;        <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a2db02fc6e1c17ab62b52109d1aa9d738">LWS_CALLBACK_RECEIVE_PONG</a>                               =  7,</div><div class="line"><a name="l00732"></a><span class="lineno"><a class="line" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7abbbe7a0a67c5866ca9109d46823fc5b1">  732</a></span>&#160;        <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7abbbe7a0a67c5866ca9109d46823fc5b1">LWS_CALLBACK_CLIENT_RECEIVE</a>                             =  8,</div><div class="line"><a name="l00735"></a><span class="lineno"><a class="line" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a136a7cec11c3afd13245623bd84e76c9">  735</a></span>&#160;        <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a136a7cec11c3afd13245623bd84e76c9">LWS_CALLBACK_CLIENT_RECEIVE_PONG</a>                        =  9,</div><div class="line"><a name="l00737"></a><span class="lineno"><a class="line" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a8e8b2e6dbeac76d8d126947d2166a514">  737</a></span>&#160;        <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a8e8b2e6dbeac76d8d126947d2166a514">LWS_CALLBACK_CLIENT_WRITEABLE</a>                           = 10,</div><div class="line"><a name="l00745"></a><span class="lineno"><a class="line" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a7ec8e2e9557ee02a4fc9f7dec7e2babc">  745</a></span>&#160;        <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a7ec8e2e9557ee02a4fc9f7dec7e2babc">LWS_CALLBACK_SERVER_WRITEABLE</a>                           = 11,</div><div class="line"><a name="l00747"></a><span class="lineno"><a class="line" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ae8d1de0bb56e03aa58cb4d44b18edd2e">  747</a></span>&#160;        <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ae8d1de0bb56e03aa58cb4d44b18edd2e">LWS_CALLBACK_HTTP</a>                                       = 12,</div><div class="line"><a name="l00761"></a><span class="lineno"><a class="line" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ac4c68e00efcf1ff7bda7ada462aff8ae">  761</a></span>&#160;        <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ac4c68e00efcf1ff7bda7ada462aff8ae">LWS_CALLBACK_HTTP_BODY</a>                                  = 13,</div><div class="line"><a name="l00764"></a><span class="lineno"><a class="line" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a2fce9a8608220f32abbf1422a5498804">  764</a></span>&#160;        <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a2fce9a8608220f32abbf1422a5498804">LWS_CALLBACK_HTTP_BODY_COMPLETION</a>                       = 14,</div><div class="line"><a name="l00766"></a><span class="lineno"><a class="line" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aa627548e1296e654fcfab463ec3c9587">  766</a></span>&#160;        <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aa627548e1296e654fcfab463ec3c9587">LWS_CALLBACK_HTTP_FILE_COMPLETION</a>                       = 15,</div><div class="line"><a name="l00768"></a><span class="lineno"><a class="line" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7afedadfb3cde37a8ea4c84ed535f26d09">  768</a></span>&#160;        <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7afedadfb3cde37a8ea4c84ed535f26d09">LWS_CALLBACK_HTTP_WRITEABLE</a>                             = 16,</div><div class="line"><a name="l00770"></a><span class="lineno"><a class="line" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a026502768778b8d79d62dd0fe4375fc6">  770</a></span>&#160;        <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a026502768778b8d79d62dd0fe4375fc6">LWS_CALLBACK_FILTER_NETWORK_CONNECTION</a>                  = 17,</div><div class="line"><a name="l00781"></a><span class="lineno"><a class="line" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a75199176c82c1a56e4a6bbf1cc30c12c">  781</a></span>&#160;        <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a75199176c82c1a56e4a6bbf1cc30c12c">LWS_CALLBACK_FILTER_HTTP_CONNECTION</a>                     = 18,</div><div class="line"><a name="l00793"></a><span class="lineno"><a class="line" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ae9734e1d7af2abf291665ce9e4a728d3">  793</a></span>&#160;        <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ae9734e1d7af2abf291665ce9e4a728d3">LWS_CALLBACK_SERVER_NEW_CLIENT_INSTANTIATED</a>             = 19,</div><div class="line"><a name="l00801"></a><span class="lineno"><a class="line" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7accd8753672d319a30b4b4c2fb775e84d">  801</a></span>&#160;        <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7accd8753672d319a30b4b4c2fb775e84d">LWS_CALLBACK_FILTER_PROTOCOL_CONNECTION</a>                 = 20,</div><div class="line"><a name="l00813"></a><span class="lineno"><a class="line" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ae4986291b7a810fe290851d73bebeb1c">  813</a></span>&#160;        <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ae4986291b7a810fe290851d73bebeb1c">LWS_CALLBACK_OPENSSL_LOAD_EXTRA_CLIENT_VERIFY_CERTS</a>     = 21,</div><div class="line"><a name="l00820"></a><span class="lineno"><a class="line" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a06006e98d27e1e884364d88317f83493">  820</a></span>&#160;        <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a06006e98d27e1e884364d88317f83493">LWS_CALLBACK_OPENSSL_LOAD_EXTRA_SERVER_VERIFY_CERTS</a>     = 22,</div><div class="line"><a name="l00826"></a><span class="lineno"><a class="line" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ae5ad65d779b7eab32ab67ceff91a3bac">  826</a></span>&#160;        <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ae5ad65d779b7eab32ab67ceff91a3bac">LWS_CALLBACK_OPENSSL_PERFORM_CLIENT_CERT_VERIFICATION</a>   = 23,</div><div class="line"><a name="l00844"></a><span class="lineno"><a class="line" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a909cc2a7018864b0b71abacc4058fd8f">  844</a></span>&#160;        <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a909cc2a7018864b0b71abacc4058fd8f">LWS_CALLBACK_CLIENT_APPEND_HANDSHAKE_HEADER</a>             = 24,</div><div class="line"><a name="l00868"></a><span class="lineno"><a class="line" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a390da3639296660a78cc1a5dcb19037e">  868</a></span>&#160;        <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a390da3639296660a78cc1a5dcb19037e">LWS_CALLBACK_CONFIRM_EXTENSION_OKAY</a>                     = 25,</div><div class="line"><a name="l00879"></a><span class="lineno"><a class="line" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a1ce5b22039ca37ee224d00047596ea46">  879</a></span>&#160;        <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a1ce5b22039ca37ee224d00047596ea46">LWS_CALLBACK_CLIENT_CONFIRM_EXTENSION_SUPPORTED</a>         = 26,</div><div class="line"><a name="l00888"></a><span class="lineno"><a class="line" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ad5d34583e3556e153eda91620b48cc49">  888</a></span>&#160;        <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ad5d34583e3556e153eda91620b48cc49">LWS_CALLBACK_PROTOCOL_INIT</a>                              = 27,</div><div class="line"><a name="l00891"></a><span class="lineno"><a class="line" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a54269ca88508e6efd3afdb9d360a9caa">  891</a></span>&#160;        <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a54269ca88508e6efd3afdb9d360a9caa">LWS_CALLBACK_PROTOCOL_DESTROY</a>                           = 28,</div><div class="line"><a name="l00896"></a><span class="lineno"><a class="line" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7afd8fd77a1cc9405fcb4f26915d7f2d01">  896</a></span>&#160;        <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7afd8fd77a1cc9405fcb4f26915d7f2d01">LWS_CALLBACK_WSI_CREATE</a>                                 = 29,</div><div class="line"><a name="l00898"></a><span class="lineno"><a class="line" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aca834dc035b7f7486f9ce40fde54fe9e">  898</a></span>&#160;        <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aca834dc035b7f7486f9ce40fde54fe9e">LWS_CALLBACK_WSI_DESTROY</a>                                = 30,</div><div class="line"><a name="l00900"></a><span class="lineno"><a class="line" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7adfb41c92e2522712207ef7f2462b5e34">  900</a></span>&#160;        <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7adfb41c92e2522712207ef7f2462b5e34">LWS_CALLBACK_GET_THREAD_ID</a>                              = 31,</div><div class="line"><a name="l00905"></a><span class="lineno">  905</span>&#160;        <span class="comment">/* external poll() management support */</span></div><div class="line"><a name="l00906"></a><span class="lineno"><a class="line" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ab69783a9fbf2ca71ad70706bda77b412">  906</a></span>&#160;        <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ab69783a9fbf2ca71ad70706bda77b412">LWS_CALLBACK_ADD_POLL_FD</a>                                = 32,</div><div class="line"><a name="l00922"></a><span class="lineno"><a class="line" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a1df60f314710236f9b53efbf468da768">  922</a></span>&#160;        <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a1df60f314710236f9b53efbf468da768">LWS_CALLBACK_DEL_POLL_FD</a>                                = 33,</div><div class="line"><a name="l00928"></a><span class="lineno"><a class="line" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aa87d2e82fffa42c3680c7403ef94216e">  928</a></span>&#160;        <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aa87d2e82fffa42c3680c7403ef94216e">LWS_CALLBACK_CHANGE_MODE_POLL_FD</a>                        = 34,</div><div class="line"><a name="l00936"></a><span class="lineno"><a class="line" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a8909732521d379179003d97ab7a05428">  936</a></span>&#160;        <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a8909732521d379179003d97ab7a05428">LWS_CALLBACK_LOCK_POLL</a>                                  = 35,</div><div class="line"><a name="l00948"></a><span class="lineno"><a class="line" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a0e9e3dd667c0c42cdbe1a3d921f4fd79">  948</a></span>&#160;        <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a0e9e3dd667c0c42cdbe1a3d921f4fd79">LWS_CALLBACK_UNLOCK_POLL</a>                                = 36,</div><div class="line"><a name="l00951"></a><span class="lineno"><a class="line" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aa46f705dcf97502e95627ffde614f98b">  951</a></span>&#160;        <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aa46f705dcf97502e95627ffde614f98b">LWS_CALLBACK_OPENSSL_CONTEXT_REQUIRES_PRIVATE_KEY</a>       = 37,</div><div class="line"><a name="l00959"></a><span class="lineno"><a class="line" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ac3fc5bbb55e69f90396526287ee84a51">  959</a></span>&#160;        <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ac3fc5bbb55e69f90396526287ee84a51">LWS_CALLBACK_WS_PEER_INITIATED_CLOSE</a>                    = 38,</div><div class="line"><a name="l00968"></a><span class="lineno">  968</span>&#160;        LWS_CALLBACK_WS_EXT_DEFAULTS                            = 39,</div><div class="line"><a name="l00971"></a><span class="lineno">  971</span>&#160;        LWS_CALLBACK_CGI                                        = 40,</div><div class="line"><a name="l00973"></a><span class="lineno">  973</span>&#160;        LWS_CALLBACK_CGI_TERMINATED                             = 41,</div><div class="line"><a name="l00975"></a><span class="lineno">  975</span>&#160;        LWS_CALLBACK_CGI_STDIN_DATA                             = 42,</div><div class="line"><a name="l00977"></a><span class="lineno">  977</span>&#160;        LWS_CALLBACK_CGI_STDIN_COMPLETED                        = 43,</div><div class="line"><a name="l00979"></a><span class="lineno">  979</span>&#160;        LWS_CALLBACK_ESTABLISHED_CLIENT_HTTP                    = 44,</div><div class="line"><a name="l00981"></a><span class="lineno">  981</span>&#160;        LWS_CALLBACK_CLOSED_CLIENT_HTTP                         = 45,</div><div class="line"><a name="l00983"></a><span class="lineno">  983</span>&#160;        LWS_CALLBACK_RECEIVE_CLIENT_HTTP                        = 46,</div><div class="line"><a name="l00985"></a><span class="lineno">  985</span>&#160;        LWS_CALLBACK_COMPLETED_CLIENT_HTTP                      = 47,</div><div class="line"><a name="l00987"></a><span class="lineno">  987</span>&#160;        LWS_CALLBACK_RECEIVE_CLIENT_HTTP_READ                   = 48,</div><div class="line"><a name="l00989"></a><span class="lineno">  989</span>&#160;        LWS_CALLBACK_HTTP_BIND_PROTOCOL                         = 49,</div><div class="line"><a name="l00991"></a><span class="lineno">  991</span>&#160;        LWS_CALLBACK_HTTP_DROP_PROTOCOL                         = 50,</div><div class="line"><a name="l00993"></a><span class="lineno">  993</span>&#160;        LWS_CALLBACK_CHECK_ACCESS_RIGHTS                        = 51,</div><div class="line"><a name="l00995"></a><span class="lineno">  995</span>&#160;        LWS_CALLBACK_PROCESS_HTML                               = 52,</div><div class="line"><a name="l00997"></a><span class="lineno">  997</span>&#160;        LWS_CALLBACK_ADD_HEADERS                                = 53,</div><div class="line"><a name="l00999"></a><span class="lineno">  999</span>&#160;        LWS_CALLBACK_SESSION_INFO                               = 54,</div><div class="line"><a name="l01002"></a><span class="lineno"> 1002</span>&#160;        LWS_CALLBACK_GS_EVENT                                   = 55,</div><div class="line"><a name="l01004"></a><span class="lineno"><a class="line" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aa5cc921b7697743017a533822a3d556a"> 1004</a></span>&#160;        <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aa5cc921b7697743017a533822a3d556a">LWS_CALLBACK_HTTP_PMO</a>                                   = 56,</div><div class="line"><a name="l01009"></a><span class="lineno"><a class="line" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aeb0cec65ec82a713cd01e9ca9aeeb5e6"> 1009</a></span>&#160;        <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aeb0cec65ec82a713cd01e9ca9aeeb5e6">LWS_CALLBACK_CLIENT_HTTP_WRITEABLE</a>                      = 57,</div><div class="line"><a name="l01019"></a><span class="lineno"> 1019</span>&#160;        <span class="comment">/****** add new things just above ---^ ******/</span></div><div class="line"><a name="l01020"></a><span class="lineno"> 1020</span>&#160;</div><div class="line"><a name="l01021"></a><span class="lineno"><a class="line" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a982579753e70e59a9ea13ce628ac891a"> 1021</a></span>&#160;        <a class="code" href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a982579753e70e59a9ea13ce628ac891a">LWS_CALLBACK_USER</a> = 1000,</div><div class="line"><a name="l01023"></a><span class="lineno"> 1023</span>&#160;};</div><div class="line"><a name="l01024"></a><span class="lineno"> 1024</span>&#160;</div><div class="line"><a name="l01025"></a><span class="lineno"> 1025</span>&#160;</div><div class="line"><a name="l01026"></a><span class="lineno"> 1026</span>&#160;</div><div class="line"><a name="l01042"></a><span class="lineno"> 1042</span>&#160;<span class="keyword">typedef</span> <span class="keywordtype">int</span></div><div class="line"><a name="l01043"></a><span class="lineno"><a class="line" href="group__usercb.html#gad4fcb82e68d60ffacca61a3f783a0a2f"> 1043</a></span>&#160;<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="l01044"></a><span class="lineno"> 1044</span>&#160;                    <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="l01046"></a><span class="lineno"> 1046</span>&#160;</div><div class="line"><a name="l01056"></a><span class="lineno"> 1056</span>&#160;</div><div class="line"><a name="l01058"></a><span class="lineno"> 1058</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l01059"></a><span class="lineno"> 1059</span>&#160;<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="l01060"></a><span class="lineno"> 1060</span>&#160;<span class="comment"> * add it at where specified so existing users are unaffected.</span></div><div class="line"><a name="l01061"></a><span class="lineno"> 1061</span>&#160;<span class="comment"> */</span></div><div class="line"><a name="l01062"></a><span class="lineno"> 1062</span>&#160;<span class="keyword">enum</span> lws_extension_callback_reasons {</div><div class="line"><a name="l01063"></a><span class="lineno"> 1063</span>&#160;        LWS_EXT_CB_SERVER_CONTEXT_CONSTRUCT             =  0,</div><div class="line"><a name="l01064"></a><span class="lineno"> 1064</span>&#160;        LWS_EXT_CB_CLIENT_CONTEXT_CONSTRUCT             =  1,</div><div class="line"><a name="l01065"></a><span class="lineno"> 1065</span>&#160;        LWS_EXT_CB_SERVER_CONTEXT_DESTRUCT              =  2,</div><div class="line"><a name="l01066"></a><span class="lineno"> 1066</span>&#160;        LWS_EXT_CB_CLIENT_CONTEXT_DESTRUCT              =  3,</div><div class="line"><a name="l01067"></a><span class="lineno"> 1067</span>&#160;        LWS_EXT_CB_CONSTRUCT                            =  4,</div><div class="line"><a name="l01068"></a><span class="lineno"> 1068</span>&#160;        LWS_EXT_CB_CLIENT_CONSTRUCT                     =  5,</div><div class="line"><a name="l01069"></a><span class="lineno"> 1069</span>&#160;        LWS_EXT_CB_CHECK_OK_TO_REALLY_CLOSE             =  6,</div><div class="line"><a name="l01070"></a><span class="lineno"> 1070</span>&#160;        LWS_EXT_CB_CHECK_OK_TO_PROPOSE_EXTENSION        =  7,</div><div class="line"><a name="l01071"></a><span class="lineno"> 1071</span>&#160;        LWS_EXT_CB_DESTROY                              =  8,</div><div class="line"><a name="l01072"></a><span class="lineno"> 1072</span>&#160;        LWS_EXT_CB_DESTROY_ANY_WSI_CLOSING              =  9,</div><div class="line"><a name="l01073"></a><span class="lineno"> 1073</span>&#160;        LWS_EXT_CB_ANY_WSI_ESTABLISHED                  = 10,</div><div class="line"><a name="l01074"></a><span class="lineno"> 1074</span>&#160;        LWS_EXT_CB_PACKET_RX_PREPARSE                   = 11,</div><div class="line"><a name="l01075"></a><span class="lineno"> 1075</span>&#160;        LWS_EXT_CB_PACKET_TX_PRESEND                    = 12,</div><div class="line"><a name="l01076"></a><span class="lineno"> 1076</span>&#160;        LWS_EXT_CB_PACKET_TX_DO_SEND                    = 13,</div><div class="line"><a name="l01077"></a><span class="lineno"> 1077</span>&#160;        LWS_EXT_CB_HANDSHAKE_REPLY_TX                   = 14,</div><div class="line"><a name="l01078"></a><span class="lineno"> 1078</span>&#160;        LWS_EXT_CB_FLUSH_PENDING_TX                     = 15,</div><div class="line"><a name="l01079"></a><span class="lineno"> 1079</span>&#160;        LWS_EXT_CB_EXTENDED_PAYLOAD_RX                  = 16,</div><div class="line"><a name="l01080"></a><span class="lineno"> 1080</span>&#160;        LWS_EXT_CB_CAN_PROXY_CLIENT_CONNECTION          = 17,</div><div class="line"><a name="l01081"></a><span class="lineno"> 1081</span>&#160;        LWS_EXT_CB_1HZ                                  = 18,</div><div class="line"><a name="l01082"></a><span class="lineno"> 1082</span>&#160;        LWS_EXT_CB_REQUEST_ON_WRITEABLE                 = 19,</div><div class="line"><a name="l01083"></a><span class="lineno"> 1083</span>&#160;        LWS_EXT_CB_IS_WRITEABLE                         = 20,</div><div class="line"><a name="l01084"></a><span class="lineno"> 1084</span>&#160;        LWS_EXT_CB_PAYLOAD_TX                           = 21,</div><div class="line"><a name="l01085"></a><span class="lineno"> 1085</span>&#160;        LWS_EXT_CB_PAYLOAD_RX                           = 22,</div><div class="line"><a name="l01086"></a><span class="lineno"> 1086</span>&#160;        LWS_EXT_CB_OPTION_DEFAULT                       = 23,</div><div class="line"><a name="l01087"></a><span class="lineno"> 1087</span>&#160;        LWS_EXT_CB_OPTION_SET                           = 24,</div><div class="line"><a name="l01088"></a><span class="lineno"> 1088</span>&#160;        LWS_EXT_CB_OPTION_CONFIRM                       = 25,</div><div class="line"><a name="l01089"></a><span class="lineno"> 1089</span>&#160;        LWS_EXT_CB_NAMED_OPTION_SET                     = 26,</div><div class="line"><a name="l01090"></a><span class="lineno"> 1090</span>&#160;</div><div class="line"><a name="l01091"></a><span class="lineno"> 1091</span>&#160;        <span class="comment">/****** add new things just above ---^ ******/</span></div><div class="line"><a name="l01092"></a><span class="lineno"> 1092</span>&#160;};</div><div class="line"><a name="l01093"></a><span class="lineno"> 1093</span>&#160;</div><div class="line"><a name="l01095"></a><span class="lineno"><a class="line" href="group__extensions.html#gacc9f55936dc165257a2e1f7d47bce89e"> 1095</a></span>&#160;<span class="keyword">enum</span> <a class="code" href="group__extensions.html#gacc9f55936dc165257a2e1f7d47bce89e">lws_ext_options_types</a> {</div><div class="line"><a name="l01096"></a><span class="lineno"><a class="line" href="group__extensions.html#ggacc9f55936dc165257a2e1f7d47bce89eaabcf56c456c1ff6e81dc82586a16f14c"> 1096</a></span>&#160;        <a class="code" href="group__extensions.html#ggacc9f55936dc165257a2e1f7d47bce89eaabcf56c456c1ff6e81dc82586a16f14c">EXTARG_NONE</a>, </div><div class="line"><a name="l01097"></a><span class="lineno"><a class="line" href="group__extensions.html#ggacc9f55936dc165257a2e1f7d47bce89ea1c86adf924c8786a12bee9687094673e"> 1097</a></span>&#160;        <a class="code" href="group__extensions.html#ggacc9f55936dc165257a2e1f7d47bce89ea1c86adf924c8786a12bee9687094673e">EXTARG_DEC</a>,  </div><div class="line"><a name="l01098"></a><span class="lineno"><a class="line" href="group__extensions.html#ggacc9f55936dc165257a2e1f7d47bce89ea5265abe3e1c3f64412f2affe7bffd880"> 1098</a></span>&#160;        <a class="code" href="group__extensions.html#ggacc9f55936dc165257a2e1f7d47bce89ea5265abe3e1c3f64412f2affe7bffd880">EXTARG_OPT_DEC</a> </div><div class="line"><a name="l01100"></a><span class="lineno"> 1100</span>&#160;        <span class="comment">/* Add new things just above here ---^</span></div><div class="line"><a name="l01101"></a><span class="lineno"> 1101</span>&#160;<span class="comment">         * This is part of the ABI, don&#39;t needlessly break compatibility */</span></div><div class="line"><a name="l01102"></a><span class="lineno"> 1102</span>&#160;};</div><div class="line"><a name="l01103"></a><span class="lineno"> 1103</span>&#160;</div><div class="line"><a name="l01108"></a><span class="lineno"><a class="line" href="structlws__ext__options.html"> 1108</a></span>&#160;<span class="keyword">struct </span><a class="code" href="structlws__ext__options.html">lws_ext_options</a> {</div><div class="line"><a name="l01109"></a><span class="lineno"><a class="line" href="structlws__ext__options.html#a1769e4a9805bbdda227821e9578ddc7e"> 1109</a></span>&#160;        <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="l01110"></a><span class="lineno"><a class="line" href="structlws__ext__options.html#a7c4dbd62dbeba63a9d50d2306bd1cc61"> 1110</a></span>&#160;        <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="l01112"></a><span class="lineno"> 1112</span>&#160;        <span class="comment">/* Add new things just above here ---^</span></div><div class="line"><a name="l01113"></a><span class="lineno"> 1113</span>&#160;<span class="comment">         * This is part of the ABI, don&#39;t needlessly break compatibility */</span></div><div class="line"><a name="l01114"></a><span class="lineno"> 1114</span>&#160;};</div><div class="line"><a name="l01115"></a><span class="lineno"> 1115</span>&#160;</div><div class="line"><a name="l01117"></a><span class="lineno"><a class="line" href="structlws__ext__option__arg.html"> 1117</a></span>&#160;<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="l01118"></a><span class="lineno"><a class="line" href="structlws__ext__option__arg.html#a0a320c56b79271b8f059eeaad9423ac9"> 1118</a></span>&#160;        <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="l01119"></a><span class="lineno"><a class="line" href="structlws__ext__option__arg.html#af57fffcfa253dfa8d98681ac1fb1785f"> 1119</a></span>&#160;        <span class="keywordtype">int</span> <a class="code" href="structlws__ext__option__arg.html#af57fffcfa253dfa8d98681ac1fb1785f">option_index</a>; </div><div class="line"><a name="l01120"></a><span class="lineno"><a class="line" href="structlws__ext__option__arg.html#a0b1f7b30c3ceaf5f1bf9d105c24568d1"> 1120</a></span>&#160;        <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="l01121"></a><span class="lineno"><a class="line" href="structlws__ext__option__arg.html#af37f0b6caa7735af51a1ac12b68d5bc5"> 1121</a></span>&#160;        <span class="keywordtype">int</span> <a class="code" href="structlws__ext__option__arg.html#af37f0b6caa7735af51a1ac12b68d5bc5">len</a>; </div><div class="line"><a name="l01122"></a><span class="lineno"> 1122</span>&#160;};</div><div class="line"><a name="l01123"></a><span class="lineno"> 1123</span>&#160;</div><div class="line"><a name="l01184"></a><span class="lineno"> 1184</span>&#160;<span class="keyword">typedef</span> <span class="keywordtype">int</span></div><div class="line"><a name="l01185"></a><span class="lineno"><a class="line" href="group__extensions.html#gaae7169b2cd346b34fa33d0250db2afd0"> 1185</a></span>&#160;<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="l01186"></a><span class="lineno"> 1186</span>&#160;                              <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="l01187"></a><span class="lineno"> 1187</span>&#160;                              <span class="keyword">enum</span> lws_extension_callback_reasons reason,</div><div class="line"><a name="l01188"></a><span class="lineno"> 1188</span>&#160;                              <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="l01189"></a><span class="lineno"> 1189</span>&#160;</div><div class="line"><a name="l01191"></a><span class="lineno"><a class="line" href="structlws__extension.html"> 1191</a></span>&#160;<span class="keyword">struct </span><a class="code" href="structlws__extension.html">lws_extension</a> {</div><div class="line"><a name="l01192"></a><span class="lineno"><a class="line" href="structlws__extension.html#a1e5018c883d85176f5c2152176843f9e"> 1192</a></span>&#160;        <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="l01193"></a><span class="lineno"><a class="line" href="structlws__extension.html#afa21f3b3c8c2c9212a276c52b680c3af"> 1193</a></span>&#160;        <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="l01194"></a><span class="lineno"><a class="line" href="structlws__extension.html#a36b06c213aedb02bf9a402651751855b"> 1194</a></span>&#160;        <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="l01196"></a><span class="lineno"> 1196</span>&#160;        <span class="comment">/* Add new things just above here ---^</span></div><div class="line"><a name="l01197"></a><span class="lineno"> 1197</span>&#160;<span class="comment">         * This is part of the ABI, don&#39;t needlessly break compatibility */</span></div><div class="line"><a name="l01198"></a><span class="lineno"> 1198</span>&#160;};</div><div class="line"><a name="l01199"></a><span class="lineno"> 1199</span>&#160;</div><div class="line"><a name="l01208"></a><span class="lineno"> 1208</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l01209"></a><span class="lineno"> 1209</span>&#160;<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="l01210"></a><span class="lineno"> 1210</span>&#160;                         <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="l01211"></a><span class="lineno"> 1211</span>&#160;</div><div class="line"><a name="l01212"></a><span class="lineno"> 1212</span>&#160;<span class="preprocessor">#ifndef LWS_NO_EXTENSIONS</span></div><div class="line"><a name="l01213"></a><span class="lineno"> 1213</span>&#160;<span class="comment">/* lws_get_internal_extensions() - DEPRECATED</span></div><div class="line"><a name="l01214"></a><span class="lineno"> 1214</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l01215"></a><span class="lineno"> 1215</span>&#160;<span class="comment"> * \Deprecated There is no longer a set internal extensions table.  The table is provided</span></div><div class="line"><a name="l01216"></a><span class="lineno"> 1216</span>&#160;<span class="comment"> * by user code along with application-specific settings.  See the test</span></div><div class="line"><a name="l01217"></a><span class="lineno"> 1217</span>&#160;<span class="comment"> * client and server for how to do.</span></div><div class="line"><a name="l01218"></a><span class="lineno"> 1218</span>&#160;<span class="comment"> */</span></div><div class="line"><a name="l01219"></a><span class="lineno"> 1219</span>&#160;<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="l01220"></a><span class="lineno"> 1220</span>&#160;lws_get_internal_extensions(<span class="keywordtype">void</span>) { <span class="keywordflow">return</span> NULL; }</div><div class="line"><a name="l01221"></a><span class="lineno"> 1221</span>&#160;</div><div class="line"><a name="l01232"></a><span class="lineno"> 1232</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span> LWS_WARN_UNUSED_RESULT</div><div class="line"><a name="l01233"></a><span class="lineno"> 1233</span>&#160;<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="l01234"></a><span class="lineno"> 1234</span>&#160;                       <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="l01235"></a><span class="lineno"> 1235</span>&#160;                       <span class="keyword">const</span> <span class="keywordtype">char</span> *o, <span class="keywordtype">int</span> len);</div><div class="line"><a name="l01236"></a><span class="lineno"> 1236</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l01237"></a><span class="lineno"> 1237</span>&#160;</div><div class="line"><a name="l01250"></a><span class="lineno"> 1250</span>&#160;LWS_EXTERN</div><div class="line"><a name="l01251"></a><span class="lineno"> 1251</span>&#160;<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="l01252"></a><span class="lineno"> 1252</span>&#160;        <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="l01253"></a><span class="lineno"> 1253</span>&#160;        <span class="keyword">struct</span> lws *wsi, <span class="keyword">enum</span> lws_extension_callback_reasons reason,</div><div class="line"><a name="l01254"></a><span class="lineno"> 1254</span>&#160;        <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="l01255"></a><span class="lineno"> 1255</span>&#160;</div><div class="line"><a name="l01256"></a><span class="lineno"> 1256</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l01257"></a><span class="lineno"> 1257</span>&#160;<span class="comment"> * The internal exts are part of the public abi</span></div><div class="line"><a name="l01258"></a><span class="lineno"> 1258</span>&#160;<span class="comment"> * If we add more extensions, publish the callback here  ------v</span></div><div class="line"><a name="l01259"></a><span class="lineno"> 1259</span>&#160;<span class="comment"> */</span></div><div class="line"><a name="l01261"></a><span class="lineno"> 1261</span>&#160;</div><div class="line"><a name="l01277"></a><span class="lineno"> 1277</span>&#160;</div><div class="line"><a name="l01281"></a><span class="lineno"><a class="line" href="structlws__protocols.html"> 1281</a></span>&#160;<span class="keyword">struct </span><a class="code" href="structlws__protocols.html">lws_protocols</a> {</div><div class="line"><a name="l01282"></a><span class="lineno"><a class="line" href="structlws__protocols.html#a0e63edb457a613c3fa4271e0a8f19624"> 1282</a></span>&#160;        <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="l01285"></a><span class="lineno"><a class="line" href="structlws__protocols.html#acabf94c1a9bfe7be0387fbb0e0c56b2d"> 1285</a></span>&#160;        <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="l01289"></a><span class="lineno"><a class="line" href="structlws__protocols.html#a9bbd85f591ffb4259711cb5acbb05bea"> 1289</a></span>&#160;        <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="l01294"></a><span class="lineno"><a class="line" href="structlws__protocols.html#a0d1d4996d81b2f5e125bcec981e461c5"> 1294</a></span>&#160;        <span class="keywordtype">size_t</span> <a class="code" href="structlws__protocols.html#a0d1d4996d81b2f5e125bcec981e461c5">rx_buffer_size</a>;</div><div class="line"><a name="l01303"></a><span class="lineno"><a class="line" href="structlws__protocols.html#a6b632018590c2b1bbe43fbab6d5e6fac"> 1303</a></span>&#160;        <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="l01310"></a><span class="lineno"><a class="line" href="structlws__protocols.html#a3cbd903ad076736ae934a54cae36580e"> 1310</a></span>&#160;        <span class="keywordtype">void</span> *<a class="code" href="structlws__protocols.html#a3cbd903ad076736ae934a54cae36580e">user</a>; </div><div class="line"><a name="l01313"></a><span class="lineno"> 1313</span>&#160;        <span class="comment">/* Add new things just above here ---^</span></div><div class="line"><a name="l01314"></a><span class="lineno"> 1314</span>&#160;<span class="comment">         * This is part of the ABI, don&#39;t needlessly break compatibility */</span></div><div class="line"><a name="l01315"></a><span class="lineno"> 1315</span>&#160;};</div><div class="line"><a name="l01316"></a><span class="lineno"> 1316</span>&#160;</div><div class="line"><a name="l01317"></a><span class="lineno"> 1317</span>&#160;<span class="keyword">struct </span>lws_vhost;</div><div class="line"><a name="l01318"></a><span class="lineno"> 1318</span>&#160;</div><div class="line"><a name="l01327"></a><span class="lineno"> 1327</span>&#160;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="l01328"></a><span class="lineno"> 1328</span>&#160;<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="l01329"></a><span class="lineno"> 1329</span>&#160;</div><div class="line"><a name="l01339"></a><span class="lineno"> 1339</span>&#160;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="l01340"></a><span class="lineno"> 1340</span>&#160;<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="l01341"></a><span class="lineno"> 1341</span>&#160;</div><div class="line"><a name="l01343"></a><span class="lineno"> 1343</span>&#160;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="l01344"></a><span class="lineno"> 1344</span>&#160;<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="l01345"></a><span class="lineno"> 1345</span>&#160;</div><div class="line"><a name="l01356"></a><span class="lineno"> 1356</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">void</span> *</div><div class="line"><a name="l01357"></a><span class="lineno"> 1357</span>&#160;<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="l01358"></a><span class="lineno"> 1358</span>&#160;                            <span class="keywordtype">int</span> size);</div><div class="line"><a name="l01359"></a><span class="lineno"> 1359</span>&#160;</div><div class="line"><a name="l01369"></a><span class="lineno"> 1369</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">void</span> *</div><div class="line"><a name="l01370"></a><span class="lineno"> 1370</span>&#160;<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="l01371"></a><span class="lineno"> 1371</span>&#160;</div><div class="line"><a name="l01380"></a><span class="lineno"> 1380</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l01381"></a><span class="lineno"> 1381</span>&#160;<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="l01382"></a><span class="lineno"> 1382</span>&#160;</div><div class="line"><a name="l01383"></a><span class="lineno"> 1383</span>&#160;<span class="preprocessor">#ifdef LWS_WITH_PLUGINS</span></div><div class="line"><a name="l01384"></a><span class="lineno"> 1384</span>&#160;</div><div class="line"><a name="l01385"></a><span class="lineno"> 1385</span>&#160;<span class="comment">/* PLUGINS implies LIBUV */</span></div><div class="line"><a name="l01386"></a><span class="lineno"> 1386</span>&#160;</div><div class="line"><a name="l01387"></a><span class="lineno"> 1387</span>&#160;<span class="preprocessor">#define LWS_PLUGIN_API_MAGIC 180</span></div><div class="line"><a name="l01388"></a><span class="lineno"> 1388</span>&#160;</div><div class="line"><a name="l01390"></a><span class="lineno"><a class="line" href="structlws__plugin__capability.html"> 1390</a></span>&#160;<span class="keyword">struct </span><a class="code" href="structlws__plugin__capability.html">lws_plugin_capability</a> {</div><div class="line"><a name="l01391"></a><span class="lineno"><a class="line" href="structlws__plugin__capability.html#a523c7cde6f15bba345f56493dcf6b32a"> 1391</a></span>&#160;        <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="l01392"></a><span class="lineno"><a class="line" href="structlws__plugin__capability.html#a6a4d9d01e770f378ddadc77b37522033"> 1392</a></span>&#160;        <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="l01393"></a><span class="lineno"><a class="line" href="structlws__plugin__capability.html#ae38f7cf1246b9ca3af3cbf9d46b7090f"> 1393</a></span>&#160;        <span class="keywordtype">int</span> <a class="code" href="structlws__plugin__capability.html#ae38f7cf1246b9ca3af3cbf9d46b7090f">count_protocols</a>; </div><div class="line"><a name="l01394"></a><span class="lineno"><a class="line" href="structlws__plugin__capability.html#a7936f0eb93d79dea76b903d0f8a5f623"> 1394</a></span>&#160;        <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="l01395"></a><span class="lineno"><a class="line" href="structlws__plugin__capability.html#abcf51db969522fdda9aaf902e65739d3"> 1395</a></span>&#160;        <span class="keywordtype">int</span> <a class="code" href="structlws__plugin__capability.html#abcf51db969522fdda9aaf902e65739d3">count_extensions</a>; </div><div class="line"><a name="l01396"></a><span class="lineno"> 1396</span>&#160;};</div><div class="line"><a name="l01397"></a><span class="lineno"> 1397</span>&#160;</div><div class="line"><a name="l01398"></a><span class="lineno"> 1398</span>&#160;<span class="keyword">typedef</span> int (*lws_plugin_init_func)(<span class="keyword">struct </span>lws_context *,</div><div class="line"><a name="l01399"></a><span class="lineno"> 1399</span>&#160;                                    <span class="keyword">struct </span><a class="code" href="structlws__plugin__capability.html">lws_plugin_capability</a> *);</div><div class="line"><a name="l01400"></a><span class="lineno"> 1400</span>&#160;<span class="keyword">typedef</span> int (*lws_plugin_destroy_func)(<span class="keyword">struct </span>lws_context *);</div><div class="line"><a name="l01401"></a><span class="lineno"> 1401</span>&#160;</div><div class="line"><a name="l01403"></a><span class="lineno"><a class="line" href="structlws__plugin.html"> 1403</a></span>&#160;<span class="keyword">struct </span><a class="code" href="structlws__plugin.html">lws_plugin</a> {</div><div class="line"><a name="l01404"></a><span class="lineno"><a class="line" href="structlws__plugin.html#a65dffd68fd267ce17b988790d1d35f22"> 1404</a></span>&#160;        <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="l01405"></a><span class="lineno"> 1405</span>&#160;<span class="preprocessor">#if (UV_VERSION_MAJOR &gt; 0)</span></div><div class="line"><a name="l01406"></a><span class="lineno"><a class="line" href="structlws__plugin.html#af9e1042dc1de5b9d202c2f5fd1834330"> 1406</a></span>&#160;        uv_lib_t <a class="code" href="structlws__plugin.html#af9e1042dc1de5b9d202c2f5fd1834330">lib</a>; </div><div class="line"><a name="l01407"></a><span class="lineno"> 1407</span>&#160;<span class="preprocessor">#else</span></div><div class="line"><a name="l01408"></a><span class="lineno"><a class="line" href="structlws__plugin.html#a4ef37a43653715b6c69cbf8a7be747f4"> 1408</a></span>&#160;        <span class="keywordtype">void</span> *<a class="code" href="structlws__plugin.html#a4ef37a43653715b6c69cbf8a7be747f4">l</a>; </div><div class="line"><a name="l01409"></a><span class="lineno"> 1409</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l01410"></a><span class="lineno"><a class="line" href="structlws__plugin.html#af4ac8fcb79e10e0c2d960e1804d98105"> 1410</a></span>&#160;        <span class="keywordtype">char</span> <a class="code" href="structlws__plugin.html#af4ac8fcb79e10e0c2d960e1804d98105">name</a>[64]; </div><div class="line"><a name="l01411"></a><span class="lineno"><a class="line" href="structlws__plugin.html#ac7f1fdfe8cf8a21f8ee9720c21934a3f"> 1411</a></span>&#160;        <span class="keyword">struct </span><a class="code" href="structlws__plugin__capability.html">lws_plugin_capability</a> caps; </div><div class="line"><a name="l01412"></a><span class="lineno"> 1412</span>&#160;};</div><div class="line"><a name="l01413"></a><span class="lineno"> 1413</span>&#160;</div><div class="line"><a name="l01414"></a><span class="lineno"> 1414</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l01415"></a><span class="lineno"> 1415</span>&#160;</div><div class="line"><a name="l01417"></a><span class="lineno"> 1417</span>&#160;</div><div class="line"><a name="l01418"></a><span class="lineno"> 1418</span>&#160;</div><div class="line"><a name="l01427"></a><span class="lineno"> 1427</span>&#160;</div><div class="line"><a name="l01429"></a><span class="lineno"> 1429</span>&#160;<span class="preprocessor">#define LWSGS_EMAIL_CONTENT_SIZE 16384</span></div><div class="line"><a name="l01430"></a><span class="lineno"> 1430</span>&#160;</div><div class="line"><a name="l01432"></a><span class="lineno"> 1432</span>&#160;<span class="comment">/* SHA-1 binary and hexified versions */</span></div><div class="line"><a name="l01434"></a><span class="lineno"><a class="line" href="structlwsgw__hash__bin.html#ac92f50d9471058525d110597a4e0de6b"> 1434</a></span>&#160;<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="l01436"></a><span class="lineno"><a class="line" href="structlwsgw__hash.html#a29435f5cf78747d4257695b0f141d164"> 1436</a></span>&#160;<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="l01437"></a><span class="lineno"> 1437</span>&#160;</div><div class="line"><a name="l01439"></a><span class="lineno"><a class="line" href="group__generic-sessions.html#ga7c2dc7bfb4ccb91c5d771f9e9ea237e1"> 1439</a></span>&#160;<span class="keyword">enum</span> <a class="code" href="group__generic-sessions.html#ga7c2dc7bfb4ccb91c5d771f9e9ea237e1">lwsgs_auth_bits</a> {</div><div class="line"><a name="l01440"></a><span class="lineno"><a class="line" href="group__generic-sessions.html#gga7c2dc7bfb4ccb91c5d771f9e9ea237e1a81e63075115dedd150265d81b8f7fa57"> 1440</a></span>&#160;        <a class="code" href="group__generic-sessions.html#gga7c2dc7bfb4ccb91c5d771f9e9ea237e1a81e63075115dedd150265d81b8f7fa57">LWSGS_AUTH_LOGGED_IN</a> = 1, </div><div class="line"><a name="l01441"></a><span class="lineno"><a class="line" href="group__generic-sessions.html#gga7c2dc7bfb4ccb91c5d771f9e9ea237e1a0657a9e846814781b128c397fe4b10bf"> 1441</a></span>&#160;        <a class="code" href="group__generic-sessions.html#gga7c2dc7bfb4ccb91c5d771f9e9ea237e1a0657a9e846814781b128c397fe4b10bf">LWSGS_AUTH_ADMIN</a> = 2,   </div><div class="line"><a name="l01442"></a><span class="lineno"><a class="line" href="group__generic-sessions.html#gga7c2dc7bfb4ccb91c5d771f9e9ea237e1a5a607e4668d20cadada62c4b8007f887"> 1442</a></span>&#160;        <a class="code" href="group__generic-sessions.html#gga7c2dc7bfb4ccb91c5d771f9e9ea237e1a5a607e4668d20cadada62c4b8007f887">LWSGS_AUTH_VERIFIED</a> = 4,  </div><div class="line"><a name="l01443"></a><span class="lineno"><a class="line" href="group__generic-sessions.html#gga7c2dc7bfb4ccb91c5d771f9e9ea237e1a2cd8fb86e3b85c106e7711c03f0ddd0a"> 1443</a></span>&#160;        <a class="code" href="group__generic-sessions.html#gga7c2dc7bfb4ccb91c5d771f9e9ea237e1a2cd8fb86e3b85c106e7711c03f0ddd0a">LWSGS_AUTH_FORGOT_FLOW</a> = 8,     </div><div class="line"><a name="l01444"></a><span class="lineno"> 1444</span>&#160;};</div><div class="line"><a name="l01445"></a><span class="lineno"> 1445</span>&#160;</div><div class="line"><a name="l01447"></a><span class="lineno"><a class="line" href="structlws__session__info.html"> 1447</a></span>&#160;<span class="keyword">struct </span><a class="code" href="structlws__session__info.html">lws_session_info</a> {</div><div class="line"><a name="l01448"></a><span class="lineno"><a class="line" href="structlws__session__info.html#a3d57a70b6e7181d95a8bec429b1a7697"> 1448</a></span>&#160;        <span class="keywordtype">char</span> username[32]; </div><div class="line"><a name="l01449"></a><span class="lineno"><a class="line" href="structlws__session__info.html#a94b813cfc6b0da4b182659de30038ad3"> 1449</a></span>&#160;        <span class="keywordtype">char</span> email[100]; </div><div class="line"><a name="l01450"></a><span class="lineno"><a class="line" href="structlws__session__info.html#a53eed02325e8717a53297391e3e98fac"> 1450</a></span>&#160;        <span class="keywordtype">char</span> ip[72]; </div><div class="line"><a name="l01451"></a><span class="lineno"><a class="line" href="structlws__session__info.html#afb924864b70f40372920688a5c1c895e"> 1451</a></span>&#160;        <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="l01453"></a><span class="lineno"><a class="line" href="structlws__session__info.html#a4353b5dd19400b2b15edfd7cee1e4cd5"> 1453</a></span>&#160;        <span class="keywordtype">char</span> session[42]; </div><div class="line"><a name="l01454"></a><span class="lineno"> 1454</span>&#160;};</div><div class="line"><a name="l01455"></a><span class="lineno"> 1455</span>&#160;</div><div class="line"><a name="l01457"></a><span class="lineno"><a class="line" href="group__generic-sessions.html#gaa93946b3d921072209d5cd8cdfa5332e"> 1457</a></span>&#160;<span class="keyword">enum</span> <a class="code" href="group__generic-sessions.html#gaa93946b3d921072209d5cd8cdfa5332e">lws_gs_event</a> {</div><div class="line"><a name="l01458"></a><span class="lineno"><a class="line" href="group__generic-sessions.html#ggaa93946b3d921072209d5cd8cdfa5332ea596010a165bf13473c5eea3a34cd4308"> 1458</a></span>&#160;        <a class="code" href="group__generic-sessions.html#ggaa93946b3d921072209d5cd8cdfa5332ea596010a165bf13473c5eea3a34cd4308">LWSGSE_CREATED</a>, </div><div class="line"><a name="l01459"></a><span class="lineno"><a class="line" href="group__generic-sessions.html#ggaa93946b3d921072209d5cd8cdfa5332ead908cdc5689c5d22c9d3c8934e94dcde"> 1459</a></span>&#160;        <a class="code" href="group__generic-sessions.html#ggaa93946b3d921072209d5cd8cdfa5332ead908cdc5689c5d22c9d3c8934e94dcde">LWSGSE_DELETED</a>  </div><div class="line"><a name="l01460"></a><span class="lineno"> 1460</span>&#160;};</div><div class="line"><a name="l01461"></a><span class="lineno"> 1461</span>&#160;</div><div class="line"><a name="l01463"></a><span class="lineno"><a class="line" href="structlws__gs__event__args.html"> 1463</a></span>&#160;<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="l01464"></a><span class="lineno"><a class="line" href="structlws__gs__event__args.html#a477274f8ca22ba7411b9285b9dc8dd06"> 1464</a></span>&#160;        <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="l01465"></a><span class="lineno"><a class="line" href="structlws__gs__event__args.html#a2bec693d8a43730d487004a44326178b"> 1465</a></span>&#160;        <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="l01466"></a><span class="lineno"><a class="line" href="structlws__gs__event__args.html#acd17e4f9f91f7f9a8f0fbf0744a3a463"> 1466</a></span>&#160;        <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="l01467"></a><span class="lineno"> 1467</span>&#160;};</div><div class="line"><a name="l01468"></a><span class="lineno"> 1468</span>&#160;</div><div class="line"><a name="l01470"></a><span class="lineno"> 1470</span>&#160;</div><div class="line"><a name="l01471"></a><span class="lineno"> 1471</span>&#160;</div><div class="line"><a name="l01485"></a><span class="lineno"> 1485</span>&#160;</div><div class="line"><a name="l01487"></a><span class="lineno"> 1487</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l01488"></a><span class="lineno"> 1488</span>&#160;<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="l01489"></a><span class="lineno"> 1489</span>&#160;<span class="comment"> * add it at where specified so existing users are unaffected.</span></div><div class="line"><a name="l01490"></a><span class="lineno"> 1490</span>&#160;<span class="comment"> */</span></div><div class="line"><a name="l01491"></a><span class="lineno"> 1491</span>&#160;</div><div class="line"><a name="l01493"></a><span class="lineno"><a class="line" href="group__context-and-vhost.html#ga41c2d763f78cc248df3b9f8645dbd2a5"> 1493</a></span>&#160;<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="l01494"></a><span class="lineno"><a class="line" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a274ed462a1a9239eb6ddf9007f5b7092"> 1494</a></span>&#160;        <a class="code" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a274ed462a1a9239eb6ddf9007f5b7092">LWS_SERVER_OPTION_REQUIRE_VALID_OPENSSL_CLIENT_CERT</a>     = (1 &lt;&lt; 1) |</div><div class="line"><a name="l01495"></a><span class="lineno"> 1495</span>&#160;                                                                  (1 &lt;&lt; 12),</div><div class="line"><a name="l01499"></a><span class="lineno"><a class="line" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a6582c985ee0ceaadc1d277030eae2d7c"> 1499</a></span>&#160;        <a class="code" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a6582c985ee0ceaadc1d277030eae2d7c">LWS_SERVER_OPTION_SKIP_SERVER_CANONICAL_NAME</a>            = (1 &lt;&lt; 2),</div><div class="line"><a name="l01501"></a><span class="lineno"><a class="line" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a1cc4562d05cba52a6dfa0697a65ade0d"> 1501</a></span>&#160;        <a class="code" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a1cc4562d05cba52a6dfa0697a65ade0d">LWS_SERVER_OPTION_ALLOW_NON_SSL_ON_SSL_PORT</a>             = (1 &lt;&lt; 3) |</div><div class="line"><a name="l01502"></a><span class="lineno"> 1502</span>&#160;                                                                  (1 &lt;&lt; 12),</div><div class="line"><a name="l01506"></a><span class="lineno"><a class="line" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a273d9975675130de0c6dc937dde7c8a6"> 1506</a></span>&#160;        <a class="code" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a273d9975675130de0c6dc937dde7c8a6">LWS_SERVER_OPTION_LIBEV</a>                                 = (1 &lt;&lt; 4),</div><div class="line"><a name="l01508"></a><span class="lineno"><a class="line" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a34ab36e68c0d593b6f19b8d5ef1240a9"> 1508</a></span>&#160;        <a class="code" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a34ab36e68c0d593b6f19b8d5ef1240a9">LWS_SERVER_OPTION_DISABLE_IPV6</a>                          = (1 &lt;&lt; 5),</div><div class="line"><a name="l01510"></a><span class="lineno"><a class="line" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a4933347a821e73c3f1e13fb6bfc7ad93"> 1510</a></span>&#160;        <a class="code" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a4933347a821e73c3f1e13fb6bfc7ad93">LWS_SERVER_OPTION_DISABLE_OS_CA_CERTS</a>                   = (1 &lt;&lt; 6),</div><div class="line"><a name="l01513"></a><span class="lineno"><a class="line" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5ac56a8a6590e74a8016d0fae09fb404fc"> 1513</a></span>&#160;        <a class="code" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5ac56a8a6590e74a8016d0fae09fb404fc">LWS_SERVER_OPTION_PEER_CERT_NOT_REQUIRED</a>                = (1 &lt;&lt; 7),</div><div class="line"><a name="l01515"></a><span class="lineno"><a class="line" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5aa0158b4e85420811e6b0f1378c6ded0f"> 1515</a></span>&#160;        <a class="code" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5aa0158b4e85420811e6b0f1378c6ded0f">LWS_SERVER_OPTION_VALIDATE_UTF8</a>                         = (1 &lt;&lt; 8),</div><div class="line"><a name="l01517"></a><span class="lineno"><a class="line" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a1b2f8bde0f62adc7ebe81b2043f34c0c"> 1517</a></span>&#160;        <a class="code" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a1b2f8bde0f62adc7ebe81b2043f34c0c">LWS_SERVER_OPTION_SSL_ECDH</a>                              = (1 &lt;&lt; 9) |</div><div class="line"><a name="l01518"></a><span class="lineno"> 1518</span>&#160;                                                                  (1 &lt;&lt; 12),</div><div class="line"><a name="l01520"></a><span class="lineno"><a class="line" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5aff121db04a10cf8b2c5df9d4f2b89f1e"> 1520</a></span>&#160;        <a class="code" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5aff121db04a10cf8b2c5df9d4f2b89f1e">LWS_SERVER_OPTION_LIBUV</a>                                 = (1 &lt;&lt; 10),</div><div class="line"><a name="l01522"></a><span class="lineno"><a class="line" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a4832187186c4d130c68051214cd42ada"> 1522</a></span>&#160;        <a class="code" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a4832187186c4d130c68051214cd42ada">LWS_SERVER_OPTION_REDIRECT_HTTP_TO_HTTPS</a>                = (1 &lt;&lt; 11) |</div><div class="line"><a name="l01523"></a><span class="lineno"> 1523</span>&#160;                                                                  (1 &lt;&lt; 12),</div><div class="line"><a name="l01526"></a><span class="lineno"><a class="line" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a7fed6a527c8d5e0acac1b4179644583a"> 1526</a></span>&#160;        <a class="code" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a7fed6a527c8d5e0acac1b4179644583a">LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT</a>                    = (1 &lt;&lt; 12),</div><div class="line"><a name="l01528"></a><span class="lineno"><a class="line" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5accc9d0d11d1124a21659586164b0962e"> 1528</a></span>&#160;        <a class="code" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5accc9d0d11d1124a21659586164b0962e">LWS_SERVER_OPTION_EXPLICIT_VHOSTS</a>                       = (1 &lt;&lt; 13),</div><div class="line"><a name="l01531"></a><span class="lineno"><a class="line" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a9637e9001d8c8b2521086bcafbd8a941"> 1531</a></span>&#160;        <a class="code" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a9637e9001d8c8b2521086bcafbd8a941">LWS_SERVER_OPTION_UNIX_SOCK</a>                             = (1 &lt;&lt; 14),</div><div class="line"><a name="l01533"></a><span class="lineno"><a class="line" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5ac962efd35abf6c402f9fb14aa14f5016"> 1533</a></span>&#160;        <a class="code" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5ac962efd35abf6c402f9fb14aa14f5016">LWS_SERVER_OPTION_STS</a>                                   = (1 &lt;&lt; 15),</div><div class="line"><a name="l01536"></a><span class="lineno"><a class="line" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5af62887536e25e053e68741006dba46d8"> 1536</a></span>&#160;        <a class="code" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5af62887536e25e053e68741006dba46d8">LWS_SERVER_OPTION_IPV6_V6ONLY_MODIFY</a>                    = (1 &lt;&lt; 16),</div><div class="line"><a name="l01538"></a><span class="lineno"><a class="line" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5aca5d42820b65eac5618ec3f0bd8a1160"> 1538</a></span>&#160;        <a class="code" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5aca5d42820b65eac5618ec3f0bd8a1160">LWS_SERVER_OPTION_IPV6_V6ONLY_VALUE</a>                     = (1 &lt;&lt; 17),</div><div class="line"><a name="l01540"></a><span class="lineno"><a class="line" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a87a824b2e812f4c3e7f2c4a1ea4f8abd"> 1540</a></span>&#160;        <a class="code" href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a87a824b2e812f4c3e7f2c4a1ea4f8abd">LWS_SERVER_OPTION_UV_NO_SIGSEGV_SIGFPE_SPIN</a>             = (1 &lt;&lt; 18),</div><div class="line"><a name="l01547"></a><span class="lineno"> 1547</span>&#160;        <span class="comment">/****** add new things just above ---^ ******/</span></div><div class="line"><a name="l01548"></a><span class="lineno"> 1548</span>&#160;};</div><div class="line"><a name="l01549"></a><span class="lineno"> 1549</span>&#160;</div><div class="line"><a name="l01550"></a><span class="lineno"> 1550</span>&#160;<span class="preprocessor">#define lws_check_opt(c, f) (((c) &amp; (f)) == (f))</span></div><div class="line"><a name="l01551"></a><span class="lineno"> 1551</span>&#160;</div><div class="line"><a name="l01561"></a><span class="lineno"><a class="line" href="structlws__context__creation__info.html"> 1561</a></span>&#160;<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="l01562"></a><span class="lineno"><a class="line" href="structlws__context__creation__info.html#a424a5ce268d6903e42243be94487ab85"> 1562</a></span>&#160;        <span class="keywordtype">int</span> <a class="code" href="structlws__context__creation__info.html#a424a5ce268d6903e42243be94487ab85">port</a>;</div><div class="line"><a name="l01567"></a><span class="lineno"><a class="line" href="structlws__context__creation__info.html#a75434932bb5df54665ea678eb8ac104a"> 1567</a></span>&#160;        <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="l01574"></a><span class="lineno"><a class="line" href="structlws__context__creation__info.html#abb90ffb3e6d6db2db20f529d61bd9122"> 1574</a></span>&#160;        <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="l01578"></a><span class="lineno"><a class="line" href="structlws__context__creation__info.html#a4a3d1155fc52f5048b481884f6fb947c"> 1578</a></span>&#160;        <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="l01581"></a><span class="lineno"><a class="line" href="structlws__context__creation__info.html#ac8a75b7b259a3c3a5fbb4219a3f06c29"> 1581</a></span>&#160;        <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="l01584"></a><span class="lineno"><a class="line" href="structlws__context__creation__info.html#af3fb447be15c4fcb01d3285a6678ab54"> 1584</a></span>&#160;        <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="l01586"></a><span class="lineno"><a class="line" href="structlws__context__creation__info.html#ac62b0f0e8e402412ba5011d15c244103"> 1586</a></span>&#160;        <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="l01590"></a><span class="lineno"><a class="line" href="structlws__context__creation__info.html#ab9ec8893e0f7843cf5d783d2f350ef14"> 1590</a></span>&#160;        <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="l01596"></a><span class="lineno"><a class="line" href="structlws__context__creation__info.html#a4f8e65c3a059d3b586fafa9ef3282c29"> 1596</a></span>&#160;        <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="l01598"></a><span class="lineno"><a class="line" href="structlws__context__creation__info.html#a3e1516fd7fed26bfa77c0246ed26c2eb"> 1598</a></span>&#160;        <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="l01602"></a><span class="lineno"><a class="line" href="structlws__context__creation__info.html#aef917c0b23976a264d2474901b4f5aa3"> 1602</a></span>&#160;        <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="l01605"></a><span class="lineno"><a class="line" href="structlws__context__creation__info.html#a7b59f2bdc869871e7bde232db94f5ca6"> 1605</a></span>&#160;        <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="l01607"></a><span class="lineno"><a class="line" href="structlws__context__creation__info.html#a9c9d22437de92c197f3cee52912b2c03"> 1607</a></span>&#160;        <span class="keywordtype">int</span> <a class="code" href="structlws__context__creation__info.html#a9c9d22437de92c197f3cee52912b2c03">gid</a>;</div><div class="line"><a name="l01609"></a><span class="lineno"><a class="line" href="structlws__context__creation__info.html#ac105b4180008cb3e672d57beead8382e"> 1609</a></span>&#160;        <span class="keywordtype">int</span> <a class="code" href="structlws__context__creation__info.html#ac105b4180008cb3e672d57beead8382e">uid</a>;</div><div class="line"><a name="l01611"></a><span class="lineno"><a class="line" href="structlws__context__creation__info.html#a9d3b17a25e1fbc772f21eb4959a82724"> 1611</a></span>&#160;        <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="l01613"></a><span class="lineno"><a class="line" href="structlws__context__creation__info.html#a0e9d94cdfb893d777b4a4db81e7b5ac0"> 1613</a></span>&#160;        <span class="keywordtype">void</span> *<a class="code" href="structlws__context__creation__info.html#a0e9d94cdfb893d777b4a4db81e7b5ac0">user</a>;</div><div class="line"><a name="l01616"></a><span class="lineno"><a class="line" href="structlws__context__creation__info.html#ac583ce92b8e1c949cb6fef6bfe713d56"> 1616</a></span>&#160;        <span class="keywordtype">int</span> <a class="code" href="structlws__context__creation__info.html#ac583ce92b8e1c949cb6fef6bfe713d56">ka_time</a>;</div><div class="line"><a name="l01619"></a><span class="lineno"><a class="line" href="structlws__context__creation__info.html#a3baab4285c679fbe027c2504621d7410"> 1619</a></span>&#160;        <span class="keywordtype">int</span> <a class="code" href="structlws__context__creation__info.html#a3baab4285c679fbe027c2504621d7410">ka_probes</a>;</div><div class="line"><a name="l01623"></a><span class="lineno"><a class="line" href="structlws__context__creation__info.html#a381342a398883d6204955ff3c1849ddd"> 1623</a></span>&#160;        <span class="keywordtype">int</span> <a class="code" href="structlws__context__creation__info.html#a381342a398883d6204955ff3c1849ddd">ka_interval</a>;</div><div class="line"><a name="l01626"></a><span class="lineno"> 1626</span>&#160;<span class="preprocessor">#ifdef LWS_OPENSSL_SUPPORT</span></div><div class="line"><a name="l01627"></a><span class="lineno"><a class="line" href="structlws__context__creation__info.html#a1654d41bea6fb2f619b57e6a264b26a4"> 1627</a></span>&#160;        <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="l01632"></a><span class="lineno"> 1632</span>&#160;<span class="preprocessor">#else </span><span class="comment">/* maintain structure layout either way */</span><span class="preprocessor"></span></div><div class="line"><a name="l01633"></a><span class="lineno"><a class="line" href="structlws__context__creation__info.html#a0e790dda6202604f73a03b6149bc12bb"> 1633</a></span>&#160;        <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="l01634"></a><span class="lineno"> 1634</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l01635"></a><span class="lineno"> 1635</span>&#160;</div><div class="line"><a name="l01636"></a><span class="lineno"><a class="line" href="structlws__context__creation__info.html#a0cdfd3c484689ba6f0f2cc91b38ce948"> 1636</a></span>&#160;        <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="l01639"></a><span class="lineno"><a class="line" href="structlws__context__creation__info.html#a0b154e79abc1167ba4ac3539f4af6720"> 1639</a></span>&#160;        <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="l01646"></a><span class="lineno"><a class="line" href="structlws__context__creation__info.html#ae52f3237e144e9ddcab5e2cf91d1e419"> 1646</a></span>&#160;        <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="l01648"></a><span class="lineno"><a class="line" href="structlws__context__creation__info.html#a45e63e24c88289e0c8352377ef4d3646"> 1648</a></span>&#160;        <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="l01652"></a><span class="lineno"><a class="line" href="structlws__context__creation__info.html#a6cfa3d51df2def3349a5cbf0d712822d"> 1652</a></span>&#160;        <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="l01657"></a><span class="lineno"><a class="line" href="structlws__context__creation__info.html#afa5d4e7d9f86b58a1c6fac14f0a5f5f9"> 1657</a></span>&#160;        <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="l01659"></a><span class="lineno"><a class="line" href="structlws__context__creation__info.html#ad50db098a208f045f7811207d2bee4b9"> 1659</a></span>&#160;        <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="l01663"></a><span class="lineno"><a class="line" href="structlws__context__creation__info.html#a8122cfc0810bafe51edb3ba6bf9a1251"> 1663</a></span>&#160;        <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="l01666"></a><span class="lineno"><a class="line" href="structlws__context__creation__info.html#a999866fcd15dbd621773436f97190458"> 1666</a></span>&#160;        <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="l01669"></a><span class="lineno"><a class="line" href="structlws__context__creation__info.html#a81697c6b763b5ef3ee52862bc70b07d6"> 1669</a></span>&#160;        <span class="keywordtype">int</span> <a class="code" href="structlws__context__creation__info.html#a81697c6b763b5ef3ee52862bc70b07d6">keepalive_timeout</a>;</div><div class="line"><a name="l01672"></a><span class="lineno"><a class="line" href="structlws__context__creation__info.html#ad0e95ba721f7bd2b676719f8093c23a2"> 1672</a></span>&#160;        <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="l01675"></a><span class="lineno"><a class="line" href="structlws__context__creation__info.html#a13ffbb0d010309669611f8c4eda7d7f8"> 1675</a></span>&#160;        <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="l01677"></a><span class="lineno"><a class="line" href="structlws__context__creation__info.html#a137a9b9de4f6a7993fed8746d551e616"> 1677</a></span>&#160;        <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="l01680"></a><span class="lineno"><a class="line" href="structlws__context__creation__info.html#a57f88c0745adbd1d6b9b619b8de30209"> 1680</a></span>&#160;        <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="l01686"></a><span class="lineno"><a class="line" href="structlws__context__creation__info.html#aa8d9e85e137f35fb006f2e4a53f0887a"> 1686</a></span>&#160;        <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="l01691"></a><span class="lineno"><a class="line" href="structlws__context__creation__info.html#a704940261951ced6b5d8191bd8b9bb2d"> 1691</a></span>&#160;        <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="l01693"></a><span class="lineno"><a class="line" href="structlws__context__creation__info.html#adb0bc0b28cd7d90ab306723d8ffa96fa"> 1693</a></span>&#160;        <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="l01695"></a><span class="lineno"><a class="line" href="structlws__context__creation__info.html#a33a1a25a7df3793f59047e20dd580078"> 1695</a></span>&#160;        <span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> <a class="code" href="structlws__context__creation__info.html#a33a1a25a7df3793f59047e20dd580078">ws_ping_pong_interval</a>;</div><div class="line"><a name="l01707"></a><span class="lineno"><a class="line" href="structlws__context__creation__info.html#a8ca0ec6b8675c13849bbdcdc0d50c9a3"> 1707</a></span>&#160;        <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#a8ca0ec6b8675c13849bbdcdc0d50c9a3">headers</a>;</div><div class="line"><a name="l01711"></a><span class="lineno"><a class="line" href="structlws__context__creation__info.html#a6b059b7ee248cba72a3a4fd6141b0b34"> 1711</a></span>&#160;        <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#a6b059b7ee248cba72a3a4fd6141b0b34">reject_service_keywords</a>;</div><div class="line"><a name="l01719"></a><span class="lineno"> 1719</span>&#160;        <span class="comment">/* Add new things just above here ---^</span></div><div class="line"><a name="l01720"></a><span class="lineno"> 1720</span>&#160;<span class="comment">         * This is part of the ABI, don&#39;t needlessly break compatibility</span></div><div class="line"><a name="l01721"></a><span class="lineno"> 1721</span>&#160;<span class="comment">         *</span></div><div class="line"><a name="l01722"></a><span class="lineno"> 1722</span>&#160;<span class="comment">         * The below is to ensure later library versions with new</span></div><div class="line"><a name="l01723"></a><span class="lineno"> 1723</span>&#160;<span class="comment">         * members added above will see 0 (default) even if the app</span></div><div class="line"><a name="l01724"></a><span class="lineno"> 1724</span>&#160;<span class="comment">         * was not built against the newer headers.</span></div><div class="line"><a name="l01725"></a><span class="lineno"> 1725</span>&#160;<span class="comment">         */</span></div><div class="line"><a name="l01726"></a><span class="lineno"> 1726</span>&#160;</div><div class="line"><a name="l01727"></a><span class="lineno"><a class="line" href="structlws__context__creation__info.html#afce3b59950eca3203faa07381bbed5d7"> 1727</a></span>&#160;        <span class="keywordtype">void</span> *_unused[8]; </div><div class="line"><a name="l01728"></a><span class="lineno"> 1728</span>&#160;};</div><div class="line"><a name="l01729"></a><span class="lineno"> 1729</span>&#160;</div><div class="line"><a name="l01764"></a><span class="lineno"> 1764</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keyword">struct </span>lws_context *</div><div class="line"><a name="l01765"></a><span class="lineno"> 1765</span>&#160;<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="l01766"></a><span class="lineno"> 1766</span>&#160;</div><div class="line"><a name="l01775"></a><span class="lineno"> 1775</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">void</span></div><div class="line"><a name="l01776"></a><span class="lineno"> 1776</span>&#160;<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="l01777"></a><span class="lineno"> 1777</span>&#160;</div><div class="line"><a name="l01795"></a><span class="lineno"> 1795</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l01796"></a><span class="lineno"> 1796</span>&#160;<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="l01797"></a><span class="lineno"> 1797</span>&#160;</div><div class="line"><a name="l01798"></a><span class="lineno"> 1798</span>&#160;</div><div class="line"><a name="l01799"></a><span class="lineno"> 1799</span>&#160;<span class="keyword">struct </span>lws_vhost;</div><div class="line"><a name="l01800"></a><span class="lineno"> 1800</span>&#160;</div><div class="line"><a name="l01810"></a><span class="lineno"> 1810</span>&#160;LWS_EXTERN LWS_VISIBLE <span class="keyword">struct </span>lws_vhost *</div><div class="line"><a name="l01811"></a><span class="lineno"> 1811</span>&#160;<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="l01812"></a><span class="lineno"> 1812</span>&#160;                 <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="l01813"></a><span class="lineno"> 1813</span>&#160;</div><div class="line"><a name="l01828"></a><span class="lineno"> 1828</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l01829"></a><span class="lineno"> 1829</span>&#160;<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="l01830"></a><span class="lineno"> 1830</span>&#160;                         <span class="keywordtype">char</span> **config_strings, <span class="keywordtype">int</span> *len);</div><div class="line"><a name="l01831"></a><span class="lineno"> 1831</span>&#160;</div><div class="line"><a name="l01847"></a><span class="lineno"> 1847</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l01848"></a><span class="lineno"> 1848</span>&#160;<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="l01849"></a><span class="lineno"> 1849</span>&#160;                        <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="l01850"></a><span class="lineno"> 1850</span>&#160;                        <span class="keywordtype">char</span> **config_strings, <span class="keywordtype">int</span> *len);</div><div class="line"><a name="l01851"></a><span class="lineno"> 1851</span>&#160;</div><div class="line"><a name="l01853"></a><span class="lineno"> 1853</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keyword">struct </span>lws_vhost *</div><div class="line"><a name="l01854"></a><span class="lineno"> 1854</span>&#160;<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="l01855"></a><span class="lineno"> 1855</span>&#160;</div><div class="line"><a name="l01861"></a><span class="lineno"> 1861</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keyword">struct </span>lws_vhost *</div><div class="line"><a name="l01862"></a><span class="lineno"> 1862</span>&#160;<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="l01863"></a><span class="lineno"> 1863</span>&#160;</div><div class="line"><a name="l01871"></a><span class="lineno"> 1871</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l01872"></a><span class="lineno"> 1872</span>&#160;<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="l01873"></a><span class="lineno"> 1873</span>&#160;</div><div class="line"><a name="l01881"></a><span class="lineno"> 1881</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l01882"></a><span class="lineno"> 1882</span>&#160;<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="l01883"></a><span class="lineno"> 1883</span>&#160;</div><div class="line"><a name="l01893"></a><span class="lineno"> 1893</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">void</span> *</div><div class="line"><a name="l01894"></a><span class="lineno"> 1894</span>&#160;<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="l01895"></a><span class="lineno"> 1895</span>&#160;</div><div class="line"><a name="l01901"></a><span class="lineno"> 1901</span>&#160;</div><div class="line"><a name="l01908"></a><span class="lineno"><a class="line" href="structlws__protocol__vhost__options.html"> 1908</a></span>&#160;<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="l01909"></a><span class="lineno"><a class="line" href="structlws__protocol__vhost__options.html#abc714ddb4171756fc8196e9823a1e21c"> 1909</a></span>&#160;        <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="l01910"></a><span class="lineno"><a class="line" href="structlws__protocol__vhost__options.html#afd99fbc90be51ea2465b550c2ec47822"> 1910</a></span>&#160;        <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="l01911"></a><span class="lineno"><a class="line" href="structlws__protocol__vhost__options.html#acf9db77f8eb64cd4e314be9b43d8a8b9"> 1911</a></span>&#160;        <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="l01912"></a><span class="lineno"><a class="line" href="structlws__protocol__vhost__options.html#a0640a92513c70ee6b9b295a9ad1658e7"> 1912</a></span>&#160;        <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="l01913"></a><span class="lineno"> 1913</span>&#160;};</div><div class="line"><a name="l01914"></a><span class="lineno"> 1914</span>&#160;</div><div class="line"><a name="l01919"></a><span class="lineno"><a class="line" href="group__vhost-mounts.html#ga31eca18e50cb4357480f2fcad36ff437"> 1919</a></span>&#160;<span class="keyword">enum</span> <a class="code" href="group__vhost-mounts.html#ga31eca18e50cb4357480f2fcad36ff437">lws_mount_protocols</a> {</div><div class="line"><a name="l01920"></a><span class="lineno"><a class="line" href="group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437a1e9f0842b0e85db50fe648ed4ba9a4b0"> 1920</a></span>&#160;        <a class="code" href="group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437a1e9f0842b0e85db50fe648ed4ba9a4b0">LWSMPRO_HTTP</a>            = 0, </div><div class="line"><a name="l01921"></a><span class="lineno"><a class="line" href="group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437afbd10eb4777517ed1f6bfdcf3b9ea1d1"> 1921</a></span>&#160;        <a class="code" href="group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437afbd10eb4777517ed1f6bfdcf3b9ea1d1">LWSMPRO_HTTPS</a>           = 1, </div><div class="line"><a name="l01922"></a><span class="lineno"><a class="line" href="group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437a42f2361cfe76cd287fa8fcfc502357e2"> 1922</a></span>&#160;        <a class="code" href="group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437a42f2361cfe76cd287fa8fcfc502357e2">LWSMPRO_FILE</a>            = 2, </div><div class="line"><a name="l01923"></a><span class="lineno"><a class="line" href="group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437a13ab58b01ac6e05f595977f1e0f0db69"> 1923</a></span>&#160;        <a class="code" href="group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437a13ab58b01ac6e05f595977f1e0f0db69">LWSMPRO_CGI</a>             = 3, </div><div class="line"><a name="l01924"></a><span class="lineno"><a class="line" href="group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437aec137a2434851bd856ceebfb697b9970"> 1924</a></span>&#160;        <a class="code" href="group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437aec137a2434851bd856ceebfb697b9970">LWSMPRO_REDIR_HTTP</a>      = 4, </div><div class="line"><a name="l01925"></a><span class="lineno"><a class="line" href="group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437a8894d16316863077dfe530963ca59f67"> 1925</a></span>&#160;        <a class="code" href="group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437a8894d16316863077dfe530963ca59f67">LWSMPRO_REDIR_HTTPS</a>     = 5, </div><div class="line"><a name="l01926"></a><span class="lineno"><a class="line" href="group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437a946a88cf9c852eed2c0317f4115d19da"> 1926</a></span>&#160;        <a class="code" href="group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437a946a88cf9c852eed2c0317f4115d19da">LWSMPRO_CALLBACK</a>        = 6, </div><div class="line"><a name="l01927"></a><span class="lineno"> 1927</span>&#160;};</div><div class="line"><a name="l01928"></a><span class="lineno"> 1928</span>&#160;</div><div class="line"><a name="l01933"></a><span class="lineno"><a class="line" href="structlws__http__mount.html"> 1933</a></span>&#160;<span class="keyword">struct </span><a class="code" href="structlws__http__mount.html">lws_http_mount</a> {</div><div class="line"><a name="l01934"></a><span class="lineno"><a class="line" href="structlws__http__mount.html#a0109baf93f23c07c824c997c3533ee44"> 1934</a></span>&#160;        <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__http__mount.html#a0109baf93f23c07c824c997c3533ee44">mount_next</a>;</div><div class="line"><a name="l01936"></a><span class="lineno"><a class="line" href="structlws__http__mount.html#aa2391bfcada0b7a290b3c6651f64586c"> 1936</a></span>&#160;        <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="l01938"></a><span class="lineno"><a class="line" href="structlws__http__mount.html#a21d86fd6043ec00e121ababbc29af39a"> 1938</a></span>&#160;        <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="l01940"></a><span class="lineno"><a class="line" href="structlws__http__mount.html#ae90d1efe7178199fad39de2926902ee4"> 1940</a></span>&#160;        <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="l01942"></a><span class="lineno"><a class="line" href="structlws__http__mount.html#a05347d92c3d379809564bd4f3eab259b"> 1942</a></span>&#160;        <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="l01945"></a><span class="lineno"><a class="line" href="structlws__http__mount.html#a2f6c7dbc2d714b7259c67b7744d4ff98"> 1945</a></span>&#160;        <span class="keyword">const</span> <span class="keywordtype">char</span> *<a class="code" href="structlws__http__mount.html#a2f6c7dbc2d714b7259c67b7744d4ff98">basic_auth_login_file</a>;</div><div class="line"><a name="l01948"></a><span class="lineno"><a class="line" href="structlws__http__mount.html#ae7b5c0f4c5408061e6ea3a8d281f45af"> 1948</a></span>&#160;        <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="l01952"></a><span class="lineno"><a class="line" href="structlws__http__mount.html#a4437423df85ee3dbcae0e15974c89ec7"> 1952</a></span>&#160;        <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="l01954"></a><span class="lineno"><a class="line" href="structlws__http__mount.html#a11ea62b952710d59733dbcf9794a5773"> 1954</a></span>&#160;        <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="l01957"></a><span class="lineno"><a class="line" href="structlws__http__mount.html#a4a7239d6d4c03986e6e1a72abb6c83aa"> 1957</a></span>&#160;        <span class="keywordtype">int</span> <a class="code" href="structlws__http__mount.html#a4a7239d6d4c03986e6e1a72abb6c83aa">cgi_timeout</a>;</div><div class="line"><a name="l01959"></a><span class="lineno"><a class="line" href="structlws__http__mount.html#a4283e30ea89d27ae7d061ad760d1d146"> 1959</a></span>&#160;        <span class="keywordtype">int</span> <a class="code" href="structlws__http__mount.html#a4283e30ea89d27ae7d061ad760d1d146">cache_max_age</a>;</div><div class="line"><a name="l01961"></a><span class="lineno"><a class="line" href="structlws__http__mount.html#a614364c770b0bd4db464ad65cddab477"> 1961</a></span>&#160;        <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="l01964"></a><span class="lineno"><a class="line" href="structlws__http__mount.html#a8316dd183ffbef50419a5a4968d35d84"> 1964</a></span>&#160;        <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> cache_reusable:1; </div><div class="line"><a name="l01965"></a><span class="lineno"><a class="line" href="structlws__http__mount.html#ae137203040c6153694bd88a708da5395"> 1965</a></span>&#160;        <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> cache_revalidate:1; </div><div class="line"><a name="l01966"></a><span class="lineno"><a class="line" href="structlws__http__mount.html#aabec1a326780aafe11b977000983be0c"> 1966</a></span>&#160;        <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> cache_intermediaries:1; </div><div class="line"><a name="l01968"></a><span class="lineno"><a class="line" href="structlws__http__mount.html#a6a9b1492a0b9749e39bd19932717a0b7"> 1968</a></span>&#160;        <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="l01969"></a><span class="lineno"><a class="line" href="structlws__http__mount.html#ac8489b60b8f969eb19c9abbdeac90743"> 1969</a></span>&#160;        <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="l01970"></a><span class="lineno"> 1970</span>&#160;};</div><div class="line"><a name="l01973"></a><span class="lineno"> 1973</span>&#160;</div><div class="line"><a name="l01979"></a><span class="lineno"> 1979</span>&#160;</div><div class="line"><a name="l01986"></a><span class="lineno"><a class="line" href="group__client.html#ga96f3dbad54b2853969cfa933d66871ce"> 1986</a></span>&#160;<span class="keyword">enum</span> <a class="code" href="group__client.html#ga96f3dbad54b2853969cfa933d66871ce">lws_client_connect_ssl_connection_flags</a> {</div><div class="line"><a name="l01987"></a><span class="lineno"> 1987</span>&#160;        LCCSCF_USE_SSL                          = (1 &lt;&lt; 0),</div><div class="line"><a name="l01988"></a><span class="lineno"> 1988</span>&#160;        LCCSCF_ALLOW_SELFSIGNED                 = (1 &lt;&lt; 1),</div><div class="line"><a name="l01989"></a><span class="lineno"> 1989</span>&#160;        LCCSCF_SKIP_SERVER_CERT_HOSTNAME_CHECK  = (1 &lt;&lt; 2),</div><div class="line"><a name="l01990"></a><span class="lineno"> 1990</span>&#160;        LCCSCF_ALLOW_EXPIRED                    = (1 &lt;&lt; 3)</div><div class="line"><a name="l01991"></a><span class="lineno"> 1991</span>&#160;};</div><div class="line"><a name="l01992"></a><span class="lineno"> 1992</span>&#160;</div><div class="line"><a name="l01996"></a><span class="lineno"><a class="line" href="structlws__client__connect__info.html"> 1996</a></span>&#160;<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="l01997"></a><span class="lineno"><a class="line" href="structlws__client__connect__info.html#afe999d133cc240a0bfd02aade0514cfd"> 1997</a></span>&#160;        <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="l01999"></a><span class="lineno"><a class="line" href="structlws__client__connect__info.html#aa364094f94ef1bcaaabbd9161971d502"> 1999</a></span>&#160;        <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="l02001"></a><span class="lineno"><a class="line" href="structlws__client__connect__info.html#a1af124d81c3c22a46d39387c5bc3d6b9"> 2001</a></span>&#160;        <span class="keywordtype">int</span> <a class="code" href="structlws__client__connect__info.html#a1af124d81c3c22a46d39387c5bc3d6b9">port</a>;</div><div class="line"><a name="l02003"></a><span class="lineno"><a class="line" href="structlws__client__connect__info.html#a9862297827639238a7a0b4054c3ddf3d"> 2003</a></span>&#160;        <span class="keywordtype">int</span> <a class="code" href="structlws__client__connect__info.html#a9862297827639238a7a0b4054c3ddf3d">ssl_connection</a>;</div><div class="line"><a name="l02005"></a><span class="lineno"><a class="line" href="structlws__client__connect__info.html#a76a8388733f114fb8fd3643874781185"> 2005</a></span>&#160;        <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="l02007"></a><span class="lineno"><a class="line" href="structlws__client__connect__info.html#a9b36d47c3422329df32c21040a35ebc7"> 2007</a></span>&#160;        <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="l02009"></a><span class="lineno"><a class="line" href="structlws__client__connect__info.html#a8595f83e64147cb687b6418cf500dd4c"> 2009</a></span>&#160;        <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="l02011"></a><span class="lineno"><a class="line" href="structlws__client__connect__info.html#aba35adfb74845a5fd0c3dc141cbdddd2"> 2011</a></span>&#160;        <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="l02013"></a><span class="lineno"><a class="line" href="structlws__client__connect__info.html#a69abb5aeed755750b9755e5c91db6895"> 2013</a></span>&#160;        <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="l02015"></a><span class="lineno"><a class="line" href="structlws__client__connect__info.html#a9831b9f9ab54a1aec4bb15324f1c3836"> 2015</a></span>&#160;        <span class="keywordtype">void</span> *<a class="code" href="structlws__client__connect__info.html#a9831b9f9ab54a1aec4bb15324f1c3836">userdata</a>;</div><div class="line"><a name="l02017"></a><span class="lineno"><a class="line" href="structlws__client__connect__info.html#a7732b996e977393c3e1076be2a8ded6c"> 2017</a></span>&#160;        <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="l02019"></a><span class="lineno"><a class="line" href="structlws__client__connect__info.html#aa9e8e3da4e783a0651b0dea62c2dd1db"> 2019</a></span>&#160;        <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="l02022"></a><span class="lineno"><a class="line" href="structlws__client__connect__info.html#a6843a60e1050b10db9d98d7eeb45f587"> 2022</a></span>&#160;        <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="l02026"></a><span class="lineno"><a class="line" href="structlws__client__connect__info.html#a03c305fdca809667b6a9a83b3edfd83a"> 2026</a></span>&#160;        <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="l02029"></a><span class="lineno"><a class="line" href="structlws__client__connect__info.html#a9959ba103d3d2484e559a9f7879eebe3"> 2029</a></span>&#160;        <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="l02031"></a><span class="lineno"><a class="line" href="structlws__client__connect__info.html#a3893181d728f326f9f5b47c1459cb8be"> 2031</a></span>&#160;        <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="l02033"></a><span class="lineno"><a class="line" href="structlws__client__connect__info.html#a065063b5117ecd0a59567c97f04bda2e"> 2033</a></span>&#160;        <span class="keyword">struct </span>lws **<a class="code" href="structlws__client__connect__info.html#a065063b5117ecd0a59567c97f04bda2e">pwsi</a>;</div><div class="line"><a name="l02045"></a><span class="lineno"> 2045</span>&#160;        <span class="comment">/* Add new things just above here ---^</span></div><div class="line"><a name="l02046"></a><span class="lineno"> 2046</span>&#160;<span class="comment">         * This is part of the ABI, don&#39;t needlessly break compatibility</span></div><div class="line"><a name="l02047"></a><span class="lineno"> 2047</span>&#160;<span class="comment">         *</span></div><div class="line"><a name="l02048"></a><span class="lineno"> 2048</span>&#160;<span class="comment">         * The below is to ensure later library versions with new</span></div><div class="line"><a name="l02049"></a><span class="lineno"> 2049</span>&#160;<span class="comment">         * members added above will see 0 (default) even if the app</span></div><div class="line"><a name="l02050"></a><span class="lineno"> 2050</span>&#160;<span class="comment">         * was not built against the newer headers.</span></div><div class="line"><a name="l02051"></a><span class="lineno"> 2051</span>&#160;<span class="comment">         */</span></div><div class="line"><a name="l02052"></a><span class="lineno"> 2052</span>&#160;</div><div class="line"><a name="l02053"></a><span class="lineno"><a class="line" href="structlws__client__connect__info.html#ad47f50d1633dc5df74548606c9a66d73"> 2053</a></span>&#160;        <span class="keywordtype">void</span> *_unused[4]; </div><div class="line"><a name="l02054"></a><span class="lineno"> 2054</span>&#160;};</div><div class="line"><a name="l02055"></a><span class="lineno"> 2055</span>&#160;</div><div class="line"><a name="l02063"></a><span class="lineno"> 2063</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keyword">struct </span>lws *</div><div class="line"><a name="l02064"></a><span class="lineno"> 2064</span>&#160;<a class="code" href="group__client.html#ga0c966136905f467816307cfba6deb5fd">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="l02065"></a><span class="lineno"> 2065</span>&#160;</div><div class="line"><a name="l02086"></a><span class="lineno"> 2086</span>&#160;<span class="comment">/* deprecated, use lws_client_connect_via_info() */</span></div><div class="line"><a name="l02087"></a><span class="lineno"> 2087</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keyword">struct </span>lws * LWS_WARN_UNUSED_RESULT</div><div class="line"><a name="l02088"></a><span class="lineno"> 2088</span>&#160;<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="l02089"></a><span class="lineno"> 2089</span>&#160;                   <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="l02090"></a><span class="lineno"> 2090</span>&#160;                   <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="l02091"></a><span class="lineno"> 2091</span>&#160;                   <span class="keywordtype">int</span> ietf_version_or_minus_one) LWS_WARN_DEPRECATED;</div><div class="line"><a name="l02092"></a><span class="lineno"> 2092</span>&#160;<span class="comment">/* deprecated, use lws_client_connect_via_info() */</span></div><div class="line"><a name="l02113"></a><span class="lineno"> 2113</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keyword">struct </span>lws * LWS_WARN_UNUSED_RESULT</div><div class="line"><a name="l02114"></a><span class="lineno"> 2114</span>&#160;<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="l02115"></a><span class="lineno"> 2115</span>&#160;                            <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="l02116"></a><span class="lineno"> 2116</span>&#160;                            <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="l02117"></a><span class="lineno"> 2117</span>&#160;                            <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="l02118"></a><span class="lineno"> 2118</span>&#160;                            <span class="keywordtype">void</span> *userdata) LWS_WARN_DEPRECATED;</div><div class="line"><a name="l02119"></a><span class="lineno"> 2119</span>&#160;</div><div class="line"><a name="l02145"></a><span class="lineno"> 2145</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l02146"></a><span class="lineno"> 2146</span>&#160;<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="l02147"></a><span class="lineno"> 2147</span>&#160;                          <span class="keyword">struct</span> lws_vhost *vhost);</div><div class="line"><a name="l02148"></a><span class="lineno"> 2148</span>&#160;</div><div class="line"><a name="l02149"></a><span class="lineno"> 2149</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l02150"></a><span class="lineno"> 2150</span>&#160;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="l02151"></a><span class="lineno"> 2151</span>&#160;</div><div class="line"><a name="l02159"></a><span class="lineno"> 2159</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span></div><div class="line"><a name="l02160"></a><span class="lineno"> 2160</span>&#160;<a class="code" href="group__client.html#ga715efffc0c4e8fbf72a4293008eb2187">lws_http_client_http_response</a>(<span class="keyword">struct</span> lws *wsi);</div><div class="line"><a name="l02161"></a><span class="lineno"> 2161</span>&#160;</div><div class="line"><a name="l02162"></a><span class="lineno"> 2162</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">void</span></div><div class="line"><a name="l02163"></a><span class="lineno"> 2163</span>&#160;lws_client_http_body_pending(<span class="keyword">struct</span> lws *wsi, <span class="keywordtype">int</span> something_left_to_send);</div><div class="line"><a name="l02164"></a><span class="lineno"> 2164</span>&#160;</div><div class="line"><a name="l02185"></a><span class="lineno"> 2185</span>&#160;</div><div class="line"><a name="l02194"></a><span class="lineno"> 2194</span>&#160;</div><div class="line"><a name="l02227"></a><span class="lineno"> 2227</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l02228"></a><span class="lineno"> 2228</span>&#160;<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="l02229"></a><span class="lineno"> 2229</span>&#160;</div><div class="line"><a name="l02241"></a><span class="lineno"> 2241</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l02242"></a><span class="lineno"> 2242</span>&#160;<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="l02243"></a><span class="lineno"> 2243</span>&#160;</div><div class="line"><a name="l02259"></a><span class="lineno"> 2259</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">void</span></div><div class="line"><a name="l02260"></a><span class="lineno"> 2260</span>&#160;<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="l02261"></a><span class="lineno"> 2261</span>&#160;</div><div class="line"><a name="l02273"></a><span class="lineno"> 2273</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">void</span></div><div class="line"><a name="l02274"></a><span class="lineno"> 2274</span>&#160;<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="l02275"></a><span class="lineno"> 2275</span>&#160;</div><div class="line"><a name="l02302"></a><span class="lineno"> 2302</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l02303"></a><span class="lineno"> 2303</span>&#160;<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="l02304"></a><span class="lineno"> 2304</span>&#160;</div><div class="line"><a name="l02314"></a><span class="lineno"> 2314</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l02315"></a><span class="lineno"> 2315</span>&#160;<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="l02316"></a><span class="lineno"> 2316</span>&#160;                   <span class="keywordtype">int</span> tsi);</div><div class="line"><a name="l02317"></a><span class="lineno"> 2317</span>&#160;</div><div class="line"><a name="l02335"></a><span class="lineno"> 2335</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l02336"></a><span class="lineno"> 2336</span>&#160;<a class="code" href="group__service.html#ga4fd9d714434ca499e2b3f7dbba86f241">lws_service_adjust_timeout</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="l02337"></a><span class="lineno"> 2337</span>&#160;</div><div class="line"><a name="l02338"></a><span class="lineno"> 2338</span>&#160;<span class="comment">/* Backwards compatibility */</span></div><div class="line"><a name="l02339"></a><span class="lineno"> 2339</span>&#160;<span class="preprocessor">#define lws_plat_service_tsi lws_service_tsi</span></div><div class="line"><a name="l02340"></a><span class="lineno"> 2340</span>&#160;</div><div class="line"><a name="l02342"></a><span class="lineno"> 2342</span>&#160;</div><div class="line"><a name="l02348"></a><span class="lineno"> 2348</span>&#160;</div><div class="line"><a name="l02355"></a><span class="lineno"> 2355</span>&#160;</div><div class="line"><a name="l02367"></a><span class="lineno"> 2367</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keyword">const</span> <span class="keywordtype">char</span> *</div><div class="line"><a name="l02368"></a><span class="lineno"> 2368</span>&#160;<a class="code" href="group__httpft.html#gab4da87a4800413f15e7aba649fb1d77c">lws_get_mimetype</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> *file, <span class="keyword">const</span> <span class="keyword">struct</span> <a class="code" href="structlws__http__mount.html">lws_http_mount</a> *m);</div><div class="line"><a name="l02369"></a><span class="lineno"> 2369</span>&#160;</div><div class="line"><a name="l02388"></a><span class="lineno"> 2388</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l02389"></a><span class="lineno"> 2389</span>&#160;<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="l02390"></a><span class="lineno"> 2390</span>&#160;                    <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="l02391"></a><span class="lineno"> 2391</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l02392"></a><span class="lineno"> 2392</span>&#160;lws_serve_http_file_fragment(<span class="keyword">struct</span> lws *wsi);</div><div class="line"><a name="l02394"></a><span class="lineno"> 2394</span>&#160;</div><div class="line"><a name="l02405"></a><span class="lineno"> 2405</span>&#160;</div><div class="line"><a name="l02406"></a><span class="lineno"> 2406</span>&#160;<span class="keyword">enum</span> http_status {</div><div class="line"><a name="l02407"></a><span class="lineno"> 2407</span>&#160;        HTTP_STATUS_OK                                          = 200,</div><div class="line"><a name="l02408"></a><span class="lineno"> 2408</span>&#160;        HTTP_STATUS_NO_CONTENT                                  = 204,</div><div class="line"><a name="l02409"></a><span class="lineno"> 2409</span>&#160;</div><div class="line"><a name="l02410"></a><span class="lineno"> 2410</span>&#160;        HTTP_STATUS_MOVED_PERMANENTLY                           = 301,</div><div class="line"><a name="l02411"></a><span class="lineno"> 2411</span>&#160;        HTTP_STATUS_FOUND                                       = 302,</div><div class="line"><a name="l02412"></a><span class="lineno"> 2412</span>&#160;        HTTP_STATUS_SEE_OTHER                                   = 303,</div><div class="line"><a name="l02413"></a><span class="lineno"> 2413</span>&#160;</div><div class="line"><a name="l02414"></a><span class="lineno"> 2414</span>&#160;        HTTP_STATUS_BAD_REQUEST                                 = 400,</div><div class="line"><a name="l02415"></a><span class="lineno"> 2415</span>&#160;        HTTP_STATUS_UNAUTHORIZED,</div><div class="line"><a name="l02416"></a><span class="lineno"> 2416</span>&#160;        HTTP_STATUS_PAYMENT_REQUIRED,</div><div class="line"><a name="l02417"></a><span class="lineno"> 2417</span>&#160;        HTTP_STATUS_FORBIDDEN,</div><div class="line"><a name="l02418"></a><span class="lineno"> 2418</span>&#160;        HTTP_STATUS_NOT_FOUND,</div><div class="line"><a name="l02419"></a><span class="lineno"> 2419</span>&#160;        HTTP_STATUS_METHOD_NOT_ALLOWED,</div><div class="line"><a name="l02420"></a><span class="lineno"> 2420</span>&#160;        HTTP_STATUS_NOT_ACCEPTABLE,</div><div class="line"><a name="l02421"></a><span class="lineno"> 2421</span>&#160;        HTTP_STATUS_PROXY_AUTH_REQUIRED,</div><div class="line"><a name="l02422"></a><span class="lineno"> 2422</span>&#160;        HTTP_STATUS_REQUEST_TIMEOUT,</div><div class="line"><a name="l02423"></a><span class="lineno"> 2423</span>&#160;        HTTP_STATUS_CONFLICT,</div><div class="line"><a name="l02424"></a><span class="lineno"> 2424</span>&#160;        HTTP_STATUS_GONE,</div><div class="line"><a name="l02425"></a><span class="lineno"> 2425</span>&#160;        HTTP_STATUS_LENGTH_REQUIRED,</div><div class="line"><a name="l02426"></a><span class="lineno"> 2426</span>&#160;        HTTP_STATUS_PRECONDITION_FAILED,</div><div class="line"><a name="l02427"></a><span class="lineno"> 2427</span>&#160;        HTTP_STATUS_REQ_ENTITY_TOO_LARGE,</div><div class="line"><a name="l02428"></a><span class="lineno"> 2428</span>&#160;        HTTP_STATUS_REQ_URI_TOO_LONG,</div><div class="line"><a name="l02429"></a><span class="lineno"> 2429</span>&#160;        HTTP_STATUS_UNSUPPORTED_MEDIA_TYPE,</div><div class="line"><a name="l02430"></a><span class="lineno"> 2430</span>&#160;        HTTP_STATUS_REQ_RANGE_NOT_SATISFIABLE,</div><div class="line"><a name="l02431"></a><span class="lineno"> 2431</span>&#160;        HTTP_STATUS_EXPECTATION_FAILED,</div><div class="line"><a name="l02432"></a><span class="lineno"> 2432</span>&#160;</div><div class="line"><a name="l02433"></a><span class="lineno"> 2433</span>&#160;        HTTP_STATUS_INTERNAL_SERVER_ERROR                       = 500,</div><div class="line"><a name="l02434"></a><span class="lineno"> 2434</span>&#160;        HTTP_STATUS_NOT_IMPLEMENTED,</div><div class="line"><a name="l02435"></a><span class="lineno"> 2435</span>&#160;        HTTP_STATUS_BAD_GATEWAY,</div><div class="line"><a name="l02436"></a><span class="lineno"> 2436</span>&#160;        HTTP_STATUS_SERVICE_UNAVAILABLE,</div><div class="line"><a name="l02437"></a><span class="lineno"> 2437</span>&#160;        HTTP_STATUS_GATEWAY_TIMEOUT,</div><div class="line"><a name="l02438"></a><span class="lineno"> 2438</span>&#160;        HTTP_STATUS_HTTP_VERSION_NOT_SUPPORTED,</div><div class="line"><a name="l02439"></a><span class="lineno"> 2439</span>&#160;};</div><div class="line"><a name="l02440"></a><span class="lineno"> 2440</span>&#160;</div><div class="line"><a name="l02441"></a><span class="lineno"><a class="line" href="structlws__process__html__args.html"> 2441</a></span>&#160;<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="l02442"></a><span class="lineno"><a class="line" href="structlws__process__html__args.html#a11859d8bedd379fbf64543b25c65fe14"> 2442</a></span>&#160;        <span class="keywordtype">char</span> *<a class="code" href="structlws__process__html__args.html#a11859d8bedd379fbf64543b25c65fe14">p</a>; </div><div class="line"><a name="l02443"></a><span class="lineno"><a class="line" href="structlws__process__html__args.html#a754513f2311241cabb0cd1c90d7307ef"> 2443</a></span>&#160;        <span class="keywordtype">int</span> <a class="code" href="structlws__process__html__args.html#a754513f2311241cabb0cd1c90d7307ef">len</a>; </div><div class="line"><a name="l02444"></a><span class="lineno"><a class="line" href="structlws__process__html__args.html#a8be7fd396a1942ea2449a2fda990ff99"> 2444</a></span>&#160;        <span class="keywordtype">int</span> <a class="code" href="structlws__process__html__args.html#a8be7fd396a1942ea2449a2fda990ff99">max_len</a>; </div><div class="line"><a name="l02445"></a><span class="lineno"><a class="line" href="structlws__process__html__args.html#a362547891ee0d693f3900a1f807ea475"> 2445</a></span>&#160;        <span class="keywordtype">int</span> <span class="keyword">final</span>; </div><div class="line"><a name="l02446"></a><span class="lineno"> 2446</span>&#160;};</div><div class="line"><a name="l02447"></a><span class="lineno"> 2447</span>&#160;</div><div class="line"><a name="l02448"></a><span class="lineno"> 2448</span>&#160;<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="l02449"></a><span class="lineno"> 2449</span>&#160;</div><div class="line"><a name="l02450"></a><span class="lineno"><a class="line" href="structlws__process__html__state.html"> 2450</a></span>&#160;<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="l02451"></a><span class="lineno"><a class="line" href="structlws__process__html__state.html#af0732884ef891e24fe5fa237ebaa21a3"> 2451</a></span>&#160;        <span class="keywordtype">char</span> *<a class="code" href="structlws__process__html__state.html#af0732884ef891e24fe5fa237ebaa21a3">start</a>; </div><div class="line"><a name="l02452"></a><span class="lineno"><a class="line" href="structlws__process__html__state.html#a71982bc1cbd8cf876ca0f545144404eb"> 2452</a></span>&#160;        <span class="keywordtype">char</span> swallow[16]; </div><div class="line"><a name="l02453"></a><span class="lineno"><a class="line" href="structlws__process__html__state.html#a53234f2948812c7208a256f9f5b23c20"> 2453</a></span>&#160;        <span class="keywordtype">int</span> <a class="code" href="structlws__process__html__state.html#a53234f2948812c7208a256f9f5b23c20">pos</a>; </div><div class="line"><a name="l02454"></a><span class="lineno"><a class="line" href="structlws__process__html__state.html#af21119890fdfebe28fb5c4dabfc1bdf5"> 2454</a></span>&#160;        <span class="keywordtype">void</span> *<a class="code" href="structlws__process__html__state.html#af21119890fdfebe28fb5c4dabfc1bdf5">data</a>; </div><div class="line"><a name="l02455"></a><span class="lineno"><a class="line" href="structlws__process__html__state.html#a3b113e00c03a2fded51b1c85ff5bf077"> 2455</a></span>&#160;        <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="l02456"></a><span class="lineno"><a class="line" href="structlws__process__html__state.html#adcafd17704775b4bbeea9561fb340968"> 2456</a></span>&#160;        <span class="keywordtype">int</span> <a class="code" href="structlws__process__html__state.html#adcafd17704775b4bbeea9561fb340968">count_vars</a>; </div><div class="line"><a name="l02458"></a><span class="lineno"><a class="line" href="structlws__process__html__state.html#a693d2fb45378afee5da29b539c1ea644"> 2458</a></span>&#160;        lws_process_html_state_cb replace; </div><div class="line"><a name="l02459"></a><span class="lineno"> 2459</span>&#160;};</div><div class="line"><a name="l02460"></a><span class="lineno"> 2460</span>&#160;</div><div class="line"><a name="l02465"></a><span class="lineno"> 2465</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l02466"></a><span class="lineno"> 2466</span>&#160;<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="l02467"></a><span class="lineno"> 2467</span>&#160;                         <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="l02469"></a><span class="lineno"> 2469</span>&#160;</div><div class="line"><a name="l02502"></a><span class="lineno"> 2502</span>&#160;</div><div class="line"><a name="l02510"></a><span class="lineno"><a class="line" href="structlws__tokens.html"> 2510</a></span>&#160;<span class="keyword">struct </span><a class="code" href="structlws__tokens.html">lws_tokens</a> {</div><div class="line"><a name="l02511"></a><span class="lineno"><a class="line" href="structlws__tokens.html#a9f3635412bc71a5cb78e9862b55f10cd"> 2511</a></span>&#160;        <span class="keywordtype">char</span> *<a class="code" href="structlws__tokens.html#a9f3635412bc71a5cb78e9862b55f10cd">token</a>; </div><div class="line"><a name="l02512"></a><span class="lineno"><a class="line" href="structlws__tokens.html#a855b7375d1d58516c0ecd4b60e9a7766"> 2512</a></span>&#160;        <span class="keywordtype">int</span> <a class="code" href="structlws__tokens.html#a855b7375d1d58516c0ecd4b60e9a7766">token_len</a>; </div><div class="line"><a name="l02513"></a><span class="lineno"> 2513</span>&#160;};</div><div class="line"><a name="l02514"></a><span class="lineno"> 2514</span>&#160;</div><div class="line"><a name="l02515"></a><span class="lineno"> 2515</span>&#160;<span class="comment">/* enum lws_token_indexes</span></div><div class="line"><a name="l02516"></a><span class="lineno"> 2516</span>&#160;<span class="comment"> * these have to be kept in sync with lextable.h / minilex.c</span></div><div class="line"><a name="l02517"></a><span class="lineno"> 2517</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l02518"></a><span class="lineno"> 2518</span>&#160;<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="l02519"></a><span class="lineno"> 2519</span>&#160;<span class="comment"> * add it at where specified so existing users are unaffected.</span></div><div class="line"><a name="l02520"></a><span class="lineno"> 2520</span>&#160;<span class="comment"> */</span></div><div class="line"><a name="l02521"></a><span class="lineno"> 2521</span>&#160;<span class="keyword">enum</span> lws_token_indexes {</div><div class="line"><a name="l02522"></a><span class="lineno"> 2522</span>&#160;        WSI_TOKEN_GET_URI                                       =  0,</div><div class="line"><a name="l02523"></a><span class="lineno"> 2523</span>&#160;        WSI_TOKEN_POST_URI                                      =  1,</div><div class="line"><a name="l02524"></a><span class="lineno"> 2524</span>&#160;        WSI_TOKEN_OPTIONS_URI                                   =  2,</div><div class="line"><a name="l02525"></a><span class="lineno"> 2525</span>&#160;        WSI_TOKEN_HOST                                          =  3,</div><div class="line"><a name="l02526"></a><span class="lineno"> 2526</span>&#160;        WSI_TOKEN_CONNECTION                                    =  4,</div><div class="line"><a name="l02527"></a><span class="lineno"> 2527</span>&#160;        WSI_TOKEN_UPGRADE                                       =  5,</div><div class="line"><a name="l02528"></a><span class="lineno"> 2528</span>&#160;        WSI_TOKEN_ORIGIN                                        =  6,</div><div class="line"><a name="l02529"></a><span class="lineno"> 2529</span>&#160;        WSI_TOKEN_DRAFT                                         =  7,</div><div class="line"><a name="l02530"></a><span class="lineno"> 2530</span>&#160;        WSI_TOKEN_CHALLENGE                                     =  8,</div><div class="line"><a name="l02531"></a><span class="lineno"> 2531</span>&#160;        WSI_TOKEN_EXTENSIONS                                    =  9,</div><div class="line"><a name="l02532"></a><span class="lineno"> 2532</span>&#160;        WSI_TOKEN_KEY1                                          = 10,</div><div class="line"><a name="l02533"></a><span class="lineno"> 2533</span>&#160;        WSI_TOKEN_KEY2                                          = 11,</div><div class="line"><a name="l02534"></a><span class="lineno"> 2534</span>&#160;        WSI_TOKEN_PROTOCOL                                      = 12,</div><div class="line"><a name="l02535"></a><span class="lineno"> 2535</span>&#160;        WSI_TOKEN_ACCEPT                                        = 13,</div><div class="line"><a name="l02536"></a><span class="lineno"> 2536</span>&#160;        WSI_TOKEN_NONCE                                         = 14,</div><div class="line"><a name="l02537"></a><span class="lineno"> 2537</span>&#160;        WSI_TOKEN_HTTP                                          = 15,</div><div class="line"><a name="l02538"></a><span class="lineno"> 2538</span>&#160;        WSI_TOKEN_HTTP2_SETTINGS                                = 16,</div><div class="line"><a name="l02539"></a><span class="lineno"> 2539</span>&#160;        WSI_TOKEN_HTTP_ACCEPT                                   = 17,</div><div class="line"><a name="l02540"></a><span class="lineno"> 2540</span>&#160;        WSI_TOKEN_HTTP_AC_REQUEST_HEADERS                       = 18,</div><div class="line"><a name="l02541"></a><span class="lineno"> 2541</span>&#160;        WSI_TOKEN_HTTP_IF_MODIFIED_SINCE                        = 19,</div><div class="line"><a name="l02542"></a><span class="lineno"> 2542</span>&#160;        WSI_TOKEN_HTTP_IF_NONE_MATCH                            = 20,</div><div class="line"><a name="l02543"></a><span class="lineno"> 2543</span>&#160;        WSI_TOKEN_HTTP_ACCEPT_ENCODING                          = 21,</div><div class="line"><a name="l02544"></a><span class="lineno"> 2544</span>&#160;        WSI_TOKEN_HTTP_ACCEPT_LANGUAGE                          = 22,</div><div class="line"><a name="l02545"></a><span class="lineno"> 2545</span>&#160;        WSI_TOKEN_HTTP_PRAGMA                                   = 23,</div><div class="line"><a name="l02546"></a><span class="lineno"> 2546</span>&#160;        WSI_TOKEN_HTTP_CACHE_CONTROL                            = 24,</div><div class="line"><a name="l02547"></a><span class="lineno"> 2547</span>&#160;        WSI_TOKEN_HTTP_AUTHORIZATION                            = 25,</div><div class="line"><a name="l02548"></a><span class="lineno"> 2548</span>&#160;        WSI_TOKEN_HTTP_COOKIE                                   = 26,</div><div class="line"><a name="l02549"></a><span class="lineno"> 2549</span>&#160;        WSI_TOKEN_HTTP_CONTENT_LENGTH                           = 27,</div><div class="line"><a name="l02550"></a><span class="lineno"> 2550</span>&#160;        WSI_TOKEN_HTTP_CONTENT_TYPE                             = 28,</div><div class="line"><a name="l02551"></a><span class="lineno"> 2551</span>&#160;        WSI_TOKEN_HTTP_DATE                                     = 29,</div><div class="line"><a name="l02552"></a><span class="lineno"> 2552</span>&#160;        WSI_TOKEN_HTTP_RANGE                                    = 30,</div><div class="line"><a name="l02553"></a><span class="lineno"> 2553</span>&#160;        WSI_TOKEN_HTTP_REFERER                                  = 31,</div><div class="line"><a name="l02554"></a><span class="lineno"> 2554</span>&#160;        WSI_TOKEN_KEY                                           = 32,</div><div class="line"><a name="l02555"></a><span class="lineno"> 2555</span>&#160;        WSI_TOKEN_VERSION                                       = 33,</div><div class="line"><a name="l02556"></a><span class="lineno"> 2556</span>&#160;        WSI_TOKEN_SWORIGIN                                      = 34,</div><div class="line"><a name="l02557"></a><span class="lineno"> 2557</span>&#160;</div><div class="line"><a name="l02558"></a><span class="lineno"> 2558</span>&#160;        WSI_TOKEN_HTTP_COLON_AUTHORITY                          = 35,</div><div class="line"><a name="l02559"></a><span class="lineno"> 2559</span>&#160;        WSI_TOKEN_HTTP_COLON_METHOD                             = 36,</div><div class="line"><a name="l02560"></a><span class="lineno"> 2560</span>&#160;        WSI_TOKEN_HTTP_COLON_PATH                               = 37,</div><div class="line"><a name="l02561"></a><span class="lineno"> 2561</span>&#160;        WSI_TOKEN_HTTP_COLON_SCHEME                             = 38,</div><div class="line"><a name="l02562"></a><span class="lineno"> 2562</span>&#160;        WSI_TOKEN_HTTP_COLON_STATUS                             = 39,</div><div class="line"><a name="l02563"></a><span class="lineno"> 2563</span>&#160;</div><div class="line"><a name="l02564"></a><span class="lineno"> 2564</span>&#160;        WSI_TOKEN_HTTP_ACCEPT_CHARSET                           = 40,</div><div class="line"><a name="l02565"></a><span class="lineno"> 2565</span>&#160;        WSI_TOKEN_HTTP_ACCEPT_RANGES                            = 41,</div><div class="line"><a name="l02566"></a><span class="lineno"> 2566</span>&#160;        WSI_TOKEN_HTTP_ACCESS_CONTROL_ALLOW_ORIGIN              = 42,</div><div class="line"><a name="l02567"></a><span class="lineno"> 2567</span>&#160;        WSI_TOKEN_HTTP_AGE                                      = 43,</div><div class="line"><a name="l02568"></a><span class="lineno"> 2568</span>&#160;        WSI_TOKEN_HTTP_ALLOW                                    = 44,</div><div class="line"><a name="l02569"></a><span class="lineno"> 2569</span>&#160;        WSI_TOKEN_HTTP_CONTENT_DISPOSITION                      = 45,</div><div class="line"><a name="l02570"></a><span class="lineno"> 2570</span>&#160;        WSI_TOKEN_HTTP_CONTENT_ENCODING                         = 46,</div><div class="line"><a name="l02571"></a><span class="lineno"> 2571</span>&#160;        WSI_TOKEN_HTTP_CONTENT_LANGUAGE                         = 47,</div><div class="line"><a name="l02572"></a><span class="lineno"> 2572</span>&#160;        WSI_TOKEN_HTTP_CONTENT_LOCATION                         = 48,</div><div class="line"><a name="l02573"></a><span class="lineno"> 2573</span>&#160;        WSI_TOKEN_HTTP_CONTENT_RANGE                            = 49,</div><div class="line"><a name="l02574"></a><span class="lineno"> 2574</span>&#160;        WSI_TOKEN_HTTP_ETAG                                     = 50,</div><div class="line"><a name="l02575"></a><span class="lineno"> 2575</span>&#160;        WSI_TOKEN_HTTP_EXPECT                                   = 51,</div><div class="line"><a name="l02576"></a><span class="lineno"> 2576</span>&#160;        WSI_TOKEN_HTTP_EXPIRES                                  = 52,</div><div class="line"><a name="l02577"></a><span class="lineno"> 2577</span>&#160;        WSI_TOKEN_HTTP_FROM                                     = 53,</div><div class="line"><a name="l02578"></a><span class="lineno"> 2578</span>&#160;        WSI_TOKEN_HTTP_IF_MATCH                                 = 54,</div><div class="line"><a name="l02579"></a><span class="lineno"> 2579</span>&#160;        WSI_TOKEN_HTTP_IF_RANGE                                 = 55,</div><div class="line"><a name="l02580"></a><span class="lineno"> 2580</span>&#160;        WSI_TOKEN_HTTP_IF_UNMODIFIED_SINCE                      = 56,</div><div class="line"><a name="l02581"></a><span class="lineno"> 2581</span>&#160;        WSI_TOKEN_HTTP_LAST_MODIFIED                            = 57,</div><div class="line"><a name="l02582"></a><span class="lineno"> 2582</span>&#160;        WSI_TOKEN_HTTP_LINK                                     = 58,</div><div class="line"><a name="l02583"></a><span class="lineno"> 2583</span>&#160;        WSI_TOKEN_HTTP_LOCATION                                 = 59,</div><div class="line"><a name="l02584"></a><span class="lineno"> 2584</span>&#160;        WSI_TOKEN_HTTP_MAX_FORWARDS                             = 60,</div><div class="line"><a name="l02585"></a><span class="lineno"> 2585</span>&#160;        WSI_TOKEN_HTTP_PROXY_AUTHENTICATE                       = 61,</div><div class="line"><a name="l02586"></a><span class="lineno"> 2586</span>&#160;        WSI_TOKEN_HTTP_PROXY_AUTHORIZATION                      = 62,</div><div class="line"><a name="l02587"></a><span class="lineno"> 2587</span>&#160;        WSI_TOKEN_HTTP_REFRESH                                  = 63,</div><div class="line"><a name="l02588"></a><span class="lineno"> 2588</span>&#160;        WSI_TOKEN_HTTP_RETRY_AFTER                              = 64,</div><div class="line"><a name="l02589"></a><span class="lineno"> 2589</span>&#160;        WSI_TOKEN_HTTP_SERVER                                   = 65,</div><div class="line"><a name="l02590"></a><span class="lineno"> 2590</span>&#160;        WSI_TOKEN_HTTP_SET_COOKIE                               = 66,</div><div class="line"><a name="l02591"></a><span class="lineno"> 2591</span>&#160;        WSI_TOKEN_HTTP_STRICT_TRANSPORT_SECURITY                = 67,</div><div class="line"><a name="l02592"></a><span class="lineno"> 2592</span>&#160;        WSI_TOKEN_HTTP_TRANSFER_ENCODING                        = 68,</div><div class="line"><a name="l02593"></a><span class="lineno"> 2593</span>&#160;        WSI_TOKEN_HTTP_USER_AGENT                               = 69,</div><div class="line"><a name="l02594"></a><span class="lineno"> 2594</span>&#160;        WSI_TOKEN_HTTP_VARY                                     = 70,</div><div class="line"><a name="l02595"></a><span class="lineno"> 2595</span>&#160;        WSI_TOKEN_HTTP_VIA                                      = 71,</div><div class="line"><a name="l02596"></a><span class="lineno"> 2596</span>&#160;        WSI_TOKEN_HTTP_WWW_AUTHENTICATE                         = 72,</div><div class="line"><a name="l02597"></a><span class="lineno"> 2597</span>&#160;</div><div class="line"><a name="l02598"></a><span class="lineno"> 2598</span>&#160;        WSI_TOKEN_PATCH_URI                                     = 73,</div><div class="line"><a name="l02599"></a><span class="lineno"> 2599</span>&#160;        WSI_TOKEN_PUT_URI                                       = 74,</div><div class="line"><a name="l02600"></a><span class="lineno"> 2600</span>&#160;        WSI_TOKEN_DELETE_URI                                    = 75,</div><div class="line"><a name="l02601"></a><span class="lineno"> 2601</span>&#160;</div><div class="line"><a name="l02602"></a><span class="lineno"> 2602</span>&#160;        WSI_TOKEN_HTTP_URI_ARGS                                 = 76,</div><div class="line"><a name="l02603"></a><span class="lineno"> 2603</span>&#160;        WSI_TOKEN_PROXY                                         = 77,</div><div class="line"><a name="l02604"></a><span class="lineno"> 2604</span>&#160;        WSI_TOKEN_HTTP_X_REAL_IP                                = 78,</div><div class="line"><a name="l02605"></a><span class="lineno"> 2605</span>&#160;        WSI_TOKEN_HTTP1_0                                       = 79,</div><div class="line"><a name="l02606"></a><span class="lineno"> 2606</span>&#160;</div><div class="line"><a name="l02607"></a><span class="lineno"> 2607</span>&#160;        <span class="comment">/****** add new things just above ---^ ******/</span></div><div class="line"><a name="l02608"></a><span class="lineno"> 2608</span>&#160;</div><div class="line"><a name="l02609"></a><span class="lineno"> 2609</span>&#160;        <span class="comment">/* use token storage to stash these internally, not for</span></div><div class="line"><a name="l02610"></a><span class="lineno"> 2610</span>&#160;<span class="comment">         * user use */</span></div><div class="line"><a name="l02611"></a><span class="lineno"> 2611</span>&#160;</div><div class="line"><a name="l02612"></a><span class="lineno"> 2612</span>&#160;        _WSI_TOKEN_CLIENT_SENT_PROTOCOLS,</div><div class="line"><a name="l02613"></a><span class="lineno"> 2613</span>&#160;        _WSI_TOKEN_CLIENT_PEER_ADDRESS,</div><div class="line"><a name="l02614"></a><span class="lineno"> 2614</span>&#160;        _WSI_TOKEN_CLIENT_URI,</div><div class="line"><a name="l02615"></a><span class="lineno"> 2615</span>&#160;        _WSI_TOKEN_CLIENT_HOST,</div><div class="line"><a name="l02616"></a><span class="lineno"> 2616</span>&#160;        _WSI_TOKEN_CLIENT_ORIGIN,</div><div class="line"><a name="l02617"></a><span class="lineno"> 2617</span>&#160;        _WSI_TOKEN_CLIENT_METHOD,</div><div class="line"><a name="l02618"></a><span class="lineno"> 2618</span>&#160;</div><div class="line"><a name="l02619"></a><span class="lineno"> 2619</span>&#160;        <span class="comment">/* always last real token index*/</span></div><div class="line"><a name="l02620"></a><span class="lineno"> 2620</span>&#160;        WSI_TOKEN_COUNT,</div><div class="line"><a name="l02621"></a><span class="lineno"> 2621</span>&#160;</div><div class="line"><a name="l02622"></a><span class="lineno"> 2622</span>&#160;        <span class="comment">/* parser state additions, no storage associated */</span></div><div class="line"><a name="l02623"></a><span class="lineno"> 2623</span>&#160;        WSI_TOKEN_NAME_PART,</div><div class="line"><a name="l02624"></a><span class="lineno"> 2624</span>&#160;        WSI_TOKEN_SKIPPING,</div><div class="line"><a name="l02625"></a><span class="lineno"> 2625</span>&#160;        WSI_TOKEN_SKIPPING_SAW_CR,</div><div class="line"><a name="l02626"></a><span class="lineno"> 2626</span>&#160;        WSI_PARSING_COMPLETE,</div><div class="line"><a name="l02627"></a><span class="lineno"> 2627</span>&#160;        WSI_INIT_TOKEN_MUXURL,</div><div class="line"><a name="l02628"></a><span class="lineno"> 2628</span>&#160;};</div><div class="line"><a name="l02629"></a><span class="lineno"> 2629</span>&#160;</div><div class="line"><a name="l02630"></a><span class="lineno"><a class="line" href="structlws__token__limits.html"> 2630</a></span>&#160;<span class="keyword">struct </span><a class="code" href="structlws__token__limits.html">lws_token_limits</a> {</div><div class="line"><a name="l02631"></a><span class="lineno"><a class="line" href="structlws__token__limits.html#a6ec712306cbf8585bce7a56758a3ceff"> 2631</a></span>&#160;        <span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> token_limit[WSI_TOKEN_COUNT]; </div><div class="line"><a name="l02632"></a><span class="lineno"> 2632</span>&#160;};</div><div class="line"><a name="l02633"></a><span class="lineno"> 2633</span>&#160;</div><div class="line"><a name="l02639"></a><span class="lineno"> 2639</span>&#160;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="l02640"></a><span class="lineno"> 2640</span>&#160;<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="l02641"></a><span class="lineno"> 2641</span>&#160;</div><div class="line"><a name="l02642"></a><span class="lineno"> 2642</span>&#160;</div><div class="line"><a name="l02651"></a><span class="lineno"> 2651</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span> LWS_WARN_UNUSED_RESULT</div><div class="line"><a name="l02652"></a><span class="lineno"> 2652</span>&#160;<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="l02653"></a><span class="lineno"> 2653</span>&#160;</div><div class="line"><a name="l02663"></a><span class="lineno"> 2663</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span> LWS_WARN_UNUSED_RESULT</div><div class="line"><a name="l02664"></a><span class="lineno"> 2664</span>&#160;<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="l02665"></a><span class="lineno"> 2665</span>&#160;</div><div class="line"><a name="l02679"></a><span class="lineno"> 2679</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l02680"></a><span class="lineno"> 2680</span>&#160;<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="l02681"></a><span class="lineno"> 2681</span>&#160;</div><div class="line"><a name="l02699"></a><span class="lineno"> 2699</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l02700"></a><span class="lineno"> 2700</span>&#160;<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="l02701"></a><span class="lineno"> 2701</span>&#160;                      <span class="keyword">enum</span> lws_token_indexes h, <span class="keywordtype">int</span> frag_idx);</div><div class="line"><a name="l02702"></a><span class="lineno"> 2702</span>&#160;</div><div class="line"><a name="l02713"></a><span class="lineno"> 2713</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keyword">const</span> <span class="keywordtype">char</span> *</div><div class="line"><a name="l02714"></a><span class="lineno"> 2714</span>&#160;<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="l02716"></a><span class="lineno"> 2716</span>&#160;</div><div class="line"><a name="l02731"></a><span class="lineno"> 2731</span>&#160;</div><div class="line"><a name="l02742"></a><span class="lineno"> 2742</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span> LWS_WARN_UNUSED_RESULT</div><div class="line"><a name="l02743"></a><span class="lineno"> 2743</span>&#160;<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="l02744"></a><span class="lineno"> 2744</span>&#160;                           <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="l02745"></a><span class="lineno"> 2745</span>&#160;                           <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *end);</div><div class="line"><a name="l02758"></a><span class="lineno"> 2758</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span> LWS_WARN_UNUSED_RESULT</div><div class="line"><a name="l02759"></a><span class="lineno"> 2759</span>&#160;<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="l02760"></a><span class="lineno"> 2760</span>&#160;                            <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="l02761"></a><span class="lineno"> 2761</span>&#160;                            <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="l02775"></a><span class="lineno"> 2775</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span> LWS_WARN_UNUSED_RESULT</div><div class="line"><a name="l02776"></a><span class="lineno"> 2776</span>&#160;<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="l02777"></a><span class="lineno"> 2777</span>&#160;                             <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="l02778"></a><span class="lineno"> 2778</span>&#160;                             <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="l02789"></a><span class="lineno"> 2789</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span> LWS_WARN_UNUSED_RESULT</div><div class="line"><a name="l02790"></a><span class="lineno"> 2790</span>&#160;<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="l02791"></a><span class="lineno"> 2791</span>&#160;                                   <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> content_length,</div><div class="line"><a name="l02792"></a><span class="lineno"> 2792</span>&#160;                                   <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="l02802"></a><span class="lineno"> 2802</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span> LWS_WARN_UNUSED_RESULT</div><div class="line"><a name="l02803"></a><span class="lineno"> 2803</span>&#160;<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="l02804"></a><span class="lineno"> 2804</span>&#160;                         <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *end);</div><div class="line"><a name="l02806"></a><span class="lineno"> 2806</span>&#160;</div><div class="line"><a name="l02825"></a><span class="lineno"> 2825</span>&#160;</div><div class="line"><a name="l02828"></a><span class="lineno"><a class="line" href="group__form-parsing.html#ga41a74a822771d3dce89751aa3bce28ae"> 2828</a></span>&#160;<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="l02829"></a><span class="lineno"><a class="line" href="group__form-parsing.html#gga41a74a822771d3dce89751aa3bce28aead3a958e7719ac273c3ba4f684f00c87f"> 2829</a></span>&#160;        <a class="code" href="group__form-parsing.html#gga41a74a822771d3dce89751aa3bce28aead3a958e7719ac273c3ba4f684f00c87f">LWS_UFS_CONTENT</a>,</div><div class="line"><a name="l02831"></a><span class="lineno"><a class="line" href="group__form-parsing.html#gga41a74a822771d3dce89751aa3bce28aea6ce2a55a4c3695cdb640c893d95bd3a7"> 2831</a></span>&#160;        <a class="code" href="group__form-parsing.html#gga41a74a822771d3dce89751aa3bce28aea6ce2a55a4c3695cdb640c893d95bd3a7">LWS_UFS_FINAL_CONTENT</a>,</div><div class="line"><a name="l02833"></a><span class="lineno"><a class="line" href="group__form-parsing.html#gga41a74a822771d3dce89751aa3bce28aea2d25de44865bd44e5a3903a2bab9ca83"> 2833</a></span>&#160;        <a class="code" href="group__form-parsing.html#gga41a74a822771d3dce89751aa3bce28aea2d25de44865bd44e5a3903a2bab9ca83">LWS_UFS_OPEN</a></div><div class="line"><a name="l02835"></a><span class="lineno"> 2835</span>&#160;};</div><div class="line"><a name="l02836"></a><span class="lineno"> 2836</span>&#160;</div><div class="line"><a name="l02850"></a><span class="lineno"><a class="line" href="group__form-parsing.html#ga5a70527c0861c2ffa3d29333a6aa7f8e"> 2850</a></span>&#160;<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="l02851"></a><span class="lineno"> 2851</span>&#160;                        <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="l02852"></a><span class="lineno"> 2852</span>&#160;                        <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="l02853"></a><span class="lineno"> 2853</span>&#160;</div><div class="line"><a name="l02856"></a><span class="lineno"> 2856</span>&#160;<span class="keyword">struct </span>lws_spa;</div><div class="line"><a name="l02857"></a><span class="lineno"> 2857</span>&#160;</div><div class="line"><a name="l02876"></a><span class="lineno"> 2876</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keyword">struct </span>lws_spa *</div><div class="line"><a name="l02877"></a><span class="lineno"> 2877</span>&#160;<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="l02878"></a><span class="lineno"> 2878</span>&#160;               <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="l02879"></a><span class="lineno"> 2879</span>&#160;               <span class="keywordtype">void</span> *opt_data);</div><div class="line"><a name="l02880"></a><span class="lineno"> 2880</span>&#160;</div><div class="line"><a name="l02888"></a><span class="lineno"> 2888</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l02889"></a><span class="lineno"> 2889</span>&#160;<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="l02890"></a><span class="lineno"> 2890</span>&#160;</div><div class="line"><a name="l02896"></a><span class="lineno"> 2896</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l02897"></a><span class="lineno"> 2897</span>&#160;<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="l02898"></a><span class="lineno"> 2898</span>&#160;</div><div class="line"><a name="l02905"></a><span class="lineno"> 2905</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l02906"></a><span class="lineno"> 2906</span>&#160;<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="l02907"></a><span class="lineno"> 2907</span>&#160;</div><div class="line"><a name="l02913"></a><span class="lineno"> 2913</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keyword">const</span> <span class="keywordtype">char</span> *</div><div class="line"><a name="l02914"></a><span class="lineno"> 2914</span>&#160;<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="l02915"></a><span class="lineno"> 2915</span>&#160;</div><div class="line"><a name="l02921"></a><span class="lineno"> 2921</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l02922"></a><span class="lineno"> 2922</span>&#160;<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="l02924"></a><span class="lineno"> 2924</span>&#160;</div><div class="line"><a name="l02935"></a><span class="lineno"> 2935</span>&#160;</div><div class="line"><a name="l02946"></a><span class="lineno"> 2946</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keyword">const</span> <span class="keywordtype">char</span> *</div><div class="line"><a name="l02947"></a><span class="lineno"> 2947</span>&#160;<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="l02948"></a><span class="lineno"> 2948</span>&#160;</div><div class="line"><a name="l02949"></a><span class="lineno"> 2949</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l02950"></a><span class="lineno"> 2950</span>&#160;<span class="comment"> * URLDECODE 1 / 2</span></div><div class="line"><a name="l02951"></a><span class="lineno"> 2951</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l02952"></a><span class="lineno"> 2952</span>&#160;<span class="comment"> * This simple urldecode only operates until the first &#39;\0&#39; and requires the</span></div><div class="line"><a name="l02953"></a><span class="lineno"> 2953</span>&#160;<span class="comment"> * data to exist all at once</span></div><div class="line"><a name="l02954"></a><span class="lineno"> 2954</span>&#160;<span class="comment"> */</span></div><div class="line"><a name="l02967"></a><span class="lineno"> 2967</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l02968"></a><span class="lineno"> 2968</span>&#160;<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="l02970"></a><span class="lineno"> 2970</span>&#160;</div><div class="line"><a name="l02979"></a><span class="lineno"> 2979</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l02980"></a><span class="lineno"> 2980</span>&#160;<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="l02981"></a><span class="lineno"> 2981</span>&#160;                       <span class="keyword">const</span> <span class="keywordtype">char</span> *html_body);</div><div class="line"><a name="l02982"></a><span class="lineno"> 2982</span>&#160;</div><div class="line"><a name="l02993"></a><span class="lineno"> 2993</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span> LWS_WARN_UNUSED_RESULT</div><div class="line"><a name="l02994"></a><span class="lineno"> 2994</span>&#160;<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="l02995"></a><span class="lineno"> 2995</span>&#160;                  <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="l02996"></a><span class="lineno"> 2996</span>&#160;</div><div class="line"><a name="l03005"></a><span class="lineno"> 3005</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span> LWS_WARN_UNUSED_RESULT</div><div class="line"><a name="l03006"></a><span class="lineno"> 3006</span>&#160;<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="l03008"></a><span class="lineno"> 3008</span>&#160;</div><div class="line"><a name="l03016"></a><span class="lineno"> 3016</span>&#160;</div><div class="line"><a name="l03027"></a><span class="lineno"> 3027</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keyword">const</span> <span class="keywordtype">char</span> *</div><div class="line"><a name="l03028"></a><span class="lineno"> 3028</span>&#160;<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="l03029"></a><span class="lineno"> 3029</span>&#160;</div><div class="line"><a name="l03040"></a><span class="lineno"> 3040</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keyword">const</span> <span class="keywordtype">char</span> *</div><div class="line"><a name="l03041"></a><span class="lineno"> 3041</span>&#160;<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="l03043"></a><span class="lineno"> 3043</span>&#160;</div><div class="line"><a name="l03050"></a><span class="lineno"> 3050</span>&#160;</div><div class="line"><a name="l03052"></a><span class="lineno"> 3052</span>&#160;<span class="preprocessor">#ifdef LWS_USE_LIBEV</span></div><div class="line"><a name="l03053"></a><span class="lineno"> 3053</span>&#160;<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="l03054"></a><span class="lineno"> 3054</span>&#160;</div><div class="line"><a name="l03055"></a><span class="lineno"> 3055</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l03056"></a><span class="lineno"> 3056</span>&#160;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="l03057"></a><span class="lineno"> 3057</span>&#160;                  lws_ev_signal_cb_t *cb);</div><div class="line"><a name="l03058"></a><span class="lineno"> 3058</span>&#160;</div><div class="line"><a name="l03059"></a><span class="lineno"> 3059</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l03060"></a><span class="lineno"> 3060</span>&#160;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="l03061"></a><span class="lineno"> 3061</span>&#160;</div><div class="line"><a name="l03062"></a><span class="lineno"> 3062</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">void</span></div><div class="line"><a name="l03063"></a><span class="lineno"> 3063</span>&#160;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="l03064"></a><span class="lineno"> 3064</span>&#160;<span class="preprocessor">#endif </span><span class="comment">/* LWS_USE_LIBEV */</span><span class="preprocessor"></span></div><div class="line"><a name="l03065"></a><span class="lineno"> 3065</span>&#160;</div><div class="line"><a name="l03067"></a><span class="lineno"> 3067</span>&#160;</div><div class="line"><a name="l03074"></a><span class="lineno"> 3074</span>&#160;<span class="preprocessor">#ifdef LWS_USE_LIBUV</span></div><div class="line"><a name="l03076"></a><span class="lineno"> 3076</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l03077"></a><span class="lineno"> 3077</span>&#160;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="l03078"></a><span class="lineno"> 3078</span>&#160;                  uv_signal_cb cb);</div><div class="line"><a name="l03079"></a><span class="lineno"> 3079</span>&#160;</div><div class="line"><a name="l03080"></a><span class="lineno"> 3080</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">void</span></div><div class="line"><a name="l03081"></a><span class="lineno"> 3081</span>&#160;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="l03082"></a><span class="lineno"> 3082</span>&#160;</div><div class="line"><a name="l03083"></a><span class="lineno"> 3083</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">void</span></div><div class="line"><a name="l03084"></a><span class="lineno"> 3084</span>&#160;lws_libuv_stop(<span class="keyword">struct</span> lws_context *context);</div><div class="line"><a name="l03085"></a><span class="lineno"> 3085</span>&#160;</div><div class="line"><a name="l03086"></a><span class="lineno"> 3086</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l03087"></a><span class="lineno"> 3087</span>&#160;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="l03088"></a><span class="lineno"> 3088</span>&#160;</div><div class="line"><a name="l03089"></a><span class="lineno"> 3089</span>&#160;LWS_VISIBLE LWS_EXTERN uv_loop_t *</div><div class="line"><a name="l03090"></a><span class="lineno"> 3090</span>&#160;lws_uv_getloop(<span class="keyword">struct</span> lws_context *context, <span class="keywordtype">int</span> tsi);</div><div class="line"><a name="l03091"></a><span class="lineno"> 3091</span>&#160;</div><div class="line"><a name="l03092"></a><span class="lineno"> 3092</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">void</span></div><div class="line"><a name="l03093"></a><span class="lineno"> 3093</span>&#160;lws_uv_sigint_cb(uv_signal_t *watcher, <span class="keywordtype">int</span> signum);</div><div class="line"><a name="l03094"></a><span class="lineno"> 3094</span>&#160;<span class="preprocessor">#endif </span><span class="comment">/* LWS_USE_LIBUV */</span><span class="preprocessor"></span></div><div class="line"><a name="l03095"></a><span class="lineno"> 3095</span>&#160;</div><div class="line"><a name="l03102"></a><span class="lineno"> 3102</span>&#160;</div><div class="line"><a name="l03103"></a><span class="lineno"> 3103</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l03104"></a><span class="lineno"> 3104</span>&#160;<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="l03105"></a><span class="lineno"> 3105</span>&#160;<span class="comment"> * add it at where specified so existing users are unaffected.</span></div><div class="line"><a name="l03106"></a><span class="lineno"> 3106</span>&#160;<span class="comment"> */</span></div><div class="line"><a name="l03107"></a><span class="lineno"> 3107</span>&#160;<span class="keyword">enum</span> pending_timeout {</div><div class="line"><a name="l03108"></a><span class="lineno"> 3108</span>&#160;        NO_PENDING_TIMEOUT                                      =  0,</div><div class="line"><a name="l03109"></a><span class="lineno"> 3109</span>&#160;        PENDING_TIMEOUT_AWAITING_PROXY_RESPONSE                 =  1,</div><div class="line"><a name="l03110"></a><span class="lineno"> 3110</span>&#160;        PENDING_TIMEOUT_AWAITING_CONNECT_RESPONSE               =  2,</div><div class="line"><a name="l03111"></a><span class="lineno"> 3111</span>&#160;        PENDING_TIMEOUT_ESTABLISH_WITH_SERVER                   =  3,</div><div class="line"><a name="l03112"></a><span class="lineno"> 3112</span>&#160;        PENDING_TIMEOUT_AWAITING_SERVER_RESPONSE                =  4,</div><div class="line"><a name="l03113"></a><span class="lineno"> 3113</span>&#160;        PENDING_TIMEOUT_AWAITING_PING                           =  5,</div><div class="line"><a name="l03114"></a><span class="lineno"> 3114</span>&#160;        PENDING_TIMEOUT_CLOSE_ACK                               =  6,</div><div class="line"><a name="l03115"></a><span class="lineno"> 3115</span>&#160;        PENDING_TIMEOUT_AWAITING_EXTENSION_CONNECT_RESPONSE     =  7,</div><div class="line"><a name="l03116"></a><span class="lineno"> 3116</span>&#160;        PENDING_TIMEOUT_SENT_CLIENT_HANDSHAKE                   =  8,</div><div class="line"><a name="l03117"></a><span class="lineno"> 3117</span>&#160;        PENDING_TIMEOUT_SSL_ACCEPT                              =  9,</div><div class="line"><a name="l03118"></a><span class="lineno"> 3118</span>&#160;        PENDING_TIMEOUT_HTTP_CONTENT                            = 10,</div><div class="line"><a name="l03119"></a><span class="lineno"> 3119</span>&#160;        PENDING_TIMEOUT_AWAITING_CLIENT_HS_SEND                 = 11,</div><div class="line"><a name="l03120"></a><span class="lineno"> 3120</span>&#160;        PENDING_FLUSH_STORED_SEND_BEFORE_CLOSE                  = 12,</div><div class="line"><a name="l03121"></a><span class="lineno"> 3121</span>&#160;        PENDING_TIMEOUT_SHUTDOWN_FLUSH                          = 13,</div><div class="line"><a name="l03122"></a><span class="lineno"> 3122</span>&#160;        PENDING_TIMEOUT_CGI                                     = 14,</div><div class="line"><a name="l03123"></a><span class="lineno"> 3123</span>&#160;        PENDING_TIMEOUT_HTTP_KEEPALIVE_IDLE                     = 15,</div><div class="line"><a name="l03124"></a><span class="lineno"> 3124</span>&#160;        PENDING_TIMEOUT_WS_PONG_CHECK_SEND_PING                 = 16,</div><div class="line"><a name="l03125"></a><span class="lineno"> 3125</span>&#160;        PENDING_TIMEOUT_WS_PONG_CHECK_GET_PONG                  = 17,</div><div class="line"><a name="l03126"></a><span class="lineno"> 3126</span>&#160;        PENDING_TIMEOUT_CLIENT_ISSUE_PAYLOAD                    = 18,</div><div class="line"><a name="l03127"></a><span class="lineno"> 3127</span>&#160;</div><div class="line"><a name="l03128"></a><span class="lineno"> 3128</span>&#160;        <span class="comment">/****** add new things just above ---^ ******/</span></div><div class="line"><a name="l03129"></a><span class="lineno"> 3129</span>&#160;};</div><div class="line"><a name="l03130"></a><span class="lineno"> 3130</span>&#160;</div><div class="line"><a name="l03140"></a><span class="lineno"> 3140</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">void</span></div><div class="line"><a name="l03141"></a><span class="lineno"> 3141</span>&#160;<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="l03143"></a><span class="lineno"> 3143</span>&#160;</div><div class="line"><a name="l03149"></a><span class="lineno"> 3149</span>&#160;<span class="preprocessor">#if !defined(LWS_SIZEOFPTR)</span></div><div class="line"><a name="l03150"></a><span class="lineno"> 3150</span>&#160;<span class="preprocessor">#define LWS_SIZEOFPTR (sizeof (void *))</span></div><div class="line"><a name="l03151"></a><span class="lineno"> 3151</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l03152"></a><span class="lineno"> 3152</span>&#160;<span class="preprocessor">#if !defined(u_int64_t)</span></div><div class="line"><a name="l03153"></a><span class="lineno"> 3153</span>&#160;<span class="preprocessor">#define u_int64_t unsigned long long</span></div><div class="line"><a name="l03154"></a><span class="lineno"> 3154</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l03155"></a><span class="lineno"> 3155</span>&#160;</div><div class="line"><a name="l03156"></a><span class="lineno"> 3156</span>&#160;<span class="preprocessor">#if defined(__x86_64__)</span></div><div class="line"><a name="l03157"></a><span class="lineno"> 3157</span>&#160;<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="l03158"></a><span class="lineno"> 3158</span>&#160;<span class="preprocessor">#else</span></div><div class="line"><a name="l03159"></a><span class="lineno"> 3159</span>&#160;<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="l03160"></a><span class="lineno"> 3160</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l03161"></a><span class="lineno"> 3161</span>&#160;<span class="preprocessor">#define _LWS_PAD(n) (((n) % _LWS_PAD_SIZE) ? \</span></div><div class="line"><a name="l03162"></a><span class="lineno"> 3162</span>&#160;<span class="preprocessor">                ((n) + (_LWS_PAD_SIZE - ((n) % _LWS_PAD_SIZE))) : (n))</span></div><div class="line"><a name="l03163"></a><span class="lineno"> 3163</span>&#160;<span class="preprocessor">#define LWS_PRE _LWS_PAD(4 + 10)</span></div><div class="line"><a name="l03164"></a><span class="lineno"> 3164</span>&#160;<span class="comment">/* used prior to 1.7 and retained for backward compatibility */</span></div><div class="line"><a name="l03165"></a><span class="lineno"> 3165</span>&#160;<span class="preprocessor">#define LWS_SEND_BUFFER_PRE_PADDING LWS_PRE</span></div><div class="line"><a name="l03166"></a><span class="lineno"> 3166</span>&#160;<span class="preprocessor">#define LWS_SEND_BUFFER_POST_PADDING 0</span></div><div class="line"><a name="l03167"></a><span class="lineno"> 3167</span>&#160;</div><div class="line"><a name="l03168"></a><span class="lineno"> 3168</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l03169"></a><span class="lineno"> 3169</span>&#160;<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="l03170"></a><span class="lineno"> 3170</span>&#160;<span class="comment"> * add it at where specified so existing users are unaffected.</span></div><div class="line"><a name="l03171"></a><span class="lineno"> 3171</span>&#160;<span class="comment"> */</span></div><div class="line"><a name="l03172"></a><span class="lineno"><a class="line" href="group__sending-data.html#ga98b099cf8c1c7e38ad78501f270e193d"> 3172</a></span>&#160;<span class="keyword">enum</span> <a class="code" href="group__sending-data.html#ga98b099cf8c1c7e38ad78501f270e193d">lws_write_protocol</a> {</div><div class="line"><a name="l03173"></a><span class="lineno"><a class="line" href="group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193da80e8f169fda236c56bfb795ed62903db"> 3173</a></span>&#160;        <a class="code" href="group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193da80e8f169fda236c56bfb795ed62903db">LWS_WRITE_TEXT</a>                                          = 0,</div><div class="line"><a name="l03177"></a><span class="lineno"><a class="line" href="group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193daf6486c0dba50c44198100717721d9ab2"> 3177</a></span>&#160;        <a class="code" href="group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193daf6486c0dba50c44198100717721d9ab2">LWS_WRITE_BINARY</a>                                        = 1,</div><div class="line"><a name="l03180"></a><span class="lineno"><a class="line" href="group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193da10047eb05b5e1c298151dc47a5b44826"> 3180</a></span>&#160;        <a class="code" href="group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193da10047eb05b5e1c298151dc47a5b44826">LWS_WRITE_CONTINUATION</a>                                  = 2,</div><div class="line"><a name="l03183"></a><span class="lineno"><a class="line" href="group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193dabb6705e1d1327cdda5025be28f07712e"> 3183</a></span>&#160;        <a class="code" href="group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193dabb6705e1d1327cdda5025be28f07712e">LWS_WRITE_HTTP</a>                                          = 3,</div><div class="line"><a name="l03186"></a><span class="lineno"> 3186</span>&#160;        <span class="comment">/* LWS_WRITE_CLOSE is handled by lws_close_reason() */</span></div><div class="line"><a name="l03187"></a><span class="lineno"> 3187</span>&#160;        LWS_WRITE_PING                                          = 5,</div><div class="line"><a name="l03188"></a><span class="lineno"> 3188</span>&#160;        LWS_WRITE_PONG                                          = 6,</div><div class="line"><a name="l03189"></a><span class="lineno"> 3189</span>&#160;</div><div class="line"><a name="l03190"></a><span class="lineno"> 3190</span>&#160;        <span class="comment">/* Same as write_http but we know this write ends the transaction */</span></div><div class="line"><a name="l03191"></a><span class="lineno"> 3191</span>&#160;        LWS_WRITE_HTTP_FINAL                                    = 7,</div><div class="line"><a name="l03192"></a><span class="lineno"> 3192</span>&#160;</div><div class="line"><a name="l03193"></a><span class="lineno"> 3193</span>&#160;        <span class="comment">/* HTTP2 */</span></div><div class="line"><a name="l03194"></a><span class="lineno"> 3194</span>&#160;</div><div class="line"><a name="l03195"></a><span class="lineno"><a class="line" href="group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193dafe5a38e940ce56708ac814627e9c0917"> 3195</a></span>&#160;        <a class="code" href="group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193dafe5a38e940ce56708ac814627e9c0917">LWS_WRITE_HTTP_HEADERS</a>                                  = 8,</div><div class="line"><a name="l03202"></a><span class="lineno"> 3202</span>&#160;        <span class="comment">/****** add new things just above ---^ ******/</span></div><div class="line"><a name="l03203"></a><span class="lineno"> 3203</span>&#160;</div><div class="line"><a name="l03204"></a><span class="lineno"> 3204</span>&#160;        <span class="comment">/* flags */</span></div><div class="line"><a name="l03205"></a><span class="lineno"> 3205</span>&#160;</div><div class="line"><a name="l03206"></a><span class="lineno"><a class="line" href="group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193da115440f272a5d55518adfc8099acfee3"> 3206</a></span>&#160;        <a class="code" href="group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193da115440f272a5d55518adfc8099acfee3">LWS_WRITE_NO_FIN</a> = 0x40,</div><div class="line"><a name="l03209"></a><span class="lineno"><a class="line" href="group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193da220d8e8652d9b97fb66e476e2a60ffce"> 3209</a></span>&#160;        <a class="code" href="group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193da220d8e8652d9b97fb66e476e2a60ffce">LWS_WRITE_CLIENT_IGNORE_XOR_MASK</a> = 0x80</div><div class="line"><a name="l03213"></a><span class="lineno"> 3213</span>&#160;};</div><div class="line"><a name="l03214"></a><span class="lineno"> 3214</span>&#160;</div><div class="line"><a name="l03215"></a><span class="lineno"> 3215</span>&#160;</div><div class="line"><a name="l03302"></a><span class="lineno"> 3302</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l03303"></a><span class="lineno"> 3303</span>&#160;<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="l03304"></a><span class="lineno"> 3304</span>&#160;          <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="l03305"></a><span class="lineno"> 3305</span>&#160;</div><div class="line"><a name="l03306"></a><span class="lineno"> 3306</span>&#160;<span class="comment">/* helper for case where buffer may be const */</span></div><div class="line"><a name="l03307"></a><span class="lineno"> 3307</span>&#160;<span class="preprocessor">#define lws_write_http(wsi, buf, len) \</span></div><div class="line"><a name="l03308"></a><span class="lineno"> 3308</span>&#160;<span class="preprocessor">        lws_write(wsi, (unsigned char *)(buf), len, LWS_WRITE_HTTP)</span></div><div class="line"><a name="l03309"></a><span class="lineno"> 3309</span>&#160;</div><div class="line"><a name="l03329"></a><span class="lineno"> 3329</span>&#160;</div><div class="line"><a name="l03342"></a><span class="lineno"> 3342</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l03343"></a><span class="lineno"> 3343</span>&#160;<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="l03344"></a><span class="lineno"> 3344</span>&#160;</div><div class="line"><a name="l03358"></a><span class="lineno"> 3358</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l03359"></a><span class="lineno"> 3359</span>&#160;<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="l03360"></a><span class="lineno"> 3360</span>&#160;                                      <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="l03361"></a><span class="lineno"> 3361</span>&#160;</div><div class="line"><a name="l03375"></a><span class="lineno"> 3375</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l03376"></a><span class="lineno"> 3376</span>&#160;<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="l03377"></a><span class="lineno"> 3377</span>&#160;                                      <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="l03378"></a><span class="lineno"> 3378</span>&#160;</div><div class="line"><a name="l03391"></a><span class="lineno"> 3391</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l03392"></a><span class="lineno"> 3392</span>&#160;<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="l03393"></a><span class="lineno"> 3393</span>&#160;                          <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="l03394"></a><span class="lineno"> 3394</span>&#160;</div><div class="line"><a name="l03407"></a><span class="lineno"> 3407</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l03408"></a><span class="lineno"> 3408</span>&#160;<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="l03409"></a><span class="lineno"> 3409</span>&#160;                          <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="l03410"></a><span class="lineno"> 3410</span>&#160;</div><div class="line"><a name="l03424"></a><span class="lineno"> 3424</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l03425"></a><span class="lineno"> 3425</span>&#160;<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="l03426"></a><span class="lineno"> 3426</span>&#160;</div><div class="line"><a name="l03427"></a><span class="lineno"> 3427</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l03428"></a><span class="lineno"> 3428</span>&#160;lws_callback_http_dummy(<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="l03429"></a><span class="lineno"> 3429</span>&#160;                    <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="l03430"></a><span class="lineno"> 3430</span>&#160;</div><div class="line"><a name="l03438"></a><span class="lineno"> 3438</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l03439"></a><span class="lineno"> 3439</span>&#160;<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="l03440"></a><span class="lineno"> 3440</span>&#160;</div><div class="line"><a name="l03462"></a><span class="lineno"> 3462</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">size_t</span></div><div class="line"><a name="l03463"></a><span class="lineno"> 3463</span>&#160;<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="l03465"></a><span class="lineno"> 3465</span>&#160;</div><div class="line"><a name="l03476"></a><span class="lineno"> 3476</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l03477"></a><span class="lineno"> 3477</span>&#160;<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="l03478"></a><span class="lineno"> 3478</span>&#160;</div><div class="line"><a name="l03488"></a><span class="lineno"> 3488</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">void</span></div><div class="line"><a name="l03489"></a><span class="lineno"> 3489</span>&#160;<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="l03490"></a><span class="lineno"> 3490</span>&#160;                               <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="l03491"></a><span class="lineno"> 3491</span>&#160;</div><div class="line"><a name="l03508"></a><span class="lineno"> 3508</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">size_t</span></div><div class="line"><a name="l03509"></a><span class="lineno"> 3509</span>&#160;<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="l03510"></a><span class="lineno"> 3510</span>&#160;</div><div class="line"><a name="l03511"></a><span class="lineno"> 3511</span>&#160;</div><div class="line"><a name="l03520"></a><span class="lineno"> 3520</span>&#160;</div><div class="line"><a name="l03533"></a><span class="lineno"> 3533</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keyword">struct </span>lws *</div><div class="line"><a name="l03534"></a><span class="lineno"> 3534</span>&#160;<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="l03557"></a><span class="lineno"> 3557</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keyword">struct </span>lws *</div><div class="line"><a name="l03558"></a><span class="lineno"> 3558</span>&#160;<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="l03559"></a><span class="lineno"> 3559</span>&#160;                <span class="keyword">const</span> <span class="keywordtype">char</span> *readbuf, <span class="keywordtype">size_t</span> len);</div><div class="line"><a name="l03561"></a><span class="lineno"> 3561</span>&#160;</div><div class="line"><a name="l03567"></a><span class="lineno"> 3567</span>&#160;</div><div class="line"><a name="l03578"></a><span class="lineno"> 3578</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keyword">const</span> <span class="keywordtype">char</span> * LWS_WARN_UNUSED_RESULT</div><div class="line"><a name="l03579"></a><span class="lineno"> 3579</span>&#160;<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="l03580"></a><span class="lineno"> 3580</span>&#160;</div><div class="line"><a name="l03595"></a><span class="lineno"> 3595</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">void</span></div><div class="line"><a name="l03596"></a><span class="lineno"> 3596</span>&#160;<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="l03597"></a><span class="lineno"> 3597</span>&#160;                       <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="l03598"></a><span class="lineno"> 3598</span>&#160;</div><div class="line"><a name="l03609"></a><span class="lineno"> 3609</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keyword">const</span> <span class="keywordtype">char</span> *</div><div class="line"><a name="l03610"></a><span class="lineno"> 3610</span>&#160;<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="l03611"></a><span class="lineno"> 3611</span>&#160;<span class="preprocessor">#ifndef LWS_WITH_ESP8266</span></div><div class="line"><a name="l03612"></a><span class="lineno"> 3612</span>&#160;</div><div class="line"><a name="l03623"></a><span class="lineno"> 3623</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l03624"></a><span class="lineno"> 3624</span>&#160;<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="l03625"></a><span class="lineno"> 3625</span>&#160;                    <span class="keywordtype">size_t</span> addrlen);</div><div class="line"><a name="l03627"></a><span class="lineno"> 3627</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l03628"></a><span class="lineno"> 3628</span>&#160;</div><div class="line"><a name="l03634"></a><span class="lineno"> 3634</span>&#160;</div><div class="line"><a name="l03647"></a><span class="lineno"> 3647</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l03648"></a><span class="lineno"> 3648</span>&#160;<a class="code" href="group__misc.html#ga9f37d0e357de2ab4170723fcdb665d21">lws_snprintf</a>(<span class="keywordtype">char</span> *str, <span class="keywordtype">size_t</span> size, <span class="keyword">const</span> <span class="keywordtype">char</span> *format, ...);</div><div class="line"><a name="l03649"></a><span class="lineno"> 3649</span>&#160;</div><div class="line"><a name="l03661"></a><span class="lineno"> 3661</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l03662"></a><span class="lineno"> 3662</span>&#160;<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="l03670"></a><span class="lineno"> 3670</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span> LWS_WARN_UNUSED_RESULT</div><div class="line"><a name="l03671"></a><span class="lineno"> 3671</span>&#160;<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="l03677"></a><span class="lineno"> 3677</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keyword">const</span> <span class="keywordtype">char</span> * LWS_WARN_UNUSED_RESULT</div><div class="line"><a name="l03678"></a><span class="lineno"> 3678</span>&#160;<a class="code" href="group__misc.html#gac6abfc0b2bd5b2f09281a4432bb2f5f0">lws_get_library_version</a>(<span class="keywordtype">void</span>);</div><div class="line"><a name="l03679"></a><span class="lineno"> 3679</span>&#160;</div><div class="line"><a name="l03686"></a><span class="lineno"> 3686</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">void</span> *</div><div class="line"><a name="l03687"></a><span class="lineno"> 3687</span>&#160;<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="l03688"></a><span class="lineno"> 3688</span>&#160;</div><div class="line"><a name="l03700"></a><span class="lineno"> 3700</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span> LWS_WARN_UNUSED_RESULT</div><div class="line"><a name="l03701"></a><span class="lineno"> 3701</span>&#160;<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="l03702"></a><span class="lineno"> 3702</span>&#160;              <span class="keyword">const</span> <span class="keywordtype">char</span> **path);</div><div class="line"><a name="l03703"></a><span class="lineno"> 3703</span>&#160;</div><div class="line"><a name="l03707"></a><span class="lineno"> 3707</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span></div><div class="line"><a name="l03708"></a><span class="lineno"> 3708</span>&#160;<a class="code" href="group__misc.html#ga33bf2635033710b25f931b57ed663e1e">lws_now_secs</a>(<span class="keywordtype">void</span>);</div><div class="line"><a name="l03709"></a><span class="lineno"> 3709</span>&#160;</div><div class="line"><a name="l03719"></a><span class="lineno"> 3719</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keyword">struct </span>lws_context * LWS_WARN_UNUSED_RESULT</div><div class="line"><a name="l03720"></a><span class="lineno"> 3720</span>&#160;<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="l03721"></a><span class="lineno"> 3721</span>&#160;</div><div class="line"><a name="l03731"></a><span class="lineno"> 3731</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span> LWS_WARN_UNUSED_RESULT</div><div class="line"><a name="l03732"></a><span class="lineno"> 3732</span>&#160;<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="l03733"></a><span class="lineno"> 3733</span>&#160;</div><div class="line"><a name="l03741"></a><span class="lineno"> 3741</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keyword">struct </span>lws * LWS_WARN_UNUSED_RESULT</div><div class="line"><a name="l03742"></a><span class="lineno"> 3742</span>&#160;<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="l03743"></a><span class="lineno"> 3743</span>&#160;</div><div class="line"><a name="l03750"></a><span class="lineno"> 3750</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keyword">struct </span>lws * LWS_WARN_UNUSED_RESULT</div><div class="line"><a name="l03751"></a><span class="lineno"> 3751</span>&#160;<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="l03752"></a><span class="lineno"> 3752</span>&#160;</div><div class="line"><a name="l03753"></a><span class="lineno"> 3753</span>&#160;</div><div class="line"><a name="l03754"></a><span class="lineno"> 3754</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l03755"></a><span class="lineno"> 3755</span>&#160;<span class="comment"> * \deprecated DEPRECATED Note: this is not normally needed as a user api.</span></div><div class="line"><a name="l03756"></a><span class="lineno"> 3756</span>&#160;<span class="comment"> * It&#39;s provided in case it is</span></div><div class="line"><a name="l03757"></a><span class="lineno"> 3757</span>&#160;<span class="comment"> * useful when integrating with other app poll loop service code.</span></div><div class="line"><a name="l03758"></a><span class="lineno"> 3758</span>&#160;<span class="comment"> */</span></div><div class="line"><a name="l03759"></a><span class="lineno"> 3759</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l03760"></a><span class="lineno"> 3760</span>&#160;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="l03761"></a><span class="lineno"> 3761</span>&#160;</div><div class="line"><a name="l03769"></a><span class="lineno"> 3769</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">void</span></div><div class="line"><a name="l03770"></a><span class="lineno"> 3770</span>&#160;<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="l03772"></a><span class="lineno"> 3772</span>&#160;</div><div class="line"><a name="l03778"></a><span class="lineno"> 3778</span>&#160;</div><div class="line"><a name="l03785"></a><span class="lineno"> 3785</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span> LWS_WARN_UNUSED_RESULT</div><div class="line"><a name="l03786"></a><span class="lineno"> 3786</span>&#160;<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="l03787"></a><span class="lineno"> 3787</span>&#160;</div><div class="line"><a name="l03792"></a><span class="lineno"> 3792</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l03793"></a><span class="lineno"> 3793</span>&#160;<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="l03794"></a><span class="lineno"> 3794</span>&#160;</div><div class="line"><a name="l03799"></a><span class="lineno"> 3799</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span></div><div class="line"><a name="l03800"></a><span class="lineno"> 3800</span>&#160;<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="l03801"></a><span class="lineno"> 3801</span>&#160;</div><div class="line"><a name="l03818"></a><span class="lineno"> 3818</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span> LWS_WARN_UNUSED_RESULT</div><div class="line"><a name="l03819"></a><span class="lineno"> 3819</span>&#160;<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="l03820"></a><span class="lineno"> 3820</span>&#160;</div><div class="line"><a name="l03830"></a><span class="lineno"> 3830</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span> LWS_WARN_UNUSED_RESULT</div><div class="line"><a name="l03831"></a><span class="lineno"> 3831</span>&#160;<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="l03832"></a><span class="lineno"> 3832</span>&#160;</div><div class="line"><a name="l03841"></a><span class="lineno"> 3841</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l03842"></a><span class="lineno"> 3842</span>&#160;<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="l03847"></a><span class="lineno"> 3847</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l03848"></a><span class="lineno"> 3848</span>&#160;<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="l03850"></a><span class="lineno"> 3850</span>&#160;</div><div class="line"><a name="l03851"></a><span class="lineno"> 3851</span>&#160;</div><div class="line"><a name="l03857"></a><span class="lineno"> 3857</span>&#160;<span class="preprocessor">#ifdef LWS_SHA1_USE_OPENSSL_NAME</span></div><div class="line"><a name="l03859"></a><span class="lineno"> 3859</span>&#160;<span class="preprocessor">#define lws_SHA1 SHA1</span></div><div class="line"><a name="l03860"></a><span class="lineno"> 3860</span>&#160;<span class="preprocessor">#else</span></div><div class="line"><a name="l03861"></a><span class="lineno"> 3861</span>&#160;</div><div class="line"><a name="l03870"></a><span class="lineno"> 3870</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *</div><div class="line"><a name="l03871"></a><span class="lineno"> 3871</span>&#160;<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="l03872"></a><span class="lineno"> 3872</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l03873"></a><span class="lineno"> 3873</span>&#160;</div><div class="line"><a name="l03883"></a><span class="lineno"> 3883</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l03884"></a><span class="lineno"> 3884</span>&#160;<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="l03894"></a><span class="lineno"> 3894</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l03895"></a><span class="lineno"> 3895</span>&#160;<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="l03897"></a><span class="lineno"> 3897</span>&#160;</div><div class="line"><a name="l03898"></a><span class="lineno"> 3898</span>&#160;</div><div class="line"><a name="l03908"></a><span class="lineno"> 3908</span>&#160;<span class="preprocessor">#ifdef LWS_WITH_CGI</span></div><div class="line"><a name="l03909"></a><span class="lineno"> 3909</span>&#160;<span class="keyword">enum</span> lws_enum_stdinouterr {</div><div class="line"><a name="l03910"></a><span class="lineno"> 3910</span>&#160;        LWS_STDIN = 0,</div><div class="line"><a name="l03911"></a><span class="lineno"> 3911</span>&#160;        LWS_STDOUT = 1,</div><div class="line"><a name="l03912"></a><span class="lineno"> 3912</span>&#160;        LWS_STDERR = 2,</div><div class="line"><a name="l03913"></a><span class="lineno"> 3913</span>&#160;};</div><div class="line"><a name="l03914"></a><span class="lineno"> 3914</span>&#160;</div><div class="line"><a name="l03915"></a><span class="lineno"> 3915</span>&#160;<span class="keyword">enum</span> lws_cgi_hdr_state {</div><div class="line"><a name="l03916"></a><span class="lineno"> 3916</span>&#160;        LCHS_HEADER,</div><div class="line"><a name="l03917"></a><span class="lineno"> 3917</span>&#160;        LCHS_CR1,</div><div class="line"><a name="l03918"></a><span class="lineno"> 3918</span>&#160;        LCHS_LF1,</div><div class="line"><a name="l03919"></a><span class="lineno"> 3919</span>&#160;        LCHS_CR2,</div><div class="line"><a name="l03920"></a><span class="lineno"> 3920</span>&#160;        LCHS_LF2,</div><div class="line"><a name="l03921"></a><span class="lineno"> 3921</span>&#160;        LHCS_PAYLOAD,</div><div class="line"><a name="l03922"></a><span class="lineno"> 3922</span>&#160;        LCHS_SINGLE_0A,</div><div class="line"><a name="l03923"></a><span class="lineno"> 3923</span>&#160;};</div><div class="line"><a name="l03924"></a><span class="lineno"> 3924</span>&#160;</div><div class="line"><a name="l03925"></a><span class="lineno"><a class="line" href="structlws__cgi__args.html"> 3925</a></span>&#160;<span class="keyword">struct </span><a class="code" href="structlws__cgi__args.html">lws_cgi_args</a> {</div><div class="line"><a name="l03926"></a><span class="lineno"><a class="line" href="structlws__cgi__args.html#a4ccc1058e7e914a26eef31ab2ad46aa1"> 3926</a></span>&#160;        <span class="keyword">struct </span>lws **<a class="code" href="structlws__cgi__args.html#a4ccc1058e7e914a26eef31ab2ad46aa1">stdwsi</a>; </div><div class="line"><a name="l03927"></a><span class="lineno"><a class="line" href="structlws__cgi__args.html#adeee220b29aeacc34632c38e50f0f5a5"> 3927</a></span>&#160;        <span class="keyword">enum</span> lws_enum_stdinouterr ch; </div><div class="line"><a name="l03928"></a><span class="lineno"><a class="line" href="structlws__cgi__args.html#a8ac842084688c02f3f94694ef700d8f7"> 3928</a></span>&#160;        <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="l03929"></a><span class="lineno"><a class="line" href="structlws__cgi__args.html#a741c11b9aa05997ec45a3400d7fb7739"> 3929</a></span>&#160;        <span class="keyword">enum</span> lws_cgi_hdr_state hdr_state; </div><div class="line"><a name="l03930"></a><span class="lineno"><a class="line" href="structlws__cgi__args.html#a36e5c256433c187bd0eaa9c1ca667f1d"> 3930</a></span>&#160;        <span class="keywordtype">int</span> <a class="code" href="structlws__cgi__args.html#a36e5c256433c187bd0eaa9c1ca667f1d">len</a>; </div><div class="line"><a name="l03931"></a><span class="lineno"> 3931</span>&#160;};</div><div class="line"><a name="l03932"></a><span class="lineno"> 3932</span>&#160;</div><div class="line"><a name="l03933"></a><span class="lineno"> 3933</span>&#160;</div><div class="line"><a name="l03943"></a><span class="lineno"> 3943</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l03944"></a><span class="lineno"> 3944</span>&#160;<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="l03945"></a><span class="lineno"> 3945</span>&#160;        <span class="keywordtype">int</span> script_uri_path_len, <span class="keywordtype">int</span> timeout_secs,</div><div class="line"><a name="l03946"></a><span class="lineno"> 3946</span>&#160;        <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="l03947"></a><span class="lineno"> 3947</span>&#160;</div><div class="line"><a name="l03953"></a><span class="lineno"> 3953</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l03954"></a><span class="lineno"> 3954</span>&#160;<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="l03955"></a><span class="lineno"> 3955</span>&#160;</div><div class="line"><a name="l03961"></a><span class="lineno"> 3961</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l03962"></a><span class="lineno"> 3962</span>&#160;<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="l03963"></a><span class="lineno"> 3963</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l03964"></a><span class="lineno"> 3964</span>&#160;</div><div class="line"><a name="l03966"></a><span class="lineno"> 3966</span>&#160;</div><div class="line"><a name="l03983"></a><span class="lineno"> 3983</span>&#160;</div><div class="line"><a name="l03989"></a><span class="lineno"><a class="line" href="structlws__plat__file__ops.html"> 3989</a></span>&#160;<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="l03990"></a><span class="lineno"><a class="line" href="structlws__plat__file__ops.html#ad37a97abc68d0af967cef874f4d8df32"> 3990</a></span>&#160;        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="l03991"></a><span class="lineno"> 3991</span>&#160;                                <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> *filelen, <span class="keywordtype">int</span> flags);</div><div class="line"><a name="l03995"></a><span class="lineno"><a class="line" href="structlws__plat__file__ops.html#a034ec96f2fbaf52b4aa3e82d20795f7b"> 3995</a></span>&#160;        int (*close)(<span class="keyword">struct </span>lws *wsi, lws_filefd_type fd);</div><div class="line"><a name="l03997"></a><span class="lineno"><a class="line" href="structlws__plat__file__ops.html#abfcda19b003dcc13c61ff9e2bb4ff869"> 3997</a></span>&#160;        <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="l03998"></a><span class="lineno"> 3998</span>&#160;                                  <span class="keywordtype">long</span> offset_from_cur_pos);</div><div class="line"><a name="l04000"></a><span class="lineno"><a class="line" href="structlws__plat__file__ops.html#a01f483807a9862736b17ba9ed5110c40"> 4000</a></span>&#160;        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="l04001"></a><span class="lineno"> 4001</span>&#160;                    <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="l04003"></a><span class="lineno"><a class="line" href="structlws__plat__file__ops.html#a1fae8330ee94649a3551e31a30809793"> 4003</a></span>&#160;        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="l04004"></a><span class="lineno"> 4004</span>&#160;                     <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="l04007"></a><span class="lineno"> 4007</span>&#160;        <span class="comment">/* Add new things just above here ---^</span></div><div class="line"><a name="l04008"></a><span class="lineno"> 4008</span>&#160;<span class="comment">         * This is part of the ABI, don&#39;t needlessly break compatibility */</span></div><div class="line"><a name="l04009"></a><span class="lineno"> 4009</span>&#160;};</div><div class="line"><a name="l04010"></a><span class="lineno"> 4010</span>&#160;</div><div class="line"><a name="l04016"></a><span class="lineno"> 4016</span>&#160;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="l04017"></a><span class="lineno"> 4017</span>&#160;<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="l04018"></a><span class="lineno"> 4018</span>&#160;</div><div class="line"><a name="l04027"></a><span class="lineno"> 4027</span>&#160;<span class="keyword">static</span> LWS_INLINE lws_filefd_type LWS_WARN_UNUSED_RESULT</div><div class="line"><a name="l04028"></a><span class="lineno"> 4028</span>&#160;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="l04029"></a><span class="lineno"> 4029</span>&#160;                   <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> *filelen, <span class="keywordtype">int</span> flags)</div><div class="line"><a name="l04030"></a><span class="lineno"> 4030</span>&#160;{</div><div class="line"><a name="l04031"></a><span class="lineno"> 4031</span>&#160;        <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))-&gt;<a class="code" href="structlws__plat__file__ops.html#ad37a97abc68d0af967cef874f4d8df32">open</a>(wsi, filename,</div><div class="line"><a name="l04032"></a><span class="lineno"> 4032</span>&#160;                                                    filelen, flags);</div><div class="line"><a name="l04033"></a><span class="lineno"> 4033</span>&#160;}</div><div class="line"><a name="l04034"></a><span class="lineno"> 4034</span>&#160;</div><div class="line"><a name="l04041"></a><span class="lineno"> 4041</span>&#160;<span class="keyword">static</span> LWS_INLINE <span class="keywordtype">int</span></div><div class="line"><a name="l04042"></a><span class="lineno"> 4042</span>&#160;lws_plat_file_close(<span class="keyword">struct</span> lws *wsi, lws_filefd_type fd)</div><div class="line"><a name="l04043"></a><span class="lineno"> 4043</span>&#160;{</div><div class="line"><a name="l04044"></a><span class="lineno"> 4044</span>&#160;        <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))-&gt;<a class="code" href="structlws__plat__file__ops.html#a034ec96f2fbaf52b4aa3e82d20795f7b">close</a>(wsi, fd);</div><div class="line"><a name="l04045"></a><span class="lineno"> 4045</span>&#160;}</div><div class="line"><a name="l04046"></a><span class="lineno"> 4046</span>&#160;</div><div class="line"><a name="l04054"></a><span class="lineno"> 4054</span>&#160;<span class="keyword">static</span> LWS_INLINE <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span></div><div class="line"><a name="l04055"></a><span class="lineno"> 4055</span>&#160;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="l04056"></a><span class="lineno"> 4056</span>&#160;{</div><div class="line"><a name="l04057"></a><span class="lineno"> 4057</span>&#160;        <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))-&gt;<a class="code" href="structlws__plat__file__ops.html#abfcda19b003dcc13c61ff9e2bb4ff869">seek_cur</a>(wsi, fd, offset);</div><div class="line"><a name="l04058"></a><span class="lineno"> 4058</span>&#160;}</div><div class="line"><a name="l04068"></a><span class="lineno"> 4068</span>&#160;<span class="keyword">static</span> LWS_INLINE <span class="keywordtype">int</span> LWS_WARN_UNUSED_RESULT</div><div class="line"><a name="l04069"></a><span class="lineno"> 4069</span>&#160;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="l04070"></a><span class="lineno"> 4070</span>&#160;                   <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="l04071"></a><span class="lineno"> 4071</span>&#160;{</div><div class="line"><a name="l04072"></a><span class="lineno"> 4072</span>&#160;        <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))-&gt;<a class="code" href="structlws__plat__file__ops.html#a01f483807a9862736b17ba9ed5110c40">read</a>(wsi, fd, amount, buf,</div><div class="line"><a name="l04073"></a><span class="lineno"> 4073</span>&#160;                                                        len);</div><div class="line"><a name="l04074"></a><span class="lineno"> 4074</span>&#160;}</div><div class="line"><a name="l04084"></a><span class="lineno"> 4084</span>&#160;<span class="keyword">static</span> LWS_INLINE <span class="keywordtype">int</span> LWS_WARN_UNUSED_RESULT</div><div class="line"><a name="l04085"></a><span class="lineno"> 4085</span>&#160;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="l04086"></a><span class="lineno"> 4086</span>&#160;                    <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="l04087"></a><span class="lineno"> 4087</span>&#160;{</div><div class="line"><a name="l04088"></a><span class="lineno"> 4088</span>&#160;        <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))-&gt;<a class="code" href="structlws__plat__file__ops.html#a1fae8330ee94649a3551e31a30809793">write</a>(wsi, fd, amount, buf,</div><div class="line"><a name="l04089"></a><span class="lineno"> 4089</span>&#160;                                                         len);</div><div class="line"><a name="l04090"></a><span class="lineno"> 4090</span>&#160;}</div><div class="line"><a name="l04092"></a><span class="lineno"> 4092</span>&#160;</div><div class="line"><a name="l04124"></a><span class="lineno"> 4124</span>&#160;<span class="preprocessor">#ifdef LWS_WITH_SMTP</span></div><div class="line"><a name="l04125"></a><span class="lineno"> 4125</span>&#160;</div><div class="line"><a name="l04127"></a><span class="lineno"><a class="line" href="group__smtp.html#ga116be79bf44f9dc2a97f46e051fe4dc0"> 4127</a></span>&#160;<span class="keyword">enum</span> <a class="code" href="group__smtp.html#ga116be79bf44f9dc2a97f46e051fe4dc0">lwsgs_smtp_states</a> {</div><div class="line"><a name="l04128"></a><span class="lineno"><a class="line" href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a29e5b0ecf75375b5a643faa3d6222b7c"> 4128</a></span>&#160;        <a class="code" href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a29e5b0ecf75375b5a643faa3d6222b7c">LGSSMTP_IDLE</a>, </div><div class="line"><a name="l04129"></a><span class="lineno"><a class="line" href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0ab89442b7a3ca2b94c3cdcf33756eb933"> 4129</a></span>&#160;        <a class="code" href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0ab89442b7a3ca2b94c3cdcf33756eb933">LGSSMTP_CONNECTING</a>, </div><div class="line"><a name="l04130"></a><span class="lineno"><a class="line" href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0ab61778f70ecac007b334bb14942eb41d"> 4130</a></span>&#160;        <a class="code" href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0ab61778f70ecac007b334bb14942eb41d">LGSSMTP_CONNECTED</a>, </div><div class="line"><a name="l04131"></a><span class="lineno"><a class="line" href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a1dfec948a864205cec875f63cbe0d4ad"> 4131</a></span>&#160;        <a class="code" href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a1dfec948a864205cec875f63cbe0d4ad">LGSSMTP_SENT_HELO</a>, </div><div class="line"><a name="l04132"></a><span class="lineno"><a class="line" href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a929bb4623ff3f585108aba2a1b047fab"> 4132</a></span>&#160;        <a class="code" href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a929bb4623ff3f585108aba2a1b047fab">LGSSMTP_SENT_FROM</a>, </div><div class="line"><a name="l04133"></a><span class="lineno"><a class="line" href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0aae20a0cb95b97a70f6b45d0ed2d5be83"> 4133</a></span>&#160;        <a class="code" href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0aae20a0cb95b97a70f6b45d0ed2d5be83">LGSSMTP_SENT_TO</a>, </div><div class="line"><a name="l04134"></a><span class="lineno"><a class="line" href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a85e3c452950c09a79086bff4b9be5c14"> 4134</a></span>&#160;        <a class="code" href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a85e3c452950c09a79086bff4b9be5c14">LGSSMTP_SENT_DATA</a>, </div><div class="line"><a name="l04135"></a><span class="lineno"><a class="line" href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a38fba41f28d754e38079b31418a86a69"> 4135</a></span>&#160;        <a class="code" href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a38fba41f28d754e38079b31418a86a69">LGSSMTP_SENT_BODY</a>, </div><div class="line"><a name="l04136"></a><span class="lineno"><a class="line" href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a2c2ed16ffc572326e3040684084b21d5"> 4136</a></span>&#160;        <a class="code" href="group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a2c2ed16ffc572326e3040684084b21d5">LGSSMTP_SENT_QUIT</a>, </div><div class="line"><a name="l04137"></a><span class="lineno"> 4137</span>&#160;};</div><div class="line"><a name="l04138"></a><span class="lineno"> 4138</span>&#160;</div><div class="line"><a name="l04140"></a><span class="lineno"><a class="line" href="structlws__email.html"> 4140</a></span>&#160;<span class="keyword">struct </span><a class="code" href="structlws__email.html">lws_email</a> {</div><div class="line"><a name="l04141"></a><span class="lineno"><a class="line" href="structlws__email.html#add1341456045382c183f4c763bdea6bc"> 4141</a></span>&#160;        <span class="keywordtype">void</span> *<a class="code" href="structlws__email.html#add1341456045382c183f4c763bdea6bc">data</a>;</div><div class="line"><a name="l04143"></a><span class="lineno"><a class="line" href="structlws__email.html#ab5fbf121195a8e67509c78a42cfbe168"> 4143</a></span>&#160;        uv_loop_t *<a class="code" href="structlws__email.html#ab5fbf121195a8e67509c78a42cfbe168">loop</a>;</div><div class="line"><a name="l04146"></a><span class="lineno"><a class="line" href="structlws__email.html#a472ae23fc9fca6599e5c512bc21458d2"> 4146</a></span>&#160;        <span class="keywordtype">char</span> email_smtp_ip[32]; </div><div class="line"><a name="l04147"></a><span class="lineno"><a class="line" href="structlws__email.html#a939e5d7ee0339a16de73bde71ab4d4d9"> 4147</a></span>&#160;        <span class="keywordtype">char</span> email_helo[32];    </div><div class="line"><a name="l04148"></a><span class="lineno"><a class="line" href="structlws__email.html#af7f0ae934347d81071f63a963301f9e2"> 4148</a></span>&#160;        <span class="keywordtype">char</span> email_from[100];   </div><div class="line"><a name="l04149"></a><span class="lineno"><a class="line" href="structlws__email.html#a6453a8b92b3de6d2c2101af3edce685e"> 4149</a></span>&#160;        <span class="keywordtype">char</span> email_to[100];     </div><div class="line"><a name="l04151"></a><span class="lineno"><a class="line" href="structlws__email.html#a7bbc1964889c984b3da723c86a210e05"> 4151</a></span>&#160;        <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="l04154"></a><span class="lineno"> 4154</span>&#160;        <span class="comment">/* Fill all the callbacks before init */</span></div><div class="line"><a name="l04155"></a><span class="lineno"> 4155</span>&#160;</div><div class="line"><a name="l04156"></a><span class="lineno"><a class="line" href="structlws__email.html#ad8dc60353ee246d84dd59ec0591e9719"> 4156</a></span>&#160;        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="l04161"></a><span class="lineno"><a class="line" href="structlws__email.html#a39ef6263d58eb40cca417c8697b227d8"> 4161</a></span>&#160;        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="l04166"></a><span class="lineno"><a class="line" href="structlws__email.html#a2aff78c8e04db243052aa91b4d87e987"> 4166</a></span>&#160;        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="l04172"></a><span class="lineno"> 4172</span>&#160;        <span class="comment">/* private things */</span></div><div class="line"><a name="l04173"></a><span class="lineno"><a class="line" href="structlws__email.html#a77723e2f2b940b1c879ef5e1cd88c2be"> 4173</a></span>&#160;        uv_timer_t <a class="code" href="structlws__email.html#a77723e2f2b940b1c879ef5e1cd88c2be">timeout_email</a>; </div><div class="line"><a name="l04174"></a><span class="lineno"><a class="line" href="structlws__email.html#ac6115d3cbef2e8bac62cc00895bf5fd3"> 4174</a></span>&#160;        <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="l04175"></a><span class="lineno"><a class="line" href="structlws__email.html#a5f53d4c5a1e34b0dcaa8787e2eabb1b3"> 4175</a></span>&#160;        uv_connect_t <a class="code" href="structlws__email.html#a5f53d4c5a1e34b0dcaa8787e2eabb1b3">email_connect_req</a>; </div><div class="line"><a name="l04176"></a><span class="lineno"><a class="line" href="structlws__email.html#a01f31934166dc6d01e8a375012f8ad1e"> 4176</a></span>&#160;        uv_tcp_t <a class="code" href="structlws__email.html#a01f31934166dc6d01e8a375012f8ad1e">email_client</a>; </div><div class="line"><a name="l04177"></a><span class="lineno"><a class="line" href="structlws__email.html#a9747ca85597788c2d118d287df47b7c1"> 4177</a></span>&#160;        time_t <a class="code" href="structlws__email.html#a9747ca85597788c2d118d287df47b7c1">email_connect_started</a>; </div><div class="line"><a name="l04178"></a><span class="lineno"><a class="line" href="structlws__email.html#a8f34ec0643a817be67ef4276aeb7fb82"> 4178</a></span>&#160;        <span class="keywordtype">char</span> <a class="code" href="structlws__email.html#a8f34ec0643a817be67ef4276aeb7fb82">email_buf</a>[256]; </div><div class="line"><a name="l04179"></a><span class="lineno"><a class="line" href="structlws__email.html#a6fff03c5a5d369a2aa3cab0c897b1bed"> 4179</a></span>&#160;        <span class="keywordtype">char</span> *<a class="code" href="structlws__email.html#a6fff03c5a5d369a2aa3cab0c897b1bed">content</a>; </div><div class="line"><a name="l04180"></a><span class="lineno"> 4180</span>&#160;};</div><div class="line"><a name="l04181"></a><span class="lineno"> 4181</span>&#160;</div><div class="line"><a name="l04191"></a><span class="lineno"> 4191</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">int</span></div><div class="line"><a name="l04192"></a><span class="lineno"> 4192</span>&#160;<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="l04193"></a><span class="lineno"> 4193</span>&#160;</div><div class="line"><a name="l04202"></a><span class="lineno"> 4202</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">void</span></div><div class="line"><a name="l04203"></a><span class="lineno"> 4203</span>&#160;<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="l04211"></a><span class="lineno"> 4211</span>&#160;LWS_VISIBLE LWS_EXTERN <span class="keywordtype">void</span></div><div class="line"><a name="l04212"></a><span class="lineno"> 4212</span>&#160;<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="l04213"></a><span class="lineno"> 4213</span>&#160;</div><div class="line"><a name="l04214"></a><span class="lineno"> 4214</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l04215"></a><span class="lineno"> 4215</span>&#160;</div><div class="line"><a name="l04216"></a><span class="lineno"> 4216</span>&#160;</div><div class="line"><a name="l04217"></a><span class="lineno"> 4217</span>&#160;<span class="preprocessor">#ifdef __cplusplus</span></div><div class="line"><a name="l04218"></a><span class="lineno"> 4218</span>&#160;}</div><div class="line"><a name="l04219"></a><span class="lineno"> 4219</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l04220"></a><span class="lineno"> 4220</span>&#160;</div><div class="line"><a name="l04221"></a><span class="lineno"> 4221</span>&#160;<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:3922</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:3925</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:1294</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>
@@ -75,15 +75,15 @@ $(document).ready(function(){initNavTree('libwebsockets_8h_source.html','');});
 <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:898</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:1923</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:3180</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:4127</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:3183</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:4130</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:236</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:1958</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:3203</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:4138</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:2023</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:4000</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:1961</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:3206</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:4141</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:2026</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:4003</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:663</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:813</div></div>
@@ -103,71 +103,71 @@ $(document).ready(function(){initNavTree('libwebsockets_8h_source.html','');});
 <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:747</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:4158</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:4161</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:1434</div></div>
-<div class="ttc" id="structlws__client__connect__info_html_a065063b5117ecd0a59567c97f04bda2e"><div class="ttname"><a href="structlws__client__connect__info.html#a065063b5117ecd0a59567c97f04bda2e">lws_client_connect_info::pwsi</a></div><div class="ttdeci">struct lws ** pwsi</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:2030</div></div>
+<div class="ttc" id="structlws__client__connect__info_html_a065063b5117ecd0a59567c97f04bda2e"><div class="ttname"><a href="structlws__client__connect__info.html#a065063b5117ecd0a59567c97f04bda2e">lws_client_connect_info::pwsi</a></div><div class="ttdeci">struct lws ** pwsi</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:2033</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:781</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:2002</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:2005</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:582</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:1390</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:4174</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:4177</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:553</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:593</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:1494</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:2509</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:2512</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:1675</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:922</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:1912</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:2828</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:4132</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:2831</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:4135</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:1465</div></div>
 <div class="ttc" id="group__client_html_ga0c966136905f467816307cfba6deb5fd"><div class="ttname"><a href="group__client.html#ga0c966136905f467816307cfba6deb5fd">lws_client_connect_via_info</a></div><div class="ttdeci">LWS_VISIBLE LWS_EXTERN struct lws * lws_client_connect_via_info(struct lws_client_connect_info *ccinfo)</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:1942</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:3923</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:3926</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:868</div></div>
 <div class="ttc" id="group__httpft_html_gab4da87a4800413f15e7aba649fb1d77c"><div class="ttname"><a href="group__httpft.html#gab4da87a4800413f15e7aba649fb1d77c">lws_get_mimetype</a></div><div class="ttdeci">LWS_VISIBLE LWS_EXTERN const char * lws_get_mimetype(const char *file, const struct lws_http_mount *m)</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:1436</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:1956</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:1959</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:1693</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:761</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:1561</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:609</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:2448</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:2451</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:1285</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:3170</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:3173</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:959</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:951</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:2008</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:2011</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:948</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:1680</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:2440</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:2443</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:1616</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:1510</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__context__creation__info_html_a33a1a25a7df3793f59047e20dd580078"><div class="ttname"><a href="structlws__context__creation__info.html#a33a1a25a7df3793f59047e20dd580078">lws_context_creation_info::ws_ping_pong_interval</a></div><div class="ttdeci">unsigned short ws_ping_pong_interval</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1695</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:1395</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:3174</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:1998</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:1994</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:3177</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:2001</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:1997</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:1442</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:2010</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:2013</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:4125</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:4128</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:1908</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:2452</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:2455</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:561</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:1993</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:1996</div></div>
 <div class="ttc" id="group__context-and-vhost_html_gga41c2d763f78cc248df3b9f8645dbd2a5a87a824b2e812f4c3e7f2c4a1ea4f8abd"><div class="ttname"><a href="group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a87a824b2e812f4c3e7f2c4a1ea4f8abd">LWS_SERVER_OPTION_UV_NO_SIGSEGV_SIGFPE_SPIN</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1540</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:1185</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:879</div></div>
@@ -190,21 +190,21 @@ $(document).ready(function(){initNavTree('libwebsockets_8h_source.html','');});
 <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:1394</div></div>
 <div class="ttc" id="structlws__http__mount_html_a0109baf93f23c07c824c997c3533ee44"><div class="ttname"><a href="structlws__http__mount.html#a0109baf93f23c07c824c997c3533ee44">lws_http_mount::mount_next</a></div><div class="ttdeci">const struct lws_http_mount * mount_next</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1934</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:2012</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:2015</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:719</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:906</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:3925</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:1949</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:3928</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:1952</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:712</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:793</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:4140</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:4143</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:891</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:3206</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:2450</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:3209</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:2453</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:1404</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:1636</div></div>
@@ -217,26 +217,26 @@ $(document).ready(function(){initNavTree('libwebsockets_8h_source.html','');});
 <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:1097</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:1619</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:2006</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:2009</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:419</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:2016</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:2019</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:1191</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:928</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:2014</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:1965</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:2017</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:1968</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:1672</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:768</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:4148</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:4151</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:1119</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:764</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:2026</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:2019</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:2029</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:2022</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:4171</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:4174</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:664</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>
@@ -244,26 +244,26 @@ $(document).ready(function(){initNavTree('libwebsockets_8h_source.html','');});
 <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:1410</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:4175</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:4178</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:1499</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:3992</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:3995</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:1406</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:238</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:4126</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:4129</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:2000</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:2003</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:1458</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:1627</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:2438</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:2441</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:530</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:1945</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:1948</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:1911</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:1966</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:3177</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:1969</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:3180</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:1517</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:417</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:1922</div></div>
@@ -287,7 +287,7 @@ $(document).ready(function(){initNavTree('libwebsockets_8h_source.html','');});
 <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:239</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:1586</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:1657</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:1954</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:1957</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:1924</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:1443</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:431</div></div>
@@ -305,16 +305,16 @@ $(document).ready(function(){initNavTree('libwebsockets_8h_source.html','');});
 <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__usercb_html_ggad62860e19975ba4c4af401c3cdb6abf7aa5cc921b7697743017a533822a3d556a"><div class="ttname"><a href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aa5cc921b7697743017a533822a3d556a">LWS_CALLBACK_HTTP_PMO</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1004</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:1538</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:4170</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:4173</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:1508</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:1639</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:2439</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:2442</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:237</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:1289</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:571</div></div>
 <div class="ttc" id="structlws__context__creation__info_html_a6b059b7ee248cba72a3a4fd6141b0b34"><div class="ttname"><a href="structlws__context__creation__info.html#a6b059b7ee248cba72a3a4fd6141b0b34">lws_context_creation_info::reject_service_keywords</a></div><div class="ttdeci">const struct lws_protocol_vhost_options * reject_service_keywords</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1711</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:4124</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:4127</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:1520</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:844</div></div>
 <div class="ttc" id="group__misc_html_ga9f37d0e357de2ab4170723fcdb665d21"><div class="ttname"><a href="group__misc.html#ga9f37d0e357de2ab4170723fcdb665d21">lws_snprintf</a></div><div class="ttdeci">LWS_VISIBLE LWS_EXTERN int lws_snprintf(char *str, size_t size, const char *format,...)</div></div>
@@ -326,7 +326,7 @@ $(document).ready(function(){initNavTree('libwebsockets_8h_source.html','');});
 <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:1466</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:558</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:4172</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:4175</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:1677</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:1531</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:418</div></div>
@@ -344,12 +344,12 @@ $(document).ready(function(){initNavTree('libwebsockets_8h_source.html','');});
 <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:1623</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:1440</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:1609</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:2830</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:2833</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:1282</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:4130</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:4133</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:1605</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:1652</div></div>
@@ -363,36 +363,37 @@ $(document).ready(function(){initNavTree('libwebsockets_8h_source.html','');});
 <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:1447</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:1108</div></div>
 <div class="ttc" id="structlws__context__creation__info_html_a8ca0ec6b8675c13849bbdcdc0d50c9a3"><div class="ttname"><a href="structlws__context__creation__info.html#a8ca0ec6b8675c13849bbdcdc0d50c9a3">lws_context_creation_info::headers</a></div><div class="ttdeci">const struct lws_protocol_vhost_options * headers</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1707</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:2627</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:2630</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:1666</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:2004</div></div>
+<div class="ttc" id="structlws__http__mount_html_a2f6c7dbc2d714b7259c67b7744d4ff98"><div class="ttname"><a href="structlws__http__mount.html#a2f6c7dbc2d714b7259c67b7744d4ff98">lws_http_mount::basic_auth_login_file</a></div><div class="ttdeci">const char * basic_auth_login_file</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1945</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:2007</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:1117</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:597</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:3927</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:3930</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:1567</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:3986</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:3989</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__usercb_html_ggad62860e19975ba4c4af401c3cdb6abf7aeb0cec65ec82a713cd01e9ca9aeeb5e6"><div class="ttname"><a href="group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aeb0cec65ec82a713cd01e9ca9aeeb5e6">LWS_CALLBACK_CLIENT_HTTP_WRITEABLE</a></div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1009</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:2825</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:2828</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:820</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:555</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:564</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:4173</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:4176</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:416</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:668</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:3987</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:3169</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:3990</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:3172</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:1194</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:3997</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:4000</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:2826</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:2829</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:569</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:1938</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:1109</div></div>
@@ -403,7 +404,7 @@ $(document).ready(function(){initNavTree('libwebsockets_8h_source.html','');});
 <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:745</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:1192</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:4129</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:4132</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:434</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:1193</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:1691</div></div>
@@ -419,57 +420,57 @@ $(document).ready(function(){initNavTree('libwebsockets_8h_source.html','');});
 <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:1920</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:1951</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:1954</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:1513</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:2453</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:2456</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:2507</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:2510</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:724</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:2451</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:4176</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:2454</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:4179</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:1581</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:4137</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:1996</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:3994</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:4140</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:1999</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:3997</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:1310</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:532</div></div>
 <div class="ttc" id="group__client_html_ga715efffc0c4e8fbf72a4293008eb2187"><div class="ttname"><a href="group__client.html#ga715efffc0c4e8fbf72a4293008eb2187">lws_http_client_http_response</a></div><div class="ttdeci">LWS_VISIBLE LWS_EXTERN unsigned int lws_http_client_http_response(struct lws *wsi)</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:4163</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:4166</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:1926</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:1613</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:4133</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:3192</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:2508</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:4136</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:3195</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:2511</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:1393</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:1408</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:1590</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:2441</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:2444</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:726</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:1909</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:737</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:2447</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:2450</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:936</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:1596</div></div>
-<div class="ttc" id="group__client_html_ga96f3dbad54b2853969cfa933d66871ce"><div class="ttname"><a href="group__client.html#ga96f3dbad54b2853969cfa933d66871ce">lws_client_connect_ssl_connection_flags</a></div><div class="ttdeci">lws_client_connect_ssl_connection_flags</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1983</div></div>
+<div class="ttc" id="group__client_html_ga96f3dbad54b2853969cfa933d66871ce"><div class="ttname"><a href="group__client.html#ga96f3dbad54b2853969cfa933d66871ce">lws_client_connect_ssl_connection_flags</a></div><div class="ttdeci">lws_client_connect_ssl_connection_flags</div><div class="ttdef"><b>Definition:</b> libwebsockets.h:1986</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:1607</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:2028</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:2031</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:1043</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:1533</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:605</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:4128</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:4131</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:1391</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:1536</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:4131</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:2847</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:4134</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:2850</div></div>
 </div><!-- fragment --></div><!-- contents -->
 </div><!-- doc-content -->
 <!-- start footer part -->
diff --git a/doc/html/md_README_8build.html b/doc/html/md_README_8build.html
new file mode 100644 (file)
index 0000000..5eec3ba
--- /dev/null
@@ -0,0 +1,235 @@
+<!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.12"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<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);
+</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.12 -->
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',false,false,'search.php','Search');
+});
+</script>
+<div id="main-nav"></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_8build.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"><h1><a class="anchor" id="cm"></a>
+Introduction to CMake</h1>
+<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>
+<h1><a class="anchor" id="build1"></a>
+Building the library and test apps</h1>
+<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>
+<h1><a class="anchor" id="bu"></a>
+Building on Unix:</h1>
+<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">$ cd /path/to/src</div><div class="line">$ mkdir build</div><div class="line">$ cd build</div><div class="line">$ cmake ..</div></div><!-- fragment --></li>
+<li>Finally you can build using the generated Makefile: <div class="fragment"><div class="line">$ make &amp;&amp; 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 &ndash;prefix= with autotools. It defaults to /usr/local. You can do this by, eg </p><div class="fragment"><div class="line">$ 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">-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">$ cmake .. -DOPENSSL_ROOT_DIR=/usr/local/ssl \</div><div class="line">         -DCMAKE_INCLUDE_DIRECTORIES_PROJECT_BEFORE=/usr/local/ssl \</div><div class="line">         -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">$ 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">cmake .. -DLWS_WITH_HTTP2=1 -DLWS_OPENSSL_INCLUDE_DIRS=/usr/local/include/openssl -DLWS_OPENSSL_LIBRARIES=&quot;/usr/local/lib64/libssl.so;/usr/local/lib64/libcrypto.so&quot;</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">$ cmake .. -DCMAKE_BUILD_TYPE=DEBUG</div></div><!-- fragment --><p><b>NOTE6</b> To build on Solaris the linker needs to be informed to use lib socket and libnsl, and only builds in 64bit mode.</p>
+<div class="fragment"><div class="line">$ cmake .. -DCMAKE_C_FLAGS=-m64 -DCMAKE_EXE_LINKER_FLAGS=&quot;-lsocket -lnsl&quot;</div></div><!-- fragment --><ol type="1">
+<li>Finally you can build using the generated Makefile:</li>
+</ol>
+<div class="fragment"><div class="line">$ make</div></div><!-- fragment --><h1><a class="anchor" id="cmq"></a>
+Quirk of cmake</h1>
+<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>
+<h1><a class="anchor" id="cmw"></a>
+Building on Windows (Visual Studio)</h1>
+<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 &lt;OpenSSL install="" location&gt;=""&gt;.cfg</p>
+</li>
+<li>Generate the Visual studio project by opening the Visual Studio cmd prompt:</li>
+</ol>
+<div class="fragment"><div class="line">cd &lt;path to src&gt;</div><div class="line">md build</div><div class="line">cd build</div><div class="line">cmake -G &quot;Visual Studio 10&quot; ..</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>&lt;path to src&gt;/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>
+<h1><a class="anchor" id="cmwmgw"></a>
+Building on Windows (MinGW)</h1>
+<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">#if(_WIN32_WINNT &gt;= 0x0600)</div><div class="line"></div><div class="line">typedef struct pollfd {</div><div class="line"></div><div class="line">        SOCKET  fd;</div><div class="line">        SHORT   events;</div><div class="line">        SHORT   revents;</div><div class="line"></div><div class="line">} WSAPOLLFD, *PWSAPOLLFD, FAR *LPWSAPOLLFD;</div><div class="line"></div><div class="line">WINSOCK_API_LINKAGE int WSAAPI WSAPoll(LPWSAPOLLFD fdArray, ULONG fds, INT timeout);</div><div class="line"></div><div class="line">#endif // (_WIN32_WINNT &gt;= 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 &lt;OpenSSL install="" location&gt;=""&gt;.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">$ cd /drive/path/to/src</div><div class="line">$ mkdir build</div><div class="line">$ cd build</div><div class="line">$ cmake -G &quot;MSYS Makefiles&quot; -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">$ cmake -G &quot;MSYS Makefiles&quot; -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">$ make</div><div class="line">$ make install</div></div><!-- fragment --><h1><a class="anchor" id="mbed3"></a>
+Building on mbed3</h1>
+<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>
+<h1><a class="anchor" id="cmco"></a>
+Setting compile options</h1>
+<p>To set compile time flags you can either use one of the CMake gui applications or do it via the command line.</p>
+<h2><a class="anchor" id="cmcocl"></a>
+Command line</h2>
+<p>To list available options (omit 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><a class="anchor" id="cmcoug"></a>
+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><a class="anchor" id="cmcowg"></a>
+Windows GUI</h2>
+<p>On windows CMake comes with a gui application: Start -&gt; Programs -&gt; CMake -&gt; CMake (cmake-gui)</p>
+<h1><a class="anchor" id="wolf"></a>
+wolfSSL/CyaSSL replacement for OpenSSL</h1>
+<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>
+<h1><a class="anchor" id="wolf1"></a>
+Compiling libwebsockets with wolfSSL</h1>
+<div class="fragment"><div class="line">cmake .. -DLWS_USE_WOLFSSL=1 \</div><div class="line">         -DLWS_WOLFSSL_INCLUDE_DIRS=/path/to/wolfssl \</div><div class="line">         -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>
+<h1><a class="anchor" id="cya"></a>
+Compiling libwebsockets with CyaSSL</h1>
+<div class="fragment"><div class="line">cmake .. -DLWS_USE_CYASSL=1 \</div><div class="line">         -DLWS_CYASSL_INCLUDE_DIRS=/path/to/cyassl \</div><div class="line">         -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>
+<h1><a class="anchor" id="extplugins"></a>
+Building plugins outside of lws itself</h1>
+<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">cd ./plugin-standalone</div><div class="line">mkdir build</div><div class="line">cd build</div><div class="line">cmake ..</div><div class="line">make &amp;&amp; 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">lwsts[21257]:   Plugins:</div><div class="line">lwsts[21257]:    libprotocol_dumb_increment.so</div><div class="line">lwsts[21257]:    libprotocol_example_standalone.so</div><div class="line">lwsts[21257]:    libprotocol_lws_mirror.so</div><div class="line">lwsts[21257]:    libprotocol_lws_server_status.so</div><div class="line">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-&gt;pvo or for lwsws, in the JSON config.</p>
+<h1><a class="anchor" id="http2rp"></a>
+Reproducing HTTP2.0 tests</h1>
+<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">lwsts[4752]:  Compiled with OpenSSL support</div><div class="line">lwsts[4752]:  Using SSL mode</div><div class="line">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">$ nghttp -nvasu http://localhost:7681/test.htm</div></div><!-- fragment --><p> For SSL / ALPN HTTP2.0 upgrade </p><div class="fragment"><div class="line">$ nghttp -nvas https://localhost:7681/test.html</div></div><!-- fragment --><h1><a class="anchor" id="cross"></a>
+Cross compiling</h1>
+<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">$ cmake .. -DCMAKE_INSTALL_PREFIX:PATH=/usr \</div><div class="line">         -DCMAKE_TOOLCHAIN_FILE=../cross-arm-linux-gnueabihf.cmake \</div><div class="line">         -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>
+<h1><a class="anchor" id="mem"></a>
+Memory efficiency</h1>
+<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">$ ./configure --without-client --without-extensions --disable-debug --without-daemonize</div><div class="line"></div><div class="line">Context Creation, 1024 fd limit[2]:   16720 (includes 12 bytes per fd)</div><div class="line">Per-connection [3]:                      72 bytes, +1328 during headers</div><div class="line"></div><div class="line">.text   .rodata .data   .bss</div><div class="line">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.12 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/md_README_8coding.html b/doc/html/md_README_8coding.html
new file mode 100644 (file)
index 0000000..ed51c3e
--- /dev/null
@@ -0,0 +1,283 @@
+<!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.12"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<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);
+</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.12 -->
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',false,false,'search.php','Search');
+});
+</script>
+<div id="main-nav"></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_8coding.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"><h1><a class="anchor" id="dae"></a>
+Daemonization</h1>
+<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>
+<h1><a class="anchor" id="conns"></a>
+Maximum number of connections</h1>
+<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 available number of file descriptors, and when restarted <b>libwebsockets</b> will adapt accordingly.</p>
+<h1><a class="anchor" id="evtloop"></a>
+Libwebsockets is singlethreaded</h1>
+<p>Libwebsockets works in a serialized event loop, in a single thread.</p>
+<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>
+<h1><a class="anchor" id="writeable"></a>
+Only send data when socket writeable</h1>
+<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>
+<h1><a class="anchor" id="otherwr"></a>
+Do not rely on only your own WRITEABLE requests appearing</h1>
+<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>
+<h1><a class="anchor" id="closing"></a>
+Closing connections from the user side</h1>
+<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) or pings.</p>
+<h1><a class="anchor" id="frags"></a>
+Fragmented messages</h1>
+<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">case LWS_CALLBACK_RECEIVE:</div><div class="line">{</div><div class="line">    Client * const client = (Client *)user;</div><div class="line">    const size_t remaining = lws_remaining_packet_payload(wsi);</div><div class="line"></div><div class="line">    if (!remaining &amp;&amp; lws_is_final_fragment(wsi)) {</div><div class="line">        if (client-&gt;HasFragments()) {</div><div class="line">            client-&gt;AppendMessageFragment(in, len, 0);</div><div class="line">            in = (void *)client-&gt;GetMessage();</div><div class="line">            len = client-&gt;GetMessageLength();</div><div class="line">        }</div><div class="line"></div><div class="line">        client-&gt;ProcessMessage((char *)in, len, wsi);</div><div class="line">        client-&gt;ResetMessage();</div><div class="line">    } else</div><div class="line">        client-&gt;AppendMessageFragment(in, len, remaining);</div><div class="line">}</div><div class="line">break;</div></div><!-- fragment --><p>The test app libwebsockets-test-fraggle sources also show how to deal with fragmented messages.</p>
+<h1><a class="anchor" id="debuglog"></a>
+Debug Logging</h1>
+<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>
+<p>If you are not building with _DEBUG defined, ie, without this</p>
+<div class="fragment"><div class="line">$ cmake .. -DCMAKE_BUILD_TYPE=DEBUG</div></div><!-- fragment --><p>then log levels below notice do not actually get compiled in.</p>
+<h1><a class="anchor" id="extpoll"></a>
+External Polling Loop support</h1>
+<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-&gt;revents</code> is nonzero on return, you know it needs handling by your code.</p>
+<p>Also note that when integrating a foreign event loop like libev or libuv where it doesn't natively use poll() semantics, and you must return a fake pollfd reflecting the real event:</p>
+<ul>
+<li>be sure you set .events to .revents value as well in the synthesized pollfd</li>
+<li>check the built-in support for the event loop if possible (eg, ./lib/libuv.c) to see how it interfaces to lws</li>
+<li>use LWS_POLLHUP / LWS_POLLIN / LWS_POLLOUT from <a class="el" href="libwebsockets_8h.html">libwebsockets.h</a> to avoid losing windows compatibility</li>
+</ul>
+<h1><a class="anchor" id="cpp"></a>
+Using with in c++ apps</h1>
+<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">$ 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">$ g++ -DINSTALL_DATADIR=\&quot;/usr/share\&quot; -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>
+<h1><a class="anchor" id="headerinfo"></a>
+Availability of header information</h1>
+<p>HTTP Header information is managed by a pool of "ah" structs. These are a limited resource so there is pressure to free the headers and return the ah to the pool for reuse.</p>
+<p>For that reason header information on HTTP connections that get upgraded to websockets is lost after the ESTABLISHED callback. Anything important that isn't processed by user code before then should be copied out for later.</p>
+<p>For HTTP connections that don't upgrade, header info remains available the whole time.</p>
+<h1><a class="anchor" id="ka"></a>
+TCP Keepalive</h1>
+<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>
+<h1><a class="anchor" id="sslopt"></a>
+Optimizing SSL connections</h1>
+<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>
+<h1><a class="anchor" id="clientasync"></a>
+Async nature of client connections</h1>
+<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>
+<p>Notice that the client connection api tries to progress the connection somewhat before returning. That means it's possible to get callbacks like CONNECTION_ERROR on the new connection before your user code had a chance to get the wsi returned to identify it (in fact if the connection did fail early, NULL will be returned instead of the wsi anyway).</p>
+<p>To avoid that problem, you can fill in <code>pwsi</code> in the client connection info struct to point to a struct lws that get filled in early by the client connection api with the related wsi. You can then check for that in the callback to confirm the identity of the failing client connection.</p>
+<h1><a class="anchor" id="fileapi"></a>
+Lws platform-independent file access apis</h1>
+<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">LWS_VISIBLE LWS_EXTERN struct lws_plat_file_ops *</div><div class="line">        `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">static inline lws_filefd_type</div><div class="line">`lws_plat_file_open`(struct lws *wsi, const char *filename, unsigned long *filelen, int flags)</div><div class="line"></div><div class="line">static inline int</div><div class="line">`lws_plat_file_close`(struct lws *wsi, lws_filefd_type fd)</div><div class="line"></div><div class="line">static inline unsigned long</div><div class="line">`lws_plat_file_seek_cur`(struct lws *wsi, lws_filefd_type fd, long offset_from_cur_pos)</div><div class="line"></div><div class="line">static inline int</div><div class="line">`lws_plat_file_read`(struct lws *wsi, lws_filefd_type fd, unsigned long *amount, unsigned char *buf, unsigned long len)</div><div class="line"></div><div class="line">static inline int</div><div class="line">`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>
+<h1><a class="anchor" id="ecdh"></a>
+ECDH Support</h1>
+<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-&gt;options flag </p><pre class="fragment">    LWS_SERVER_OPTION_SSL_ECDH
+</pre><p>to build in support and select it at runtime.</p>
+<h1><a class="anchor" id="smp"></a>
+SMP / Multithreaded service</h1>
+<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 &lt;n&gt; 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>
+<h1><a class="anchor" id="libevuv"></a>
+Libev / Libuv support</h1>
+<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>
+<h1><a class="anchor" id="extopts"></a>
+Extension option control from user code</h1>
+<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">lws_set_extension_option(wsi, &quot;permessage-deflate&quot;,</div><div class="line">                         &quot;rx_buf_size&quot;, &quot;12&quot;); /* 1 &lt;&lt; 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>
+<h1><a class="anchor" id="httpsclient"></a>
+Client connections as HTTP[S] rather than WS[S]</h1>
+<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">case LWS_CALLBACK_RECEIVE_CLIENT_HTTP:</div><div class="line">        {</div><div class="line">                char buffer[1024 + LWS_PRE];</div><div class="line">                char *px = buffer + LWS_PRE;</div><div class="line">                int lenx = sizeof(buffer) - LWS_PRE;</div><div class="line"></div><div class="line">                lwsl_notice(&quot;LWS_CALLBACK_RECEIVE_CLIENT_HTTP\n&quot;);</div><div class="line"></div><div class="line">                /*</div><div class="line">                 * Often you need to flow control this by something</div><div class="line">                 * else being writable.  In that case call the api</div><div class="line">                 * to get a callback when writable here, and do the</div><div class="line">                 * pending client read in the writeable callback of</div><div class="line">                 * the output.</div><div class="line">                 */</div><div class="line">                if (lws_http_client_read(wsi, &amp;px, &amp;lenx) &lt; 0)</div><div class="line">                        return -1;</div><div class="line">                while (lenx--)</div><div class="line">                        putchar(*px++);</div><div class="line">        }</div><div class="line">        break;</div></div><!-- fragment --><p>Notice that if you will use SSL client connections on a vhost, you must prepare the client SSL context for the vhost after creating the vhost, since this is not normally done if the vhost was set up to listen / serve. Call the api <a class="el" href="group__client.html#ga4f44b8230e6732816ca5cd8d1aaaf340">lws_init_vhost_client_ssl()</a> to also allow client SSL on the vhost.</p>
+<h1><a class="anchor" id="vhosts"></a>
+Using lws vhosts</h1>
+<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">LWS_VISIBLE struct lws_vhost *</div><div class="line">lws_create_vhost(struct lws_context *context,</div><div class="line">                 struct lws_context_creation_info *info);</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">struct lws_context_creation_info {</div><div class="line">        int port;                                       /* VH */</div><div class="line">        const char *iface;                              /* VH */</div><div class="line">        const struct lws_protocols *protocols;          /* VH */</div><div class="line">        const struct lws_extension *extensions;         /* VH */</div><div class="line">...</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>
+<h1><a class="anchor" id="sni"></a>
+How lws matches hostname or SNI to a vhost</h1>
+<p>LWS first strips any trailing :port number.</p>
+<p>Then it tries to find an exact name match for a vhost listening on the correct port, ie, if SNI or the Host: header provided abc.com:1234, it will match on a vhost named abc.com that is listening on port 1234.</p>
+<p>If there is no exact match, lws will consider wildcard matches, for example if cats.abc.com:1234 is provided by the client by SNI or Host: header, it will accept a vhost "abc.com" listening on port 1234. If there was a better, exact, match, it will have been chosen in preference to this.</p>
+<p>Connections with SSL will still have the client go on to check the certificate allows wildcards and error out if not.</p>
+<h1><a class="anchor" id="mounts"></a>
+Using lws mounts on a vhost</h1>
+<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">struct lws_http_mount {</div><div class="line">        struct lws_http_mount *mount_next;</div><div class="line">        const char *mountpoint; /* mountpoint in http pathspace, eg, &quot;/&quot; */</div><div class="line">        const char *origin; /* path to be mounted, eg, &quot;/var/www/warmcat.com&quot; */</div><div class="line">        const char *def; /* default target, eg, &quot;index.html&quot; */</div><div class="line"></div><div class="line">        struct lws_protocol_vhost_options *cgienv;</div><div class="line"></div><div class="line">        int cgi_timeout;</div><div class="line">        int cache_max_age;</div><div class="line"></div><div class="line">        unsigned int cache_reusable:1;</div><div class="line">        unsigned int cache_revalidate:1;</div><div class="line">        unsigned int cache_intermediaries:1;</div><div class="line"></div><div class="line">        unsigned char origin_protocol;</div><div class="line">        unsigned char mountpoint_len;</div><div class="line">};</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">enum {</div><div class="line">        LWSMPRO_HTTP,</div><div class="line">        LWSMPRO_HTTPS,</div><div class="line">        LWSMPRO_FILE,</div><div class="line">        LWSMPRO_CGI,</div><div class="line">        LWSMPRO_REDIR_HTTP,</div><div class="line">        LWSMPRO_REDIR_HTTPS,</div><div class="line">        LWSMPRO_CALLBACK,</div><div class="line">};</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>
+<h1><a class="anchor" id="mountcallback"></a>
+Operation of LWSMPRO_CALLBACK mounts</h1>
+<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">static const struct lws_http_mount mount_post = {</div><div class="line">        NULL,           /* linked-list pointer to next*/</div><div class="line">        &quot;/formtest&quot;,            /* mountpoint in URL namespace on this vhost */</div><div class="line">        &quot;protocol-post-demo&quot;,   /* handler */</div><div class="line">        NULL,   /* default filename if none given */</div><div class="line">        NULL,</div><div class="line">        0,</div><div class="line">        0,</div><div class="line">        0,</div><div class="line">        0,</div><div class="line">        0,</div><div class="line">        LWSMPRO_CALLBACK,       /* origin points to a callback */</div><div class="line">        9,                      /* strlen(&quot;/formtest&quot;), ie length of the mountpoint */</div><div class="line">};</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>
+<h1><a class="anchor" id="dim"></a>
+Dimming webpage when connection lost</h1>
+<p>The lws test plugins' html provides useful feedback on the webpage about if it is still connected to the server, by greying out the page if not. You can also add this to your own html easily</p>
+<ul>
+<li><p class="startli">include lws-common.js from your HEAD section</p>
+<p class="startli">&lt;script src="/lws-common.js"&gt;&lt;/script&gt;</p>
+</li>
+<li><p class="startli">dim the page during initialization, in a script section on your page</p>
+<p class="startli">lws_gray_out(true,{'zindex':'499'});</p>
+</li>
+<li><p class="startli">in your ws onOpen(), remove the dimming</p>
+<p class="startli">lws_gray_out(false);</p>
+</li>
+<li><p class="startli">in your ws onClose(), reapply the dimming</p>
+<p class="startli">lws_gray_out(true,{'zindex':'499'}); </p>
+</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.12 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/md_README_8generic-sessions.html b/doc/html/md_README_8generic-sessions.html
new file mode 100644 (file)
index 0000000..8488cd8
--- /dev/null
@@ -0,0 +1,180 @@
+<!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.12"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<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);
+</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.12 -->
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',false,false,'search.php','Search');
+});
+</script>
+<div id="main-nav"></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_8generic-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"><h1><a class="anchor" id="gseb"></a>
+Enabling lwsgs for build</h1>
+<p>Enable at CMake with -DLWS_WITH_GENERIC_SESSIONS=1</p>
+<p>This also needs sqlite3 (libsqlite3-dev or similar package)</p>
+<h1><a class="anchor" id="gsi"></a>
+lwsgs Introduction</h1>
+<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>
+<h1><a class="anchor" id="gsin"></a>
+Lwsgs Integration to HTML</h1>
+<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">&lt;html&gt;</div><div class="line"> &lt;head&gt;</div><div class="line">  &lt;script src=&quot;lwsgs.js&quot;&gt;&lt;/script&gt;</div><div class="line">  &lt;style&gt;</div><div class="line">     .body { font-size: 12 }</div><div class="line">     .gstitle { font-size: 18 }</div><div class="line">  &lt;/style&gt;</div><div class="line">  &lt;/head&gt;</div><div class="line">  &lt;body style=&quot;background-image:url(seats.jpg)&quot;&gt;</div><div class="line">    &lt;table style=&quot;width:100%;transition: max-height 2s;&quot;&gt;</div><div class="line">     &lt;tr&gt;</div><div class="line">      &lt;td style=&quot;vertical-align:top;text-align:left;width=200px&quot;&gt;</div><div class="line">       &lt;img src=&quot;lwsgs-logo.png&quot;&gt;</div><div class="line">      &lt;/td&gt;</div><div class="line">      &lt;td style=&quot;vertical-align:top;float:right&quot;&gt;</div><div class="line">        &lt;div id=lwsgs style=&quot;text-align:right;background-color: rgba(255, 255, 255, 0.8);&quot;&gt;&lt;/div&gt;</div><div class="line">      &lt;/td&gt;</div><div class="line">     &lt;/tr&gt;</div><div class="line">    &lt;/table&gt;</div><div class="line">   &lt;/form&gt;</div><div class="line"></div><div class="line">   &lt;script&gt;lwsgs_initial();&lt;/script&gt;</div><div class="line"></div><div class="line"> &lt;/body&gt;</div><div class="line">&lt;/html&gt;</div></div><!-- fragment --><h1><a class="anchor" id="gsof"></a>
+Lwsgs Overall Flow@</h1>
+<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 &lt;form&gt; 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>
+<h1><a class="anchor" id="gsconf"></a>
+Lwsgs Configuration</h1>
+<p>"auth-mask" defines the authorization 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">{</div><div class="line">  # things in here can always be served</div><div class="line">  &quot;mountpoint&quot;: &quot;/lwsgs&quot;,</div><div class="line">  &quot;origin&quot;: &quot;file:///usr/share/libwebsockets-test-server/generic-sessions&quot;,</div><div class="line">  &quot;origin&quot;: &quot;callback://protocol-lws-messageboard&quot;,</div><div class="line">  &quot;default&quot;: &quot;generic-sessions-login-example.html&quot;,</div><div class="line">  &quot;auth-mask&quot;: &quot;0&quot;,</div><div class="line">  &quot;interpret&quot;: {</div><div class="line">          &quot;.js&quot;: &quot;protocol-lws-messageboard&quot;</div><div class="line">  }</div><div class="line"> }, {</div><div class="line">  # things in here can only be served if logged in as a user</div><div class="line">  &quot;mountpoint&quot;: &quot;/lwsgs/needauth&quot;,</div><div class="line">  &quot;origin&quot;: &quot;file:///usr/share/libwebsockets-test-server/generic-sessions/needauth&quot;,</div><div class="line">  &quot;origin&quot;: &quot;callback://protocol-lws-messageboard&quot;,</div><div class="line">  &quot;default&quot;: &quot;generic-sessions-login-example.html&quot;,</div><div class="line">  &quot;auth-mask&quot;: &quot;5&quot;, # logged in as a verified user</div><div class="line">  &quot;interpret&quot;: {</div><div class="line">          &quot;.js&quot;: &quot;protocol-lws-messageboard&quot;</div><div class="line">  }</div><div class="line"> }, {</div><div class="line">  # things in here can only be served if logged in as admin</div><div class="line">  &quot;mountpoint&quot;: &quot;/lwsgs/needadmin&quot;,</div><div class="line">  &quot;origin&quot;: &quot;file:///usr/share/libwebsockets-test-server/generic-sessions/needadmin&quot;,</div><div class="line">  &quot;origin&quot;: &quot;callback://protocol-lws-messageboard&quot;,</div><div class="line">  &quot;default&quot;: &quot;generic-sessions-login-example.html&quot;,</div><div class="line">  &quot;auth-mask&quot;: &quot;7&quot;, # b2 = verified (by email / or admin), b1 = admin, b0 = logged in with any user name</div><div class="line">  &quot;interpret&quot;: {</div><div class="line">          &quot;.js&quot;: &quot;protocol-lws-messageboard&quot;</div><div class="line">  }</div><div class="line"> }</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">     &quot;ws-protocols&quot;: [{</div><div class="line">       &quot;protocol-generic-sessions&quot;: {</div><div class="line">         &quot;status&quot;: &quot;ok&quot;,</div><div class="line">         &quot;admin-user&quot;: &quot;admin&quot;,</div><div class="line"></div><div class="line"># create the pw hash like this (for the example pw, &quot;jipdocesExunt&quot; )</div><div class="line"># $ echo -n &quot;jipdocesExunt&quot; | sha1sum</div><div class="line"># 046ce9a9cca769e85798133be06ef30c9c0122c9 -</div><div class="line">#</div><div class="line"># Obviously ** change this password hash to a secret one before deploying **</div><div class="line">#</div><div class="line">         &quot;admin-password-sha1&quot;: &quot;046ce9a9cca769e85798133be06ef30c9c0122c9&quot;,</div><div class="line">         &quot;session-db&quot;: &quot;/var/www/sessions/lws.sqlite3&quot;,</div><div class="line">         &quot;timeout-idle-secs&quot;: &quot;600&quot;,</div><div class="line">         &quot;timeout-anon-idle-secs&quot;: &quot;1200&quot;,</div><div class="line">         &quot;timeout-absolute-secs&quot;: &quot;6000&quot;,</div><div class="line"># the confounder is part of the salted password hashes.  If this config</div><div class="line"># file is in a 0700 root:root dir, an attacker with apache credentials</div><div class="line"># will have to get the confounder out of the process image to even try</div><div class="line"># to guess the password hashes.</div><div class="line">         &quot;confounder&quot;: &quot;Change to &lt;=31 chars of junk&quot;,</div><div class="line"></div><div class="line">         &quot;email-from&quot;: &quot;noreply@example.com&quot;,</div><div class="line">         &quot;email-smtp-ip&quot;: &quot;127.0.0.1&quot;,</div><div class="line">         &quot;email-expire&quot;: &quot;3600&quot;,</div><div class="line">         &quot;email-helo&quot;: &quot;myhost.com&quot;,</div><div class="line">         &quot;email-contact-person&quot;: &quot;Set Me &lt;real-person@email.com&gt;&quot;,</div><div class="line">         &quot;email-confirm-url-base&quot;: &quot;http://localhost:7681/lwsgs&quot;</div><div class="line">       }</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">&quot;protocol-lws-messageboard&quot;: {</div><div class="line">  &quot;status&quot;: &quot;ok&quot;,</div><div class="line">  &quot;message-db&quot;: &quot;/var/www/sessions/messageboard.sqlite3&quot;</div><div class="line">},</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>
+<h1><a class="anchor" id="gspwc"></a>
+Lwsgs Password Confounder</h1>
+<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>
+<h1><a class="anchor" id="gsprep"></a>
+Lwsgs Preparing the db directory</h1>
+<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"># mkdir -p /var/www/sessions</div><div class="line"># chown root:apache /var/www/sessions</div><div class="line"># chmod 770 /var/www/sessions</div></div><!-- fragment --><h1><a class="anchor" id="gsrmail"></a>
+Lwsgs Email configuration</h1>
+<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>
+<h1><a class="anchor" id="gsap"></a>
+Lwsgs Integration with another protocol</h1>
+<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>We provide the "messageboard" plugin as an example of how to integrate with your actual application protocol.</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">vhd-&gt;gsp = lws_vhost_name_to_protocol(vhd-&gt;vh, &quot;protocol-generic-sessions&quot;);</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">struct per_session_data__myapp {</div><div class="line">        void *pss_gs;</div><div class="line">...</div><div class="line"></div><div class="line">        pss-&gt;pss_gs = malloc(vhd-&gt;gsp-&gt;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">vhd-&gt;gsp-&gt;callback(wsi, reason, &amp;pss-&gt;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">case LWS_CALLBACK_HTTP_BIND_PROTOCOL:</div><div class="line">        if (!pss || pss-&gt;pss_gs)</div><div class="line">                break;</div><div class="line"></div><div class="line">        pss-&gt;pss_gs = malloc(vhd-&gt;gsp-&gt;per_session_data_size);</div><div class="line">        if (!pss-&gt;pss_gs)</div><div class="line">                return -1;</div><div class="line"></div><div class="line">        memset(pss-&gt;pss_gs, 0, vhd-&gt;gsp-&gt;per_session_data_size);</div><div class="line">        break;</div><div class="line"></div><div class="line">case LWS_CALLBACK_HTTP_DROP_PROTOCOL:</div><div class="line">        if (vhd-&gt;gsp-&gt;callback(wsi, reason, pss ? pss-&gt;pss_gs : NULL, in, len))</div><div class="line">                return -1;</div><div class="line"></div><div class="line">        if (pss-&gt;pss_gs) {</div><div class="line">                free(pss-&gt;pss_gs);</div><div class="line">                pss-&gt;pss_gs = NULL;</div><div class="line">        }</div><div class="line">        break;</div></div><!-- fragment --><p>#section gsapsib Getting session-specific information from another protocol</p>
+<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">struct lws_session_info {</div><div class="line">        char username[32];</div><div class="line">        char email[100];</div><div class="line">        char ip[72];</div><div class="line">        unsigned int mask;</div><div class="line">        char session[42];</div><div class="line">};</div><div class="line"></div><div class="line">struct lws_session_info sinfo;</div><div class="line">...</div><div class="line">vhd-&gt;gsp-&gt;callback(wsi, LWS_CALLBACK_SESSION_INFO,</div><div class="line">                           &amp;pss-&gt;pss_gs, &amp;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.12 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/md_README_8generic-table.html b/doc/html/md_README_8generic-table.html
new file mode 100644 (file)
index 0000000..5f729ea
--- /dev/null
@@ -0,0 +1,170 @@
+<!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.12"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>libwebsockets: Notes about generic-table</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);
+</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.12 -->
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',false,false,'search.php','Search');
+});
+</script>
+<div id="main-nav"></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_8generic-table.html','');});
+</script>
+<div id="doc-content">
+<div class="header">
+  <div class="headertitle">
+<div class="title">Notes about generic-table </div>  </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><h1><a class="anchor" id="gtint"></a>
+What is generic-table?</h1>
+<p>Generic-table is a JSON schema and client-side JS file that makes it easy to display live, table structured HTML over a ws link.</p>
+<p>An example plugin and index.html using it are provided, but lwsgt itself doesn't have its own plugin, it's just a JSON schema and client-side JS that other plugins can use to simplify displaying live, table-based data without having to reinvent the wheel each time.</p>
+<p>The ws protocol sends JSON describing the table, and then JSON updating the table contents when it chooses, the brower table is updated automatically, live.</p>
+<div class="image">
+<img src="lwsgt-overview.png" alt="lwsgt-overview.png"/>
+</div>
+<ul>
+<li>Example protocol plugin (displays directory contents): <a href="https://github.com/warmcat/libwebsockets/tree/master/plugins/generic-table/protocol_table_dirlisting.c">https://github.com/warmcat/libwebsockets/tree/master/plugins/generic-table/protocol_table_dirlisting.c</a></li>
+<li>Example HTML: <a href="https://github.com/warmcat/libwebsockets/tree/master/plugins/generic-table/assets/index.html">https://github.com/warmcat/libwebsockets/tree/master/plugins/generic-table/assets/index.html</a></li>
+<li>lwsgt.js (client-side table rendering / ws link management): <a href="https://github.com/warmcat/libwebsockets/tree/master/plugins/generic-table/assets/lwsgt.js">https://github.com/warmcat/libwebsockets/tree/master/plugins/generic-table/assets/lwsgt.js</a></li>
+</ul>
+<h1><a class="anchor" id="gteb"></a>
+Enabling for build</h1>
+<p>Enable the demo plugin at CMake with -DLWS_WITH_PLUGINS=1</p>
+<h1><a class="anchor" id="gtinth"></a>
+Integrating with your html</h1>
+<ul>
+<li>In your HEAD section, include lwsgt.js</li>
+</ul>
+<div class="fragment"><div class="line">&lt;script src=&quot;lwsgt.js&quot;&gt;&lt;/script&gt;</div></div><!-- fragment --><ul>
+<li>Also in your HEAD section, style the lwsgt CSS, eg</li>
+</ul>
+<div class="fragment"><div class="line">&lt;style&gt;</div><div class="line">.lwsgt_title { font-size: 24; text-align:center }</div><div class="line">.lwsgt_breadcrumbs { font-size: 18; text-align:left }</div><div class="line">.lwsgt_table { font-size: 14; padding:12px; margin: 12px; align:center }</div><div class="line">.lwsgt_hdr { font-size: 18; text-align:center;</div><div class="line">             background-color: rgba(40, 40, 40, 0.8); color: white }</div><div class="line">.lwsgt_tr { padding: 10px  }</div><div class="line">.lwsgt_td { padding: 3px  }</div><div class="line">&lt;/style&gt;</div></div><!-- fragment --><p>You can skip this but the result will be less beautiful until some CSS is provided.</p>
+<ul>
+<li>In your body section, declare a div with an id (can be whatever you want)</li>
+</ul>
+<div class="fragment"><div class="line">&lt;tr&gt;&lt;td&gt;&lt;div id=&quot;lwsgt1&quot; class=&quot;group1&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;</div></div><!-- fragment --><p>lwsgt JS will put its content there.</p>
+<ul>
+<li>Finally in a &lt;script&gt; at the end of your page, instantiate lwsgt and provide a custom callback for clickable links</li>
+</ul>
+<div class="fragment"><div class="line">&lt;script&gt;</div><div class="line">var v1 = new lwsgt_initial(&quot;Dir listing demo&quot;,</div><div class="line">                           &quot;protocol-lws-table-dirlisting&quot;,</div><div class="line">                           &quot;lwsgt1&quot;, &quot;lwsgt_dir_click&quot;, &quot;v1&quot;);</div><div class="line"></div><div class="line">function lwsgt_dir_click(gt, u, col, row)</div><div class="line">{</div><div class="line">        if (u[0] == &#39;=&#39;) { /* change directory */</div><div class="line">                window[gt].lwsgt_ws.send(u.substring(1, u.length));</div><div class="line">                return;</div><div class="line">        }</div><div class="line">        var win = window.open(u, &#39;_blank&#39;);</div><div class="line">        win.focus();</div><div class="line">}</div><div class="line"></div><div class="line">&lt;/script&gt;</div></div><!-- fragment --><p>In the callback, you can recover the ws object by <code>window[gt].lwsgt_ws</code>.</p>
+<h1><a class="anchor" id="gtc"></a>
+Lwsgt constructor</h1>
+<p>To instantiate the ws link and lwsgt instance, your HTML must call a lwsgt constructor for each region on the page managed by lwsgt.</p>
+<p><code>var myvar = new lwsgt_initial(title, ws_protocol, div_id, click_cb, myvar);</code></p>
+<p>All of the arguments are strings.</p>
+<table class="doxtable">
+<tr>
+<th>Parameter </th><th>Description  </th></tr>
+<tr>
+<td>title </td><td>Title string to go above the table </td></tr>
+<tr>
+<td>ws_protocol </td><td>Protocol name string to use when making ws connection </td></tr>
+<tr>
+<td>div_id </td><td>HTML id of div to fill with content </td></tr>
+<tr>
+<td>click_cb </td><td>Callback function name string to handle clickable links </td></tr>
+<tr>
+<td>myvar </td><td>Name of var used to hold this instantiation globally </td></tr>
+</table>
+<p>Note "myvar" is needed so it can be passed to the click handling callback.</p>
+<h1><a class="anchor" id="gtclick"></a>
+Lwsgt click handling function</h1>
+<p>When a clickable link produced by lwsgt is clicked, the function named in the click_cb parameter to lwsgt_initial is called.</p>
+<p>That function is expected to take four parameters, eg</p>
+<p><code>function lwsgt_dir_click(gt, u, col, row)</code></p>
+<table class="doxtable">
+<tr>
+<th>Parameter </th><th>Description  </th></tr>
+<tr>
+<td>gt </td><td>Name of global var holding this lwsgt context (ie, myvar) </td></tr>
+<tr>
+<td>u </td><td>Link "url" string </td></tr>
+<tr>
+<td>col </td><td>Table column number link is from </td></tr>
+<tr>
+<td>row </td><td>Table row number link is from </td></tr>
+</table>
+<h1><a class="anchor" id="gtgj"></a>
+Generic-table JSON</h1>
+<h3>Column layout</h3>
+<p>When the ws connection is established, the protocol should send a JSON message describing the table columns. For example</p>
+<div class="fragment"><div class="line">&quot;cols&quot;: [</div><div class="line">      { &quot;name&quot;: &quot;Date&quot; },</div><div class="line">      { &quot;name&quot;: &quot;Size&quot;, &quot;align&quot;: &quot;right&quot; },</div><div class="line">      { &quot;name&quot;: &quot;Icon&quot; },</div><div class="line">      { &quot;name&quot;: &quot;Name&quot;, &quot;href&quot;: &quot;uri&quot;},</div><div class="line">      { &quot;name&quot;: &quot;uri&quot;, &quot;hide&quot;: &quot;1&quot; }</div><div class="line">  ]</div><div class="line">}</div></div><!-- fragment --><ul>
+<li>This describes 5 columns</li>
+<li>Only four columns (not "uri") should be visible</li>
+<li>"Name" should be presented as a clickable link using "uri" as the destination, when a "uri" field is presented.</li>
+<li>"Size" field should be presented aligned to the right</li>
+</ul>
+<h3>Breadcrumbs</h3>
+<p>When a view is hierarchical, it's useful to provide a "path" with links back in the "path", known as "breadcrumbs".</p>
+<p>Elements before the last one should provide a "url" member as well as the displayable name, which is used to create the link destination.</p>
+<p>The last element, being the current displayed page should not have a url member and be displayed without link style.</p>
+<div class="fragment"><div class="line">&quot;breadcrumbs&quot;:[{&quot;name&quot;:&quot;top&quot;, &quot;url&quot;: &quot;/&quot; }, {&quot;name&quot;:&quot;mydir&quot;}]</div></div><!-- fragment --><h3>Table data</h3>
+<p>The actual file data consists of an array of rows, containing the columns mentioned in the original "cols" section.</p>
+<div class="fragment"><div class="line">&quot;data&quot;:[</div><div class="line">        {</div><div class="line">         &quot;Icon&quot;:&quot; &quot;,</div><div class="line">         &quot;Date&quot;:&quot;2015-Feb-06 03:08:35 +0000&quot;,</div><div class="line">         &quot;Size&quot;:&quot;1406&quot;,</div><div class="line">         &quot;uri&quot;:&quot;./serve//favicon.ico&quot;,</div><div class="line">         &quot;Name&quot;:&quot;favicon.ico&quot;</div><div class="line">        }</div><div class="line">]</div></div><!-- fragment --><h1><a class="anchor" id="gtdirl"></a>
+Setting up protocol-lws-table-dirlisting</h1>
+<p>The example protocol needs two mounts, one to provide the index.html, js and the protocol itself</p>
+<div class="fragment"><div class="line">{</div><div class="line"> &quot;mountpoint&quot;: &quot;/dirtest&quot;,</div><div class="line"> &quot;origin&quot;: &quot;file:///usr/share/libwebsockets-test-server/generic-table&quot;,</div><div class="line"> &quot;origin&quot;: &quot;callback://protocol-lws-table-dirlisting&quot;,</div><div class="line"> &quot;default&quot;: &quot;index.html&quot;,</div><div class="line"> &quot;pmo&quot;: [{</div><div class="line">        &quot;dir&quot;: &quot;/usr/share/libwebsockets-test-server&quot;</div><div class="line"> }]</div><div class="line">},</div></div><!-- fragment --><p>The protocol wants a per-mount option (PMO) to tell it the base directory it is serving from, named "dir".</p>
+<p>The other mount is there to simply serve items that get clicked on from the table in a secure way</p>
+<div class="fragment"><div class="line">{</div><div class="line"> &quot;mountpoint&quot;: &quot;/dirtest/serve&quot;,</div><div class="line"> &quot;origin&quot;: &quot;file:///usr/share/libwebsockets-test-server&quot;,</div><div class="line"> &quot;default&quot;: &quot;index.html&quot;</div><div class="line">},</div></div><!-- fragment --><p>This last bit is not related to using lwsgt itself. </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.12 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/md_README_8lwsws.html b/doc/html/md_README_8lwsws.html
new file mode 100644 (file)
index 0000000..4fb46c7
--- /dev/null
@@ -0,0 +1,207 @@
+<!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.12"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<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);
+</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.12 -->
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',false,false,'search.php','Search');
+});
+</script>
+<div id="main-nav"></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_8lwsws.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"><h1><a class="anchor" id="lwsws"></a>
+Libwebsockets Web Server</h1>
+<p>lwsws is an implementation of a very lightweight, ws-capable generic web server, which uses libwebsockets to implement everything underneath.</p>
+<p>If you are basically implementing a standalone server with lws, you can avoid reinventing the wheel and use a debugged server including lws.</p>
+<h1><a class="anchor" id="lwswsb"></a>
+Build</h1>
+<p>Just enable -DLWS_WITH_LWSWS=1 at cmake-time.</p>
+<p>It enables libuv and plugin support automatically.</p>
+<p>NOTICE on Ubuntu, the default libuv package is called "libuv-0.10". This is ancient.</p>
+<p>You should replace this with libuv1 and libuv1-dev before proceeding.</p>
+<h1><a class="anchor" id="lwswsc"></a>
+Lwsws Configuration</h1>
+<p>lwsws uses JSON config files, they're pure JSON except:</p>
+<ul>
+<li>'#' may be used to turn the rest of the line into a comment.</li>
+<li>There's also a single substitution, if a string contains "_lws_ddir_", then that is replaced with the LWS install data directory path, eg, "/usr/share" or whatever was set when LWS was built + installed. That lets you refer to installed paths without having to change the config if your install path was different.</li>
+</ul>
+<p>There is a single file intended for global settings</p>
+<p>/etc/lwsws/conf </p><div class="fragment"><div class="line"># these are the server global settings</div><div class="line"># stuff related to vhosts should go in one</div><div class="line"># file per vhost in ../conf.d/</div><div class="line"></div><div class="line">{</div><div class="line">  &quot;global&quot;: {</div><div class="line">   &quot;uid&quot;: &quot;48&quot;,  # apache user</div><div class="line">   &quot;gid&quot;: &quot;48&quot;,  # apache user</div><div class="line">   &quot;count-threads&quot;: &quot;1&quot;,</div><div class="line">   &quot;server-string&quot;: &quot;myserver v1&quot;, # returned in http headers</div><div class="line">   &quot;ws-pingpong-secs&quot;: &quot;200&quot;, # confirm idle established ws connections this often</div><div class="line">   &quot;init-ssl&quot;: &quot;yes&quot;</div><div class="line"> }</div><div class="line">}</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">{</div><div class="line">        &quot;vhosts&quot;: [{</div><div class="line">                &quot;name&quot;: &quot;warmcat.com&quot;,</div><div class="line">                &quot;port&quot;: &quot;443&quot;,</div><div class="line">                &quot;interface&quot;: &quot;eth0&quot;,  # optional</div><div class="line">                &quot;host-ssl-key&quot;: &quot;/etc/pki/tls/private/warmcat.com.key&quot;,  # if given enable ssl</div><div class="line">                &quot;host-ssl-cert&quot;: &quot;/etc/pki/tls/certs/warmcat.com.crt&quot;,</div><div class="line">                &quot;host-ssl-ca&quot;: &quot;/etc/pki/tls/certs/warmcat.com.cer&quot;,</div><div class="line">                &quot;mounts&quot;: [{  # autoserve</div><div class="line">                        &quot;mountpoint&quot;: &quot;/&quot;,</div><div class="line">                        &quot;origin&quot;: &quot;file:///var/www/warmcat.com&quot;,</div><div class="line">                        &quot;default&quot;: &quot;index.html&quot;</div><div class="line">                }]</div><div class="line">        }]</div><div class="line">}</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"># mkdir -p /etc/lwsws/conf.d /var/log/lwsws</div><div class="line"># cp ./lwsws/etc-lwsws-conf-EXAMPLE /etc/lwsws/conf</div><div class="line"># cp ./lwsws/etc-lwsws-conf.d-localhost-EXAMPLE /etc/lwsws/conf.d/test-server</div><div class="line"># sudo lwsws</div></div><!-- fragment --><h1><a class="anchor" id="lwsogo"></a>
+Other Global Options</h1>
+<ul>
+<li><code>reject-service-keywords</code> allows you to return an HTTP error code and message of your choice if a keyword is found in the user agent</li>
+</ul>
+<div class="fragment"><div class="line">&quot;reject-service-keywords&quot;: [{</div><div class="line">     &quot;scumbot&quot;: &quot;404 Not Found&quot;</div><div class="line">}]</div></div><!-- fragment --><h1><a class="anchor" id="lwswsv"></a>
+Lwsws Vhosts</h1>
+<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">{</div><div class="line"> &quot;vhosts&quot;: [ {</div><div class="line">     &quot;name&quot;: &quot;localhost&quot;,</div><div class="line">     &quot;port&quot;: &quot;443&quot;,</div><div class="line">     &quot;host-ssl-key&quot;:  &quot;/etc/pki/tls/private/libwebsockets.org.key&quot;,</div><div class="line">     &quot;host-ssl-cert&quot;: &quot;/etc/pki/tls/certs/libwebsockets.org.crt&quot;,</div><div class="line">     &quot;host-ssl-ca&quot;:   &quot;/etc/pki/tls/certs/libwebsockets.org.cer&quot;,</div><div class="line">     &quot;mounts&quot;: [{</div><div class="line">       &quot;mountpoint&quot;: &quot;/&quot;,</div><div class="line">       &quot;origin&quot;: &quot;file:///var/www/libwebsockets.org&quot;,</div><div class="line">       &quot;default&quot;: &quot;index.html&quot;</div><div class="line">       }, {</div><div class="line">        &quot;mountpoint&quot;: &quot;/testserver&quot;,</div><div class="line">        &quot;origin&quot;: &quot;file:///usr/local/share/libwebsockets-test-server&quot;,</div><div class="line">        &quot;default&quot;: &quot;test.html&quot;</div><div class="line">       }],</div><div class="line">     # which protocols are enabled for this vhost, and optional</div><div class="line">     # vhost-specific config options for the protocol</div><div class="line">     #</div><div class="line">     &quot;ws-protocols&quot;: [{</div><div class="line">       &quot;warmcat,timezoom&quot;: {</div><div class="line">         &quot;status&quot;: &quot;ok&quot;</div><div class="line">       }</div><div class="line">     }]</div><div class="line">    },</div><div class="line">    {</div><div class="line">    &quot;name&quot;: &quot;localhost&quot;,</div><div class="line">    &quot;port&quot;: &quot;7681&quot;,</div><div class="line">     &quot;host-ssl-key&quot;:  &quot;/etc/pki/tls/private/libwebsockets.org.key&quot;,</div><div class="line">     &quot;host-ssl-cert&quot;: &quot;/etc/pki/tls/certs/libwebsockets.org.crt&quot;,</div><div class="line">     &quot;host-ssl-ca&quot;:   &quot;/etc/pki/tls/certs/libwebsockets.org.cer&quot;,</div><div class="line">     &quot;mounts&quot;: [{</div><div class="line">       &quot;mountpoint&quot;: &quot;/&quot;,</div><div class="line">       &quot;origin&quot;: &quot;&gt;https://localhost&quot;</div><div class="line">     }]</div><div class="line">   },</div><div class="line">    {</div><div class="line">    &quot;name&quot;: &quot;localhost&quot;,</div><div class="line">    &quot;port&quot;: &quot;80&quot;,</div><div class="line">     &quot;mounts&quot;: [{</div><div class="line">       &quot;mountpoint&quot;: &quot;/&quot;,</div><div class="line">       &quot;origin&quot;: &quot;&gt;https://localhost&quot;</div><div class="line">     }]</div><div class="line">   }</div><div class="line"></div><div class="line">  ]</div><div class="line">}</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>
+<h1><a class="anchor" id="lwswsvn"></a>
+Lwsws Vhost name and port sharing</h1>
+<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>
+<h1><a class="anchor" id="lwswspr"></a>
+Lwsws Protocols</h1>
+<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">&quot;ws-protocols&quot;: [{</div><div class="line">  &quot;warmcat-timezoom&quot;: {</div><div class="line">    &quot;status&quot;: &quot;ok&quot;</div><div class="line">  }</div><div class="line">}]</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">&quot;ws-protocols&quot;: [{</div><div class="line">  &quot;warmcat-timezoom&quot;: {</div><div class="line">    &quot;status&quot;: &quot;ok&quot;,</div><div class="line">    &quot;default&quot;: &quot;1&quot;</div><div class="line">  }</div><div class="line">}]</div></div><!-- fragment --><h1><a class="anchor" id="lwswsovo"></a>
+Lwsws Other vhost options</h1>
+<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`": "&lt;cipher list&gt;" 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`": "&lt;curve name&gt;" 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`": "&lt;decimal&gt;" 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"># define SSL_OP_NO_TLSv1_1                               0x10000000L</div></div><!-- fragment --><p>would equate to</p>
+<div class="fragment"><div class="line">&quot;`ssl-option-set`&quot;: &quot;268435456&quot;</div></div><!-- fragment --><ul>
+<li>"`ssl-option-clear'": "&lt;decimal&gt;" Clears the SSL option flag value for the vhost. It may be used multiple times and OR's the flags together.</li>
+<li>"`headers':: [{ "header1": "h1value", "header2": "h2value" }]</li>
+</ul>
+<p>allows you to set arbitrary headers on every file served by the vhost</p>
+<p>recommended vhost headers for good client security are</p>
+<div class="fragment"><div class="line">  &quot;headers&quot;: [{</div><div class="line">       &quot;Content-Security-Policy&quot;: &quot;script-src &#39;self&#39;&quot;,</div><div class="line">       &quot;X-Content-Type-Options&quot;: &quot;nosniff&quot;,</div><div class="line">       &quot;X-XSS-Protection&quot;: &quot;1; mode=block&quot;,</div><div class="line">       &quot;X-Frame-Options&quot;: &quot;SAMEORIGIN&quot;</div><div class="line">}]</div></div><!-- fragment --><h1><a class="anchor" id="lwswsm"></a>
+Lwsws Mounts</h1>
+<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">{</div><div class="line"> &quot;mountpoint&quot;: &quot;/&quot;,</div><div class="line"> &quot;origin&quot;: &quot;file:///var/www/mysite.com&quot;,</div><div class="line"> &quot;default&quot;: &quot;/&quot;</div><div class="line">}</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">{</div><div class="line"> &quot;mountpoint&quot;: &quot;/git&quot;,</div><div class="line"> &quot;origin&quot;: &quot;cgi:///var/www/cgi-bin/cgit&quot;,</div><div class="line"> &quot;default&quot;: &quot;/&quot;</div><div class="line">}, {</div><div class="line"> &quot;mountpoint&quot;: &quot;/cgit-data&quot;,</div><div class="line"> &quot;origin&quot;: &quot;file:///usr/share/cgit&quot;,</div><div class="line"> &quot;default&quot;: &quot;/&quot;</div><div class="line">},</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>
+<h1><a class="anchor" id="lwswsomo"></a>
+Lwsws Other mount options</h1>
+<p>1) Some protocols may want "per-mount options" in name:value format. You can provide them using "pmo" </p><pre class="fragment">           {
+            "mountpoint": "/stuff",
+            "origin": "callback://myprotocol",
+            "pmo": [{
+                    "myname": "myvalue"
+            }]
+           }
+</pre><p>2) 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">{</div><div class="line"> &quot;mountpoint&quot;: &quot;/git&quot;,</div><div class="line"> &quot;origin&quot;: &quot;cgi:///var/www/cgi-bin/cgit&quot;,</div><div class="line"> &quot;default&quot;: &quot;/&quot;,</div><div class="line"> &quot;cgi-env&quot;: [{</div><div class="line">         &quot;CGIT_CONFIG&quot;: &quot;/etc/cgitrc/libwebsockets.org&quot;</div><div class="line"> }]</div><div class="line">}</div></div><!-- fragment --><p> This allows you to customize one cgi depending on the mountpoint (and / or vhost).</p>
+<p>3) It's also possible to set the cgi timeout (in secs) per cgi:// mount, like this </p><div class="fragment"><div class="line">&quot;cgi-timeout&quot;: &quot;30&quot;</div></div><!-- fragment --><p> 4) <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">{</div><div class="line"> &quot;mountpoint&quot;: &quot;/formtest&quot;,</div><div class="line"> &quot;origin&quot;: &quot;callback://protocol-post-demo&quot;</div><div class="line">}</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>5) 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">{</div><div class="line"> &quot;mountpoint&quot;: &quot;/&quot;,</div><div class="line"> &quot;origin&quot;: &quot;file:///var/www/mysite.com&quot;,</div><div class="line"> &quot;cache-max-age&quot;: &quot;60&quot;,      # seconds</div><div class="line"> &quot;cache-reuse&quot;: &quot;1&quot;,         # allow reuse at client at all</div><div class="line"> &quot;cache-revalidate&quot;: &quot;1&quot;,    # check it with server each time</div><div class="line"> &quot;cache-intermediaries&quot;: &quot;1&quot; # allow intermediary caches to hold</div><div class="line">}</div></div><!-- fragment --><p>6) You can also define a list of additional mimetypes per-mount </p><div class="fragment"><div class="line">&quot;extra-mimetypes&quot;: {</div><div class="line">         &quot;.zip&quot;: &quot;application/zip&quot;,</div><div class="line">         &quot;.doc&quot;: &quot;text/evil&quot;</div><div class="line"> }</div></div><!-- fragment --><p>Normally a file suffix MUST match one of the canned mimetypes or one of the extra mimetypes, or the file is not served. This adds a little bit of security because even if there is a bug somewhere and the mount dirs are circumvented, lws will not serve, eg, /etc/passwd.</p>
+<p>If you provide an extra mimetype entry </p><pre class="fragment">                    "*": ""
+</pre><p>Then any file is served, if the mimetype was not known then it is served without a Content-Type: header.</p>
+<p>7) A mount can be protected by HTTP Basic Auth. This only makes sense when using https, since otherwise the password can be sniffed.</p>
+<p>You can add a <code>basic-auth</code> entry on a mount like this`</p>
+<div class="fragment"><div class="line">{</div><div class="line">        &quot;mountpoint&quot;: &quot;/basic-auth&quot;,</div><div class="line">        &quot;origin&quot;: &quot;file://_lws_ddir_/libwebsockets-test-server/private&quot;,</div><div class="line">        &quot;basic-auth&quot;: &quot;/var/www/balogins-private&quot;</div><div class="line">}</div></div><!-- fragment --><p>Before serving anything, lws will signal to the browser that a username / password combination is required, and it will pop up a dialog. When the user has filled it in, lwsws checks the user:password string against the text file named in the <code>basic-auth</code> entry.</p>
+<p>The file should contain user:pass one per line</p>
+<div class="fragment"><div class="line">testuser:testpass</div><div class="line">myuser:hispass</div></div><!-- fragment --><p>The file should be readable by lwsws, and for a little bit of extra security not have a file suffix, so lws would reject to serve it even if it could find it on a mount.</p>
+<h1><a class="anchor" id="lwswspl"></a>
+Lwsws Plugins</h1>
+<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>
+<h1><a class="anchor" id="lwswsplaplp"></a>
+Additional plugin search paths</h1>
+<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">{</div><div class="line">  &quot;global&quot;: {</div><div class="line">   &quot;plugin-dir&quot;: &quot;/usr/local/share/coherent-timeline/plugins&quot;</div><div class="line">  }</div><div class="line">}</div></div><!-- fragment --><h1><a class="anchor" id="lwswsssp"></a>
+lws-server-status plugin</h1>
+<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">&quot;lws-server-status&quot;: {</div><div class="line">  &quot;status&quot;: &quot;ok&quot;,</div><div class="line">  &quot;update-ms&quot;: &quot;5000&quot;</div><div class="line">}</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">{</div><div class="line"> &quot;mountpoint&quot;: &quot;/server-status&quot;,</div><div class="line"> &quot;origin&quot;: &quot;file:///usr/local/share/libwebsockets-test-server/server-status&quot;,</div><div class="line"> &quot;default&quot;: &quot;server-status.html&quot;</div><div class="line">}</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>
+<h1><a class="anchor" id="lwswssysd"></a>
+Lwsws Integration with Systemd</h1>
+<p>lwsws needs a service file like this as <code>/usr/lib/systemd/system/lwsws.service</code> </p><div class="fragment"><div class="line">[Unit]</div><div class="line">Description=Libwebsockets Web Server</div><div class="line">After=syslog.target</div><div class="line"></div><div class="line">[Service]</div><div class="line">ExecStart=/usr/local/bin/lwsws</div><div class="line">StandardError=null</div><div class="line"></div><div class="line">[Install]</div><div class="line">WantedBy=multi-user.target</div></div><!-- fragment --><p>You can find this prepared in <code>./lwsws/usr-lib-systemd-system-lwsws.service</code></p>
+<h1><a class="anchor" id="lwswslr"></a>
+Lwsws Integration with logrotate</h1>
+<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">/var/log/lwsws/*log {</div><div class="line">    copytruncate</div><div class="line">    missingok</div><div class="line">    notifempty</div><div class="line">    delaycompress</div><div class="line">}</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">sudo mkdir /var/log/lwsws</div><div class="line">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.12 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/md_README_8problems.html b/doc/html/md_README_8problems.html
new file mode 100644 (file)
index 0000000..f670816
--- /dev/null
@@ -0,0 +1,104 @@
+<!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.12"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>libwebsockets: Debugging problems</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);
+</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.12 -->
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',false,false,'search.php','Search');
+});
+</script>
+<div id="main-nav"></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_8problems.html','');});
+</script>
+<div id="doc-content">
+<div class="header">
+  <div class="headertitle">
+<div class="title">Debugging problems </div>  </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><h2>Library is a component </h2>
+<p>As a library, lws is always just a component in a bigger application.</p>
+<p>When users have a problem involving lws, what is happening in the bigger application is usually critical to understand what is going on (and where the solution lies).</p>
+<p>Many users are able to share their sources, but others decide not to, for presumed "commercial advantage" or whatever. (In any event, it can be painful looking through large chunks of someone else's sources for problems when that is not the library author's responsibility.)</p>
+<p>This makes answering questions like "what is wrong with my code I am not
+going to show you?" or even "what is wrong with my code?" very difficult.</p>
+<p>Even if it's clear there is a problem somewhere, it cannot be understood or reproduced by anyone else if it needs user code that isn't provided.</p>
+<p>The biggest question is, "is this an lws problem actually"?</p>
+<h2>Use the test apps as sanity checks </h2>
+<p>The test server and client are extremely useful for sanity checks and debugging guidance.</p>
+<ul>
+<li>test apps work on your platform, then either<ul>
+<li>your user code is broken, align it to how the test apps work, or,</li>
+<li>something from your code is required to show an lws problem, provide a minimal patch on a test app so it can be reproduced</li>
+</ul>
+</li>
+<li>test apps break on your platform, but work on, eg, x86_64, either<ul>
+<li>toolchain or platform-specific (eg, OS) issue, or</li>
+<li>lws platform support issue</li>
+</ul>
+</li>
+<li>test apps break everywhere<ul>
+<li>sounds like lws problem, info to reproduce and / or a patch is appreciated </li>
+</ul>
+</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.12 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/md_README_8test-apps.html b/doc/html/md_README_8test-apps.html
new file mode 100644 (file)
index 0000000..ff9fd69
--- /dev/null
@@ -0,0 +1,188 @@
+<!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.12"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>libwebsockets: Overview of 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);
+</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.12 -->
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',false,false,'search.php','Search');
+});
+</script>
+<div id="main-nav"></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_8test-apps.html','');});
+</script>
+<div id="doc-content">
+<div class="header">
+  <div class="headertitle">
+<div class="title">Overview of lws test apps </div>  </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><p>Are you building a client? You just need to look at the test client <a href="test-server/test-client.c">libwebsockets-test-client</a>.</p>
+<p>If you are building a standalone server, there are three choices, in order of preferability.</p>
+<p>1) lwsws + protocol plugins</p>
+<p>Lws provides a generic web server app that can be configured with JSON config files. <a href="https://libwebsockets.org">https://libwebsockets.org</a> itself uses this method.</p>
+<p>With lwsws handling the serving part, you only need to write an lws protocol plugin. See [plugin-standalone](plugin-standalone) for an example of how to do that outside lws itself, using lws public apis.</p>
+<p>$ cmake .. -DLWS_WITH_LWSWS=1</p>
+<p>See <a class="el" href="md_README_8lwsws.html">README.lwsws.md</a> for information on how to configure lwsws.</p>
+<p>NOTE this method implies libuv is used by lws, to provide crossplatform implementations of timers, dynamic lib loading etc for plugins and lwsws.</p>
+<p>2) test-server-v2.0.c</p>
+<p>This method lets you configure web serving in code, instead of using lwsws.</p>
+<p>Plugins are still used, which implies libuv needed.</p>
+<p>$ cmake .. -DLWS_WITH_PLUGINS=1</p>
+<p>See <a href="test-server/test-server-v2.0.c">test-server-v2.0.c</a></p>
+<p>3) protocols in the server app</p>
+<p>This is the original way lws implemented servers, plugins and libuv are not required, but without plugins separating the protocol code directly, the combined code is all squidged together and is much less maintainable.</p>
+<p>This method is still supported in lws but all ongoing and future work is being done in protocol plugins only.</p>
+<h1>Notes about lws test apps </h1>
+<h1><a class="anchor" id="tsb"></a>
+Testing server with a browser</h1>
+<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 &lt;log level&gt;</code>, see later.</p>
+<h1><a class="anchor" id="tsd"></a>
+Running test server as a Daemon</h1>
+<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">$ 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>
+<h1><a class="anchor" id="sssl"></a>
+Using SSL on the server side</h1>
+<p>To test it using SSL/WSS, just run the test server with </p><div class="fragment"><div class="line">$ libwebsockets-test-server --ssl</div></div><!-- fragment --><p> and use the URL </p><div class="fragment"><div class="line">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>
+<h1><a class="anchor" id="wscl"></a>
+Testing websocket client support</h1>
+<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">$ 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">$ libwebsockets-test-client localhost --ssl -s</div></div><!-- fragment --><p>the -s tells it to accept the default self-signed cert from the server, otherwise it will strictly fail the connection if there is no CA cert to validate the server's certificate.</p>
+<h1><a class="anchor" id="choosingts"></a>
+Choosing between test server variations</h1>
+<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>
+<h1><a class="anchor" id="echo"></a>
+Testing simple echo</h1>
+<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">$ 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">$ libwebsockets-test-echo</div></div><!-- fragment --><p> and do the echo test against the local echo server </p><div class="fragment"><div class="line">$ 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>
+<h1><a class="anchor" id="tassl"></a>
+Testing SSL on the client side</h1>
+<p>To test SSL/WSS client action, just run the client test with </p><div class="fragment"><div class="line">$ libwebsockets-test-client localhost --ssl</div></div><!-- fragment --><p> By default the client test applet is set to accept self-signed 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>
+<h1><a class="anchor" id="taping"></a>
+Using the websocket ping utility</h1>
+<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">$ libwebsockets-test-ping localhost</div><div class="line">handshake OK for protocol lws-mirror-protocol</div><div class="line">Websocket PING localhost.localdomain (127.0.0.1) 64 bytes of data.</div><div class="line">64 bytes from localhost: req=1 time=0.1ms</div><div class="line">64 bytes from localhost: req=2 time=0.1ms</div><div class="line">64 bytes from localhost: req=3 time=0.1ms</div><div class="line">64 bytes from localhost: req=4 time=0.2ms</div><div class="line">64 bytes from localhost: req=5 time=0.1ms</div><div class="line">64 bytes from localhost: req=6 time=0.2ms</div><div class="line">64 bytes from localhost: req=7 time=0.2ms</div><div class="line">64 bytes from localhost: req=8 time=0.1ms</div><div class="line">^C</div><div class="line">--- localhost.localdomain websocket ping statistics ---</div><div class="line">8 packets transmitted, 8 received, 0% packet loss, time 7458ms</div><div class="line">rtt min/avg/max = 0.110/0.185/0.218 ms</div><div class="line">$</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 protocol to handshake with by <code>--protocol=protocolname</code></p>
+<h1><a class="anchor" id="ta"></a>
+fraggle Fraggle test app</h1>
+<p>By default it runs in server mode </p><div class="fragment"><div class="line">$ libwebsockets-test-fraggle</div><div class="line">libwebsockets test fraggle</div><div class="line">(C) Copyright 2010-2011 Andy Green &lt;andy@warmcat.com&gt; licensed under LGPL2.1</div><div class="line"> Compiled with SSL support, not using it</div><div class="line"> Listening on port 7681</div><div class="line">server sees client connect</div><div class="line">accepted v06 connection</div><div class="line">Spamming 360 random fragments</div><div class="line">Spamming session over, len = 371913. sum = 0x2D3C0AE</div><div class="line">Spamming 895 random fragments</div><div class="line">Spamming session over, len = 875970. sum = 0x6A74DA1</div><div class="line">...</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">$ libwebsockets-test-fraggle -c localhost</div><div class="line">libwebsockets test fraggle</div><div class="line">(C) Copyright 2010-2011 Andy Green &lt;andy@warmcat.com&gt; licensed under LGPL2.1</div><div class="line"> Client mode</div><div class="line">Connecting to localhost:7681</div><div class="line">denied deflate-stream extension</div><div class="line">handshake OK for protocol fraggle-protocol</div><div class="line">client connects to server</div><div class="line">EOM received 371913 correctly from 360 fragments</div><div class="line">EOM received 875970 correctly from 895 fragments</div><div class="line">EOM received 247140 correctly from 258 fragments</div><div class="line">EOM received 695451 correctly from 692 fragments</div><div class="line">...</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>
+<h1><a class="anchor" id="taproxy"></a>
+proxy support</h1>
+<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">$ export http_proxy=myproxy.com:3128</div><div class="line">$ libwebsockets-test-client someserver.com</div></div><!-- fragment --><h1><a class="anchor" id="talog"></a>
+debug logging</h1>
+<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>By default debug logs below "notice" in severity are not compiled in. To get them included, add this option in CMAKE</p>
+<div class="fragment"><div class="line">$ cmake .. -DCMAKE_BUILD_TYPE=DEBUG</div></div><!-- fragment --><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 &lt;number&gt;</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>
+<h1><a class="anchor" id="ws13"></a>
+Websocket version supported</h1>
+<p>The final IETF standard is supported for both client and server, protocol version 13.</p>
+<h1><a class="anchor" id="latency"></a>
+Latency Tracking</h1>
+<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>
+<h1><a class="anchor" id="autobahn"></a>
+Autobahn Test Suite</h1>
+<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 &ndash;client localhost &ndash;port 9001 -u "/runCase?case=20&amp;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>
+<h1><a class="anchor" id="autobahnnotes"></a>
+Autobahn Test Notes</h1>
+<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 implementation.</p>
+<p>2) Two 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.12 </li>
+  </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/menu.js b/doc/html/menu.js
new file mode 100644 (file)
index 0000000..97db4c2
--- /dev/null
@@ -0,0 +1,26 @@
+function initMenu(relPath,searchEnabled,serverSide,searchPage,search) {
+  function makeTree(data,relPath) {
+    var result='';
+    if ('children' in data) {
+      result+='<ul>';
+      for (var i in data.children) {
+        result+='<li><a href="'+relPath+data.children[i].url+'">'+
+                                data.children[i].text+'</a>'+
+                                makeTree(data.children[i],relPath)+'</li>';
+      }
+      result+='</ul>';
+    }
+    return result;
+  }
+
+  $('#main-nav').append(makeTree(menudata,relPath));
+  $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu');
+  if (searchEnabled) {
+    if (serverSide) {
+      $('#main-menu').append('<li style="float:right"><div id="MSearchBox" class="MSearchBoxInactive"><div class="left"><form id="FSearchBox" action="'+searchPage+'" method="get"><img id="MSearchSelect" src="'+relPath+'search/mag.png" alt=""/><input type="text" id="MSearchField" name="query" value="'+search+'" size="20" accesskey="S" onfocus="searchBox.OnSearchFieldFocus(true)" onblur="searchBox.OnSearchFieldFocus(false)"></form></div><div class="right"></div></div></li>');
+    } else {
+      $('#main-menu').append('<li style="float:right"><div id="MSearchBox" class="MSearchBoxInactive"><span class="left"><img id="MSearchSelect" src="'+relPath+'search/mag_sel.png" onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" alt=""/><input type="text" id="MSearchField" value="'+search+'" accesskey="S" onfocus="searchBox.OnSearchFieldFocus(true)" onblur="searchBox.OnSearchFieldFocus(false)" onkeyup="searchBox.OnSearchFieldChange(event)"/></span><span class="right"><a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="'+relPath+'search/close.png" alt=""/></a></span></div></li>');
+    }
+  }
+  $('#main-menu').smartmenus();
+}
diff --git a/doc/html/menudata.js b/doc/html/menudata.js
new file mode 100644 (file)
index 0000000..6df2f1d
--- /dev/null
@@ -0,0 +1,69 @@
+var menudata={children:[
+{text:'Main Page',url:'index.html'},
+{text:'Related Pages',url:'pages.html'},
+{text:'Modules',url:'modules.html'},
+{text:'Data Structures',url:'annotated.html',children:[
+{text:'Data Structures',url:'annotated.html'},
+{text:'Data Structure Index',url:'classes.html'},
+{text:'Class Hierarchy',url:'hierarchy.html'},
+{text:'Data Fields',url:'functions.html',children:[
+{text:'All',url:'functions.html',children:[
+{text:'_',url:'functions.html#index__'},
+{text:'a',url:'functions.html#index_a'},
+{text:'b',url:'functions.html#index_b'},
+{text:'c',url:'functions.html#index_c'},
+{text:'d',url:'functions.html#index_d'},
+{text:'e',url:'functions.html#index_e'},
+{text:'f',url:'functions.html#index_f'},
+{text:'g',url:'functions.html#index_g'},
+{text:'h',url:'functions.html#index_h'},
+{text:'i',url:'functions.html#index_i'},
+{text:'k',url:'functions.html#index_k'},
+{text:'l',url:'functions.html#index_l'},
+{text:'m',url:'functions.html#index_m'},
+{text:'n',url:'functions.html#index_n'},
+{text:'o',url:'functions.html#index_o'},
+{text:'p',url:'functions.html#index_p'},
+{text:'r',url:'functions.html#index_r'},
+{text:'s',url:'functions.html#index_s'},
+{text:'t',url:'functions.html#index_t'},
+{text:'u',url:'functions.html#index_u'},
+{text:'v',url:'functions.html#index_v'},
+{text:'w',url:'functions.html#index_w'}]},
+{text:'Functions',url:'functions_func.html'},
+{text:'Variables',url:'functions_vars.html',children:[
+{text:'_',url:'functions_vars.html#index__'},
+{text:'a',url:'functions_vars.html#index_a'},
+{text:'b',url:'functions_vars.html#index_b'},
+{text:'c',url:'functions_vars.html#index_c'},
+{text:'d',url:'functions_vars.html#index_d'},
+{text:'e',url:'functions_vars.html#index_e'},
+{text:'f',url:'functions_vars.html#index_f'},
+{text:'g',url:'functions_vars.html#index_g'},
+{text:'h',url:'functions_vars.html#index_h'},
+{text:'i',url:'functions_vars.html#index_i'},
+{text:'k',url:'functions_vars.html#index_k'},
+{text:'l',url:'functions_vars.html#index_l'},
+{text:'m',url:'functions_vars.html#index_m'},
+{text:'n',url:'functions_vars.html#index_n'},
+{text:'o',url:'functions_vars.html#index_o'},
+{text:'p',url:'functions_vars.html#index_p'},
+{text:'r',url:'functions_vars.html#index_r'},
+{text:'s',url:'functions_vars.html#index_s'},
+{text:'t',url:'functions_vars.html#index_t'},
+{text:'u',url:'functions_vars.html#index_u'},
+{text:'v',url:'functions_vars.html#index_v'},
+{text:'w',url:'functions_vars.html#index_w'}]}]}]},
+{text:'Files',url:'files.html',children:[
+{text:'File List',url:'files.html'},
+{text:'Globals',url:'globals.html',children:[
+{text:'All',url:'globals.html',children:[
+{text:'e',url:'globals.html#index_e'},
+{text:'l',url:'globals_l.html#index_l'}]},
+{text:'Functions',url:'globals_func.html',children:[
+{text:'l',url:'globals_func.html#index_l'}]},
+{text:'Typedefs',url:'globals_type.html'},
+{text:'Enumerations',url:'globals_enum.html'},
+{text:'Enumerator',url:'globals_eval.html',children:[
+{text:'e',url:'globals_eval.html#index_e'},
+{text:'l',url:'globals_eval.html#index_l'}]}]}]}]}
index 920f46e..d9efa4a 100644 (file)
@@ -136,7 +136,7 @@ var NAVTREEINDEX =
 "group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a87a824b2e812f4c3e7f2c4a1ea4f8abd",
 "group__service.html#ga9b3cc4473fd8848e5bbee7f310712939",
 "group__wsstatus.html#gaeca4afc94b1f026034f99cbba37e2f85",
-"structlws__http__mount.html#a6a9b1492a0b9749e39bd19932717a0b7"
+"structlws__http__mount.html#a614364c770b0bd4db464ad65cddab477"
 ];
 
 var SYNCONMSG = 'click to disable panel synchronisation';
index ad266fa..53872db 100644 (file)
@@ -223,12 +223,12 @@ var NAVTREEINDEX0 =
 "group__context-and-vhost.html#ga8ee0314028755f1ddfa9428e09b4fddb":[9,4,4],
 "group__context-and-vhost.html#ga94e6cc2223c4eec316b13bcebc3628b6":[11,0,0,0,118],
 "group__context-and-vhost.html#ga94e6cc2223c4eec316b13bcebc3628b6":[9,4,10],
-"group__context-and-vhost.html#ga98d88c9080fd89c37114363a6474ea73":[11,0,0,0,169],
 "group__context-and-vhost.html#ga98d88c9080fd89c37114363a6474ea73":[9,4,13],
+"group__context-and-vhost.html#ga98d88c9080fd89c37114363a6474ea73":[11,0,0,0,169],
 "group__context-and-vhost.html#gae2134657cdd2ea7a59e13ad314e4c50d":[11,0,0,0,117],
 "group__context-and-vhost.html#gae2134657cdd2ea7a59e13ad314e4c50d":[9,4,9],
-"group__context-and-vhost.html#gaeb12f934bfd178bd2132a9e73fc641da":[9,4,5],
 "group__context-and-vhost.html#gaeb12f934bfd178bd2132a9e73fc641da":[11,0,0,0,73],
+"group__context-and-vhost.html#gaeb12f934bfd178bd2132a9e73fc641da":[9,4,5],
 "group__context-and-vhost.html#gaf2fff58562caab7510c41eeac85a8648":[11,0,0,0,74],
 "group__context-and-vhost.html#gaf2fff58562caab7510c41eeac85a8648":[9,4,6],
 "group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5a1b2f8bde0f62adc7ebe81b2043f34c0c":[11,0,0,0,26,8],
index 0d647c0..86a63bc 100644 (file)
@@ -198,8 +198,8 @@ var NAVTREEINDEX1 =
 "group__misc.html#ga9f37d0e357de2ab4170723fcdb665d21":[9,8,10],
 "group__misc.html#gaa194584fff9698f3b280658f770ccd0f":[11,0,0,0,165],
 "group__misc.html#gaa194584fff9698f3b280658f770ccd0f":[9,8,11],
-"group__misc.html#gab321ed812f46f6dc7ef9e3ca6f00cf1b":[9,8,9],
 "group__misc.html#gab321ed812f46f6dc7ef9e3ca6f00cf1b":[11,0,0,0,141],
+"group__misc.html#gab321ed812f46f6dc7ef9e3ca6f00cf1b":[9,8,9],
 "group__misc.html#gac6abfc0b2bd5b2f09281a4432bb2f5f0":[9,8,4],
 "group__misc.html#gac6abfc0b2bd5b2f09281a4432bb2f5f0":[11,0,0,0,92],
 "group__misc.html#gacae4d7b6a8d22e4c2d82ff8b12c1e234":[9,8,1],
@@ -238,8 +238,8 @@ var NAVTREEINDEX1 =
 "group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193dabb6705e1d1327cdda5025be28f07712e":[9,13,0,3],
 "group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193dabb6705e1d1327cdda5025be28f07712e":[11,0,0,0,35,3],
 "group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193dae7d8a025a65524652fe9e24c2654c935":[11,0,0,0,35,6],
-"group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193daf6486c0dba50c44198100717721d9ab2":[11,0,0,0,35,1],
 "group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193daf6486c0dba50c44198100717721d9ab2":[9,13,0,1],
+"group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193daf6486c0dba50c44198100717721d9ab2":[11,0,0,0,35,1],
 "group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193dafe5a38e940ce56708ac814627e9c0917":[9,13,0,4],
 "group__sending-data.html#gga98b099cf8c1c7e38ad78501f270e193dafe5a38e940ce56708ac814627e9c0917":[11,0,0,0,35,7],
 "group__service.html":[9,0],
@@ -247,7 +247,7 @@ var NAVTREEINDEX1 =
 "group__service.html#ga29c246707997ab7a466aa709aecd2d7b":[11,0,0,0,61],
 "group__service.html#ga4fd9d714434ca499e2b3f7dbba86f241":[11,0,0,0,137],
 "group__service.html#ga4fd9d714434ca499e2b3f7dbba86f241":[9,0,3],
-"group__service.html#ga53e3d0801dfda7960a7249dd559e68a2":[11,0,0,0,60],
 "group__service.html#ga53e3d0801dfda7960a7249dd559e68a2":[9,0,0],
+"group__service.html#ga53e3d0801dfda7960a7249dd559e68a2":[11,0,0,0,60],
 "group__service.html#ga9b3cc4473fd8848e5bbee7f310712939":[11,0,0,0,140]
 };
index 0f7ee62..26a2915 100644 (file)
@@ -3,8 +3,8 @@ var NAVTREEINDEX2 =
 "group__service.html#ga9b3cc4473fd8848e5bbee7f310712939":[9,0,6],
 "group__service.html#gad82efa5466d14a9f05aa06416375b28d":[11,0,0,0,138],
 "group__service.html#gad82efa5466d14a9f05aa06416375b28d":[9,0,4],
-"group__service.html#gaebf426eda371ba23642fc11d8e0ace6b":[9,0,5],
 "group__service.html#gaebf426eda371ba23642fc11d8e0ace6b":[11,0,0,0,139],
+"group__service.html#gaebf426eda371ba23642fc11d8e0ace6b":[9,0,5],
 "group__service.html#gaf95bd0c663d6516a0c80047d9b1167a8":[11,0,0,0,136],
 "group__service.html#gaf95bd0c663d6516a0c80047d9b1167a8":[9,0,2],
 "group__sha.html":[9,11],
@@ -12,13 +12,13 @@ var NAVTREEINDEX2 =
 "group__sha.html#ga66316e6a5a0644a09d5a10e919dfdd8d":[11,0,0,0,51],
 "group__sha.html#ga7b09ab74646266f0b555103b3bb8dfe5":[11,0,0,0,146],
 "group__sha.html#ga7b09ab74646266f0b555103b3bb8dfe5":[9,11,2],
-"group__sha.html#gaf39765e4a3b413efb65e4698b2ec3575":[9,11,1],
 "group__sha.html#gaf39765e4a3b413efb65e4698b2ec3575":[11,0,0,0,52],
+"group__sha.html#gaf39765e4a3b413efb65e4698b2ec3575":[9,11,1],
 "group__smtp.html":[9,14],
 "group__smtp.html#ga116be79bf44f9dc2a97f46e051fe4dc0":[9,14,1],
 "group__smtp.html#ga116be79bf44f9dc2a97f46e051fe4dc0":[11,0,0,0,37],
-"group__smtp.html#ga25298a5afc1074e13b2d5711a86432b2":[9,14,3],
 "group__smtp.html#ga25298a5afc1074e13b2d5711a86432b2":[11,0,0,0,78],
+"group__smtp.html#ga25298a5afc1074e13b2d5711a86432b2":[9,14,3],
 "group__smtp.html#ga5e535e346d92a9daf00be33abf79d4eb":[9,14,2],
 "group__smtp.html#ga5e535e346d92a9daf00be33abf79d4eb":[11,0,0,0,77],
 "group__smtp.html#ga77fc9b56a1bb39484844981ec375fc29":[11,0,0,0,79],
@@ -27,8 +27,8 @@ var NAVTREEINDEX2 =
 "group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a1dfec948a864205cec875f63cbe0d4ad":[11,0,0,0,37,3],
 "group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a29e5b0ecf75375b5a643faa3d6222b7c":[9,14,1,0],
 "group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a29e5b0ecf75375b5a643faa3d6222b7c":[11,0,0,0,37,0],
-"group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a2c2ed16ffc572326e3040684084b21d5":[11,0,0,0,37,8],
 "group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a2c2ed16ffc572326e3040684084b21d5":[9,14,1,8],
+"group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a2c2ed16ffc572326e3040684084b21d5":[11,0,0,0,37,8],
 "group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a38fba41f28d754e38079b31418a86a69":[11,0,0,0,37,7],
 "group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a38fba41f28d754e38079b31418a86a69":[9,14,1,7],
 "group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a85e3c452950c09a79086bff4b9be5c14":[11,0,0,0,37,6],
@@ -42,8 +42,8 @@ var NAVTREEINDEX2 =
 "group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0ab89442b7a3ca2b94c3cdcf33756eb933":[9,14,1,1],
 "group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0ab89442b7a3ca2b94c3cdcf33756eb933":[11,0,0,0,37,1],
 "group__sock-adopt.html":[9,15],
-"group__sock-adopt.html#gab2d045df0f81afe00891aaed312d552b":[9,15,1],
 "group__sock-adopt.html#gab2d045df0f81afe00891aaed312d552b":[11,0,0,0,50],
+"group__sock-adopt.html#gab2d045df0f81afe00891aaed312d552b":[9,15,1],
 "group__sock-adopt.html#gabe71b7462afb21c767bdc67334f305af":[11,0,0,0,49],
 "group__sock-adopt.html#gabe71b7462afb21c767bdc67334f305af":[9,15,0],
 "group__timeout.html":[9,3],
@@ -77,8 +77,8 @@ var NAVTREEINDEX2 =
 "group__usercb.html":[9,16],
 "group__usercb.html#gad4fcb82e68d60ffacca61a3f783a0a2f":[11,0,0,0,8],
 "group__usercb.html#gad4fcb82e68d60ffacca61a3f783a0a2f":[9,16,0],
-"group__usercb.html#gad62860e19975ba4c4af401c3cdb6abf7":[11,0,0,0,22],
 "group__usercb.html#gad62860e19975ba4c4af401c3cdb6abf7":[9,16,1],
+"group__usercb.html#gad62860e19975ba4c4af401c3cdb6abf7":[11,0,0,0,22],
 "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a026502768778b8d79d62dd0fe4375fc6":[11,0,0,0,22,17],
 "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a026502768778b8d79d62dd0fe4375fc6":[9,16,1,17],
 "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a0418587d5083bb4850faa438648496ba":[11,0,0,0,22,49],
@@ -94,8 +94,8 @@ var NAVTREEINDEX2 =
 "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a1df60f314710236f9b53efbf468da768":[11,0,0,0,22,33],
 "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a1df60f314710236f9b53efbf468da768":[9,16,1,33],
 "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a23b90b5e5146e760bc3123ae1fd2a6e5":[11,0,0,0,22,40],
-"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a24d39bf1cfc0bad9d92da9ac1717e439":[11,0,0,0,22,0],
 "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a24d39bf1cfc0bad9d92da9ac1717e439":[9,16,1,0],
+"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a24d39bf1cfc0bad9d92da9ac1717e439":[11,0,0,0,22,0],
 "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a2db02fc6e1c17ab62b52109d1aa9d738":[11,0,0,0,22,7],
 "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a2db02fc6e1c17ab62b52109d1aa9d738":[9,16,1,7],
 "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a2fce9a8608220f32abbf1422a5498804":[11,0,0,0,22,14],
@@ -117,21 +117,21 @@ var NAVTREEINDEX2 =
 "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a7e12418eec9bce85735e6460176ab604":[11,0,0,0,22,3],
 "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a7ec8e2e9557ee02a4fc9f7dec7e2babc":[11,0,0,0,22,11],
 "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a7ec8e2e9557ee02a4fc9f7dec7e2babc":[9,16,1,11],
-"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a838b18d255c1b94a533287ba302a2eba":[9,16,1,5],
 "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a838b18d255c1b94a533287ba302a2eba":[11,0,0,0,22,5],
+"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a838b18d255c1b94a533287ba302a2eba":[9,16,1,5],
 "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a8909732521d379179003d97ab7a05428":[11,0,0,0,22,35],
 "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a8909732521d379179003d97ab7a05428":[9,16,1,35],
 "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a89862929a72bff65257ca1d51a0fce4d":[11,0,0,0,22,52],
 "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a8e8b2e6dbeac76d8d126947d2166a514":[11,0,0,0,22,10],
 "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a8e8b2e6dbeac76d8d126947d2166a514":[9,16,1,10],
-"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a909cc2a7018864b0b71abacc4058fd8f":[11,0,0,0,22,24],
 "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a909cc2a7018864b0b71abacc4058fd8f":[9,16,1,24],
+"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a909cc2a7018864b0b71abacc4058fd8f":[11,0,0,0,22,24],
 "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a982579753e70e59a9ea13ce628ac891a":[11,0,0,0,22,58],
 "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a982579753e70e59a9ea13ce628ac891a":[9,16,1,41],
 "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aa46f705dcf97502e95627ffde614f98b":[11,0,0,0,22,37],
 "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aa46f705dcf97502e95627ffde614f98b":[9,16,1,37],
-"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aa536e574a642ff3ab9e12bff7ba2c6a2":[9,16,1,2],
 "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aa536e574a642ff3ab9e12bff7ba2c6a2":[11,0,0,0,22,2],
+"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aa536e574a642ff3ab9e12bff7ba2c6a2":[9,16,1,2],
 "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aa5cc921b7697743017a533822a3d556a":[11,0,0,0,22,56],
 "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aa5cc921b7697743017a533822a3d556a":[9,16,1,39],
 "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aa627548e1296e654fcfab463ec3c9587":[11,0,0,0,22,15],
@@ -152,8 +152,8 @@ var NAVTREEINDEX2 =
 "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ac4c68e00efcf1ff7bda7ada462aff8ae":[11,0,0,0,22,13],
 "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ac4c68e00efcf1ff7bda7ada462aff8ae":[9,16,1,13],
 "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ac8c0ae966ef1877e0020c0077ff2e4a4":[11,0,0,0,22,41],
-"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aca834dc035b7f7486f9ce40fde54fe9e":[9,16,1,30],
 "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aca834dc035b7f7486f9ce40fde54fe9e":[11,0,0,0,22,30],
+"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aca834dc035b7f7486f9ce40fde54fe9e":[9,16,1,30],
 "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7accd8753672d319a30b4b4c2fb775e84d":[11,0,0,0,22,20],
 "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7accd8753672d319a30b4b4c2fb775e84d":[9,16,1,20],
 "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ad5d34583e3556e153eda91620b48cc49":[11,0,0,0,22,27],
@@ -164,16 +164,16 @@ var NAVTREEINDEX2 =
 "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ad8c6207b0c4e732f3d507f0fb79370e8":[11,0,0,0,22,1],
 "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7adfb41c92e2522712207ef7f2462b5e34":[11,0,0,0,22,31],
 "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7adfb41c92e2522712207ef7f2462b5e34":[9,16,1,31],
-"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ae4986291b7a810fe290851d73bebeb1c":[9,16,1,21],
 "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ae4986291b7a810fe290851d73bebeb1c":[11,0,0,0,22,21],
+"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ae4986291b7a810fe290851d73bebeb1c":[9,16,1,21],
 "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ae5ad65d779b7eab32ab67ceff91a3bac":[11,0,0,0,22,23],
 "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ae5ad65d779b7eab32ab67ceff91a3bac":[9,16,1,23],
-"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ae8d1de0bb56e03aa58cb4d44b18edd2e":[11,0,0,0,22,12],
 "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ae8d1de0bb56e03aa58cb4d44b18edd2e":[9,16,1,12],
-"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ae9734e1d7af2abf291665ce9e4a728d3":[11,0,0,0,22,19],
+"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ae8d1de0bb56e03aa58cb4d44b18edd2e":[11,0,0,0,22,12],
 "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ae9734e1d7af2abf291665ce9e4a728d3":[9,16,1,19],
-"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aeb0cec65ec82a713cd01e9ca9aeeb5e6":[11,0,0,0,22,57],
+"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ae9734e1d7af2abf291665ce9e4a728d3":[11,0,0,0,22,19],
 "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aeb0cec65ec82a713cd01e9ca9aeeb5e6":[9,16,1,40],
+"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aeb0cec65ec82a713cd01e9ca9aeeb5e6":[11,0,0,0,22,57],
 "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7af6cf80e57aae8ba0a57a5c456b1fe026":[11,0,0,0,22,55],
 "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7afc4b2f72cc9e424a750b506ce0cc4310":[11,0,0,0,22,51],
 "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7afd8fd77a1cc9405fcb4f26915d7f2d01":[11,0,0,0,22,29],
@@ -200,8 +200,8 @@ var NAVTREEINDEX2 =
 "group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437a8894d16316863077dfe530963ca59f67":[11,0,0,0,32,5],
 "group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437a946a88cf9c852eed2c0317f4115d19da":[9,4,0,2,6],
 "group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437a946a88cf9c852eed2c0317f4115d19da":[11,0,0,0,32,6],
-"group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437aec137a2434851bd856ceebfb697b9970":[11,0,0,0,32,4],
 "group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437aec137a2434851bd856ceebfb697b9970":[9,4,0,2,4],
+"group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437aec137a2434851bd856ceebfb697b9970":[11,0,0,0,32,4],
 "group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437afbd10eb4777517ed1f6bfdcf3b9ea1d1":[9,4,0,2,1],
 "group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437afbd10eb4777517ed1f6bfdcf3b9ea1d1":[11,0,0,0,32,1],
 "group__wsclose.html":[9,17],
@@ -218,25 +218,25 @@ var NAVTREEINDEX2 =
 "group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a3ffa38d5081b85fb739e02a747ccf2c4":[9,17,0,0],
 "group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a462c99b05459df700919cfd3f53c8276":[11,0,0,0,25,4],
 "group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a462c99b05459df700919cfd3f53c8276":[9,17,0,3],
-"group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a4b8a3b7ce6f731e5248e4b0fb64a5044":[9,17,0,5],
 "group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a4b8a3b7ce6f731e5248e4b0fb64a5044":[11,0,0,0,25,6],
-"group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a68b3d34bebd88547dcfa5cadba0acd6c":[9,17,0,6],
+"group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a4b8a3b7ce6f731e5248e4b0fb64a5044":[9,17,0,5],
 "group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a68b3d34bebd88547dcfa5cadba0acd6c":[11,0,0,0,25,7],
-"group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a7aef2da0062da606eeb35aaca5cf9050":[11,0,0,0,25,8],
+"group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a68b3d34bebd88547dcfa5cadba0acd6c":[9,17,0,6],
 "group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a7aef2da0062da606eeb35aaca5cf9050":[9,17,0,7],
+"group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a7aef2da0062da606eeb35aaca5cf9050":[11,0,0,0,25,8],
 "group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a9737a68759e739856b150ff9dfa30218":[11,0,0,0,25,2],
 "group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a9737a68759e739856b150ff9dfa30218":[9,17,0,1],
-"group__wsclose.html#ggae399c571df32ba532c0ca67da9284985ac6a161822783ee873be1c66f48d14e0e":[11,0,0,0,25,11],
 "group__wsclose.html#ggae399c571df32ba532c0ca67da9284985ac6a161822783ee873be1c66f48d14e0e":[9,17,0,10],
+"group__wsclose.html#ggae399c571df32ba532c0ca67da9284985ac6a161822783ee873be1c66f48d14e0e":[11,0,0,0,25,11],
 "group__wsclose.html#ggae399c571df32ba532c0ca67da9284985acc9a317c70363dd88e823e066b2c73b7":[11,0,0,0,25,0],
-"group__wsclose.html#ggae399c571df32ba532c0ca67da9284985ad0869604d79e13700ae5d196a431b350":[9,17,0,11],
 "group__wsclose.html#ggae399c571df32ba532c0ca67da9284985ad0869604d79e13700ae5d196a431b350":[11,0,0,0,25,12],
-"group__wsclose.html#ggae399c571df32ba532c0ca67da9284985ad09e68295eabdddcba4e332fbea70ae5":[11,0,0,0,25,9],
+"group__wsclose.html#ggae399c571df32ba532c0ca67da9284985ad0869604d79e13700ae5d196a431b350":[9,17,0,11],
 "group__wsclose.html#ggae399c571df32ba532c0ca67da9284985ad09e68295eabdddcba4e332fbea70ae5":[9,17,0,8],
-"group__wsclose.html#ggae399c571df32ba532c0ca67da9284985ad2b477a91c8445bf34ecd43977f9b390":[11,0,0,0,25,13],
+"group__wsclose.html#ggae399c571df32ba532c0ca67da9284985ad09e68295eabdddcba4e332fbea70ae5":[11,0,0,0,25,9],
 "group__wsclose.html#ggae399c571df32ba532c0ca67da9284985ad2b477a91c8445bf34ecd43977f9b390":[9,17,0,12],
-"group__wsclose.html#ggae399c571df32ba532c0ca67da9284985af90cb98d983ad3d4c79df9b6f3d4a4d2":[11,0,0,0,25,5],
+"group__wsclose.html#ggae399c571df32ba532c0ca67da9284985ad2b477a91c8445bf34ecd43977f9b390":[11,0,0,0,25,13],
 "group__wsclose.html#ggae399c571df32ba532c0ca67da9284985af90cb98d983ad3d4c79df9b6f3d4a4d2":[9,17,0,4],
+"group__wsclose.html#ggae399c571df32ba532c0ca67da9284985af90cb98d983ad3d4c79df9b6f3d4a4d2":[11,0,0,0,25,5],
 "group__wsstatus.html":[9,18],
 "group__wsstatus.html#ga08e9ee165fca503fd9427d55cfecac37":[9,18,3],
 "group__wsstatus.html#ga08e9ee165fca503fd9427d55cfecac37":[11,0,0,0,115],
@@ -244,8 +244,8 @@ var NAVTREEINDEX2 =
 "group__wsstatus.html#ga26a140623d202dd2bf2004deb6994baa":[11,0,0,0,116],
 "group__wsstatus.html#ga2bb3655329b4651cd06f79ee3a764421":[9,18,6],
 "group__wsstatus.html#ga2bb3655329b4651cd06f79ee3a764421":[11,0,0,0,133],
-"group__wsstatus.html#ga3df5045656dfb6b0e63a38de2dca79d2":[11,0,0,0,100],
 "group__wsstatus.html#ga3df5045656dfb6b0e63a38de2dca79d2":[9,18,1],
+"group__wsstatus.html#ga3df5045656dfb6b0e63a38de2dca79d2":[11,0,0,0,100],
 "group__wsstatus.html#ga4ad226d5e01024b4046f4a5a37199aa1":[9,18,2],
 "group__wsstatus.html#ga4ad226d5e01024b4046f4a5a37199aa1":[11,0,0,0,114],
 "group__wsstatus.html#gaccd9c59336efad8af0554f79cc5966fd":[9,18,0],
index 7b36d3d..a4dbebd 100644 (file)
@@ -3,8 +3,8 @@ var NAVTREEINDEX3 =
 "group__wsstatus.html#gaeca4afc94b1f026034f99cbba37e2f85":[9,18,5],
 "group__wsstatus.html#gaeca4afc94b1f026034f99cbba37e2f85":[11,0,0,0,124],
 "hierarchy.html":[10,2],
-"index.html":[0],
 "index.html":[],
+"index.html":[0],
 "libwebsockets_8h.html":[11,0,0,0],
 "libwebsockets_8h.html#a0b056fdcf949a838ff82209b4a627dd9":[11,0,0,0,171],
 "libwebsockets_8h.html#a17f5fc891b31d2920bd18b0d66d6cb25":[11,0,0,0,176],
@@ -242,12 +242,12 @@ var NAVTREEINDEX3 =
 "structlws__gs__event__args.html#a477274f8ca22ba7411b9285b9dc8dd06":[9,10,0,3,1],
 "structlws__gs__event__args.html#acd17e4f9f91f7f9a8f0fbf0744a3a463":[9,10,0,3,0],
 "structlws__http__mount.html":[9,4,0,1],
-"structlws__http__mount.html#a0109baf93f23c07c824c997c3533ee44":[9,4,0,1,10],
-"structlws__http__mount.html#a05347d92c3d379809564bd4f3eab259b":[9,4,0,1,15],
-"structlws__http__mount.html#a11ea62b952710d59733dbcf9794a5773":[9,4,0,1,9],
-"structlws__http__mount.html#a21d86fd6043ec00e121ababbc29af39a":[9,4,0,1,13],
-"structlws__http__mount.html#a4283e30ea89d27ae7d061ad760d1d146":[9,4,0,1,2],
-"structlws__http__mount.html#a4437423df85ee3dbcae0e15974c89ec7":[9,4,0,1,8],
-"structlws__http__mount.html#a4a7239d6d4c03986e6e1a72abb6c83aa":[9,4,0,1,5],
-"structlws__http__mount.html#a614364c770b0bd4db464ad65cddab477":[9,4,0,1,0]
+"structlws__http__mount.html#a0109baf93f23c07c824c997c3533ee44":[9,4,0,1,11],
+"structlws__http__mount.html#a05347d92c3d379809564bd4f3eab259b":[9,4,0,1,16],
+"structlws__http__mount.html#a11ea62b952710d59733dbcf9794a5773":[9,4,0,1,10],
+"structlws__http__mount.html#a21d86fd6043ec00e121ababbc29af39a":[9,4,0,1,14],
+"structlws__http__mount.html#a2f6c7dbc2d714b7259c67b7744d4ff98":[9,4,0,1,1],
+"structlws__http__mount.html#a4283e30ea89d27ae7d061ad760d1d146":[9,4,0,1,3],
+"structlws__http__mount.html#a4437423df85ee3dbcae0e15974c89ec7":[9,4,0,1,9],
+"structlws__http__mount.html#a4a7239d6d4c03986e6e1a72abb6c83aa":[9,4,0,1,6]
 };
index 6988494..d68ad8d 100644 (file)
@@ -1,13 +1,14 @@
 var NAVTREEINDEX4 =
 {
-"structlws__http__mount.html#a6a9b1492a0b9749e39bd19932717a0b7":[9,4,0,1,14],
-"structlws__http__mount.html#a8316dd183ffbef50419a5a4968d35d84":[9,4,0,1,3],
-"structlws__http__mount.html#aa2391bfcada0b7a290b3c6651f64586c":[9,4,0,1,11],
-"structlws__http__mount.html#aabec1a326780aafe11b977000983be0c":[9,4,0,1,1],
-"structlws__http__mount.html#ac8489b60b8f969eb19c9abbdeac90743":[9,4,0,1,12],
-"structlws__http__mount.html#ae137203040c6153694bd88a708da5395":[9,4,0,1,4],
-"structlws__http__mount.html#ae7b5c0f4c5408061e6ea3a8d281f45af":[9,4,0,1,6],
-"structlws__http__mount.html#ae90d1efe7178199fad39de2926902ee4":[9,4,0,1,7],
+"structlws__http__mount.html#a614364c770b0bd4db464ad65cddab477":[9,4,0,1,0],
+"structlws__http__mount.html#a6a9b1492a0b9749e39bd19932717a0b7":[9,4,0,1,15],
+"structlws__http__mount.html#a8316dd183ffbef50419a5a4968d35d84":[9,4,0,1,4],
+"structlws__http__mount.html#aa2391bfcada0b7a290b3c6651f64586c":[9,4,0,1,12],
+"structlws__http__mount.html#aabec1a326780aafe11b977000983be0c":[9,4,0,1,2],
+"structlws__http__mount.html#ac8489b60b8f969eb19c9abbdeac90743":[9,4,0,1,13],
+"structlws__http__mount.html#ae137203040c6153694bd88a708da5395":[9,4,0,1,5],
+"structlws__http__mount.html#ae7b5c0f4c5408061e6ea3a8d281f45af":[9,4,0,1,7],
+"structlws__http__mount.html#ae90d1efe7178199fad39de2926902ee4":[9,4,0,1,8],
 "structlws__plat__file__ops.html":[9,20,0],
 "structlws__plat__file__ops.html#a01f483807a9862736b17ba9ed5110c40":[9,20,0,2],
 "structlws__plat__file__ops.html#a034ec96f2fbaf52b4aa3e82d20795f7b":[9,20,0,0],
@@ -51,14 +52,14 @@ var NAVTREEINDEX4 =
 "structlws__process__html__state.html#adcafd17704775b4bbeea9561fb340968":[9,6,1,1,0],
 "structlws__process__html__state.html#af0732884ef891e24fe5fa237ebaa21a3":[9,6,1,1,4],
 "structlws__process__html__state.html#af21119890fdfebe28fb5c4dabfc1bdf5":[9,6,1,1,1],
-"structlws__protocol__vhost__options.html":[9,4,0,0],
 "structlws__protocol__vhost__options.html":[9,4,2],
+"structlws__protocol__vhost__options.html":[9,4,0,0],
 "structlws__protocol__vhost__options.html#a0640a92513c70ee6b9b295a9ad1658e7":[9,4,0,0,3],
 "structlws__protocol__vhost__options.html#a0640a92513c70ee6b9b295a9ad1658e7":[9,4,2,3],
-"structlws__protocol__vhost__options.html#abc714ddb4171756fc8196e9823a1e21c":[9,4,0,0,1],
 "structlws__protocol__vhost__options.html#abc714ddb4171756fc8196e9823a1e21c":[9,4,2,1],
-"structlws__protocol__vhost__options.html#acf9db77f8eb64cd4e314be9b43d8a8b9":[9,4,0,0,0],
+"structlws__protocol__vhost__options.html#abc714ddb4171756fc8196e9823a1e21c":[9,4,0,0,1],
 "structlws__protocol__vhost__options.html#acf9db77f8eb64cd4e314be9b43d8a8b9":[9,4,2,0],
+"structlws__protocol__vhost__options.html#acf9db77f8eb64cd4e314be9b43d8a8b9":[9,4,0,0,0],
 "structlws__protocol__vhost__options.html#afd99fbc90be51ea2465b550c2ec47822":[9,4,2,2],
 "structlws__protocol__vhost__options.html#afd99fbc90be51ea2465b550c2ec47822":[9,4,0,0,2],
 "structlws__protocols.html":[9,10,1],
@@ -76,12 +77,12 @@ var NAVTREEINDEX4 =
 "structlws__session__info.html#afb924864b70f40372920688a5c1c895e":[9,10,0,2,2],
 "structlws__token__limits.html":[9,6,4,1],
 "structlws__token__limits.html#a6ec712306cbf8585bce7a56758a3ceff":[9,6,4,1,0],
-"structlws__tokens.html":[9,6,4,0],
 "structlws__tokens.html":[9,6,6],
+"structlws__tokens.html":[9,6,4,0],
 "structlws__tokens.html#a855b7375d1d58516c0ecd4b60e9a7766":[9,6,6,1],
 "structlws__tokens.html#a855b7375d1d58516c0ecd4b60e9a7766":[9,6,4,0,1],
-"structlws__tokens.html#a9f3635412bc71a5cb78e9862b55f10cd":[9,6,4,0,0],
 "structlws__tokens.html#a9f3635412bc71a5cb78e9862b55f10cd":[9,6,6,0],
+"structlws__tokens.html#a9f3635412bc71a5cb78e9862b55f10cd":[9,6,4,0,0],
 "structlwsgw__hash.html":[9,10,0,1],
 "structlwsgw__hash.html#a29435f5cf78747d4257695b0f141d164":[9,10,0,1,0],
 "structlwsgw__hash__bin.html":[9,10,0,0],
index 75f633e..fac9467 100644 (file)
@@ -81,6 +81,8 @@ Data Fields</h2></td></tr>
 <tr class="separator:ae90d1efe7178199fad39de2926902ee4"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:a05347d92c3d379809564bd4f3eab259b"><td class="memItemLeft" align="right" valign="top">const char *&#160;</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">&#160;</td></tr>
+<tr class="memitem:a2f6c7dbc2d714b7259c67b7744d4ff98"><td class="memItemLeft" align="right" valign="top">const char *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__http__mount.html#a2f6c7dbc2d714b7259c67b7744d4ff98">basic_auth_login_file</a></td></tr>
+<tr class="separator:a2f6c7dbc2d714b7259c67b7744d4ff98"><td class="memSeparator" colspan="2">&#160;</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> *&#160;</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">&#160;</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> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structlws__http__mount.html#a4437423df85ee3dbcae0e15974c89ec7">extra_mimetypes</a></td></tr>
@@ -123,6 +125,21 @@ Data Fields</h2></td></tr>
 
 </div>
 </div>
+<a id="a2f6c7dbc2d714b7259c67b7744d4ff98"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a2f6c7dbc2d714b7259c67b7744d4ff98">&sect;&nbsp;</a></span>basic_auth_login_file</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">const char* lws_http_mount::basic_auth_login_file</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<p>NULL, or filepath to use to check basic auth logins against </p>
+
+</div>
+</div>
 <a id="aabec1a326780aafe11b977000983be0c"></a>
 <h2 class="memtitle"><span class="permalink"><a href="#aabec1a326780aafe11b977000983be0c">&sect;&nbsp;</a></span>cache_intermediaries</h2>
 
index b75490e..1433c65 100644 (file)
@@ -1,6 +1,7 @@
 var structlws__http__mount =
 [
     [ "auth_mask", "structlws__http__mount.html#a614364c770b0bd4db464ad65cddab477", null ],
+    [ "basic_auth_login_file", "structlws__http__mount.html#a2f6c7dbc2d714b7259c67b7744d4ff98", 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 ],
index 76c04a3..699dfc6 100644 (file)
@@ -75,6 +75,7 @@ static const char * const paths_vhosts[] = {
        "vhosts[].mounts[].cache-max-age",
        "vhosts[].mounts[].cache-reuse",
        "vhosts[].mounts[].cache-revalidate",
+       "vhosts[].mounts[].basic-auth",
        "vhosts[].mounts[].cache-intermediaries",
        "vhosts[].mounts[].extra-mimetypes.*",
        "vhosts[].mounts[].interpret.*",
@@ -116,6 +117,7 @@ enum lejp_vhost_paths {
        LEJPVP_MOUNT_CACHE_MAX_AGE,
        LEJPVP_MOUNT_CACHE_REUSE,
        LEJPVP_MOUNT_CACHE_REVALIDATE,
+       LEJPVP_MOUNT_BASIC_AUTH,
        LEJPVP_MOUNT_CACHE_INTERMEDIARIES,
        LEJPVP_MOUNT_EXTRA_MIMETYPES,
        LEJPVP_MOUNT_INTERPRET,
@@ -521,6 +523,9 @@ lejp_vhosts_cb(struct lejp_ctx *ctx, char reason)
        case LEJPVP_MOUNT_CACHE_INTERMEDIARIES:
                a->m.cache_intermediaries = arg_to_bool(ctx->buf);;
                return 0;
+       case LEJPVP_MOUNT_BASIC_AUTH:
+               a->m.basic_auth_login_file = a->p;
+               break;
        case LEJPVP_CGI_TIMEOUT:
                a->m.cgi_timeout = atoi(ctx->buf);
                return 0;
index 2de732e..8a2ae4b 100644 (file)
@@ -1964,6 +1964,19 @@ struct lws_http_mount {
 
        unsigned char origin_protocol; /**< one of enum lws_mount_protocols */
        unsigned char mountpoint_len; /**< length of mountpoint string */
+
+       const char *basic_auth_login_file;
+       /**<NULL, or filepath to use to check basic auth logins against */
+
+       /* 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[2]; /**< dummy */
 };
 ///@}
 ///@}
index d4a9d16..3d0d4cd 100644 (file)
@@ -525,6 +525,85 @@ lws_find_mount(struct lws *wsi, const char *uri_ptr, int uri_len)
        return hit;
 }
 
+#ifdef LWS_POSIX
+
+static int
+lws_find_string_in_file(const char *filename, const char *string, int stringlen)
+{
+       char buf[128];
+       int fd, match = 0, pos = 0, n = 0, hit = 0;
+
+       fd = open(filename, O_RDONLY);
+       if (fd < 0) {
+               lwsl_err("can't open auth file: %s\n", filename);
+               return 1;
+       }
+
+       while (1) {
+               if (pos == n) {
+                       n = read(fd, buf, sizeof(buf));
+                       if (n <= 0) {
+                               if (match == stringlen)
+                                       hit = 1;
+                               break;
+                       }
+                       pos = 0;
+               }
+
+               if (match == stringlen) {
+                       if (buf[pos] == '\r' || buf[pos] == '\n') {
+                               hit = 1;
+                               break;
+                       }
+                       match = 0;
+               }
+
+               if (buf[pos] == string[match])
+                       match++;
+               else
+                       match = 0;
+
+               pos++;
+       }
+
+       close(fd);
+
+       return hit;
+}
+
+static int
+lws_unauthorised_basic_auth(struct lws *wsi)
+{
+       struct lws_context_per_thread *pt = &wsi->context->pt[(int)wsi->tsi];
+       unsigned char *start = pt->serv_buf + LWS_PRE,
+                     *p = start, *end = p + 512;
+       char buf[64];
+       int n;
+
+       /* no auth... tell him it is required */
+
+       if (lws_add_http_header_status(wsi, HTTP_STATUS_UNAUTHORIZED, &p, end))
+               return -1;
+
+       n = lws_snprintf(buf, sizeof(buf), "Basic realm=\"lwsws\"");
+       if (lws_add_http_header_by_token(wsi,
+                       WSI_TOKEN_HTTP_WWW_AUTHENTICATE,
+                       (unsigned char *)buf, n, &p, end))
+               return -1;
+
+       if (lws_finalize_http_header(wsi, &p, end))
+               return -1;
+
+       n = lws_write(wsi, start, p - start, LWS_WRITE_HTTP_HEADERS);
+       if (n < 0)
+               return -1;
+
+       return lws_http_transaction_completed(wsi);
+
+}
+
+#endif
+
 int
 lws_http_action(struct lws *wsi)
 {
@@ -829,6 +908,52 @@ lws_http_action(struct lws *wsi)
                return lws_http_transaction_completed(wsi);
        }
 
+#ifdef LWS_POSIX
+       /* basic auth? */
+
+       if (hit->basic_auth_login_file) {
+               char b64[160], plain[(sizeof(b64) * 3) / 4];
+               int m;
+
+               /* Did he send auth? */
+               if (!lws_hdr_total_length(wsi, WSI_TOKEN_HTTP_AUTHORIZATION))
+                       return lws_unauthorised_basic_auth(wsi);
+
+               n = HTTP_STATUS_FORBIDDEN;
+
+               m = lws_hdr_copy(wsi, b64, sizeof(b64), WSI_TOKEN_HTTP_AUTHORIZATION);
+               if (m < 7) {
+                       lwsl_err("b64 auth too long\n");
+                       goto transaction_result_n;
+               }
+
+               b64[5] = '\0';
+               if (strcasecmp(b64, "Basic")) {
+                       lwsl_err("auth missing basic: %s\n", b64);
+                       goto transaction_result_n;
+               }
+
+               /* It'll be like Authorization: Basic QWxhZGRpbjpPcGVuU2VzYW1l */
+
+               m = lws_b64_decode_string(b64 + 6, plain, sizeof(plain));
+               if (m < 0) {
+                       lwsl_err("plain auth too long\n");
+                       goto transaction_result_n;
+               }
+
+//             lwsl_notice(plain);
+
+               if (!lws_find_string_in_file(hit->basic_auth_login_file, plain, m)) {
+                       lwsl_err("basic auth lookup failed\n");
+                       return lws_unauthorised_basic_auth(wsi);
+               }
+
+               lwsl_notice("basic auth accepted\n");
+
+               /* accept the auth */
+       }
+#endif
+
        /*
         * A particular protocol callback is mounted here?
         *
@@ -983,6 +1108,10 @@ bail_nuke_ah:
        lws_header_table_detach(wsi, 1);
 
        return 1;
+
+transaction_result_n:
+       lws_return_http_status(wsi, n, NULL);
+       return lws_http_transaction_completed(wsi);
 }
 
 int
@@ -1227,6 +1356,8 @@ upgrade_ws:
 
                        n = 0;
                        while (wsi->vhost->protocols[n].callback) {
+                               lwsl_info("try %s\n", wsi->vhost->protocols[n].name);
+
                                if (wsi->vhost->protocols[n].name &&
                                    !strcmp(wsi->vhost->protocols[n].name,
                                            protocol_name)) {
diff --git a/test-server/private/index.html b/test-server/private/index.html
new file mode 100644 (file)
index 0000000..7a4f2af
--- /dev/null
@@ -0,0 +1 @@
+Protected by basic auth
index d12c0b6..87118e6 100644 (file)
@@ -92,6 +92,9 @@ static const struct lws_http_mount mount_post = {
        0,
        LWSMPRO_CALLBACK,       /* origin points to a callback */
        9,                      /* strlen("/formtest"), ie length of the mountpoint */
+       NULL,
+
+       { NULL, NULL } // sentinel
 };
 
 /*
@@ -101,7 +104,7 @@ static const struct lws_http_mount mount_post = {
  */
 
 static const struct lws_http_mount mount = {
-       (struct lws_http_mount *)&mount_post,           /* linked-list pointer to next*/
+       (struct lws_http_mount *)&mount_post,   /* linked-list pointer to next*/
        "/",            /* mountpoint in URL namespace on this vhost */
        LOCAL_RESOURCE_PATH, /* where to go on the filesystem for that */
        "test.html",    /* default filename if none given */
@@ -117,6 +120,9 @@ static const struct lws_http_mount mount = {
        0,
        LWSMPRO_FILE,   /* mount type is a directory in a filesystem */
        1,              /* strlen("/"), ie length of the mountpoint */
+       NULL,
+
+       { NULL, NULL } // sentinel
 };
 
 /*