[Libwebsockets] CGI on lws
andy at warmcat.com
Wed Feb 24 17:43:33 CET 2016
On 02/24/2016 05:44 AM, Andy Green wrote:
> On February 24, 2016 12:00:24 AM GMT+08:00, James Stormes
> <jstormes at stormes.net> wrote:
>> This is exactly what I am waiting for. I work mostly in ASP C#
>> and/or PHP and need to connect live data updates on the server to
>> scalability is an issue.
>> What I am looking for, and time permitting trying to build, is all
>> the plumbing. What you are doing can takes us a long way to
>> My suggestion is to build out enough to get connected to something
>> like PHP and get some example code working so we can start finding
>> issues in the design, and developing the techniques and best
>> practice in the higher level languages.
> Yes, he can already run arbitrary apps (eg, /bin/sh -c "cat
> /proc/meminfo") and send the output on http in the test server, with
> some example CGI env vars set. I'll wire up POST to stdin and then
> start pushing it on master. I guess there are still many things to
> get right, like timing out subprocesses, reaping children robustly,
> corner cases etc, so somebody testing it and/or sending patches is
> very welcome.
I pushed what I have on master
This is still using fork(), vfork() needs some other way to do both the
redirection and environment setting. You need to enable it in cmake
$ cmake .. -DLWS_WITH_CGI=1
He adds a test bash script
$ cat ../test-server/lws-cgi-test.sh
echo "lwstest script stdout"
>&2 echo "lwstest script stderr"
if [ "$REQUEST_METHOD" = "POST" ] ; then
that is executed when you run the test server and visit
If he was executed with GET like that, he outputs on stdout -> http
lwstest script stdout
If the script sees he was executed by POST, he waits for a line of text
to come. You can test that with
$ echo hello > hello.txt
$ wget http://localhost:7681/cgitest --post-file=hello.txt -O- --quiet
lwstest script stdout
The stderr output of the script goes on the lws log.
>> *James Stormes* *Software Developer* (817) 676-4291 (Cell)
>> Zend Certified Engineer
>> On Tue, Feb 23, 2016 at 5:06 AM, Andy Green <andy at warmcat.com>
>>> Hi -
>>> I am working on adding a cmake-selectable CGI api to lws,
>>> LWS_VISIBLE LWS_EXTERN int lws_cgi(struct lws *wsi, char * const
>>> LWS_VISIBLE LWS_EXTERN int lws_cgi_kill(struct lws *wsi);
>>> where the forked process' stdin/out/err is piped on to three
>>> created in the same service thread as the master: these are
>>> the same event loop as everything else, when the process has
>>> pipe fd POLLIN fires and there's a user callback where the user
>>> wire it up to outputting it when the sink socket is writeable.
>>> That happens piecemeal and multitasked according to the
>>> combination of
>>> network and process conditions; the user code in the callback
>> choose to
>>> wire it up to http[s] or ws[s] according to what they want.
>>> The guts of it work already in my local tree, but there are quite
>> lot of
>>> things to take care about with regard to managing the event loop
>>> for all cases, as well as deal with POST -> stdin and that might
>>> The goal of it is to provide a primitive with which you can
>>> "io-encapsulated" subprocesses to the network, ie, run cgi like
>> mailman or
>>> general scripts or web language interpreters.
>>> I am curious if potential users of it have any comments or
>>> about this direction, since it's one of decreasing number of
>>> in the lws toolkit from the point of view of it being able to
>>> make a generic webserver.
>>> -Andy _______________________________________________
>>> Libwebsockets mailing list Libwebsockets at libwebsockets.org
> _______________________________________________ Libwebsockets mailing
> list Libwebsockets at libwebsockets.org
More information about the Libwebsockets