v3.2.2January 17, 2020
v3.2.1December 18, 2019
This is the last planned release under LGPLv2+SLE. It's not planned to be maintained like previous releases, please switch to master for the latest stuff or continue to use v3.1-stable until the next release under the new MIT license.
NEW: completely refactored scheduler with a unified, sorted us-resolution linked-list implementation. All polled checks like timeout are migrated to use the new timers, which also work on the event lib implementations. Faster operation, us-resolution timeouts and generic scheduled callbacks from the event loop.
NEW: lws_dsh specialized buffer memory allocator that can borrow space from other cooperating buffers on the same list.
NEW: lws_sequencer allows managing multi-connection processes and retries
NEW: memory buffer cert support
NEW: LWS_WITH_NETWORK in CMake... can be configured without any network- related code at all
NEW: builds on QNX 6.5 and SmartOS
NEW: JOSE / JWK / JWS / JWE support, for all common ciphers and algs, works on OpenSSL and mbedtls backends
NEW: gencrypto now has genaes and genec in addition to genrsa, works on OpenSSL and mbedtls backends
NEW: raw_proxy role
NEW: Basic Auth works on ws connections
CHANGE: REMOVED: LWS_WITH_GENRSA, LWS_WITH_GENHASH, LWS_WITH_GENEC, LWS_WITH_GENAES have all been removed and combined into LWS_WITH_GENCRYPTO
CHANGE: REMOVED: LWS_WITH_JWS, LWS_WITH_JWE have been removed and combined into LWS_WITH_JOSE
CHANGE: REMOVED: lws_client_connect() and lws_client_connect_extended() compatibility apis for lws_client_connect_via_info() have been marked as deprecated for several versions and are now removed. Use lws_client_connect_via_info() directly instead.
- LWS_WITH_HTTP2: now defaults ON
CHANGE: Minimal examples updated to use Content Security Policy best practices, using
LWS_SERVER_OPTION_HTTP_HEADERS_SECURITY_BEST_PRACTICES_ENFORCEvhost option flag and disabling of inline style and scripts. A side-effect of this is that buffers used to marshal headers have to be prepared to take more content than previously... LWS_RECOMMENDED_MIN_HEADER_SPACE (2048 currently) is available for user (and internal) use to logically tie the buffer size to this usecase (and follow future increases).
- LWS_FOR_GITOHASHI: sets various cmake options suitable for gitohashi
- LWS_WITH_ASAN: for Linux, enable build with ASAN
Don't forget LWS_WITH_DISTRO_RECOMMENDED, which enables a wide range of lws options suitable for a distro build of the library.
NEW: lws threadpool - lightweight pool of pthreads integrated to lws wsi, with all synchronization to event loop handled internally, queue for excess tasks threadpool docs threadpool minimal example Cmake config:
NEW: lws allocated chunks (lwsac) - helpers for optimized mass allocation of small objects inside a few larger malloc chunks... if you need to allocate a lot of inter-related structs for a limited time, this removes per-struct allocation library overhead completely and removes the need for any destruction handling lwsac docs lwsac minimal example Cmake Config:
NEW: lws tokenizer - helper api for robustly tokenizing your own strings without allocating or adding complexity. Configurable by flags for common delimiter sets and comma-separated-lists in the tokenizer. Detects and reports syntax errors. lws_tokenize docs lws_tokenize minimal example / api test
NEW: lws full-text search - optimized trie generation, serialization, autocomplete suggestion generation and instant global search support extensible to huge corpuses of UTF-8 text while remaining super lightweight on resources. full-text search docs full-text search minimal example / api test demo demo sources Cmake config:
NEW: managed disk cache - API for managing a directory containing cached files with hashed names, and automatic deletion of LRU files once the cache is above a given limit. lws diskcache docs Cmake config:
NEW: http reverse proxy - lws mounts support proxying h1 or h2 requests to a local or remote IP, or unix domain socket over h1. This allows microservice type architectures where parts of the common URL space are actually handled by external processes which may be remote or on the same machine. lws gitohashi serving is handled this way. CMake config:
NEW: lws_buflist - internally several types of ad-hoc malloc'd buffer have been replaced by a new, exported api
struct lws_buflist. This allows multiple buffers to be chained and drawn down in strict FIFO order.
NEW: In the case of h1 upgrade, the connection header is checked to contain "upgrade". The vhost flag LWS_SERVER_OPTION_VHOST_UPG_STRICT_HOST_CHECK also causes the Host: header to be confirmed to match the vhost name and listen port.
NEW: If no 404 redirect for
lws_return_http_status()is specified for the vhost, the status page produced will try to bring in a stylesheet
/error.css. This allows you to produce styled 404 or other error pages with logos, graphics etc. See https://libwebsockets.org/git/badrepo for an example of what you can do with it.
v3.0.1September 07, 2018
CHANGE: Clients used to call LWS_CALLBACK_CLOSED same as servers... LWS_CALLBACK_CLIENT_CLOSED has been introduced and is called for clients now.
CHANGE: LWS_CALLBACK_CLIENT_CONNECTION_ERROR used to only be directed at protocols. However in many cases, the protocol to bind to was provided at client connection info time and the wsi bound accordingly. In those cases, CONNECTION_ERROR is directed at the bound protocol, not protcols any more.
CHANGE: CMAKE: the following cmake defaults have changed with this version:
- LWS_WITH_ZIP_FOPS: now defaults OFF
- LWS_WITH_RANGES: now defaults OFF
- LWS_WITH_ZLIB: now defaults OFF
- LWS_WITHOUT_EXTENSIONS: now defaults ON
CHANGE: REMOVED: lws_alloc_vfs_file() (read a file to malloc buffer)
CHANGE: REMOVED: lws_read() (no longer useful outside of lws internals)
CHANGE: REMOVED: ESP8266... ESP32 is now within the same price range and much more performant
CHANGE: soname bump... don't forget to
NEW: all event libraries support "foreign" loop integration where lws itself if just a temporary user of the loop unrelated to the actual loop lifecycle.
minimal-http-server-eventlib-foreignfor example code demonstrating this for all the event libraries.
Internal loop in lws is also supported and demonstrated by
NEW: ws-over-h2 support. This is a new RFC-on-the-way supported by Chrome and shortly firefox that allows ws connections to be multiplexed back to the server on the same tcp + tls wrapper h2 connection that the html and scripts came in on. This is hugely faster that discrete connections.
NEW: UDP socket adoption and related event callbacks
NEW: Multi-client connection binding, queuing and pipelining support.
Lws detects multiple client connections to the same server and port, and optimizes how it handles them according to the server type and provided flags. For http/1.0, all occur with individual parallel connections. For http/1.1, you can enable keepalive pipelining, so the connections occur sequentially on a single network connection. For http/2, they all occur as parallel streams within a single h2 network connection.
See minimal-http-client-multi for example code.
NEW: High resolution timer API for wsi, get a callback on your wsi with LWS_CALLBACK_TIMER, set and reset the timer with lws_set_timer_usecs(wsi, us) Actual resolution depends on event backend. Works with all backends, poll, libuv, libevent, and libev.
NEW: Protocols can arrange vhost-protocol instance specific callbacks with second resolution using
NEW: ACME client plugin for self-service TLS certificates
NEW: RFC7517 JSON Web Keys RFC7638 JWK thumbprint, and RFC7515 JSON Web signatures support
NEW: lws_cancel_service() now provides a generic way to synchronize events from other threads, which appear as a LWS_CALLBACK_EVENT_WAIT_CANCELLED callback on all protocols. This is compatible with all the event libraries.
NEW: support BSD poll() where changes to the poll wait while waiting are undone.
NEW: Introduce generic hash, hmac and RSA apis that operate the same regardless of OpenSSL or mbedTLS tls backend
NEW: Introduce X509 element query api that works the same regardless of OpenSSL or mbedTLS tls backend
NEW: Introduce over 30 "minimal examples" in ./minimal-examples... these replace most of the old test servers
- test-echo -> minimal-ws-server-echo and minimal-ws-client-echo
- test-server-libuv / -libevent / -libev -> minimal-https-server-eventlib / -eventlib-foreign / -eventlib-demos
- test-server-v2.0 -> folded into all the minimal servers
- test-server direct http serving -> minimal-http-server-dynamic
The minimal examples allow individual standalone build using their own small CMakeLists.txt.
NEW: lws now detects any back-to-back writes that did not go through the event loop inbetween and reports them. This will flag any possibility of failure rather than wait until the problem happens.
NEW: CMake has LWS_WITH_DISTRO_RECOMMENDED to select features that are appropriate for distros
NEW: Optional vhost URL
error_document_404if given causes a redirect there instead of serve the default 404 page.
NEW: lws_strncpy() wrapper guarantees NUL in copied string even if it was truncated to fit.
NEW: for client connections, local protocol binding name can be separated from the ws subprotocol name if needed, using .local_protocol_name
NEW: Automatic detection of time discontiguities
NEW: Applies TCP_USER_TIMEOUT for Linux tcp keepalive where available
QA: 1600 tests run on each commit in Travis CI, including almost all Autobahn in client and server mode, various h2load tests, h2spec, attack.sh the minimal example selftests and others.
QA: fix small warnings introduced on gcc8.x (eg, Fedora 28)
QA: Add most of -Wextra on gcc (-Wsign-compare, -Wignored-qualifiers, -Wtype-limits, -Wuninitialized)
QA: clean out warnings on windows
QA: pass all 146 h2spec tests now on strict
QA: introduce 35 selftests that operate different minimal examples against each other and confirm the results.
QA: LWS_WITH_MINIMAL_EXAMPLES allows mass build of all relevant minimal- examples with the LWS build, for CI and to make all the example binaries available from the lws build dir ./bin
REFACTOR: the lws source directory layout in ./lib has been radically improved, and there are now README.md files in selected subdirs with extra documentation of interest to people working on lws itself.
REFACTOR: pipelined transactions return to the event loop before starting the next part.
REFACTOR: TLS: replace all TLS library constants with generic LWS ones and adapt all the TLS library code to translate to these common ones.
Isolated all the tls-related private stuff in
./lib/tls/private.h, and all the mbedTLS stuff in
./lib/tls/mbedtls+ openSSL stuff in
- REFACTOR: the various kinds of wsi possible with lws have been extracted
from the main code and isolated into "roles" in
./lib/roleswhich communicate with the core code via an ops struct. Everything related to ah is migrated to the http role.
wsi modes are eliminated and replaced by the ops pointer for the role the wsi is performing. Generic states for wsi are available to control the lifecycle using core code.
Adding new "roles" is now much easier with the changes and ops struct to plug into.
REFACTOR: reduce four different kinds of buffer management in lws into a generic scatter-gather struct lws_buflist.
REFACTOR: close notifications go through event loop
v2.4.2March 08, 2018
v2.4.1November 05, 2017
HTTP/2 server support is now mature and usable! LWS_WITH_HTTP2=1 enables it. Uses ALPN to serve HTTP/2, HTTP/1 and ws[s] connections all from the same listen port seamlessly. (Requires ALPN-capable OpenSSL 1.1 or mbedTLS).
LWS_WITH_MBEDTLS=1 at CMake now builds and works against mbedTLS instead of OpenSSL. Most things work identically, although on common targets where OpenSSL has acceleration, mbedTLS is many times slower in operation. However it is a lot smaller codewise.
Generic hash apis introduced that work the same on mbedTLS or OpenSSL backend
LWS_WITH_PEER_LIMITS tracks IPs across all vhosts and allows restrictions on both the number of simultaneous connections and wsi in use for any single IP
lws_ring apis provide a generic single- or multi-tail ringbuffer... mirror protocol now uses this. Features include ring elements may be sized to fit structs in the ringbuffer, callback when no tail any longer needs an element and it can be deleted, and zerocopy options to write new members directly into the ringbuffer, and use the ringbuffer element by address too.
abstract ssh 2 server plugin included, with both plugin and standalone demos provided. You can bind the plugin to a vhost and also serve full- strength ssh from the vhost. IO from the ssh server is controlled by an "ops" struct of callbacks for tx, rx, auth etc.
Many fixes, cleanups, source refactors and other improvements.
ESP32 OpenSSL support for client and server
ESP32 4 x WLAN credential slots may be configured
Libevent event loop support
SOCKS5 proxy support
lws_meta protocol for websocket connection multiplexing
lws_vhost_destroy() added... allows dynamic removal of listening vhosts. Vhosts with shared listen sockets adopt the listen socket automatically if the owner is destroyed.
IPv6 on Windows
Improved CGI handling suitable for general CGI scripting, eg, PHP
Convert even the "old style" test servers to use statically included plugin sources
LWS_WITH_STATS cmake option dumps resource usage and timing information every few seconds to debug log, including latency information about delay from asking for writeable callback to getting it
Large (> 2GB) files may be served
LWS_WITH_HTTP_PROXY Cmake option adds proxying mounts
Workaround for libev build by disabling -Werror on the test app
HTTP2 support disabled since no way to serve websockets on it