diff --git a/doc/html/group__form-parsing.html b/doc/html/group__form-parsing.html index 3a835b97..9c7f9720 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

-
2817  {
2818  LWS_UFS_CONTENT,
2820  LWS_UFS_FINAL_CONTENT,
2822  LWS_UFS_OPEN
2824 };
Definition: libwebsockets.h:2820
-
Definition: libwebsockets.h:2822
-
Definition: libwebsockets.h:2818
+
2821  {
2826  LWS_UFS_OPEN
2828 };
Definition: libwebsockets.h:2824
+
Definition: libwebsockets.h:2826
+
Definition: libwebsockets.h:2822
diff --git a/doc/html/group__sending-data.html b/doc/html/group__sending-data.html index ee8944ce..401dfac1 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

-
3161  {
3162  LWS_WRITE_TEXT = 0,
3166  LWS_WRITE_BINARY = 1,
3169  LWS_WRITE_CONTINUATION = 2,
3172  LWS_WRITE_HTTP = 3,
3175  /* LWS_WRITE_CLOSE is handled by lws_close_reason() */
3176  LWS_WRITE_PING = 5,
3177  LWS_WRITE_PONG = 6,
3178 
3179  /* Same as write_http but we know this write ends the transaction */
3180  LWS_WRITE_HTTP_FINAL = 7,
3181 
3182  /* HTTP2 */
3183 
3184  LWS_WRITE_HTTP_HEADERS = 8,
3191  /****** add new things just above ---^ ******/
3192 
3193  /* flags */
3194 
3195  LWS_WRITE_NO_FIN = 0x40,
3198  LWS_WRITE_CLIENT_IGNORE_XOR_MASK = 0x80
3202 };
Definition: libwebsockets.h:3172
-
Definition: libwebsockets.h:3195
-
Definition: libwebsockets.h:3162
-
Definition: libwebsockets.h:3166
-
Definition: libwebsockets.h:3198
-
Definition: libwebsockets.h:3169
-
Definition: libwebsockets.h:3184
+
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
diff --git a/doc/html/group__service.html b/doc/html/group__service.html index 6390d1a2..f761516c 100644 --- a/doc/html/group__service.html +++ b/doc/html/group__service.html @@ -320,14 +320,15 @@ Functions

lws_service_fd() - Service polled socket with something waiting

Parameters
- +
contextWebsocket context
pollfdThe pollfd entry describing the socket fd and which events happened.
pollfdThe pollfd entry describing the socket fd and which events happened, or NULL to tell lws to do only timeout servicing.

This function takes a pollfd that has POLLIN or POLLOUT activity and services it according to the state of the associated struct lws.

The one call deals with all "service" that might happen on a socket including listen accepts, http files as well as websocket protocol.

If a pollfd says it has something, you can just pass it to lws_service_fd() whether it is a socket handled by lws or not. If it sees it is a lws socket, the traffic will be handled and pollfd->revents will be zeroed now.

-

If the socket is foreign to lws, it leaves revents alone. So you can see if you should service yourself by checking the pollfd revents after letting lws try to service it.

+

If the socket is foreign to lws, it leaves revents alone. So you can see if you should service yourself by checking the pollfd revents after letting lws try to service it.

+

You should also call this with pollfd = NULL to just allow the once-per-second global timeout checks; if less than a second since the last check it returns immediately then.

diff --git a/doc/html/group__smtp.html b/doc/html/group__smtp.html index 3ae3131d..2a1b4a0a 100644 --- a/doc/html/group__smtp.html +++ b/doc/html/group__smtp.html @@ -157,15 +157,15 @@ Functions

sent the session quit

