From: Andy Green Date: Wed, 12 Oct 2016 22:32:57 +0000 (+0800) Subject: Add reject service keywords list X-Git-Tag: accepted/tizen/4.0/unified/20171012.191640~318 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=3b93e344f6ddd084004929abe684a1dd42276973;p=platform%2Fupstream%2Flibwebsockets.git Add reject service keywords list --- diff --git a/README.lwsws.md b/README.lwsws.md index 161a64c..5ea4a2a 100644 --- a/README.lwsws.md +++ b/README.lwsws.md @@ -79,6 +79,17 @@ on port 7681, non-SSL is provided. To set it up # sudo lwsws ``` +@section lwsogo Other Global Options + + - `reject-service-keywords` allows you to return an HTTP error code and message of your choice +if a keyword is found in the user agent + +``` + "reject-service-keywords": [{ + "scumbot": "404 Not Found" + }] +``` + @section lwswsv Lwsws Vhosts One server can run many vhosts, where SSL is in use SNI is used to match diff --git a/doc/html/functions.html b/doc/html/functions.html index c28b3bb..10ae84a 100644 --- a/doc/html/functions.html +++ b/doc/html/functions.html @@ -515,6 +515,9 @@ $(document).ready(function(){initNavTree('functions.html','');});
  • read : lws_plat_file_ops
  • +
  • reject_service_keywords +: lws_context_creation_info +
  • replace : lws_process_html_state
  • diff --git a/doc/html/functions_vars.html b/doc/html/functions_vars.html index 263f7a2..268d6fe 100644 --- a/doc/html/functions_vars.html +++ b/doc/html/functions_vars.html @@ -503,6 +503,9 @@ $(document).ready(function(){initNavTree('functions_vars.html','');});
  • read : lws_plat_file_ops
  • +
  • reject_service_keywords +: lws_context_creation_info +
  • replace : lws_process_html_state
  • diff --git a/doc/html/group__client.html b/doc/html/group__client.html index 31ce667..026da38 100644 --- a/doc/html/group__client.html +++ b/doc/html/group__client.html @@ -115,7 +115,7 @@ LWS_VISIBLE LWS_EXTERN void <

    #include <lib/libwebsockets.h>

    enum lws_client_connect_ssl_connection_flags - flags that may be used with struct lws_client_connect_info ssl_connection member to control if and how SSL checks apply to the client connection being created

    -
    1975  {
    1976  LCCSCF_USE_SSL = (1 << 0),
    1977  LCCSCF_ALLOW_SELFSIGNED = (1 << 1),
    1978  LCCSCF_SKIP_SERVER_CERT_HOSTNAME_CHECK = (1 << 2)
    1979 };
    +
    1983  {
    1984  LCCSCF_USE_SSL = (1 << 0),
    1985  LCCSCF_ALLOW_SELFSIGNED = (1 << 1),
    1986  LCCSCF_SKIP_SERVER_CERT_HOSTNAME_CHECK = (1 << 2)
    1987 };

    Function Documentation

    diff --git a/doc/html/group__context-and-vhost.js b/doc/html/group__context-and-vhost.js index 360567f..09804a4 100644 --- a/doc/html/group__context-and-vhost.js +++ b/doc/html/group__context-and-vhost.js @@ -29,6 +29,7 @@ var group__context_and_vhost = [ "provided_client_ssl_ctx", "structlws__context__creation__info.html#a0e790dda6202604f73a03b6149bc12bb", null ], [ "pt_serv_buf_size", "structlws__context__creation__info.html#a57f88c0745adbd1d6b9b619b8de30209", null ], [ "pvo", "structlws__context__creation__info.html#a999866fcd15dbd621773436f97190458", null ], + [ "reject_service_keywords", "structlws__context__creation__info.html#a6b059b7ee248cba72a3a4fd6141b0b34", null ], [ "server_string", "structlws__context__creation__info.html#a137a9b9de4f6a7993fed8746d551e616", null ], [ "ssl_ca_filepath", "structlws__context__creation__info.html#a4f8e65c3a059d3b586fafa9ef3282c29", null ], [ "ssl_cert_filepath", "structlws__context__creation__info.html#ac62b0f0e8e402412ba5011d15c244103", null ], diff --git a/doc/html/group__form-parsing.html b/doc/html/group__form-parsing.html index 9c7f972..cc54157 100644 --- a/doc/html/group__form-parsing.html +++ b/doc/html/group__form-parsing.html @@ -156,9 +156,9 @@ Functions

    a new file is starting to arrive

    -
    2821  {
    2826  LWS_UFS_OPEN
    2828 };
    Definition: libwebsockets.h:2824
    -
    Definition: libwebsockets.h:2826
    -
    Definition: libwebsockets.h:2822
    +
    2829  {
    2834  LWS_UFS_OPEN
    2836 };
    Definition: libwebsockets.h:2832
    +
    Definition: libwebsockets.h:2834
    +
    Definition: libwebsockets.h:2830
    diff --git a/doc/html/group__sending-data.html b/doc/html/group__sending-data.html index 2be7616..644c8b4 100644 --- a/doc/html/group__sending-data.html +++ b/doc/html/group__sending-data.html @@ -130,13 +130,13 @@ Functions

    client packet payload goes out on wire unmunged only useful for security tests since normal servers cannot decode the content if used

    -
    3165  {
    3166  LWS_WRITE_TEXT = 0,
    3170  LWS_WRITE_BINARY = 1,
    3176  LWS_WRITE_HTTP = 3,
    3179  /* LWS_WRITE_CLOSE is handled by lws_close_reason() */
    3180  LWS_WRITE_PING = 5,
    3181  LWS_WRITE_PONG = 6,
    3182 
    3183  /* Same as write_http but we know this write ends the transaction */
    3184  LWS_WRITE_HTTP_FINAL = 7,
    3185 
    3186  /* HTTP2 */
    3187 
    3195  /****** add new things just above ---^ ******/
    3196 
    3197  /* flags */
    3198 
    3199  LWS_WRITE_NO_FIN = 0x40,
    3206 };
    Definition: libwebsockets.h:3176
    -
    Definition: libwebsockets.h:3199
    -
    Definition: libwebsockets.h:3166
    -
    Definition: libwebsockets.h:3170
    -
    Definition: libwebsockets.h:3202
    -
    Definition: libwebsockets.h:3173
    -
    Definition: libwebsockets.h:3188
    +
    3173  {
    3174  LWS_WRITE_TEXT = 0,
    3178  LWS_WRITE_BINARY = 1,
    3184  LWS_WRITE_HTTP = 3,
    3187  /* LWS_WRITE_CLOSE is handled by lws_close_reason() */
    3188  LWS_WRITE_PING = 5,
    3189  LWS_WRITE_PONG = 6,
    3190 
    3191  /* Same as write_http but we know this write ends the transaction */
    3192  LWS_WRITE_HTTP_FINAL = 7,
    3193 
    3194  /* HTTP2 */
    3195 
    3203  /****** add new things just above ---^ ******/
    3204 
    3205  /* flags */
    3206 
    3207  LWS_WRITE_NO_FIN = 0x40,
    3214 };
    Definition: libwebsockets.h:3184
    +
    Definition: libwebsockets.h:3207
    +
    Definition: libwebsockets.h:3174
    +
    Definition: libwebsockets.h:3178
    +
    Definition: libwebsockets.h:3210
    +
    Definition: libwebsockets.h:3181
    +
    Definition: libwebsockets.h:3196
    diff --git a/doc/html/group__smtp.html b/doc/html/group__smtp.html index e884096..1384462 100644 --- a/doc/html/group__smtp.html +++ b/doc/html/group__smtp.html @@ -157,15 +157,15 @@ Functions

    sent the session quit

    -
    4120  {
    4121  LGSSMTP_IDLE,
    4126  LGSSMTP_SENT_TO,
    4130 };
    Definition: libwebsockets.h:4123
    -
    Definition: libwebsockets.h:4128
    -
    Definition: libwebsockets.h:4121
    -
    Definition: libwebsockets.h:4122
    -
    Definition: libwebsockets.h:4126
    -
    Definition: libwebsockets.h:4125
    -
    Definition: libwebsockets.h:4129
    -
    Definition: libwebsockets.h:4124
    -
    Definition: libwebsockets.h:4127
    +
    4128  {
    4129  LGSSMTP_IDLE,
    4134  LGSSMTP_SENT_TO,
    4138 };
    Definition: libwebsockets.h:4131
    +
    Definition: libwebsockets.h:4136
    +
    Definition: libwebsockets.h:4129
    +
    Definition: libwebsockets.h:4130
    +
    Definition: libwebsockets.h:4134
    +
    Definition: libwebsockets.h:4133
    +
    Definition: libwebsockets.h:4137
    +
    Definition: libwebsockets.h:4132
    +
    Definition: libwebsockets.h:4135
    diff --git a/doc/html/group__vhost-mounts.html b/doc/html/group__vhost-mounts.html index ae2a16a..8530987 100644 --- a/doc/html/group__vhost-mounts.html +++ b/doc/html/group__vhost-mounts.html @@ -129,13 +129,13 @@ Enumerations

    hand by named protocol's callback

    -
    1911  {
    1912  LWSMPRO_HTTP = 0,
    1913  LWSMPRO_HTTPS = 1,
    1914  LWSMPRO_FILE = 2,
    1915  LWSMPRO_CGI = 3,
    1916  LWSMPRO_REDIR_HTTP = 4,
    1917  LWSMPRO_REDIR_HTTPS = 5,
    1918  LWSMPRO_CALLBACK = 6,
    1919 };
    Definition: libwebsockets.h:1915
    -
    Definition: libwebsockets.h:1913
    -
    Definition: libwebsockets.h:1914
    -
    Definition: libwebsockets.h:1916
    -
    Definition: libwebsockets.h:1917
    -
    Definition: libwebsockets.h:1912
    -
    Definition: libwebsockets.h:1918
    +
    1919  {
    1920  LWSMPRO_HTTP = 0,
    1921  LWSMPRO_HTTPS = 1,
    1922  LWSMPRO_FILE = 2,
    1923  LWSMPRO_CGI = 3,
    1924  LWSMPRO_REDIR_HTTP = 4,
    1925  LWSMPRO_REDIR_HTTPS = 5,
    1926  LWSMPRO_CALLBACK = 6,
    1927 };
    Definition: libwebsockets.h:1923
    +
    Definition: libwebsockets.h:1921
    +
    Definition: libwebsockets.h:1922
    +
    Definition: libwebsockets.h:1924
    +
    Definition: libwebsockets.h:1925
    +
    Definition: libwebsockets.h:1920
    +
    Definition: libwebsockets.h:1926
    diff --git a/doc/html/libwebsockets_8h_source.html b/doc/html/libwebsockets_8h_source.html index c8e2c23..bd3a1de 100644 --- a/doc/html/libwebsockets_8h_source.html +++ b/doc/html/libwebsockets_8h_source.html @@ -71,9 +71,9 @@ $(document).ready(function(){initNavTree('libwebsockets_8h_source.html','');});
    libwebsockets.h
    -Go to the documentation of this file.
    1 /*
    2  * libwebsockets - small server side websockets and web server implementation
    3  *
    4  * Copyright (C) 2010-2016 Andy Green <andy@warmcat.com>
    5  *
    6  * This library is free software; you can redistribute it and/or
    7  * modify it under the terms of the GNU Lesser General Public
    8  * License as published by the Free Software Foundation:
    9  * version 2.1 of the License.
    10  *
    11  * This library is distributed in the hope that it will be useful,
    12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
    13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
    14  * Lesser General Public License for more details.
    15  *
    16  * You should have received a copy of the GNU Lesser General Public
    17  * License along with this library; if not, write to the Free Software
    18  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
    19  * MA 02110-1301 USA
    20  */
    21 
    24 #ifndef LIBWEBSOCKET_H_3060898B846849FF9F88F5DB59B5950C
    25 #define LIBWEBSOCKET_H_3060898B846849FF9F88F5DB59B5950C
    26 
    27 #ifdef __cplusplus
    28 #include <cstddef>
    29 #include <cstdarg>
    30 #ifdef MBED_OPERATORS
    31 #include "mbed-drivers/mbed.h"
    32 #include "sal-iface-eth/EthernetInterface.h"
    33 #include "sockets/TCPListener.h"
    34 #include "sal-stack-lwip/lwipv4_init.h"
    35 
    36 namespace {
    37 }
    38 using namespace mbed::Sockets::v0;
    39 
    40 
    41 struct sockaddr_in;
    42 struct lws;
    43 
    44 class lws_conn {
    45  public:
    46  lws_conn():
    47  ts(NULL),
    48  wsi(NULL),
    49  writeable(1),
    50  awaiting_on_writeable(0)
    51  {
    52  }
    53 
    54 public:
    55  void set_wsi(struct lws *_wsi) { wsi = _wsi; }
    56  int actual_onRX(Socket *s);
    57  void onRX(Socket *s);
    58  void onError(Socket *s, socket_error_t err);
    59  void onDisconnect(TCPStream *s);
    60  void onSent(Socket *s, uint16_t len);
    61  void serialized_writeable(struct lws *wsi);
    62 
    63 public:
    64  TCPStream *ts;
    65 
    66 public:
    67  struct lws *wsi;
    68  char writeable;
    69  char awaiting_on_writeable;
    70 };
    71 
    73 public:
    75  srv(SOCKET_STACK_LWIP_IPV4)
    76  {
    77  srv.setOnError(TCPStream::ErrorHandler_t(this,
    79  }
    80 
    81  void start(const uint16_t port);
    83 protected:
    84  void onRX(Socket *s);
    85  void onError(Socket *s, socket_error_t err);
    86  void onIncoming(TCPListener *s, void *impl);
    87  void onDisconnect(TCPStream *s);
    89 public:
    90  TCPListener srv;
    91 };
    92 
    93 #endif
    94 
    95 extern "C" {
    96 #else
    97 #include <stdarg.h>
    98 #endif
    99 
    100 #if defined(MBED_OPERATORS) || defined(LWS_WITH_ESP8266)
    101 struct sockaddr_in;
    102 #define LWS_POSIX 0
    103 #else
    104 #define LWS_POSIX 1
    105 #endif
    106 
    107 #include "lws_config.h"
    108 
    109 #if defined(WIN32) || defined(_WIN32)
    110 #ifndef WIN32_LEAN_AND_MEAN
    111 #define WIN32_LEAN_AND_MEAN
    112 #endif
    113 
    114 #include <winsock2.h>
    115 #include <ws2tcpip.h>
    116 #include <stddef.h>
    117 #include <basetsd.h>
    118 #ifndef _WIN32_WCE
    119 #include <fcntl.h>
    120 #else
    121 #define _O_RDONLY 0x0000
    122 #define O_RDONLY _O_RDONLY
    123 #endif
    124 
    125 // Visual studio older than 2015 and WIN_CE has only _stricmp
    126 #if (defined(_MSC_VER) && _MSC_VER < 1900) || defined(_WIN32_WCE)
    127 #define strcasecmp _stricmp
    128 #else
    129 #define strcasecmp stricmp
    130 #endif
    131 #define getdtablesize() 30000
    132 
    133 #define LWS_INLINE __inline
    134 #define LWS_VISIBLE
    135 #define LWS_WARN_UNUSED_RESULT
    136 #define LWS_WARN_DEPRECATED
    137 
    138 #ifdef LWS_DLL
    139 #ifdef LWS_INTERNAL
    140 #define LWS_EXTERN extern __declspec(dllexport)
    141 #else
    142 #define LWS_EXTERN extern __declspec(dllimport)
    143 #endif
    144 #else
    145 #define LWS_EXTERN
    146 #endif
    147 
    148 #define LWS_INVALID_FILE INVALID_HANDLE_VALUE
    149 #define LWS_O_RDONLY _O_RDONLY
    150 
    151 #if !defined(_MSC_VER) || _MSC_VER < 1900 /* Visual Studio 2015 already defines this in <stdio.h> */
    152 #define lws_snprintf _snprintf
    153 #endif
    154 
    155 #ifndef __func__
    156 #define __func__ __FUNCTION__
    157 #endif
    158 
    159 #else /* NOT WIN32 */
    160 #include <unistd.h>
    161 
    162 #if defined(__NetBSD__) || defined(__FreeBSD__)
    163 #include <netinet/in.h>
    164 #endif
    165 
    166 #define LWS_INLINE inline
    167 #define LWS_O_RDONLY O_RDONLY
    168 
    169 #if !defined(MBED_OPERATORS) && !defined(LWS_WITH_ESP8266)
    170 #include <poll.h>
    171 #include <netdb.h>
    172 #define LWS_INVALID_FILE -1
    173 #else
    174 #define getdtablesize() (20)
    175 #define LWS_INVALID_FILE NULL
    176 #endif
    177 
    178 #if defined(__GNUC__)
    179 
    180 /* warn_unused_result attribute only supported by GCC 3.4 or later */
    181 #if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)
    182 #define LWS_WARN_UNUSED_RESULT __attribute__((warn_unused_result))
    183 #else
    184 #define LWS_WARN_UNUSED_RESULT
    185 #endif
    186 
    187 #define LWS_VISIBLE __attribute__((visibility("default")))
    188 #define LWS_WARN_DEPRECATED __attribute__ ((deprecated))
    189 #else
    190 #define LWS_VISIBLE
    191 #define LWS_WARN_UNUSED_RESULT
    192 #define LWS_WARN_DEPRECATED
    193 #endif
    194 
    195 #if defined(__ANDROID__)
    196 #include <unistd.h>
    197 #define getdtablesize() sysconf(_SC_OPEN_MAX)
    198 #endif
    199 
    200 #endif
    201 
    202 #ifdef LWS_USE_LIBEV
    203 #include <ev.h>
    204 #endif /* LWS_USE_LIBEV */
    205 #ifdef LWS_USE_LIBUV
    206 #include <uv.h>
    207 #ifdef LWS_HAVE_UV_VERSION_H
    208 #include <uv-version.h>
    209 #endif
    210 #endif /* LWS_USE_LIBUV */
    211 
    212 #ifndef LWS_EXTERN
    213 #define LWS_EXTERN extern
    214 #endif
    215 
    216 #ifdef _WIN32
    217 #define random rand
    218 #else
    219 #include <sys/time.h>
    220 #include <unistd.h>
    221 #endif
    222 
    223 #ifdef LWS_OPENSSL_SUPPORT
    224 
    225 #ifdef USE_WOLFSSL
    226 #ifdef USE_OLD_CYASSL
    227 #include <cyassl/openssl/ssl.h>
    228 #include <cyassl/error-ssl.h>
    229 #else
    230 #include <wolfssl/openssl/ssl.h>
    231 #include <wolfssl/error-ssl.h>
    232 #endif /* not USE_OLD_CYASSL */
    233 #else
    234 #if defined(LWS_USE_POLARSSL)
    235 #include <polarssl/ssl.h>
    237  x509_crt ca;
    238  x509_crt certificate;
    239  rsa_context key;
    240 };
    241 typedef struct lws_polarssl_context SSL_CTX;
    242 typedef ssl_context SSL;
    243 #else
    244 #if defined(LWS_USE_MBEDTLS)
    245 #include <mbedtls/ssl.h>
    246 #else
    247 #include <openssl/ssl.h>
    248 #include <openssl/err.h>
    249 #endif /* not USE_MBEDTLS */
    250 #endif /* not USE_POLARSSL */
    251 #endif /* not USE_WOLFSSL */
    252 #endif
    253 
    254 
    255 #define CONTEXT_PORT_NO_LISTEN -1
    256 
    267 
    269 enum lws_log_levels {
    270  LLL_ERR = 1 << 0,
    271  LLL_WARN = 1 << 1,
    272  LLL_NOTICE = 1 << 2,
    273  LLL_INFO = 1 << 3,
    274  LLL_DEBUG = 1 << 4,
    275  LLL_PARSER = 1 << 5,
    276  LLL_HEADER = 1 << 6,
    277  LLL_EXT = 1 << 7,
    278  LLL_CLIENT = 1 << 8,
    279  LLL_LATENCY = 1 << 9,
    280 
    281  LLL_COUNT = 10 /* set to count of valid flags */
    282 };
    283 
    284 LWS_VISIBLE LWS_EXTERN void _lws_log(int filter, const char *format, ...);
    285 LWS_VISIBLE LWS_EXTERN void _lws_logv(int filter, const char *format, va_list vl);
    295 LWS_VISIBLE LWS_EXTERN int
    296 lwsl_timestamp(int level, char *p, int len);
    297 
    298 #define lwsl_err(...) _lws_log(LLL_ERR, __VA_ARGS__)
    299 
    300 #if !defined(LWS_WITH_NO_LOGS)
    301 /* notice, warn and log are always compiled in */
    302 #define lwsl_warn(...) _lws_log(LLL_WARN, __VA_ARGS__)
    303 #define lwsl_notice(...) _lws_log(LLL_NOTICE, __VA_ARGS__)
    304 #endif
    305 /*
    306  * weaker logging can be deselected at configure time using --disable-debug
    307  * that gets rid of the overhead of checking while keeping _warn and _err
    308  * active
    309  */
    310 
    311 #if defined(LWS_WITH_ESP8266)
    312 #undef _DEBUG
    313 #endif
    314 
    315 #ifdef _DEBUG
    316 #if defined(LWS_WITH_NO_LOGS)
    317 /* notice, warn and log are always compiled in */
    318 //#define lwsl_err(...) _lws_log(LLL_ERR, __VA_ARGS__)
    319 #define lwsl_warn(...) _lws_log(LLL_WARN, __VA_ARGS__)
    320 #define lwsl_notice(...) _lws_log(LLL_NOTICE, __VA_ARGS__)
    321 #endif
    322 #define lwsl_info(...) _lws_log(LLL_INFO, __VA_ARGS__)
    323 #define lwsl_debug(...) _lws_log(LLL_DEBUG, __VA_ARGS__)
    324 #define lwsl_parser(...) _lws_log(LLL_PARSER, __VA_ARGS__)
    325 #define lwsl_header(...) _lws_log(LLL_HEADER, __VA_ARGS__)
    326 #define lwsl_ext(...) _lws_log(LLL_EXT, __VA_ARGS__)
    327 #define lwsl_client(...) _lws_log(LLL_CLIENT, __VA_ARGS__)
    328 #define lwsl_latency(...) _lws_log(LLL_LATENCY, __VA_ARGS__)
    329 
    335 LWS_VISIBLE LWS_EXTERN void lwsl_hexdump(void *buf, size_t len);
    336 
    337 #else /* no debug */
    338 #if defined(LWS_WITH_NO_LOGS)
    339 //#define lwsl_err(...) do {} while(0)
    340 #define lwsl_warn(...) do {} while(0)
    341 #define lwsl_notice(...) do {} while(0)
    342 #endif
    343 #define lwsl_info(...) do {} while(0)
    344 #define lwsl_debug(...) do {} while(0)
    345 #define lwsl_parser(...) do {} while(0)
    346 #define lwsl_header(...) do {} while(0)
    347 #define lwsl_ext(...) do {} while(0)
    348 #define lwsl_client(...) do {} while(0)
    349 #define lwsl_latency(...) do {} while(0)
    350 #define lwsl_hexdump(a, b)
    351 
    352 #endif
    353 
    364 LWS_VISIBLE LWS_EXTERN void
    365 lws_set_log_level(int level,
    366  void (*log_emit_function)(int level, const char *line));
    367 
    377 LWS_VISIBLE LWS_EXTERN void
    378 lwsl_emit_syslog(int level, const char *line);
    379 
    381 
    382 
    383 #include <stddef.h>
    384 
    385 #ifndef lws_container_of
    386 #define lws_container_of(P,T,M) ((T *)((char *)(P) - offsetof(T, M)))
    387 #endif
    388 
    389 
    390 struct lws;
    391 #ifndef ARRAY_SIZE
    392 #define ARRAY_SIZE(x) (sizeof(x) / sizeof(x[0]))
    393 #endif
    394 
    395 /* api change list for user code to test against */
    396 
    397 #define LWS_FEATURE_SERVE_HTTP_FILE_HAS_OTHER_HEADERS_ARG
    398 
    399 /* the struct lws_protocols has the id field present */
    400 #define LWS_FEATURE_PROTOCOLS_HAS_ID_FIELD
    401 
    402 /* you can call lws_get_peer_write_allowance */
    403 #define LWS_FEATURE_PROTOCOLS_HAS_PEER_WRITE_ALLOWANCE
    404 
    405 /* extra parameter introduced in 917f43ab821 */
    406 #define LWS_FEATURE_SERVE_HTTP_FILE_HAS_OTHER_HEADERS_LEN
    407 
    408 /* File operations stuff exists */
    409 #define LWS_FEATURE_FOPS
    410 
    411 
    412 #if defined(_WIN32)
    413 typedef SOCKET lws_sockfd_type;
    414 typedef HANDLE lws_filefd_type;
    415 #define lws_sockfd_valid(sfd) (!!sfd)
    416 struct lws_pollfd {
    417  lws_sockfd_type fd;
    418  SHORT events;
    419  SHORT revents;
    420 };
    421 #define LWS_POLLHUP (FD_CLOSE)
    422 #define LWS_POLLIN (FD_READ | FD_ACCEPT)
    423 #define LWS_POLLOUT (FD_WRITE)
    424 #else
    425 
    426 #if defined(MBED_OPERATORS)
    427 /* it's a class lws_conn * */
    428 typedef void * lws_sockfd_type;
    429 typedef void * lws_filefd_type;
    430 #define lws_sockfd_valid(sfd) (!!sfd)
    431 struct pollfd {
    432  lws_sockfd_type fd;
    433  short events;
    434  short revents;
    435 };
    436 #define POLLIN 0x0001
    437 #define POLLPRI 0x0002
    438 #define POLLOUT 0x0004
    439 #define POLLERR 0x0008
    440 #define POLLHUP 0x0010
    441 #define POLLNVAL 0x0020
    442 
    443 struct lws;
    444 
    445 void * mbed3_create_tcp_stream_socket(void);
    446 void mbed3_delete_tcp_stream_socket(void *sockfd);
    447 void mbed3_tcp_stream_bind(void *sock, int port, struct lws *);
    448 void mbed3_tcp_stream_accept(void *sock, struct lws *);
    449 #else
    450 #if defined(LWS_WITH_ESP8266)
    451 
    452 #include <user_interface.h>
    453 #include <espconn.h>
    454 
    455 typedef struct espconn * lws_sockfd_type;
    456 typedef void * lws_filefd_type;
    457 #define lws_sockfd_valid(sfd) (!!sfd)
    458 struct pollfd {
    459  lws_sockfd_type fd;
    460  short events;
    461  short revents;
    462 };
    463 #define POLLIN 0x0001
    464 #define POLLPRI 0x0002
    465 #define POLLOUT 0x0004
    466 #define POLLERR 0x0008
    467 #define POLLHUP 0x0010
    468 #define POLLNVAL 0x0020
    469 
    470 struct lws_vhost;
    471 
    472 lws_sockfd_type esp8266_create_tcp_listen_socket(struct lws_vhost *vh);
    473 void esp8266_tcp_stream_accept(lws_sockfd_type fd, struct lws *wsi);
    474 
    475 #include <os_type.h>
    476 #include <osapi.h>
    477 #include "ets_sys.h"
    478 
    479 int ets_snprintf(char *str, size_t size, const char *format, ...);
    480 #define snprintf ets_snprintf
    481 
    482 typedef os_timer_t uv_timer_t;
    483 typedef void uv_cb_t(uv_timer_t *);
    484 
    485 void os_timer_disarm(void *);
    486 void os_timer_setfn(os_timer_t *, os_timer_func_t *, void *);
    487 
    488 void ets_timer_arm_new(os_timer_t *, int, int, int);
    489 
    490 //void os_timer_arm(os_timer_t *, int, int);
    491 
    492 #define UV_VERSION_MAJOR 1
    493 
    494 #define lws_uv_getloop(a, b) (NULL)
    495 
    496 static inline void uv_timer_init(void *l, uv_timer_t *t)
    497 {
    498  (void)l;
    499  memset(t, 0, sizeof(*t));
    500  os_timer_disarm(t);
    501 }
    502 
    503 static inline void uv_timer_start(uv_timer_t *t, uv_cb_t *cb, int first, int rep)
    504 {
    505  os_timer_setfn(t, (os_timer_func_t *)cb, t);
    506  /* ms, repeat */
    507  os_timer_arm(t, first, !!rep);
    508 }
    509 
    510 static inline void uv_timer_stop(uv_timer_t *t)
    511 {
    512  os_timer_disarm(t);
    513 }
    514 
    515 #else
    516 typedef int lws_sockfd_type;
    517 typedef int lws_filefd_type;
    518 #define lws_sockfd_valid(sfd) (sfd >= 0)
    519 #endif
    520 #endif
    521 
    522 #define lws_pollfd pollfd
    523 #define LWS_POLLHUP (POLLHUP|POLLERR)
    524 #define LWS_POLLIN (POLLIN)
    525 #define LWS_POLLOUT (POLLOUT)
    526 #endif
    527 
    530 struct lws_pollargs {
    531  lws_sockfd_type fd;
    532  int events;
    534 };
    535 
    536 struct lws_tokens;
    537 struct lws_token_limits;
    538 
    546 
    548 /*
    549  * NOTE: These public enums are part of the abi. If you want to add one,
    550  * add it at where specified so existing users are unaffected.
    551  */
    554  LWS_CLOSE_STATUS_NOSTATUS = 0,
    616  /****** add new things just above ---^ ******/
    617 
    618  LWS_CLOSE_STATUS_NOSTATUS_CONTEXT_DESTROY = 9999,
    619 };
    620 
    633 LWS_VISIBLE LWS_EXTERN void
    634 lws_close_reason(struct lws *wsi, enum lws_close_status status,
    635  unsigned char *buf, size_t len);
    636 
    638 
    639 struct lws;
    640 struct lws_context;
    641 /* needed even with extensions disabled for create context */
    642 struct lws_extension;
    643 
    655 
    657 
    658 /*
    659  * NOTE: These public enums are part of the abi. If you want to add one,
    660  * add it at where specified so existing users are unaffected.
    661  */
    905  /* external poll() management support */
    968  LWS_CALLBACK_WS_EXT_DEFAULTS = 39,
    971  LWS_CALLBACK_CGI = 40,
    973  LWS_CALLBACK_CGI_TERMINATED = 41,
    975  LWS_CALLBACK_CGI_STDIN_DATA = 42,
    977  LWS_CALLBACK_CGI_STDIN_COMPLETED = 43,
    979  LWS_CALLBACK_ESTABLISHED_CLIENT_HTTP = 44,
    981  LWS_CALLBACK_CLOSED_CLIENT_HTTP = 45,
    983  LWS_CALLBACK_RECEIVE_CLIENT_HTTP = 46,
    985  LWS_CALLBACK_COMPLETED_CLIENT_HTTP = 47,
    987  LWS_CALLBACK_RECEIVE_CLIENT_HTTP_READ = 48,
    989  LWS_CALLBACK_HTTP_BIND_PROTOCOL = 49,
    991  LWS_CALLBACK_HTTP_DROP_PROTOCOL = 50,
    993  LWS_CALLBACK_CHECK_ACCESS_RIGHTS = 51,
    995  LWS_CALLBACK_PROCESS_HTML = 52,
    997  LWS_CALLBACK_ADD_HEADERS = 53,
    999  LWS_CALLBACK_SESSION_INFO = 54,
    1002  LWS_CALLBACK_GS_EVENT = 55,
    1019  /****** add new things just above ---^ ******/
    1020 
    1023 };
    1024 
    1025 
    1026 
    1042 typedef int
    1043 lws_callback_function(struct lws *wsi, enum lws_callback_reasons reason,
    1044  void *user, void *in, size_t len);
    1046 
    1056 
    1058 /*
    1059  * NOTE: These public enums are part of the abi. If you want to add one,
    1060  * add it at where specified so existing users are unaffected.
    1061  */
    1062 enum lws_extension_callback_reasons {
    1063  LWS_EXT_CB_SERVER_CONTEXT_CONSTRUCT = 0,
    1064  LWS_EXT_CB_CLIENT_CONTEXT_CONSTRUCT = 1,
    1065  LWS_EXT_CB_SERVER_CONTEXT_DESTRUCT = 2,
    1066  LWS_EXT_CB_CLIENT_CONTEXT_DESTRUCT = 3,
    1067  LWS_EXT_CB_CONSTRUCT = 4,
    1068  LWS_EXT_CB_CLIENT_CONSTRUCT = 5,
    1069  LWS_EXT_CB_CHECK_OK_TO_REALLY_CLOSE = 6,
    1070  LWS_EXT_CB_CHECK_OK_TO_PROPOSE_EXTENSION = 7,
    1071  LWS_EXT_CB_DESTROY = 8,
    1072  LWS_EXT_CB_DESTROY_ANY_WSI_CLOSING = 9,
    1073  LWS_EXT_CB_ANY_WSI_ESTABLISHED = 10,
    1074  LWS_EXT_CB_PACKET_RX_PREPARSE = 11,
    1075  LWS_EXT_CB_PACKET_TX_PRESEND = 12,
    1076  LWS_EXT_CB_PACKET_TX_DO_SEND = 13,
    1077  LWS_EXT_CB_HANDSHAKE_REPLY_TX = 14,
    1078  LWS_EXT_CB_FLUSH_PENDING_TX = 15,
    1079  LWS_EXT_CB_EXTENDED_PAYLOAD_RX = 16,
    1080  LWS_EXT_CB_CAN_PROXY_CLIENT_CONNECTION = 17,
    1081  LWS_EXT_CB_1HZ = 18,
    1082  LWS_EXT_CB_REQUEST_ON_WRITEABLE = 19,
    1083  LWS_EXT_CB_IS_WRITEABLE = 20,
    1084  LWS_EXT_CB_PAYLOAD_TX = 21,
    1085  LWS_EXT_CB_PAYLOAD_RX = 22,
    1086  LWS_EXT_CB_OPTION_DEFAULT = 23,
    1087  LWS_EXT_CB_OPTION_SET = 24,
    1088  LWS_EXT_CB_OPTION_CONFIRM = 25,
    1089  LWS_EXT_CB_NAMED_OPTION_SET = 26,
    1090 
    1091  /****** add new things just above ---^ ******/
    1092 };
    1093 
    1100  /* Add new things just above here ---^
    1101  * This is part of the ABI, don't needlessly break compatibility */
    1102 };
    1103 
    1109  const char *name;
    1112  /* Add new things just above here ---^
    1113  * This is part of the ABI, don't needlessly break compatibility */
    1114 };
    1115 
    1118  const char *option_name;
    1120  const char *start;
    1121  int len;
    1122 };
    1123 
    1184 typedef int
    1185 lws_extension_callback_function(struct lws_context *context,
    1186  const struct lws_extension *ext, struct lws *wsi,
    1187  enum lws_extension_callback_reasons reason,
    1188  void *user, void *in, size_t len);
    1189 
    1192  const char *name;
    1194  const char *client_offer;
    1196  /* Add new things just above here ---^
    1197  * This is part of the ABI, don't needlessly break compatibility */
    1198 };
    1199 
    1208 LWS_VISIBLE LWS_EXTERN int
    1209 lws_set_extension_option(struct lws *wsi, const char *ext_name,
    1210  const char *opt_name, const char *opt_val);
    1211 
    1212 #ifndef LWS_NO_EXTENSIONS
    1213 /* lws_get_internal_extensions() - DEPRECATED
    1214  *
    1215  * \Deprecated There is no longer a set internal extensions table. The table is provided
    1216  * by user code along with application-specific settings. See the test
    1217  * client and server for how to do.
    1218  */
    1219 static LWS_INLINE LWS_WARN_DEPRECATED const struct lws_extension *
    1220 lws_get_internal_extensions(void) { return NULL; }
    1221 
    1232 LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
    1233 lws_ext_parse_options(const struct lws_extension *ext, struct lws *wsi,
    1234  void *ext_user, const struct lws_ext_options *opts,
    1235  const char *o, int len);
    1236 #endif
    1237 
    1250 LWS_EXTERN
    1252  struct lws_context *context, const struct lws_extension *ext,
    1253  struct lws *wsi, enum lws_extension_callback_reasons reason,
    1254  void *user, void *in, size_t len);
    1255 
    1256 /*
    1257  * The internal exts are part of the public abi
    1258  * If we add more extensions, publish the callback here ------v
    1259  */
    1261 
    1277 
    1282  const char *name;
    1303  unsigned int id;
    1310  void *user;
    1313  /* Add new things just above here ---^
    1314  * This is part of the ABI, don't needlessly break compatibility */
    1315 };
    1316 
    1317 struct lws_vhost;
    1318 
    1327 LWS_VISIBLE LWS_EXTERN const struct lws_protocols *
    1328 lws_vhost_name_to_protocol(struct lws_vhost *vh, const char *name);
    1329 
    1339 LWS_VISIBLE LWS_EXTERN const struct lws_protocols *
    1340 lws_get_protocol(struct lws *wsi);
    1341 
    1343 LWS_VISIBLE LWS_EXTERN const struct lws_protocols *
    1344 lws_protocol_get(struct lws *wsi) LWS_WARN_DEPRECATED;
    1345 
    1356 LWS_VISIBLE LWS_EXTERN void *
    1357 lws_protocol_vh_priv_zalloc(struct lws_vhost *vhost, const struct lws_protocols *prot,
    1358  int size);
    1359 
    1369 LWS_VISIBLE LWS_EXTERN void *
    1370 lws_protocol_vh_priv_get(struct lws_vhost *vhost, const struct lws_protocols *prot);
    1371 
    1380 LWS_VISIBLE LWS_EXTERN int
    1381 lws_finalize_startup(struct lws_context *context);
    1382 
    1383 #ifdef LWS_WITH_PLUGINS
    1384 
    1385 /* PLUGINS implies LIBUV */
    1386 
    1387 #define LWS_PLUGIN_API_MAGIC 180
    1388 
    1391  unsigned int api_magic;
    1392  const struct lws_protocols *protocols;
    1394  const struct lws_extension *extensions;
    1396 };
    1397 
    1398 typedef int (*lws_plugin_init_func)(struct lws_context *,
    1399  struct lws_plugin_capability *);
    1400 typedef int (*lws_plugin_destroy_func)(struct lws_context *);
    1401 
    1403 struct lws_plugin {
    1404  struct lws_plugin *list;
    1405 #if (UV_VERSION_MAJOR > 0)
    1406  uv_lib_t lib;
    1407 #else
    1408  void *l;
    1409 #endif
    1410  char name[64];
    1412 };
    1413 
    1414 #endif
    1415 
    1417 
    1418 
    1427 
    1429 #define LWSGS_EMAIL_CONTENT_SIZE 16384
    1430 
    1432 /* SHA-1 binary and hexified versions */
    1434 typedef struct { unsigned char bin[20]; } lwsgw_hash_bin;
    1436 typedef struct { char id[41]; } lwsgw_hash;
    1437 
    1444 };
    1445 
    1448  char username[32];
    1449  char email[100];
    1450  char ip[72];
    1451  unsigned int mask;
    1453  char session[42];
    1454 };
    1455 
    1460 };
    1461 
    1464  enum lws_gs_event event;
    1465  const char *username;
    1466  const char *email;
    1467 };
    1468 
    1470 
    1471 
    1485 
    1487 /*
    1488  * NOTE: These public enums are part of the abi. If you want to add one,
    1489  * add it at where specified so existing users are unaffected.
    1490  */
    1491 
    1495  (1 << 12),
    1502  (1 << 12),
    1518  (1 << 12),
    1523  (1 << 12),
    1547  /****** add new things just above ---^ ******/
    1548 };
    1549 
    1550 #define lws_check_opt(c, f) (((c) & (f)) == (f))
    1551 
    1562  int port;
    1567  const char *iface;
    1574  const struct lws_protocols *protocols;
    1578  const struct lws_extension *extensions;
    1586  const char *ssl_cert_filepath;
    1596  const char *ssl_ca_filepath;
    1598  const char *ssl_cipher_list;
    1602  const char *http_proxy_address;
    1605  unsigned int http_proxy_port;
    1607  int gid;
    1609  int uid;
    1611  unsigned int options;
    1613  void *user;
    1616  int ka_time;
    1626 #ifdef LWS_OPENSSL_SUPPORT
    1632 #else /* maintain structure layout either way */
    1634 #endif
    1635 
    1646  unsigned int count_threads;
    1648  unsigned int fd_limit_per_thread;
    1652  unsigned int timeout_secs;
    1657  const char *ecdh_curve;
    1659  const char *vhost_name;
    1663  const char * const *plugin_dirs;
    1672  const char *log_filepath;
    1675  const struct lws_http_mount *mounts;
    1677  const char *server_string;
    1680  unsigned int pt_serv_buf_size;
    1695  unsigned short ws_ping_pong_interval;
    1711  /* Add new things just above here ---^
    1712  * This is part of the ABI, don't needlessly break compatibility
    1713  *
    1714  * The below is to ensure later library versions with new
    1715  * members added above will see 0 (default) even if the app
    1716  * was not built against the newer headers.
    1717  */
    1718 
    1719  void *_unused[8];
    1720 };
    1721 
    1756 LWS_VISIBLE LWS_EXTERN struct lws_context *
    1758 
    1767 LWS_VISIBLE LWS_EXTERN void
    1768 lws_context_destroy(struct lws_context *context);
    1769 
    1787 LWS_VISIBLE LWS_EXTERN int
    1788 lws_set_proxy(struct lws_vhost *vhost, const char *proxy);
    1789 
    1790 
    1791 struct lws_vhost;
    1792 
    1802 LWS_EXTERN LWS_VISIBLE struct lws_vhost *
    1803 lws_create_vhost(struct lws_context *context,
    1804  struct lws_context_creation_info *info);
    1805 
    1820 LWS_VISIBLE LWS_EXTERN int
    1821 lwsws_get_config_globals(struct lws_context_creation_info *info, const char *d,
    1822  char **config_strings, int *len);
    1823 
    1839 LWS_VISIBLE LWS_EXTERN int
    1840 lwsws_get_config_vhosts(struct lws_context *context,
    1841  struct lws_context_creation_info *info, const char *d,
    1842  char **config_strings, int *len);
    1843 
    1845 LWS_VISIBLE LWS_EXTERN struct lws_vhost *
    1846 lws_vhost_get(struct lws *wsi) LWS_WARN_DEPRECATED;
    1847 
    1853 LWS_VISIBLE LWS_EXTERN struct lws_vhost *
    1854 lws_get_vhost(struct lws *wsi);
    1855 
    1863 LWS_VISIBLE LWS_EXTERN int
    1864 lws_json_dump_vhost(const struct lws_vhost *vh, char *buf, int len);
    1865 
    1873 LWS_VISIBLE LWS_EXTERN int
    1874 lws_json_dump_context(const struct lws_context *context, char *buf, int len);
    1875 
    1885 LWS_VISIBLE LWS_EXTERN void *
    1886 lws_context_user(struct lws_context *context);
    1887 
    1893 
    1903  const char *name;
    1904  const char *value;
    1905 };
    1906 
    1919 };
    1920 
    1928  const char *mountpoint;
    1930  const char *origin;
    1932  const char *def;
    1934  const char *protocol;
    1950  unsigned int auth_mask;
    1953  unsigned int cache_reusable:1;
    1954  unsigned int cache_revalidate:1;
    1955  unsigned int cache_intermediaries:1;
    1957  unsigned char origin_protocol;
    1958  unsigned char mountpoint_len;
    1959 };
    1962 
    1968 
    1976  LCCSCF_USE_SSL = (1 << 0),
    1977  LCCSCF_ALLOW_SELFSIGNED = (1 << 1),
    1978  LCCSCF_SKIP_SERVER_CERT_HOSTNAME_CHECK = (1 << 2)
    1979 };
    1980 
    1985  struct lws_context *context;
    1987  const char *address;
    1989  int port;
    1993  const char *path;
    1995  const char *host;
    1997  const char *origin;
    1999  const char *protocol;
    2003  void *userdata;
    2007  const char *method;
    2010  struct lws *parent_wsi;
    2014  const char *uri_replace_from;
    2017  const char *uri_replace_to;
    2019  struct lws_vhost *vhost;
    2021  struct lws **pwsi;
    2033  /* Add new things just above here ---^
    2034  * This is part of the ABI, don't needlessly break compatibility
    2035  *
    2036  * The below is to ensure later library versions with new
    2037  * members added above will see 0 (default) even if the app
    2038  * was not built against the newer headers.
    2039  */
    2040 
    2041  void *_unused[4];
    2042 };
    2043 
    2051 LWS_VISIBLE LWS_EXTERN struct lws *
    2053 
    2074 /* deprecated, use lws_client_connect_via_info() */
    2075 LWS_VISIBLE LWS_EXTERN struct lws * LWS_WARN_UNUSED_RESULT
    2076 lws_client_connect(struct lws_context *clients, const char *address,
    2077  int port, int ssl_connection, const char *path,
    2078  const char *host, const char *origin, const char *protocol,
    2079  int ietf_version_or_minus_one) LWS_WARN_DEPRECATED;
    2080 /* deprecated, use lws_client_connect_via_info() */
    2101 LWS_VISIBLE LWS_EXTERN struct lws * LWS_WARN_UNUSED_RESULT
    2102 lws_client_connect_extended(struct lws_context *clients, const char *address,
    2103  int port, int ssl_connection, const char *path,
    2104  const char *host, const char *origin,
    2105  const char *protocol, int ietf_version_or_minus_one,
    2106  void *userdata) LWS_WARN_DEPRECATED;
    2107 
    2133 LWS_VISIBLE LWS_EXTERN int
    2135  struct lws_vhost *vhost);
    2136 
    2137 LWS_VISIBLE LWS_EXTERN int
    2138 lws_http_client_read(struct lws *wsi, char **buf, int *len);
    2139 
    2140 LWS_VISIBLE LWS_EXTERN void
    2141 lws_client_http_body_pending(struct lws *wsi, int something_left_to_send);
    2142 
    2163 
    2172 
    2205 LWS_VISIBLE LWS_EXTERN int
    2206 lws_service(struct lws_context *context, int timeout_ms);
    2207 
    2219 LWS_VISIBLE LWS_EXTERN int
    2220 lws_service_tsi(struct lws_context *context, int timeout_ms, int tsi);
    2221 
    2237 LWS_VISIBLE LWS_EXTERN void
    2238 lws_cancel_service_pt(struct lws *wsi);
    2239 
    2251 LWS_VISIBLE LWS_EXTERN void
    2252 lws_cancel_service(struct lws_context *context);
    2253 
    2280 LWS_VISIBLE LWS_EXTERN int
    2281 lws_service_fd(struct lws_context *context, struct lws_pollfd *pollfd);
    2282 
    2292 LWS_VISIBLE LWS_EXTERN int
    2293 lws_service_fd_tsi(struct lws_context *context, struct lws_pollfd *pollfd,
    2294  int tsi);
    2295 
    2313 LWS_VISIBLE LWS_EXTERN int
    2314 lws_service_adjust_timeout(struct lws_context *context, int timeout_ms, int tsi);
    2315 
    2331 LWS_EXTERN LWS_VISIBLE int
    2332 lws_plat_service_tsi(struct lws_context *context, int timeout_ms, int tsi);
    2333 
    2335 
    2341 
    2348 
    2360 LWS_VISIBLE LWS_EXTERN const char *
    2361 lws_get_mimetype(const char *file, const struct lws_http_mount *m);
    2362 
    2381 LWS_VISIBLE LWS_EXTERN int
    2382 lws_serve_http_file(struct lws *wsi, const char *file, const char *content_type,
    2383  const char *other_headers, int other_headers_len);
    2384 LWS_VISIBLE LWS_EXTERN int
    2385 lws_serve_http_file_fragment(struct lws *wsi);
    2387 
    2398 
    2399 enum http_status {
    2400  HTTP_STATUS_OK = 200,
    2401  HTTP_STATUS_NO_CONTENT = 204,
    2402 
    2403  HTTP_STATUS_MOVED_PERMANENTLY = 301,
    2404  HTTP_STATUS_FOUND = 302,
    2405  HTTP_STATUS_SEE_OTHER = 303,
    2406 
    2407  HTTP_STATUS_BAD_REQUEST = 400,
    2408  HTTP_STATUS_UNAUTHORIZED,
    2409  HTTP_STATUS_PAYMENT_REQUIRED,
    2410  HTTP_STATUS_FORBIDDEN,
    2411  HTTP_STATUS_NOT_FOUND,
    2412  HTTP_STATUS_METHOD_NOT_ALLOWED,
    2413  HTTP_STATUS_NOT_ACCEPTABLE,
    2414  HTTP_STATUS_PROXY_AUTH_REQUIRED,
    2415  HTTP_STATUS_REQUEST_TIMEOUT,
    2416  HTTP_STATUS_CONFLICT,
    2417  HTTP_STATUS_GONE,
    2418  HTTP_STATUS_LENGTH_REQUIRED,
    2419  HTTP_STATUS_PRECONDITION_FAILED,
    2420  HTTP_STATUS_REQ_ENTITY_TOO_LARGE,
    2421  HTTP_STATUS_REQ_URI_TOO_LONG,
    2422  HTTP_STATUS_UNSUPPORTED_MEDIA_TYPE,
    2423  HTTP_STATUS_REQ_RANGE_NOT_SATISFIABLE,
    2424  HTTP_STATUS_EXPECTATION_FAILED,
    2425 
    2426  HTTP_STATUS_INTERNAL_SERVER_ERROR = 500,
    2427  HTTP_STATUS_NOT_IMPLEMENTED,
    2428  HTTP_STATUS_BAD_GATEWAY,
    2429  HTTP_STATUS_SERVICE_UNAVAILABLE,
    2430  HTTP_STATUS_GATEWAY_TIMEOUT,
    2431  HTTP_STATUS_HTTP_VERSION_NOT_SUPPORTED,
    2432 };
    2433 
    2435  char *p;
    2436  int len;
    2437  int max_len;
    2438  int final;
    2439 };
    2440 
    2441 typedef const char *(*lws_process_html_state_cb)(void *data, int index);
    2442 
    2444  char *start;
    2445  char swallow[16];
    2446  int pos;
    2447  void *data;
    2448  const char * const *vars;
    2451  lws_process_html_state_cb replace;
    2452 };
    2453 
    2458 LWS_VISIBLE LWS_EXTERN int
    2460  struct lws_process_html_state *s);
    2462 
    2495 
    2503 struct lws_tokens {
    2504  char *token;
    2506 };
    2507 
    2508 /* enum lws_token_indexes
    2509  * these have to be kept in sync with lextable.h / minilex.c
    2510  *
    2511  * NOTE: These public enums are part of the abi. If you want to add one,
    2512  * add it at where specified so existing users are unaffected.
    2513  */
    2514 enum lws_token_indexes {
    2515  WSI_TOKEN_GET_URI = 0,
    2516  WSI_TOKEN_POST_URI = 1,
    2517  WSI_TOKEN_OPTIONS_URI = 2,
    2518  WSI_TOKEN_HOST = 3,
    2519  WSI_TOKEN_CONNECTION = 4,
    2520  WSI_TOKEN_UPGRADE = 5,
    2521  WSI_TOKEN_ORIGIN = 6,
    2522  WSI_TOKEN_DRAFT = 7,
    2523  WSI_TOKEN_CHALLENGE = 8,
    2524  WSI_TOKEN_EXTENSIONS = 9,
    2525  WSI_TOKEN_KEY1 = 10,
    2526  WSI_TOKEN_KEY2 = 11,
    2527  WSI_TOKEN_PROTOCOL = 12,
    2528  WSI_TOKEN_ACCEPT = 13,
    2529  WSI_TOKEN_NONCE = 14,
    2530  WSI_TOKEN_HTTP = 15,
    2531  WSI_TOKEN_HTTP2_SETTINGS = 16,
    2532  WSI_TOKEN_HTTP_ACCEPT = 17,
    2533  WSI_TOKEN_HTTP_AC_REQUEST_HEADERS = 18,
    2534  WSI_TOKEN_HTTP_IF_MODIFIED_SINCE = 19,
    2535  WSI_TOKEN_HTTP_IF_NONE_MATCH = 20,
    2536  WSI_TOKEN_HTTP_ACCEPT_ENCODING = 21,
    2537  WSI_TOKEN_HTTP_ACCEPT_LANGUAGE = 22,
    2538  WSI_TOKEN_HTTP_PRAGMA = 23,
    2539  WSI_TOKEN_HTTP_CACHE_CONTROL = 24,
    2540  WSI_TOKEN_HTTP_AUTHORIZATION = 25,
    2541  WSI_TOKEN_HTTP_COOKIE = 26,
    2542  WSI_TOKEN_HTTP_CONTENT_LENGTH = 27,
    2543  WSI_TOKEN_HTTP_CONTENT_TYPE = 28,
    2544  WSI_TOKEN_HTTP_DATE = 29,
    2545  WSI_TOKEN_HTTP_RANGE = 30,
    2546  WSI_TOKEN_HTTP_REFERER = 31,
    2547  WSI_TOKEN_KEY = 32,
    2548  WSI_TOKEN_VERSION = 33,
    2549  WSI_TOKEN_SWORIGIN = 34,
    2550 
    2551  WSI_TOKEN_HTTP_COLON_AUTHORITY = 35,
    2552  WSI_TOKEN_HTTP_COLON_METHOD = 36,
    2553  WSI_TOKEN_HTTP_COLON_PATH = 37,
    2554  WSI_TOKEN_HTTP_COLON_SCHEME = 38,
    2555  WSI_TOKEN_HTTP_COLON_STATUS = 39,
    2556 
    2557  WSI_TOKEN_HTTP_ACCEPT_CHARSET = 40,
    2558  WSI_TOKEN_HTTP_ACCEPT_RANGES = 41,
    2559  WSI_TOKEN_HTTP_ACCESS_CONTROL_ALLOW_ORIGIN = 42,
    2560  WSI_TOKEN_HTTP_AGE = 43,
    2561  WSI_TOKEN_HTTP_ALLOW = 44,
    2562  WSI_TOKEN_HTTP_CONTENT_DISPOSITION = 45,
    2563  WSI_TOKEN_HTTP_CONTENT_ENCODING = 46,
    2564  WSI_TOKEN_HTTP_CONTENT_LANGUAGE = 47,
    2565  WSI_TOKEN_HTTP_CONTENT_LOCATION = 48,
    2566  WSI_TOKEN_HTTP_CONTENT_RANGE = 49,
    2567  WSI_TOKEN_HTTP_ETAG = 50,
    2568  WSI_TOKEN_HTTP_EXPECT = 51,
    2569  WSI_TOKEN_HTTP_EXPIRES = 52,
    2570  WSI_TOKEN_HTTP_FROM = 53,
    2571  WSI_TOKEN_HTTP_IF_MATCH = 54,
    2572  WSI_TOKEN_HTTP_IF_RANGE = 55,
    2573  WSI_TOKEN_HTTP_IF_UNMODIFIED_SINCE = 56,
    2574  WSI_TOKEN_HTTP_LAST_MODIFIED = 57,
    2575  WSI_TOKEN_HTTP_LINK = 58,
    2576  WSI_TOKEN_HTTP_LOCATION = 59,
    2577  WSI_TOKEN_HTTP_MAX_FORWARDS = 60,
    2578  WSI_TOKEN_HTTP_PROXY_AUTHENTICATE = 61,
    2579  WSI_TOKEN_HTTP_PROXY_AUTHORIZATION = 62,
    2580  WSI_TOKEN_HTTP_REFRESH = 63,
    2581  WSI_TOKEN_HTTP_RETRY_AFTER = 64,
    2582  WSI_TOKEN_HTTP_SERVER = 65,
    2583  WSI_TOKEN_HTTP_SET_COOKIE = 66,
    2584  WSI_TOKEN_HTTP_STRICT_TRANSPORT_SECURITY = 67,
    2585  WSI_TOKEN_HTTP_TRANSFER_ENCODING = 68,
    2586  WSI_TOKEN_HTTP_USER_AGENT = 69,
    2587  WSI_TOKEN_HTTP_VARY = 70,
    2588  WSI_TOKEN_HTTP_VIA = 71,
    2589  WSI_TOKEN_HTTP_WWW_AUTHENTICATE = 72,
    2590 
    2591  WSI_TOKEN_PATCH_URI = 73,
    2592  WSI_TOKEN_PUT_URI = 74,
    2593  WSI_TOKEN_DELETE_URI = 75,
    2594 
    2595  WSI_TOKEN_HTTP_URI_ARGS = 76,
    2596  WSI_TOKEN_PROXY = 77,
    2597  WSI_TOKEN_HTTP_X_REAL_IP = 78,
    2598  WSI_TOKEN_HTTP1_0 = 79,
    2599 
    2600  /****** add new things just above ---^ ******/
    2601 
    2602  /* use token storage to stash these internally, not for
    2603  * user use */
    2604 
    2605  _WSI_TOKEN_CLIENT_SENT_PROTOCOLS,
    2606  _WSI_TOKEN_CLIENT_PEER_ADDRESS,
    2607  _WSI_TOKEN_CLIENT_URI,
    2608  _WSI_TOKEN_CLIENT_HOST,
    2609  _WSI_TOKEN_CLIENT_ORIGIN,
    2610  _WSI_TOKEN_CLIENT_METHOD,
    2611 
    2612  /* always last real token index*/
    2613  WSI_TOKEN_COUNT,
    2614 
    2615  /* parser state additions, no storage associated */
    2616  WSI_TOKEN_NAME_PART,
    2617  WSI_TOKEN_SKIPPING,
    2618  WSI_TOKEN_SKIPPING_SAW_CR,
    2619  WSI_PARSING_COMPLETE,
    2620  WSI_INIT_TOKEN_MUXURL,
    2621 };
    2622 
    2624  unsigned short token_limit[WSI_TOKEN_COUNT];
    2625 };
    2626 
    2632 LWS_VISIBLE LWS_EXTERN const unsigned char *
    2633 lws_token_to_string(enum lws_token_indexes token);
    2634 
    2635 
    2644 LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
    2645 lws_hdr_total_length(struct lws *wsi, enum lws_token_indexes h);
    2646 
    2656 LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
    2657 lws_hdr_fragment_length(struct lws *wsi, enum lws_token_indexes h, int frag_idx);
    2658 
    2672 LWS_VISIBLE LWS_EXTERN int
    2673 lws_hdr_copy(struct lws *wsi, char *dest, int len, enum lws_token_indexes h);
    2674 
    2692 LWS_VISIBLE LWS_EXTERN int
    2693 lws_hdr_copy_fragment(struct lws *wsi, char *dest, int len,
    2694  enum lws_token_indexes h, int frag_idx);
    2695 
    2706 LWS_VISIBLE LWS_EXTERN const char *
    2707 lws_get_urlarg_by_name(struct lws *wsi, const char *name, char *buf, int len);
    2709 
    2724 
    2735 LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
    2736 lws_add_http_header_status(struct lws *wsi,
    2737  unsigned int code, unsigned char **p,
    2738  unsigned char *end);
    2751 LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
    2752 lws_add_http_header_by_name(struct lws *wsi, const unsigned char *name,
    2753  const unsigned char *value, int length,
    2754  unsigned char **p, unsigned char *end);
    2768 LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
    2769 lws_add_http_header_by_token(struct lws *wsi, enum lws_token_indexes token,
    2770  const unsigned char *value, int length,
    2771  unsigned char **p, unsigned char *end);
    2782 LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
    2783 lws_add_http_header_content_length(struct lws *wsi,
    2784  unsigned long content_length,
    2785  unsigned char **p, unsigned char *end);
    2795 LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
    2796 lws_finalize_http_header(struct lws *wsi, unsigned char **p,
    2797  unsigned char *end);
    2799 
    2818 
    2828 };
    2829 
    2843 typedef int (*lws_spa_fileupload_cb)(void *data, const char *name,
    2844  const char *filename, char *buf, int len,
    2845  enum lws_spa_fileupload_states state);
    2846 
    2849 struct lws_spa;
    2850 
    2869 LWS_VISIBLE LWS_EXTERN struct lws_spa *
    2870 lws_spa_create(struct lws *wsi, const char * const *param_names,
    2871  int count_params, int max_storage, lws_spa_fileupload_cb opt_cb,
    2872  void *opt_data);
    2873 
    2881 LWS_VISIBLE LWS_EXTERN int
    2882 lws_spa_process(struct lws_spa *spa, const char *in, int len);
    2883 
    2889 LWS_VISIBLE LWS_EXTERN int
    2890 lws_spa_finalize(struct lws_spa *spa);
    2891 
    2898 LWS_VISIBLE LWS_EXTERN int
    2899 lws_spa_get_length(struct lws_spa *spa, int n);
    2900 
    2906 LWS_VISIBLE LWS_EXTERN const char *
    2907 lws_spa_get_string(struct lws_spa *spa, int n);
    2908 
    2914 LWS_VISIBLE LWS_EXTERN int
    2915 lws_spa_destroy(struct lws_spa *spa);
    2917 
    2928 
    2939 LWS_VISIBLE LWS_EXTERN const char *
    2940 lws_urlencode(char *escaped, const char *string, int len);
    2941 
    2942 /*
    2943  * URLDECODE 1 / 2
    2944  *
    2945  * This simple urldecode only operates until the first '\0' and requires the
    2946  * data to exist all at once
    2947  */
    2960 LWS_VISIBLE LWS_EXTERN int
    2961 lws_urldecode(char *string, const char *escaped, int len);
    2963 
    2972 LWS_VISIBLE LWS_EXTERN int
    2973 lws_return_http_status(struct lws *wsi, unsigned int code,
    2974  const char *html_body);
    2975 
    2986 LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
    2987 lws_http_redirect(struct lws *wsi, int code, const unsigned char *loc, int len,
    2988  unsigned char **p, unsigned char *end);
    2989 
    2998 LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
    2999 lws_http_transaction_completed(struct lws *wsi);
    3001 
    3009 
    3020 LWS_VISIBLE LWS_EXTERN const char *
    3021 lws_sql_purify(char *escaped, const char *string, int len);
    3022 
    3033 LWS_VISIBLE LWS_EXTERN const char *
    3034 lws_json_purify(char *escaped, const char *string, int len);
    3036 
    3043 
    3045 #ifdef LWS_USE_LIBEV
    3046 typedef void (lws_ev_signal_cb_t)(EV_P_ struct ev_signal *w, int revents);
    3047 
    3048 LWS_VISIBLE LWS_EXTERN int
    3049 lws_ev_sigint_cfg(struct lws_context *context, int use_ev_sigint,
    3050  lws_ev_signal_cb_t *cb);
    3051 
    3052 LWS_VISIBLE LWS_EXTERN int
    3053 lws_ev_initloop(struct lws_context *context, struct ev_loop *loop, int tsi);
    3054 
    3055 LWS_VISIBLE LWS_EXTERN void
    3056 lws_ev_sigint_cb(struct ev_loop *loop, struct ev_signal *watcher, int revents);
    3057 #endif /* LWS_USE_LIBEV */
    3058 
    3060 
    3067 #ifdef LWS_USE_LIBUV
    3069 LWS_VISIBLE LWS_EXTERN int
    3070 lws_uv_sigint_cfg(struct lws_context *context, int use_uv_sigint,
    3071  uv_signal_cb cb);
    3072 
    3073 LWS_VISIBLE LWS_EXTERN void
    3074 lws_libuv_run(const struct lws_context *context, int tsi);
    3075 
    3076 LWS_VISIBLE LWS_EXTERN void
    3077 lws_libuv_stop(struct lws_context *context);
    3078 
    3079 LWS_VISIBLE LWS_EXTERN int
    3080 lws_uv_initloop(struct lws_context *context, uv_loop_t *loop, int tsi);
    3081 
    3082 LWS_VISIBLE LWS_EXTERN uv_loop_t *
    3083 lws_uv_getloop(struct lws_context *context, int tsi);
    3084 
    3085 LWS_VISIBLE LWS_EXTERN void
    3086 lws_uv_sigint_cb(uv_signal_t *watcher, int signum);
    3087 #endif /* LWS_USE_LIBUV */
    3088 
    3095 
    3096 /*
    3097  * NOTE: These public enums are part of the abi. If you want to add one,
    3098  * add it at where specified so existing users are unaffected.
    3099  */
    3100 enum pending_timeout {
    3101  NO_PENDING_TIMEOUT = 0,
    3102  PENDING_TIMEOUT_AWAITING_PROXY_RESPONSE = 1,
    3103  PENDING_TIMEOUT_AWAITING_CONNECT_RESPONSE = 2,
    3104  PENDING_TIMEOUT_ESTABLISH_WITH_SERVER = 3,
    3105  PENDING_TIMEOUT_AWAITING_SERVER_RESPONSE = 4,
    3106  PENDING_TIMEOUT_AWAITING_PING = 5,
    3107  PENDING_TIMEOUT_CLOSE_ACK = 6,
    3108  PENDING_TIMEOUT_AWAITING_EXTENSION_CONNECT_RESPONSE = 7,
    3109  PENDING_TIMEOUT_SENT_CLIENT_HANDSHAKE = 8,
    3110  PENDING_TIMEOUT_SSL_ACCEPT = 9,
    3111  PENDING_TIMEOUT_HTTP_CONTENT = 10,
    3112  PENDING_TIMEOUT_AWAITING_CLIENT_HS_SEND = 11,
    3113  PENDING_FLUSH_STORED_SEND_BEFORE_CLOSE = 12,
    3114  PENDING_TIMEOUT_SHUTDOWN_FLUSH = 13,
    3115  PENDING_TIMEOUT_CGI = 14,
    3116  PENDING_TIMEOUT_HTTP_KEEPALIVE_IDLE = 15,
    3117  PENDING_TIMEOUT_WS_PONG_CHECK_SEND_PING = 16,
    3118  PENDING_TIMEOUT_WS_PONG_CHECK_GET_PONG = 17,
    3119  PENDING_TIMEOUT_CLIENT_ISSUE_PAYLOAD = 18,
    3120 
    3121  /****** add new things just above ---^ ******/
    3122 };
    3123 
    3133 LWS_VISIBLE LWS_EXTERN void
    3134 lws_set_timeout(struct lws *wsi, enum pending_timeout reason, int secs);
    3136 
    3142 #if !defined(LWS_SIZEOFPTR)
    3143 #define LWS_SIZEOFPTR (sizeof (void *))
    3144 #endif
    3145 #if !defined(u_int64_t)
    3146 #define u_int64_t unsigned long long
    3147 #endif
    3148 
    3149 #if defined(__x86_64__)
    3150 #define _LWS_PAD_SIZE 16 /* Intel recommended for best performance */
    3151 #else
    3152 #define _LWS_PAD_SIZE LWS_SIZEOFPTR /* Size of a pointer on the target arch */
    3153 #endif
    3154 #define _LWS_PAD(n) (((n) % _LWS_PAD_SIZE) ? \
    3155  ((n) + (_LWS_PAD_SIZE - ((n) % _LWS_PAD_SIZE))) : (n))
    3156 #define LWS_PRE _LWS_PAD(4 + 10)
    3157 /* used prior to 1.7 and retained for backward compatibility */
    3158 #define LWS_SEND_BUFFER_PRE_PADDING LWS_PRE
    3159 #define LWS_SEND_BUFFER_POST_PADDING 0
    3160 
    3161 /*
    3162  * NOTE: These public enums are part of the abi. If you want to add one,
    3163  * add it at where specified so existing users are unaffected.
    3164  */
    3179  /* LWS_WRITE_CLOSE is handled by lws_close_reason() */
    3180  LWS_WRITE_PING = 5,
    3181  LWS_WRITE_PONG = 6,
    3182 
    3183  /* Same as write_http but we know this write ends the transaction */
    3184  LWS_WRITE_HTTP_FINAL = 7,
    3185 
    3186  /* HTTP2 */
    3187 
    3195  /****** add new things just above ---^ ******/
    3196 
    3197  /* flags */
    3198 
    3206 };
    3207 
    3208 
    3295 LWS_VISIBLE LWS_EXTERN int
    3296 lws_write(struct lws *wsi, unsigned char *buf, size_t len,
    3297  enum lws_write_protocol protocol);
    3298 
    3299 /* helper for case where buffer may be const */
    3300 #define lws_write_http(wsi, buf, len) \
    3301  lws_write(wsi, (unsigned char *)(buf), len, LWS_WRITE_HTTP)
    3302 
    3322 
    3335 LWS_VISIBLE LWS_EXTERN int
    3336 lws_callback_on_writable(struct lws *wsi);
    3337 
    3351 LWS_VISIBLE LWS_EXTERN int
    3352 lws_callback_on_writable_all_protocol(const struct lws_context *context,
    3353  const struct lws_protocols *protocol);
    3354 
    3368 LWS_VISIBLE LWS_EXTERN int
    3369 lws_callback_on_writable_all_protocol_vhost(const struct lws_vhost *vhost,
    3370  const struct lws_protocols *protocol);
    3371 
    3384 LWS_VISIBLE LWS_EXTERN int
    3385 lws_callback_all_protocol(struct lws_context *context,
    3386  const struct lws_protocols *protocol, int reason);
    3387 
    3400 LWS_VISIBLE LWS_EXTERN int
    3401 lws_callback_all_protocol_vhost(struct lws_vhost *vh,
    3402  const struct lws_protocols *protocol, int reason);
    3403 
    3417 LWS_VISIBLE LWS_EXTERN int
    3418 lws_callback_vhost_protocols(struct lws *wsi, int reason, void *in, int len);
    3419 
    3420 LWS_VISIBLE LWS_EXTERN int
    3421 lws_callback_http_dummy(struct lws *wsi, enum lws_callback_reasons reason,
    3422  void *user, void *in, size_t len);
    3423 
    3431 LWS_VISIBLE LWS_EXTERN int
    3432 lws_get_socket_fd(struct lws *wsi);
    3433 
    3455 LWS_VISIBLE LWS_EXTERN size_t
    3456 lws_get_peer_write_allowance(struct lws *wsi);
    3458 
    3469 LWS_VISIBLE LWS_EXTERN int
    3470 lws_rx_flow_control(struct lws *wsi, int enable);
    3471 
    3481 LWS_VISIBLE LWS_EXTERN void
    3482 lws_rx_flow_allow_all_protocol(const struct lws_context *context,
    3483  const struct lws_protocols *protocol);
    3484 
    3501 LWS_VISIBLE LWS_EXTERN size_t
    3502 lws_remaining_packet_payload(struct lws *wsi);
    3503 
    3504 
    3513 
    3526 LWS_VISIBLE LWS_EXTERN struct lws *
    3527 lws_adopt_socket(struct lws_context *context, lws_sockfd_type accept_fd);
    3550 LWS_VISIBLE LWS_EXTERN struct lws *
    3551 lws_adopt_socket_readbuf(struct lws_context *context, lws_sockfd_type accept_fd,
    3552  const char *readbuf, size_t len);
    3554 
    3560 
    3571 LWS_VISIBLE LWS_EXTERN const char * LWS_WARN_UNUSED_RESULT
    3572 lws_canonical_hostname(struct lws_context *context);
    3573 
    3588 LWS_VISIBLE LWS_EXTERN void
    3589 lws_get_peer_addresses(struct lws *wsi, lws_sockfd_type fd, char *name,
    3590  int name_len, char *rip, int rip_len);
    3591 
    3602 LWS_VISIBLE LWS_EXTERN const char *
    3603 lws_get_peer_simple(struct lws *wsi, char *name, int namelen);
    3604 #ifndef LWS_WITH_ESP8266
    3605 
    3616 LWS_VISIBLE LWS_EXTERN int
    3617 lws_interface_to_sa(int ipv6, const char *ifname, struct sockaddr_in *addr,
    3618  size_t addrlen);
    3620 #endif
    3621 
    3627 
    3640 LWS_VISIBLE LWS_EXTERN int
    3641 lws_snprintf(char *str, size_t size, const char *format, ...);
    3642 
    3654 LWS_VISIBLE LWS_EXTERN int
    3655 lws_get_random(struct lws_context *context, void *buf, int len);
    3663 LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
    3664 lws_daemonize(const char *_lock_path);
    3670 LWS_VISIBLE LWS_EXTERN const char * LWS_WARN_UNUSED_RESULT
    3672 
    3679 LWS_VISIBLE LWS_EXTERN void *
    3680 lws_wsi_user(struct lws *wsi);
    3681 
    3693 LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
    3694 lws_parse_uri(char *p, const char **prot, const char **ads, int *port,
    3695  const char **path);
    3696 
    3700 LWS_VISIBLE LWS_EXTERN unsigned long
    3701 lws_now_secs(void);
    3702 
    3712 LWS_VISIBLE LWS_EXTERN struct lws_context * LWS_WARN_UNUSED_RESULT
    3713 lws_get_context(const struct lws *wsi);
    3714 
    3724 LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
    3725 lws_get_count_threads(struct lws_context *context);
    3726 
    3734 LWS_VISIBLE LWS_EXTERN struct lws * LWS_WARN_UNUSED_RESULT
    3735 lws_get_parent(const struct lws *wsi);
    3736 
    3743 LWS_VISIBLE LWS_EXTERN struct lws * LWS_WARN_UNUSED_RESULT
    3744 lws_get_child(const struct lws *wsi);
    3745 
    3746 
    3747 /*
    3748  * \deprecated DEPRECATED Note: this is not normally needed as a user api.
    3749  * It's provided in case it is
    3750  * useful when integrating with other app poll loop service code.
    3751  */
    3752 LWS_VISIBLE LWS_EXTERN int
    3753 lws_read(struct lws *wsi, unsigned char *buf, size_t len);
    3754 
    3762 LWS_VISIBLE LWS_EXTERN void
    3763 lws_set_allocator(void *(*realloc)(void *ptr, size_t size));
    3765 
    3771 
    3778 LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
    3779 lws_send_pipe_choked(struct lws *wsi);
    3780 
    3785 LWS_VISIBLE LWS_EXTERN int
    3786 lws_is_final_fragment(struct lws *wsi);
    3787 
    3792 LWS_VISIBLE LWS_EXTERN unsigned char
    3793 lws_get_reserved_bits(struct lws *wsi);
    3794 
    3811 LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
    3812 lws_partial_buffered(struct lws *wsi);
    3813 
    3823 LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
    3824 lws_frame_is_binary(struct lws *wsi);
    3825 
    3834 LWS_VISIBLE LWS_EXTERN int
    3835 lws_is_ssl(struct lws *wsi);
    3840 LWS_VISIBLE LWS_EXTERN int
    3841 lws_is_cgi(struct lws *wsi);
    3843 
    3844 
    3850 #ifdef LWS_SHA1_USE_OPENSSL_NAME
    3852 #define lws_SHA1 SHA1
    3853 #else
    3854 
    3863 LWS_VISIBLE LWS_EXTERN unsigned char *
    3864 lws_SHA1(const unsigned char *d, size_t n, unsigned char *md);
    3865 #endif
    3866 
    3876 LWS_VISIBLE LWS_EXTERN int
    3877 lws_b64_encode_string(const char *in, int in_len, char *out, int out_size);
    3887 LWS_VISIBLE LWS_EXTERN int
    3888 lws_b64_decode_string(const char *in, char *out, int out_size);
    3890 
    3891 
    3901 #ifdef LWS_WITH_CGI
    3902 enum lws_enum_stdinouterr {
    3903  LWS_STDIN = 0,
    3904  LWS_STDOUT = 1,
    3905  LWS_STDERR = 2,
    3906 };
    3907 
    3908 enum lws_cgi_hdr_state {
    3909  LCHS_HEADER,
    3910  LCHS_CR1,
    3911  LCHS_LF1,
    3912  LCHS_CR2,
    3913  LCHS_LF2,
    3914  LHCS_PAYLOAD,
    3915  LCHS_SINGLE_0A,
    3916 };
    3917 
    3919  struct lws **stdwsi;
    3920  enum lws_enum_stdinouterr ch;
    3921  unsigned char *data;
    3922  enum lws_cgi_hdr_state hdr_state;
    3923  int len;
    3924 };
    3925 
    3926 
    3936 LWS_VISIBLE LWS_EXTERN int
    3937 lws_cgi(struct lws *wsi, const char * const *exec_array,
    3938  int script_uri_path_len, int timeout_secs,
    3939  const struct lws_protocol_vhost_options *mp_cgienv);
    3940 
    3946 LWS_VISIBLE LWS_EXTERN int
    3947 lws_cgi_write_split_stdout_headers(struct lws *wsi);
    3948 
    3954 LWS_VISIBLE LWS_EXTERN int
    3955 lws_cgi_kill(struct lws *wsi);
    3956 #endif
    3957 
    3959 
    3976 
    3983  lws_filefd_type (*open)(struct lws *wsi, const char *filename,
    3984  unsigned long *filelen, int flags);
    3988  int (*close)(struct lws *wsi, lws_filefd_type fd);
    3990  unsigned long (*seek_cur)(struct lws *wsi, lws_filefd_type fd,
    3991  long offset_from_cur_pos);
    3993  int (*read)(struct lws *wsi, lws_filefd_type fd, unsigned long *amount,
    3994  unsigned char *buf, unsigned long len);
    3996  int (*write)(struct lws *wsi, lws_filefd_type fd, unsigned long *amount,
    3997  unsigned char *buf, unsigned long len);
    4000  /* Add new things just above here ---^
    4001  * This is part of the ABI, don't needlessly break compatibility */
    4002 };
    4003 
    4009 LWS_VISIBLE LWS_EXTERN struct lws_plat_file_ops * LWS_WARN_UNUSED_RESULT
    4010 lws_get_fops(struct lws_context *context);
    4011 
    4020 static LWS_INLINE lws_filefd_type LWS_WARN_UNUSED_RESULT
    4021 lws_plat_file_open(struct lws *wsi, const char *filename,
    4022  unsigned long *filelen, int flags)
    4023 {
    4024  return lws_get_fops(lws_get_context(wsi))->open(wsi, filename,
    4025  filelen, flags);
    4026 }
    4027 
    4034 static LWS_INLINE int
    4035 lws_plat_file_close(struct lws *wsi, lws_filefd_type fd)
    4036 {
    4037  return lws_get_fops(lws_get_context(wsi))->close(wsi, fd);
    4038 }
    4039 
    4047 static LWS_INLINE unsigned long
    4048 lws_plat_file_seek_cur(struct lws *wsi, lws_filefd_type fd, long offset)
    4049 {
    4050  return lws_get_fops(lws_get_context(wsi))->seek_cur(wsi, fd, offset);
    4051 }
    4061 static LWS_INLINE int LWS_WARN_UNUSED_RESULT
    4062 lws_plat_file_read(struct lws *wsi, lws_filefd_type fd, unsigned long *amount,
    4063  unsigned char *buf, unsigned long len)
    4064 {
    4065  return lws_get_fops(lws_get_context(wsi))->read(wsi, fd, amount, buf,
    4066  len);
    4067 }
    4077 static LWS_INLINE int LWS_WARN_UNUSED_RESULT
    4078 lws_plat_file_write(struct lws *wsi, lws_filefd_type fd, unsigned long *amount,
    4079  unsigned char *buf, unsigned long len)
    4080 {
    4081  return lws_get_fops(lws_get_context(wsi))->write(wsi, fd, amount, buf,
    4082  len);
    4083 }
    4085 
    4117 #ifdef LWS_WITH_SMTP
    4118 
    4130 };
    4131 
    4133 struct lws_email {
    4134  void *data;
    4136  uv_loop_t *loop;
    4139  char email_smtp_ip[32];
    4140  char email_helo[32];
    4141  char email_from[100];
    4142  char email_to[100];
    4144  unsigned int max_content_size;
    4147  /* Fill all the callbacks before init */
    4148 
    4149  int (*on_next)(struct lws_email *email);
    4154  int (*on_sent)(struct lws_email *email);
    4159  int (*on_get_body)(struct lws_email *email, char *buf, int len);
    4165  /* private things */
    4166  uv_timer_t timeout_email;
    4168  uv_connect_t email_connect_req;
    4169  uv_tcp_t email_client;
    4171  char email_buf[256];
    4172  char *content;
    4173 };
    4174 
    4184 LWS_VISIBLE LWS_EXTERN int
    4185 lws_email_init(struct lws_email *email, uv_loop_t *loop, int max_content);
    4186 
    4195 LWS_VISIBLE LWS_EXTERN void
    4196 lws_email_check(struct lws_email *email);
    4204 LWS_VISIBLE LWS_EXTERN void
    4205 lws_email_destroy(struct lws_email *email);
    4206 
    4207 #endif
    4208 
    4209 
    4210 #ifdef __cplusplus
    4211 }
    4212 #endif
    4213 
    4214 #endif
    LWS_VISIBLE LWS_EXTERN int lws_spa_destroy(struct lws_spa *spa)
    +Go to the documentation of this file.
    1 /*
    2  * libwebsockets - small server side websockets and web server implementation
    3  *
    4  * Copyright (C) 2010-2016 Andy Green <andy@warmcat.com>
    5  *
    6  * This library is free software; you can redistribute it and/or
    7  * modify it under the terms of the GNU Lesser General Public
    8  * License as published by the Free Software Foundation:
    9  * version 2.1 of the License.
    10  *
    11  * This library is distributed in the hope that it will be useful,
    12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
    13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
    14  * Lesser General Public License for more details.
    15  *
    16  * You should have received a copy of the GNU Lesser General Public
    17  * License along with this library; if not, write to the Free Software
    18  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
    19  * MA 02110-1301 USA
    20  */
    21 
    24 #ifndef LIBWEBSOCKET_H_3060898B846849FF9F88F5DB59B5950C
    25 #define LIBWEBSOCKET_H_3060898B846849FF9F88F5DB59B5950C
    26 
    27 #ifdef __cplusplus
    28 #include <cstddef>
    29 #include <cstdarg>
    30 #ifdef MBED_OPERATORS
    31 #include "mbed-drivers/mbed.h"
    32 #include "sal-iface-eth/EthernetInterface.h"
    33 #include "sockets/TCPListener.h"
    34 #include "sal-stack-lwip/lwipv4_init.h"
    35 
    36 namespace {
    37 }
    38 using namespace mbed::Sockets::v0;
    39 
    40 
    41 struct sockaddr_in;
    42 struct lws;
    43 
    44 class lws_conn {
    45  public:
    46  lws_conn():
    47  ts(NULL),
    48  wsi(NULL),
    49  writeable(1),
    50  awaiting_on_writeable(0)
    51  {
    52  }
    53 
    54 public:
    55  void set_wsi(struct lws *_wsi) { wsi = _wsi; }
    56  int actual_onRX(Socket *s);
    57  void onRX(Socket *s);
    58  void onError(Socket *s, socket_error_t err);
    59  void onDisconnect(TCPStream *s);
    60  void onSent(Socket *s, uint16_t len);
    61  void serialized_writeable(struct lws *wsi);
    62 
    63 public:
    64  TCPStream *ts;
    65 
    66 public:
    67  struct lws *wsi;
    68  char writeable;
    69  char awaiting_on_writeable;
    70 };
    71 
    73 public:
    75  srv(SOCKET_STACK_LWIP_IPV4)
    76  {
    77  srv.setOnError(TCPStream::ErrorHandler_t(this,
    79  }
    80 
    81  void start(const uint16_t port);
    83 protected:
    84  void onRX(Socket *s);
    85  void onError(Socket *s, socket_error_t err);
    86  void onIncoming(TCPListener *s, void *impl);
    87  void onDisconnect(TCPStream *s);
    89 public:
    90  TCPListener srv;
    91 };
    92 
    93 #endif
    94 
    95 extern "C" {
    96 #else
    97 #include <stdarg.h>
    98 #endif
    99 
    100 #if defined(MBED_OPERATORS) || defined(LWS_WITH_ESP8266)
    101 struct sockaddr_in;
    102 #define LWS_POSIX 0
    103 #else
    104 #define LWS_POSIX 1
    105 #endif
    106 
    107 #include "lws_config.h"
    108 
    109 #if defined(WIN32) || defined(_WIN32)
    110 #ifndef WIN32_LEAN_AND_MEAN
    111 #define WIN32_LEAN_AND_MEAN
    112 #endif
    113 
    114 #include <winsock2.h>
    115 #include <ws2tcpip.h>
    116 #include <stddef.h>
    117 #include <basetsd.h>
    118 #ifndef _WIN32_WCE
    119 #include <fcntl.h>
    120 #else
    121 #define _O_RDONLY 0x0000
    122 #define O_RDONLY _O_RDONLY
    123 #endif
    124 
    125 // Visual studio older than 2015 and WIN_CE has only _stricmp
    126 #if (defined(_MSC_VER) && _MSC_VER < 1900) || defined(_WIN32_WCE)
    127 #define strcasecmp _stricmp
    128 #else
    129 #define strcasecmp stricmp
    130 #endif
    131 #define getdtablesize() 30000
    132 
    133 #define LWS_INLINE __inline
    134 #define LWS_VISIBLE
    135 #define LWS_WARN_UNUSED_RESULT
    136 #define LWS_WARN_DEPRECATED
    137 
    138 #ifdef LWS_DLL
    139 #ifdef LWS_INTERNAL
    140 #define LWS_EXTERN extern __declspec(dllexport)
    141 #else
    142 #define LWS_EXTERN extern __declspec(dllimport)
    143 #endif
    144 #else
    145 #define LWS_EXTERN
    146 #endif
    147 
    148 #define LWS_INVALID_FILE INVALID_HANDLE_VALUE
    149 #define LWS_O_RDONLY _O_RDONLY
    150 
    151 #if !defined(_MSC_VER) || _MSC_VER < 1900 /* Visual Studio 2015 already defines this in <stdio.h> */
    152 #define lws_snprintf _snprintf
    153 #endif
    154 
    155 #ifndef __func__
    156 #define __func__ __FUNCTION__
    157 #endif
    158 
    159 #else /* NOT WIN32 */
    160 #include <unistd.h>
    161 
    162 #if defined(__NetBSD__) || defined(__FreeBSD__)
    163 #include <netinet/in.h>
    164 #endif
    165 
    166 #define LWS_INLINE inline
    167 #define LWS_O_RDONLY O_RDONLY
    168 
    169 #if !defined(MBED_OPERATORS) && !defined(LWS_WITH_ESP8266)
    170 #include <poll.h>
    171 #include <netdb.h>
    172 #define LWS_INVALID_FILE -1
    173 #else
    174 #define getdtablesize() (20)
    175 #define LWS_INVALID_FILE NULL
    176 #endif
    177 
    178 #if defined(__GNUC__)
    179 
    180 /* warn_unused_result attribute only supported by GCC 3.4 or later */
    181 #if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)
    182 #define LWS_WARN_UNUSED_RESULT __attribute__((warn_unused_result))
    183 #else
    184 #define LWS_WARN_UNUSED_RESULT
    185 #endif
    186 
    187 #define LWS_VISIBLE __attribute__((visibility("default")))
    188 #define LWS_WARN_DEPRECATED __attribute__ ((deprecated))
    189 #else
    190 #define LWS_VISIBLE
    191 #define LWS_WARN_UNUSED_RESULT
    192 #define LWS_WARN_DEPRECATED
    193 #endif
    194 
    195 #if defined(__ANDROID__)
    196 #include <unistd.h>
    197 #define getdtablesize() sysconf(_SC_OPEN_MAX)
    198 #endif
    199 
    200 #endif
    201 
    202 #ifdef LWS_USE_LIBEV
    203 #include <ev.h>
    204 #endif /* LWS_USE_LIBEV */
    205 #ifdef LWS_USE_LIBUV
    206 #include <uv.h>
    207 #ifdef LWS_HAVE_UV_VERSION_H
    208 #include <uv-version.h>
    209 #endif
    210 #endif /* LWS_USE_LIBUV */
    211 
    212 #ifndef LWS_EXTERN
    213 #define LWS_EXTERN extern
    214 #endif
    215 
    216 #ifdef _WIN32
    217 #define random rand
    218 #else
    219 #include <sys/time.h>
    220 #include <unistd.h>
    221 #endif
    222 
    223 #ifdef LWS_OPENSSL_SUPPORT
    224 
    225 #ifdef USE_WOLFSSL
    226 #ifdef USE_OLD_CYASSL
    227 #include <cyassl/openssl/ssl.h>
    228 #include <cyassl/error-ssl.h>
    229 #else
    230 #include <wolfssl/openssl/ssl.h>
    231 #include <wolfssl/error-ssl.h>
    232 #endif /* not USE_OLD_CYASSL */
    233 #else
    234 #if defined(LWS_USE_POLARSSL)
    235 #include <polarssl/ssl.h>
    237  x509_crt ca;
    238  x509_crt certificate;
    239  rsa_context key;
    240 };
    241 typedef struct lws_polarssl_context SSL_CTX;
    242 typedef ssl_context SSL;
    243 #else
    244 #if defined(LWS_USE_MBEDTLS)
    245 #include <mbedtls/ssl.h>
    246 #else
    247 #include <openssl/ssl.h>
    248 #include <openssl/err.h>
    249 #endif /* not USE_MBEDTLS */
    250 #endif /* not USE_POLARSSL */
    251 #endif /* not USE_WOLFSSL */
    252 #endif
    253 
    254 
    255 #define CONTEXT_PORT_NO_LISTEN -1
    256 
    267 
    269 enum lws_log_levels {
    270  LLL_ERR = 1 << 0,
    271  LLL_WARN = 1 << 1,
    272  LLL_NOTICE = 1 << 2,
    273  LLL_INFO = 1 << 3,
    274  LLL_DEBUG = 1 << 4,
    275  LLL_PARSER = 1 << 5,
    276  LLL_HEADER = 1 << 6,
    277  LLL_EXT = 1 << 7,
    278  LLL_CLIENT = 1 << 8,
    279  LLL_LATENCY = 1 << 9,
    280 
    281  LLL_COUNT = 10 /* set to count of valid flags */
    282 };
    283 
    284 LWS_VISIBLE LWS_EXTERN void _lws_log(int filter, const char *format, ...);
    285 LWS_VISIBLE LWS_EXTERN void _lws_logv(int filter, const char *format, va_list vl);
    295 LWS_VISIBLE LWS_EXTERN int
    296 lwsl_timestamp(int level, char *p, int len);
    297 
    298 #define lwsl_err(...) _lws_log(LLL_ERR, __VA_ARGS__)
    299 
    300 #if !defined(LWS_WITH_NO_LOGS)
    301 /* notice, warn and log are always compiled in */
    302 #define lwsl_warn(...) _lws_log(LLL_WARN, __VA_ARGS__)
    303 #define lwsl_notice(...) _lws_log(LLL_NOTICE, __VA_ARGS__)
    304 #endif
    305 /*
    306  * weaker logging can be deselected at configure time using --disable-debug
    307  * that gets rid of the overhead of checking while keeping _warn and _err
    308  * active
    309  */
    310 
    311 #if defined(LWS_WITH_ESP8266)
    312 #undef _DEBUG
    313 #endif
    314 
    315 #ifdef _DEBUG
    316 #if defined(LWS_WITH_NO_LOGS)
    317 /* notice, warn and log are always compiled in */
    318 //#define lwsl_err(...) _lws_log(LLL_ERR, __VA_ARGS__)
    319 #define lwsl_warn(...) _lws_log(LLL_WARN, __VA_ARGS__)
    320 #define lwsl_notice(...) _lws_log(LLL_NOTICE, __VA_ARGS__)
    321 #endif
    322 #define lwsl_info(...) _lws_log(LLL_INFO, __VA_ARGS__)
    323 #define lwsl_debug(...) _lws_log(LLL_DEBUG, __VA_ARGS__)
    324 #define lwsl_parser(...) _lws_log(LLL_PARSER, __VA_ARGS__)
    325 #define lwsl_header(...) _lws_log(LLL_HEADER, __VA_ARGS__)
    326 #define lwsl_ext(...) _lws_log(LLL_EXT, __VA_ARGS__)
    327 #define lwsl_client(...) _lws_log(LLL_CLIENT, __VA_ARGS__)
    328 #define lwsl_latency(...) _lws_log(LLL_LATENCY, __VA_ARGS__)
    329 
    335 LWS_VISIBLE LWS_EXTERN void lwsl_hexdump(void *buf, size_t len);
    336 
    337 #else /* no debug */
    338 #if defined(LWS_WITH_NO_LOGS)
    339 //#define lwsl_err(...) do {} while(0)
    340 #define lwsl_warn(...) do {} while(0)
    341 #define lwsl_notice(...) do {} while(0)
    342 #endif
    343 #define lwsl_info(...) do {} while(0)
    344 #define lwsl_debug(...) do {} while(0)
    345 #define lwsl_parser(...) do {} while(0)
    346 #define lwsl_header(...) do {} while(0)
    347 #define lwsl_ext(...) do {} while(0)
    348 #define lwsl_client(...) do {} while(0)
    349 #define lwsl_latency(...) do {} while(0)
    350 #define lwsl_hexdump(a, b)
    351 
    352 #endif
    353 
    364 LWS_VISIBLE LWS_EXTERN void
    365 lws_set_log_level(int level,
    366  void (*log_emit_function)(int level, const char *line));
    367 
    377 LWS_VISIBLE LWS_EXTERN void
    378 lwsl_emit_syslog(int level, const char *line);
    379 
    381 
    382 
    383 #include <stddef.h>
    384 
    385 #ifndef lws_container_of
    386 #define lws_container_of(P,T,M) ((T *)((char *)(P) - offsetof(T, M)))
    387 #endif
    388 
    389 
    390 struct lws;
    391 #ifndef ARRAY_SIZE
    392 #define ARRAY_SIZE(x) (sizeof(x) / sizeof(x[0]))
    393 #endif
    394 
    395 /* api change list for user code to test against */
    396 
    397 #define LWS_FEATURE_SERVE_HTTP_FILE_HAS_OTHER_HEADERS_ARG
    398 
    399 /* the struct lws_protocols has the id field present */
    400 #define LWS_FEATURE_PROTOCOLS_HAS_ID_FIELD
    401 
    402 /* you can call lws_get_peer_write_allowance */
    403 #define LWS_FEATURE_PROTOCOLS_HAS_PEER_WRITE_ALLOWANCE
    404 
    405 /* extra parameter introduced in 917f43ab821 */
    406 #define LWS_FEATURE_SERVE_HTTP_FILE_HAS_OTHER_HEADERS_LEN
    407 
    408 /* File operations stuff exists */
    409 #define LWS_FEATURE_FOPS
    410 
    411 
    412 #if defined(_WIN32)
    413 typedef SOCKET lws_sockfd_type;
    414 typedef HANDLE lws_filefd_type;
    415 #define lws_sockfd_valid(sfd) (!!sfd)
    416 struct lws_pollfd {
    417  lws_sockfd_type fd;
    418  SHORT events;
    419  SHORT revents;
    420 };
    421 #define LWS_POLLHUP (FD_CLOSE)
    422 #define LWS_POLLIN (FD_READ | FD_ACCEPT)
    423 #define LWS_POLLOUT (FD_WRITE)
    424 #else
    425 
    426 #if defined(MBED_OPERATORS)
    427 /* it's a class lws_conn * */
    428 typedef void * lws_sockfd_type;
    429 typedef void * lws_filefd_type;
    430 #define lws_sockfd_valid(sfd) (!!sfd)
    431 struct pollfd {
    432  lws_sockfd_type fd;
    433  short events;
    434  short revents;
    435 };
    436 #define POLLIN 0x0001
    437 #define POLLPRI 0x0002
    438 #define POLLOUT 0x0004
    439 #define POLLERR 0x0008
    440 #define POLLHUP 0x0010
    441 #define POLLNVAL 0x0020
    442 
    443 struct lws;
    444 
    445 void * mbed3_create_tcp_stream_socket(void);
    446 void mbed3_delete_tcp_stream_socket(void *sockfd);
    447 void mbed3_tcp_stream_bind(void *sock, int port, struct lws *);
    448 void mbed3_tcp_stream_accept(void *sock, struct lws *);
    449 #else
    450 #if defined(LWS_WITH_ESP8266)
    451 
    452 #include <user_interface.h>
    453 #include <espconn.h>
    454 
    455 typedef struct espconn * lws_sockfd_type;
    456 typedef void * lws_filefd_type;
    457 #define lws_sockfd_valid(sfd) (!!sfd)
    458 struct pollfd {
    459  lws_sockfd_type fd;
    460  short events;
    461  short revents;
    462 };
    463 #define POLLIN 0x0001
    464 #define POLLPRI 0x0002
    465 #define POLLOUT 0x0004
    466 #define POLLERR 0x0008
    467 #define POLLHUP 0x0010
    468 #define POLLNVAL 0x0020
    469 
    470 struct lws_vhost;
    471 
    472 lws_sockfd_type esp8266_create_tcp_listen_socket(struct lws_vhost *vh);
    473 void esp8266_tcp_stream_accept(lws_sockfd_type fd, struct lws *wsi);
    474 
    475 #include <os_type.h>
    476 #include <osapi.h>
    477 #include "ets_sys.h"
    478 
    479 int ets_snprintf(char *str, size_t size, const char *format, ...);
    480 #define snprintf ets_snprintf
    481 
    482 typedef os_timer_t uv_timer_t;
    483 typedef void uv_cb_t(uv_timer_t *);
    484 
    485 void os_timer_disarm(void *);
    486 void os_timer_setfn(os_timer_t *, os_timer_func_t *, void *);
    487 
    488 void ets_timer_arm_new(os_timer_t *, int, int, int);
    489 
    490 //void os_timer_arm(os_timer_t *, int, int);
    491 
    492 #define UV_VERSION_MAJOR 1
    493 
    494 #define lws_uv_getloop(a, b) (NULL)
    495 
    496 static inline void uv_timer_init(void *l, uv_timer_t *t)
    497 {
    498  (void)l;
    499  memset(t, 0, sizeof(*t));
    500  os_timer_disarm(t);
    501 }
    502 
    503 static inline void uv_timer_start(uv_timer_t *t, uv_cb_t *cb, int first, int rep)
    504 {
    505  os_timer_setfn(t, (os_timer_func_t *)cb, t);
    506  /* ms, repeat */
    507  os_timer_arm(t, first, !!rep);
    508 }
    509 
    510 static inline void uv_timer_stop(uv_timer_t *t)
    511 {
    512  os_timer_disarm(t);
    513 }
    514 
    515 #else
    516 typedef int lws_sockfd_type;
    517 typedef int lws_filefd_type;
    518 #define lws_sockfd_valid(sfd) (sfd >= 0)
    519 #endif
    520 #endif
    521 
    522 #define lws_pollfd pollfd
    523 #define LWS_POLLHUP (POLLHUP|POLLERR)
    524 #define LWS_POLLIN (POLLIN)
    525 #define LWS_POLLOUT (POLLOUT)
    526 #endif
    527 
    530 struct lws_pollargs {
    531  lws_sockfd_type fd;
    532  int events;
    534 };
    535 
    536 struct lws_tokens;
    537 struct lws_token_limits;
    538 
    546 
    548 /*
    549  * NOTE: These public enums are part of the abi. If you want to add one,
    550  * add it at where specified so existing users are unaffected.
    551  */
    554  LWS_CLOSE_STATUS_NOSTATUS = 0,
    616  /****** add new things just above ---^ ******/
    617 
    618  LWS_CLOSE_STATUS_NOSTATUS_CONTEXT_DESTROY = 9999,
    619 };
    620 
    633 LWS_VISIBLE LWS_EXTERN void
    634 lws_close_reason(struct lws *wsi, enum lws_close_status status,
    635  unsigned char *buf, size_t len);
    636 
    638 
    639 struct lws;
    640 struct lws_context;
    641 /* needed even with extensions disabled for create context */
    642 struct lws_extension;
    643 
    655 
    657 
    658 /*
    659  * NOTE: These public enums are part of the abi. If you want to add one,
    660  * add it at where specified so existing users are unaffected.
    661  */
    905  /* external poll() management support */
    968  LWS_CALLBACK_WS_EXT_DEFAULTS = 39,
    971  LWS_CALLBACK_CGI = 40,
    973  LWS_CALLBACK_CGI_TERMINATED = 41,
    975  LWS_CALLBACK_CGI_STDIN_DATA = 42,
    977  LWS_CALLBACK_CGI_STDIN_COMPLETED = 43,
    979  LWS_CALLBACK_ESTABLISHED_CLIENT_HTTP = 44,
    981  LWS_CALLBACK_CLOSED_CLIENT_HTTP = 45,
    983  LWS_CALLBACK_RECEIVE_CLIENT_HTTP = 46,
    985  LWS_CALLBACK_COMPLETED_CLIENT_HTTP = 47,
    987  LWS_CALLBACK_RECEIVE_CLIENT_HTTP_READ = 48,
    989  LWS_CALLBACK_HTTP_BIND_PROTOCOL = 49,
    991  LWS_CALLBACK_HTTP_DROP_PROTOCOL = 50,
    993  LWS_CALLBACK_CHECK_ACCESS_RIGHTS = 51,
    995  LWS_CALLBACK_PROCESS_HTML = 52,
    997  LWS_CALLBACK_ADD_HEADERS = 53,
    999  LWS_CALLBACK_SESSION_INFO = 54,
    1002  LWS_CALLBACK_GS_EVENT = 55,
    1019  /****** add new things just above ---^ ******/
    1020 
    1023 };
    1024 
    1025 
    1026 
    1042 typedef int
    1043 lws_callback_function(struct lws *wsi, enum lws_callback_reasons reason,
    1044  void *user, void *in, size_t len);
    1046 
    1056 
    1058 /*
    1059  * NOTE: These public enums are part of the abi. If you want to add one,
    1060  * add it at where specified so existing users are unaffected.
    1061  */
    1062 enum lws_extension_callback_reasons {
    1063  LWS_EXT_CB_SERVER_CONTEXT_CONSTRUCT = 0,
    1064  LWS_EXT_CB_CLIENT_CONTEXT_CONSTRUCT = 1,
    1065  LWS_EXT_CB_SERVER_CONTEXT_DESTRUCT = 2,
    1066  LWS_EXT_CB_CLIENT_CONTEXT_DESTRUCT = 3,
    1067  LWS_EXT_CB_CONSTRUCT = 4,
    1068  LWS_EXT_CB_CLIENT_CONSTRUCT = 5,
    1069  LWS_EXT_CB_CHECK_OK_TO_REALLY_CLOSE = 6,
    1070  LWS_EXT_CB_CHECK_OK_TO_PROPOSE_EXTENSION = 7,
    1071  LWS_EXT_CB_DESTROY = 8,
    1072  LWS_EXT_CB_DESTROY_ANY_WSI_CLOSING = 9,
    1073  LWS_EXT_CB_ANY_WSI_ESTABLISHED = 10,
    1074  LWS_EXT_CB_PACKET_RX_PREPARSE = 11,
    1075  LWS_EXT_CB_PACKET_TX_PRESEND = 12,
    1076  LWS_EXT_CB_PACKET_TX_DO_SEND = 13,
    1077  LWS_EXT_CB_HANDSHAKE_REPLY_TX = 14,
    1078  LWS_EXT_CB_FLUSH_PENDING_TX = 15,
    1079  LWS_EXT_CB_EXTENDED_PAYLOAD_RX = 16,
    1080  LWS_EXT_CB_CAN_PROXY_CLIENT_CONNECTION = 17,
    1081  LWS_EXT_CB_1HZ = 18,
    1082  LWS_EXT_CB_REQUEST_ON_WRITEABLE = 19,
    1083  LWS_EXT_CB_IS_WRITEABLE = 20,
    1084  LWS_EXT_CB_PAYLOAD_TX = 21,
    1085  LWS_EXT_CB_PAYLOAD_RX = 22,
    1086  LWS_EXT_CB_OPTION_DEFAULT = 23,
    1087  LWS_EXT_CB_OPTION_SET = 24,
    1088  LWS_EXT_CB_OPTION_CONFIRM = 25,
    1089  LWS_EXT_CB_NAMED_OPTION_SET = 26,
    1090 
    1091  /****** add new things just above ---^ ******/
    1092 };
    1093 
    1100  /* Add new things just above here ---^
    1101  * This is part of the ABI, don't needlessly break compatibility */
    1102 };
    1103 
    1109  const char *name;
    1112  /* Add new things just above here ---^
    1113  * This is part of the ABI, don't needlessly break compatibility */
    1114 };
    1115 
    1118  const char *option_name;
    1120  const char *start;
    1121  int len;
    1122 };
    1123 
    1184 typedef int
    1185 lws_extension_callback_function(struct lws_context *context,
    1186  const struct lws_extension *ext, struct lws *wsi,
    1187  enum lws_extension_callback_reasons reason,
    1188  void *user, void *in, size_t len);
    1189 
    1192  const char *name;
    1194  const char *client_offer;
    1196  /* Add new things just above here ---^
    1197  * This is part of the ABI, don't needlessly break compatibility */
    1198 };
    1199 
    1208 LWS_VISIBLE LWS_EXTERN int
    1209 lws_set_extension_option(struct lws *wsi, const char *ext_name,
    1210  const char *opt_name, const char *opt_val);
    1211 
    1212 #ifndef LWS_NO_EXTENSIONS
    1213 /* lws_get_internal_extensions() - DEPRECATED
    1214  *
    1215  * \Deprecated There is no longer a set internal extensions table. The table is provided
    1216  * by user code along with application-specific settings. See the test
    1217  * client and server for how to do.
    1218  */
    1219 static LWS_INLINE LWS_WARN_DEPRECATED const struct lws_extension *
    1220 lws_get_internal_extensions(void) { return NULL; }
    1221 
    1232 LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
    1233 lws_ext_parse_options(const struct lws_extension *ext, struct lws *wsi,
    1234  void *ext_user, const struct lws_ext_options *opts,
    1235  const char *o, int len);
    1236 #endif
    1237 
    1250 LWS_EXTERN
    1252  struct lws_context *context, const struct lws_extension *ext,
    1253  struct lws *wsi, enum lws_extension_callback_reasons reason,
    1254  void *user, void *in, size_t len);
    1255 
    1256 /*
    1257  * The internal exts are part of the public abi
    1258  * If we add more extensions, publish the callback here ------v
    1259  */
    1261 
    1277 
    1282  const char *name;
    1303  unsigned int id;
    1310  void *user;
    1313  /* Add new things just above here ---^
    1314  * This is part of the ABI, don't needlessly break compatibility */
    1315 };
    1316 
    1317 struct lws_vhost;
    1318 
    1327 LWS_VISIBLE LWS_EXTERN const struct lws_protocols *
    1328 lws_vhost_name_to_protocol(struct lws_vhost *vh, const char *name);
    1329 
    1339 LWS_VISIBLE LWS_EXTERN const struct lws_protocols *
    1340 lws_get_protocol(struct lws *wsi);
    1341 
    1343 LWS_VISIBLE LWS_EXTERN const struct lws_protocols *
    1344 lws_protocol_get(struct lws *wsi) LWS_WARN_DEPRECATED;
    1345 
    1356 LWS_VISIBLE LWS_EXTERN void *
    1357 lws_protocol_vh_priv_zalloc(struct lws_vhost *vhost, const struct lws_protocols *prot,
    1358  int size);
    1359 
    1369 LWS_VISIBLE LWS_EXTERN void *
    1370 lws_protocol_vh_priv_get(struct lws_vhost *vhost, const struct lws_protocols *prot);
    1371 
    1380 LWS_VISIBLE LWS_EXTERN int
    1381 lws_finalize_startup(struct lws_context *context);
    1382 
    1383 #ifdef LWS_WITH_PLUGINS
    1384 
    1385 /* PLUGINS implies LIBUV */
    1386 
    1387 #define LWS_PLUGIN_API_MAGIC 180
    1388 
    1391  unsigned int api_magic;
    1392  const struct lws_protocols *protocols;
    1394  const struct lws_extension *extensions;
    1396 };
    1397 
    1398 typedef int (*lws_plugin_init_func)(struct lws_context *,
    1399  struct lws_plugin_capability *);
    1400 typedef int (*lws_plugin_destroy_func)(struct lws_context *);
    1401 
    1403 struct lws_plugin {
    1404  struct lws_plugin *list;
    1405 #if (UV_VERSION_MAJOR > 0)
    1406  uv_lib_t lib;
    1407 #else
    1408  void *l;
    1409 #endif
    1410  char name[64];
    1412 };
    1413 
    1414 #endif
    1415 
    1417 
    1418 
    1427 
    1429 #define LWSGS_EMAIL_CONTENT_SIZE 16384
    1430 
    1432 /* SHA-1 binary and hexified versions */
    1434 typedef struct { unsigned char bin[20]; } lwsgw_hash_bin;
    1436 typedef struct { char id[41]; } lwsgw_hash;
    1437 
    1444 };
    1445 
    1448  char username[32];
    1449  char email[100];
    1450  char ip[72];
    1451  unsigned int mask;
    1453  char session[42];
    1454 };
    1455 
    1460 };
    1461 
    1464  enum lws_gs_event event;
    1465  const char *username;
    1466  const char *email;
    1467 };
    1468 
    1470 
    1471 
    1485 
    1487 /*
    1488  * NOTE: These public enums are part of the abi. If you want to add one,
    1489  * add it at where specified so existing users are unaffected.
    1490  */
    1491 
    1495  (1 << 12),
    1502  (1 << 12),
    1518  (1 << 12),
    1523  (1 << 12),
    1547  /****** add new things just above ---^ ******/
    1548 };
    1549 
    1550 #define lws_check_opt(c, f) (((c) & (f)) == (f))
    1551 
    1562  int port;
    1567  const char *iface;
    1574  const struct lws_protocols *protocols;
    1578  const struct lws_extension *extensions;
    1586  const char *ssl_cert_filepath;
    1596  const char *ssl_ca_filepath;
    1598  const char *ssl_cipher_list;
    1602  const char *http_proxy_address;
    1605  unsigned int http_proxy_port;
    1607  int gid;
    1609  int uid;
    1611  unsigned int options;
    1613  void *user;
    1616  int ka_time;
    1626 #ifdef LWS_OPENSSL_SUPPORT
    1632 #else /* maintain structure layout either way */
    1634 #endif
    1635 
    1646  unsigned int count_threads;
    1648  unsigned int fd_limit_per_thread;
    1652  unsigned int timeout_secs;
    1657  const char *ecdh_curve;
    1659  const char *vhost_name;
    1663  const char * const *plugin_dirs;
    1672  const char *log_filepath;
    1675  const struct lws_http_mount *mounts;
    1677  const char *server_string;
    1680  unsigned int pt_serv_buf_size;
    1695  unsigned short ws_ping_pong_interval;
    1719  /* Add new things just above here ---^
    1720  * This is part of the ABI, don't needlessly break compatibility
    1721  *
    1722  * The below is to ensure later library versions with new
    1723  * members added above will see 0 (default) even if the app
    1724  * was not built against the newer headers.
    1725  */
    1726 
    1727  void *_unused[8];
    1728 };
    1729 
    1764 LWS_VISIBLE LWS_EXTERN struct lws_context *
    1766 
    1775 LWS_VISIBLE LWS_EXTERN void
    1776 lws_context_destroy(struct lws_context *context);
    1777 
    1795 LWS_VISIBLE LWS_EXTERN int
    1796 lws_set_proxy(struct lws_vhost *vhost, const char *proxy);
    1797 
    1798 
    1799 struct lws_vhost;
    1800 
    1810 LWS_EXTERN LWS_VISIBLE struct lws_vhost *
    1811 lws_create_vhost(struct lws_context *context,
    1812  struct lws_context_creation_info *info);
    1813 
    1828 LWS_VISIBLE LWS_EXTERN int
    1829 lwsws_get_config_globals(struct lws_context_creation_info *info, const char *d,
    1830  char **config_strings, int *len);
    1831 
    1847 LWS_VISIBLE LWS_EXTERN int
    1848 lwsws_get_config_vhosts(struct lws_context *context,
    1849  struct lws_context_creation_info *info, const char *d,
    1850  char **config_strings, int *len);
    1851 
    1853 LWS_VISIBLE LWS_EXTERN struct lws_vhost *
    1854 lws_vhost_get(struct lws *wsi) LWS_WARN_DEPRECATED;
    1855 
    1861 LWS_VISIBLE LWS_EXTERN struct lws_vhost *
    1862 lws_get_vhost(struct lws *wsi);
    1863 
    1871 LWS_VISIBLE LWS_EXTERN int
    1872 lws_json_dump_vhost(const struct lws_vhost *vh, char *buf, int len);
    1873 
    1881 LWS_VISIBLE LWS_EXTERN int
    1882 lws_json_dump_context(const struct lws_context *context, char *buf, int len);
    1883 
    1893 LWS_VISIBLE LWS_EXTERN void *
    1894 lws_context_user(struct lws_context *context);
    1895 
    1901 
    1911  const char *name;
    1912  const char *value;
    1913 };
    1914 
    1927 };
    1928 
    1936  const char *mountpoint;
    1938  const char *origin;
    1940  const char *def;
    1942  const char *protocol;
    1958  unsigned int auth_mask;
    1961  unsigned int cache_reusable:1;
    1962  unsigned int cache_revalidate:1;
    1963  unsigned int cache_intermediaries:1;
    1965  unsigned char origin_protocol;
    1966  unsigned char mountpoint_len;
    1967 };
    1970 
    1976 
    1984  LCCSCF_USE_SSL = (1 << 0),
    1985  LCCSCF_ALLOW_SELFSIGNED = (1 << 1),
    1986  LCCSCF_SKIP_SERVER_CERT_HOSTNAME_CHECK = (1 << 2)
    1987 };
    1988 
    1993  struct lws_context *context;
    1995  const char *address;
    1997  int port;
    2001  const char *path;
    2003  const char *host;
    2005  const char *origin;
    2007  const char *protocol;
    2011  void *userdata;
    2015  const char *method;
    2018  struct lws *parent_wsi;
    2022  const char *uri_replace_from;
    2025  const char *uri_replace_to;
    2027  struct lws_vhost *vhost;
    2029  struct lws **pwsi;
    2041  /* Add new things just above here ---^
    2042  * This is part of the ABI, don't needlessly break compatibility
    2043  *
    2044  * The below is to ensure later library versions with new
    2045  * members added above will see 0 (default) even if the app
    2046  * was not built against the newer headers.
    2047  */
    2048 
    2049  void *_unused[4];
    2050 };
    2051 
    2059 LWS_VISIBLE LWS_EXTERN struct lws *
    2061 
    2082 /* deprecated, use lws_client_connect_via_info() */
    2083 LWS_VISIBLE LWS_EXTERN struct lws * LWS_WARN_UNUSED_RESULT
    2084 lws_client_connect(struct lws_context *clients, const char *address,
    2085  int port, int ssl_connection, const char *path,
    2086  const char *host, const char *origin, const char *protocol,
    2087  int ietf_version_or_minus_one) LWS_WARN_DEPRECATED;
    2088 /* deprecated, use lws_client_connect_via_info() */
    2109 LWS_VISIBLE LWS_EXTERN struct lws * LWS_WARN_UNUSED_RESULT
    2110 lws_client_connect_extended(struct lws_context *clients, const char *address,
    2111  int port, int ssl_connection, const char *path,
    2112  const char *host, const char *origin,
    2113  const char *protocol, int ietf_version_or_minus_one,
    2114  void *userdata) LWS_WARN_DEPRECATED;
    2115 
    2141 LWS_VISIBLE LWS_EXTERN int
    2143  struct lws_vhost *vhost);
    2144 
    2145 LWS_VISIBLE LWS_EXTERN int
    2146 lws_http_client_read(struct lws *wsi, char **buf, int *len);
    2147 
    2148 LWS_VISIBLE LWS_EXTERN void
    2149 lws_client_http_body_pending(struct lws *wsi, int something_left_to_send);
    2150 
    2171 
    2180 
    2213 LWS_VISIBLE LWS_EXTERN int
    2214 lws_service(struct lws_context *context, int timeout_ms);
    2215 
    2227 LWS_VISIBLE LWS_EXTERN int
    2228 lws_service_tsi(struct lws_context *context, int timeout_ms, int tsi);
    2229 
    2245 LWS_VISIBLE LWS_EXTERN void
    2246 lws_cancel_service_pt(struct lws *wsi);
    2247 
    2259 LWS_VISIBLE LWS_EXTERN void
    2260 lws_cancel_service(struct lws_context *context);
    2261 
    2288 LWS_VISIBLE LWS_EXTERN int
    2289 lws_service_fd(struct lws_context *context, struct lws_pollfd *pollfd);
    2290 
    2300 LWS_VISIBLE LWS_EXTERN int
    2301 lws_service_fd_tsi(struct lws_context *context, struct lws_pollfd *pollfd,
    2302  int tsi);
    2303 
    2321 LWS_VISIBLE LWS_EXTERN int
    2322 lws_service_adjust_timeout(struct lws_context *context, int timeout_ms, int tsi);
    2323 
    2339 LWS_EXTERN LWS_VISIBLE int
    2340 lws_plat_service_tsi(struct lws_context *context, int timeout_ms, int tsi);
    2341 
    2343 
    2349 
    2356 
    2368 LWS_VISIBLE LWS_EXTERN const char *
    2369 lws_get_mimetype(const char *file, const struct lws_http_mount *m);
    2370 
    2389 LWS_VISIBLE LWS_EXTERN int
    2390 lws_serve_http_file(struct lws *wsi, const char *file, const char *content_type,
    2391  const char *other_headers, int other_headers_len);
    2392 LWS_VISIBLE LWS_EXTERN int
    2393 lws_serve_http_file_fragment(struct lws *wsi);
    2395 
    2406 
    2407 enum http_status {
    2408  HTTP_STATUS_OK = 200,
    2409  HTTP_STATUS_NO_CONTENT = 204,
    2410 
    2411  HTTP_STATUS_MOVED_PERMANENTLY = 301,
    2412  HTTP_STATUS_FOUND = 302,
    2413  HTTP_STATUS_SEE_OTHER = 303,
    2414 
    2415  HTTP_STATUS_BAD_REQUEST = 400,
    2416  HTTP_STATUS_UNAUTHORIZED,
    2417  HTTP_STATUS_PAYMENT_REQUIRED,
    2418  HTTP_STATUS_FORBIDDEN,
    2419  HTTP_STATUS_NOT_FOUND,
    2420  HTTP_STATUS_METHOD_NOT_ALLOWED,
    2421  HTTP_STATUS_NOT_ACCEPTABLE,
    2422  HTTP_STATUS_PROXY_AUTH_REQUIRED,
    2423  HTTP_STATUS_REQUEST_TIMEOUT,
    2424  HTTP_STATUS_CONFLICT,
    2425  HTTP_STATUS_GONE,
    2426  HTTP_STATUS_LENGTH_REQUIRED,
    2427  HTTP_STATUS_PRECONDITION_FAILED,
    2428  HTTP_STATUS_REQ_ENTITY_TOO_LARGE,
    2429  HTTP_STATUS_REQ_URI_TOO_LONG,
    2430  HTTP_STATUS_UNSUPPORTED_MEDIA_TYPE,
    2431  HTTP_STATUS_REQ_RANGE_NOT_SATISFIABLE,
    2432  HTTP_STATUS_EXPECTATION_FAILED,
    2433 
    2434  HTTP_STATUS_INTERNAL_SERVER_ERROR = 500,
    2435  HTTP_STATUS_NOT_IMPLEMENTED,
    2436  HTTP_STATUS_BAD_GATEWAY,
    2437  HTTP_STATUS_SERVICE_UNAVAILABLE,
    2438  HTTP_STATUS_GATEWAY_TIMEOUT,
    2439  HTTP_STATUS_HTTP_VERSION_NOT_SUPPORTED,
    2440 };
    2441 
    2443  char *p;
    2444  int len;
    2445  int max_len;
    2446  int final;
    2447 };
    2448 
    2449 typedef const char *(*lws_process_html_state_cb)(void *data, int index);
    2450 
    2452  char *start;
    2453  char swallow[16];
    2454  int pos;
    2455  void *data;
    2456  const char * const *vars;
    2459  lws_process_html_state_cb replace;
    2460 };
    2461 
    2466 LWS_VISIBLE LWS_EXTERN int
    2468  struct lws_process_html_state *s);
    2470 
    2503 
    2511 struct lws_tokens {
    2512  char *token;
    2514 };
    2515 
    2516 /* enum lws_token_indexes
    2517  * these have to be kept in sync with lextable.h / minilex.c
    2518  *
    2519  * NOTE: These public enums are part of the abi. If you want to add one,
    2520  * add it at where specified so existing users are unaffected.
    2521  */
    2522 enum lws_token_indexes {
    2523  WSI_TOKEN_GET_URI = 0,
    2524  WSI_TOKEN_POST_URI = 1,
    2525  WSI_TOKEN_OPTIONS_URI = 2,
    2526  WSI_TOKEN_HOST = 3,
    2527  WSI_TOKEN_CONNECTION = 4,
    2528  WSI_TOKEN_UPGRADE = 5,
    2529  WSI_TOKEN_ORIGIN = 6,
    2530  WSI_TOKEN_DRAFT = 7,
    2531  WSI_TOKEN_CHALLENGE = 8,
    2532  WSI_TOKEN_EXTENSIONS = 9,
    2533  WSI_TOKEN_KEY1 = 10,
    2534  WSI_TOKEN_KEY2 = 11,
    2535  WSI_TOKEN_PROTOCOL = 12,
    2536  WSI_TOKEN_ACCEPT = 13,
    2537  WSI_TOKEN_NONCE = 14,
    2538  WSI_TOKEN_HTTP = 15,
    2539  WSI_TOKEN_HTTP2_SETTINGS = 16,
    2540  WSI_TOKEN_HTTP_ACCEPT = 17,
    2541  WSI_TOKEN_HTTP_AC_REQUEST_HEADERS = 18,
    2542  WSI_TOKEN_HTTP_IF_MODIFIED_SINCE = 19,
    2543  WSI_TOKEN_HTTP_IF_NONE_MATCH = 20,
    2544  WSI_TOKEN_HTTP_ACCEPT_ENCODING = 21,
    2545  WSI_TOKEN_HTTP_ACCEPT_LANGUAGE = 22,
    2546  WSI_TOKEN_HTTP_PRAGMA = 23,
    2547  WSI_TOKEN_HTTP_CACHE_CONTROL = 24,
    2548  WSI_TOKEN_HTTP_AUTHORIZATION = 25,
    2549  WSI_TOKEN_HTTP_COOKIE = 26,
    2550  WSI_TOKEN_HTTP_CONTENT_LENGTH = 27,
    2551  WSI_TOKEN_HTTP_CONTENT_TYPE = 28,
    2552  WSI_TOKEN_HTTP_DATE = 29,
    2553  WSI_TOKEN_HTTP_RANGE = 30,
    2554  WSI_TOKEN_HTTP_REFERER = 31,
    2555  WSI_TOKEN_KEY = 32,
    2556  WSI_TOKEN_VERSION = 33,
    2557  WSI_TOKEN_SWORIGIN = 34,
    2558 
    2559  WSI_TOKEN_HTTP_COLON_AUTHORITY = 35,
    2560  WSI_TOKEN_HTTP_COLON_METHOD = 36,
    2561  WSI_TOKEN_HTTP_COLON_PATH = 37,
    2562  WSI_TOKEN_HTTP_COLON_SCHEME = 38,
    2563  WSI_TOKEN_HTTP_COLON_STATUS = 39,
    2564 
    2565  WSI_TOKEN_HTTP_ACCEPT_CHARSET = 40,
    2566  WSI_TOKEN_HTTP_ACCEPT_RANGES = 41,
    2567  WSI_TOKEN_HTTP_ACCESS_CONTROL_ALLOW_ORIGIN = 42,
    2568  WSI_TOKEN_HTTP_AGE = 43,
    2569  WSI_TOKEN_HTTP_ALLOW = 44,
    2570  WSI_TOKEN_HTTP_CONTENT_DISPOSITION = 45,
    2571  WSI_TOKEN_HTTP_CONTENT_ENCODING = 46,
    2572  WSI_TOKEN_HTTP_CONTENT_LANGUAGE = 47,
    2573  WSI_TOKEN_HTTP_CONTENT_LOCATION = 48,
    2574  WSI_TOKEN_HTTP_CONTENT_RANGE = 49,
    2575  WSI_TOKEN_HTTP_ETAG = 50,
    2576  WSI_TOKEN_HTTP_EXPECT = 51,
    2577  WSI_TOKEN_HTTP_EXPIRES = 52,
    2578  WSI_TOKEN_HTTP_FROM = 53,
    2579  WSI_TOKEN_HTTP_IF_MATCH = 54,
    2580  WSI_TOKEN_HTTP_IF_RANGE = 55,
    2581  WSI_TOKEN_HTTP_IF_UNMODIFIED_SINCE = 56,
    2582  WSI_TOKEN_HTTP_LAST_MODIFIED = 57,
    2583  WSI_TOKEN_HTTP_LINK = 58,
    2584  WSI_TOKEN_HTTP_LOCATION = 59,
    2585  WSI_TOKEN_HTTP_MAX_FORWARDS = 60,
    2586  WSI_TOKEN_HTTP_PROXY_AUTHENTICATE = 61,
    2587  WSI_TOKEN_HTTP_PROXY_AUTHORIZATION = 62,
    2588  WSI_TOKEN_HTTP_REFRESH = 63,
    2589  WSI_TOKEN_HTTP_RETRY_AFTER = 64,
    2590  WSI_TOKEN_HTTP_SERVER = 65,
    2591  WSI_TOKEN_HTTP_SET_COOKIE = 66,
    2592  WSI_TOKEN_HTTP_STRICT_TRANSPORT_SECURITY = 67,
    2593  WSI_TOKEN_HTTP_TRANSFER_ENCODING = 68,
    2594  WSI_TOKEN_HTTP_USER_AGENT = 69,
    2595  WSI_TOKEN_HTTP_VARY = 70,
    2596  WSI_TOKEN_HTTP_VIA = 71,
    2597  WSI_TOKEN_HTTP_WWW_AUTHENTICATE = 72,
    2598 
    2599  WSI_TOKEN_PATCH_URI = 73,
    2600  WSI_TOKEN_PUT_URI = 74,
    2601  WSI_TOKEN_DELETE_URI = 75,
    2602 
    2603  WSI_TOKEN_HTTP_URI_ARGS = 76,
    2604  WSI_TOKEN_PROXY = 77,
    2605  WSI_TOKEN_HTTP_X_REAL_IP = 78,
    2606  WSI_TOKEN_HTTP1_0 = 79,
    2607 
    2608  /****** add new things just above ---^ ******/
    2609 
    2610  /* use token storage to stash these internally, not for
    2611  * user use */
    2612 
    2613  _WSI_TOKEN_CLIENT_SENT_PROTOCOLS,
    2614  _WSI_TOKEN_CLIENT_PEER_ADDRESS,
    2615  _WSI_TOKEN_CLIENT_URI,
    2616  _WSI_TOKEN_CLIENT_HOST,
    2617  _WSI_TOKEN_CLIENT_ORIGIN,
    2618  _WSI_TOKEN_CLIENT_METHOD,
    2619 
    2620  /* always last real token index*/
    2621  WSI_TOKEN_COUNT,
    2622 
    2623  /* parser state additions, no storage associated */
    2624  WSI_TOKEN_NAME_PART,
    2625  WSI_TOKEN_SKIPPING,
    2626  WSI_TOKEN_SKIPPING_SAW_CR,
    2627  WSI_PARSING_COMPLETE,
    2628  WSI_INIT_TOKEN_MUXURL,
    2629 };
    2630 
    2632  unsigned short token_limit[WSI_TOKEN_COUNT];
    2633 };
    2634 
    2640 LWS_VISIBLE LWS_EXTERN const unsigned char *
    2641 lws_token_to_string(enum lws_token_indexes token);
    2642 
    2643 
    2652 LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
    2653 lws_hdr_total_length(struct lws *wsi, enum lws_token_indexes h);
    2654 
    2664 LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
    2665 lws_hdr_fragment_length(struct lws *wsi, enum lws_token_indexes h, int frag_idx);
    2666 
    2680 LWS_VISIBLE LWS_EXTERN int
    2681 lws_hdr_copy(struct lws *wsi, char *dest, int len, enum lws_token_indexes h);
    2682 
    2700 LWS_VISIBLE LWS_EXTERN int
    2701 lws_hdr_copy_fragment(struct lws *wsi, char *dest, int len,
    2702  enum lws_token_indexes h, int frag_idx);
    2703 
    2714 LWS_VISIBLE LWS_EXTERN const char *
    2715 lws_get_urlarg_by_name(struct lws *wsi, const char *name, char *buf, int len);
    2717 
    2732 
    2743 LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
    2744 lws_add_http_header_status(struct lws *wsi,
    2745  unsigned int code, unsigned char **p,
    2746  unsigned char *end);
    2759 LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
    2760 lws_add_http_header_by_name(struct lws *wsi, const unsigned char *name,
    2761  const unsigned char *value, int length,
    2762  unsigned char **p, unsigned char *end);
    2776 LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
    2777 lws_add_http_header_by_token(struct lws *wsi, enum lws_token_indexes token,
    2778  const unsigned char *value, int length,
    2779  unsigned char **p, unsigned char *end);
    2790 LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
    2791 lws_add_http_header_content_length(struct lws *wsi,
    2792  unsigned long content_length,
    2793  unsigned char **p, unsigned char *end);
    2803 LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
    2804 lws_finalize_http_header(struct lws *wsi, unsigned char **p,
    2805  unsigned char *end);
    2807 
    2826 
    2836 };
    2837 
    2851 typedef int (*lws_spa_fileupload_cb)(void *data, const char *name,
    2852  const char *filename, char *buf, int len,
    2853  enum lws_spa_fileupload_states state);
    2854 
    2857 struct lws_spa;
    2858 
    2877 LWS_VISIBLE LWS_EXTERN struct lws_spa *
    2878 lws_spa_create(struct lws *wsi, const char * const *param_names,
    2879  int count_params, int max_storage, lws_spa_fileupload_cb opt_cb,
    2880  void *opt_data);
    2881 
    2889 LWS_VISIBLE LWS_EXTERN int
    2890 lws_spa_process(struct lws_spa *spa, const char *in, int len);
    2891 
    2897 LWS_VISIBLE LWS_EXTERN int
    2898 lws_spa_finalize(struct lws_spa *spa);
    2899 
    2906 LWS_VISIBLE LWS_EXTERN int
    2907 lws_spa_get_length(struct lws_spa *spa, int n);
    2908 
    2914 LWS_VISIBLE LWS_EXTERN const char *
    2915 lws_spa_get_string(struct lws_spa *spa, int n);
    2916 
    2922 LWS_VISIBLE LWS_EXTERN int
    2923 lws_spa_destroy(struct lws_spa *spa);
    2925 
    2936 
    2947 LWS_VISIBLE LWS_EXTERN const char *
    2948 lws_urlencode(char *escaped, const char *string, int len);
    2949 
    2950 /*
    2951  * URLDECODE 1 / 2
    2952  *
    2953  * This simple urldecode only operates until the first '\0' and requires the
    2954  * data to exist all at once
    2955  */
    2968 LWS_VISIBLE LWS_EXTERN int
    2969 lws_urldecode(char *string, const char *escaped, int len);
    2971 
    2980 LWS_VISIBLE LWS_EXTERN int
    2981 lws_return_http_status(struct lws *wsi, unsigned int code,
    2982  const char *html_body);
    2983 
    2994 LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
    2995 lws_http_redirect(struct lws *wsi, int code, const unsigned char *loc, int len,
    2996  unsigned char **p, unsigned char *end);
    2997 
    3006 LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
    3007 lws_http_transaction_completed(struct lws *wsi);
    3009 
    3017 
    3028 LWS_VISIBLE LWS_EXTERN const char *
    3029 lws_sql_purify(char *escaped, const char *string, int len);
    3030 
    3041 LWS_VISIBLE LWS_EXTERN const char *
    3042 lws_json_purify(char *escaped, const char *string, int len);
    3044 
    3051 
    3053 #ifdef LWS_USE_LIBEV
    3054 typedef void (lws_ev_signal_cb_t)(EV_P_ struct ev_signal *w, int revents);
    3055 
    3056 LWS_VISIBLE LWS_EXTERN int
    3057 lws_ev_sigint_cfg(struct lws_context *context, int use_ev_sigint,
    3058  lws_ev_signal_cb_t *cb);
    3059 
    3060 LWS_VISIBLE LWS_EXTERN int
    3061 lws_ev_initloop(struct lws_context *context, struct ev_loop *loop, int tsi);
    3062 
    3063 LWS_VISIBLE LWS_EXTERN void
    3064 lws_ev_sigint_cb(struct ev_loop *loop, struct ev_signal *watcher, int revents);
    3065 #endif /* LWS_USE_LIBEV */
    3066 
    3068 
    3075 #ifdef LWS_USE_LIBUV
    3077 LWS_VISIBLE LWS_EXTERN int
    3078 lws_uv_sigint_cfg(struct lws_context *context, int use_uv_sigint,
    3079  uv_signal_cb cb);
    3080 
    3081 LWS_VISIBLE LWS_EXTERN void
    3082 lws_libuv_run(const struct lws_context *context, int tsi);
    3083 
    3084 LWS_VISIBLE LWS_EXTERN void
    3085 lws_libuv_stop(struct lws_context *context);
    3086 
    3087 LWS_VISIBLE LWS_EXTERN int
    3088 lws_uv_initloop(struct lws_context *context, uv_loop_t *loop, int tsi);
    3089 
    3090 LWS_VISIBLE LWS_EXTERN uv_loop_t *
    3091 lws_uv_getloop(struct lws_context *context, int tsi);
    3092 
    3093 LWS_VISIBLE LWS_EXTERN void
    3094 lws_uv_sigint_cb(uv_signal_t *watcher, int signum);
    3095 #endif /* LWS_USE_LIBUV */
    3096 
    3103 
    3104 /*
    3105  * NOTE: These public enums are part of the abi. If you want to add one,
    3106  * add it at where specified so existing users are unaffected.
    3107  */
    3108 enum pending_timeout {
    3109  NO_PENDING_TIMEOUT = 0,
    3110  PENDING_TIMEOUT_AWAITING_PROXY_RESPONSE = 1,
    3111  PENDING_TIMEOUT_AWAITING_CONNECT_RESPONSE = 2,
    3112  PENDING_TIMEOUT_ESTABLISH_WITH_SERVER = 3,
    3113  PENDING_TIMEOUT_AWAITING_SERVER_RESPONSE = 4,
    3114  PENDING_TIMEOUT_AWAITING_PING = 5,
    3115  PENDING_TIMEOUT_CLOSE_ACK = 6,
    3116  PENDING_TIMEOUT_AWAITING_EXTENSION_CONNECT_RESPONSE = 7,
    3117  PENDING_TIMEOUT_SENT_CLIENT_HANDSHAKE = 8,
    3118  PENDING_TIMEOUT_SSL_ACCEPT = 9,
    3119  PENDING_TIMEOUT_HTTP_CONTENT = 10,
    3120  PENDING_TIMEOUT_AWAITING_CLIENT_HS_SEND = 11,
    3121  PENDING_FLUSH_STORED_SEND_BEFORE_CLOSE = 12,
    3122  PENDING_TIMEOUT_SHUTDOWN_FLUSH = 13,
    3123  PENDING_TIMEOUT_CGI = 14,
    3124  PENDING_TIMEOUT_HTTP_KEEPALIVE_IDLE = 15,
    3125  PENDING_TIMEOUT_WS_PONG_CHECK_SEND_PING = 16,
    3126  PENDING_TIMEOUT_WS_PONG_CHECK_GET_PONG = 17,
    3127  PENDING_TIMEOUT_CLIENT_ISSUE_PAYLOAD = 18,
    3128 
    3129  /****** add new things just above ---^ ******/
    3130 };
    3131 
    3141 LWS_VISIBLE LWS_EXTERN void
    3142 lws_set_timeout(struct lws *wsi, enum pending_timeout reason, int secs);
    3144 
    3150 #if !defined(LWS_SIZEOFPTR)
    3151 #define LWS_SIZEOFPTR (sizeof (void *))
    3152 #endif
    3153 #if !defined(u_int64_t)
    3154 #define u_int64_t unsigned long long
    3155 #endif
    3156 
    3157 #if defined(__x86_64__)
    3158 #define _LWS_PAD_SIZE 16 /* Intel recommended for best performance */
    3159 #else
    3160 #define _LWS_PAD_SIZE LWS_SIZEOFPTR /* Size of a pointer on the target arch */
    3161 #endif
    3162 #define _LWS_PAD(n) (((n) % _LWS_PAD_SIZE) ? \
    3163  ((n) + (_LWS_PAD_SIZE - ((n) % _LWS_PAD_SIZE))) : (n))
    3164 #define LWS_PRE _LWS_PAD(4 + 10)
    3165 /* used prior to 1.7 and retained for backward compatibility */
    3166 #define LWS_SEND_BUFFER_PRE_PADDING LWS_PRE
    3167 #define LWS_SEND_BUFFER_POST_PADDING 0
    3168 
    3169 /*
    3170  * NOTE: These public enums are part of the abi. If you want to add one,
    3171  * add it at where specified so existing users are unaffected.
    3172  */
    3187  /* LWS_WRITE_CLOSE is handled by lws_close_reason() */
    3188  LWS_WRITE_PING = 5,
    3189  LWS_WRITE_PONG = 6,
    3190 
    3191  /* Same as write_http but we know this write ends the transaction */
    3192  LWS_WRITE_HTTP_FINAL = 7,
    3193 
    3194  /* HTTP2 */
    3195 
    3203  /****** add new things just above ---^ ******/
    3204 
    3205  /* flags */
    3206 
    3214 };
    3215 
    3216 
    3303 LWS_VISIBLE LWS_EXTERN int
    3304 lws_write(struct lws *wsi, unsigned char *buf, size_t len,
    3305  enum lws_write_protocol protocol);
    3306 
    3307 /* helper for case where buffer may be const */
    3308 #define lws_write_http(wsi, buf, len) \
    3309  lws_write(wsi, (unsigned char *)(buf), len, LWS_WRITE_HTTP)
    3310 
    3330 
    3343 LWS_VISIBLE LWS_EXTERN int
    3344 lws_callback_on_writable(struct lws *wsi);
    3345 
    3359 LWS_VISIBLE LWS_EXTERN int
    3360 lws_callback_on_writable_all_protocol(const struct lws_context *context,
    3361  const struct lws_protocols *protocol);
    3362 
    3376 LWS_VISIBLE LWS_EXTERN int
    3377 lws_callback_on_writable_all_protocol_vhost(const struct lws_vhost *vhost,
    3378  const struct lws_protocols *protocol);
    3379 
    3392 LWS_VISIBLE LWS_EXTERN int
    3393 lws_callback_all_protocol(struct lws_context *context,
    3394  const struct lws_protocols *protocol, int reason);
    3395 
    3408 LWS_VISIBLE LWS_EXTERN int
    3409 lws_callback_all_protocol_vhost(struct lws_vhost *vh,
    3410  const struct lws_protocols *protocol, int reason);
    3411 
    3425 LWS_VISIBLE LWS_EXTERN int
    3426 lws_callback_vhost_protocols(struct lws *wsi, int reason, void *in, int len);
    3427 
    3428 LWS_VISIBLE LWS_EXTERN int
    3429 lws_callback_http_dummy(struct lws *wsi, enum lws_callback_reasons reason,
    3430  void *user, void *in, size_t len);
    3431 
    3439 LWS_VISIBLE LWS_EXTERN int
    3440 lws_get_socket_fd(struct lws *wsi);
    3441 
    3463 LWS_VISIBLE LWS_EXTERN size_t
    3464 lws_get_peer_write_allowance(struct lws *wsi);
    3466 
    3477 LWS_VISIBLE LWS_EXTERN int
    3478 lws_rx_flow_control(struct lws *wsi, int enable);
    3479 
    3489 LWS_VISIBLE LWS_EXTERN void
    3490 lws_rx_flow_allow_all_protocol(const struct lws_context *context,
    3491  const struct lws_protocols *protocol);
    3492 
    3509 LWS_VISIBLE LWS_EXTERN size_t
    3510 lws_remaining_packet_payload(struct lws *wsi);
    3511 
    3512 
    3521 
    3534 LWS_VISIBLE LWS_EXTERN struct lws *
    3535 lws_adopt_socket(struct lws_context *context, lws_sockfd_type accept_fd);
    3558 LWS_VISIBLE LWS_EXTERN struct lws *
    3559 lws_adopt_socket_readbuf(struct lws_context *context, lws_sockfd_type accept_fd,
    3560  const char *readbuf, size_t len);
    3562 
    3568 
    3579 LWS_VISIBLE LWS_EXTERN const char * LWS_WARN_UNUSED_RESULT
    3580 lws_canonical_hostname(struct lws_context *context);
    3581 
    3596 LWS_VISIBLE LWS_EXTERN void
    3597 lws_get_peer_addresses(struct lws *wsi, lws_sockfd_type fd, char *name,
    3598  int name_len, char *rip, int rip_len);
    3599 
    3610 LWS_VISIBLE LWS_EXTERN const char *
    3611 lws_get_peer_simple(struct lws *wsi, char *name, int namelen);
    3612 #ifndef LWS_WITH_ESP8266
    3613 
    3624 LWS_VISIBLE LWS_EXTERN int
    3625 lws_interface_to_sa(int ipv6, const char *ifname, struct sockaddr_in *addr,
    3626  size_t addrlen);
    3628 #endif
    3629 
    3635 
    3648 LWS_VISIBLE LWS_EXTERN int
    3649 lws_snprintf(char *str, size_t size, const char *format, ...);
    3650 
    3662 LWS_VISIBLE LWS_EXTERN int
    3663 lws_get_random(struct lws_context *context, void *buf, int len);
    3671 LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
    3672 lws_daemonize(const char *_lock_path);
    3678 LWS_VISIBLE LWS_EXTERN const char * LWS_WARN_UNUSED_RESULT
    3680 
    3687 LWS_VISIBLE LWS_EXTERN void *
    3688 lws_wsi_user(struct lws *wsi);
    3689 
    3701 LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
    3702 lws_parse_uri(char *p, const char **prot, const char **ads, int *port,
    3703  const char **path);
    3704 
    3708 LWS_VISIBLE LWS_EXTERN unsigned long
    3709 lws_now_secs(void);
    3710 
    3720 LWS_VISIBLE LWS_EXTERN struct lws_context * LWS_WARN_UNUSED_RESULT
    3721 lws_get_context(const struct lws *wsi);
    3722 
    3732 LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
    3733 lws_get_count_threads(struct lws_context *context);
    3734 
    3742 LWS_VISIBLE LWS_EXTERN struct lws * LWS_WARN_UNUSED_RESULT
    3743 lws_get_parent(const struct lws *wsi);
    3744 
    3751 LWS_VISIBLE LWS_EXTERN struct lws * LWS_WARN_UNUSED_RESULT
    3752 lws_get_child(const struct lws *wsi);
    3753 
    3754 
    3755 /*
    3756  * \deprecated DEPRECATED Note: this is not normally needed as a user api.
    3757  * It's provided in case it is
    3758  * useful when integrating with other app poll loop service code.
    3759  */
    3760 LWS_VISIBLE LWS_EXTERN int
    3761 lws_read(struct lws *wsi, unsigned char *buf, size_t len);
    3762 
    3770 LWS_VISIBLE LWS_EXTERN void
    3771 lws_set_allocator(void *(*realloc)(void *ptr, size_t size));
    3773 
    3779 
    3786 LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
    3787 lws_send_pipe_choked(struct lws *wsi);
    3788 
    3793 LWS_VISIBLE LWS_EXTERN int
    3794 lws_is_final_fragment(struct lws *wsi);
    3795 
    3800 LWS_VISIBLE LWS_EXTERN unsigned char
    3801 lws_get_reserved_bits(struct lws *wsi);
    3802 
    3819 LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
    3820 lws_partial_buffered(struct lws *wsi);
    3821 
    3831 LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
    3832 lws_frame_is_binary(struct lws *wsi);
    3833 
    3842 LWS_VISIBLE LWS_EXTERN int
    3843 lws_is_ssl(struct lws *wsi);
    3848 LWS_VISIBLE LWS_EXTERN int
    3849 lws_is_cgi(struct lws *wsi);
    3851 
    3852 
    3858 #ifdef LWS_SHA1_USE_OPENSSL_NAME
    3860 #define lws_SHA1 SHA1
    3861 #else
    3862 
    3871 LWS_VISIBLE LWS_EXTERN unsigned char *
    3872 lws_SHA1(const unsigned char *d, size_t n, unsigned char *md);
    3873 #endif
    3874 
    3884 LWS_VISIBLE LWS_EXTERN int
    3885 lws_b64_encode_string(const char *in, int in_len, char *out, int out_size);
    3895 LWS_VISIBLE LWS_EXTERN int
    3896 lws_b64_decode_string(const char *in, char *out, int out_size);
    3898 
    3899 
    3909 #ifdef LWS_WITH_CGI
    3910 enum lws_enum_stdinouterr {
    3911  LWS_STDIN = 0,
    3912  LWS_STDOUT = 1,
    3913  LWS_STDERR = 2,
    3914 };
    3915 
    3916 enum lws_cgi_hdr_state {
    3917  LCHS_HEADER,
    3918  LCHS_CR1,
    3919  LCHS_LF1,
    3920  LCHS_CR2,
    3921  LCHS_LF2,
    3922  LHCS_PAYLOAD,
    3923  LCHS_SINGLE_0A,
    3924 };
    3925 
    3927  struct lws **stdwsi;
    3928  enum lws_enum_stdinouterr ch;
    3929  unsigned char *data;
    3930  enum lws_cgi_hdr_state hdr_state;
    3931  int len;
    3932 };
    3933 
    3934 
    3944 LWS_VISIBLE LWS_EXTERN int
    3945 lws_cgi(struct lws *wsi, const char * const *exec_array,
    3946  int script_uri_path_len, int timeout_secs,
    3947  const struct lws_protocol_vhost_options *mp_cgienv);
    3948 
    3954 LWS_VISIBLE LWS_EXTERN int
    3955 lws_cgi_write_split_stdout_headers(struct lws *wsi);
    3956 
    3962 LWS_VISIBLE LWS_EXTERN int
    3963 lws_cgi_kill(struct lws *wsi);
    3964 #endif
    3965 
    3967 
    3984 
    3991  lws_filefd_type (*open)(struct lws *wsi, const char *filename,
    3992  unsigned long *filelen, int flags);
    3996  int (*close)(struct lws *wsi, lws_filefd_type fd);
    3998  unsigned long (*seek_cur)(struct lws *wsi, lws_filefd_type fd,
    3999  long offset_from_cur_pos);
    4001  int (*read)(struct lws *wsi, lws_filefd_type fd, unsigned long *amount,
    4002  unsigned char *buf, unsigned long len);
    4004  int (*write)(struct lws *wsi, lws_filefd_type fd, unsigned long *amount,
    4005  unsigned char *buf, unsigned long len);
    4008  /* Add new things just above here ---^
    4009  * This is part of the ABI, don't needlessly break compatibility */
    4010 };
    4011 
    4017 LWS_VISIBLE LWS_EXTERN struct lws_plat_file_ops * LWS_WARN_UNUSED_RESULT
    4018 lws_get_fops(struct lws_context *context);
    4019 
    4028 static LWS_INLINE lws_filefd_type LWS_WARN_UNUSED_RESULT
    4029 lws_plat_file_open(struct lws *wsi, const char *filename,
    4030  unsigned long *filelen, int flags)
    4031 {
    4032  return lws_get_fops(lws_get_context(wsi))->open(wsi, filename,
    4033  filelen, flags);
    4034 }
    4035 
    4042 static LWS_INLINE int
    4043 lws_plat_file_close(struct lws *wsi, lws_filefd_type fd)
    4044 {
    4045  return lws_get_fops(lws_get_context(wsi))->close(wsi, fd);
    4046 }
    4047 
    4055 static LWS_INLINE unsigned long
    4056 lws_plat_file_seek_cur(struct lws *wsi, lws_filefd_type fd, long offset)
    4057 {
    4058  return lws_get_fops(lws_get_context(wsi))->seek_cur(wsi, fd, offset);
    4059 }
    4069 static LWS_INLINE int LWS_WARN_UNUSED_RESULT
    4070 lws_plat_file_read(struct lws *wsi, lws_filefd_type fd, unsigned long *amount,
    4071  unsigned char *buf, unsigned long len)
    4072 {
    4073  return lws_get_fops(lws_get_context(wsi))->read(wsi, fd, amount, buf,
    4074  len);
    4075 }
    4085 static LWS_INLINE int LWS_WARN_UNUSED_RESULT
    4086 lws_plat_file_write(struct lws *wsi, lws_filefd_type fd, unsigned long *amount,
    4087  unsigned char *buf, unsigned long len)
    4088 {
    4089  return lws_get_fops(lws_get_context(wsi))->write(wsi, fd, amount, buf,
    4090  len);
    4091 }
    4093 
    4125 #ifdef LWS_WITH_SMTP
    4126 
    4138 };
    4139 
    4141 struct lws_email {
    4142  void *data;
    4144  uv_loop_t *loop;
    4147  char email_smtp_ip[32];
    4148  char email_helo[32];
    4149  char email_from[100];
    4150  char email_to[100];
    4152  unsigned int max_content_size;
    4155  /* Fill all the callbacks before init */
    4156 
    4157  int (*on_next)(struct lws_email *email);
    4162  int (*on_sent)(struct lws_email *email);
    4167  int (*on_get_body)(struct lws_email *email, char *buf, int len);
    4173  /* private things */
    4174  uv_timer_t timeout_email;
    4176  uv_connect_t email_connect_req;
    4177  uv_tcp_t email_client;
    4179  char email_buf[256];
    4180  char *content;
    4181 };
    4182 
    4192 LWS_VISIBLE LWS_EXTERN int
    4193 lws_email_init(struct lws_email *email, uv_loop_t *loop, int max_content);
    4194 
    4203 LWS_VISIBLE LWS_EXTERN void
    4204 lws_email_check(struct lws_email *email);
    4212 LWS_VISIBLE LWS_EXTERN void
    4213 lws_email_destroy(struct lws_email *email);
    4214 
    4215 #endif
    4216 
    4217 
    4218 #ifdef __cplusplus
    4219 }
    4220 #endif
    4221 
    4222 #endif
    LWS_VISIBLE LWS_EXTERN int lws_spa_destroy(struct lws_spa *spa)
    LWS_VISIBLE LWS_EXTERN const char * lws_json_purify(char *escaped, const char *string, int len)
    -
    Definition: libwebsockets.h:3918
    +
    Definition: libwebsockets.h:3926
    size_t rx_buffer_size
    Definition: libwebsockets.h:1294
    LWS_VISIBLE LWS_EXTERN struct lws_spa * lws_spa_create(struct lws *wsi, const char *const *param_names, int count_params, int max_storage, lws_spa_fileupload_cb opt_cb, void *opt_data)
    LWS_VISIBLE LWS_EXTERN struct lws_vhost * lws_vhost_get(struct lws *wsi) LWS_WARN_DEPRECATED
    @@ -81,16 +81,16 @@ $(document).ready(function(){initNavTree('libwebsockets_8h_source.html','');});
    Definition: libwebsockets.h:770
    Definition: libwebsockets.h:898
    LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT lws_daemonize(const char *_lock_path)
    -
    Definition: libwebsockets.h:1915
    -
    Definition: libwebsockets.h:3176
    -
    Definition: libwebsockets.h:4123
    +
    Definition: libwebsockets.h:1923
    +
    Definition: libwebsockets.h:3184
    +
    Definition: libwebsockets.h:4131
    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)
    Definition: libwebsockets.h:236
    -
    unsigned int auth_mask
    Definition: libwebsockets.h:1950
    -
    Definition: libwebsockets.h:3199
    -
    void * data
    Definition: libwebsockets.h:4134
    -
    const char * uri_replace_from
    Definition: libwebsockets.h:2014
    -
    int(* write)(struct lws *wsi, lws_filefd_type fd, unsigned long *amount, unsigned char *buf, unsigned long len)
    Definition: libwebsockets.h:3996
    +
    unsigned int auth_mask
    Definition: libwebsockets.h:1958
    +
    Definition: libwebsockets.h:3207
    +
    void * data
    Definition: libwebsockets.h:4142
    +
    const char * uri_replace_from
    Definition: libwebsockets.h:2022
    +
    int(* write)(struct lws *wsi, lws_filefd_type fd, unsigned long *amount, unsigned char *buf, unsigned long len)
    Definition: libwebsockets.h:4004
    lws_callback_reasons
    Definition: libwebsockets.h:663
    LWS_VISIBLE LWS_EXTERN int lws_hdr_copy_fragment(struct lws *wsi, char *dest, int len, enum lws_token_indexes h, int frag_idx)
    @@ -110,77 +110,77 @@ $(document).ready(function(){initNavTree('libwebsockets_8h_source.html','');});
    LWS_VISIBLE LWS_EXTERN size_t lws_get_peer_write_allowance(struct lws *wsi)
    Definition: libwebsockets.h:747
    LWS_VISIBLE LWS_EXTERN const char *LWS_WARN_UNUSED_RESULT lws_get_library_version(void)
    -
    int(* on_sent)(struct lws_email *email)
    Definition: libwebsockets.h:4154
    +
    int(* on_sent)(struct lws_email *email)
    Definition: libwebsockets.h:4162
    Definition: libwebsockets.h:1434
    -
    struct lws ** pwsi
    Definition: libwebsockets.h:2021
    +
    struct lws ** pwsi
    Definition: libwebsockets.h:2029
    Definition: libwebsockets.h:781
    -
    const char * path
    Definition: libwebsockets.h:1993
    +
    const char * path
    Definition: libwebsockets.h:2001
    LWS_VISIBLE LWS_EXTERN size_t lws_remaining_packet_payload(struct lws *wsi)
    Definition: libwebsockets.h:582
    Definition: libwebsockets.h:1390
    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)
    -
    time_t email_connect_started
    Definition: libwebsockets.h:4170
    +
    time_t email_connect_started
    Definition: libwebsockets.h:4178
    lws_close_status
    Definition: libwebsockets.h:553
    LWS_VISIBLE LWS_EXTERN int lws_callback_all_protocol(struct lws_context *context, const struct lws_protocols *protocol, int reason)
    Definition: libwebsockets.h:593
    -
    int token_len
    Definition: libwebsockets.h:2505
    +
    int token_len
    Definition: libwebsockets.h:2513
    const struct lws_http_mount * mounts
    Definition: libwebsockets.h:1675
    Definition: libwebsockets.h:922
    LWS_VISIBLE LWS_EXTERN struct lws_context *LWS_WARN_UNUSED_RESULT lws_get_context(const struct lws *wsi)
    -
    const char * value
    Definition: libwebsockets.h:1904
    -
    Definition: libwebsockets.h:2824
    -
    Definition: libwebsockets.h:4128
    +
    const char * value
    Definition: libwebsockets.h:1912
    +
    Definition: libwebsockets.h:2832
    +
    Definition: libwebsockets.h:4136
    const char * username
    Definition: libwebsockets.h:1465
    LWS_VISIBLE LWS_EXTERN struct lws * lws_client_connect_via_info(struct lws_client_connect_info *ccinfo)
    -
    const char * protocol
    Definition: libwebsockets.h:1934
    -
    struct lws ** stdwsi
    Definition: libwebsockets.h:3919
    +
    const char * protocol
    Definition: libwebsockets.h:1942
    +
    struct lws ** stdwsi
    Definition: libwebsockets.h:3927
    LWS_VISIBLE LWS_EXTERN int lws_json_dump_vhost(const struct lws_vhost *vh, char *buf, int len)
    Definition: libwebsockets.h:868
    LWS_VISIBLE LWS_EXTERN const char * lws_get_mimetype(const char *file, const struct lws_http_mount *m)
    Definition: libwebsockets.h:1436
    -
    int cache_max_age
    Definition: libwebsockets.h:1948
    +
    int cache_max_age
    Definition: libwebsockets.h:1956
    long ssl_options_clear
    Definition: libwebsockets.h:1693
    Definition: libwebsockets.h:761
    Definition: libwebsockets.h:1561
    LWS_VISIBLE LWS_EXTERN void lws_context_destroy(struct lws_context *context)
    Definition: libwebsockets.h:609
    -
    char * start
    Definition: libwebsockets.h:2444
    +
    char * start
    Definition: libwebsockets.h:2452
    LWS_VISIBLE LWS_EXTERN void lws_set_allocator(void *(*realloc)(void *ptr, size_t size))
    lws_callback_function * callback
    Definition: libwebsockets.h:1285
    -
    Definition: libwebsockets.h:3166
    +
    Definition: libwebsockets.h:3174
    LWS_VISIBLE LWS_EXTERN int lws_get_socket_fd(struct lws *wsi)
    Definition: libwebsockets.h:959
    -
    const char * protocol
    Definition: libwebsockets.h:1999
    +
    const char * protocol
    Definition: libwebsockets.h:2007
    Definition: libwebsockets.h:948
    unsigned int pt_serv_buf_size
    Definition: libwebsockets.h:1680
    LWS_VISIBLE LWS_EXTERN struct lws * lws_adopt_socket(struct lws_context *context, lws_sockfd_type accept_fd)
    -
    int len
    Definition: libwebsockets.h:2436
    +
    int len
    Definition: libwebsockets.h:2444
    int ka_time
    Definition: libwebsockets.h:1616
    Definition: libwebsockets.h:1510
    LWS_VISIBLE LWS_EXTERN int lws_callback_on_writable_all_protocol(const struct lws_context *context, const struct lws_protocols *protocol)
    LWS_VISIBLE LWS_EXTERN void lws_set_log_level(int level, void(*log_emit_function)(int level, const char *line))
    unsigned short ws_ping_pong_interval
    Definition: libwebsockets.h:1695
    int count_extensions
    Definition: libwebsockets.h:1395
    -
    Definition: libwebsockets.h:3170
    -
    int port
    Definition: libwebsockets.h:1989
    -
    struct lws_context * context
    Definition: libwebsockets.h:1985
    +
    Definition: libwebsockets.h:3178
    +
    int port
    Definition: libwebsockets.h:1997
    +
    struct lws_context * context
    Definition: libwebsockets.h:1993
    Definition: libwebsockets.h:1442
    -
    int ietf_version_or_minus_one
    Definition: libwebsockets.h:2001
    +
    int ietf_version_or_minus_one
    Definition: libwebsockets.h:2009
    LWS_VISIBLE LWS_EXTERN int lws_callback_all_protocol_vhost(struct lws_vhost *vh, const struct lws_protocols *protocol, int reason)
    -
    Definition: libwebsockets.h:4121
    -
    Definition: libwebsockets.h:1900
    +
    Definition: libwebsockets.h:4129
    +
    Definition: libwebsockets.h:1908
    LWS_VISIBLE LWS_EXTERN int lws_callback_on_writable(struct lws *wsi)
    -
    const char *const * vars
    Definition: libwebsockets.h:2448
    +
    const char *const * vars
    Definition: libwebsockets.h:2456
    Definition: libwebsockets.h:561
    -
    Definition: libwebsockets.h:1984
    +
    Definition: libwebsockets.h:1992
    Definition: libwebsockets.h:1540
    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)
    Definition: libwebsockets.h:1185
    int len
    Definition: libwebsockets.h:1121
    -
    Definition: libwebsockets.h:1925
    -
    const char * def
    Definition: libwebsockets.h:1932
    +
    Definition: libwebsockets.h:1933
    +
    const char * def
    Definition: libwebsockets.h:1940
    Definition: libwebsockets.h:722
    Definition: libwebsockets.h:1522
    lws_context_options
    Definition: libwebsockets.h:1493
    @@ -189,29 +189,29 @@ $(document).ready(function(){initNavTree('libwebsockets_8h_source.html','');});
    Definition: libwebsockets.h:1528
    Definition: libwebsockets.h:888
    const char * option_name
    Definition: libwebsockets.h:1118
    -
    Definition: libwebsockets.h:1913
    +
    Definition: libwebsockets.h:1921
    lws_sockfd_type fd
    Definition: libwebsockets.h:531
    const char * ssl_private_key_password
    Definition: libwebsockets.h:1584
    short events
    Definition: libwebsockets.h:433
    Definition: libwebsockets.h:1403
    const struct lws_extension * extensions
    Definition: libwebsockets.h:1394
    -
    const struct lws_http_mount * mount_next
    Definition: libwebsockets.h:1926
    +
    const struct lws_http_mount * mount_next
    Definition: libwebsockets.h:1934
    LWS_VISIBLE LWS_EXTERN void lws_set_timeout(struct lws *wsi, enum pending_timeout reason, int secs)
    -
    void * userdata
    Definition: libwebsockets.h:2003
    +
    void * userdata
    Definition: libwebsockets.h:2011
    Definition: libwebsockets.h:719
    Definition: libwebsockets.h:906
    LWS_VISIBLE LWS_EXTERN int lws_service_tsi(struct lws_context *context, int timeout_ms, int tsi)
    -
    unsigned char * data
    Definition: libwebsockets.h:3921
    -
    const struct lws_protocol_vhost_options * extra_mimetypes
    Definition: libwebsockets.h:1941
    +
    unsigned char * data
    Definition: libwebsockets.h:3929
    +
    const struct lws_protocol_vhost_options * extra_mimetypes
    Definition: libwebsockets.h:1949
    LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT lws_finalize_http_header(struct lws *wsi, unsigned char **p, unsigned char *end)
    Definition: libwebsockets.h:712
    LWS_VISIBLE LWS_EXTERN const char * lws_urlencode(char *escaped, const char *string, int len)
    Definition: libwebsockets.h:793
    -
    uv_loop_t * loop
    Definition: libwebsockets.h:4136
    +
    uv_loop_t * loop
    Definition: libwebsockets.h:4144
    Definition: libwebsockets.h:891
    Definition: libwebsockets.h:72
    -
    Definition: libwebsockets.h:3202
    -
    int pos
    Definition: libwebsockets.h:2446
    +
    Definition: libwebsockets.h:3210
    +
    int pos
    Definition: libwebsockets.h:2454
    struct lws_plugin * list
    Definition: libwebsockets.h:1404
    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
    short max_http_header_data
    Definition: libwebsockets.h:1636
    @@ -224,27 +224,27 @@ $(document).ready(function(){initNavTree('libwebsockets_8h_source.html','');});
    Definition: libwebsockets.h:1097
    int ka_probes
    Definition: libwebsockets.h:1619
    void onError(Socket *s, socket_error_t err)
    -
    const char * origin
    Definition: libwebsockets.h:1997
    +
    const char * origin
    Definition: libwebsockets.h:2005
    SHORT revents
    Definition: libwebsockets.h:419
    -
    const char * method
    Definition: libwebsockets.h:2007
    +
    const char * method
    Definition: libwebsockets.h:2015
    LWS_VISIBLE LWS_EXTERN const char * lws_spa_get_string(struct lws_spa *spa, int n)
    Definition: libwebsockets.h:1191
    LWS_VISIBLE LWS_EXTERN int lws_callback_on_writable_all_protocol_vhost(const struct lws_vhost *vhost, const struct lws_protocols *protocol)
    Definition: libwebsockets.h:928
    -
    const struct lws_extension * client_exts
    Definition: libwebsockets.h:2005
    -
    unsigned char origin_protocol
    Definition: libwebsockets.h:1957
    +
    const struct lws_extension * client_exts
    Definition: libwebsockets.h:2013
    +
    unsigned char origin_protocol
    Definition: libwebsockets.h:1965
    const char * log_filepath
    Definition: libwebsockets.h:1672
    Definition: libwebsockets.h:768
    LWS_EXTERN LWS_VISIBLE int lws_plat_service_tsi(struct lws_context *context, int timeout_ms, int tsi)
    -
    unsigned int max_content_size
    Definition: libwebsockets.h:4144
    +
    unsigned int max_content_size
    Definition: libwebsockets.h:4152
    int option_index
    Definition: libwebsockets.h:1119
    LWS_VISIBLE LWS_EXTERN struct lws *LWS_WARN_UNUSED_RESULT lws_get_child(const struct lws *wsi)
    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)
    Definition: libwebsockets.h:764
    -
    const char * uri_replace_to
    Definition: libwebsockets.h:2017
    -
    struct lws * parent_wsi
    Definition: libwebsockets.h:2010
    +
    const char * uri_replace_to
    Definition: libwebsockets.h:2025
    +
    struct lws * parent_wsi
    Definition: libwebsockets.h:2018
    LWS_VISIBLE LWS_EXTERN int lws_b64_decode_string(const char *in, char *out, int out_size)
    -
    enum lwsgs_smtp_states estate
    Definition: libwebsockets.h:4167
    +
    enum lwsgs_smtp_states estate
    Definition: libwebsockets.h:4175
    LWS_VISIBLE LWS_EXTERN int lws_spa_finalize(struct lws_spa *spa)
    Definition: libwebsockets.h:664
    LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT lws_get_count_threads(struct lws_context *context)
    @@ -252,29 +252,29 @@ $(document).ready(function(){initNavTree('libwebsockets_8h_source.html','');});
    char name[64]
    Definition: libwebsockets.h:1410
    LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT lws_hdr_fragment_length(struct lws *wsi, enum lws_token_indexes h, int frag_idx)
    LWS_VISIBLE LWS_EXTERN int lws_cgi_kill(struct lws *wsi)
    -
    char email_buf[256]
    Definition: libwebsockets.h:4171
    +
    char email_buf[256]
    Definition: libwebsockets.h:4179
    LWS_VISIBLE LWS_EXTERN int lws_is_ssl(struct lws *wsi)
    Definition: libwebsockets.h:1499
    -
    int(* close)(struct lws *wsi, lws_filefd_type fd)
    Definition: libwebsockets.h:3988
    +
    int(* close)(struct lws *wsi, lws_filefd_type fd)
    Definition: libwebsockets.h:3996
    uv_lib_t lib
    Definition: libwebsockets.h:1406
    x509_crt certificate
    Definition: libwebsockets.h:238
    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)
    -
    Definition: libwebsockets.h:4122
    +
    Definition: libwebsockets.h:4130
    LWS_VISIBLE LWS_EXTERN int lws_is_cgi(struct lws *wsi)
    -
    int ssl_connection
    Definition: libwebsockets.h:1991
    +
    int ssl_connection
    Definition: libwebsockets.h:1999
    Definition: libwebsockets.h:1458
    SSL_CTX * provided_client_ssl_ctx
    Definition: libwebsockets.h:1627
    LWS_VISIBLE LWS_EXTERN int lws_rx_flow_control(struct lws *wsi, int enable)
    -
    Definition: libwebsockets.h:2434
    +
    Definition: libwebsockets.h:2442
    LWS_VISIBLE LWS_EXTERN struct lws_plat_file_ops *LWS_WARN_UNUSED_RESULT lws_get_fops(struct lws_context *context)
    Definition: libwebsockets.h:530
    -
    const struct lws_protocol_vhost_options * cgienv
    Definition: libwebsockets.h:1937
    -
    const char * name
    Definition: libwebsockets.h:1903
    -
    unsigned char mountpoint_len
    Definition: libwebsockets.h:1958
    -
    Definition: libwebsockets.h:3173
    +
    const struct lws_protocol_vhost_options * cgienv
    Definition: libwebsockets.h:1945
    +
    const char * name
    Definition: libwebsockets.h:1911
    +
    unsigned char mountpoint_len
    Definition: libwebsockets.h:1966
    +
    Definition: libwebsockets.h:3181
    Definition: libwebsockets.h:1517
    lws_sockfd_type fd
    Definition: libwebsockets.h:417
    -
    Definition: libwebsockets.h:1914
    +
    Definition: libwebsockets.h:1922
    LWS_VISIBLE LWS_EXTERN int lws_is_final_fragment(struct lws *wsi)
    const struct lws_extension * extensions
    Definition: libwebsockets.h:1578
    Definition: libwebsockets.h:1501
    @@ -289,14 +289,14 @@ $(document).ready(function(){initNavTree('libwebsockets_8h_source.html','');});
    const char * start
    Definition: libwebsockets.h:1120
    const char * ssl_cipher_list
    Definition: libwebsockets.h:1598
    LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT lws_add_http_header_by_name(struct lws *wsi, const unsigned char *name, const unsigned char *value, int length, unsigned char **p, unsigned char *end)
    -
    const char * mountpoint
    Definition: libwebsockets.h:1928
    +
    const char * mountpoint
    Definition: libwebsockets.h:1936
    const char * http_proxy_address
    Definition: libwebsockets.h:1602
    rsa_context key
    Definition: libwebsockets.h:239
    const char * ssl_cert_filepath
    Definition: libwebsockets.h:1586
    const char * ecdh_curve
    Definition: libwebsockets.h:1657
    -
    int cgi_timeout
    Definition: libwebsockets.h:1946
    -
    Definition: libwebsockets.h:1916
    +
    int cgi_timeout
    Definition: libwebsockets.h:1954
    +
    Definition: libwebsockets.h:1924
    Definition: libwebsockets.h:1443
    Definition: libwebsockets.h:431
    Definition: libwebsockets.h:587
    @@ -313,15 +313,16 @@ $(document).ready(function(){initNavTree('libwebsockets_8h_source.html','');});
    LWS_VISIBLE LWS_EXTERN int lwsl_timestamp(int level, char *p, int len)
    Definition: libwebsockets.h:1004
    Definition: libwebsockets.h:1538
    -
    uv_timer_t timeout_email
    Definition: libwebsockets.h:4166
    +
    uv_timer_t timeout_email
    Definition: libwebsockets.h:4174
    Definition: libwebsockets.h:1508
    short max_http_header_pool
    Definition: libwebsockets.h:1639
    LWS_VISIBLE LWS_EXTERN int lws_chunked_html_process(struct lws_process_html_args *args, struct lws_process_html_state *s)
    -
    char * p
    Definition: libwebsockets.h:2435
    +
    char * p
    Definition: libwebsockets.h:2443
    x509_crt ca
    Definition: libwebsockets.h:237
    size_t per_session_data_size
    Definition: libwebsockets.h:1289
    Definition: libwebsockets.h:571
    -
    lwsgs_smtp_states
    Definition: libwebsockets.h:4120
    +
    const struct lws_protocol_vhost_options * reject_service_keywords
    Definition: libwebsockets.h:1711
    +
    lwsgs_smtp_states
    Definition: libwebsockets.h:4128
    Definition: libwebsockets.h:1520
    Definition: libwebsockets.h:844
    LWS_VISIBLE LWS_EXTERN int lws_snprintf(char *str, size_t size, const char *format,...)
    @@ -333,14 +334,14 @@ $(document).ready(function(){initNavTree('libwebsockets_8h_source.html','');});
    const char * email
    Definition: libwebsockets.h:1466
    LWS_VISIBLE LWS_EXTERN int lws_get_random(struct lws_context *context, void *buf, int len)
    Definition: libwebsockets.h:558
    -
    uv_connect_t email_connect_req
    Definition: libwebsockets.h:4168
    +
    uv_connect_t email_connect_req
    Definition: libwebsockets.h:4176
    const char * server_string
    Definition: libwebsockets.h:1677
    Definition: libwebsockets.h:1531
    SHORT events
    Definition: libwebsockets.h:418
    Definition: libwebsockets.h:735
    Definition: libwebsockets.h:1515
    const char * vhost_name
    Definition: libwebsockets.h:1659
    -
    Definition: libwebsockets.h:1917
    +
    Definition: libwebsockets.h:1925
    LWS_VISIBLE LWS_EXTERN const struct lws_protocols * lws_get_protocol(struct lws *wsi)
    Definition: libwebsockets.h:1441
    Definition: libwebsockets.h:1463
    @@ -351,12 +352,12 @@ $(document).ready(function(){initNavTree('libwebsockets_8h_source.html','');});
    int ka_interval
    Definition: libwebsockets.h:1623
    Definition: libwebsockets.h:1440
    int uid
    Definition: libwebsockets.h:1609
    -
    Definition: libwebsockets.h:2826
    +
    Definition: libwebsockets.h:2834
    LWS_VISIBLE LWS_EXTERN int lws_b64_encode_string(const char *in, int in_len, char *out, int out_size)
    LWS_VISIBLE LWS_EXTERN void * lws_context_user(struct lws_context *context)
    const char * name
    Definition: libwebsockets.h:1282
    LWS_VISIBLE LWS_EXTERN int lws_init_vhost_client_ssl(const struct lws_context_creation_info *info, struct lws_vhost *vhost)
    -
    Definition: libwebsockets.h:4126
    +
    Definition: libwebsockets.h:4134
    unsigned int http_proxy_port
    Definition: libwebsockets.h:1605
    LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT lws_partial_buffered(struct lws *wsi)
    unsigned int timeout_secs
    Definition: libwebsockets.h:1652
    @@ -364,44 +365,44 @@ $(document).ready(function(){initNavTree('libwebsockets_8h_source.html','');});
    LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT lws_parse_uri(char *p, const char **prot, const char **ads, int *port, const char **path)
    unsigned int options
    Definition: libwebsockets.h:1611
    LWS_VISIBLE LWS_EXTERN int lws_spa_get_length(struct lws_spa *spa, int n)
    -
    const struct lws_protocol_vhost_options * options
    Definition: libwebsockets.h:1902
    +
    const struct lws_protocol_vhost_options * options
    Definition: libwebsockets.h:1910
    int prev_events
    Definition: libwebsockets.h:533
    int keepalive_timeout
    Definition: libwebsockets.h:1669
    Definition: libwebsockets.h:1447
    Definition: libwebsockets.h:1108
    const struct lws_protocol_vhost_options * headers
    Definition: libwebsockets.h:1707
    -
    Definition: libwebsockets.h:2623
    +
    Definition: libwebsockets.h:2631
    LWS_VISIBLE LWS_EXTERN int lws_write(struct lws *wsi, unsigned char *buf, size_t len, enum lws_write_protocol protocol)
    const struct lws_protocol_vhost_options * pvo
    Definition: libwebsockets.h:1666
    -
    const char * host
    Definition: libwebsockets.h:1995
    +
    const char * host
    Definition: libwebsockets.h:2003
    Definition: libwebsockets.h:1117
    Definition: libwebsockets.h:597
    LWS_VISIBLE LWS_EXTERN const struct lws_protocols * lws_vhost_name_to_protocol(struct lws_vhost *vh, const char *name)
    -
    int len
    Definition: libwebsockets.h:3923
    +
    int len
    Definition: libwebsockets.h:3931
    LWS_VISIBLE LWS_EXTERN const char * lws_get_urlarg_by_name(struct lws *wsi, const char *name, char *buf, int len)
    const char * iface
    Definition: libwebsockets.h:1567
    -
    Definition: libwebsockets.h:3982
    +
    Definition: libwebsockets.h:3990
    LWS_VISIBLE LWS_EXTERN void lwsl_hexdump(void *buf, size_t len)
    Definition: libwebsockets.h:1009
    -
    lws_spa_fileupload_states
    Definition: libwebsockets.h:2821
    +
    lws_spa_fileupload_states
    Definition: libwebsockets.h:2829
    LWS_VISIBLE LWS_EXTERN int lws_service_fd(struct lws_context *context, struct lws_pollfd *pollfd)
    LWS_VISIBLE LWS_EXTERN int lws_callback_vhost_protocols(struct lws *wsi, int reason, void *in, int len)
    Definition: libwebsockets.h:555
    Definition: libwebsockets.h:564
    LWS_VISIBLE LWS_EXTERN const char * lws_sql_purify(char *escaped, const char *string, int len)
    -
    uv_tcp_t email_client
    Definition: libwebsockets.h:4169
    +
    uv_tcp_t email_client
    Definition: libwebsockets.h:4177
    LWS_VISIBLE LWS_EXTERN int lws_json_dump_context(const struct lws_context *context, char *buf, int len)
    Definition: libwebsockets.h:416
    Definition: libwebsockets.h:668
    -
    lws_filefd_type(* open)(struct lws *wsi, const char *filename, unsigned long *filelen, int flags)
    Definition: libwebsockets.h:3983
    -
    lws_write_protocol
    Definition: libwebsockets.h:3165
    +
    lws_filefd_type(* open)(struct lws *wsi, const char *filename, unsigned long *filelen, int flags)
    Definition: libwebsockets.h:3991
    +
    lws_write_protocol
    Definition: libwebsockets.h:3173
    const char * client_offer
    Definition: libwebsockets.h:1194
    -
    int(* read)(struct lws *wsi, lws_filefd_type fd, unsigned long *amount, unsigned char *buf, unsigned long len)
    Definition: libwebsockets.h:3993
    +
    int(* read)(struct lws *wsi, lws_filefd_type fd, unsigned long *amount, unsigned char *buf, unsigned long len)
    Definition: libwebsockets.h:4001
    LWS_VISIBLE LWS_EXTERN void lws_cancel_service(struct lws_context *context)
    -
    Definition: libwebsockets.h:2822
    +
    Definition: libwebsockets.h:2830
    Definition: libwebsockets.h:569
    -
    const char * origin
    Definition: libwebsockets.h:1930
    +
    const char * origin
    Definition: libwebsockets.h:1938
    const char * name
    Definition: libwebsockets.h:1109
    LWS_VISIBLE LWS_EXTERN int lws_serve_http_file(struct lws *wsi, const char *file, const char *content_type, const char *other_headers, int other_headers_len)
    LWS_VISIBLE LWS_EXTERN void lws_email_check(struct lws_email *email)
    @@ -410,7 +411,7 @@ $(document).ready(function(){initNavTree('libwebsockets_8h_source.html','');});
    LWS_VISIBLE LWS_EXTERN int lws_hdr_copy(struct lws *wsi, char *dest, int len, enum lws_token_indexes h)
    Definition: libwebsockets.h:745
    const char * name
    Definition: libwebsockets.h:1192
    -
    Definition: libwebsockets.h:4125
    +
    Definition: libwebsockets.h:4133
    short revents
    Definition: libwebsockets.h:434
    lws_extension_callback_function * callback
    Definition: libwebsockets.h:1193
    long ssl_options_set
    Definition: libwebsockets.h:1691
    @@ -418,65 +419,65 @@ $(document).ready(function(){initNavTree('libwebsockets_8h_source.html','');});
    LWS_VISIBLE LWS_EXTERN const struct lws_protocols * lws_protocol_get(struct lws *wsi) LWS_WARN_DEPRECATED
    unsigned int mask
    Definition: libwebsockets.h:1451
    LWS_VISIBLE LWS_EXTERN int lws_email_init(struct lws_email *email, uv_loop_t *loop, int max_content)
    -
    lws_mount_protocols
    Definition: libwebsockets.h:1911
    +
    lws_mount_protocols
    Definition: libwebsockets.h:1919
    LWS_EXTERN int lws_extension_callback_pm_deflate(struct lws_context *context, const struct lws_extension *ext, struct lws *wsi, enum lws_extension_callback_reasons reason, void *user, void *in, size_t len)
    LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT lws_add_http_header_content_length(struct lws *wsi, unsigned long content_length, unsigned char **p, unsigned char *end)
    lws_sockfd_type fd
    Definition: libwebsockets.h:432
    unsigned int max_http_header_data2
    Definition: libwebsockets.h:1686
    -
    Definition: libwebsockets.h:1912
    +
    Definition: libwebsockets.h:1920
    LWS_VISIBLE LWS_EXTERN int lws_return_http_status(struct lws *wsi, unsigned int code, const char *html_body)
    LWS_EXTERN LWS_VISIBLE struct lws_vhost * lws_create_vhost(struct lws_context *context, struct lws_context_creation_info *info)
    -
    const struct lws_protocol_vhost_options * interpret
    Definition: libwebsockets.h:1943
    +
    const struct lws_protocol_vhost_options * interpret
    Definition: libwebsockets.h:1951
    LWS_VISIBLE LWS_EXTERN int lws_service(struct lws_context *context, int timeout_ms)
    Definition: libwebsockets.h:1513
    LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT lws_http_transaction_completed(struct lws *wsi)
    -
    int count_vars
    Definition: libwebsockets.h:2449
    +
    int count_vars
    Definition: libwebsockets.h:2457
    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)
    -
    Definition: libwebsockets.h:2503
    +
    Definition: libwebsockets.h:2511
    LWS_VISIBLE LWS_EXTERN struct lws_context * lws_create_context(struct lws_context_creation_info *info)
    Definition: libwebsockets.h:724
    -
    void * data
    Definition: libwebsockets.h:2447
    -
    char * content
    Definition: libwebsockets.h:4172
    +
    void * data
    Definition: libwebsockets.h:2455
    +
    char * content
    Definition: libwebsockets.h:4180
    LWS_VISIBLE LWS_EXTERN int lws_interface_to_sa(int ipv6, const char *ifname, struct sockaddr_in *addr, size_t addrlen)
    const struct lws_token_limits * token_limits
    Definition: libwebsockets.h:1581
    -
    lws_process_html_state_cb replace
    Definition: libwebsockets.h:2451
    -
    Definition: libwebsockets.h:4133
    -
    const char * address
    Definition: libwebsockets.h:1987
    -
    unsigned long(* seek_cur)(struct lws *wsi, lws_filefd_type fd, long offset_from_cur_pos)
    Definition: libwebsockets.h:3990
    +
    lws_process_html_state_cb replace
    Definition: libwebsockets.h:2459
    +
    Definition: libwebsockets.h:4141
    +
    const char * address
    Definition: libwebsockets.h:1995
    +
    unsigned long(* seek_cur)(struct lws *wsi, lws_filefd_type fd, long offset_from_cur_pos)
    Definition: libwebsockets.h:3998
    void * user
    Definition: libwebsockets.h:1310
    int events
    Definition: libwebsockets.h:532
    -
    int(* on_get_body)(struct lws_email *email, char *buf, int len)
    Definition: libwebsockets.h:4159
    -
    Definition: libwebsockets.h:1918
    +
    int(* on_get_body)(struct lws_email *email, char *buf, int len)
    Definition: libwebsockets.h:4167
    +
    Definition: libwebsockets.h:1926
    void * user
    Definition: libwebsockets.h:1613
    -
    Definition: libwebsockets.h:4129
    -
    Definition: libwebsockets.h:3188
    -
    char * token
    Definition: libwebsockets.h:2504
    +
    Definition: libwebsockets.h:4137
    +
    Definition: libwebsockets.h:3196
    +
    char * token
    Definition: libwebsockets.h:2512
    LWS_VISIBLE LWS_EXTERN void * lws_protocol_vh_priv_get(struct lws_vhost *vhost, const struct lws_protocols *prot)
    int count_protocols
    Definition: libwebsockets.h:1393
    void * l
    Definition: libwebsockets.h:1408
    const char * ssl_private_key_filepath
    Definition: libwebsockets.h:1590
    -
    int max_len
    Definition: libwebsockets.h:2437
    +
    int max_len
    Definition: libwebsockets.h:2445
    Definition: libwebsockets.h:726
    -
    const struct lws_protocol_vhost_options * next
    Definition: libwebsockets.h:1901
    +
    const struct lws_protocol_vhost_options * next
    Definition: libwebsockets.h:1909
    Definition: libwebsockets.h:737
    LWS_VISIBLE LWS_EXTERN void lws_rx_flow_allow_all_protocol(const struct lws_context *context, const struct lws_protocols *protocol)
    -
    Definition: libwebsockets.h:2443
    +
    Definition: libwebsockets.h:2451
    LWS_VISIBLE LWS_EXTERN const char *LWS_WARN_UNUSED_RESULT lws_canonical_hostname(struct lws_context *context)
    Definition: libwebsockets.h:936
    const char * ssl_ca_filepath
    Definition: libwebsockets.h:1596
    -
    lws_client_connect_ssl_connection_flags
    Definition: libwebsockets.h:1975
    +
    lws_client_connect_ssl_connection_flags
    Definition: libwebsockets.h:1983
    int gid
    Definition: libwebsockets.h:1607
    -
    struct lws_vhost * vhost
    Definition: libwebsockets.h:2019
    +
    struct lws_vhost * vhost
    Definition: libwebsockets.h:2027
    int lws_callback_function(struct lws *wsi, enum lws_callback_reasons reason, void *user, void *in, size_t len)
    Definition: libwebsockets.h:1043
    LWS_VISIBLE LWS_EXTERN void lws_cancel_service_pt(struct lws *wsi)
    Definition: libwebsockets.h:1533
    Definition: libwebsockets.h:605
    -
    Definition: libwebsockets.h:4124
    +
    Definition: libwebsockets.h:4132
    unsigned int api_magic
    Definition: libwebsockets.h:1391
    Definition: libwebsockets.h:1536
    LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT lws_send_pipe_choked(struct lws *wsi)
    -
    Definition: libwebsockets.h:4127
    -
    int(* lws_spa_fileupload_cb)(void *data, const char *name, const char *filename, char *buf, int len, enum lws_spa_fileupload_states state)
    Definition: libwebsockets.h:2843
    +
    Definition: libwebsockets.h:4135
    +
    int(* lws_spa_fileupload_cb)(void *data, const char *name, const char *filename, char *buf, int len, enum lws_spa_fileupload_states state)
    Definition: libwebsockets.h:2851
    diff --git a/doc/html/md_README.lwsws.html b/doc/html/md_README.lwsws.html index c07ea57..7886b57 100644 --- a/doc/html/md_README.lwsws.html +++ b/doc/html/md_README.lwsws.html @@ -84,7 +84,12 @@ Lwsws Configuration

    There is a single file intended for global settings

    /etc/lwsws/conf

    1 # these are the server global settings
    2 # stuff related to vhosts should go in one
    3 # file per vhost in ../conf.d/
    4 
    5 {
    6  "global": {
    7  "uid": "48", # apache user
    8  "gid": "48", # apache user
    9  "count-threads": "1",
    10  "server-string": "myserver v1", # returned in http headers
    11  "ws-pingpong-secs": "200", # confirm idle established ws connections this often
    12  "init-ssl": "yes"
    13  }
    14 }

    and a config directory intended to take one file per vhost

    -

    /etc/lwsws/conf.d/warmcat.com

    1 {
    2  "vhosts": [{
    3  "name": "warmcat.com",
    4  "port": "443",
    5  "interface": "eth0", # optional
    6  "host-ssl-key": "/etc/pki/tls/private/warmcat.com.key", # if given enable ssl
    7  "host-ssl-cert": "/etc/pki/tls/certs/warmcat.com.crt",
    8  "host-ssl-ca": "/etc/pki/tls/certs/warmcat.com.cer",
    9  "mounts": [{ # autoserve
    10  "mountpoint": "/",
    11  "origin": "file:///var/www/warmcat.com",
    12  "default": "index.html"
    13  }]
    14  }]
    15 }

    To get started quickly, an example config reproducing the old test server on port 7681, non-SSL is provided. To set it up

    1 # mkdir -p /etc/lwsws/conf.d /var/log/lwsws
    2 # cp ./lwsws/etc-lwsws-conf-EXAMPLE /etc/lwsws/conf
    3 # cp ./lwsws/etc-lwsws-conf.d-localhost-EXAMPLE /etc/lwsws/conf.d/test-server
    4 # sudo lwsws

    +

    /etc/lwsws/conf.d/warmcat.com

    1 {
    2  "vhosts": [{
    3  "name": "warmcat.com",
    4  "port": "443",
    5  "interface": "eth0", # optional
    6  "host-ssl-key": "/etc/pki/tls/private/warmcat.com.key", # if given enable ssl
    7  "host-ssl-cert": "/etc/pki/tls/certs/warmcat.com.crt",
    8  "host-ssl-ca": "/etc/pki/tls/certs/warmcat.com.cer",
    9  "mounts": [{ # autoserve
    10  "mountpoint": "/",
    11  "origin": "file:///var/www/warmcat.com",
    12  "default": "index.html"
    13  }]
    14  }]
    15 }

    To get started quickly, an example config reproducing the old test server on port 7681, non-SSL is provided. To set it up

    1 # mkdir -p /etc/lwsws/conf.d /var/log/lwsws
    2 # cp ./lwsws/etc-lwsws-conf-EXAMPLE /etc/lwsws/conf
    3 # cp ./lwsws/etc-lwsws-conf.d-localhost-EXAMPLE /etc/lwsws/conf.d/test-server
    4 # sudo lwsws

    +Other Global Options

    + +
    1 "reject-service-keywords": [{
    2  "scumbot": "404 Not Found"
    3 }]

    Lwsws Vhosts

    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.

    Listing multiple vhosts looks something like this

    1 {
    2  "vhosts": [ {
    3  "name": "localhost",
    4  "port": "443",
    5  "host-ssl-key": "/etc/pki/tls/private/libwebsockets.org.key",
    6  "host-ssl-cert": "/etc/pki/tls/certs/libwebsockets.org.crt",
    7  "host-ssl-ca": "/etc/pki/tls/certs/libwebsockets.org.cer",
    8  "mounts": [{
    9  "mountpoint": "/",
    10  "origin": "file:///var/www/libwebsockets.org",
    11  "default": "index.html"
    12  }, {
    13  "mountpoint": "/testserver",
    14  "origin": "file:///usr/local/share/libwebsockets-test-server",
    15  "default": "test.html"
    16  }],
    17  # which protocols are enabled for this vhost, and optional
    18  # vhost-specific config options for the protocol
    19  #
    20  "ws-protocols": [{
    21  "warmcat,timezoom": {
    22  "status": "ok"
    23  }
    24  }]
    25  },
    26  {
    27  "name": "localhost",
    28  "port": "7681",
    29  "host-ssl-key": "/etc/pki/tls/private/libwebsockets.org.key",
    30  "host-ssl-cert": "/etc/pki/tls/certs/libwebsockets.org.crt",
    31  "host-ssl-ca": "/etc/pki/tls/certs/libwebsockets.org.cer",
    32  "mounts": [{
    33  "mountpoint": "/",
    34  "origin": ">https://localhost"
    35  }]
    36  },
    37  {
    38  "name": "localhost",
    39  "port": "80",
    40  "mounts": [{
    41  "mountpoint": "/",
    42  "origin": ">https://localhost"
    43  }]
    44  }
    45 
    46  ]
    47 }

    That sets up three vhosts all called "localhost" on ports 443 and 7681 with SSL, and port 80 without SSL but with a forced redirect to https://localhost

    diff --git a/doc/html/navtreedata.js b/doc/html/navtreedata.js index 4cb3efb..8b64c93 100644 --- a/doc/html/navtreedata.js +++ b/doc/html/navtreedata.js @@ -28,6 +28,7 @@ var NAVTREE = [ "Libwebsockets Web Server", "md_README.lwsws.html#lwsws", null ], [ "Build", "md_README.lwsws.html#lwswsb", null ], [ "Lwsws Configuration", "md_README.lwsws.html#lwswsc", null ], + [ "Other Global Options", "md_README.lwsws.html#lwsogo", null ], [ "Lwsws Vhosts", "md_README.lwsws.html#lwswsv", null ], [ "Lwsws Vhost name and port sharing", "md_README.lwsws.html#lwswsvn", null ], [ "Lwsws Protocols", "md_README.lwsws.html#lwswspr", null ], @@ -135,7 +136,7 @@ var NAVTREEINDEX = "group__context-and-vhost.html#gga41c2d763f78cc248df3b9f8645dbd2a5aa0158b4e85420811e6b0f1378c6ded0f", "group__service.html#gad82efa5466d14a9f05aa06416375b28d", "group__wsstatus.html#gaeca4afc94b1f026034f99cbba37e2f85", -"structlws__http__mount.html#aabec1a326780aafe11b977000983be0c" +"structlws__http__mount.html#a8316dd183ffbef50419a5a4968d35d84" ]; var SYNCONMSG = 'click to disable panel synchronisation'; diff --git a/doc/html/navtreeindex0.js b/doc/html/navtreeindex0.js index bc6a6b6..420a0ab 100644 --- a/doc/html/navtreeindex0.js +++ b/doc/html/navtreeindex0.js @@ -222,8 +222,8 @@ var NAVTREEINDEX0 = "group__context-and-vhost.html#ga94e6cc2223c4eec316b13bcebc3628b6":[11,0,0,0,117], "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#gae2134657cdd2ea7a59e13ad314e4c50d":[9,4,9], "group__context-and-vhost.html#gae2134657cdd2ea7a59e13ad314e4c50d":[11,0,0,0,116], +"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#gaf2fff58562caab7510c41eeac85a8648":[11,0,0,0,74], diff --git a/doc/html/navtreeindex1.js b/doc/html/navtreeindex1.js index 48d90a0..002c10d 100644 --- a/doc/html/navtreeindex1.js +++ b/doc/html/navtreeindex1.js @@ -78,8 +78,8 @@ var NAVTREEINDEX1 = "group__form-parsing.html#ga41a74a822771d3dce89751aa3bce28ae":[11,0,0,0,33], "group__form-parsing.html#ga5a70527c0861c2ffa3d29333a6aa7f8e":[9,6,0,0], "group__form-parsing.html#ga5a70527c0861c2ffa3d29333a6aa7f8e":[11,0,0,0,16], -"group__form-parsing.html#ga83835bf250ee3d4a60f36a182f2b8d24":[9,6,0,4], "group__form-parsing.html#ga83835bf250ee3d4a60f36a182f2b8d24":[11,0,0,0,150], +"group__form-parsing.html#ga83835bf250ee3d4a60f36a182f2b8d24":[9,6,0,4], "group__form-parsing.html#ga9ad9ebf5ea1a7108415ed7e04cb231d2":[11,0,0,0,153], "group__form-parsing.html#ga9ad9ebf5ea1a7108415ed7e04cb231d2":[9,6,0,7], "group__form-parsing.html#gaaa482f07dad3f04b391cccf0a814e13b":[11,0,0,0,149], @@ -215,8 +215,8 @@ var NAVTREEINDEX1 = "group__pur.html":[9,12], "group__pur.html#ga9cc82f06e5ae7e71458626d7a39a5865":[11,0,0,0,154], "group__pur.html#ga9cc82f06e5ae7e71458626d7a39a5865":[9,12,1], -"group__pur.html#gab15187efcfa256b7c928562c182b92a3":[9,12,0], "group__pur.html#gab15187efcfa256b7c928562c182b92a3":[11,0,0,0,118], +"group__pur.html#gab15187efcfa256b7c928562c182b92a3":[9,12,0], "group__sending-data.html":[9,13], "group__sending-data.html#ga98b099cf8c1c7e38ad78501f270e193d":[9,13,0], "group__sending-data.html#ga98b099cf8c1c7e38ad78501f270e193d":[11,0,0,0,35], diff --git a/doc/html/navtreeindex2.js b/doc/html/navtreeindex2.js index 97eb423..788d2db 100644 --- a/doc/html/navtreeindex2.js +++ b/doc/html/navtreeindex2.js @@ -16,12 +16,12 @@ var NAVTREEINDEX2 = "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#ga5e535e346d92a9daf00be33abf79d4eb":[9,14,2], +"group__smtp.html#ga25298a5afc1074e13b2d5711a86432b2":[9,14,3], "group__smtp.html#ga5e535e346d92a9daf00be33abf79d4eb":[11,0,0,0,77], -"group__smtp.html#ga77fc9b56a1bb39484844981ec375fc29":[11,0,0,0,79], +"group__smtp.html#ga5e535e346d92a9daf00be33abf79d4eb":[9,14,2], "group__smtp.html#ga77fc9b56a1bb39484844981ec375fc29":[9,14,4], +"group__smtp.html#ga77fc9b56a1bb39484844981ec375fc29":[11,0,0,0,79], "group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a1dfec948a864205cec875f63cbe0d4ad":[9,14,1,3], "group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a1dfec948a864205cec875f63cbe0d4ad":[11,0,0,0,37,3], "group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a29e5b0ecf75375b5a643faa3d6222b7c":[9,14,1,0], @@ -30,12 +30,12 @@ var NAVTREEINDEX2 = "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":[9,14,1,6], "group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a85e3c452950c09a79086bff4b9be5c14":[11,0,0,0,37,6], -"group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a929bb4623ff3f585108aba2a1b047fab":[9,14,1,4], +"group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a85e3c452950c09a79086bff4b9be5c14":[9,14,1,6], "group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a929bb4623ff3f585108aba2a1b047fab":[11,0,0,0,37,4], -"group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0aae20a0cb95b97a70f6b45d0ed2d5be83":[11,0,0,0,37,5], +"group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0a929bb4623ff3f585108aba2a1b047fab":[9,14,1,4], "group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0aae20a0cb95b97a70f6b45d0ed2d5be83":[9,14,1,5], +"group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0aae20a0cb95b97a70f6b45d0ed2d5be83":[11,0,0,0,37,5], "group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0ab61778f70ecac007b334bb14942eb41d":[9,14,1,2], "group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0ab61778f70ecac007b334bb14942eb41d":[11,0,0,0,37,2], "group__smtp.html#gga116be79bf44f9dc2a97f46e051fe4dc0ab89442b7a3ca2b94c3cdcf33756eb933":[9,14,1,1], @@ -76,8 +76,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], @@ -102,12 +102,12 @@ var NAVTREEINDEX2 = "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a390da3639296660a78cc1a5dcb19037e":[11,0,0,0,22,25], "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a390da3639296660a78cc1a5dcb19037e":[9,16,1,25], "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a45d538082dec32dbecfe9d9a05ddfecd":[11,0,0,0,22,50], -"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a48a9590e5e18c7920282e094a0bfd9d8":[11,0,0,0,22,4], "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a48a9590e5e18c7920282e094a0bfd9d8":[9,16,1,4], -"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a492c1b1c0ac0ed980042ee732fe2990c":[11,0,0,0,22,6], +"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a48a9590e5e18c7920282e094a0bfd9d8":[11,0,0,0,22,4], "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a492c1b1c0ac0ed980042ee732fe2990c":[9,16,1,6], -"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a54269ca88508e6efd3afdb9d360a9caa":[9,16,1,28], +"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a492c1b1c0ac0ed980042ee732fe2990c":[11,0,0,0,22,6], "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a54269ca88508e6efd3afdb9d360a9caa":[11,0,0,0,22,28], +"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a54269ca88508e6efd3afdb9d360a9caa":[9,16,1,28], "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a659539cfa65c66e0d813113b09900d31":[11,0,0,0,22,42], "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a6a09ee9c01c4a233aedbe6697e29cc01":[11,0,0,0,22,44], "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7a75199176c82c1a56e4a6bbf1cc30c12c":[11,0,0,0,22,18], @@ -116,8 +116,8 @@ 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], @@ -138,8 +138,8 @@ var NAVTREEINDEX2 = "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aa87d2e82fffa42c3680c7403ef94216e":[11,0,0,0,22,34], "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aa87d2e82fffa42c3680c7403ef94216e":[9,16,1,34], "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7aaffd08a5cae791c9f3c38ee242203900":[11,0,0,0,22,46], -"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ab69783a9fbf2ca71ad70706bda77b412":[9,16,1,32], "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ab69783a9fbf2ca71ad70706bda77b412":[11,0,0,0,22,32], +"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ab69783a9fbf2ca71ad70706bda77b412":[9,16,1,32], "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ab884f3d5f8a6126a0d34c0172f5e3725":[11,0,0,0,22,53], "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7abbbe7a0a67c5866ca9109d46823fc5b1":[11,0,0,0,22,8], "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7abbbe7a0a67c5866ca9109d46823fc5b1":[9,16,1,8], @@ -159,14 +159,14 @@ var NAVTREEINDEX2 = "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ad5d34583e3556e153eda91620b48cc49":[9,16,1,27], "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ad724974204d51d688f569c5d387b967d":[11,0,0,0,22,43], "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ad87774f1c7784cf632e1e2f5b51036e1":[11,0,0,0,22,48], -"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ad8c6207b0c4e732f3d507f0fb79370e8":[9,16,1,1], "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ad8c6207b0c4e732f3d507f0fb79370e8":[11,0,0,0,22,1], -"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7adfb41c92e2522712207ef7f2462b5e34":[11,0,0,0,22,31], +"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ad8c6207b0c4e732f3d507f0fb79370e8":[9,16,1,1], "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7adfb41c92e2522712207ef7f2462b5e34":[9,16,1,31], +"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7adfb41c92e2522712207ef7f2462b5e34":[11,0,0,0,22,31], "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ae4986291b7a810fe290851d73bebeb1c":[11,0,0,0,22,21], "group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ae4986291b7a810fe290851d73bebeb1c":[9,16,1,21], -"group__usercb.html#ggad62860e19975ba4c4af401c3cdb6abf7ae5ad65d779b7eab32ab67ceff91a3bac":[9,16,1,23], "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], @@ -191,8 +191,8 @@ var NAVTREEINDEX2 = "group__vhost-mounts.html#ga31eca18e50cb4357480f2fcad36ff437":[11,0,0,0,32], "group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437a13ab58b01ac6e05f595977f1e0f0db69":[9,4,0,2,3], "group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437a13ab58b01ac6e05f595977f1e0f0db69":[11,0,0,0,32,3], -"group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437a1e9f0842b0e85db50fe648ed4ba9a4b0":[11,0,0,0,32,0], "group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437a1e9f0842b0e85db50fe648ed4ba9a4b0":[9,4,0,2,0], +"group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437a1e9f0842b0e85db50fe648ed4ba9a4b0":[11,0,0,0,32,0], "group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437a42f2361cfe76cd287fa8fcfc502357e2":[9,4,0,2,2], "group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437a42f2361cfe76cd287fa8fcfc502357e2":[11,0,0,0,32,2], "group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437a8894d16316863077dfe530963ca59f67":[9,4,0,2,5], @@ -201,11 +201,11 @@ var NAVTREEINDEX2 = "group__vhost-mounts.html#gga31eca18e50cb4357480f2fcad36ff437a946a88cf9c852eed2c0317f4115d19da":[11,0,0,0,32,6], "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":[11,0,0,0,32,1], "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], -"group__wsclose.html#gaa1c863415d1783cd8de7938aa6efa262":[11,0,0,0,71], "group__wsclose.html#gaa1c863415d1783cd8de7938aa6efa262":[9,17,1], +"group__wsclose.html#gaa1c863415d1783cd8de7938aa6efa262":[11,0,0,0,71], "group__wsclose.html#gae399c571df32ba532c0ca67da9284985":[11,0,0,0,25], "group__wsclose.html#gae399c571df32ba532c0ca67da9284985":[9,17,0], "group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a1bb501d212fa4d57053db681b1dfab98":[11,0,0,0,25,3], @@ -217,8 +217,8 @@ 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":[11,0,0,0,25,6], "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#ggae399c571df32ba532c0ca67da9284985a68b3d34bebd88547dcfa5cadba0acd6c":[11,0,0,0,25,7], "group__wsclose.html#ggae399c571df32ba532c0ca67da9284985a7aef2da0062da606eeb35aaca5cf9050":[9,17,0,7], @@ -228,21 +228,21 @@ var NAVTREEINDEX2 = "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":[11,0,0,0,25,12], "group__wsclose.html#ggae399c571df32ba532c0ca67da9284985ad0869604d79e13700ae5d196a431b350":[9,17,0,11], -"group__wsclose.html#ggae399c571df32ba532c0ca67da9284985ad09e68295eabdddcba4e332fbea70ae5":[9,17,0,8], +"group__wsclose.html#ggae399c571df32ba532c0ca67da9284985ad0869604d79e13700ae5d196a431b350":[11,0,0,0,25,12], "group__wsclose.html#ggae399c571df32ba532c0ca67da9284985ad09e68295eabdddcba4e332fbea70ae5":[11,0,0,0,25,9], -"group__wsclose.html#ggae399c571df32ba532c0ca67da9284985ad2b477a91c8445bf34ecd43977f9b390":[9,17,0,12], +"group__wsclose.html#ggae399c571df32ba532c0ca67da9284985ad09e68295eabdddcba4e332fbea70ae5":[9,17,0,8], "group__wsclose.html#ggae399c571df32ba532c0ca67da9284985ad2b477a91c8445bf34ecd43977f9b390":[11,0,0,0,25,13], +"group__wsclose.html#ggae399c571df32ba532c0ca67da9284985ad2b477a91c8445bf34ecd43977f9b390":[9,17,0,12], "group__wsclose.html#ggae399c571df32ba532c0ca67da9284985af90cb98d983ad3d4c79df9b6f3d4a4d2":[11,0,0,0,25,5], "group__wsclose.html#ggae399c571df32ba532c0ca67da9284985af90cb98d983ad3d4c79df9b6f3d4a4d2":[9,17,0,4], "group__wsstatus.html":[9,18], "group__wsstatus.html#ga08e9ee165fca503fd9427d55cfecac37":[9,18,3], "group__wsstatus.html#ga08e9ee165fca503fd9427d55cfecac37":[11,0,0,0,114], -"group__wsstatus.html#ga26a140623d202dd2bf2004deb6994baa":[11,0,0,0,115], "group__wsstatus.html#ga26a140623d202dd2bf2004deb6994baa":[9,18,4], -"group__wsstatus.html#ga2bb3655329b4651cd06f79ee3a764421":[11,0,0,0,133], +"group__wsstatus.html#ga26a140623d202dd2bf2004deb6994baa":[11,0,0,0,115], "group__wsstatus.html#ga2bb3655329b4651cd06f79ee3a764421":[9,18,6], +"group__wsstatus.html#ga2bb3655329b4651cd06f79ee3a764421":[11,0,0,0,133], "group__wsstatus.html#ga3df5045656dfb6b0e63a38de2dca79d2":[9,18,1], "group__wsstatus.html#ga3df5045656dfb6b0e63a38de2dca79d2":[11,0,0,0,100], "group__wsstatus.html#ga4ad226d5e01024b4046f4a5a37199aa1":[9,18,2], diff --git a/doc/html/navtreeindex3.js b/doc/html/navtreeindex3.js index 2da44f0..732b7d3 100644 --- a/doc/html/navtreeindex3.js +++ b/doc/html/navtreeindex3.js @@ -2,8 +2,8 @@ var NAVTREEINDEX3 = { "group__wsstatus.html#gaeca4afc94b1f026034f99cbba37e2f85":[11,0,0,0,123], "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], @@ -104,20 +104,21 @@ var NAVTREEINDEX3 = "md_README.generic-table.html#gtint":[6,0], "md_README.generic-table.html#gtinth":[6,2], "md_README.lwsws.html":[3], +"md_README.lwsws.html#lwsogo":[3,3], "md_README.lwsws.html#lwsws":[3,0], "md_README.lwsws.html#lwswsb":[3,1], "md_README.lwsws.html#lwswsc":[3,2], -"md_README.lwsws.html#lwswslr":[3,13], -"md_README.lwsws.html#lwswsm":[3,7], -"md_README.lwsws.html#lwswsomo":[3,8], -"md_README.lwsws.html#lwswsovo":[3,6], -"md_README.lwsws.html#lwswspl":[3,9], -"md_README.lwsws.html#lwswsplaplp":[3,10], -"md_README.lwsws.html#lwswspr":[3,5], -"md_README.lwsws.html#lwswsssp":[3,11], -"md_README.lwsws.html#lwswssysd":[3,12], -"md_README.lwsws.html#lwswsv":[3,3], -"md_README.lwsws.html#lwswsvn":[3,4], +"md_README.lwsws.html#lwswslr":[3,14], +"md_README.lwsws.html#lwswsm":[3,8], +"md_README.lwsws.html#lwswsomo":[3,9], +"md_README.lwsws.html#lwswsovo":[3,7], +"md_README.lwsws.html#lwswspl":[3,10], +"md_README.lwsws.html#lwswsplaplp":[3,11], +"md_README.lwsws.html#lwswspr":[3,6], +"md_README.lwsws.html#lwswsssp":[3,12], +"md_README.lwsws.html#lwswssysd":[3,13], +"md_README.lwsws.html#lwswsv":[3,4], +"md_README.lwsws.html#lwswsvn":[3,5], "md_README.problems.html":[2], "md_README.test-apps.html":[7], "md_README.test-apps.html#autobahn":[7,13], @@ -166,21 +167,22 @@ var NAVTREEINDEX3 = "structlws__context__creation__info.html#a0b154e79abc1167ba4ac3539f4af6720":[9,4,1,17], "structlws__context__creation__info.html#a0cdfd3c484689ba6f0f2cc91b38ce948":[9,4,1,15], "structlws__context__creation__info.html#a0e790dda6202604f73a03b6149bc12bb":[9,4,1,24], -"structlws__context__creation__info.html#a0e9d94cdfb893d777b4a4db81e7b5ac0":[9,4,1,38], -"structlws__context__creation__info.html#a137a9b9de4f6a7993fed8746d551e616":[9,4,1,27], +"structlws__context__creation__info.html#a0e9d94cdfb893d777b4a4db81e7b5ac0":[9,4,1,39], +"structlws__context__creation__info.html#a137a9b9de4f6a7993fed8746d551e616":[9,4,1,28], "structlws__context__creation__info.html#a13ffbb0d010309669611f8c4eda7d7f8":[9,4,1,18], "structlws__context__creation__info.html#a1654d41bea6fb2f619b57e6a264b26a4":[9,4,1,23], -"structlws__context__creation__info.html#a33a1a25a7df3793f59047e20dd580078":[9,4,1,40], +"structlws__context__creation__info.html#a33a1a25a7df3793f59047e20dd580078":[9,4,1,41], "structlws__context__creation__info.html#a381342a398883d6204955ff3c1849ddd":[9,4,1,10], "structlws__context__creation__info.html#a3baab4285c679fbe027c2504621d7410":[9,4,1,11], -"structlws__context__creation__info.html#a3e1516fd7fed26bfa77c0246ed26c2eb":[9,4,1,30], +"structlws__context__creation__info.html#a3e1516fd7fed26bfa77c0246ed26c2eb":[9,4,1,31], "structlws__context__creation__info.html#a424a5ce268d6903e42243be94487ab85":[9,4,1,21], "structlws__context__creation__info.html#a45e63e24c88289e0c8352377ef4d3646":[9,4,1,4], "structlws__context__creation__info.html#a4a3d1155fc52f5048b481884f6fb947c":[9,4,1,3], -"structlws__context__creation__info.html#a4f8e65c3a059d3b586fafa9ef3282c29":[9,4,1,28], +"structlws__context__creation__info.html#a4f8e65c3a059d3b586fafa9ef3282c29":[9,4,1,29], "structlws__context__creation__info.html#a57f88c0745adbd1d6b9b619b8de30209":[9,4,1,25], -"structlws__context__creation__info.html#a6cfa3d51df2def3349a5cbf0d712822d":[9,4,1,35], -"structlws__context__creation__info.html#a704940261951ced6b5d8191bd8b9bb2d":[9,4,1,32], +"structlws__context__creation__info.html#a6b059b7ee248cba72a3a4fd6141b0b34":[9,4,1,27], +"structlws__context__creation__info.html#a6cfa3d51df2def3349a5cbf0d712822d":[9,4,1,36], +"structlws__context__creation__info.html#a704940261951ced6b5d8191bd8b9bb2d":[9,4,1,33], "structlws__context__creation__info.html#a75434932bb5df54665ea678eb8ac104a":[9,4,1,9], "structlws__context__creation__info.html#a7b59f2bdc869871e7bde232db94f5ca6":[9,4,1,8], "structlws__context__creation__info.html#a8122cfc0810bafe51edb3ba6bf9a1251":[9,4,1,20], @@ -190,18 +192,18 @@ var NAVTREEINDEX3 = "structlws__context__creation__info.html#a9c9d22437de92c197f3cee52912b2c03":[9,4,1,5], "structlws__context__creation__info.html#a9d3b17a25e1fbc772f21eb4959a82724":[9,4,1,19], "structlws__context__creation__info.html#aa8d9e85e137f35fb006f2e4a53f0887a":[9,4,1,16], -"structlws__context__creation__info.html#ab9ec8893e0f7843cf5d783d2f350ef14":[9,4,1,33], +"structlws__context__creation__info.html#ab9ec8893e0f7843cf5d783d2f350ef14":[9,4,1,34], "structlws__context__creation__info.html#abb90ffb3e6d6db2db20f529d61bd9122":[9,4,1,22], -"structlws__context__creation__info.html#ac105b4180008cb3e672d57beead8382e":[9,4,1,37], +"structlws__context__creation__info.html#ac105b4180008cb3e672d57beead8382e":[9,4,1,38], "structlws__context__creation__info.html#ac583ce92b8e1c949cb6fef6bfe713d56":[9,4,1,12], -"structlws__context__creation__info.html#ac62b0f0e8e402412ba5011d15c244103":[9,4,1,29], -"structlws__context__creation__info.html#ac8a75b7b259a3c3a5fbb4219a3f06c29":[9,4,1,36], +"structlws__context__creation__info.html#ac62b0f0e8e402412ba5011d15c244103":[9,4,1,30], +"structlws__context__creation__info.html#ac8a75b7b259a3c3a5fbb4219a3f06c29":[9,4,1,37], "structlws__context__creation__info.html#ad0e95ba721f7bd2b676719f8093c23a2":[9,4,1,14], -"structlws__context__creation__info.html#ad50db098a208f045f7811207d2bee4b9":[9,4,1,39], -"structlws__context__creation__info.html#adb0bc0b28cd7d90ab306723d8ffa96fa":[9,4,1,31], +"structlws__context__creation__info.html#ad50db098a208f045f7811207d2bee4b9":[9,4,1,40], +"structlws__context__creation__info.html#adb0bc0b28cd7d90ab306723d8ffa96fa":[9,4,1,32], "structlws__context__creation__info.html#ae52f3237e144e9ddcab5e2cf91d1e419":[9,4,1,1], "structlws__context__creation__info.html#aef917c0b23976a264d2474901b4f5aa3":[9,4,1,7], -"structlws__context__creation__info.html#af3fb447be15c4fcb01d3285a6678ab54":[9,4,1,34], +"structlws__context__creation__info.html#af3fb447be15c4fcb01d3285a6678ab54":[9,4,1,35], "structlws__context__creation__info.html#afa5d4e7d9f86b58a1c6fac14f0a5f5f9":[9,4,1,2], "structlws__context__creation__info.html#afce3b59950eca3203faa07381bbed5d7":[9,4,1,0], "structlws__email.html":[9,14,0], @@ -247,7 +249,5 @@ var NAVTREEINDEX3 = "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#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#a6a9b1492a0b9749e39bd19932717a0b7":[9,4,0,1,14] }; diff --git a/doc/html/navtreeindex4.js b/doc/html/navtreeindex4.js index 001ddce..5753fd7 100644 --- a/doc/html/navtreeindex4.js +++ b/doc/html/navtreeindex4.js @@ -1,5 +1,7 @@ var NAVTREEINDEX4 = { +"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], @@ -73,12 +75,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,6], "structlws__tokens.html":[9,6,4,0], -"structlws__tokens.html#a855b7375d1d58516c0ecd4b60e9a7766":[9,6,6,1], +"structlws__tokens.html":[9,6,6], "structlws__tokens.html#a855b7375d1d58516c0ecd4b60e9a7766":[9,6,4,0,1], -"structlws__tokens.html#a9f3635412bc71a5cb78e9862b55f10cd":[9,6,6,0], +"structlws__tokens.html#a855b7375d1d58516c0ecd4b60e9a7766":[9,6,6,1], "structlws__tokens.html#a9f3635412bc71a5cb78e9862b55f10cd":[9,6,4,0,0], +"structlws__tokens.html#a9f3635412bc71a5cb78e9862b55f10cd":[9,6,6,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], diff --git a/doc/html/structlws__context__creation__info.html b/doc/html/structlws__context__creation__info.html index b62559e..0066193 100644 --- a/doc/html/structlws__context__creation__info.html +++ b/doc/html/structlws__context__creation__info.html @@ -160,6 +160,8 @@ Data Fields   const struct lws_protocol_vhost_optionsheaders   +const struct lws_protocol_vhost_optionsreject_service_keywords +  void * _unused [8]   @@ -519,6 +521,21 @@ Data Fields + +
    +
    + + + + +
    const struct lws_protocol_vhost_options* lws_context_creation_info::reject_service_keywords
    +
    +

    CONTEXT: Optional list of keywords and rejection codes + text.

    +

    The keywords are checked for existing in the user agent string.

    +

    Eg, "badrobot" "404 Not Found"

    + +
    +
    diff --git a/doc/html/structlws__context__creation__info.js b/doc/html/structlws__context__creation__info.js index 64a0b05..5a05ebc 100644 --- a/doc/html/structlws__context__creation__info.js +++ b/doc/html/structlws__context__creation__info.js @@ -27,6 +27,7 @@ var structlws__context__creation__info = [ "provided_client_ssl_ctx", "structlws__context__creation__info.html#a0e790dda6202604f73a03b6149bc12bb", null ], [ "pt_serv_buf_size", "structlws__context__creation__info.html#a57f88c0745adbd1d6b9b619b8de30209", null ], [ "pvo", "structlws__context__creation__info.html#a999866fcd15dbd621773436f97190458", null ], + [ "reject_service_keywords", "structlws__context__creation__info.html#a6b059b7ee248cba72a3a4fd6141b0b34", null ], [ "server_string", "structlws__context__creation__info.html#a137a9b9de4f6a7993fed8746d551e616", null ], [ "ssl_ca_filepath", "structlws__context__creation__info.html#a4f8e65c3a059d3b586fafa9ef3282c29", null ], [ "ssl_cert_filepath", "structlws__context__creation__info.html#ac62b0f0e8e402412ba5011d15c244103", null ], diff --git a/lib/context.c b/lib/context.c index d15b1c1..17615fb 100644 --- a/lib/context.c +++ b/lib/context.c @@ -588,6 +588,8 @@ lws_create_context(struct lws_context_creation_info *info) else context->pt_serv_buf_size = 4096; + context->reject_service_keywords = info->reject_service_keywords; + context->time_up = time(NULL); #ifndef LWS_NO_DAEMONIZE if (pid_daemon) { diff --git a/lib/lejp-conf.c b/lib/lejp-conf.c index ced9ba5..21f1951 100644 --- a/lib/lejp-conf.c +++ b/lib/lejp-conf.c @@ -37,6 +37,8 @@ static const char * const paths_global[] = { "global.server-string", "global.plugin-dir", "global.ws-pingpong-secs", + "global.reject-service-keywords[].*", + "global.reject-service-keywords[]", }; enum lejp_global_paths { @@ -47,6 +49,8 @@ enum lejp_global_paths { LEJPGP_SERVER_STRING, LEJPGP_PLUGIN_DIR, LWJPGP_PINGPONG_SECS, + LWJPGP_REJECT_SERVICE_KEYWORDS_NAME, + LWJPGP_REJECT_SERVICE_KEYWORDS }; static const char * const paths_vhosts[] = { @@ -209,11 +213,31 @@ static char lejp_globals_cb(struct lejp_ctx *ctx, char reason) { struct jpargs *a = (struct jpargs *)ctx->user; + struct lws_protocol_vhost_options *rej; + int n; /* we only match on the prepared path strings */ if (!(reason & LEJP_FLAG_CB_IS_VALUE) || !ctx->path_match) return 0; + /* this catches, eg, vhosts[].headers[].xxx */ + if (reason == LEJPCB_VAL_STR_END && + ctx->path_match == LWJPGP_REJECT_SERVICE_KEYWORDS_NAME + 1) { + rej = lwsws_align(a); + a->p += sizeof(*rej); + + n = lejp_get_wildcard(ctx, 0, a->p, a->end - a->p); + rej->next = a->info->reject_service_keywords; + a->info->reject_service_keywords = rej; + rej->name = a->p; + lwsl_notice(" adding rej %s=%s\n", a->p, ctx->buf); + a->p += n - 1; + *(a->p++) = '\0'; + rej->value = a->p; + rej->options = NULL; + goto dostring; + } + switch (ctx->path_match - 1) { case LEJPGP_UID: a->info->uid = atoi(ctx->buf); @@ -247,6 +271,7 @@ lejp_globals_cb(struct lejp_ctx *ctx, char reason) return 0; } +dostring: a->p += lws_snprintf(a->p, a->end - a->p, "%s", ctx->buf); *(a->p)++ = '\0'; diff --git a/lib/libwebsockets.h b/lib/libwebsockets.h index a4fe758..ccda8f6 100644 --- a/lib/libwebsockets.h +++ b/lib/libwebsockets.h @@ -1708,6 +1708,14 @@ struct lws_context_creation_info { /**< VHOST: pointer to optional linked list of per-vhost * canned headers that are added to server responses */ + const struct lws_protocol_vhost_options *reject_service_keywords; + /**< CONTEXT: Optional list of keywords and rejection codes + text. + * + * The keywords are checked for existing in the user agent string. + * + * Eg, "badrobot" "404 Not Found" + */ + /* Add new things just above here ---^ * This is part of the ABI, don't needlessly break compatibility * diff --git a/lib/private-libwebsockets.h b/lib/private-libwebsockets.h index b65687a..5044707 100644 --- a/lib/private-libwebsockets.h +++ b/lib/private-libwebsockets.h @@ -828,6 +828,7 @@ struct lws_context { const struct lws_token_limits *token_limits; void *user_space; const char *server_string; + const struct lws_protocol_vhost_options *reject_service_keywords; #if defined(LWS_USE_LIBEV) lws_ev_signal_cb_t * lws_ev_sigint_cb; diff --git a/lib/server.c b/lib/server.c index 72dcbed..292dba9 100644 --- a/lib/server.c +++ b/lib/server.c @@ -1049,6 +1049,30 @@ lws_handshake_server(struct lws *wsi, unsigned char **buf, size_t len) lwsl_debug("%s: wsi->more_rx_waiting=%d\n", __func__, wsi->more_rx_waiting); + /* check for unwelcome guests */ + + if (wsi->context->reject_service_keywords) { + const struct lws_protocol_vhost_options *rej = + wsi->context->reject_service_keywords; + char ua[384], *msg = NULL; + + if (lws_hdr_copy(wsi, ua, sizeof(ua) - 1, + WSI_TOKEN_HTTP_USER_AGENT) > 0) { + ua[sizeof(ua) - 1] = '\0'; + while (rej) { + if (strstr(ua, rej->name)) { + msg = strchr(rej->value, ' '); + if (msg) + msg++; + lws_return_http_status(wsi, atoi(rej->value), msg); + + goto bail_nuke_ah; + } + rej = rej->next; + } + } + } + /* select vhost */ if (lws_hdr_total_length(wsi, WSI_TOKEN_HOST)) {