[Libwebsockets] Using protocols not passed to lws_create_context()
andy at warmcat.com
Tue Jan 14 12:37:06 CET 2020
On 1/14/20 11:06 AM, Zevv wrote:
> Hi list,
> I'm in the process of migrating an propriatary application with a custom
> http socket layer to libws. There are a number of different websocket
> client modules in different parts of the code, and I'd like to keep
> those logically separated.
> My problem is that all the lws_protocols are defined at the lws_context
> level, so I'm not able to define a protocol in a local source file only,
> as they all need to be registered in one central place to the
> lws_context at lws_create_context() time.
> My current workaround is to create multiple lws_contexts in separate
> modules, but this is of course not the right way to go.
Yes that's really not the right way to solve it. You want a single
lws_context / event loop.
There are a few different things that might help.
> Is it possible to bind a protocol and/or wsi callback on a wsi without
> having to define these when creating the lws_context?
Sort of... first, protocol init happens at vhost creation time, not
context creation time, the protocols bind to a vhost not the whole
context. By default, for backwards compatibility, lws creates you a
default vhost at context creation time with whatever list of protocols
you gave then, and the two things are coming in one step.
But that's not required, you can tell lws at context creation time
you're going to explicitly define vhosts yourself
with that you can individually control which protocols are bound to
which vhost. It's possible to create vhosts dynamically once the
context is there. Notice you need to provide a PVO (per-vhost option)
naming each protocol you want to enable on each vhost when you define
the vhosts explicitly.
(A side note something that was added before v3.2 that really helps with
protocol encapsulation is you can now set the protocols on the vhost
using .pprotocols, which takes an array of pointers to the lws_protocols
structs, rather than an array of the structs.
That means you just need to export the pointer from your protocol
Second lws has a plugins concept where protocols, eg
which can be completely built standalone as well
are built into dynamic lib plugins... these are discovered at startup if
LWS_WITH_PLUGINS enabled. You can then use per-vhost options to enable
specific protocol names on specific vhosts.
Third, this is made a lot more easy-to-manage if you use either lwsws or
at least lejp-conf.c to control which protocols are on which vhosts on
which ports / interfaces in JSON, eg
in fact the whole of warmcat.com / libwebsockets.org is served by lwsws
using protocol plugins + JSON config to control what appears where,
without having any special application, even though it serves complex
things like https://libwebsockets.org/testserver,
https://libwebsockets.org/git (this is a reverse proxy for a gitohashi
instance on the same machine that is serving over Unix Domain Sockets),
https://libwebsockets.org/mailman (this is a CGI) and from the same
server on a different vhost, https://warmcat.com,
https://warmcat.com/git etc, all from JSON.
> Thank you,
> Libwebsockets mailing list
> Libwebsockets at ml.libwebsockets.org
More information about the Libwebsockets