-
4102  {
4103  LGSSMTP_IDLE,
4104  LGSSMTP_CONNECTING,
4105  LGSSMTP_CONNECTED,
4106  LGSSMTP_SENT_HELO,
4107  LGSSMTP_SENT_FROM,
4108  LGSSMTP_SENT_TO,
4109  LGSSMTP_SENT_DATA,
4110  LGSSMTP_SENT_BODY,
4111  LGSSMTP_SENT_QUIT,
4112 };
Definition: libwebsockets.h:4105
-
Definition: libwebsockets.h:4110
-
Definition: libwebsockets.h:4103
-
Definition: libwebsockets.h:4104
-
Definition: libwebsockets.h:4108
-
Definition: libwebsockets.h:4107
-
Definition: libwebsockets.h:4111
-
Definition: libwebsockets.h:4106
-
Definition: libwebsockets.h:4109
+
4106  {
4107  LGSSMTP_IDLE,
4112  LGSSMTP_SENT_TO,
4116 };
Definition: libwebsockets.h:4109
+
Definition: libwebsockets.h:4114
+
Definition: libwebsockets.h:4107
+
Definition: libwebsockets.h:4108
+
Definition: libwebsockets.h:4112
+
Definition: libwebsockets.h:4111
+
Definition: libwebsockets.h:4115
+
Definition: libwebsockets.h:4110
+
Definition: libwebsockets.h:4113
diff --git a/doc/html/libwebsockets_8h_source.html b/doc/html/libwebsockets_8h_source.html index 6eda6097..4e14e537 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() { 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 
2276 LWS_VISIBLE LWS_EXTERN int
2277 lws_service_fd(struct lws_context *context, struct lws_pollfd *pollfd);
2278 
2288 LWS_VISIBLE LWS_EXTERN int
2289 lws_service_fd_tsi(struct lws_context *context, struct lws_pollfd *pollfd,
2290  int tsi);
2291 
2309 LWS_VISIBLE LWS_EXTERN int
2310 lws_service_adjust_timeout(struct lws_context *context, int timeout_ms, int tsi);
2311 
2327 LWS_EXTERN LWS_VISIBLE int
2328 lws_plat_service_tsi(struct lws_context *context, int timeout_ms, int tsi);
2329 
2331 
2337 
2344 
2356 LWS_VISIBLE LWS_EXTERN const char *
2357 lws_get_mimetype(const char *file, const struct lws_http_mount *m);
2358 
2377 LWS_VISIBLE LWS_EXTERN int
2378 lws_serve_http_file(struct lws *wsi, const char *file, const char *content_type,
2379  const char *other_headers, int other_headers_len);
2380 LWS_VISIBLE LWS_EXTERN int
2381 lws_serve_http_file_fragment(struct lws *wsi);
2383 
2394 
2395 enum http_status {
2396  HTTP_STATUS_OK = 200,
2397  HTTP_STATUS_NO_CONTENT = 204,
2398 
2399  HTTP_STATUS_MOVED_PERMANENTLY = 301,
2400  HTTP_STATUS_FOUND = 302,
2401  HTTP_STATUS_SEE_OTHER = 303,
2402 
2403  HTTP_STATUS_BAD_REQUEST = 400,
2404  HTTP_STATUS_UNAUTHORIZED,
2405  HTTP_STATUS_PAYMENT_REQUIRED,
2406  HTTP_STATUS_FORBIDDEN,
2407  HTTP_STATUS_NOT_FOUND,
2408  HTTP_STATUS_METHOD_NOT_ALLOWED,
2409  HTTP_STATUS_NOT_ACCEPTABLE,
2410  HTTP_STATUS_PROXY_AUTH_REQUIRED,
2411  HTTP_STATUS_REQUEST_TIMEOUT,
2412  HTTP_STATUS_CONFLICT,
2413  HTTP_STATUS_GONE,
2414  HTTP_STATUS_LENGTH_REQUIRED,
2415  HTTP_STATUS_PRECONDITION_FAILED,
2416  HTTP_STATUS_REQ_ENTITY_TOO_LARGE,
2417  HTTP_STATUS_REQ_URI_TOO_LONG,
2418  HTTP_STATUS_UNSUPPORTED_MEDIA_TYPE,
2419  HTTP_STATUS_REQ_RANGE_NOT_SATISFIABLE,
2420  HTTP_STATUS_EXPECTATION_FAILED,
2421 
2422  HTTP_STATUS_INTERNAL_SERVER_ERROR = 500,
2423  HTTP_STATUS_NOT_IMPLEMENTED,
2424  HTTP_STATUS_BAD_GATEWAY,
2425  HTTP_STATUS_SERVICE_UNAVAILABLE,
2426  HTTP_STATUS_GATEWAY_TIMEOUT,
2427  HTTP_STATUS_HTTP_VERSION_NOT_SUPPORTED,
2428 };
2429 
2431  char *p;
2432  int len;
2433  int max_len;
2434  int final;
2435 };
2436 
2437 typedef const char *(*lws_process_html_state_cb)(void *data, int index);
2438 
2440  char *start;
2441  char swallow[16];
2442  int pos;
2443  void *data;
2444  const char * const *vars;
2447  lws_process_html_state_cb replace;
2448 };
2449 
2454 LWS_VISIBLE LWS_EXTERN int
2456  struct lws_process_html_state *s);
2458 
2491 
2499 struct lws_tokens {
2500  char *token;
2502 };
2503 
2504 /* enum lws_token_indexes
2505  * these have to be kept in sync with lextable.h / minilex.c
2506  *
2507  * NOTE: These public enums are part of the abi. If you want to add one,
2508  * add it at where specified so existing users are unaffected.
2509  */
2510 enum lws_token_indexes {
2511  WSI_TOKEN_GET_URI = 0,
2512  WSI_TOKEN_POST_URI = 1,
2513  WSI_TOKEN_OPTIONS_URI = 2,
2514  WSI_TOKEN_HOST = 3,
2515  WSI_TOKEN_CONNECTION = 4,
2516  WSI_TOKEN_UPGRADE = 5,
2517  WSI_TOKEN_ORIGIN = 6,
2518  WSI_TOKEN_DRAFT = 7,
2519  WSI_TOKEN_CHALLENGE = 8,
2520  WSI_TOKEN_EXTENSIONS = 9,
2521  WSI_TOKEN_KEY1 = 10,
2522  WSI_TOKEN_KEY2 = 11,
2523  WSI_TOKEN_PROTOCOL = 12,
2524  WSI_TOKEN_ACCEPT = 13,
2525  WSI_TOKEN_NONCE = 14,
2526  WSI_TOKEN_HTTP = 15,
2527  WSI_TOKEN_HTTP2_SETTINGS = 16,
2528  WSI_TOKEN_HTTP_ACCEPT = 17,
2529  WSI_TOKEN_HTTP_AC_REQUEST_HEADERS = 18,
2530  WSI_TOKEN_HTTP_IF_MODIFIED_SINCE = 19,
2531  WSI_TOKEN_HTTP_IF_NONE_MATCH = 20,
2532  WSI_TOKEN_HTTP_ACCEPT_ENCODING = 21,
2533  WSI_TOKEN_HTTP_ACCEPT_LANGUAGE = 22,
2534  WSI_TOKEN_HTTP_PRAGMA = 23,
2535  WSI_TOKEN_HTTP_CACHE_CONTROL = 24,
2536  WSI_TOKEN_HTTP_AUTHORIZATION = 25,
2537  WSI_TOKEN_HTTP_COOKIE = 26,
2538  WSI_TOKEN_HTTP_CONTENT_LENGTH = 27,
2539  WSI_TOKEN_HTTP_CONTENT_TYPE = 28,
2540  WSI_TOKEN_HTTP_DATE = 29,
2541  WSI_TOKEN_HTTP_RANGE = 30,
2542  WSI_TOKEN_HTTP_REFERER = 31,
2543  WSI_TOKEN_KEY = 32,
2544  WSI_TOKEN_VERSION = 33,
2545  WSI_TOKEN_SWORIGIN = 34,
2546 
2547  WSI_TOKEN_HTTP_COLON_AUTHORITY = 35,
2548  WSI_TOKEN_HTTP_COLON_METHOD = 36,
2549  WSI_TOKEN_HTTP_COLON_PATH = 37,
2550  WSI_TOKEN_HTTP_COLON_SCHEME = 38,
2551  WSI_TOKEN_HTTP_COLON_STATUS = 39,
2552 
2553  WSI_TOKEN_HTTP_ACCEPT_CHARSET = 40,
2554  WSI_TOKEN_HTTP_ACCEPT_RANGES = 41,
2555  WSI_TOKEN_HTTP_ACCESS_CONTROL_ALLOW_ORIGIN = 42,
2556  WSI_TOKEN_HTTP_AGE = 43,
2557  WSI_TOKEN_HTTP_ALLOW = 44,
2558  WSI_TOKEN_HTTP_CONTENT_DISPOSITION = 45,
2559  WSI_TOKEN_HTTP_CONTENT_ENCODING = 46,
2560  WSI_TOKEN_HTTP_CONTENT_LANGUAGE = 47,
2561  WSI_TOKEN_HTTP_CONTENT_LOCATION = 48,
2562  WSI_TOKEN_HTTP_CONTENT_RANGE = 49,
2563  WSI_TOKEN_HTTP_ETAG = 50,
2564  WSI_TOKEN_HTTP_EXPECT = 51,
2565  WSI_TOKEN_HTTP_EXPIRES = 52,
2566  WSI_TOKEN_HTTP_FROM = 53,
2567  WSI_TOKEN_HTTP_IF_MATCH = 54,
2568  WSI_TOKEN_HTTP_IF_RANGE = 55,
2569  WSI_TOKEN_HTTP_IF_UNMODIFIED_SINCE = 56,
2570  WSI_TOKEN_HTTP_LAST_MODIFIED = 57,
2571  WSI_TOKEN_HTTP_LINK = 58,
2572  WSI_TOKEN_HTTP_LOCATION = 59,
2573  WSI_TOKEN_HTTP_MAX_FORWARDS = 60,
2574  WSI_TOKEN_HTTP_PROXY_AUTHENTICATE = 61,
2575  WSI_TOKEN_HTTP_PROXY_AUTHORIZATION = 62,
2576  WSI_TOKEN_HTTP_REFRESH = 63,
2577  WSI_TOKEN_HTTP_RETRY_AFTER = 64,
2578  WSI_TOKEN_HTTP_SERVER = 65,
2579  WSI_TOKEN_HTTP_SET_COOKIE = 66,
2580  WSI_TOKEN_HTTP_STRICT_TRANSPORT_SECURITY = 67,
2581  WSI_TOKEN_HTTP_TRANSFER_ENCODING = 68,
2582  WSI_TOKEN_HTTP_USER_AGENT = 69,
2583  WSI_TOKEN_HTTP_VARY = 70,
2584  WSI_TOKEN_HTTP_VIA = 71,
2585  WSI_TOKEN_HTTP_WWW_AUTHENTICATE = 72,
2586 
2587  WSI_TOKEN_PATCH_URI = 73,
2588  WSI_TOKEN_PUT_URI = 74,
2589  WSI_TOKEN_DELETE_URI = 75,
2590 
2591  WSI_TOKEN_HTTP_URI_ARGS = 76,
2592  WSI_TOKEN_PROXY = 77,
2593  WSI_TOKEN_HTTP_X_REAL_IP = 78,
2594  WSI_TOKEN_HTTP1_0 = 79,
2595 
2596  /****** add new things just above ---^ ******/
2597 
2598  /* use token storage to stash these internally, not for
2599  * user use */
2600 
2601  _WSI_TOKEN_CLIENT_SENT_PROTOCOLS,
2602  _WSI_TOKEN_CLIENT_PEER_ADDRESS,
2603  _WSI_TOKEN_CLIENT_URI,
2604  _WSI_TOKEN_CLIENT_HOST,
2605  _WSI_TOKEN_CLIENT_ORIGIN,
2606  _WSI_TOKEN_CLIENT_METHOD,
2607 
2608  /* always last real token index*/
2609  WSI_TOKEN_COUNT,
2610 
2611  /* parser state additions, no storage associated */
2612  WSI_TOKEN_NAME_PART,
2613  WSI_TOKEN_SKIPPING,
2614  WSI_TOKEN_SKIPPING_SAW_CR,
2615  WSI_PARSING_COMPLETE,
2616  WSI_INIT_TOKEN_MUXURL,
2617 };
2618 
2620  unsigned short token_limit[WSI_TOKEN_COUNT];
2621 };
2622 
2628 LWS_VISIBLE LWS_EXTERN const unsigned char *
2629 lws_token_to_string(enum lws_token_indexes token);
2630 
2631 
2640 LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
2641 lws_hdr_total_length(struct lws *wsi, enum lws_token_indexes h);
2642 
2652 LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
2653 lws_hdr_fragment_length(struct lws *wsi, enum lws_token_indexes h, int frag_idx);
2654 
2668 LWS_VISIBLE LWS_EXTERN int
2669 lws_hdr_copy(struct lws *wsi, char *dest, int len, enum lws_token_indexes h);
2670 
2688 LWS_VISIBLE LWS_EXTERN int
2689 lws_hdr_copy_fragment(struct lws *wsi, char *dest, int len,
2690  enum lws_token_indexes h, int frag_idx);
2691 
2702 LWS_VISIBLE LWS_EXTERN const char *
2703 lws_get_urlarg_by_name(struct lws *wsi, const char *name, char *buf, int len);
2705 
2720 
2731 LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
2732 lws_add_http_header_status(struct lws *wsi,
2733  unsigned int code, unsigned char **p,
2734  unsigned char *end);
2747 LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
2748 lws_add_http_header_by_name(struct lws *wsi, const unsigned char *name,
2749  const unsigned char *value, int length,
2750  unsigned char **p, unsigned char *end);
2764 LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
2765 lws_add_http_header_by_token(struct lws *wsi, enum lws_token_indexes token,
2766  const unsigned char *value, int length,
2767  unsigned char **p, unsigned char *end);
2778 LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
2779 lws_add_http_header_content_length(struct lws *wsi,
2780  unsigned long content_length,
2781  unsigned char **p, unsigned char *end);
2791 LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
2792 lws_finalize_http_header(struct lws *wsi, unsigned char **p,
2793  unsigned char *end);
2795 
2814 
2824 };
2825 
2839 typedef int (*lws_spa_fileupload_cb)(void *data, const char *name,
2840  const char *filename, char *buf, int len,
2841  enum lws_spa_fileupload_states state);
2842 
2845 struct lws_spa;
2846 
2865 LWS_VISIBLE LWS_EXTERN struct lws_spa *
2866 lws_spa_create(struct lws *wsi, const char * const *param_names,
2867  int count_params, int max_storage, lws_spa_fileupload_cb opt_cb,
2868  void *opt_data);
2869 
2877 LWS_VISIBLE LWS_EXTERN int
2878 lws_spa_process(struct lws_spa *spa, const char *in, int len);
2879 
2885 LWS_VISIBLE LWS_EXTERN int
2886 lws_spa_finalize(struct lws_spa *spa);
2887 
2894 LWS_VISIBLE LWS_EXTERN int
2895 lws_spa_get_length(struct lws_spa *spa, int n);
2896 
2902 LWS_VISIBLE LWS_EXTERN const char *
2903 lws_spa_get_string(struct lws_spa *spa, int n);
2904 
2910 LWS_VISIBLE LWS_EXTERN int
2911 lws_spa_destroy(struct lws_spa *spa);
2913 
2924 
2935 LWS_VISIBLE LWS_EXTERN const char *
2936 lws_urlencode(char *escaped, const char *string, int len);
2937 
2938 /*
2939  * URLDECODE 1 / 2
2940  *
2941  * This simple urldecode only operates until the first '\0' and requires the
2942  * data to exist all at once
2943  */
2956 LWS_VISIBLE LWS_EXTERN int
2957 lws_urldecode(char *string, const char *escaped, int len);
2959 
2968 LWS_VISIBLE LWS_EXTERN int
2969 lws_return_http_status(struct lws *wsi, unsigned int code,
2970  const char *html_body);
2971 
2982 LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
2983 lws_http_redirect(struct lws *wsi, int code, const unsigned char *loc, int len,
2984  unsigned char **p, unsigned char *end);
2985 
2994 LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
2995 lws_http_transaction_completed(struct lws *wsi);
2997 
3005 
3016 LWS_VISIBLE LWS_EXTERN const char *
3017 lws_sql_purify(char *escaped, const char *string, int len);
3018 
3029 LWS_VISIBLE LWS_EXTERN const char *
3030 lws_json_purify(char *escaped, const char *string, int len);
3032 
3039 
3041 #ifdef LWS_USE_LIBEV
3042 typedef void (lws_ev_signal_cb_t)(EV_P_ struct ev_signal *w, int revents);
3043 
3044 LWS_VISIBLE LWS_EXTERN int
3045 lws_ev_sigint_cfg(struct lws_context *context, int use_ev_sigint,
3046  lws_ev_signal_cb_t *cb);
3047 
3048 LWS_VISIBLE LWS_EXTERN int
3049 lws_ev_initloop(struct lws_context *context, struct ev_loop *loop, int tsi);
3050 
3051 LWS_VISIBLE LWS_EXTERN void
3052 lws_ev_sigint_cb(struct ev_loop *loop, struct ev_signal *watcher, int revents);
3053 #endif /* LWS_USE_LIBEV */
3054 
3056 
3063 #ifdef LWS_USE_LIBUV
3065 LWS_VISIBLE LWS_EXTERN int
3066 lws_uv_sigint_cfg(struct lws_context *context, int use_uv_sigint,
3067  uv_signal_cb cb);
3068 
3069 LWS_VISIBLE LWS_EXTERN void
3070 lws_libuv_run(const struct lws_context *context, int tsi);
3071 
3072 LWS_VISIBLE LWS_EXTERN void
3073 lws_libuv_stop(struct lws_context *context);
3074 
3075 LWS_VISIBLE LWS_EXTERN int
3076 lws_uv_initloop(struct lws_context *context, uv_loop_t *loop, int tsi);
3077 
3078 LWS_VISIBLE LWS_EXTERN uv_loop_t *
3079 lws_uv_getloop(struct lws_context *context, int tsi);
3080 
3081 LWS_VISIBLE LWS_EXTERN void
3082 lws_uv_sigint_cb(uv_signal_t *watcher, int signum);
3083 #endif /* LWS_USE_LIBUV */
3084 
3091 
3092 /*
3093  * NOTE: These public enums are part of the abi. If you want to add one,
3094  * add it at where specified so existing users are unaffected.
3095  */
3096 enum pending_timeout {
3097  NO_PENDING_TIMEOUT = 0,
3098  PENDING_TIMEOUT_AWAITING_PROXY_RESPONSE = 1,
3099  PENDING_TIMEOUT_AWAITING_CONNECT_RESPONSE = 2,
3100  PENDING_TIMEOUT_ESTABLISH_WITH_SERVER = 3,
3101  PENDING_TIMEOUT_AWAITING_SERVER_RESPONSE = 4,
3102  PENDING_TIMEOUT_AWAITING_PING = 5,
3103  PENDING_TIMEOUT_CLOSE_ACK = 6,
3104  PENDING_TIMEOUT_AWAITING_EXTENSION_CONNECT_RESPONSE = 7,
3105  PENDING_TIMEOUT_SENT_CLIENT_HANDSHAKE = 8,
3106  PENDING_TIMEOUT_SSL_ACCEPT = 9,
3107  PENDING_TIMEOUT_HTTP_CONTENT = 10,
3108  PENDING_TIMEOUT_AWAITING_CLIENT_HS_SEND = 11,
3109  PENDING_FLUSH_STORED_SEND_BEFORE_CLOSE = 12,
3110  PENDING_TIMEOUT_SHUTDOWN_FLUSH = 13,
3111  PENDING_TIMEOUT_CGI = 14,
3112  PENDING_TIMEOUT_HTTP_KEEPALIVE_IDLE = 15,
3113  PENDING_TIMEOUT_WS_PONG_CHECK_SEND_PING = 16,
3114  PENDING_TIMEOUT_WS_PONG_CHECK_GET_PONG = 17,
3115  PENDING_TIMEOUT_CLIENT_ISSUE_PAYLOAD = 18,
3116 
3117  /****** add new things just above ---^ ******/
3118 };
3119 
3129 LWS_VISIBLE LWS_EXTERN void
3130 lws_set_timeout(struct lws *wsi, enum pending_timeout reason, int secs);
3132 
3138 #if !defined(LWS_SIZEOFPTR)
3139 #define LWS_SIZEOFPTR (sizeof (void *))
3140 #endif
3141 #if !defined(u_int64_t)
3142 #define u_int64_t unsigned long long
3143 #endif
3144 
3145 #if defined(__x86_64__)
3146 #define _LWS_PAD_SIZE 16 /* Intel recommended for best performance */
3147 #else
3148 #define _LWS_PAD_SIZE LWS_SIZEOFPTR /* Size of a pointer on the target arch */
3149 #endif
3150 #define _LWS_PAD(n) (((n) % _LWS_PAD_SIZE) ? \
3151  ((n) + (_LWS_PAD_SIZE - ((n) % _LWS_PAD_SIZE))) : (n))
3152 #define LWS_PRE _LWS_PAD(4 + 10)
3153 /* used prior to 1.7 and retained for backward compatibility */
3154 #define LWS_SEND_BUFFER_PRE_PADDING LWS_PRE
3155 #define LWS_SEND_BUFFER_POST_PADDING 0
3156 
3157 /*
3158  * NOTE: These public enums are part of the abi. If you want to add one,
3159  * add it at where specified so existing users are unaffected.
3160  */
3175  /* LWS_WRITE_CLOSE is handled by lws_close_reason() */
3176  LWS_WRITE_PING = 5,
3177  LWS_WRITE_PONG = 6,
3178 
3179  /* Same as write_http but we know this write ends the transaction */
3180  LWS_WRITE_HTTP_FINAL = 7,
3181 
3182  /* HTTP2 */
3183 
3191  /****** add new things just above ---^ ******/
3192 
3193  /* flags */
3194 
3202 };
3203 
3204 
3276 LWS_VISIBLE LWS_EXTERN int
3277 lws_write(struct lws *wsi, unsigned char *buf, size_t len,
3278  enum lws_write_protocol protocol);
3279 
3280 /* helper for case where buffer may be const */
3281 #define lws_write_http(wsi, buf, len) \
3282  lws_write(wsi, (unsigned char *)(buf), len, LWS_WRITE_HTTP)
3283 
3285 
3304 
3317 LWS_VISIBLE LWS_EXTERN int
3318 lws_callback_on_writable(struct lws *wsi);
3319 
3333 LWS_VISIBLE LWS_EXTERN int
3334 lws_callback_on_writable_all_protocol(const struct lws_context *context,
3335  const struct lws_protocols *protocol);
3336 
3350 LWS_VISIBLE LWS_EXTERN int
3351 lws_callback_on_writable_all_protocol_vhost(const struct lws_vhost *vhost,
3352  const struct lws_protocols *protocol);
3353 
3366 LWS_VISIBLE LWS_EXTERN int
3367 lws_callback_all_protocol(struct lws_context *context,
3368  const struct lws_protocols *protocol, int reason);
3369 
3382 LWS_VISIBLE LWS_EXTERN int
3383 lws_callback_all_protocol_vhost(struct lws_vhost *vh,
3384  const struct lws_protocols *protocol, int reason);
3385 
3399 LWS_VISIBLE LWS_EXTERN int
3400 lws_callback_vhost_protocols(struct lws *wsi, int reason, void *in, int len);
3401 
3402 LWS_VISIBLE LWS_EXTERN int
3403 lws_callback_http_dummy(struct lws *wsi, enum lws_callback_reasons reason,
3404  void *user, void *in, size_t len);
3405 
3413 LWS_VISIBLE LWS_EXTERN int
3414 lws_get_socket_fd(struct lws *wsi);
3415 
3437 LWS_VISIBLE LWS_EXTERN size_t
3438 lws_get_peer_write_allowance(struct lws *wsi);
3440 
3451 LWS_VISIBLE LWS_EXTERN int
3452 lws_rx_flow_control(struct lws *wsi, int enable);
3453 
3463 LWS_VISIBLE LWS_EXTERN void
3464 lws_rx_flow_allow_all_protocol(const struct lws_context *context,
3465  const struct lws_protocols *protocol);
3466 
3483 LWS_VISIBLE LWS_EXTERN size_t
3484 lws_remaining_packet_payload(struct lws *wsi);
3485 
3486 
3495 
3508 LWS_VISIBLE LWS_EXTERN struct lws *
3509 lws_adopt_socket(struct lws_context *context, lws_sockfd_type accept_fd);
3532 LWS_VISIBLE LWS_EXTERN struct lws *
3533 lws_adopt_socket_readbuf(struct lws_context *context, lws_sockfd_type accept_fd,
3534  const char *readbuf, size_t len);
3536 
3542 
3553 LWS_VISIBLE LWS_EXTERN const char * LWS_WARN_UNUSED_RESULT
3554 lws_canonical_hostname(struct lws_context *context);
3555 
3570 LWS_VISIBLE LWS_EXTERN void
3571 lws_get_peer_addresses(struct lws *wsi, lws_sockfd_type fd, char *name,
3572  int name_len, char *rip, int rip_len);
3573 
3584 LWS_VISIBLE LWS_EXTERN const char *
3585 lws_get_peer_simple(struct lws *wsi, char *name, int namelen);
3586 #ifndef LWS_WITH_ESP8266
3587 
3598 LWS_VISIBLE LWS_EXTERN int
3599 lws_interface_to_sa(int ipv6, const char *ifname, struct sockaddr_in *addr,
3600  size_t addrlen);
3602 #endif
3603 
3609 
3622 LWS_VISIBLE LWS_EXTERN int
3623 lws_snprintf(char *str, size_t size, const char *format, ...);
3624 
3636 LWS_VISIBLE LWS_EXTERN int
3637 lws_get_random(struct lws_context *context, void *buf, int len);
3645 LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
3646 lws_daemonize(const char *_lock_path);
3652 LWS_VISIBLE LWS_EXTERN const char * LWS_WARN_UNUSED_RESULT
3654 
3661 LWS_VISIBLE LWS_EXTERN void *
3662 lws_wsi_user(struct lws *wsi);
3663 
3675 LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
3676 lws_parse_uri(char *p, const char **prot, const char **ads, int *port,
3677  const char **path);
3678 
3682 LWS_VISIBLE LWS_EXTERN unsigned long
3683 lws_now_secs(void);
3684 
3694 LWS_VISIBLE LWS_EXTERN struct lws_context * LWS_WARN_UNUSED_RESULT
3695 lws_get_context(const struct lws *wsi);
3696 
3706 LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
3707 lws_get_count_threads(struct lws_context *context);
3708 
3716 LWS_VISIBLE LWS_EXTERN struct lws * LWS_WARN_UNUSED_RESULT
3717 lws_get_parent(const struct lws *wsi);
3718 
3725 LWS_VISIBLE LWS_EXTERN struct lws * LWS_WARN_UNUSED_RESULT
3726 lws_get_child(const struct lws *wsi);
3727 
3728 
3729 /*
3730  * \deprecated DEPRECATED Note: this is not normally needed as a user api.
3731  * It's provided in case it is
3732  * useful when integrating with other app poll loop service code.
3733  */
3734 LWS_VISIBLE LWS_EXTERN int
3735 lws_read(struct lws *wsi, unsigned char *buf, size_t len);
3736 
3744 LWS_VISIBLE LWS_EXTERN void
3745 lws_set_allocator(void *(*realloc)(void *ptr, size_t size));
3747 
3753 
3760 LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
3761 lws_send_pipe_choked(struct lws *wsi);
3762 
3767 LWS_VISIBLE LWS_EXTERN int
3768 lws_is_final_fragment(struct lws *wsi);
3769 
3774 LWS_VISIBLE LWS_EXTERN unsigned char
3775 lws_get_reserved_bits(struct lws *wsi);
3776 
3793 LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
3794 lws_partial_buffered(struct lws *wsi);
3795 
3805 LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
3806 lws_frame_is_binary(struct lws *wsi);
3807 
3816 LWS_VISIBLE LWS_EXTERN int
3817 lws_is_ssl(struct lws *wsi);
3822 LWS_VISIBLE LWS_EXTERN int
3823 lws_is_cgi(struct lws *wsi);
3825 
3826 
3832 #ifdef LWS_SHA1_USE_OPENSSL_NAME
3834 #define lws_SHA1 SHA1
3835 #else
3836 
3845 LWS_VISIBLE LWS_EXTERN unsigned char *
3846 lws_SHA1(const unsigned char *d, size_t n, unsigned char *md);
3847 #endif
3848 
3858 LWS_VISIBLE LWS_EXTERN int
3859 lws_b64_encode_string(const char *in, int in_len, char *out, int out_size);
3869 LWS_VISIBLE LWS_EXTERN int
3870 lws_b64_decode_string(const char *in, char *out, int out_size);
3872 
3873 
3883 #ifdef LWS_WITH_CGI
3884 enum lws_enum_stdinouterr {
3885  LWS_STDIN = 0,
3886  LWS_STDOUT = 1,
3887  LWS_STDERR = 2,
3888 };
3889 
3890 enum lws_cgi_hdr_state {
3891  LCHS_HEADER,
3892  LCHS_CR1,
3893  LCHS_LF1,
3894  LCHS_CR2,
3895  LCHS_LF2,
3896  LHCS_PAYLOAD,
3897  LCHS_SINGLE_0A,
3898 };
3899 
3901  struct lws **stdwsi;
3902  enum lws_enum_stdinouterr ch;
3903  unsigned char *data;
3904  enum lws_cgi_hdr_state hdr_state;
3905  int len;
3906 };
3907 
3908 
3918 LWS_VISIBLE LWS_EXTERN int
3919 lws_cgi(struct lws *wsi, const char * const *exec_array,
3920  int script_uri_path_len, int timeout_secs,
3921  const struct lws_protocol_vhost_options *mp_cgienv);
3922 
3928 LWS_VISIBLE LWS_EXTERN int
3929 lws_cgi_write_split_stdout_headers(struct lws *wsi);
3930 
3936 LWS_VISIBLE LWS_EXTERN int
3937 lws_cgi_kill(struct lws *wsi);
3938 #endif
3939 
3941 
3958 
3965  lws_filefd_type (*open)(struct lws *wsi, const char *filename,
3966  unsigned long *filelen, int flags);
3970  int (*close)(struct lws *wsi, lws_filefd_type fd);
3972  unsigned long (*seek_cur)(struct lws *wsi, lws_filefd_type fd,
3973  long offset_from_cur_pos);
3975  int (*read)(struct lws *wsi, lws_filefd_type fd, unsigned long *amount,
3976  unsigned char *buf, unsigned long len);
3978  int (*write)(struct lws *wsi, lws_filefd_type fd, unsigned long *amount,
3979  unsigned char *buf, unsigned long len);
3982  /* Add new things just above here ---^
3983  * This is part of the ABI, don't needlessly break compatibility */
3984 };
3985 
3991 LWS_VISIBLE LWS_EXTERN struct lws_plat_file_ops * LWS_WARN_UNUSED_RESULT
3992 lws_get_fops(struct lws_context *context);
3993 
4002 static LWS_INLINE lws_filefd_type LWS_WARN_UNUSED_RESULT
4003 lws_plat_file_open(struct lws *wsi, const char *filename,
4004  unsigned long *filelen, int flags)
4005 {
4006  return lws_get_fops(lws_get_context(wsi))->open(wsi, filename,
4007  filelen, flags);
4008 }
4009 
4016 static LWS_INLINE int
4017 lws_plat_file_close(struct lws *wsi, lws_filefd_type fd)
4018 {
4019  return lws_get_fops(lws_get_context(wsi))->close(wsi, fd);
4020 }
4021 
4029 static LWS_INLINE unsigned long
4030 lws_plat_file_seek_cur(struct lws *wsi, lws_filefd_type fd, long offset)
4031 {
4032  return lws_get_fops(lws_get_context(wsi))->seek_cur(wsi, fd, offset);
4033 }
4043 static LWS_INLINE int LWS_WARN_UNUSED_RESULT
4044 lws_plat_file_read(struct lws *wsi, lws_filefd_type fd, unsigned long *amount,
4045  unsigned char *buf, unsigned long len)
4046 {
4047  return lws_get_fops(lws_get_context(wsi))->read(wsi, fd, amount, buf,
4048  len);
4049 }
4059 static LWS_INLINE int LWS_WARN_UNUSED_RESULT
4060 lws_plat_file_write(struct lws *wsi, lws_filefd_type fd, unsigned long *amount,
4061  unsigned char *buf, unsigned long len)
4062 {
4063  return lws_get_fops(lws_get_context(wsi))->write(wsi, fd, amount, buf,
4064  len);
4065 }
4067 
4099 #ifdef LWS_WITH_SMTP
4100 
4112 };
4113 
4115 struct lws_email {
4116  void *data;
4118  uv_loop_t *loop;
4121  char email_smtp_ip[32];
4122  char email_helo[32];
4123  char email_from[100];
4124  char email_to[100];
4126  unsigned int max_content_size;
4129  /* Fill all the callbacks before init */
4130 
4131  int (*on_next)(struct lws_email *email);
4136  int (*on_sent)(struct lws_email *email);
4141  int (*on_get_body)(struct lws_email *email, char *buf, int len);
4147  /* private things */
4148  uv_timer_t timeout_email;
4150  uv_connect_t email_connect_req;
4151  uv_tcp_t email_client;
4153  char email_buf[256];
4154  char *content;
4155 };
4156 
4166 LWS_VISIBLE LWS_EXTERN int
4167 lws_email_init(struct lws_email *email, uv_loop_t *loop, int max_content);
4168 
4177 LWS_VISIBLE LWS_EXTERN void
4178 lws_email_check(struct lws_email *email);
4186 LWS_VISIBLE LWS_EXTERN void
4187 lws_email_destroy(struct lws_email *email);
4188 
4189 #endif
4190 
4191 
4192 #ifdef __cplusplus
4193 }
4194 #endif
4195 
4196 #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() { 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 
3280 LWS_VISIBLE LWS_EXTERN int
3281 lws_write(struct lws *wsi, unsigned char *buf, size_t len,
3282  enum lws_write_protocol protocol);
3283 
3284 /* helper for case where buffer may be const */
3285 #define lws_write_http(wsi, buf, len) \
3286  lws_write(wsi, (unsigned char *)(buf), len, LWS_WRITE_HTTP)
3287 
3289 
3308 
3321 LWS_VISIBLE LWS_EXTERN int
3322 lws_callback_on_writable(struct lws *wsi);
3323 
3337 LWS_VISIBLE LWS_EXTERN int
3338 lws_callback_on_writable_all_protocol(const struct lws_context *context,
3339  const struct lws_protocols *protocol);
3340 
3354 LWS_VISIBLE LWS_EXTERN int
3355 lws_callback_on_writable_all_protocol_vhost(const struct lws_vhost *vhost,
3356  const struct lws_protocols *protocol);
3357 
3370 LWS_VISIBLE LWS_EXTERN int
3371 lws_callback_all_protocol(struct lws_context *context,
3372  const struct lws_protocols *protocol, int reason);
3373 
3386 LWS_VISIBLE LWS_EXTERN int
3387 lws_callback_all_protocol_vhost(struct lws_vhost *vh,
3388  const struct lws_protocols *protocol, int reason);
3389 
3403 LWS_VISIBLE LWS_EXTERN int
3404 lws_callback_vhost_protocols(struct lws *wsi, int reason, void *in, int len);
3405 
3406 LWS_VISIBLE LWS_EXTERN int
3407 lws_callback_http_dummy(struct lws *wsi, enum lws_callback_reasons reason,
3408  void *user, void *in, size_t len);
3409 
3417 LWS_VISIBLE LWS_EXTERN int
3418 lws_get_socket_fd(struct lws *wsi);
3419 
3441 LWS_VISIBLE LWS_EXTERN size_t
3442 lws_get_peer_write_allowance(struct lws *wsi);
3444 
3455 LWS_VISIBLE LWS_EXTERN int
3456 lws_rx_flow_control(struct lws *wsi, int enable);
3457 
3467 LWS_VISIBLE LWS_EXTERN void
3468 lws_rx_flow_allow_all_protocol(const struct lws_context *context,
3469  const struct lws_protocols *protocol);
3470 
3487 LWS_VISIBLE LWS_EXTERN size_t
3488 lws_remaining_packet_payload(struct lws *wsi);
3489 
3490 
3499 
3512 LWS_VISIBLE LWS_EXTERN struct lws *
3513 lws_adopt_socket(struct lws_context *context, lws_sockfd_type accept_fd);
3536 LWS_VISIBLE LWS_EXTERN struct lws *
3537 lws_adopt_socket_readbuf(struct lws_context *context, lws_sockfd_type accept_fd,
3538  const char *readbuf, size_t len);
3540 
3546 
3557 LWS_VISIBLE LWS_EXTERN const char * LWS_WARN_UNUSED_RESULT
3558 lws_canonical_hostname(struct lws_context *context);
3559 
3574 LWS_VISIBLE LWS_EXTERN void
3575 lws_get_peer_addresses(struct lws *wsi, lws_sockfd_type fd, char *name,
3576  int name_len, char *rip, int rip_len);
3577 
3588 LWS_VISIBLE LWS_EXTERN const char *
3589 lws_get_peer_simple(struct lws *wsi, char *name, int namelen);
3590 #ifndef LWS_WITH_ESP8266
3591 
3602 LWS_VISIBLE LWS_EXTERN int
3603 lws_interface_to_sa(int ipv6, const char *ifname, struct sockaddr_in *addr,
3604  size_t addrlen);
3606 #endif
3607 
3613 
3626 LWS_VISIBLE LWS_EXTERN int
3627 lws_snprintf(char *str, size_t size, const char *format, ...);
3628 
3640 LWS_VISIBLE LWS_EXTERN int
3641 lws_get_random(struct lws_context *context, void *buf, int len);
3649 LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
3650 lws_daemonize(const char *_lock_path);
3656 LWS_VISIBLE LWS_EXTERN const char * LWS_WARN_UNUSED_RESULT
3658 
3665 LWS_VISIBLE LWS_EXTERN void *
3666 lws_wsi_user(struct lws *wsi);
3667 
3679 LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
3680 lws_parse_uri(char *p, const char **prot, const char **ads, int *port,
3681  const char **path);
3682 
3686 LWS_VISIBLE LWS_EXTERN unsigned long
3687 lws_now_secs(void);
3688 
3698 LWS_VISIBLE LWS_EXTERN struct lws_context * LWS_WARN_UNUSED_RESULT
3699 lws_get_context(const struct lws *wsi);
3700 
3710 LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
3711 lws_get_count_threads(struct lws_context *context);
3712 
3720 LWS_VISIBLE LWS_EXTERN struct lws * LWS_WARN_UNUSED_RESULT
3721 lws_get_parent(const struct lws *wsi);
3722 
3729 LWS_VISIBLE LWS_EXTERN struct lws * LWS_WARN_UNUSED_RESULT
3730 lws_get_child(const struct lws *wsi);
3731 
3732 
3733 /*
3734  * \deprecated DEPRECATED Note: this is not normally needed as a user api.
3735  * It's provided in case it is
3736  * useful when integrating with other app poll loop service code.
3737  */
3738 LWS_VISIBLE LWS_EXTERN int
3739 lws_read(struct lws *wsi, unsigned char *buf, size_t len);
3740 
3748 LWS_VISIBLE LWS_EXTERN void
3749 lws_set_allocator(void *(*realloc)(void *ptr, size_t size));
3751 
3757 
3764 LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
3765 lws_send_pipe_choked(struct lws *wsi);
3766 
3771 LWS_VISIBLE LWS_EXTERN int
3772 lws_is_final_fragment(struct lws *wsi);
3773 
3778 LWS_VISIBLE LWS_EXTERN unsigned char
3779 lws_get_reserved_bits(struct lws *wsi);
3780 
3797 LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
3798 lws_partial_buffered(struct lws *wsi);
3799 
3809 LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
3810 lws_frame_is_binary(struct lws *wsi);
3811 
3820 LWS_VISIBLE LWS_EXTERN int
3821 lws_is_ssl(struct lws *wsi);
3826 LWS_VISIBLE LWS_EXTERN int
3827 lws_is_cgi(struct lws *wsi);
3829 
3830 
3836 #ifdef LWS_SHA1_USE_OPENSSL_NAME
3838 #define lws_SHA1 SHA1
3839 #else
3840 
3849 LWS_VISIBLE LWS_EXTERN unsigned char *
3850 lws_SHA1(const unsigned char *d, size_t n, unsigned char *md);
3851 #endif
3852 
3862 LWS_VISIBLE LWS_EXTERN int
3863 lws_b64_encode_string(const char *in, int in_len, char *out, int out_size);
3873 LWS_VISIBLE LWS_EXTERN int
3874 lws_b64_decode_string(const char *in, char *out, int out_size);
3876 
3877 
3887 #ifdef LWS_WITH_CGI
3888 enum lws_enum_stdinouterr {
3889  LWS_STDIN = 0,
3890  LWS_STDOUT = 1,
3891  LWS_STDERR = 2,
3892 };
3893 
3894 enum lws_cgi_hdr_state {
3895  LCHS_HEADER,
3896  LCHS_CR1,
3897  LCHS_LF1,
3898  LCHS_CR2,
3899  LCHS_LF2,
3900  LHCS_PAYLOAD,
3901  LCHS_SINGLE_0A,
3902 };
3903 
3905  struct lws **stdwsi;
3906  enum lws_enum_stdinouterr ch;
3907  unsigned char *data;
3908  enum lws_cgi_hdr_state hdr_state;
3909  int len;
3910 };
3911 
3912 
3922 LWS_VISIBLE LWS_EXTERN int
3923 lws_cgi(struct lws *wsi, const char * const *exec_array,
3924  int script_uri_path_len, int timeout_secs,
3925  const struct lws_protocol_vhost_options *mp_cgienv);
3926 
3932 LWS_VISIBLE LWS_EXTERN int
3933 lws_cgi_write_split_stdout_headers(struct lws *wsi);
3934 
3940 LWS_VISIBLE LWS_EXTERN int
3941 lws_cgi_kill(struct lws *wsi);
3942 #endif
3943 
3945 
3962 
3969  lws_filefd_type (*open)(struct lws *wsi, const char *filename,
3970  unsigned long *filelen, int flags);
3974  int (*close)(struct lws *wsi, lws_filefd_type fd);
3976  unsigned long (*seek_cur)(struct lws *wsi, lws_filefd_type fd,
3977  long offset_from_cur_pos);
3979  int (*read)(struct lws *wsi, lws_filefd_type fd, unsigned long *amount,
3980  unsigned char *buf, unsigned long len);
3982  int (*write)(struct lws *wsi, lws_filefd_type fd, unsigned long *amount,
3983  unsigned char *buf, unsigned long len);
3986  /* Add new things just above here ---^
3987  * This is part of the ABI, don't needlessly break compatibility */
3988 };
3989 
3995 LWS_VISIBLE LWS_EXTERN struct lws_plat_file_ops * LWS_WARN_UNUSED_RESULT
3996 lws_get_fops(struct lws_context *context);
3997 
4006 static LWS_INLINE lws_filefd_type LWS_WARN_UNUSED_RESULT
4007 lws_plat_file_open(struct lws *wsi, const char *filename,
4008  unsigned long *filelen, int flags)
4009 {
4010  return lws_get_fops(lws_get_context(wsi))->open(wsi, filename,
4011  filelen, flags);
4012 }
4013 
4020 static LWS_INLINE int
4021 lws_plat_file_close(struct lws *wsi, lws_filefd_type fd)
4022 {
4023  return lws_get_fops(lws_get_context(wsi))->close(wsi, fd);
4024 }
4025 
4033 static LWS_INLINE unsigned long
4034 lws_plat_file_seek_cur(struct lws *wsi, lws_filefd_type fd, long offset)
4035 {
4036  return lws_get_fops(lws_get_context(wsi))->seek_cur(wsi, fd, offset);
4037 }
4047 static LWS_INLINE int LWS_WARN_UNUSED_RESULT
4048 lws_plat_file_read(struct lws *wsi, lws_filefd_type fd, unsigned long *amount,
4049  unsigned char *buf, unsigned long len)
4050 {
4051  return lws_get_fops(lws_get_context(wsi))->read(wsi, fd, amount, buf,
4052  len);
4053 }
4063 static LWS_INLINE int LWS_WARN_UNUSED_RESULT
4064 lws_plat_file_write(struct lws *wsi, lws_filefd_type fd, unsigned long *amount,
4065  unsigned char *buf, unsigned long len)
4066 {
4067  return lws_get_fops(lws_get_context(wsi))->write(wsi, fd, amount, buf,
4068  len);
4069 }
4071 
4103 #ifdef LWS_WITH_SMTP
4104 
4116 };
4117 
4119 struct lws_email {
4120  void *data;
4122  uv_loop_t *loop;
4125  char email_smtp_ip[32];
4126  char email_helo[32];
4127  char email_from[100];
4128  char email_to[100];
4130  unsigned int max_content_size;
4133  /* Fill all the callbacks before init */
4134 
4135  int (*on_next)(struct lws_email *email);
4140  int (*on_sent)(struct lws_email *email);
4145  int (*on_get_body)(struct lws_email *email, char *buf, int len);
4151  /* private things */
4152  uv_timer_t timeout_email;
4154  uv_connect_t email_connect_req;
4155  uv_tcp_t email_client;
4157  char email_buf[256];
4158  char *content;
4159 };
4160 
4170 LWS_VISIBLE LWS_EXTERN int
4171 lws_email_init(struct lws_email *email, uv_loop_t *loop, int max_content);
4172 
4181 LWS_VISIBLE LWS_EXTERN void
4182 lws_email_check(struct lws_email *email);
4190 LWS_VISIBLE LWS_EXTERN void
4191 lws_email_destroy(struct lws_email *email);
4192 
4193 #endif
4194 
4195 
4196 #ifdef __cplusplus
4197 }
4198 #endif
4199 
4200 #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:3900
+
Definition: libwebsockets.h:3904
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
@@ -82,15 +82,15 @@ $(document).ready(function(){initNavTree('libwebsockets_8h_source.html','');});
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:3172
-
Definition: libwebsockets.h:4105
+
Definition: libwebsockets.h:3176
+
Definition: libwebsockets.h:4109
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:3195
-
void * data
Definition: libwebsockets.h:4116
+
Definition: libwebsockets.h:3199
+
void * data
Definition: libwebsockets.h:4120
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:3978
+
int(* write)(struct lws *wsi, lws_filefd_type fd, unsigned long *amount, unsigned char *buf, unsigned long len)
Definition: libwebsockets.h:3982
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,7 +110,7 @@ $(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:4136
+
int(* on_sent)(struct lws_email *email)
Definition: libwebsockets.h:4140
Definition: libwebsockets.h:1434
struct lws ** pwsi
Definition: libwebsockets.h:2021
Definition: libwebsockets.h:781
@@ -119,22 +119,22 @@ $(document).ready(function(){initNavTree('libwebsockets_8h_source.html','');});
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:4152
+
time_t email_connect_started
Definition: libwebsockets.h:4156
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:2501
+
int token_len
Definition: libwebsockets.h:2505
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:2820
-
Definition: libwebsockets.h:4110
+
Definition: libwebsockets.h:2824
+
Definition: libwebsockets.h:4114
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:3901
+
struct lws ** stdwsi
Definition: libwebsockets.h:3905
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)
@@ -145,10 +145,10 @@ $(document).ready(function(){initNavTree('libwebsockets_8h_source.html','');});
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:2440
+
char * start
Definition: libwebsockets.h:2444
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:3162
+
Definition: libwebsockets.h:3166
LWS_VISIBLE LWS_EXTERN int lws_get_socket_fd(struct lws *wsi)
Definition: libwebsockets.h:959
@@ -156,23 +156,23 @@ $(document).ready(function(){initNavTree('libwebsockets_8h_source.html','');});
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:2432
+
int len
Definition: libwebsockets.h:2436
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:3166
+
Definition: libwebsockets.h:3170
int port
Definition: libwebsockets.h:1989
struct lws_context * context
Definition: libwebsockets.h:1985
Definition: libwebsockets.h:1442
int ietf_version_or_minus_one
Definition: libwebsockets.h:2001
LWS_VISIBLE LWS_EXTERN int lws_callback_all_protocol_vhost(struct lws_vhost *vh, const struct lws_protocols *protocol, int reason)
-
Definition: libwebsockets.h:4103
+
Definition: libwebsockets.h:4107
Definition: libwebsockets.h:1900
LWS_VISIBLE LWS_EXTERN int lws_callback_on_writable(struct lws *wsi)
-
const char *const * vars
Definition: libwebsockets.h:2444
+
const char *const * vars
Definition: libwebsockets.h:2448
Definition: libwebsockets.h:561
Definition: libwebsockets.h:1984
Definition: libwebsockets.h:1540
@@ -201,17 +201,17 @@ $(document).ready(function(){initNavTree('libwebsockets_8h_source.html','');});
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:3903
+
unsigned char * data
Definition: libwebsockets.h:3907
const struct lws_protocol_vhost_options * extra_mimetypes
Definition: libwebsockets.h:1941
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:4118
+
uv_loop_t * loop
Definition: libwebsockets.h:4122
Definition: libwebsockets.h:891
Definition: libwebsockets.h:72
-
Definition: libwebsockets.h:3198
-
int pos
Definition: libwebsockets.h:2442
+
Definition: libwebsockets.h:3202
+
int pos
Definition: libwebsockets.h:2446
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
@@ -236,7 +236,7 @@ $(document).ready(function(){initNavTree('libwebsockets_8h_source.html','');});
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:4126
+
unsigned int max_content_size
Definition: libwebsockets.h:4130
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)
@@ -244,7 +244,7 @@ $(document).ready(function(){initNavTree('libwebsockets_8h_source.html','');});
const char * uri_replace_to
Definition: libwebsockets.h:2017
struct lws * parent_wsi
Definition: libwebsockets.h:2010
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:4149
+
enum lwsgs_smtp_states estate
Definition: libwebsockets.h:4153
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,26 +252,26 @@ $(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:4153
+
char email_buf[256]
Definition: libwebsockets.h:4157
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:3970
+
int(* close)(struct lws *wsi, lws_filefd_type fd)
Definition: libwebsockets.h:3974
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:4104
+
Definition: libwebsockets.h:4108
LWS_VISIBLE LWS_EXTERN int lws_is_cgi(struct lws *wsi)
int ssl_connection
Definition: libwebsockets.h:1991
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:2430
+
Definition: libwebsockets.h:2434
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:3169
+
Definition: libwebsockets.h:3173
Definition: libwebsockets.h:1517
lws_sockfd_type fd
Definition: libwebsockets.h:417
Definition: libwebsockets.h:1914
@@ -313,15 +313,15 @@ $(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:4148
+
uv_timer_t timeout_email
Definition: libwebsockets.h:4152
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:2431
+
char * p
Definition: libwebsockets.h:2435
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:4102
+
lwsgs_smtp_states
Definition: libwebsockets.h:4106
Definition: libwebsockets.h:1520
Definition: libwebsockets.h:844
LWS_VISIBLE LWS_EXTERN int lws_snprintf(char *str, size_t size, const char *format,...)
@@ -333,7 +333,7 @@ $(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:4150
+
uv_connect_t email_connect_req
Definition: libwebsockets.h:4154
const char * server_string
Definition: libwebsockets.h:1677
Definition: libwebsockets.h:1531
SHORT events
Definition: libwebsockets.h:418
@@ -351,12 +351,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:2822
+
Definition: libwebsockets.h:2826
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:4108
+
Definition: libwebsockets.h:4112
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
@@ -370,36 +370,36 @@ $(document).ready(function(){initNavTree('libwebsockets_8h_source.html','');});
Definition: libwebsockets.h:1447
Definition: libwebsockets.h:1108
const struct lws_protocol_vhost_options * headers
Definition: libwebsockets.h:1707
-
Definition: libwebsockets.h:2619
+
Definition: libwebsockets.h:2623
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
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:3905
+
int len
Definition: libwebsockets.h:3909
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:3964
+
Definition: libwebsockets.h:3968
LWS_VISIBLE LWS_EXTERN void lwsl_hexdump(void *buf, size_t len)
Definition: libwebsockets.h:1009
-
lws_spa_fileupload_states
Definition: libwebsockets.h:2817
+
lws_spa_fileupload_states
Definition: libwebsockets.h:2821
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:4151
+
uv_tcp_t email_client
Definition: libwebsockets.h:4155
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:3965
-
lws_write_protocol
Definition: libwebsockets.h:3161
+
lws_filefd_type(* open)(struct lws *wsi, const char *filename, unsigned long *filelen, int flags)
Definition: libwebsockets.h:3969
+
lws_write_protocol
Definition: libwebsockets.h:3165
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:3975
+
int(* read)(struct lws *wsi, lws_filefd_type fd, unsigned long *amount, unsigned char *buf, unsigned long len)
Definition: libwebsockets.h:3979
LWS_VISIBLE LWS_EXTERN void lws_cancel_service(struct lws_context *context)
-
Definition: libwebsockets.h:2818
+
Definition: libwebsockets.h:2822
Definition: libwebsockets.h:569
const char * origin
Definition: libwebsockets.h:1930
const char * name
Definition: libwebsockets.h:1109
@@ -410,7 +410,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:4107
+
Definition: libwebsockets.h:4111
short revents
Definition: libwebsockets.h:434
lws_extension_callback_function * callback
Definition: libwebsockets.h:1193
long ssl_options_set
Definition: libwebsockets.h:1691
@@ -430,37 +430,37 @@ $(document).ready(function(){initNavTree('libwebsockets_8h_source.html','');});
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:2445
+
int count_vars
Definition: libwebsockets.h:2449
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:2499
+
Definition: libwebsockets.h:2503
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:2443
-
char * content
Definition: libwebsockets.h:4154
+
void * data
Definition: libwebsockets.h:2447
+
char * content
Definition: libwebsockets.h:4158
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:2447
-
Definition: libwebsockets.h:4115
+
lws_process_html_state_cb replace
Definition: libwebsockets.h:2451
+
Definition: libwebsockets.h:4119
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:3972
+
unsigned long(* seek_cur)(struct lws *wsi, lws_filefd_type fd, long offset_from_cur_pos)
Definition: libwebsockets.h:3976
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:4141
+
int(* on_get_body)(struct lws_email *email, char *buf, int len)
Definition: libwebsockets.h:4145
Definition: libwebsockets.h:1918
void * user
Definition: libwebsockets.h:1613
-
Definition: libwebsockets.h:4111
-
Definition: libwebsockets.h:3184
-
char * token
Definition: libwebsockets.h:2500
+
Definition: libwebsockets.h:4115
+
Definition: libwebsockets.h:3188
+
char * token
Definition: libwebsockets.h:2504
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:2433
+
int max_len
Definition: libwebsockets.h:2437
Definition: libwebsockets.h:726
const struct lws_protocol_vhost_options * next
Definition: libwebsockets.h:1901
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:2439
+
Definition: libwebsockets.h:2443
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
@@ -471,12 +471,12 @@ $(document).ready(function(){initNavTree('libwebsockets_8h_source.html','');});
LWS_VISIBLE LWS_EXTERN void lws_cancel_service_pt(struct lws *wsi)
Definition: libwebsockets.h:1533
Definition: libwebsockets.h:605
-
Definition: libwebsockets.h:4106
+
Definition: libwebsockets.h:4110
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:4109
-
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:2839
+
Definition: libwebsockets.h:4113
+
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
diff --git a/lib/libwebsockets.h b/lib/libwebsockets.h index 7efeba1f..b70a4226 100644 --- a/lib/libwebsockets.h +++ b/lib/libwebsockets.h @@ -2255,7 +2255,7 @@ lws_cancel_service(struct lws_context *context); * lws_service_fd() - Service polled socket with something waiting * \param context: Websocket context * \param pollfd: The pollfd entry describing the socket fd and which events - * happened. + * happened, or NULL to tell lws to do only timeout servicing. * * This function takes a pollfd that has POLLIN or POLLOUT activity and * services it according to the state of the associated @@ -2272,6 +2272,10 @@ lws_cancel_service(struct lws_context *context); * If the socket is foreign to lws, it leaves revents alone. So you can * see if you should service yourself by checking the pollfd revents * after letting lws try to service it. + * + * You should also call this with pollfd = NULL to just allow the + * once-per-second global timeout checks; if less than a second since the last + * check it returns immediately then. */ LWS_VISIBLE LWS_EXTERN int lws_service_fd(struct lws_context *context, struct lws_pollfd *pollfd); diff --git a/lib/service.c b/lib/service.c index 83bfb965..948d5434 100644 --- a/lib/service.c +++ b/lib/service.c @@ -680,12 +680,6 @@ lws_service_fd_tsi(struct lws_context *context, struct lws_pollfd *pollfd, int t if (!context->protocol_init_done) lws_protocol_init(context); - /* - * you can call us with pollfd = NULL to just allow the once-per-second - * global timeout checks; if less than a second since the last check - * it returns immediately then. - */ - time(&now); /*