blob: 9c598a190a34564e80500486eef26a94a915424e [file] [log] [blame]
Andy Greena35c86f2013-01-31 10:16:44 +08001Changelog
2---------
3
Andy Green0c3cc2e2016-02-20 09:12:52 +08004Fixes
5-----
6
71) MAJOR (Windows-only) fix assert firing
8
92) MAJOR http:/1.1 connections handled by lws_return_http_status() did not
10get sent a content-length resulting in the link hanging until the peer closed
11it. attack.sh updated to add a test for this.
12
Andy Green26d42492016-02-24 12:40:21 +0800133) MINOR An error about hdr struct in _lws_ws_related is corrected, it's not
14known to affect anything until after it was fixed
15
Andy Green5c0bcf42016-02-24 21:27:46 +0800164) MINOR During the close shutdown wait state introduced at v1.7, if something
17requests callback on writeable for the socket it will busywait until the
18socket closes
19
Andy Greendbfbbb42016-02-24 20:58:19 +0800205) MAJOR Although the test server has done it for a few versions already, it
21is now required for the user code to explicitly call
22
23 if (lws_http_transaction_completed(wsi))
24 return -1;
25
26when it finishes replying to a transaction in http. Previously the library
27did it for you, but that disallowed large, long transfers with multiple
28trips around the event loop (and cgi...).
29
Andy Green4ba798d2016-02-25 21:50:49 +0800306) MAJOR connections on ah waiting list that closed did not get removed from
31the waiting list...
32
Andy Green83af28a2016-02-28 10:55:31 +0800337) MAJOR since we added the ability to hold an ah across http keepalive
34transactions where more headers had already arrived, we broke the ability
35to tell if more headers had arrived. Result was if the browser didn't
36close the keepalive, we retained ah for the lifetime of the keepalive,
37using up the pool.
38
Andy Green442e1c82016-02-29 10:10:42 +0800398) MAJOR windows-only-POLLHUP was not coming
40
Andy Green4f5ebec2016-03-09 23:13:31 +0800419) Client should not send ext hdr if no exts
Andy Greendbfbbb42016-02-24 20:58:19 +080042
Andy Green0c3cc2e2016-02-20 09:12:52 +080043Changes
44-------
45
461) MINOR test-server gained some new switches
47
48 -C <file> use external SSL cert file
49 -K <file> use external SSL key file
50 -A <file> use external SSL CA cert file
51
52 -u <uid> set effective uid
53 -g <gid> set effective gid
54
55together you can use them like this to have the test-server work with the
56usual purchased SSL certs from an official CA.
57
58 --ssl -C your.crt -K your.key -A your.cer -u 99 -g 99
59
602) MINOR the OpenSSL magic to setup ECDH cipher usage is implemented in the
61library, and the ciphers restricted to use ECDH only.
62Using this, the lws test server can score an A at SSLLABS test
63
643) MINOR STS (SSL always) header is added to the test server if you use --ssl. With
65that, we score A+ at SSLLABS test
66
674) MINOR daemonize function (disabled at cmake by default) is updated to work
68with systemd
69
705) MINOR example systemd .service file now provided for test server
71(not installed by default)
72
Andy Green0ad1a6e2016-02-20 14:05:55 +0800736) test server html is updated with tabs and a new live server monitoring
74feature. Input sanitization added to the js.
75
Andy Green2d8d35a2016-02-29 14:19:16 +0800767) client connections attempted when no ah is free no longer fail, they are
77just deferred until an ah becomes available.
78
Andy Greena661ee52016-02-29 13:18:30 +0800798) The test client pays attention to if you give it an http:/ or https://
80protocol string to its argument in URL format. If so, it stays in http[s]
81client mode and doesn't upgrade to ws[s], allowing you to do generic http client
Andy Green5c8906e2016-03-13 16:44:19 +080082operations. Receiving transfer-encoding: chunked is supported.
Andy Greena661ee52016-02-29 13:18:30 +080083
Andy Green1e5a9ad2016-03-20 11:59:53 +0800849) If you enable -DLWS_WITH_HTTP_PROXY=1 at cmake, the test server has a
85new URI path http://localhost:7681/proxytest If you visit here, a client
86connection to http://example.com:80 is spawned, and the results piped on
87to your original connection.
88
8910) Also with LWS_WITH_HTTP_PROXY enabled at cmake, lws wants to link to an
90additional library, "libhubbub". This allows lws to do html rewriting on the
91fly, adjusting proxied urls in a lightweight and fast way.
Andy Greenfb5f33b2016-03-01 07:19:01 +080092
Andy Greenc6fd3602016-03-23 09:22:11 +08009311) There's a new context creation flag LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT,
94this is included automatically if you give any other SSL-related option flag.
95If you give no SSL-related option flag, nor this one directly, then even
96though SSL support may be compiled in, it is never initialized nor used for the
97whole lifetime of the lws context.
98
99Conversely in order to prepare the context to use SSL, even though, eg, you
100are not listening on SSL but will use SSL client connections later, you must
101give this flag explicitly to make sure SSL is initialized.
102
Andy Green2d8d35a2016-02-29 14:19:16 +0800103
Andy Greend7fddad2016-02-18 20:36:55 +0800104User API additions
105------------------
106
Andy Green0c3cc2e2016-02-20 09:12:52 +08001071) MINOR APIBREAK There's a new member in struct lws_context_creation_info, ecdh_curve,
Andy Greend7fddad2016-02-18 20:36:55 +0800108which lets you set the name of the ECDH curve OpenSSL should use. By
109default (if you leave ecdh_curve NULL) it will use "prime256v1"
110
Andy Green51d9afa2016-02-24 11:05:56 +08001112) MINOR NEWAPI It was already possible to adopt a foreign socket that had not
112been read from using lws_adopt_socket() since v1.7. Now you can adopt a
113partially-used socket if you don't need SSL, by passing it what you read
114so it can drain that before reading from the socket.
115
116LWS_VISIBLE LWS_EXTERN struct lws *
117lws_adopt_socket_readbuf(struct lws_context *context, lws_sockfd_type accept_fd,
118 const char *readbuf, size_t len);
Andy Greend7fddad2016-02-18 20:36:55 +0800119
Andy Green6a8099b2016-02-21 21:25:48 +08001203) MINOR NEWAPI CGI type "network io" subprocess execution is now possible from
121a simple api.
122
123LWS_VISIBLE LWS_EXTERN int
Andy Green1a138852016-03-20 11:55:25 +0800124lws_cgi(struct lws *wsi, char * const *exec_array, int script_uri_path_len,
125 int timeout_secs);
Andy Green6a8099b2016-02-21 21:25:48 +0800126
127LWS_VISIBLE LWS_EXTERN int
128lws_cgi_kill(struct lws *wsi);
129
130To use it, you must first set the cmake option
131
132$ cmake .. -DLWS_WITH_CGI=1
133
134See test-server-http.c and test server path
135
136http://localhost:7681/cgitest
137
138stdin gets http body, you can test it with wget
139
140$ echo hello > hello.txt
141$ wget http://localhost:7681/cgitest --post-file=hello.txt -O- --quiet
142lwstest script
143read="hello"
144
Andy Green1a138852016-03-20 11:55:25 +0800145The test script returns text/html table showing /proc/meminfo. But the cgi
146support is complete enough to run cgit cgi.
147
Andy Greend61bed32016-02-25 15:01:55 +08001484) There is a helper api for forming logging timestamps
149
150LWS_VISIBLE int
151lwsl_timestamp(int level, char *p, int len)
152
153this generates this kind of timestamp for use as logging preamble
154
155lwsts[13116]: [2016/01/25 14:52:52:8386] NOTICE: Initial logging level 7
156
Andy Greena661ee52016-02-29 13:18:30 +08001575) struct lws_client_connect_info has a new member
158
159 const char *method
160
161If it's NULL, then everything happens as before, lws_client_connect_via_info()
162makes a ws or wss connection to the address given.
163
164If you set method to a valid http method like "GET", though, then this method
165is used and the connection remains in http[s], it's not upgraded to ws[s].
166
167So with this, you can perform http[s] client operations as well as ws[s] ones.
168
169There are 4 new related callbacks
170
171 LWS_CALLBACK_ESTABLISHED_CLIENT_HTTP = 44,
172 LWS_CALLBACK_CLOSED_CLIENT_HTTP = 45,
173 LWS_CALLBACK_RECEIVE_CLIENT_HTTP = 46,
174 LWS_CALLBACK_COMPLETED_CLIENT_HTTP = 47,
Andy Green6a8099b2016-02-21 21:25:48 +0800175
Andy Green494418a2016-03-02 09:17:22 +08001766) struct lws_client_connect_info has a new member
177
178 const char *parent_wsi
179
180if non-NULL, the client wsi is set to be a child of parent_wsi. This ensures
181if parent_wsi closes, then the client child is closed just before.
182
Andy Green0f9904f2016-03-17 15:26:49 +08001837) If you're using SSL, there's a new context creation-time option flag
184LWS_SERVER_OPTION_REDIRECT_HTTP_TO_HTTPS. If you give this, non-ssl
185connections to the server listen port are accepted and receive a 301
186redirect to / on the same host and port using https://
187
Andy Green0c3cc2e2016-02-20 09:12:52 +0800188
Andy Green9c60ed92016-02-16 12:32:18 +0800189v1.7.0
190======
191
Andy Green67112662016-01-11 11:34:01 +0800192Extension Changes
193-----------------
194
1951) There is now a "permessage-deflate" / RFC7692 implementation. It's very
196similar to "deflate-frame" we have offered for a long while; deflate-frame is
197now provided as an alias of permessage-deflate.
198
199The main differences are that the new permessage-deflate implementation:
200
201 - properly performs streaming respecting input and output buffer limits. The
202 old deflate-frame implementation could only work on complete deflate input
203 and produce complete inflate output for each frame. The new implementation
204 only mallocs buffers at initialization.
205
206 - goes around the event loop after each input package is processed allowing
207 interleaved output processing. The RX flow control api can be used to
208 force compressed input processing to match the rate of compressed output
209 processing (test--echo shows an example of how to do this).
210
211 - when being "deflate-frame" for compatibility he uses the same default zlib
212 settings as the old "deflate-frame", but instead of exponentially increasing
213 malloc allocations until the whole output will fit, he observes the default
214 input and output chunking buffer sizes of "permessage-deflate", that's
215 1024 in and 1024 out at a time.
216
2172) deflate-stream has been disabled for many versions (for over a year) and is
218now removed. Browsers are now standardizing on "permessage-deflate" / RFC7692
219
2203) struct lws_extension is simplified, and lws extensions now have a public
221api (their callback) for use in user code to compose extensions and options
222the user code wants. lws_get_internal_exts() is deprecated but kept around
223as a NOP. The changes allow one extension implementation to go by different
224names and allows the user client code to control option offers per-ext.
225
226The test client and server are updated to use the new way. If you use
227the old way it should still work, but extensions will be disabled until you
228update your code.
229
230Extensions are now responsible for allocating and per-instance private struct
231at instance construction time and freeing it when the instance is destroyed.
232Not needing to know the size means the extension's struct can be opaque
233to user code.
234
235
Andy Green3df58002015-12-25 12:44:12 +0800236User api additions
237------------------
238
Andy Green200a6a22016-02-15 20:36:02 +08002391) The info struct gained three new members
Andy Green3df58002015-12-25 12:44:12 +0800240
241 - max_http_header_data: 0 for default (1024) or set the maximum amount of known
242 http header payload that lws can deal with. Payload in unknown http
243 headers is dropped silently. If for some reason you need to send huge
244 cookies or other HTTP-level headers, you can now increase this at context-
245 creation time.
246
247 - max_http_header_pool: 0 for default (16) or set the maximum amount of http
248 headers that can be tracked by lws in this context. For the server, if
249 the header pool is completely in use then accepts on the listen socket
250 are disabled until one becomes free. For the client, if you simultaneously
251 have pending connects for more than this number of client connections,
252 additional connects will fail until some of the pending connections timeout
253 or complete.
254
Andy Green200a6a22016-02-15 20:36:02 +0800255 - timeout_secs: 0 for default (currently 20s), or set the library's
256 network activity timeout to the given number of seconds
257
Andy Green3df58002015-12-25 12:44:12 +0800258HTTP header processing in lws only exists until just after the first main
259callback after the HTTP handshake... for ws connections that is ESTABLISHED and
260for HTTP connections the HTTP callback.
261
262So these settings are not related to the maximum number of simultaneous
Andy Green3246ebb2015-12-26 12:03:06 +0800263connections, but the number of HTTP handshakes that may be expected or ongoing,
Andy Green3df58002015-12-25 12:44:12 +0800264or have just completed, at one time. The reason it's useful is it changes the
265memory allocation for header processing to be one-time at context creation
266instead of every time there is a new connection, and gives you control over
267the peak allocation.
268
269Setting max_http_header_pool to 1 is fine it will just queue incoming
270connections before the accept as necessary, you can still have as many
Andy Green5b85e392015-12-26 13:23:11 +0800271simultaneous post-header connections as you like. Since the http header
272processing is completed and the allocation released after ESTABLISHED or the
273HTTP callback, even with a pool of 1 many connections can be handled rapidly.
274
Andy Green066a7a12015-12-26 15:47:06 +08002752) There is a new callback that allows the user code to get acccess to the
276optional close code + aux data that may have been sent by the peer.
277
278LWS_CALLBACK_WS_PEER_INITIATED_CLOSE:
279 The peer has sent an unsolicited Close WS packet. @in and
280 @len are the optional close code (first 2 bytes, network
281 order) and the optional additional information which is not
282 defined in the standard, and may be a string or non-human-
283 readble data.
284 If you return 0 lws will echo the close and then close the
Andy Green67112662016-01-11 11:34:01 +0800285 connection. If you return nonzero lws will just close the
286 connection.
Andy Green066a7a12015-12-26 15:47:06 +0800287
288As usual not handling it does the right thing, if you're not interested in it
289just ignore it.
290
291The test server has "open and close" testing buttons at the bottom, if you
292open and close that connection, on close it will send a close code 3000 decimal
293and the string "Bye!" as the aux data.
294
295The test server dumb-increment callback handles this callback reason and prints
296
297lwsts[15714]: LWS_CALLBACK_WS_PEER_INITIATED_CLOSE: len 6
298lwsts[15714]: 0: 0x0B
299lwsts[15714]: 1: 0xB8
300lwsts[15714]: 2: 0x42
301lwsts[15714]: 3: 0x79
302lwsts[15714]: 4: 0x65
303lwsts[15714]: 5: 0x21
304
Andy Green1fb95e82015-12-26 17:20:34 +08003053) There is a new API to allow the user code to control the content of the
306close frame sent when about to return nonzero from the user callback to
307indicate the connection should close.
308
309/**
310 * lws_close_reason - Set reason and aux data to send with Close packet
311 * If you are going to return nonzero from the callback
312 * requesting the connection to close, you can optionally
313 * call this to set the reason the peer will be told if
314 * possible.
315 *
316 * @wsi: The websocket connection to set the close reason on
317 * @status: A valid close status from websocket standard
318 * @buf: NULL or buffer containing up to 124 bytes of auxiliary data
319 * @len: Length of data in @buf to send
320 */
321LWS_VISIBLE LWS_EXTERN void
322lws_close_reason(struct lws *wsi, enum lws_close_status status,
323 unsigned char *buf, size_t len);
324
325An extra button is added to the "open and close" test server page that requests
326that the test server close the connection from his end.
327
328The test server code will do so by
329
330 lws_close_reason(wsi, LWS_CLOSE_STATUS_GOINGAWAY,
331 (unsigned char *)"seeya", 5);
332 return -1;
333
334The browser shows the close code and reason he received
335
336websocket connection CLOSED, code: 1001, reason: seeya
337
Vijay Khurdiyae73d4462016-01-15 16:21:51 +08003384) There's a new context creation time option flag
Andy Green44a7f652015-12-29 11:20:09 +0800339
340LWS_SERVER_OPTION_VALIDATE_UTF8
341
342if you set it in info->options, then TEXT and CLOSE frames will get checked to
343confirm that they contain valid UTF-8. If they don't, the connection will get
344closed by lws.
345
Vijay Khurdiyae73d4462016-01-15 16:21:51 +08003465) ECDH Certs are now supported. Enable the CMake option
347
348cmake .. -DLWS_SSL_SERVER_WITH_ECDH_CERT=1
349
350**and** the info->options flag
351
Andy Greenff696482016-02-17 07:46:27 +0800352LWS_SERVER_OPTION_SSL_ECDH
Vijay Khurdiyae73d4462016-01-15 16:21:51 +0800353
354to build in support and select it at runtime.
355
Andy Greenff696482016-02-17 07:46:27 +08003566) There's a new api lws_parse_uri() that simplifies chopping up
Andy Green809d69a2016-01-14 11:37:56 +0800357https://xxx:yyy/zzz uris into parts nicely. The test client now uses this
Andy Greend3a55052016-01-19 03:34:24 +0800358to allow proper uris as well as the old address style.
359
3607) SMP support is integrated into LWS without any internal threading. It's
361very simple to use, libwebsockets-test-server-pthread shows how to do it,
362use -j <n> argument there to control the number of service threads up to 32.
363
364Two new members are added to the info struct
365
366 unsigned int count_threads;
367 unsigned int fd_limit_per_thread;
368
369leave them at the default 0 to get the normal singlethreaded service loop.
370
371Set count_threads to n to tell lws you will have n simultaneous service threads
372operating on the context.
373
374There is still a single listen socket on one port, no matter how many
375service threads.
376
377When a connection is made, it is accepted by the service thread with the least
378connections active to perform load balancing.
379
380The user code is responsible for spawning n threads running the service loop
381associated to a specific tsi (Thread Service Index, 0 .. n - 1). See
382the libwebsockets-test-server-pthread for how to do.
383
384If you leave fd_limit_per_thread at 0, then the process limit of fds is shared
385between the service threads; if you process was allowed 1024 fds overall then
386each thread is limited to 1024 / n.
387
388You can set fd_limit_per_thread to a nonzero number to control this manually, eg
389the overall supported fd limit is less than the process allowance.
390
391You can control the context basic data allocation for multithreading from Cmake
392using -DLWS_MAX_SMP=, if not given it's set to 32. The serv_buf allocation
393for the threads (currently 4096) is made at runtime only for active threads.
394
395Because lws will limit the requested number of actual threads supported
396according to LWS_MAX_SMP, there is an api lws_get_count_threads(context) to
397discover how many threads were actually allowed when the context was created.
398
399It's required to implement locking in the user code in the same way that
400libwebsockets-test-server-pthread does it, for the FD locking callbacks.
401
Andy Greenba119e92016-01-26 21:40:32 +0800402If LWS_MAX_SMP=1, then there is no code related to pthreads compiled in the
403library. If more than 1, a small amount of pthread mutex code is built into
404the library.
Andy Green809d69a2016-01-14 11:37:56 +0800405
Andy Greenba119e92016-01-26 21:40:32 +08004068) New API
407
408LWS_VISIBLE struct lws *
409lws_adopt_socket(struct lws_context *context, lws_sockfd_type accept_fd)
410
411allows foreign sockets accepted by non-lws code to be adopted by lws as if they
412had just been accepted by lws' own listen socket.
Andy Green3df58002015-12-25 12:44:12 +0800413
Danomi Czaski4e9c7f32016-01-28 09:40:53 +08004149) X-Real-IP: header has been added as WSI_TOKEN_HTTP_X_REAL_IP
415
Andy Green86ed65f2016-02-14 09:27:41 +080041610) Libuv support is added, there are new related user apis
417
418typedef void (lws_uv_signal_cb_t)(uv_loop_t *l, uv_signal_t *w, int revents);
419
420LWS_VISIBLE LWS_EXTERN int
421lws_uv_sigint_cfg(struct lws_context *context, int use_uv_sigint,
422 lws_uv_signal_cb_t *cb);
423
424LWS_VISIBLE LWS_EXTERN int
425lws_uv_initloop(struct lws_context *context, uv_loop_t *loop, int tsi);
426
427LWS_VISIBLE void
428lws_uv_sigint_cb(uv_loop_t *loop, uv_signal_t *watcher, int revents);
429
430and CMAKE option
431
432LWS_WITH_LIBUV
433
Danomi Czaski4e9c7f32016-01-28 09:40:53 +0800434
Andy Green3246ebb2015-12-26 12:03:06 +0800435User api changes
436----------------
437
4381) LWS_SEND_BUFFER_POST_PADDING is now 0 and deprecated. You can remove it; if
439you still use it, obviously it does nothing. Old binary code with nonzero
440LWS_SEND_BUFFER_POST_PADDING is perfectly compatible, the old code just
Andy Green5b85e392015-12-26 13:23:11 +0800441allocated a buffer bigger than the library is going to use.
Andy Green3246ebb2015-12-26 12:03:06 +0800442
Andy Green5b85e392015-12-26 13:23:11 +0800443The example apps no longer use LWS_SEND_BUFFER_POST_PADDING.
Andy Green3246ebb2015-12-26 12:03:06 +0800444
Andy Green4e2ac762015-12-26 20:26:11 +0800445The only path who made use of it was sending with LWS_WRITE_CLOSE --->
Andy Green3246ebb2015-12-26 12:03:06 +0800446
Andy Green1fb95e82015-12-26 17:20:34 +08004472) Because of lws_close_reason() formalizing handling close frames,
448LWS_WRITE_CLOSE is removed from libwebsockets.h. It was only of use to send
449close frames...close frame content should be managed using lws_close_reason()
450now.
451
Andy Green44a7f652015-12-29 11:20:09 +08004523) We check for invalid CLOSE codes and complain about protocol violation in
453our close code. But it changes little since we were in the middle of closing
454anyway.
455
4564) zero-length RX frames and zero length TX frames are now allowed.
457
4585) Pings and close used to be limited to 124 bytes, the correct limit is 125
459so that is now also allowed.
Andy Green3246ebb2015-12-26 12:03:06 +0800460
Steffen Vogelf9267172016-02-09 07:19:15 +01004616) LWS_PRE is provided as a synonym for LWS_SEND_BUFFER_PRE_PADDING, either is
Andy Green67112662016-01-11 11:34:01 +0800462valid to use now.
463
4647) There's generic support for RFC7462 style extension options built into the
465library now. As a consequence, a field "options" is added to lws_extension.
466It can be NULL if there are no options on the extension. Extension internal
467info is part of the public abi because extensions may be implemented outside
468the library.
469
Danomi Czaski4e9c7f32016-01-28 09:40:53 +08004708) WSI_TOKEN_PROXY enum was accidentally defined to collide with another token
471of value 73. That's now corrected and WSI_TOKEN_PROXY moved to his own place at
47277.
473
Andy Green86ed65f2016-02-14 09:27:41 +08004749) With the addition of libuv support, libev is not the only event loop
475library in town and his api names must be elaborated with _ev_
476
477 Callback typedef: lws_signal_cb ---> lws_ev_signal_cb_t
478 lws_sigint_cfg --> lws_ev_sigint_cfg
479 lws_initloop --> lws_ev_initloop
480 lws_sigint_cb --> lws_ev_sigint_cb
481
48210) Libev support is made compatible with multithreaded service,
483lws_ev_initloop (was lws_initloop) gets an extra argument for the
484thread service index (use 0 if you will just have 1 service thread).
485
486LWS_VISIBLE LWS_EXTERN int
Andy Greenff696482016-02-17 07:46:27 +0800487lws_ev_initloop(struct lws_context *context, ev_loop_t *loop, int tsi);
Andy Green86ed65f2016-02-14 09:27:41 +0800488
Andy Green3df58002015-12-25 12:44:12 +0800489
Andy Green9e8d1482015-12-18 11:01:03 +0800490v1.6.0-chrome48-firefox42
491=======================
492
493Major API improvements
494----------------------
495
496v1.6.0 has many cleanups and improvements in the API. Although at first it
497looks pretty drastic, user code will only need four actions to update it.
498
499 - Do the three search/replaces in your user code, /libwebsocket_/lws_/,
500 /libwebsockets_/lws_/, and /struct\ libwebsocket/struct\ lws/
501
502 - Remove the context parameter from your user callbacks
503
504 - Remove context as the first parameter from the "Eleven APIS" listed in the
505 User Api Changes section
506
507 - Add lws_get_context(wsi) as the first parameter on the "Three APIS" listed
508 in the User Api Changes section, and anywhere else you still need context
509
510That's it... generally only a handful of the 14 affected APIs are actually in
511use in your user code and you can find them quickest by compiling and visiting
512the errors each in turn. And the end results are much cleaner, more
513predictable and maintainable.
514
515
Andy Green4e442b72015-12-10 07:58:58 +0800516User api additions
517------------------
518
Andy Green3f628702015-12-14 07:16:32 +08005191) lws now exposes his internal platform file abstraction in a way that can be
Andy Green4e442b72015-12-10 07:58:58 +0800520both used by user code to make it platform-agnostic, and be overridden or
521subclassed by user code. This allows things like handling the URI "directory
522space" as a virtual filesystem that may or may not be backed by a regular
523filesystem. One example use is serving files from inside large compressed
524archive storage without having to unpack anything except the file being
525requested.
526
527The test server shows how to use it, basically the platform-specific part of
528lws prepares a file operations structure that lives in the lws context.
529
Andy Green3f599962015-12-14 07:21:42 +0800530Helpers are provided to also leverage these platform-independent file handling
531apis
Andy Green4e442b72015-12-10 07:58:58 +0800532
533static inline lws_filefd_type
Andy Green3f599962015-12-14 07:21:42 +0800534lws_plat_file_open(struct lws *wsi, const char *filename,
Andy Green4e442b72015-12-10 07:58:58 +0800535 unsigned long *filelen, int flags)
Andy Green4e442b72015-12-10 07:58:58 +0800536static inline int
Andy Green3f599962015-12-14 07:21:42 +0800537lws_plat_file_close(struct lws *wsi, lws_filefd_type fd)
Andy Green4e442b72015-12-10 07:58:58 +0800538
539static inline unsigned long
Andy Green3f599962015-12-14 07:21:42 +0800540lws_plat_file_seek_cur(struct lws *wsi, lws_filefd_type fd, long offset)
Andy Green4e442b72015-12-10 07:58:58 +0800541
542static inline int
Andy Green3f599962015-12-14 07:21:42 +0800543lws_plat_file_read(struct lws *wsi, lws_filefd_type fd, unsigned long *amount,
544 unsigned char *buf, unsigned long len)
Andy Green4e442b72015-12-10 07:58:58 +0800545
546static inline int
Andy Green3f599962015-12-14 07:21:42 +0800547lws_plat_file_write(struct lws *wsi, lws_filefd_type fd, unsigned long *amount,
548 unsigned char *buf, unsigned long len)
Andy Green4e442b72015-12-10 07:58:58 +0800549
550The user code can also override or subclass the file operations, to either
551wrap or replace them. An example is shown in test server.
552
Andy Green3f599962015-12-14 07:21:42 +0800553A wsi can be associated with the file activity, allowing per-connection
554authentication and state to be used when interpreting the file request.
555
Andy Green3f628702015-12-14 07:16:32 +08005562) A new API void * lws_wsi_user(struct lws *wsi) lets you get the pointer to
557the user data associated with the wsi, just from the wsi.
558
Andy Green9e8d1482015-12-18 11:01:03 +08005593) URI argument handling. Libwebsockets parses and protects URI arguments
560like test.html?arg1=1&arg2=2, it decodes %xx uriencoding format and reduces
561path attacks like ../.../../etc/passwd so they cannot go behind the web
562server's /. There is a list of confirmed attacks we're proof against in
563./test-server/attack.sh.
564
565There is a new API lws_hdr_copy_fragment that should be used now to access
566the URI arguments (it returns the fragments length)
567
568 while (lws_hdr_copy_fragment(wsi, buf, sizeof(buf),
569 WSI_TOKEN_HTTP_URI_ARGS, n) > 0) {
570 lwsl_info("URI Arg %d: %s\n", ++n, buf);
571 }
572
573For the example above, calling with n=0 will return "arg1=1" and n=1 "arg2=2".
574All legal uriencodings will have been reduced in those strings.
575
576lws_hdr_copy_fragment() returns the length of the x=y fragment, so it's also
577possible to deal with arguments containing %00. If you don't care about that,
578the returned string has '\0' appended to simplify processing.
579
Andy Green4e442b72015-12-10 07:58:58 +0800580
Andy Green6d417202015-12-04 10:39:23 +0800581User api changes
582----------------
583
Andy Green1a366bf2015-12-14 07:02:51 +08005841) Three APIS
585
586 - lws_callback_on_writable_all_protocol(const struct lws_protocols *protocol)
587 - lws_callback_all_protocol(const struct lws_protocols *protocol)
588 - lws_rx_flow_allow_all_protocol(lws_rx_flow_allow_all_protocol)
589
590Now take an additional pointer to the lws_context in their first argument.
591
592The reason for this change is struct lws_protocols has been changed to remove
593members that lws used for private storage: so the protocols struct in now
594truly const and may be reused serially or simultaneously by different contexts.
595
Andy Green11c05bf2015-12-16 18:19:08 +08005962) Eleven APIs
597
598LWS_VISIBLE LWS_EXTERN int
599lws_add_http_header_by_name(struct lws_context *context,
600 struct lws *wsi,
601 const unsigned char *name,
602 const unsigned char *value,
603 int length,
604 unsigned char **p,
605 unsigned char *end);
606LWS_VISIBLE LWS_EXTERN int
607lws_finalize_http_header(struct lws_context *context,
608 struct lws *wsi,
609 unsigned char **p,
610 unsigned char *end);
611LWS_VISIBLE LWS_EXTERN int
612lws_add_http_header_by_token(struct lws_context *context,
613 struct lws *wsi,
614 enum lws_token_indexes token,
615 const unsigned char *value,
616 int length,
617 unsigned char **p,
618 unsigned char *end);
619LWS_VISIBLE LWS_EXTERN int
620lws_add_http_header_content_length(struct lws_context *context,
621 struct lws *wsi,
622 unsigned long content_length,
623 unsigned char **p,
624 unsigned char *end);
625LWS_VISIBLE LWS_EXTERN int
626lws_add_http_header_status(struct lws_context *context, struct lws *wsi,
627 unsigned int code, unsigned char **p,
628 unsigned char *end);
629
630LWS_VISIBLE LWS_EXTERN int
631lws_serve_http_file(struct lws_context *context, struct lws *wsi,
632 const char *file, const char *content_type,
633 const char *other_headers, int other_headers_len);
634LWS_VISIBLE LWS_EXTERN int
635lws_serve_http_file_fragment(struct lws_context *context, struct lws *wsi);
636
637LWS_VISIBLE LWS_EXTERN int
638lws_return_http_status(struct lws_context *context, struct lws *wsi,
639 unsigned int code, const char *html_body);
640
641LWS_VISIBLE LWS_EXTERN int
642lws_callback_on_writable(const struct lws_context *context, struct lws *wsi);
643
644LWS_VISIBLE LWS_EXTERN void
645lws_get_peer_addresses(struct lws_context *context, struct lws *wsi,
646 lws_sockfd_type fd, char *name, int name_len,
647 char *rip, int rip_len);
648
649LWS_VISIBLE LWS_EXTERN int
650lws_read(struct lws_context *context, struct lws *wsi,
651 unsigned char *buf, size_t len);
652
653no longer require their initial struct lws_context * parameter.
654
6553) Several older apis start with libwebsocket_ or libwebsockets_ while newer ones
Andy Green6d417202015-12-04 10:39:23 +0800656all begin lws_. These apis have been changed to all begin with lws_.
657
Andy Green11c05bf2015-12-16 18:19:08 +0800658To convert, search-replace
Andy Green6d417202015-12-04 10:39:23 +0800659
Andy Green11c05bf2015-12-16 18:19:08 +0800660 - libwebsockets_/lws_
661 - libwebsocket_/lws_
662 - struct\ libwebsocket/struct\ lws
Andy Green00c6d152015-12-17 07:54:44 +0800663
6644) context parameter removed from user callback.
665
666Since almost all apis no longer need the context as a parameter, it's no longer
667provided at the user callback directly.
668
669However if you need it, for ALL callbacks wsi is valid and has a valid context
Andy Green6d645392015-12-17 18:25:25 +0800670pointer you can recover using lws_get_context(wsi).
Andy Green6d417202015-12-04 10:39:23 +0800671
672
Andy Greenab620ff2015-10-28 08:39:09 +0800673v1.5-chrome47-firefox41
674=======================
MGadkari020c53c2015-08-21 16:15:36 +0530675
676User api changes
677----------------
678
679LWS_CALLBACK_CLIENT_CONNECTION_ERROR may provide an error string if in is
680non-NULL. If so, the string has length len.
681
Andy Green6d59f592015-10-15 09:12:58 +0800682LWS_SERVER_OPTION_PEER_CERT_NOT_REQUIRED is available to relax the requirement
683for peer certs if you are using the option to require client certs.
684
Andy Green4c79ee72015-10-15 11:20:40 +0800685LWS_WITHOUT_BUILTIN_SHA1 cmake option forces lws to use SHA1() defined
686externally, eg, byOpenSSL, and disables build of libwebsockets_SHA1()
687
688
Andy Green16fb0132015-03-28 11:35:40 +0800689v1.4-chrome43-firefox36
690=======================
Olehfaeac3c2014-07-29 23:18:41 +0800691
692User api additions
693------------------
694
695There's a new member in the info struct used to control context creation,
696ssl_private_key_password, which allows passing into lws the passphrase on
697an SSL cetificate
698
Andy Greeneabed8d2014-08-11 12:11:36 +0800699There's a new member in struct protocols, id, which is ignored by lws but can
700be used by the user code to mark the selected protocol by user-defined version
701or capabliity flag information, for the case multiple versions of a protocol are
702supported.
703
Andy Greenb128ccc2014-08-16 09:54:27 +0800704int lws_is_ssl(wsi) added to allow user code to know if the connection was made
705over ssl or not. If LWS_SERVER_OPTION_ALLOW_NON_SSL_ON_SSL_PORT is used, both
706ssl and non-ssl connections are possible and may need to be treated differently
707in the user code.
708
Andy Green14425ea2014-08-18 22:49:39 +0800709int lws_partial_buffered(wsi) added... should be checked after any
710libwebsocket_write that will be followed by another libwebsocket_write inside
711the same writeable callback. If set, you can't do any more writes until the
712writeable callback is called again. If you only do one write per writeable callback,
713you can ignore this.
714
Andy Green917f43a2014-10-12 14:31:47 +0800715HTTP2-related: HTTP2 changes how headers are handled, lws now has new version-
716agnositic header creation APIs. These do the right thing depending on each
717connection's HTTP version without the user code having to know or care, except
718to make sure to use the new APIs for headers (test-server is updated to use
719them already, so look there for examples)
720
721The APIs "render" the headers into a user-provided buffer and bump *p as it
722is used. If *p reaches end, then the APIs return nonzero for error.
723
724LWS_VISIBLE LWS_EXTERN int
725lws_add_http_header_status(struct libwebsocket_context *context,
726 struct libwebsocket *wsi,
727 unsigned int code,
728 unsigned char **p,
729 unsigned char *end);
730
731Start a response header reporting status like 200, 500, etc
732
733LWS_VISIBLE LWS_EXTERN int
734lws_add_http_header_by_name(struct libwebsocket_context *context,
735 struct libwebsocket *wsi,
736 const unsigned char *name,
737 const unsigned char *value,
738 int length,
739 unsigned char **p,
740 unsigned char *end);
741
742Add a header like name: value in HTTP1.x
743
744LWS_VISIBLE LWS_EXTERN int
745lws_finalize_http_header(struct libwebsocket_context *context,
746 struct libwebsocket *wsi,
747 unsigned char **p,
748 unsigned char *end);
749
750Finish off the headers, like add the extra \r\n in HTTP1.x
751
752LWS_VISIBLE LWS_EXTERN int
753lws_add_http_header_by_token(struct libwebsocket_context *context,
754 struct libwebsocket *wsi,
755 enum lws_token_indexes token,
756 const unsigned char *value,
757 int length,
758 unsigned char **p,
759 unsigned char *end);
760
761Add a header by using a lws token as the name part. In HTTP2, this can be
762compressed to one or two bytes.
763
Olehfaeac3c2014-07-29 23:18:41 +0800764
Andy Green822241c2014-08-18 22:21:51 +0800765User api removal
766----------------
767
768protocols struct member no_buffer_all_partial_tx is removed. Under some
Peter Pentchevbb085da2015-12-03 15:55:11 +0200769conditions like rewriting extension such as compression in use, the built-in
Andy Green822241c2014-08-18 22:21:51 +0800770partial send buffering is the only way to deal with the problem, so turning
771it off is deprecated.
772
773
Andy Green917f43a2014-10-12 14:31:47 +0800774User api changes
775----------------
776
777HTTP2-related: API libwebsockets_serve_http_file() takes an extra parameter at
778the end now
779
780int other_headers_len)
781
782If you are providing other headers, they must be generated using the new
783HTTP-version-agnostic APIs, and you must provide the length of them using this
784additional parameter.
785
joseph.urciuoli4d9c8fc2014-10-16 08:53:19 +0800786struct lws_context_creation_info now has an additional member
787SSL_CTX *provided_client_ssl_ctx you may set to an externally-initialized
788SSL_CTX managed outside lws. Defaulting to zero keeps the existing behaviour of
789lws managing the context, if you memset the struct to 0 or have as a filescope
790initialized struct in bss, no need to change anything.
791
Andy Green822241c2014-08-18 22:21:51 +0800792
Andy Greenc1fdd102014-07-06 09:56:11 +0800793v1.3-chrome37-firefox30
794=======================
795
796 .gitignore | 1 -
797 CMakeLists.txt | 447 +++--
798 README.build | 35 +-
799 README.coding | 14 +
800 changelog | 66 +
801 cmake/LibwebsocketsConfig.cmake.in | 17 +
802 cmake/LibwebsocketsConfigVersion.cmake.in | 11 +
803 config.h.cmake | 18 +
804 cross-ming.cmake | 31 +
805 cross-openwrt-makefile | 91 +
806 lib/client-handshake.c | 205 ++-
807 lib/client-parser.c | 58 +-
808 lib/client.c | 158 +-
809 lib/context.c | 341 ++++
810 lib/extension-deflate-frame.c | 2 +-
811 lib/extension.c | 178 ++
812 lib/handshake.c | 287 +---
813 lib/lextable.h | 338 ++++
814 lib/libev.c | 175 ++
815 lib/libwebsockets.c | 2089 +++--------------------
816 lib/libwebsockets.h | 253 ++-
817 lib/lws-plat-unix.c | 404 +++++
818 lib/lws-plat-win.c | 358 ++++
819 lib/minilex.c | 530 +++---
820 lib/output.c | 445 ++---
821 lib/parsers.c | 682 ++++----
822 lib/pollfd.c | 239 +++
823 lib/private-libwebsockets.h | 501 +++++-
824 lib/server-handshake.c | 274 +--
825 lib/server.c | 858 ++++++++--
826 lib/service.c | 517 ++++++
827 lib/sha-1.c | 38 +-
828 lib/ssl-http2.c | 78 +
829 lib/ssl.c | 571 +++++++
830 test-server/attack.sh | 101 +-
831 test-server/test-client.c | 9 +-
832 test-server/test-echo.c | 17 +-
833 test-server/test-fraggle.c | 7 -
834 test-server/test-ping.c | 12 +-
835 test-server/test-server.c | 330 ++--
836 test-server/test.html | 4 +-
837 win32port/client/client.vcxproj | 259 ---
838 win32port/client/client.vcxproj.filters | 39 -
839 .../libwebsocketswin32.vcxproj.filters | 93 -
840 win32port/server/server.vcxproj | 276 ---
841 win32port/server/server.vcxproj.filters | 51 -
842 win32port/win32helpers/gettimeofday.h | 59 +-
843 win32port/win32helpers/netdb.h | 1 -
844 win32port/win32helpers/strings.h | 0
845 win32port/win32helpers/sys/time.h | 1 -
846 win32port/win32helpers/unistd.h | 0
847 win32port/win32helpers/websock-w32.c | 104 --
848 win32port/win32helpers/websock-w32.h | 62 -
849 win32port/win32port.sln | 100 --
850 win32port/zlib/gzio.c | 3 +-
851 55 files changed, 6779 insertions(+), 5059 deletions(-)
852
Andy Green79002562013-11-09 11:04:35 +0800853
kapejodce64fb02013-11-19 13:38:16 +0100854User api additions
855------------------
856
857POST method is supported
858
859The protocol 0 / HTTP callback can now get two new kinds of callback,
860LWS_CALLBACK_HTTP_BODY (in and len are a chunk of the body of the HTTP request)
861and LWS_CALLBACK_HTTP_BODY_COMPLETION (the expected amount of body has arrived
862and been passed to the user code already). These callbacks are used with the
863post method (see the test server for details).
864
865The period between the HTTP header completion and the completion of the body
866processing is protected by a 5s timeout.
867
868The chunks are stored in a malloc'd buffer of size protocols[0].rx_buffer_size.
869
870
James Devine5b34c972013-12-14 11:41:29 +0800871New server option you can enable from user code
872LWS_SERVER_OPTION_ALLOW_NON_SSL_ON_SSL_PORT allows non-SSL connections to
873also be accepted on an SSL listening port. It's disabled unless you enable
874it explicitly.
875
876
Andy Green7a132792013-12-18 09:48:26 +0800877Two new callbacks are added in protocols[0] that are optional for allowing
878limited thread access to libwebsockets, LWS_CALLBACK_LOCK_POLL and
879LWS_CALLBACK_UNLOCK_POLL.
880
881If you use them, they protect internal and external poll list changes, but if
882you want to use external thread access to libwebsocket_callback_on_writable()
883you have to implement your locking here even if you don't use external
884poll support.
885
886If you will use another thread for this, take a lot of care about managing
887your list of live wsi by doing it from ESTABLISHED and CLOSED callbacks
888(with your own locking).
889
Andrew Canaday9769f4f2014-03-23 13:25:07 +0800890If you configure cmake with -DLWS_WITH_LIBEV=1 then the code allowing the libev
891eventloop instead of the default poll() one will also be compiled in. But to
892use it, you must also set the LWS_SERVER_OPTION_LIBEV flag on the context
893creation info struct options member.
Andy Green7a132792013-12-18 09:48:26 +0800894
Andy Greenc1fdd102014-07-06 09:56:11 +0800895IPV6 is supported and enabled by default except for Windows, you can disable
896the support at build-time by giving -DLWS_IPV6=, and disable use of it even if
James Devine3f13ea22014-03-24 16:09:25 +0800897compiled in by making sure the flag LWS_SERVER_OPTION_DISABLE_IPV6 is set on
898the context creation info struct options member.
899
Andy Greenc1fdd102014-07-06 09:56:11 +0800900You can give LWS_SERVER_OPTION_DISABLE_OS_CA_CERTS option flag to
901guarantee the OS CAs will not be used, even if that support was selected at
902build-time.
903
904Optional "token limits" may be enforced by setting the member "token_limits"
905in struct lws_context_creation_info to point to a struct lws_token_limits.
906NULL means no token limits used for compatibility.
907
Andy Green7a132792013-12-18 09:48:26 +0800908
Andy Green79002562013-11-09 11:04:35 +0800909User api changes
910----------------
911
912Extra optional argument to libwebsockets_serve_http_file() allows injecion
913of HTTP headers into the canned response. Eg, cookies may be added like
914that without getting involved in having to send the header by hand.
915
Patrick Gansterer148b9452014-02-28 02:31:23 +0100916A new info member http_proxy_address may be used at context creation time to
917set the http proxy. If non-NULL, it overrides http_proxy environment var.
Andy Green79002562013-11-09 11:04:35 +0800918
Andy Greend2ec7ad2014-03-15 10:39:29 +0800919Cmake supports LWS_SSL_CLIENT_USE_OS_CA_CERTS defaulting to on, which gets
920the client to use the OS CA Roots. If you're worried somebody with the
921ability to forge for force creation of a client cert from the root CA in
922your OS, you should disable this since your selfsigned $0 cert is a lot safer
923then...
924
Andy Green79002562013-11-09 11:04:35 +0800925
Andy Green81877e62013-10-26 20:36:08 +0800926v1.23-chrome32-firefox24
927========================
928
929 Android.mk | 29 +
930 CMakeLists.txt | 573 ++++++++----
931 COPYING | 503 -----------
932 INSTALL | 365 --------
933 Makefile.am | 13 -
934 README.build | 371 ++------
935 README.coding | 63 ++
936 autogen.sh | 1578 ---------------------------------
937 changelog | 69 ++
938 cmake/FindGit.cmake | 163 ++++
939 cmake/FindOpenSSLbins.cmake | 15 +-
940 cmake/UseRPMTools.cmake | 176 ++++
941 config.h.cmake | 25 +-
942 configure.ac | 226 -----
943 cross-arm-linux-gnueabihf.cmake | 28 +
944 lib/Makefile.am | 89 --
945 lib/base64-decode.c | 98 +-
946 lib/client-handshake.c | 123 ++-
947 lib/client-parser.c | 19 +-
948 lib/client.c | 145 ++-
949 lib/daemonize.c | 4 +-
950 lib/extension.c | 2 +-
951 lib/getifaddrs.h | 4 +-
952 lib/handshake.c | 76 +-
953 lib/libwebsockets.c | 491 ++++++----
954 lib/libwebsockets.h | 164 ++--
955 lib/output.c | 214 ++++-
956 lib/parsers.c | 102 +--
957 lib/private-libwebsockets.h | 66 +-
958 lib/server-handshake.c | 5 +-
959 lib/server.c | 29 +-
960 lib/sha-1.c | 2 +-
961 libwebsockets-api-doc.html | 249 +++---
962 libwebsockets.pc.in | 11 -
963 libwebsockets.spec | 14 +-
964 m4/ignore-me | 2 -
965 scripts/FindLibWebSockets.cmake | 33 +
966 scripts/kernel-doc | 1 +
967 test-server/Makefile.am | 131 ---
968 test-server/leaf.jpg | Bin 0 -> 2477518 bytes
969 test-server/test-client.c | 78 +-
970 test-server/test-echo.c | 33 +-
971 test-server/test-fraggle.c | 26 +-
972 test-server/test-ping.c | 15 +-
973 test-server/test-server.c | 197 +++-
974 test-server/test.html | 5 +-
975 win32port/win32helpers/gettimeofday.c | 74 +-
976 win32port/win32helpers/websock-w32.h | 6 +-
977 48 files changed, 2493 insertions(+), 4212 deletions(-)
978
Andy Green54cb3462013-02-14 22:23:54 +0800979
980User api additions
981------------------
982
983 - You can now call libwebsocket_callback_on_writable() on http connectons,
984 and get a LWS_CALLBACK_HTTP_WRITEABLE callback, the same way you can
985 regulate writes with a websocket protocol connection.
986
Andy Green2672fb22013-02-22 09:54:35 +0800987 - A new member in the context creation parameter struct "ssl_cipher_list" is
988 added, replacing CIPHERS_LIST_STRING. NULL means use the ssl library
989 default list of ciphers.
990
Andy Green58f214e2013-03-09 13:03:53 +0800991 - Not really an api addition, but libwebsocket_service_fd() will now zero
992 the revents field of the pollfd it was called with if it handled the
993 descriptor. So you can tell if it is a non-lws fd by checking revents
994 after the service call... if it's still nonzero, the descriptor
995 belongs to you and you need to take care of it.
996
Andy Greenb55451c2013-03-16 12:32:27 +0800997 - libwebsocket_rx_flow_allow_all_protocol(protocol) will unthrottle all
998 connections with the established protocol. It's designed to be
999 called from user server code when it sees it can accept more input
1000 and may have throttled connections using the server rx flow apis
1001 while it was unable to accept any other input The user server code
1002 then does not have to try to track while connections it choked, this
1003 will free up all of them in one call.
1004
Andy Green0c9563b2013-06-10 22:54:40 +08001005 - there's a new, optional callback LWS_CALLBACK_CLOSED_HTTP which gets
1006 called when an HTTP protocol socket closes
1007
Andy Green96d48fd2013-09-18 08:32:55 +08001008 - for LWS_CALLBACK_FILTER_PROTOCOL_CONNECTION callback, the user_space alloc
1009 has already been done before the callback happens. That means we can
1010 use the user parameter to the callback to contain the user pointer, and
1011 move the protocol name to the "in" parameter. The docs for this
1012 callback are also updated to reflect how to check headers in there.
1013
Andy Green5dc62ea2013-09-20 20:26:12 +08001014 - libwebsocket_client_connect() is now properly nonblocking and async. See
1015 README.coding and test-client.c for information on the callbacks you
1016 can rely on controlling the async connection period with.
1017
Andy Green81877e62013-10-26 20:36:08 +08001018 - if your OS does not support the http_proxy environment variable convention
1019 (eg, reportedly OSX), you can use a new api libwebsocket_set_proxy()
Peter Pentchevbb085da2015-12-03 15:55:11 +02001020 to set the proxy details in between context creation and the connection
Andy Green81877e62013-10-26 20:36:08 +08001021 action. For OSes that support http_proxy, that's used automatically.
Andy Greenb55451c2013-03-16 12:32:27 +08001022
Andy Green50097dd2013-02-15 22:36:30 +08001023User api changes
1024----------------
1025
1026 - the external poll callbacks now get the socket descriptor coming from the
1027 "in" parameter. The user parameter provides the user_space for the
1028 wsi as it normally does on the other callbacks.
Edwin van den Oetelaar8c8a8e12013-02-20 20:56:59 +08001029 LWS_CALLBACK_FILTER_NETWORK_CONNECTION also has the socket descriptor
1030 delivered by @in now instead of @user.
Andy Green50097dd2013-02-15 22:36:30 +08001031
Andy Greenfc7c5e42013-02-23 10:50:10 +08001032 - libwebsocket_write() now returns -1 for error, or the amount of data
1033 actually accepted for send. Under load, the OS may signal it is
1034 ready to send new data on the socket, but have only a restricted
1035 amount of memory to buffer the packet compared to usual.
1036
Andy Green50097dd2013-02-15 22:36:30 +08001037
Andy Greendc914cf2013-02-18 16:54:26 +08001038User api removal
1039----------------
1040
1041 - libwebsocket_ensure_user_space() is removed from the public api, if you
1042 were using it to get user_space, you need to adapt your code to only
1043 use user_space inside the user callback.
1044
Andy Green2672fb22013-02-22 09:54:35 +08001045 - CIPHERS_LIST_STRING is removed
1046
Andy Green0097a992013-03-09 13:06:37 +08001047 - autotools build has been removed. See README.build for info on how to
1048 use CMake for your platform
1049
Andy Green54cb3462013-02-14 22:23:54 +08001050
Andy Green53a46782013-02-14 11:23:49 +08001051v1.21-chrome26-firefox18
1052========================
1053
1054 - Fixes buffer overflow bug in max frame size handling if you used the
1055 default protocol buffer size. If you declared rx_buffer_size in your
1056 protocol, which is recommended anyway, your code was unaffected.
1057
Andy Green182cb9a2013-02-13 11:54:08 +08001058v1.2-chrome26-firefox18
1059=======================
1060
1061Diffstat
1062--------
1063
1064 .gitignore | 16 +++
1065 CMakeLists.txt | 544 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1066 LICENSE | 526 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1067 Makefile.am | 1 +
1068 README | 20 +++
1069 README.build | 258 ++++++++++++++++++++++++++++++++-----
1070 README.coding | 52 ++++++++
1071 changelog | 136 ++++++++++++++++++++
1072 cmake/FindOpenSSLbins.cmake | 33 +++++
1073 config.h.cmake | 173 +++++++++++++++++++++++++
1074 configure.ac | 22 +++-
1075 lib/Makefile.am | 20 ++-
1076 lib/base64-decode.c | 2 +-
1077 lib/client-handshake.c | 190 +++++++++++-----------------
1078 lib/client-parser.c | 88 +++++++------
1079 lib/client.c | 384 ++++++++++++++++++++++++++++++-------------------------
1080 lib/daemonize.c | 32 +++--
1081 lib/extension-deflate-frame.c | 58 +++++----
1082 lib/extension-deflate-stream.c | 19 ++-
1083 lib/extension-deflate-stream.h | 4 +-
1084 lib/extension.c | 11 +-
1085 lib/getifaddrs.c | 315 +++++++++++++++++++++++-----------------------
1086 lib/getifaddrs.h | 30 ++---
1087 lib/handshake.c | 124 +++++++++++-------
1088 lib/libwebsockets.c | 736 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--------------------------------------
1089 lib/libwebsockets.h | 237 ++++++++++++++++++++++------------
1090 lib/output.c | 192 +++++++++++-----------------
1091 lib/parsers.c | 966 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----------------------------------------------------------------
1092 lib/private-libwebsockets.h | 225 +++++++++++++++++++++------------
1093 lib/server-handshake.c | 82 ++++++------
1094 lib/server.c | 96 +++++++-------
1095 libwebsockets-api-doc.html | 189 ++++++++++++++++++----------
1096 libwebsockets.spec | 17 +--
1097 test-server/attack.sh | 148 ++++++++++++++++++++++
1098 test-server/test-client.c | 125 +++++++++---------
1099 test-server/test-echo.c | 31 +++--
1100 test-server/test-fraggle.c | 32 ++---
1101 test-server/test-ping.c | 52 ++++----
1102 test-server/test-server.c | 129 ++++++++++++-------
1103 win32port/libwebsocketswin32/libwebsocketswin32.vcxproj | 279 ----------------------------------------
1104 win32port/libwebsocketswin32/libwebsocketswin32.vcxproj.filters | 23 +++-
1105 41 files changed, 4398 insertions(+), 2219 deletions(-)
1106
Andy Green7b405452013-02-01 10:50:15 +08001107
1108User api additions
1109------------------
1110
1111 - lws_get_library_version() returns a const char * with a string like
1112 "1.1 9e7f737", representing the library version from configure.ac
1113 and the git HEAD hash the library was built from
1114
Andy Greena47865f2013-02-10 09:39:47 +08001115 - TCP Keepalive can now optionally be applied to all lws sockets, on Linux
1116 also with controllable timeout, number of probes and probe interval.
1117 (On BSD type OS, you can only use system default settings for the
1118 timing and retries, although enabling it is supported by setting
1119 ka_time to nonzero, the exact value has no meaning.)
1120 This enables detection of idle connections which are logically okay,
1121 but are in fact dead, due to network connectivity issues at the server,
Andy Greena690cd02013-02-09 12:25:31 +08001122 client, or any intermediary. By default it's not enabled, but you
1123 can enable it by setting a non-zero timeout (in seconds) at the new
1124 ka_time member at context creation time.
1125
Andy Greena7109e62013-02-11 12:05:54 +08001126 - Two new optional user callbacks added, LWS_CALLBACK_PROTOCOL_DESTROY which
1127 is called one-time per protocol as the context is being destroyed, and
1128 LWS_CALLBACK_PROTOCOL_INIT which is called when the context is created
1129 and the protocols are added, again it's a one-time affair.
1130 This lets you manage per-protocol allocations properly including
1131 cleaning up after yourself when the server goes down.
Andy Green7b405452013-02-01 10:50:15 +08001132
Andy Greened334462013-02-07 21:14:33 +08001133User api changes
1134----------------
1135
Andy Green1b265272013-02-09 14:01:09 +08001136 - libwebsocket_create_context() has changed from taking a ton of parameters
1137 to just taking a pointer to a struct containing the parameters. The
1138 struct lws_context_creation_info is in libwebsockets.h, the members
1139 are in the same order as when they were parameters to the call
1140 previously. The test apps are all updated accordingly so you can
1141 see example code there.
1142
Andy Greened334462013-02-07 21:14:33 +08001143 - Header tokens are now deleted after the websocket connection is
Andy Green54495112013-02-06 21:10:16 +09001144 established. Not just the header data is saved, but the pointer and
1145 length array is also removed from (union) scope saving several hundred
1146 bytes per connection once it is established
1147
1148 - struct libwebsocket_protocols has a new member rx_buffer_size, this
1149 controls rx buffer size per connection of that protocol now. Sources
1150 for apps built against older versions of the library won't declare
1151 this in their protocols, defaulting it to 0. Zero buffer is legal,
1152 it causes a default buffer to be allocated (currently 4096)
1153
1154 If you want to receive only atomic frames in your user callback, you
1155 should set this to greater than your largest frame size. If a frame
1156 comes that exceeds that, no error occurs but the callback happens as
1157 soon as the buffer limit is reached, and again if it is reached again
1158 or the frame completes. You can detect that has happened by seeing
1159 there is still frame content pending using
1160 libwebsockets_remaining_packet_payload()
1161
1162 By correctly setting this, you can save a lot of memory when your
1163 protocol has small frames (see the test server and client sources).
1164
Andy Green16ab3182013-02-10 18:02:31 +08001165 - LWS_MAX_HEADER_LEN now defaults to 1024 and is the total amount of known
1166 header payload lws can cope with, that includes the GET URL, origin
1167 etc. Headers not understood by lws are ignored and their payload
1168 not included in this.
1169
Andy Green54495112013-02-06 21:10:16 +09001170
1171User api removals
1172-----------------
1173
Andy Green16ab3182013-02-10 18:02:31 +08001174 - The configuration-time option MAX_USER_RX_BUFFER has been replaced by a
1175 buffer size chosen per-protocol. For compatibility, there's a default
1176 of 4096 rx buffer, but user code should set the appropriate size for
1177 the protocol frames.
1178
1179 - LWS_INITIAL_HDR_ALLOC and LWS_ADDITIONAL_HDR_ALLOC are no longer needed
1180 and have been removed. There's a new header management scheme that
1181 handles them in a much more compact way.
Andy Greened334462013-02-07 21:14:33 +08001182
Andy Green70edd6f2013-02-12 10:15:25 +08001183 - libwebsockets_hangup_on_client() is removed. If you want to close the
1184 connection you must do so from the user callback and by returning
1185 -1 from there.
1186
Andy Green508946c2013-02-12 10:19:08 +08001187 - libwebsocket_close_and_free_session() is now private to the library code
1188 only and not exposed for user code. If you want to close the
1189 connection, you must do so from the user callback by returning -1
1190 from there.
1191
Andy Greened334462013-02-07 21:14:33 +08001192
Andy Greendf60b0c2013-02-06 19:57:12 +09001193New features
1194------------
1195
Andy Green9b09dc02013-02-08 12:48:36 +08001196 - Cmake project file added, aimed initially at Windows support: this replaces
Andy Green16ab3182013-02-10 18:02:31 +08001197 the visual studio project files that were in the tree until now.
Andy Greendf60b0c2013-02-06 19:57:12 +09001198
Andy Greenc3ef0d62013-02-12 10:50:49 +08001199 - CyaSSL now supported in place of OpenSSL (--use-cyassl on configure)
1200
Andy Green9b09dc02013-02-08 12:48:36 +08001201 - PATH_MAX or MAX_PATH no longer needed
Andy Greendf60b0c2013-02-06 19:57:12 +09001202
Andy Green54495112013-02-06 21:10:16 +09001203 - cutomizable frame rx buffer size by protocol
1204
Andy Greenc3ef0d62013-02-12 10:50:49 +08001205 - optional TCP keepalive so dead peers can be detected, can be enabled at
1206 context-creation time
1207
1208 - valgrind-clean: no SSL or CyaSSL: completely clean. With OpenSSL, 88 bytes
1209 lost at OpenSSL library init and symptomless reports of uninitialized
1210 memory usage... seems to be a known and ignored problem at OpenSSL
1211
Andy Greena3957ef2013-02-11 09:31:43 +08001212 - By default debug is enabled and the library is built for -O0 -g to faclitate
1213 that. Use --disable-debug configure option to build instead with -O4
1214 and no -g (debug info), obviously providing best performance and
1215 reduced binary size.
Andy Green7b405452013-02-01 10:50:15 +08001216
Andy Green895d56d2013-02-11 09:32:53 +08001217 - 1.0 introduced some code to try to not deflate small frames, however this
1218 seems to break when confronted with a mixture of frames above and
1219 below the threshold, so it's removed. Veto the compression extension
1220 in your user callback if you will typically have very small frames.
1221
Andy Green16ab3182013-02-10 18:02:31 +08001222 - There are many memory usage improvements, both a reduction in malloc/
1223 realloc and architectural changes. A websocket connection now
1224 consumes only 296 bytes with SSL or 272 bytes without on x86_64,
1225 during header processing an additional 1262 bytes is allocated in a
1226 single malloc, but is freed when the websocket connection starts.
1227 The RX frame buffer defined by the protocol in user
1228 code is also allocated per connection, this represents the largest
1229 frame you can receive atomically in that protocol.
1230
Andy Greenc3ef0d62013-02-12 10:50:49 +08001231 - On ARM9 build, just http+ws server no extensions or ssl, <12Kbytes .text
1232 and 112 bytes per connection (+1328 only during header processing)
1233
Andy Green895d56d2013-02-11 09:32:53 +08001234
Andy Greenbd1132f2013-01-31 19:53:05 +08001235v1.1-chrome26-firefox18
Andy Greena35c86f2013-01-31 10:16:44 +08001236=======================
1237
1238Diffstat
1239--------
1240
1241 Makefile.am | 4 +
1242 README-test-server | 291 ---
1243 README.build | 239 ++
1244 README.coding | 138 ++
1245 README.rst | 72 -
1246 README.test-apps | 272 +++
1247 configure.ac | 116 +-
1248 lib/Makefile.am | 55 +-
1249 lib/base64-decode.c | 5 +-
1250 lib/client-handshake.c | 121 +-
1251 lib/client-parser.c | 394 ++++
1252 lib/client.c | 807 +++++++
1253 lib/daemonize.c | 212 ++
1254 lib/extension-deflate-frame.c | 132 +-
1255 lib/extension-deflate-stream.c | 12 +-
1256 lib/extension-x-google-mux.c | 1223 ----------
1257 lib/extension-x-google-mux.h | 96 -
1258 lib/extension.c | 8 -
1259 lib/getifaddrs.c | 271 +++
1260 lib/getifaddrs.h | 76 +
1261 lib/handshake.c | 582 +----
1262 lib/libwebsockets.c | 2493 ++++++---------------
1263 lib/libwebsockets.h | 115 +-
1264 lib/md5.c | 217 --
1265 lib/minilex.c | 440 ++++
1266 lib/output.c | 628 ++++++
1267 lib/parsers.c | 2016 +++++------------
1268 lib/private-libwebsockets.h | 284 +--
1269 lib/server-handshake.c | 275 +++
1270 lib/server.c | 377 ++++
1271 libwebsockets-api-doc.html | 300 +--
1272 m4/ignore-me | 2 +
1273 test-server/Makefile.am | 111 +-
1274 test-server/libwebsockets.org-logo.png | Bin 0 -> 7029 bytes
1275 test-server/test-client.c | 45 +-
1276 test-server/test-echo.c | 330 +++
1277 test-server/test-fraggle.c | 20 +-
1278 test-server/test-ping.c | 22 +-
1279 test-server/test-server-extpoll.c | 554 -----
1280 test-server/test-server.c | 349 ++-
1281 test-server/test.html | 3 +-
1282 win32port/zlib/ZLib.vcxproj | 749 ++++---
1283 win32port/zlib/ZLib.vcxproj.filters | 188 +-
1284 win32port/zlib/adler32.c | 348 ++-
1285 win32port/zlib/compress.c | 160 +-
1286 win32port/zlib/crc32.c | 867 ++++----
1287 win32port/zlib/crc32.h | 882 ++++----
1288 win32port/zlib/deflate.c | 3799 +++++++++++++++-----------------
1289 win32port/zlib/deflate.h | 688 +++---
1290 win32port/zlib/gzclose.c | 50 +-
1291 win32port/zlib/gzguts.h | 325 ++-
1292 win32port/zlib/gzlib.c | 1157 +++++-----
1293 win32port/zlib/gzread.c | 1242 ++++++-----
1294 win32port/zlib/gzwrite.c | 1096 +++++----
1295 win32port/zlib/infback.c | 1272 ++++++-----
1296 win32port/zlib/inffast.c | 680 +++---
1297 win32port/zlib/inffast.h | 22 +-
1298 win32port/zlib/inffixed.h | 188 +-
1299 win32port/zlib/inflate.c | 2976 +++++++++++++------------
1300 win32port/zlib/inflate.h | 244 +-
1301 win32port/zlib/inftrees.c | 636 +++---
1302 win32port/zlib/inftrees.h | 124 +-
1303 win32port/zlib/trees.c | 2468 +++++++++++----------
1304 win32port/zlib/trees.h | 256 +--
1305 win32port/zlib/uncompr.c | 118 +-
1306 win32port/zlib/zconf.h | 934 ++++----
1307 win32port/zlib/zlib.h | 3357 ++++++++++++++--------------
1308 win32port/zlib/zutil.c | 642 +++---
1309 win32port/zlib/zutil.h | 526 ++---
1310 69 files changed, 19556 insertions(+), 20145 deletions(-)
1311
1312user api changes
1313----------------
1314
1315 - libwebsockets_serve_http_file() now takes a context as first argument
1316
1317 - libwebsockets_get_peer_addresses() now takes a context and wsi as first
1318 two arguments
1319
1320
1321user api additions
1322------------------
1323
1324 - lwsl_...() logging apis, default to stderr but retargetable by user code;
1325 may be used also by user code
1326
1327 - lws_set_log_level() set which logging apis are able to emit (defaults to
1328 notice, warn, err severities), optionally set the emit callback
1329
1330 - lwsl_emit_syslog() helper callback emits to syslog
1331
1332 - lws_daemonize() helper code that forks the app into a headless daemon
1333 properly, maintains a lock file with pid in suitable for sysvinit etc to
1334 control lifecycle
1335
1336 - LWS_CALLBACK_HTTP_FILE_COMPLETION callback added since http file
1337 transfer is now asynchronous (see test server code)
1338
1339 - lws_frame_is_binary() from a wsi pointer, let you know if the received
1340 data was sent in BINARY mode
1341
1342
1343user api removals
1344-----------------
1345
1346 - libwebsockets_fork_service_loop() - no longer supported (had intractable problems)
1347 arrange your code to act from the user callback instead from same
1348 process context as the service loop
1349
1350 - libwebsockets_broadcast() - use libwebsocket_callback_on_writable[_all_protocol]()
1351 instead from same process context as the service loop. See the test apps
1352 for examples.
1353
1354 - x-google-mux() removed until someone wants it
1355
1356 - pre -v13 (ancient) protocol support removed
1357
1358
1359New features
1360------------
1361
1362 - echo test server and client compatible with echo.websocket.org added
1363
1364 - many new configure options (see README.build) to reduce footprint of the
1365 library to what you actually need, eg, --without-client and
1366 --without-server
1367
1368 - http + websocket server can build to as little as 12K .text for ARM
1369
1370 - no more MAX_CLIENTS limitation; adapts to support the max number of fds
1371 allowed to the process by ulimit, defaults to 1024 on Fedora and
1372 Ubuntu. Use ulimit to control this without needing to configure
1373 the library. Code here is smaller and faster.
1374
1375 - adaptive ratio of listen socket to connection socket service allows
1376 good behaviour under Apache ab test load. Tested with thousands
1377 of simultaneous connections
1378
1379 - reduction in per-connection memory footprint by moving to a union to hold
1380 mutually-exclusive state for the connection
1381
1382 - robustness: Out of Memory taken care of for all allocation code now
1383
1384 - internal getifaddrs option if your toolchain lacks it (some uclibc)
1385
1386 - configurable memory limit for deflate operations
1387
1388 - improvements in SSL code nonblocking operation, possible hang solved,
1389 some SSL operations broken down into pollable states so there is
1390 no library blocking, timeout coverage for SSL_connect
1391
1392 - extpoll test server merged into single test server source
1393
1394 - robustness: library should deal with all recoverable socket conditions
1395
1396 - rx flowcontrol for backpressure notification fixed and implmeneted
1397 correctly in the test server
1398
1399 - optimal lexical parser added for header processing; all headers in a
1400 single 276-byte state table
1401
1402 - latency tracking api added (configure --with-latency)
1403
1404 - Improved in-tree documentation, REAME.build, README.coding,
1405 README.test-apps, changelog
1406
1407 - Many small fixes
1408
1409
1410v1.0-chrome25-firefox17 (6cd1ea9b005933f)