Andy Green | a35c86f | 2013-01-31 10:16:44 +0800 | [diff] [blame] | 1 | Changelog |
| 2 | --------- |
| 3 | |
Andy Green | 0c3cc2e | 2016-02-20 09:12:52 +0800 | [diff] [blame] | 4 | Fixes |
| 5 | ----- |
| 6 | |
| 7 | 1) MAJOR (Windows-only) fix assert firing |
| 8 | |
| 9 | 2) MAJOR http:/1.1 connections handled by lws_return_http_status() did not |
| 10 | get sent a content-length resulting in the link hanging until the peer closed |
| 11 | it. attack.sh updated to add a test for this. |
| 12 | |
Andy Green | 26d4249 | 2016-02-24 12:40:21 +0800 | [diff] [blame] | 13 | 3) MINOR An error about hdr struct in _lws_ws_related is corrected, it's not |
| 14 | known to affect anything until after it was fixed |
| 15 | |
Andy Green | 5c0bcf4 | 2016-02-24 21:27:46 +0800 | [diff] [blame] | 16 | 4) MINOR During the close shutdown wait state introduced at v1.7, if something |
| 17 | requests callback on writeable for the socket it will busywait until the |
| 18 | socket closes |
| 19 | |
Andy Green | dbfbbb4 | 2016-02-24 20:58:19 +0800 | [diff] [blame] | 20 | 5) MAJOR Although the test server has done it for a few versions already, it |
| 21 | is now required for the user code to explicitly call |
| 22 | |
| 23 | if (lws_http_transaction_completed(wsi)) |
| 24 | return -1; |
| 25 | |
| 26 | when it finishes replying to a transaction in http. Previously the library |
| 27 | did it for you, but that disallowed large, long transfers with multiple |
| 28 | trips around the event loop (and cgi...). |
| 29 | |
Andy Green | 4ba798d | 2016-02-25 21:50:49 +0800 | [diff] [blame] | 30 | 6) MAJOR connections on ah waiting list that closed did not get removed from |
| 31 | the waiting list... |
| 32 | |
Andy Green | 83af28a | 2016-02-28 10:55:31 +0800 | [diff] [blame] | 33 | 7) MAJOR since we added the ability to hold an ah across http keepalive |
| 34 | transactions where more headers had already arrived, we broke the ability |
| 35 | to tell if more headers had arrived. Result was if the browser didn't |
| 36 | close the keepalive, we retained ah for the lifetime of the keepalive, |
| 37 | using up the pool. |
| 38 | |
Andy Green | 442e1c8 | 2016-02-29 10:10:42 +0800 | [diff] [blame] | 39 | 8) MAJOR windows-only-POLLHUP was not coming |
| 40 | |
Andy Green | 4f5ebec | 2016-03-09 23:13:31 +0800 | [diff] [blame] | 41 | 9) Client should not send ext hdr if no exts |
Andy Green | dbfbbb4 | 2016-02-24 20:58:19 +0800 | [diff] [blame] | 42 | |
Andy Green | 0c3cc2e | 2016-02-20 09:12:52 +0800 | [diff] [blame] | 43 | Changes |
| 44 | ------- |
| 45 | |
| 46 | 1) 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 | |
| 55 | together you can use them like this to have the test-server work with the |
| 56 | usual purchased SSL certs from an official CA. |
| 57 | |
| 58 | --ssl -C your.crt -K your.key -A your.cer -u 99 -g 99 |
| 59 | |
| 60 | 2) MINOR the OpenSSL magic to setup ECDH cipher usage is implemented in the |
| 61 | library, and the ciphers restricted to use ECDH only. |
| 62 | Using this, the lws test server can score an A at SSLLABS test |
| 63 | |
| 64 | 3) MINOR STS (SSL always) header is added to the test server if you use --ssl. With |
| 65 | that, we score A+ at SSLLABS test |
| 66 | |
| 67 | 4) MINOR daemonize function (disabled at cmake by default) is updated to work |
| 68 | with systemd |
| 69 | |
| 70 | 5) MINOR example systemd .service file now provided for test server |
| 71 | (not installed by default) |
| 72 | |
Andy Green | 0ad1a6e | 2016-02-20 14:05:55 +0800 | [diff] [blame] | 73 | 6) test server html is updated with tabs and a new live server monitoring |
| 74 | feature. Input sanitization added to the js. |
| 75 | |
Andy Green | 2d8d35a | 2016-02-29 14:19:16 +0800 | [diff] [blame] | 76 | 7) client connections attempted when no ah is free no longer fail, they are |
| 77 | just deferred until an ah becomes available. |
| 78 | |
Andy Green | a661ee5 | 2016-02-29 13:18:30 +0800 | [diff] [blame] | 79 | 8) The test client pays attention to if you give it an http:/ or https:// |
| 80 | protocol string to its argument in URL format. If so, it stays in http[s] |
| 81 | client mode and doesn't upgrade to ws[s], allowing you to do generic http client |
Andy Green | 5c8906e | 2016-03-13 16:44:19 +0800 | [diff] [blame] | 82 | operations. Receiving transfer-encoding: chunked is supported. |
Andy Green | a661ee5 | 2016-02-29 13:18:30 +0800 | [diff] [blame] | 83 | |
Andy Green | 1e5a9ad | 2016-03-20 11:59:53 +0800 | [diff] [blame] | 84 | 9) If you enable -DLWS_WITH_HTTP_PROXY=1 at cmake, the test server has a |
| 85 | new URI path http://localhost:7681/proxytest If you visit here, a client |
| 86 | connection to http://example.com:80 is spawned, and the results piped on |
| 87 | to your original connection. |
| 88 | |
| 89 | 10) Also with LWS_WITH_HTTP_PROXY enabled at cmake, lws wants to link to an |
| 90 | additional library, "libhubbub". This allows lws to do html rewriting on the |
| 91 | fly, adjusting proxied urls in a lightweight and fast way. |
Andy Green | fb5f33b | 2016-03-01 07:19:01 +0800 | [diff] [blame] | 92 | |
Andy Green | c6fd360 | 2016-03-23 09:22:11 +0800 | [diff] [blame^] | 93 | 11) There's a new context creation flag LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT, |
| 94 | this is included automatically if you give any other SSL-related option flag. |
| 95 | If you give no SSL-related option flag, nor this one directly, then even |
| 96 | though SSL support may be compiled in, it is never initialized nor used for the |
| 97 | whole lifetime of the lws context. |
| 98 | |
| 99 | Conversely in order to prepare the context to use SSL, even though, eg, you |
| 100 | are not listening on SSL but will use SSL client connections later, you must |
| 101 | give this flag explicitly to make sure SSL is initialized. |
| 102 | |
Andy Green | 2d8d35a | 2016-02-29 14:19:16 +0800 | [diff] [blame] | 103 | |
Andy Green | d7fddad | 2016-02-18 20:36:55 +0800 | [diff] [blame] | 104 | User API additions |
| 105 | ------------------ |
| 106 | |
Andy Green | 0c3cc2e | 2016-02-20 09:12:52 +0800 | [diff] [blame] | 107 | 1) MINOR APIBREAK There's a new member in struct lws_context_creation_info, ecdh_curve, |
Andy Green | d7fddad | 2016-02-18 20:36:55 +0800 | [diff] [blame] | 108 | which lets you set the name of the ECDH curve OpenSSL should use. By |
| 109 | default (if you leave ecdh_curve NULL) it will use "prime256v1" |
| 110 | |
Andy Green | 51d9afa | 2016-02-24 11:05:56 +0800 | [diff] [blame] | 111 | 2) MINOR NEWAPI It was already possible to adopt a foreign socket that had not |
| 112 | been read from using lws_adopt_socket() since v1.7. Now you can adopt a |
| 113 | partially-used socket if you don't need SSL, by passing it what you read |
| 114 | so it can drain that before reading from the socket. |
| 115 | |
| 116 | LWS_VISIBLE LWS_EXTERN struct lws * |
| 117 | lws_adopt_socket_readbuf(struct lws_context *context, lws_sockfd_type accept_fd, |
| 118 | const char *readbuf, size_t len); |
Andy Green | d7fddad | 2016-02-18 20:36:55 +0800 | [diff] [blame] | 119 | |
Andy Green | 6a8099b | 2016-02-21 21:25:48 +0800 | [diff] [blame] | 120 | 3) MINOR NEWAPI CGI type "network io" subprocess execution is now possible from |
| 121 | a simple api. |
| 122 | |
| 123 | LWS_VISIBLE LWS_EXTERN int |
Andy Green | 1a13885 | 2016-03-20 11:55:25 +0800 | [diff] [blame] | 124 | lws_cgi(struct lws *wsi, char * const *exec_array, int script_uri_path_len, |
| 125 | int timeout_secs); |
Andy Green | 6a8099b | 2016-02-21 21:25:48 +0800 | [diff] [blame] | 126 | |
| 127 | LWS_VISIBLE LWS_EXTERN int |
| 128 | lws_cgi_kill(struct lws *wsi); |
| 129 | |
| 130 | To use it, you must first set the cmake option |
| 131 | |
| 132 | $ cmake .. -DLWS_WITH_CGI=1 |
| 133 | |
| 134 | See test-server-http.c and test server path |
| 135 | |
| 136 | http://localhost:7681/cgitest |
| 137 | |
| 138 | stdin 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 |
| 142 | lwstest script |
| 143 | read="hello" |
| 144 | |
Andy Green | 1a13885 | 2016-03-20 11:55:25 +0800 | [diff] [blame] | 145 | The test script returns text/html table showing /proc/meminfo. But the cgi |
| 146 | support is complete enough to run cgit cgi. |
| 147 | |
Andy Green | d61bed3 | 2016-02-25 15:01:55 +0800 | [diff] [blame] | 148 | 4) There is a helper api for forming logging timestamps |
| 149 | |
| 150 | LWS_VISIBLE int |
| 151 | lwsl_timestamp(int level, char *p, int len) |
| 152 | |
| 153 | this generates this kind of timestamp for use as logging preamble |
| 154 | |
| 155 | lwsts[13116]: [2016/01/25 14:52:52:8386] NOTICE: Initial logging level 7 |
| 156 | |
Andy Green | a661ee5 | 2016-02-29 13:18:30 +0800 | [diff] [blame] | 157 | 5) struct lws_client_connect_info has a new member |
| 158 | |
| 159 | const char *method |
| 160 | |
| 161 | If it's NULL, then everything happens as before, lws_client_connect_via_info() |
| 162 | makes a ws or wss connection to the address given. |
| 163 | |
| 164 | If you set method to a valid http method like "GET", though, then this method |
| 165 | is used and the connection remains in http[s], it's not upgraded to ws[s]. |
| 166 | |
| 167 | So with this, you can perform http[s] client operations as well as ws[s] ones. |
| 168 | |
| 169 | There 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 Green | 6a8099b | 2016-02-21 21:25:48 +0800 | [diff] [blame] | 175 | |
Andy Green | 494418a | 2016-03-02 09:17:22 +0800 | [diff] [blame] | 176 | 6) struct lws_client_connect_info has a new member |
| 177 | |
| 178 | const char *parent_wsi |
| 179 | |
| 180 | if non-NULL, the client wsi is set to be a child of parent_wsi. This ensures |
| 181 | if parent_wsi closes, then the client child is closed just before. |
| 182 | |
Andy Green | 0f9904f | 2016-03-17 15:26:49 +0800 | [diff] [blame] | 183 | 7) If you're using SSL, there's a new context creation-time option flag |
| 184 | LWS_SERVER_OPTION_REDIRECT_HTTP_TO_HTTPS. If you give this, non-ssl |
| 185 | connections to the server listen port are accepted and receive a 301 |
| 186 | redirect to / on the same host and port using https:// |
| 187 | |
Andy Green | 0c3cc2e | 2016-02-20 09:12:52 +0800 | [diff] [blame] | 188 | |
Andy Green | 9c60ed9 | 2016-02-16 12:32:18 +0800 | [diff] [blame] | 189 | v1.7.0 |
| 190 | ====== |
| 191 | |
Andy Green | 6711266 | 2016-01-11 11:34:01 +0800 | [diff] [blame] | 192 | Extension Changes |
| 193 | ----------------- |
| 194 | |
| 195 | 1) There is now a "permessage-deflate" / RFC7692 implementation. It's very |
| 196 | similar to "deflate-frame" we have offered for a long while; deflate-frame is |
| 197 | now provided as an alias of permessage-deflate. |
| 198 | |
| 199 | The 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 | |
| 217 | 2) deflate-stream has been disabled for many versions (for over a year) and is |
| 218 | now removed. Browsers are now standardizing on "permessage-deflate" / RFC7692 |
| 219 | |
| 220 | 3) struct lws_extension is simplified, and lws extensions now have a public |
| 221 | api (their callback) for use in user code to compose extensions and options |
| 222 | the user code wants. lws_get_internal_exts() is deprecated but kept around |
| 223 | as a NOP. The changes allow one extension implementation to go by different |
| 224 | names and allows the user client code to control option offers per-ext. |
| 225 | |
| 226 | The test client and server are updated to use the new way. If you use |
| 227 | the old way it should still work, but extensions will be disabled until you |
| 228 | update your code. |
| 229 | |
| 230 | Extensions are now responsible for allocating and per-instance private struct |
| 231 | at instance construction time and freeing it when the instance is destroyed. |
| 232 | Not needing to know the size means the extension's struct can be opaque |
| 233 | to user code. |
| 234 | |
| 235 | |
Andy Green | 3df5800 | 2015-12-25 12:44:12 +0800 | [diff] [blame] | 236 | User api additions |
| 237 | ------------------ |
| 238 | |
Andy Green | 200a6a2 | 2016-02-15 20:36:02 +0800 | [diff] [blame] | 239 | 1) The info struct gained three new members |
Andy Green | 3df5800 | 2015-12-25 12:44:12 +0800 | [diff] [blame] | 240 | |
| 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 Green | 200a6a2 | 2016-02-15 20:36:02 +0800 | [diff] [blame] | 255 | - timeout_secs: 0 for default (currently 20s), or set the library's |
| 256 | network activity timeout to the given number of seconds |
| 257 | |
Andy Green | 3df5800 | 2015-12-25 12:44:12 +0800 | [diff] [blame] | 258 | HTTP header processing in lws only exists until just after the first main |
| 259 | callback after the HTTP handshake... for ws connections that is ESTABLISHED and |
| 260 | for HTTP connections the HTTP callback. |
| 261 | |
| 262 | So these settings are not related to the maximum number of simultaneous |
Andy Green | 3246ebb | 2015-12-26 12:03:06 +0800 | [diff] [blame] | 263 | connections, but the number of HTTP handshakes that may be expected or ongoing, |
Andy Green | 3df5800 | 2015-12-25 12:44:12 +0800 | [diff] [blame] | 264 | or have just completed, at one time. The reason it's useful is it changes the |
| 265 | memory allocation for header processing to be one-time at context creation |
| 266 | instead of every time there is a new connection, and gives you control over |
| 267 | the peak allocation. |
| 268 | |
| 269 | Setting max_http_header_pool to 1 is fine it will just queue incoming |
| 270 | connections before the accept as necessary, you can still have as many |
Andy Green | 5b85e39 | 2015-12-26 13:23:11 +0800 | [diff] [blame] | 271 | simultaneous post-header connections as you like. Since the http header |
| 272 | processing is completed and the allocation released after ESTABLISHED or the |
| 273 | HTTP callback, even with a pool of 1 many connections can be handled rapidly. |
| 274 | |
Andy Green | 066a7a1 | 2015-12-26 15:47:06 +0800 | [diff] [blame] | 275 | 2) There is a new callback that allows the user code to get acccess to the |
| 276 | optional close code + aux data that may have been sent by the peer. |
| 277 | |
| 278 | LWS_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 Green | 6711266 | 2016-01-11 11:34:01 +0800 | [diff] [blame] | 285 | connection. If you return nonzero lws will just close the |
| 286 | connection. |
Andy Green | 066a7a1 | 2015-12-26 15:47:06 +0800 | [diff] [blame] | 287 | |
| 288 | As usual not handling it does the right thing, if you're not interested in it |
| 289 | just ignore it. |
| 290 | |
| 291 | The test server has "open and close" testing buttons at the bottom, if you |
| 292 | open and close that connection, on close it will send a close code 3000 decimal |
| 293 | and the string "Bye!" as the aux data. |
| 294 | |
| 295 | The test server dumb-increment callback handles this callback reason and prints |
| 296 | |
| 297 | lwsts[15714]: LWS_CALLBACK_WS_PEER_INITIATED_CLOSE: len 6 |
| 298 | lwsts[15714]: 0: 0x0B |
| 299 | lwsts[15714]: 1: 0xB8 |
| 300 | lwsts[15714]: 2: 0x42 |
| 301 | lwsts[15714]: 3: 0x79 |
| 302 | lwsts[15714]: 4: 0x65 |
| 303 | lwsts[15714]: 5: 0x21 |
| 304 | |
Andy Green | 1fb95e8 | 2015-12-26 17:20:34 +0800 | [diff] [blame] | 305 | 3) There is a new API to allow the user code to control the content of the |
| 306 | close frame sent when about to return nonzero from the user callback to |
| 307 | indicate 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 | */ |
| 321 | LWS_VISIBLE LWS_EXTERN void |
| 322 | lws_close_reason(struct lws *wsi, enum lws_close_status status, |
| 323 | unsigned char *buf, size_t len); |
| 324 | |
| 325 | An extra button is added to the "open and close" test server page that requests |
| 326 | that the test server close the connection from his end. |
| 327 | |
| 328 | The 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 | |
| 334 | The browser shows the close code and reason he received |
| 335 | |
| 336 | websocket connection CLOSED, code: 1001, reason: seeya |
| 337 | |
Vijay Khurdiya | e73d446 | 2016-01-15 16:21:51 +0800 | [diff] [blame] | 338 | 4) There's a new context creation time option flag |
Andy Green | 44a7f65 | 2015-12-29 11:20:09 +0800 | [diff] [blame] | 339 | |
| 340 | LWS_SERVER_OPTION_VALIDATE_UTF8 |
| 341 | |
| 342 | if you set it in info->options, then TEXT and CLOSE frames will get checked to |
| 343 | confirm that they contain valid UTF-8. If they don't, the connection will get |
| 344 | closed by lws. |
| 345 | |
Vijay Khurdiya | e73d446 | 2016-01-15 16:21:51 +0800 | [diff] [blame] | 346 | 5) ECDH Certs are now supported. Enable the CMake option |
| 347 | |
| 348 | cmake .. -DLWS_SSL_SERVER_WITH_ECDH_CERT=1 |
| 349 | |
| 350 | **and** the info->options flag |
| 351 | |
Andy Green | ff69648 | 2016-02-17 07:46:27 +0800 | [diff] [blame] | 352 | LWS_SERVER_OPTION_SSL_ECDH |
Vijay Khurdiya | e73d446 | 2016-01-15 16:21:51 +0800 | [diff] [blame] | 353 | |
| 354 | to build in support and select it at runtime. |
| 355 | |
Andy Green | ff69648 | 2016-02-17 07:46:27 +0800 | [diff] [blame] | 356 | 6) There's a new api lws_parse_uri() that simplifies chopping up |
Andy Green | 809d69a | 2016-01-14 11:37:56 +0800 | [diff] [blame] | 357 | https://xxx:yyy/zzz uris into parts nicely. The test client now uses this |
Andy Green | d3a5505 | 2016-01-19 03:34:24 +0800 | [diff] [blame] | 358 | to allow proper uris as well as the old address style. |
| 359 | |
| 360 | 7) SMP support is integrated into LWS without any internal threading. It's |
| 361 | very simple to use, libwebsockets-test-server-pthread shows how to do it, |
| 362 | use -j <n> argument there to control the number of service threads up to 32. |
| 363 | |
| 364 | Two new members are added to the info struct |
| 365 | |
| 366 | unsigned int count_threads; |
| 367 | unsigned int fd_limit_per_thread; |
| 368 | |
| 369 | leave them at the default 0 to get the normal singlethreaded service loop. |
| 370 | |
| 371 | Set count_threads to n to tell lws you will have n simultaneous service threads |
| 372 | operating on the context. |
| 373 | |
| 374 | There is still a single listen socket on one port, no matter how many |
| 375 | service threads. |
| 376 | |
| 377 | When a connection is made, it is accepted by the service thread with the least |
| 378 | connections active to perform load balancing. |
| 379 | |
| 380 | The user code is responsible for spawning n threads running the service loop |
| 381 | associated to a specific tsi (Thread Service Index, 0 .. n - 1). See |
| 382 | the libwebsockets-test-server-pthread for how to do. |
| 383 | |
| 384 | If you leave fd_limit_per_thread at 0, then the process limit of fds is shared |
| 385 | between the service threads; if you process was allowed 1024 fds overall then |
| 386 | each thread is limited to 1024 / n. |
| 387 | |
| 388 | You can set fd_limit_per_thread to a nonzero number to control this manually, eg |
| 389 | the overall supported fd limit is less than the process allowance. |
| 390 | |
| 391 | You can control the context basic data allocation for multithreading from Cmake |
| 392 | using -DLWS_MAX_SMP=, if not given it's set to 32. The serv_buf allocation |
| 393 | for the threads (currently 4096) is made at runtime only for active threads. |
| 394 | |
| 395 | Because lws will limit the requested number of actual threads supported |
| 396 | according to LWS_MAX_SMP, there is an api lws_get_count_threads(context) to |
| 397 | discover how many threads were actually allowed when the context was created. |
| 398 | |
| 399 | It's required to implement locking in the user code in the same way that |
| 400 | libwebsockets-test-server-pthread does it, for the FD locking callbacks. |
| 401 | |
Andy Green | ba119e9 | 2016-01-26 21:40:32 +0800 | [diff] [blame] | 402 | If LWS_MAX_SMP=1, then there is no code related to pthreads compiled in the |
| 403 | library. If more than 1, a small amount of pthread mutex code is built into |
| 404 | the library. |
Andy Green | 809d69a | 2016-01-14 11:37:56 +0800 | [diff] [blame] | 405 | |
Andy Green | ba119e9 | 2016-01-26 21:40:32 +0800 | [diff] [blame] | 406 | 8) New API |
| 407 | |
| 408 | LWS_VISIBLE struct lws * |
| 409 | lws_adopt_socket(struct lws_context *context, lws_sockfd_type accept_fd) |
| 410 | |
| 411 | allows foreign sockets accepted by non-lws code to be adopted by lws as if they |
| 412 | had just been accepted by lws' own listen socket. |
Andy Green | 3df5800 | 2015-12-25 12:44:12 +0800 | [diff] [blame] | 413 | |
Danomi Czaski | 4e9c7f3 | 2016-01-28 09:40:53 +0800 | [diff] [blame] | 414 | 9) X-Real-IP: header has been added as WSI_TOKEN_HTTP_X_REAL_IP |
| 415 | |
Andy Green | 86ed65f | 2016-02-14 09:27:41 +0800 | [diff] [blame] | 416 | 10) Libuv support is added, there are new related user apis |
| 417 | |
| 418 | typedef void (lws_uv_signal_cb_t)(uv_loop_t *l, uv_signal_t *w, int revents); |
| 419 | |
| 420 | LWS_VISIBLE LWS_EXTERN int |
| 421 | lws_uv_sigint_cfg(struct lws_context *context, int use_uv_sigint, |
| 422 | lws_uv_signal_cb_t *cb); |
| 423 | |
| 424 | LWS_VISIBLE LWS_EXTERN int |
| 425 | lws_uv_initloop(struct lws_context *context, uv_loop_t *loop, int tsi); |
| 426 | |
| 427 | LWS_VISIBLE void |
| 428 | lws_uv_sigint_cb(uv_loop_t *loop, uv_signal_t *watcher, int revents); |
| 429 | |
| 430 | and CMAKE option |
| 431 | |
| 432 | LWS_WITH_LIBUV |
| 433 | |
Danomi Czaski | 4e9c7f3 | 2016-01-28 09:40:53 +0800 | [diff] [blame] | 434 | |
Andy Green | 3246ebb | 2015-12-26 12:03:06 +0800 | [diff] [blame] | 435 | User api changes |
| 436 | ---------------- |
| 437 | |
| 438 | 1) LWS_SEND_BUFFER_POST_PADDING is now 0 and deprecated. You can remove it; if |
| 439 | you still use it, obviously it does nothing. Old binary code with nonzero |
| 440 | LWS_SEND_BUFFER_POST_PADDING is perfectly compatible, the old code just |
Andy Green | 5b85e39 | 2015-12-26 13:23:11 +0800 | [diff] [blame] | 441 | allocated a buffer bigger than the library is going to use. |
Andy Green | 3246ebb | 2015-12-26 12:03:06 +0800 | [diff] [blame] | 442 | |
Andy Green | 5b85e39 | 2015-12-26 13:23:11 +0800 | [diff] [blame] | 443 | The example apps no longer use LWS_SEND_BUFFER_POST_PADDING. |
Andy Green | 3246ebb | 2015-12-26 12:03:06 +0800 | [diff] [blame] | 444 | |
Andy Green | 4e2ac76 | 2015-12-26 20:26:11 +0800 | [diff] [blame] | 445 | The only path who made use of it was sending with LWS_WRITE_CLOSE ---> |
Andy Green | 3246ebb | 2015-12-26 12:03:06 +0800 | [diff] [blame] | 446 | |
Andy Green | 1fb95e8 | 2015-12-26 17:20:34 +0800 | [diff] [blame] | 447 | 2) Because of lws_close_reason() formalizing handling close frames, |
| 448 | LWS_WRITE_CLOSE is removed from libwebsockets.h. It was only of use to send |
| 449 | close frames...close frame content should be managed using lws_close_reason() |
| 450 | now. |
| 451 | |
Andy Green | 44a7f65 | 2015-12-29 11:20:09 +0800 | [diff] [blame] | 452 | 3) We check for invalid CLOSE codes and complain about protocol violation in |
| 453 | our close code. But it changes little since we were in the middle of closing |
| 454 | anyway. |
| 455 | |
| 456 | 4) zero-length RX frames and zero length TX frames are now allowed. |
| 457 | |
| 458 | 5) Pings and close used to be limited to 124 bytes, the correct limit is 125 |
| 459 | so that is now also allowed. |
Andy Green | 3246ebb | 2015-12-26 12:03:06 +0800 | [diff] [blame] | 460 | |
Steffen Vogel | f926717 | 2016-02-09 07:19:15 +0100 | [diff] [blame] | 461 | 6) LWS_PRE is provided as a synonym for LWS_SEND_BUFFER_PRE_PADDING, either is |
Andy Green | 6711266 | 2016-01-11 11:34:01 +0800 | [diff] [blame] | 462 | valid to use now. |
| 463 | |
| 464 | 7) There's generic support for RFC7462 style extension options built into the |
| 465 | library now. As a consequence, a field "options" is added to lws_extension. |
| 466 | It can be NULL if there are no options on the extension. Extension internal |
| 467 | info is part of the public abi because extensions may be implemented outside |
| 468 | the library. |
| 469 | |
Danomi Czaski | 4e9c7f3 | 2016-01-28 09:40:53 +0800 | [diff] [blame] | 470 | 8) WSI_TOKEN_PROXY enum was accidentally defined to collide with another token |
| 471 | of value 73. That's now corrected and WSI_TOKEN_PROXY moved to his own place at |
| 472 | 77. |
| 473 | |
Andy Green | 86ed65f | 2016-02-14 09:27:41 +0800 | [diff] [blame] | 474 | 9) With the addition of libuv support, libev is not the only event loop |
| 475 | library 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 | |
| 482 | 10) Libev support is made compatible with multithreaded service, |
| 483 | lws_ev_initloop (was lws_initloop) gets an extra argument for the |
| 484 | thread service index (use 0 if you will just have 1 service thread). |
| 485 | |
| 486 | LWS_VISIBLE LWS_EXTERN int |
Andy Green | ff69648 | 2016-02-17 07:46:27 +0800 | [diff] [blame] | 487 | lws_ev_initloop(struct lws_context *context, ev_loop_t *loop, int tsi); |
Andy Green | 86ed65f | 2016-02-14 09:27:41 +0800 | [diff] [blame] | 488 | |
Andy Green | 3df5800 | 2015-12-25 12:44:12 +0800 | [diff] [blame] | 489 | |
Andy Green | 9e8d148 | 2015-12-18 11:01:03 +0800 | [diff] [blame] | 490 | v1.6.0-chrome48-firefox42 |
| 491 | ======================= |
| 492 | |
| 493 | Major API improvements |
| 494 | ---------------------- |
| 495 | |
| 496 | v1.6.0 has many cleanups and improvements in the API. Although at first it |
| 497 | looks 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 | |
| 510 | That's it... generally only a handful of the 14 affected APIs are actually in |
| 511 | use in your user code and you can find them quickest by compiling and visiting |
| 512 | the errors each in turn. And the end results are much cleaner, more |
| 513 | predictable and maintainable. |
| 514 | |
| 515 | |
Andy Green | 4e442b7 | 2015-12-10 07:58:58 +0800 | [diff] [blame] | 516 | User api additions |
| 517 | ------------------ |
| 518 | |
Andy Green | 3f62870 | 2015-12-14 07:16:32 +0800 | [diff] [blame] | 519 | 1) lws now exposes his internal platform file abstraction in a way that can be |
Andy Green | 4e442b7 | 2015-12-10 07:58:58 +0800 | [diff] [blame] | 520 | both used by user code to make it platform-agnostic, and be overridden or |
| 521 | subclassed by user code. This allows things like handling the URI "directory |
| 522 | space" as a virtual filesystem that may or may not be backed by a regular |
| 523 | filesystem. One example use is serving files from inside large compressed |
| 524 | archive storage without having to unpack anything except the file being |
| 525 | requested. |
| 526 | |
| 527 | The test server shows how to use it, basically the platform-specific part of |
| 528 | lws prepares a file operations structure that lives in the lws context. |
| 529 | |
Andy Green | 3f59996 | 2015-12-14 07:21:42 +0800 | [diff] [blame] | 530 | Helpers are provided to also leverage these platform-independent file handling |
| 531 | apis |
Andy Green | 4e442b7 | 2015-12-10 07:58:58 +0800 | [diff] [blame] | 532 | |
| 533 | static inline lws_filefd_type |
Andy Green | 3f59996 | 2015-12-14 07:21:42 +0800 | [diff] [blame] | 534 | lws_plat_file_open(struct lws *wsi, const char *filename, |
Andy Green | 4e442b7 | 2015-12-10 07:58:58 +0800 | [diff] [blame] | 535 | unsigned long *filelen, int flags) |
Andy Green | 4e442b7 | 2015-12-10 07:58:58 +0800 | [diff] [blame] | 536 | static inline int |
Andy Green | 3f59996 | 2015-12-14 07:21:42 +0800 | [diff] [blame] | 537 | lws_plat_file_close(struct lws *wsi, lws_filefd_type fd) |
Andy Green | 4e442b7 | 2015-12-10 07:58:58 +0800 | [diff] [blame] | 538 | |
| 539 | static inline unsigned long |
Andy Green | 3f59996 | 2015-12-14 07:21:42 +0800 | [diff] [blame] | 540 | lws_plat_file_seek_cur(struct lws *wsi, lws_filefd_type fd, long offset) |
Andy Green | 4e442b7 | 2015-12-10 07:58:58 +0800 | [diff] [blame] | 541 | |
| 542 | static inline int |
Andy Green | 3f59996 | 2015-12-14 07:21:42 +0800 | [diff] [blame] | 543 | lws_plat_file_read(struct lws *wsi, lws_filefd_type fd, unsigned long *amount, |
| 544 | unsigned char *buf, unsigned long len) |
Andy Green | 4e442b7 | 2015-12-10 07:58:58 +0800 | [diff] [blame] | 545 | |
| 546 | static inline int |
Andy Green | 3f59996 | 2015-12-14 07:21:42 +0800 | [diff] [blame] | 547 | lws_plat_file_write(struct lws *wsi, lws_filefd_type fd, unsigned long *amount, |
| 548 | unsigned char *buf, unsigned long len) |
Andy Green | 4e442b7 | 2015-12-10 07:58:58 +0800 | [diff] [blame] | 549 | |
| 550 | The user code can also override or subclass the file operations, to either |
| 551 | wrap or replace them. An example is shown in test server. |
| 552 | |
Andy Green | 3f59996 | 2015-12-14 07:21:42 +0800 | [diff] [blame] | 553 | A wsi can be associated with the file activity, allowing per-connection |
| 554 | authentication and state to be used when interpreting the file request. |
| 555 | |
Andy Green | 3f62870 | 2015-12-14 07:16:32 +0800 | [diff] [blame] | 556 | 2) A new API void * lws_wsi_user(struct lws *wsi) lets you get the pointer to |
| 557 | the user data associated with the wsi, just from the wsi. |
| 558 | |
Andy Green | 9e8d148 | 2015-12-18 11:01:03 +0800 | [diff] [blame] | 559 | 3) URI argument handling. Libwebsockets parses and protects URI arguments |
| 560 | like test.html?arg1=1&arg2=2, it decodes %xx uriencoding format and reduces |
| 561 | path attacks like ../.../../etc/passwd so they cannot go behind the web |
| 562 | server's /. There is a list of confirmed attacks we're proof against in |
| 563 | ./test-server/attack.sh. |
| 564 | |
| 565 | There is a new API lws_hdr_copy_fragment that should be used now to access |
| 566 | the 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 | |
| 573 | For the example above, calling with n=0 will return "arg1=1" and n=1 "arg2=2". |
| 574 | All legal uriencodings will have been reduced in those strings. |
| 575 | |
| 576 | lws_hdr_copy_fragment() returns the length of the x=y fragment, so it's also |
| 577 | possible to deal with arguments containing %00. If you don't care about that, |
| 578 | the returned string has '\0' appended to simplify processing. |
| 579 | |
Andy Green | 4e442b7 | 2015-12-10 07:58:58 +0800 | [diff] [blame] | 580 | |
Andy Green | 6d41720 | 2015-12-04 10:39:23 +0800 | [diff] [blame] | 581 | User api changes |
| 582 | ---------------- |
| 583 | |
Andy Green | 1a366bf | 2015-12-14 07:02:51 +0800 | [diff] [blame] | 584 | 1) 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 | |
| 590 | Now take an additional pointer to the lws_context in their first argument. |
| 591 | |
| 592 | The reason for this change is struct lws_protocols has been changed to remove |
| 593 | members that lws used for private storage: so the protocols struct in now |
| 594 | truly const and may be reused serially or simultaneously by different contexts. |
| 595 | |
Andy Green | 11c05bf | 2015-12-16 18:19:08 +0800 | [diff] [blame] | 596 | 2) Eleven APIs |
| 597 | |
| 598 | LWS_VISIBLE LWS_EXTERN int |
| 599 | lws_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); |
| 606 | LWS_VISIBLE LWS_EXTERN int |
| 607 | lws_finalize_http_header(struct lws_context *context, |
| 608 | struct lws *wsi, |
| 609 | unsigned char **p, |
| 610 | unsigned char *end); |
| 611 | LWS_VISIBLE LWS_EXTERN int |
| 612 | lws_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); |
| 619 | LWS_VISIBLE LWS_EXTERN int |
| 620 | lws_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); |
| 625 | LWS_VISIBLE LWS_EXTERN int |
| 626 | lws_add_http_header_status(struct lws_context *context, struct lws *wsi, |
| 627 | unsigned int code, unsigned char **p, |
| 628 | unsigned char *end); |
| 629 | |
| 630 | LWS_VISIBLE LWS_EXTERN int |
| 631 | lws_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); |
| 634 | LWS_VISIBLE LWS_EXTERN int |
| 635 | lws_serve_http_file_fragment(struct lws_context *context, struct lws *wsi); |
| 636 | |
| 637 | LWS_VISIBLE LWS_EXTERN int |
| 638 | lws_return_http_status(struct lws_context *context, struct lws *wsi, |
| 639 | unsigned int code, const char *html_body); |
| 640 | |
| 641 | LWS_VISIBLE LWS_EXTERN int |
| 642 | lws_callback_on_writable(const struct lws_context *context, struct lws *wsi); |
| 643 | |
| 644 | LWS_VISIBLE LWS_EXTERN void |
| 645 | lws_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 | |
| 649 | LWS_VISIBLE LWS_EXTERN int |
| 650 | lws_read(struct lws_context *context, struct lws *wsi, |
| 651 | unsigned char *buf, size_t len); |
| 652 | |
| 653 | no longer require their initial struct lws_context * parameter. |
| 654 | |
| 655 | 3) Several older apis start with libwebsocket_ or libwebsockets_ while newer ones |
Andy Green | 6d41720 | 2015-12-04 10:39:23 +0800 | [diff] [blame] | 656 | all begin lws_. These apis have been changed to all begin with lws_. |
| 657 | |
Andy Green | 11c05bf | 2015-12-16 18:19:08 +0800 | [diff] [blame] | 658 | To convert, search-replace |
Andy Green | 6d41720 | 2015-12-04 10:39:23 +0800 | [diff] [blame] | 659 | |
Andy Green | 11c05bf | 2015-12-16 18:19:08 +0800 | [diff] [blame] | 660 | - libwebsockets_/lws_ |
| 661 | - libwebsocket_/lws_ |
| 662 | - struct\ libwebsocket/struct\ lws |
Andy Green | 00c6d15 | 2015-12-17 07:54:44 +0800 | [diff] [blame] | 663 | |
| 664 | 4) context parameter removed from user callback. |
| 665 | |
| 666 | Since almost all apis no longer need the context as a parameter, it's no longer |
| 667 | provided at the user callback directly. |
| 668 | |
| 669 | However if you need it, for ALL callbacks wsi is valid and has a valid context |
Andy Green | 6d64539 | 2015-12-17 18:25:25 +0800 | [diff] [blame] | 670 | pointer you can recover using lws_get_context(wsi). |
Andy Green | 6d41720 | 2015-12-04 10:39:23 +0800 | [diff] [blame] | 671 | |
| 672 | |
Andy Green | ab620ff | 2015-10-28 08:39:09 +0800 | [diff] [blame] | 673 | v1.5-chrome47-firefox41 |
| 674 | ======================= |
MGadkari | 020c53c | 2015-08-21 16:15:36 +0530 | [diff] [blame] | 675 | |
| 676 | User api changes |
| 677 | ---------------- |
| 678 | |
| 679 | LWS_CALLBACK_CLIENT_CONNECTION_ERROR may provide an error string if in is |
| 680 | non-NULL. If so, the string has length len. |
| 681 | |
Andy Green | 6d59f59 | 2015-10-15 09:12:58 +0800 | [diff] [blame] | 682 | LWS_SERVER_OPTION_PEER_CERT_NOT_REQUIRED is available to relax the requirement |
| 683 | for peer certs if you are using the option to require client certs. |
| 684 | |
Andy Green | 4c79ee7 | 2015-10-15 11:20:40 +0800 | [diff] [blame] | 685 | LWS_WITHOUT_BUILTIN_SHA1 cmake option forces lws to use SHA1() defined |
| 686 | externally, eg, byOpenSSL, and disables build of libwebsockets_SHA1() |
| 687 | |
| 688 | |
Andy Green | 16fb013 | 2015-03-28 11:35:40 +0800 | [diff] [blame] | 689 | v1.4-chrome43-firefox36 |
| 690 | ======================= |
Oleh | faeac3c | 2014-07-29 23:18:41 +0800 | [diff] [blame] | 691 | |
| 692 | User api additions |
| 693 | ------------------ |
| 694 | |
| 695 | There's a new member in the info struct used to control context creation, |
| 696 | ssl_private_key_password, which allows passing into lws the passphrase on |
| 697 | an SSL cetificate |
| 698 | |
Andy Green | eabed8d | 2014-08-11 12:11:36 +0800 | [diff] [blame] | 699 | There's a new member in struct protocols, id, which is ignored by lws but can |
| 700 | be used by the user code to mark the selected protocol by user-defined version |
| 701 | or capabliity flag information, for the case multiple versions of a protocol are |
| 702 | supported. |
| 703 | |
Andy Green | b128ccc | 2014-08-16 09:54:27 +0800 | [diff] [blame] | 704 | int lws_is_ssl(wsi) added to allow user code to know if the connection was made |
| 705 | over ssl or not. If LWS_SERVER_OPTION_ALLOW_NON_SSL_ON_SSL_PORT is used, both |
| 706 | ssl and non-ssl connections are possible and may need to be treated differently |
| 707 | in the user code. |
| 708 | |
Andy Green | 14425ea | 2014-08-18 22:49:39 +0800 | [diff] [blame] | 709 | int lws_partial_buffered(wsi) added... should be checked after any |
| 710 | libwebsocket_write that will be followed by another libwebsocket_write inside |
| 711 | the same writeable callback. If set, you can't do any more writes until the |
| 712 | writeable callback is called again. If you only do one write per writeable callback, |
| 713 | you can ignore this. |
| 714 | |
Andy Green | 917f43a | 2014-10-12 14:31:47 +0800 | [diff] [blame] | 715 | HTTP2-related: HTTP2 changes how headers are handled, lws now has new version- |
| 716 | agnositic header creation APIs. These do the right thing depending on each |
| 717 | connection's HTTP version without the user code having to know or care, except |
| 718 | to make sure to use the new APIs for headers (test-server is updated to use |
| 719 | them already, so look there for examples) |
| 720 | |
| 721 | The APIs "render" the headers into a user-provided buffer and bump *p as it |
| 722 | is used. If *p reaches end, then the APIs return nonzero for error. |
| 723 | |
| 724 | LWS_VISIBLE LWS_EXTERN int |
| 725 | lws_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 | |
| 731 | Start a response header reporting status like 200, 500, etc |
| 732 | |
| 733 | LWS_VISIBLE LWS_EXTERN int |
| 734 | lws_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 | |
| 742 | Add a header like name: value in HTTP1.x |
| 743 | |
| 744 | LWS_VISIBLE LWS_EXTERN int |
| 745 | lws_finalize_http_header(struct libwebsocket_context *context, |
| 746 | struct libwebsocket *wsi, |
| 747 | unsigned char **p, |
| 748 | unsigned char *end); |
| 749 | |
| 750 | Finish off the headers, like add the extra \r\n in HTTP1.x |
| 751 | |
| 752 | LWS_VISIBLE LWS_EXTERN int |
| 753 | lws_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 | |
| 761 | Add a header by using a lws token as the name part. In HTTP2, this can be |
| 762 | compressed to one or two bytes. |
| 763 | |
Oleh | faeac3c | 2014-07-29 23:18:41 +0800 | [diff] [blame] | 764 | |
Andy Green | 822241c | 2014-08-18 22:21:51 +0800 | [diff] [blame] | 765 | User api removal |
| 766 | ---------------- |
| 767 | |
| 768 | protocols struct member no_buffer_all_partial_tx is removed. Under some |
Peter Pentchev | bb085da | 2015-12-03 15:55:11 +0200 | [diff] [blame] | 769 | conditions like rewriting extension such as compression in use, the built-in |
Andy Green | 822241c | 2014-08-18 22:21:51 +0800 | [diff] [blame] | 770 | partial send buffering is the only way to deal with the problem, so turning |
| 771 | it off is deprecated. |
| 772 | |
| 773 | |
Andy Green | 917f43a | 2014-10-12 14:31:47 +0800 | [diff] [blame] | 774 | User api changes |
| 775 | ---------------- |
| 776 | |
| 777 | HTTP2-related: API libwebsockets_serve_http_file() takes an extra parameter at |
| 778 | the end now |
| 779 | |
| 780 | int other_headers_len) |
| 781 | |
| 782 | If you are providing other headers, they must be generated using the new |
| 783 | HTTP-version-agnostic APIs, and you must provide the length of them using this |
| 784 | additional parameter. |
| 785 | |
joseph.urciuoli | 4d9c8fc | 2014-10-16 08:53:19 +0800 | [diff] [blame] | 786 | struct lws_context_creation_info now has an additional member |
| 787 | SSL_CTX *provided_client_ssl_ctx you may set to an externally-initialized |
| 788 | SSL_CTX managed outside lws. Defaulting to zero keeps the existing behaviour of |
| 789 | lws managing the context, if you memset the struct to 0 or have as a filescope |
| 790 | initialized struct in bss, no need to change anything. |
| 791 | |
Andy Green | 822241c | 2014-08-18 22:21:51 +0800 | [diff] [blame] | 792 | |
Andy Green | c1fdd10 | 2014-07-06 09:56:11 +0800 | [diff] [blame] | 793 | v1.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 Green | 7900256 | 2013-11-09 11:04:35 +0800 | [diff] [blame] | 853 | |
kapejod | ce64fb0 | 2013-11-19 13:38:16 +0100 | [diff] [blame] | 854 | User api additions |
| 855 | ------------------ |
| 856 | |
| 857 | POST method is supported |
| 858 | |
| 859 | The protocol 0 / HTTP callback can now get two new kinds of callback, |
| 860 | LWS_CALLBACK_HTTP_BODY (in and len are a chunk of the body of the HTTP request) |
| 861 | and LWS_CALLBACK_HTTP_BODY_COMPLETION (the expected amount of body has arrived |
| 862 | and been passed to the user code already). These callbacks are used with the |
| 863 | post method (see the test server for details). |
| 864 | |
| 865 | The period between the HTTP header completion and the completion of the body |
| 866 | processing is protected by a 5s timeout. |
| 867 | |
| 868 | The chunks are stored in a malloc'd buffer of size protocols[0].rx_buffer_size. |
| 869 | |
| 870 | |
James Devine | 5b34c97 | 2013-12-14 11:41:29 +0800 | [diff] [blame] | 871 | New server option you can enable from user code |
| 872 | LWS_SERVER_OPTION_ALLOW_NON_SSL_ON_SSL_PORT allows non-SSL connections to |
| 873 | also be accepted on an SSL listening port. It's disabled unless you enable |
| 874 | it explicitly. |
| 875 | |
| 876 | |
Andy Green | 7a13279 | 2013-12-18 09:48:26 +0800 | [diff] [blame] | 877 | Two new callbacks are added in protocols[0] that are optional for allowing |
| 878 | limited thread access to libwebsockets, LWS_CALLBACK_LOCK_POLL and |
| 879 | LWS_CALLBACK_UNLOCK_POLL. |
| 880 | |
| 881 | If you use them, they protect internal and external poll list changes, but if |
| 882 | you want to use external thread access to libwebsocket_callback_on_writable() |
| 883 | you have to implement your locking here even if you don't use external |
| 884 | poll support. |
| 885 | |
| 886 | If you will use another thread for this, take a lot of care about managing |
| 887 | your list of live wsi by doing it from ESTABLISHED and CLOSED callbacks |
| 888 | (with your own locking). |
| 889 | |
Andrew Canaday | 9769f4f | 2014-03-23 13:25:07 +0800 | [diff] [blame] | 890 | If you configure cmake with -DLWS_WITH_LIBEV=1 then the code allowing the libev |
| 891 | eventloop instead of the default poll() one will also be compiled in. But to |
| 892 | use it, you must also set the LWS_SERVER_OPTION_LIBEV flag on the context |
| 893 | creation info struct options member. |
Andy Green | 7a13279 | 2013-12-18 09:48:26 +0800 | [diff] [blame] | 894 | |
Andy Green | c1fdd10 | 2014-07-06 09:56:11 +0800 | [diff] [blame] | 895 | IPV6 is supported and enabled by default except for Windows, you can disable |
| 896 | the support at build-time by giving -DLWS_IPV6=, and disable use of it even if |
James Devine | 3f13ea2 | 2014-03-24 16:09:25 +0800 | [diff] [blame] | 897 | compiled in by making sure the flag LWS_SERVER_OPTION_DISABLE_IPV6 is set on |
| 898 | the context creation info struct options member. |
| 899 | |
Andy Green | c1fdd10 | 2014-07-06 09:56:11 +0800 | [diff] [blame] | 900 | You can give LWS_SERVER_OPTION_DISABLE_OS_CA_CERTS option flag to |
| 901 | guarantee the OS CAs will not be used, even if that support was selected at |
| 902 | build-time. |
| 903 | |
| 904 | Optional "token limits" may be enforced by setting the member "token_limits" |
| 905 | in struct lws_context_creation_info to point to a struct lws_token_limits. |
| 906 | NULL means no token limits used for compatibility. |
| 907 | |
Andy Green | 7a13279 | 2013-12-18 09:48:26 +0800 | [diff] [blame] | 908 | |
Andy Green | 7900256 | 2013-11-09 11:04:35 +0800 | [diff] [blame] | 909 | User api changes |
| 910 | ---------------- |
| 911 | |
| 912 | Extra optional argument to libwebsockets_serve_http_file() allows injecion |
| 913 | of HTTP headers into the canned response. Eg, cookies may be added like |
| 914 | that without getting involved in having to send the header by hand. |
| 915 | |
Patrick Gansterer | 148b945 | 2014-02-28 02:31:23 +0100 | [diff] [blame] | 916 | A new info member http_proxy_address may be used at context creation time to |
| 917 | set the http proxy. If non-NULL, it overrides http_proxy environment var. |
Andy Green | 7900256 | 2013-11-09 11:04:35 +0800 | [diff] [blame] | 918 | |
Andy Green | d2ec7ad | 2014-03-15 10:39:29 +0800 | [diff] [blame] | 919 | Cmake supports LWS_SSL_CLIENT_USE_OS_CA_CERTS defaulting to on, which gets |
| 920 | the client to use the OS CA Roots. If you're worried somebody with the |
| 921 | ability to forge for force creation of a client cert from the root CA in |
| 922 | your OS, you should disable this since your selfsigned $0 cert is a lot safer |
| 923 | then... |
| 924 | |
Andy Green | 7900256 | 2013-11-09 11:04:35 +0800 | [diff] [blame] | 925 | |
Andy Green | 81877e6 | 2013-10-26 20:36:08 +0800 | [diff] [blame] | 926 | v1.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 Green | 54cb346 | 2013-02-14 22:23:54 +0800 | [diff] [blame] | 979 | |
| 980 | User 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 Green | 2672fb2 | 2013-02-22 09:54:35 +0800 | [diff] [blame] | 987 | - 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 Green | 58f214e | 2013-03-09 13:03:53 +0800 | [diff] [blame] | 991 | - 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 Green | b55451c | 2013-03-16 12:32:27 +0800 | [diff] [blame] | 997 | - 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 Green | 0c9563b | 2013-06-10 22:54:40 +0800 | [diff] [blame] | 1005 | - there's a new, optional callback LWS_CALLBACK_CLOSED_HTTP which gets |
| 1006 | called when an HTTP protocol socket closes |
| 1007 | |
Andy Green | 96d48fd | 2013-09-18 08:32:55 +0800 | [diff] [blame] | 1008 | - 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 Green | 5dc62ea | 2013-09-20 20:26:12 +0800 | [diff] [blame] | 1014 | - 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 Green | 81877e6 | 2013-10-26 20:36:08 +0800 | [diff] [blame] | 1018 | - 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 Pentchev | bb085da | 2015-12-03 15:55:11 +0200 | [diff] [blame] | 1020 | to set the proxy details in between context creation and the connection |
Andy Green | 81877e6 | 2013-10-26 20:36:08 +0800 | [diff] [blame] | 1021 | action. For OSes that support http_proxy, that's used automatically. |
Andy Green | b55451c | 2013-03-16 12:32:27 +0800 | [diff] [blame] | 1022 | |
Andy Green | 50097dd | 2013-02-15 22:36:30 +0800 | [diff] [blame] | 1023 | User 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 Oetelaar | 8c8a8e1 | 2013-02-20 20:56:59 +0800 | [diff] [blame] | 1029 | LWS_CALLBACK_FILTER_NETWORK_CONNECTION also has the socket descriptor |
| 1030 | delivered by @in now instead of @user. |
Andy Green | 50097dd | 2013-02-15 22:36:30 +0800 | [diff] [blame] | 1031 | |
Andy Green | fc7c5e4 | 2013-02-23 10:50:10 +0800 | [diff] [blame] | 1032 | - 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 Green | 50097dd | 2013-02-15 22:36:30 +0800 | [diff] [blame] | 1037 | |
Andy Green | dc914cf | 2013-02-18 16:54:26 +0800 | [diff] [blame] | 1038 | User 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 Green | 2672fb2 | 2013-02-22 09:54:35 +0800 | [diff] [blame] | 1045 | - CIPHERS_LIST_STRING is removed |
| 1046 | |
Andy Green | 0097a99 | 2013-03-09 13:06:37 +0800 | [diff] [blame] | 1047 | - autotools build has been removed. See README.build for info on how to |
| 1048 | use CMake for your platform |
| 1049 | |
Andy Green | 54cb346 | 2013-02-14 22:23:54 +0800 | [diff] [blame] | 1050 | |
Andy Green | 53a4678 | 2013-02-14 11:23:49 +0800 | [diff] [blame] | 1051 | v1.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 Green | 182cb9a | 2013-02-13 11:54:08 +0800 | [diff] [blame] | 1058 | v1.2-chrome26-firefox18 |
| 1059 | ======================= |
| 1060 | |
| 1061 | Diffstat |
| 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 Green | 7b40545 | 2013-02-01 10:50:15 +0800 | [diff] [blame] | 1107 | |
| 1108 | User 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 Green | a47865f | 2013-02-10 09:39:47 +0800 | [diff] [blame] | 1115 | - 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 Green | a690cd0 | 2013-02-09 12:25:31 +0800 | [diff] [blame] | 1122 | 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 Green | a7109e6 | 2013-02-11 12:05:54 +0800 | [diff] [blame] | 1126 | - 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 Green | 7b40545 | 2013-02-01 10:50:15 +0800 | [diff] [blame] | 1132 | |
Andy Green | ed33446 | 2013-02-07 21:14:33 +0800 | [diff] [blame] | 1133 | User api changes |
| 1134 | ---------------- |
| 1135 | |
Andy Green | 1b26527 | 2013-02-09 14:01:09 +0800 | [diff] [blame] | 1136 | - 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 Green | ed33446 | 2013-02-07 21:14:33 +0800 | [diff] [blame] | 1143 | - Header tokens are now deleted after the websocket connection is |
Andy Green | 5449511 | 2013-02-06 21:10:16 +0900 | [diff] [blame] | 1144 | 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 Green | 16ab318 | 2013-02-10 18:02:31 +0800 | [diff] [blame] | 1165 | - 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 Green | 5449511 | 2013-02-06 21:10:16 +0900 | [diff] [blame] | 1170 | |
| 1171 | User api removals |
| 1172 | ----------------- |
| 1173 | |
Andy Green | 16ab318 | 2013-02-10 18:02:31 +0800 | [diff] [blame] | 1174 | - 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 Green | ed33446 | 2013-02-07 21:14:33 +0800 | [diff] [blame] | 1182 | |
Andy Green | 70edd6f | 2013-02-12 10:15:25 +0800 | [diff] [blame] | 1183 | - 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 Green | 508946c | 2013-02-12 10:19:08 +0800 | [diff] [blame] | 1187 | - 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 Green | ed33446 | 2013-02-07 21:14:33 +0800 | [diff] [blame] | 1192 | |
Andy Green | df60b0c | 2013-02-06 19:57:12 +0900 | [diff] [blame] | 1193 | New features |
| 1194 | ------------ |
| 1195 | |
Andy Green | 9b09dc0 | 2013-02-08 12:48:36 +0800 | [diff] [blame] | 1196 | - Cmake project file added, aimed initially at Windows support: this replaces |
Andy Green | 16ab318 | 2013-02-10 18:02:31 +0800 | [diff] [blame] | 1197 | the visual studio project files that were in the tree until now. |
Andy Green | df60b0c | 2013-02-06 19:57:12 +0900 | [diff] [blame] | 1198 | |
Andy Green | c3ef0d6 | 2013-02-12 10:50:49 +0800 | [diff] [blame] | 1199 | - CyaSSL now supported in place of OpenSSL (--use-cyassl on configure) |
| 1200 | |
Andy Green | 9b09dc0 | 2013-02-08 12:48:36 +0800 | [diff] [blame] | 1201 | - PATH_MAX or MAX_PATH no longer needed |
Andy Green | df60b0c | 2013-02-06 19:57:12 +0900 | [diff] [blame] | 1202 | |
Andy Green | 5449511 | 2013-02-06 21:10:16 +0900 | [diff] [blame] | 1203 | - cutomizable frame rx buffer size by protocol |
| 1204 | |
Andy Green | c3ef0d6 | 2013-02-12 10:50:49 +0800 | [diff] [blame] | 1205 | - 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 Green | a3957ef | 2013-02-11 09:31:43 +0800 | [diff] [blame] | 1212 | - 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 Green | 7b40545 | 2013-02-01 10:50:15 +0800 | [diff] [blame] | 1216 | |
Andy Green | 895d56d | 2013-02-11 09:32:53 +0800 | [diff] [blame] | 1217 | - 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 Green | 16ab318 | 2013-02-10 18:02:31 +0800 | [diff] [blame] | 1222 | - 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 Green | c3ef0d6 | 2013-02-12 10:50:49 +0800 | [diff] [blame] | 1231 | - 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 Green | 895d56d | 2013-02-11 09:32:53 +0800 | [diff] [blame] | 1234 | |
Andy Green | bd1132f | 2013-01-31 19:53:05 +0800 | [diff] [blame] | 1235 | v1.1-chrome26-firefox18 |
Andy Green | a35c86f | 2013-01-31 10:16:44 +0800 | [diff] [blame] | 1236 | ======================= |
| 1237 | |
| 1238 | Diffstat |
| 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 | |
| 1312 | user 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 | |
| 1321 | user 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 | |
| 1343 | user 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 | |
| 1359 | New 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 | |
| 1410 | v1.0-chrome25-firefox17 (6cd1ea9b005933f) |