v2.1.0
[platform/upstream/libwebsockets.git] / changelog
1 Changelog
2 ---------
3
4 v2.1.0
5 ======
6
7 Major new features
8
9  - Support POST arguments, including multipart and file attachment
10
11  - Move most of lwsws into lws, make the stub CC0
12
13  - Add loopback test plugin to confirm client ws / http coexistence
14
15  - Integrate lwsws testing on Appveyor (ie, windows)
16
17  - Introduce helpers for sql, urlencode and urldecode sanitation
18
19  - Introduce LWS_CALLBACK_HTTP_BIND_PROTOCOL / DROP_PROTOCOL that
20  are compatible with http:/1.1 pipelining and different plugins
21  owning different parts of the URL space
22
23  - lwsgs - Generic Sessions plugin supports serverside sessions,
24  cookies, hashed logins, forgot password etc
25
26  - Added APIs for sending email to SMTP servers
27
28  - Messageboard example plugin for lwsgs
29
30  - Automatic PING sending at fixed intervals and close if no response
31
32  - Change default header limit in ah to 4096 (from 1024)
33
34  - Add SNI matching for wildcards if no specific wildcard vhost name match
35
36  - Convert docs to Doxygen
37
38  - ESP8266 support ^^
39
40 Fixes
41 -----
42
43 See git log v2.0.0..
44
45
46
47 v2.0.0
48 ======
49
50 Summary
51 -------
52
53  - There are only api additions, the api is compatible with v1.7.x.  But
54    there is necessarily an soname bump to 8.
55  
56  - If you are using lws client, you mainly need to be aware the option
57    LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT is needed at context-creation time
58    if you will use SSL.
59    
60  - If you are using lws for serving, the above is also true but there are
61    many new features to simplify your code (and life).  There is a
62    summany online here
63    
64      https://libwebsockets.org/lws-2.0-new-features.html
65      
66    but basically the keywords are vhosts, mounts and plugins.  You can now
67    do the web serving part from lws without any user callback code at all.
68    See ./test-server/test-server-v2.0.c for an example, it has no user
69    code for ws either since it uses the protocol plugins... that one C file
70    is all that is needed to do the whole test server function.
71    
72    You now have the option to use a small generic ws-capable webserver
73    "lwsws" and write your ws part as a plugin.  That eliminates even
74    cut-and-pasting the test server code and offers more configurable
75    features like control over http cacheability in JSON.
76
77
78 Fixes
79 -----
80
81 These are already in 1.7.x series
82
83 1) MAJOR (Windows-only) fix assert firing
84
85 2) MAJOR http:/1.1 connections handled by  lws_return_http_status() did not
86 get sent a content-length resulting in the link hanging until the peer closed
87 it.  attack.sh updated to add a test for this.
88
89 3) MINOR An error about hdr struct in _lws_ws_related is corrected, it's not
90 known to affect anything until after it was fixed
91
92 4) MINOR During the close shutdown wait state introduced at v1.7, if something
93 requests callback on writeable for the socket it will busywait until the
94 socket closes
95
96 5) MAJOR Although the test server has done it for a few versions already, it
97 is now required for the user code to explicitly call
98
99         if (lws_http_transaction_completed(wsi))
100                 return -1;
101
102 when it finishes replying to a transaction in http.  Previously the library
103 did it for you, but that disallowed large, long transfers with multiple
104 trips around the event loop (and cgi...).
105
106 6) MAJOR connections on ah waiting list that closed did not get removed from
107 the waiting list...
108
109 7) MAJOR since we added the ability to hold an ah across http keepalive
110 transactions where more headers had already arrived, we broke the ability
111 to tell if more headers had arrived.  Result was if the browser didn't
112 close the keepalive, we retained ah for the lifetime of the keepalive,
113 using up the pool.
114
115 8) MAJOR windows-only-POLLHUP was not coming
116
117 9) Client should not send ext hdr if no exts
118
119 Changes
120 -------
121
122 1) MINOR test-server gained some new switches
123
124    -C <file>  use external SSL cert file
125    -K <file>  use external SSL key file
126    -A <file>  use external SSL CA cert file
127    
128    -u <uid>  set effective uid
129    -g <gid>  set effective gid
130
131 together you can use them like this to have the test-server work with the
132 usual purchased SSL certs from an official CA.
133
134    --ssl -C your.crt -K your.key -A your.cer -u 99 -g 99
135
136 2) MINOR the OpenSSL magic to setup ECDH cipher usage is implemented in the
137 library, and the ciphers restricted to use ECDH only.
138 Using this, the lws test server can score an A at SSLLABS test
139
140 3) MINOR STS (SSL always) header is added to the test server if you use --ssl.  With
141 that, we score A+ at SSLLABS test
142
143 4) MINOR daemonize function (disabled at cmake by default) is updated to work
144 with systemd
145
146 5) MINOR example systemd .service file now provided for test server
147 (not installed by default)
148
149 6) test server html is updated with tabs and a new live server monitoring
150 feature.  Input sanitization added to the js.
151
152 7) client connections attempted when no ah is free no longer fail, they are
153 just deferred until an ah becomes available.
154
155 8) The test client pays attention to if you give it an http:/ or https://
156 protocol string to its argument in URL format.  If so, it stays in http[s]
157 client mode and doesn't upgrade to ws[s], allowing you to do generic http client
158 operations.  Receiving transfer-encoding: chunked is supported.
159
160 9) If you enable -DLWS_WITH_HTTP_PROXY=1 at cmake, the test server has a
161 new URI path http://localhost:7681/proxytest If you visit here, a client
162 connection to http://example.com:80 is spawned, and the results piped on
163 to your original connection.
164
165 10) Also with LWS_WITH_HTTP_PROXY enabled at cmake, lws wants to link to an
166 additional library, "libhubbub".  This allows lws to do html rewriting on the
167 fly, adjusting proxied urls in a lightweight and fast way.
168
169 11) There's a new context creation flag LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT,
170 this is included automatically if you give any other SSL-related option flag.
171 If you give no SSL-related option flag, nor this one directly, then even
172 though SSL support may be compiled in, it is never initialized nor used for the
173 whole lifetime of the lws context.
174
175 Conversely in order to prepare the context to use SSL, even though, eg, you
176 are not listening on SSL but will use SSL client connections later, you must
177 give this flag explicitly to make sure SSL is initialized.
178
179
180 User API additions
181 ------------------
182
183 1) MINOR APIBREAK There's a new member in struct lws_context_creation_info, ecdh_curve,
184 which lets you set the name of the ECDH curve OpenSSL should use.  By
185 default (if you leave ecdh_curve NULL) it will use "prime256v1"
186
187 2) MINOR NEWAPI It was already possible to adopt a foreign socket that had not
188 been read from using lws_adopt_socket() since v1.7.  Now you can adopt a
189 partially-used socket if you don't need SSL, by passing it what you read
190 so it can drain that before reading from the socket.
191
192 LWS_VISIBLE LWS_EXTERN struct lws *
193 lws_adopt_socket_readbuf(struct lws_context *context, lws_sockfd_type accept_fd,
194                 const char *readbuf, size_t len);
195
196 3) MINOR NEWAPI CGI type "network io" subprocess execution is now possible from
197 a simple api.
198
199 LWS_VISIBLE LWS_EXTERN int
200 lws_cgi(struct lws *wsi, char * const *exec_array,  int script_uri_path_len,
201         int timeout_secs);
202
203 LWS_VISIBLE LWS_EXTERN int
204 lws_cgi_kill(struct lws *wsi);
205
206 To use it, you must first set the cmake option
207
208 $ cmake .. -DLWS_WITH_CGI=1
209
210 See test-server-http.c and  test server path
211
212 http://localhost:7681/cgitest
213
214 stdin gets http body, you can test it with wget
215
216 $ echo hello > hello.txt
217 $ wget http://localhost:7681/cgitest --post-file=hello.txt -O- --quiet
218 lwstest script
219 read="hello"
220
221 The test script returns text/html table showing /proc/meminfo.  But the cgi
222 support is complete enough to run cgit cgi.
223
224 4) There is a helper api for forming logging timestamps
225
226 LWS_VISIBLE int
227 lwsl_timestamp(int level, char *p, int len)
228
229 this generates this kind of timestamp for use as logging preamble
230
231 lwsts[13116]: [2016/01/25 14:52:52:8386] NOTICE: Initial logging level 7
232
233 5) struct lws_client_connect_info has a new member
234
235  const char *method
236  
237 If it's NULL, then everything happens as before, lws_client_connect_via_info()
238 makes a ws or wss connection to the address given.
239
240 If you set method to a valid http method like "GET", though, then this method
241 is used and the connection remains in http[s], it's not upgraded to ws[s].
242
243 So with this, you can perform http[s] client operations as well as ws[s] ones.
244
245 There are 4 new related callbacks
246
247         LWS_CALLBACK_ESTABLISHED_CLIENT_HTTP                    = 44,
248         LWS_CALLBACK_CLOSED_CLIENT_HTTP                         = 45,
249         LWS_CALLBACK_RECEIVE_CLIENT_HTTP                        = 46,
250         LWS_CALLBACK_COMPLETED_CLIENT_HTTP                      = 47,
251
252 6) struct lws_client_connect_info has a new member
253
254  const char *parent_wsi
255  
256 if non-NULL, the client wsi is set to be a child of parent_wsi.  This ensures
257 if parent_wsi closes, then the client child is closed just before.
258
259 7) If you're using SSL, there's a new context creation-time option flag
260 LWS_SERVER_OPTION_REDIRECT_HTTP_TO_HTTPS.  If you give this, non-ssl
261 connections to the server listen port are accepted and receive a 301
262 redirect to / on the same host and port using https://
263
264 8) User code may set per-connection extension options now, using a new api
265 "lws_set_extension_option()".
266
267 This should be called from the ESTABLISHED callback like this
268
269  lws_set_extension_option(wsi, "permessage-deflate",
270                           "rx_buf_size", "12"); /* 1 << 12 */
271
272 If the extension is not active (missing or not negotiated for the
273 connection, or extensions are disabled on the library) the call is
274 just returns -1.  Otherwise the connection's extension has its
275 named option changed.
276
277 The extension may decide to alter or disallow the change, in the
278 example above permessage-deflate restricts the size of his rx
279 output buffer also considering the protocol's rx_buf_size member.
280
281
282 New application lwsws
283 ---------------------
284
285 A libwebsockets-based general webserver is built by default now, lwsws.
286
287 It's configured by JSON, by default in
288
289   /etc/lwsws/conf
290
291 which contains global lws context settings like this
292
293 {
294   "global": {
295    "uid": "99",
296    "gid": "99",
297    "interface": "eth0",
298    "count-threads": "1"
299  }
300 }
301
302   /etc/lwsws/conf.d/*
303
304 which contains zero or more files describing vhosts, like this
305
306 {
307  "vhosts": [
308   { "name": "warmcat.com",
309     "port": "443",
310     "host-ssl-key": "/etc/pki/tls/private/warmcat.com.key",
311     "host-ssl-cert": "/etc/pki/tls/certs/warmcat.com.crt",
312     "host-ssl-ca": "/etc/pki/tls/certs/warmcat.com.cer",
313     "mounts": [
314       { "/": [
315        { "home": "file:///var/www/warmcat.com" },
316        { "default": "index.html" }
317       ]
318      }
319     ]
320    }
321  ]
322 }
323
324
325
326 v1.7.0
327 ======
328
329 Extension Changes
330 -----------------
331
332 1) There is now a "permessage-deflate" / RFC7692 implementation.  It's very
333 similar to "deflate-frame" we have offered for a long while; deflate-frame is
334 now provided as an alias of permessage-deflate.
335
336 The main differences are that the new permessage-deflate implementation:
337
338  - properly performs streaming respecting input and output buffer limits.  The
339    old deflate-frame implementation could only work on complete deflate input
340    and produce complete inflate output for each frame.  The new implementation
341    only mallocs buffers at initialization.
342
343  - goes around the event loop after each input package is processed allowing
344    interleaved output processing.  The RX flow control api can be used to
345    force compressed input processing to match the rate of compressed output
346    processing (test--echo shows an example of how to do this).
347
348  - when being "deflate-frame" for compatibility he uses the same default zlib
349    settings as the old "deflate-frame", but instead of exponentially increasing
350    malloc allocations until the whole output will fit, he observes the default
351    input and output chunking buffer sizes of "permessage-deflate", that's
352    1024 in and 1024 out at a time.
353
354 2) deflate-stream has been disabled for many versions (for over a year) and is
355 now removed.  Browsers are now standardizing on "permessage-deflate" / RFC7692
356
357 3) struct lws_extension is simplified, and lws extensions now have a public
358 api (their callback) for use in user code to compose extensions and options
359 the user code wants.  lws_get_internal_exts() is deprecated but kept around
360 as a NOP.  The changes allow one extension implementation to go by different
361 names and allows the user client code to control option offers per-ext.
362
363 The test client and server are updated to use the new way.  If you use
364 the old way it should still work, but extensions will be disabled until you
365 update your code.
366
367 Extensions are now responsible for allocating and per-instance private struct
368 at instance construction time and freeing it when the instance is destroyed.
369 Not needing to know the size means the extension's struct can be opaque
370 to user code.
371
372
373 User api additions
374 ------------------
375
376 1) The info struct gained three new members
377
378  - max_http_header_data: 0 for default (1024) or set the maximum amount of known
379     http header payload that lws can deal with.  Payload in unknown http
380     headers is dropped silently.  If for some reason you need to send huge
381     cookies or other HTTP-level headers, you can now increase this at context-
382     creation time.
383
384  - max_http_header_pool: 0 for default (16) or set the maximum amount of http
385      headers that can be tracked by lws in this context.  For the server, if
386      the header pool is completely in use then accepts on the listen socket
387      are disabled until one becomes free.  For the client, if you simultaneously
388      have pending connects for more than this number of client connections,
389      additional connects will fail until some of the pending connections timeout
390      or complete.
391
392  - timeout_secs: 0 for default (currently 20s), or set the library's
393      network activity timeout to the given number of seconds
394
395 HTTP header processing in lws only exists until just after the first main
396 callback after the HTTP handshake... for ws connections that is ESTABLISHED and
397 for HTTP connections the HTTP callback.
398
399 So these settings are not related to the maximum number of simultaneous
400 connections, but the number of HTTP handshakes that may be expected or ongoing,
401 or have just completed, at one time.  The reason it's useful is it changes the
402 memory allocation for header processing to be one-time at context creation
403 instead of every time there is a new connection, and gives you control over
404 the peak allocation.
405
406 Setting max_http_header_pool to 1 is fine it will just queue incoming
407 connections before the accept as necessary, you can still have as many
408 simultaneous post-header connections as you like.  Since the http header
409 processing is completed and the allocation released after ESTABLISHED or the
410 HTTP callback, even with a pool of 1 many connections can be handled rapidly.
411
412 2) There is a new callback that allows the user code to get acccess to the
413 optional close code + aux data that may have been sent by the peer.
414
415 LWS_CALLBACK_WS_PEER_INITIATED_CLOSE:
416              The peer has sent an unsolicited Close WS packet.  @in and
417              @len are the optional close code (first 2 bytes, network
418              order) and the optional additional information which is not
419              defined in the standard, and may be a string or non-human-
420              readble data.
421              If you return 0 lws will echo the close and then close the
422              connection.  If you return nonzero lws will just close the
423              connection.
424
425 As usual not handling it does the right thing, if you're not interested in it
426 just ignore it.
427
428 The test server has "open and close" testing buttons at the bottom, if you
429 open and close that connection, on close it will send a close code 3000 decimal
430 and the string "Bye!" as the aux data.
431
432 The test server dumb-increment callback handles this callback reason and prints
433
434 lwsts[15714]: LWS_CALLBACK_WS_PEER_INITIATED_CLOSE: len 6
435 lwsts[15714]:  0: 0x0B
436 lwsts[15714]:  1: 0xB8
437 lwsts[15714]:  2: 0x42
438 lwsts[15714]:  3: 0x79
439 lwsts[15714]:  4: 0x65
440 lwsts[15714]:  5: 0x21
441
442 3) There is a new API to allow the user code to control the content of the
443 close frame sent when about to return nonzero from the user callback to
444 indicate the connection should close.
445
446 /**
447  * lws_close_reason - Set reason and aux data to send with Close packet
448  *              If you are going to return nonzero from the callback
449  *              requesting the connection to close, you can optionally
450  *              call this to set the reason the peer will be told if
451  *              possible.
452  *
453  * @wsi:        The websocket connection to set the close reason on
454  * @status:     A valid close status from websocket standard
455  * @buf:        NULL or buffer containing up to 124 bytes of auxiliary data
456  * @len:        Length of data in @buf to send
457  */
458 LWS_VISIBLE LWS_EXTERN void
459 lws_close_reason(struct lws *wsi, enum lws_close_status status,
460                  unsigned char *buf, size_t len);
461
462 An extra button is added to the "open and close" test server page that requests
463 that the test server close the connection from his end.
464
465 The test server code will do so by
466
467                         lws_close_reason(wsi, LWS_CLOSE_STATUS_GOINGAWAY,
468                                          (unsigned char *)"seeya", 5);
469                         return -1;
470
471 The browser shows the close code and reason he received
472
473 websocket connection CLOSED, code: 1001, reason: seeya
474
475 4) There's a new context creation time option flag
476
477 LWS_SERVER_OPTION_VALIDATE_UTF8
478
479 if you set it in info->options, then TEXT and CLOSE frames will get checked to
480 confirm that they contain valid UTF-8.  If they don't, the connection will get
481 closed by lws.
482
483 5) ECDH Certs are now supported.  Enable the CMake option
484
485 cmake .. -DLWS_SSL_SERVER_WITH_ECDH_CERT=1 
486
487 **and** the info->options flag
488
489 LWS_SERVER_OPTION_SSL_ECDH
490
491 to build in support and select it at runtime.
492
493 6) There's a new api lws_parse_uri() that simplifies chopping up
494 https://xxx:yyy/zzz uris into parts nicely.  The test client now uses this
495 to allow proper uris as well as the old address style.
496
497 7) SMP support is integrated into LWS without any internal threading.  It's
498 very simple to use, libwebsockets-test-server-pthread shows how to do it,
499 use -j <n> argument there to control the number of service threads up to 32.
500
501 Two new members are added to the info struct
502
503         unsigned int count_threads;
504         unsigned int fd_limit_per_thread;
505         
506 leave them at the default 0 to get the normal singlethreaded service loop.
507
508 Set count_threads to n to tell lws you will have n simultaneous service threads
509 operating on the context.
510
511 There is still a single listen socket on one port, no matter how many
512 service threads.
513
514 When a connection is made, it is accepted by the service thread with the least
515 connections active to perform load balancing.
516
517 The user code is responsible for spawning n threads running the service loop
518 associated to a specific tsi (Thread Service Index, 0 .. n - 1).  See
519 the libwebsockets-test-server-pthread for how to do.
520
521 If you leave fd_limit_per_thread at 0, then the process limit of fds is shared
522 between the service threads; if you process was allowed 1024 fds overall then
523 each thread is limited to 1024 / n.
524
525 You can set fd_limit_per_thread to a nonzero number to control this manually, eg
526 the overall supported fd limit is less than the process allowance.
527
528 You can control the context basic data allocation for multithreading from Cmake
529 using -DLWS_MAX_SMP=, if not given it's set to 32.  The serv_buf allocation
530 for the threads (currently 4096) is made at runtime only for active threads.
531
532 Because lws will limit the requested number of actual threads supported
533 according to LWS_MAX_SMP, there is an api lws_get_count_threads(context) to
534 discover how many threads were actually allowed when the context was created.
535
536 It's required to implement locking in the user code in the same way that
537 libwebsockets-test-server-pthread does it, for the FD locking callbacks.
538
539 If LWS_MAX_SMP=1, then there is no code related to pthreads compiled in the
540 library.  If more than 1, a small amount of pthread mutex code is built into
541 the library.
542
543 8) New API
544
545 LWS_VISIBLE struct lws *
546 lws_adopt_socket(struct lws_context *context, lws_sockfd_type accept_fd)
547
548 allows foreign sockets accepted by non-lws code to be adopted by lws as if they
549 had just been accepted by lws' own listen socket.
550
551 9) X-Real-IP: header has been added as WSI_TOKEN_HTTP_X_REAL_IP
552
553 10) Libuv support is added, there are new related user apis
554
555 typedef void (lws_uv_signal_cb_t)(uv_loop_t *l, uv_signal_t *w, int revents);
556
557 LWS_VISIBLE LWS_EXTERN int
558 lws_uv_sigint_cfg(struct lws_context *context, int use_uv_sigint,
559                   lws_uv_signal_cb_t *cb);
560
561 LWS_VISIBLE LWS_EXTERN int
562 lws_uv_initloop(struct lws_context *context, uv_loop_t *loop, int tsi);
563
564 LWS_VISIBLE void
565 lws_uv_sigint_cb(uv_loop_t *loop, uv_signal_t *watcher, int revents);
566
567 and CMAKE option
568
569 LWS_WITH_LIBUV
570
571
572 User api changes
573 ----------------
574
575 1) LWS_SEND_BUFFER_POST_PADDING is now 0 and deprecated.  You can remove it; if
576 you still use it, obviously it does nothing.  Old binary code with nonzero
577 LWS_SEND_BUFFER_POST_PADDING is perfectly compatible, the old code just
578 allocated a buffer bigger than the library is going to use.
579
580 The example apps no longer use LWS_SEND_BUFFER_POST_PADDING.
581
582 The only path who made use of it was sending with LWS_WRITE_CLOSE --->
583
584 2) Because of lws_close_reason() formalizing handling close frames,
585 LWS_WRITE_CLOSE is removed from libwebsockets.h.  It was only of use to send
586 close frames...close frame content should be managed using lws_close_reason()
587 now.
588
589 3) We check for invalid CLOSE codes and complain about protocol violation in
590 our close code.  But it changes little since we were in the middle of closing
591 anyway.
592
593 4) zero-length RX frames and zero length TX frames are now allowed.
594
595 5) Pings and close used to be limited to 124 bytes, the correct limit is 125
596 so that is now also allowed.
597
598 6) LWS_PRE is provided as a synonym for LWS_SEND_BUFFER_PRE_PADDING, either is
599 valid to use now.
600
601 7) There's generic support for RFC7462 style extension options built into the
602 library now.  As a consequence, a field "options" is added to lws_extension.
603 It can be NULL if there are no options on the extension.  Extension internal
604 info is part of the public abi because extensions may be implemented outside
605 the library.
606
607 8) WSI_TOKEN_PROXY enum was accidentally defined to collide with another token
608 of value 73.  That's now corrected and WSI_TOKEN_PROXY moved to his own place at
609 77.
610
611 9) With the addition of libuv support, libev is not the only event loop
612 library in town and his api names must be elaborated with _ev_
613
614   Callback typedef: lws_signal_cb ---> lws_ev_signal_cb_t
615   lws_sigint_cfg --> lws_ev_sigint_cfg
616   lws_initloop --> lws_ev_initloop
617   lws_sigint_cb --> lws_ev_sigint_cb
618
619 10) Libev support is made compatible with multithreaded service,
620 lws_ev_initloop (was lws_initloop) gets an extra argument for the
621 thread service index (use 0 if you will just have 1 service thread).
622
623 LWS_VISIBLE LWS_EXTERN int
624 lws_ev_initloop(struct lws_context *context, ev_loop_t *loop, int tsi);
625
626
627 (for earlier changelogs, see the tagged releases)