<div dir="ltr"><div class="gmail_extra">Hello Andy,</div><div class="gmail_extra"><br></div><div class="gmail_extra">On one hand, I have tried to use the new plugin approach in my program but it is very hard in my case because lws server and my main plugin (ws connection) are very tied together (they share many variables that would need to be exposed to my application through shm or other sharing options). </div><div class="gmail_extra">On the other hand, in order to get advantage of better HTTP file handling, auth management and further improvements, I would like not to have to write my own callback_http.</div><div class="gmail_extra"><br></div><div class="gmail_extra">In other word, is it possible to declare my own protocol definitions and user callback contents like in first test-server but without declaring http-callback. That is to say</div><div class="gmail_extra"><div class="gmail_extra"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">/* list of supported protocols and callbacks */<br>static struct lws_protocols protocols[] =<br><span class="" style="white-space:pre">         </span>{<br><span class="" style="white-space:pre">               </span><span class="" style="white-space:pre">          </span>{ "MY_PROTOCOL", callback_my_protocol, sizeof(struct per_session_data__my_protocole), 4096},<br><span class="" style="white-space:pre">                          </span>{ NULL, NULL, 0, 0 } /* terminator */<br><span class="" style="white-space:pre">           </span>};</blockquote><div class="gmail_extra">instead of</div><div class="gmail_extra"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">/* list of supported protocols and callbacks */<br>static struct lws_protocols protocols[] =<br><span class="" style="white-space:pre">            </span>{<br><span class="" style="white-space:pre">               </span>/* first protocol must always be HTTP handler */<br><span class="" style="white-space:pre">                </span>{ "http-only", /* name */<br><span class="" style="white-space:pre">             </span>callback_http, /* callback */<br><span class="" style="white-space:pre">           </span>sizeof(struct per_session_data__http), /* per_session_data_size */<br><span class="" style="white-space:pre">              </span>0, /* max frame size / rx buffer */<br><span class="" style="white-space:pre">             </span>},<br><span class="" style="white-space:pre">                              </span>{ "MY_PROTOCOL", callback_my_protocol, sizeof(struct per_session_data__my_protocole), 4096},<br><span class="" style="white-space:pre">                          </span>{ NULL, NULL, 0, 0 } /* terminator */<br><span class="" style="white-space:pre">           </span>};</blockquote></div></div></div><div class="gmail_extra">and keep </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">info.protocols = protocols;</blockquote><div>....<br></div><div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><span class="" style="white-space:pre">  </span>while (n >= 0 && !force_exit) {<br><span class="" style="white-space:pre">              </span>struct timeval tv;<br><span class="" style="white-space:pre">              </span>gettimeofday(&tv, NULL);<br><span class="" style="white-space:pre">            </span>/*<br><span class="" style="white-space:pre">              </span> * This provokes the LWS_CALLBACK_SERVER_WRITEABLE for every<br><span class="" style="white-space:pre">            </span> * live websocket connection using the DUMB_INCREMENT protocol,<br><span class="" style="white-space:pre">         </span> * as soon as it can take more packets (usually immediately)<br><span class="" style="white-space:pre">            </span> */<br><span class="" style="white-space:pre">             </span>ms = (tv.tv_sec * 1000) + (tv.tv_usec / 1000);<br><span class="" style="white-space:pre">          </span>if ((ms - oldms) > 50) {<br><span class="" style="white-space:pre">                     </span>lws_callback_on_writable_all_protocol(context,<br><span class="" style="white-space:pre">                          </span>&protocols[PROTOCOL_DUMB_INCREMENT]);<br><span class="" style="white-space:pre">                       </span>oldms = ms;<br><span class="" style="white-space:pre">             </span>}<br>#ifdef EXTERNAL_POLL<br><span class="" style="white-space:pre">         </span>/*<br><span class="" style="white-space:pre">              </span> * this represents an existing server's single poll action<br><span class="" style="white-space:pre">          </span> * which also includes libwebsocket sockets<br><span class="" style="white-space:pre">             </span> */<br><span class="" style="white-space:pre">             </span>n = poll(pollfds, count_pollfds, 50);<br><span class="" style="white-space:pre">           </span>if (n < 0)<br><span class="" style="white-space:pre">                   </span>continue;<br><span class="" style="white-space:pre">               </span>if (n)<br><span class="" style="white-space:pre">                  </span>for (n = 0; n < count_pollfds; n++)<br><span class="" style="white-space:pre">                          </span>if (pollfds[n].revents)<br><span class="" style="white-space:pre">                                 </span>/*<br><span class="" style="white-space:pre">                                      </span>* returns immediately if the fd does not<br><span class="" style="white-space:pre">                                        </span>* match anything under libwebsockets<br><span class="" style="white-space:pre">                                    </span>* control<br><span class="" style="white-space:pre">                                       </span>*/<br><span class="" style="white-space:pre">                                      </span>if (lws_service_fd(context,<br><span class="" style="white-space:pre">                                                             </span>  &pollfds[n]) < 0)<br><span class="" style="white-space:pre">                                             </span>goto done;<br>#else<br><span class="" style="white-space:pre">               </span>/*<br><span class="" style="white-space:pre">              </span> * If libwebsockets sockets are all we care about,<br><span class="" style="white-space:pre">              </span> * you can use this api which takes care of the poll()<br><span class="" style="white-space:pre">          </span> * and looping through finding who needed service.<br><span class="" style="white-space:pre">              </span> *<br><span class="" style="white-space:pre">              </span> * If no socket needs service, it'll return anyway after<br><span class="" style="white-space:pre">            </span> * the number of ms in the second argument.<br><span class="" style="white-space:pre">             </span> */<br><span class="" style="white-space:pre">             </span>n = lws_service(context, 50);<br>#endif<br><span class="" style="white-space:pre">   </span>}</blockquote></div><div class="gmail_extra">instead of libuv functions...</div><div class="gmail_extra"><br></div><div class="gmail_extra"><div class="gmail_extra">In fact, when you wrote </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex"><span style="font-size:12.8px">>1) Keep your existing code and attach your own mounts at vhost creation<br></span><span style="font-size:12.8px">>time<br></span><span style="font-size:12.8px">><br></span><span style="font-size:12.8px">><a href="https://github.com/warmcat/libwebsockets/blob/master/README.coding.md#using-lws-v2-vhosts" rel="noreferrer" target="_blank">https://github.com/warmcat/libwebsockets/blob/master/README.coding.md#using-lws-v2-vhosts<br></a></span><span style="font-size:12.8px">><br></span><span style="font-size:12.8px">>Lws will serve the mounted contents automatically from where it's<br></span><span style="font-size:12.8px">>mounted<br></span><span style="font-size:12.8px">>in the server namespace<br></span><span style="font-size:12.8px">><br></span><span style="font-size:12.8px">>Could you confirm that this solution requires libuv and or libev? I<br></span><span style="font-size:12.8px">>hope<br></span><span style="font-size:12.8px">>this will not stress too much my emdedded system ;-)</span><span style="font-size:12.8px"><br></span><span style="font-size:12.8px">Plugins are what implies libuv (not libev).  However I think you find for Arm v7 running Linux, the idea libuv will 'strain' it is probably just prejudice.  Libuv is cheap as a crossplatform  wrapper around socket events or timers, and we're otherwise using it for crossplatform dirent and plugin operations at init.<br></span>  </blockquote></div><div class="gmail_extra">it is not clear for me wether libuv (and so plugins) are required or nor. </div><div class="gmail_extra"><br></div><div class="gmail_extra">I also do not understand how test-server-v2.0 manage to serve leaf.png and any other file in any other folder (what test-server isn't able to do) using HTTP</div><div class="gmail_extra"><br></div><div class="gmail_extra">As you can see I am quite confusing with all the new possibilities. If my questions are not clear, I can send you part of my code...</div><div class="gmail_extra"><br></div><div class="gmail_extra">Best regards,</div><div class="gmail_extra">Thomas</div><div class="gmail_extra"><br></div><div class="gmail_extra"><br></div><div class="gmail_extra"><br></div><div class="gmail_extra"><div class="gmail_quote">2016-05-18 9:06 GMT+02:00 Andy Green <span dir="ltr"><<a href="mailto:andy@warmcat.com" target="_blank">andy@warmcat.com</a>></span>:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex"><span><br>
<br>
On May 18, 2016 2:46:13 PM GMT+08:00, Thomas Spitz <<a href="mailto:thomas.spitz@hestia-france.com" target="_blank">thomas.spitz@hestia-france.com</a>> wrote:<br>
>Hello Andy,<br>
><br>
>I think I will use plugins however regarding lwsws I will rather not<br>
>use it<br>
<br>
</span>That'll get you most of the benefits.<br>
<span><br>
>because my application need to computably  computationally (not<br>
>manually)<br>
>configure ports, redirect and protocols. Thus, I think going through<br>
>JSON<br>
>files will certainly be more complex than dealing with native C<br>
>structures... I might be wrong...<br>
<br>
</span>You know your application better than I do... if it's easier to wire up with structs, no problem.<br>
<br>
One observation though... JSON is easy to machine-generate if need be.<br>
<span><font color="#888888"><br>
-Andy<br>
</font></span><div><div><br>
>Best regards,<br>
>Thomas<br>
><br>
><br>
>2016-05-17 20:48 GMT+02:00 Andy Green <<a href="mailto:andy@warmcat.com" target="_blank">andy@warmcat.com</a>>:<br>
><br>
>><br>
>><br>
>> On May 18, 2016 1:43:04 AM GMT+08:00, Thomas Spitz <<br>
>> <a href="mailto:thomas.spitz@hestia-france.com" target="_blank">thomas.spitz@hestia-france.com</a>> wrote:<br>
>> >I think I will have to go for option 1 as you explained in<br>
>><br>
>><a href="https://libwebsockets.org/pipermail/libwebsockets/2016-April/002303.html" rel="noreferrer" target="_blank">https://libwebsockets.org/pipermail/libwebsockets/2016-April/002303.html</a><br>
>> >in<br>
>> >order to get an easy and maintainable solution for port<br>
>redirections,<br>
>> >http<br>
>> >processing, ...:<br>
>><br>
>> It's workable, but compared to just having a custom JSON config and a<br>
>> plugin, with everything else off the shelf, it's not the easiest or<br>
>most<br>
>> maintainable way.<br>
>><br>
>> >1) Keep your existing code and attach your own mounts at vhost<br>
>creation<br>
>> >time<br>
>> ><br>
>> ><br>
>><br>
><a href="https://github.com/warmcat/libwebsockets/blob/master/README.coding.md#using-lws-v2-vhosts" rel="noreferrer" target="_blank">https://github.com/warmcat/libwebsockets/blob/master/README.coding.md#using-lws-v2-vhosts</a><br>
>> ><br>
>> >Lws will serve the mounted contents automatically from where it's<br>
>> >mounted<br>
>> >in the server namespace<br>
>> ><br>
>> >Could you confirm that this solution requires libuv and or libev? I<br>
>> >hope<br>
>> >this will not stress too much my emdedded system ;-)<br>
>><br>
>> Plugins are what implies libuv (not libev).  However I think you find<br>
>for<br>
>> Arm v7 running Linux, the idea libuv will 'strain' it is probably<br>
>just<br>
>> prejudice.  Libuv is cheap as a crossplatform  wrapper around socket<br>
>events<br>
>> or timers, and we're otherwise using it for crossplatform dirent and<br>
>plugin<br>
>> operations at init.<br>
>><br>
>> Until recently when it got updated to a Rpi 3, <a href="http://libwebsockets.org" rel="noreferrer" target="_blank">libwebsockets.org</a> was<br>
>a<br>
>> 1GHz Armv7, before that a series of weaker Arm devices like CA8, even<br>
>the<br>
>> weakest ones with 256MB would have had no trouble with libuv in the<br>
>mix.<br>
>><br>
>> >I think this would have been nice to have cgitest, server-status in<br>
>> >libwebsockets-test-server-v2.0 and libwebsockets-test-server to<br>
>compare<br>
>> >the<br>
>> >three solutions (the third solution is lwsws).<br>
>><br>
>> The old test server code is bloated with adding support for the<br>
>kitchen<br>
>> sink in there, making it difficult to use as the example it's<br>
>intended to<br>
>> be; the advantage of the plugins + lwsws for maintainability is<br>
>clear.<br>
>><br>
>> You can add everything in the plugins + lwsws JSON into<br>
>test-server-v2.0.c<br>
>> as structs + protocols + api calls, but then it will become<br>
>inflexible and<br>
>> huge... that's a big step backwards.<br>
>><br>
>> So the official test-server-v2.0.c should stay like it is, just<br>
>having<br>
>> enough 'config by struct' to demonstrate the concept and leveraging<br>
>the<br>
>> plugins, where a standalone server app is possible lwsws is the way<br>
>to 'do<br>
>> everything' flexibly and maintainably.<br>
>><br>
>> >libwebsockets-test-server is<br>
>> >probably not necessary as I assume it will be a depreciated solution<br>
>in<br>
>> >the<br>
>> >future? I will certainly try to complete<br>
>libwebsockets-test-server-v2.0<br>
>> >tomorrow.<br>
>><br>
>> Yes the old all-in-one test server will continue to be supported<br>
>(indeed<br>
>> the default, since everything else needs enabling at cmake).  But new<br>
>stuff<br>
>> - I plan to discuss a completely new, highly abstracted protocol<br>
>plugin<br>
>> project soon, and suitable third-party plugins could become provided<br>
>as<br>
>> part of lws - will be provided as 'mix and matchable' standalone<br>
>plugins<br>
>> only.<br>
>><br>
>> -Andy<br>
>><br>
>> >Best regards,<br>
>> >Thomas<br>
>><br>
>><br>
<br>
</div></div></blockquote></div><br></div></div>