<div dir="ltr">That made the callback happen :)  Sweet!<div><br></div><div>On the "<a href="http://www.websocket.org/echo.html">http://www.websocket.org/echo.html</a>" page, there is a dialog box for sending a message, with a "send" button.  It sends whatever you type in the box, to the server.  Hence "send data from".</div><div><br></div><div>I'm enabling the INRIX OpenCar framework to run on your library.</div><div><br></div><div><br></div><div>Thanks,</div><div>Joel</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Feb 9, 2017 at 4:34 PM, Andy Green <span dir="ltr"><<a href="mailto:andy@warmcat.com" target="_blank">andy@warmcat.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class=""><br>
<br>
On 02/10/2017 08:06 AM, Joel Winarske wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Using - <a href="http://www.websocket.org/echo.html" rel="noreferrer" target="_blank">http://www.websocket.org/echo.<wbr>html</a> to test:<br>
</blockquote>
<br></span>
Hm echo is maybe not a good way to test this.<br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
In wireshark I see:<br>
 160.690778127.0.0.1127.0.0.1H<wbr>TTP1128GET /activation?encoding=text HTTP/1.1<br>
 180.691789127.0.0.1127.0.0.1H<wbr>TTP434HTTP/1.1 101 Switching Protocols<span class=""><br>
packets from client to server<br>
<no response from my protocol plugin><br>
close from client<br>
close response from server<br>
<br>
In the log I see:<br>
[2017/02/09 15:04:57:8757] NOTICE: Creating Vhost '127.0.0.1' port 7681, 3 protocols, IPv6 off<br>
[2017/02/09 15:04:57:8767] NOTICE:    mounting callback://activation-protocol to /activation<br>
...<br>
[2017/02/09 15:04:57:8777] NOTICE:  Using non-SSL mode<br>
[2017/02/09 15:04:57:8817] NOTICE:     vh 127.0.0.1 prot cmd-protocol opt status<br>
[2017/02/09 15:04:57:8817] NOTICE:     vh 127.0.0.1 prot activation-protocol opt status<br>
[2017/02/09 15:04:57:8827] NOTICE: activate: LWS_CALLBACK_PROTOCOL_INIT<br>
[2017/02/09 15:05:15:6913] NOTICE: Accepted wsi 002C3FC8 to context 0020A890, tsi 0<br>
[2017/02/09 15:06:02:7518] NOTICE: Accepted wsi 022C5100 to context 0020A890, tsi 0<br>
<br></span>
But when I send data from the <a href="http://websocket.org" rel="noreferrer" target="_blank">websocket.org</a> <<a href="http://websocket.org" rel="noreferrer" target="_blank">http://websocket.org</a>> site, I never see the callback happen.  Not even LWS_CALLBACK_CLIENT_CONFIRM_EX<wbr>TENSION_SUPPORTED.<br>
</blockquote>
<br>
"send data from"?<span class=""><br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
It would seem the server is consuming the WS data packet, and not making the callback.  What am I missing?<br>
<br>
In addition - when I select an unknown WS "mount", such as "ws://localhost:7681/install", I get the identical behavior.<br>
<br>
Switching the vhosts name to "127.0.0.1", has no impact.<br>
<br>
When I use the test-client to test, I do see LWS_CALLBACK_CLIENT_CONFIRM_EX<wbr>TENSION_SUPPORTED as expected, but it ends with "CLIENT_CONNECTION_ERROR: dumb: (null)", after which I see the WebSocket Close packet on the wire.  I instrumented what you checked in yesterday.<br>
<br>
[2017/02/09 16:03:26:0400] NOTICE: dumb: connecting<br>
[2017/02/09 16:03:26:0410] ERR: getaddrinfo localhost -> 127.0.0.1<br>
[2017/02/09 16:03:26:0544] ERR: getaddrinfo localhost -> 127.0.0.1<br>
[2017/02/09 16:03:26:0544] NOTICE: dumb: LWS_CALLBACK_CLIENT_CONFIRM_EX<wbr>TENSION_SUPPORTED [permessage-deflate]<br>
[2017/02/09 16:03:26:0544] NOTICE: dumb: LWS_CALLBACK_CLIENT_CONFIRM_EX<wbr>TENSION_SUPPORTED [deflate-frame]<br>
[2017/02/09 16:03:26:0554] NOTICE: dumb: LWS_CALLBACK_CLIENT_APPEND_HAN<wbr>DSHAKE_HEADER<br>
[2017/02/09 16:03:26:0554] NOTICE: dumb: LWS_CALLBACK_CLIENT_CONNECTION<wbr>_ERROR<br>
[2017/02/09 16:03:26:0564] ERR: CLIENT_CONNECTION_ERROR: dumb: (null)<br>
</blockquote>
<br></span>
I am not 100% sure what you are trying to do overall, but notice that with ws, the subprotocol header is optional.<br>
<br>
If it doesn't come, the peers are just magically supposed to know what default protocol to speak on the wire, instead of affirmatively negotiating it.<br>
<br>
"Echo" is one of these lazy servers that does not tell the protocol.  In that case lws falls back to protocols[0] by default, which may not be the protocol you are looking at.<br>
<br>
You can override who will be the default<br>
<br>
To indicate that a protocol should be used when no Protocol: header is sent<br>
by the client, you can use "default": "1"<br>
<br>
```<br>
             "ws-protocols": [{<br>
               "warmcat-timezoom": {<br>
                 "status": "ok",<br>
                 "default": "1"<br>
               }<br>
             }]<br>
```<br>
<br>
-Andy<br>
<br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div><div class="h5">
<br>
My current config:<br>
{<br>
 "vhosts": [{<br>
     "name": "localhost",<br>
     "port": "7681",<br>
     "mounts": [{<br>
       "mountpoint": "/activation",<br>
       "origin": "callback://activation-protoco<wbr>l"<br>
},{<br>
         "mountpoint": "/",<br>
         "origin": "file://c:/etc/lwsws/www/",<br>
         "default": "index.html",<br>
         "cache-max-age": "60",<br>
         "cache-reuse": "1",<br>
         "cache-revalidate": "1",<br>
         "cache-intermediaries": "0",<br>
    "extra-mimetypes": {<br>
        ".hbs": "text/x-handlebars-template",<br>
".json": "text/json",<br>
    }<br>
},{<br>
       "mountpoint": "/sys",<br>
       "origin": "callback://cmd-protocol",<br>
  "pmo":[{"api":"2"}]<br>
},{<br>
       "mountpoint": "/ui/fileCount",<br>
       "origin": "callback://cmd-protocol",<br>
  "pmo":[{"api":"3"}]<br>
},{<br>
       "mountpoint": "/prop",<br>
       "origin": "callback://cmd-protocol",<br>
  "pmo":[{"api":"1"}]<br>
}],<br>
     "ws-protocols": [{<br>
         "activation-protocol": {<br>
"status": "ok"<br>
},<br>
"cmd-protocol": {<br>
"status": "ok"<br>
}<br>
     }]<br>
    }<br>
  ]<br>
}<br>
<br>
<br></div></div><span class="">
On Sun, Feb 5, 2017 at 1:14 PM, Andy Green <<a href="mailto:andy@warmcat.com" target="_blank">andy@warmcat.com</a> <mailto:<a href="mailto:andy@warmcat.com" target="_blank">andy@warmcat.com</a>>> wrote:<br>
<br>
<br>
<br>
    On February 6, 2017 2:56:03 AM GMT+08:00, Joel Winarske<br></span><span class="">
    <<a href="mailto:joel.winarske@gmail.com" target="_blank">joel.winarske@gmail.com</a> <mailto:<a href="mailto:joel.winarske@gmail.com" target="_blank">joel.winarske@gmail.co<wbr>m</a>>> wrote:<br>
    >It seems it only looks at the first defined vhost.  If I move the<br>
    >primary<br>
    >site vhost to the bottom of the config, it no longer loads the site,<br>
    >and I<br>
    >see LWS_CALLBACK_HTTP.<br>
<br>
    Determining which vhost to serve happens one of two ways...<br>
<br>
     - if ssl is in use, the SNI feature is used to match what it<br>
    sends against the vhost name.  This allows use of the correct cert<br>
    for the vhost before the ssl tunnel is established.<br>
<br>
     - if no ssl, the Host: header contents are matched against the<br>
    vhost names.<br>
<br>
    So turn up the logging and see what you're sending from your<br>
    client for Host:.<br>
<br>
    For backwards compatibility if lws only has one default vhost all<br>
    protocols are enabled on it.  With multiple vhosts they must be<br>
    enabled individually on the vhost you want to have access to them.<br>
<br>
    -Andy<br>
<br>
    >On Sun, Feb 5, 2017 at 9:50 AM, Joel Winarske<br></span>
    <<a href="mailto:joel.winarske@gmail.com" target="_blank">joel.winarske@gmail.com</a> <mailto:<a href="mailto:joel.winarske@gmail.com" target="_blank">joel.winarske@gmail.co<wbr>m</a>>><div><div class="h5"><br>
    >wrote:<br>
    ><br>
    >> Here is my config.  I see protocol init happen for each, but<br>
    I'm not<br>
    >> seeing LWS_CALLBACK_HTTP.  If I revert to single vhost, many<br>
    mounts -<br>
    >init,<br>
    >> and LWS_CALLBACK_HTTP happen.  Albeit I can't differentiate what is<br>
    >what.<br>
    >><br>
    >> {<br>
    >>  "vhosts": [{<br>
    >>      "name": "localhost",<br>
    >>      "port": "7681",<br>
    >>      "mounts": [{<br>
    >>          "mountpoint": "/ui",<br>
    >>          "origin": "file://c:/etc/lwsws/www",<br>
    >>          "default": "index.html",<br>
    >>          "cache-max-age": "60",<br>
    >>          "cache-reuse": "1",<br>
    >>          "cache-revalidate": "1",<br>
    >>          "cache-intermediaries": "0",<br>
    >>      "extra-mimetypes": {<br>
    >>          ".hbs": "text/x-handlebars-template",<br>
    >>  ".json": "text/json"<br>
    >>      }<br>
    >>  }]<br>
    >>  }, {<br>
    >>      "name": "fileCount",<br>
    >>      "port": "7681",<br>
    >>      "mounts": [{<br>
    >>        "mountpoint": "/ui/fileCount",<br>
    >>        "origin": "callback://cmd-protocol"<br>
    >>  }],<br>
    >>        "ws-protocols": [{<br>
    >>      "cmd-protocol": {<br>
    >>       "api" : "3",<br>
    >>        "status": "ok"<br>
    >>      }<br>
    >>        }]<br>
    >>      }, {<br>
    >>      "name": "prop",<br>
    >>      "port": "7681",<br>
    >>      "mounts": [{<br>
    >>        "mountpoint": "/prop",<br>
    >>        "origin": "callback://cmd-protocol"<br>
    >>  }],<br>
    >>        "ws-protocols": [{<br>
    >>      "cmd-protocol": {<br>
    >>       "api" : "1",<br>
    >>        "status": "ok"<br>
    >>      }<br>
    >>        }]<br>
    >>      }, {<br>
    >>      "name": "sys",<br>
    >>      "port": "7681",<br>
    >>      "mounts": [{<br>
    >>        "mountpoint": "/sys",<br>
    >>        "origin": "callback://cmd-protocol"<br>
    >>  }],<br>
    >>        "ws-protocols": [{<br>
    >>      "cmd-protocol": {<br>
    >>       "api" : "2",<br>
    >>        "status": "ok"<br>
    >>      }<br>
    >>        }]<br>
    >>      }, {<br>
    >>     "name": "rest",<br>
    >>      "port": "7681",<br>
    >>      "mounts": [{<br>
    >>        "mountpoint": "/rest",<br>
    >>        "origin": "callback://cmd-protocol"<br>
    >>  }],<br>
    >>        "ws-protocols": [{<br>
    >>      "cmd-protocol": {<br>
    >>       "api" : "4",<br>
    >>        "status": "ok"<br>
    >>      }<br>
    >>        }]<br>
    >>      }<br>
    >>   ]<br>
    >> }<br>
    >><br>
    >> Something else odd I am seeing, I have no valid WS protocols<br>
    defined,<br>
    >yet<br>
    >> the server accepts all client WS requests and indicates it's<br>
    switched<br>
    >> protocols.  Am I missing something here?<br>
    >><br>
    >><br>
    >>    1. Request URL:<br>
    >>    ws://localhost:7681/activation<br>
    >>    2. Request Method:<br>
    >>    GET<br>
    >>    3. Status Code:<br>
    >>    101 Switching Protocols<br>
    >><br>
    >><br>
    >> On Wed, Feb 1, 2017 at 10:30 PM, Andy Green <<a href="mailto:andy@warmcat.com" target="_blank">andy@warmcat.com</a><br></div></div><div><div class="h5">
    <mailto:<a href="mailto:andy@warmcat.com" target="_blank">andy@warmcat.com</a>>> wrote:<br>
    >><br>
    >>><br>
    >>><br>
    >>> On 02/02/2017 02:17 PM, Joel Winarske wrote:<br>
    >>><br>
    >>>> Say I want to implement a single plugin for multiple mount<br>
    points.<br>
    >In<br>
    >>>> the protocol callback, how do I get the mount point string value?<br>
    >Do I<br>
    >>>> have to examine the header, or is it already available somewhere?<br>
    >>>><br>
    >>><br>
    >>> The right way to look at it is you created a plugin with a single<br>
    >>> protocol.<br>
    >>><br>
    >>> It happened that multiple mountpoints, usually on a different<br>
    vhost<br>
    >each<br>
    >>> time, wanted to mount an instance of that protocol somewhere in<br>
    >their URL<br>
    >>> space.<br>
    >>><br>
    >>> As far as that goes, in itself the protocol callback is not<br>
    aware of<br>
    >the<br>
    >>> mountpoint, and the mounts are all treated the same, although you<br>
    >can use<br>
    >>> per-vhost structs in the callback to mean that mounted protocol<br>
    >instances<br>
    >>> on each vhost can do things separately.<br>
    >>><br>
    >>> To make things more useful, you can pass in "pvo", per-vhost<br>
    options<br>
    >when<br>
    >>> you enable the protocol for each vhost individually.  For example<br>
    >the<br>
    >>> server-status URL I sent before has its protocol enabled like this<br>
    >>><br>
    >>>        "lws-server-status": {<br>
    >>>          "status": "ok",<br>
    >>>          "update-ms": "5000",<br>
    >>>          "filepath": "/sys/class/thermal/thermal_zo<wbr>ne0/temp",<br>
    >>>          "filepath": "/proc/version",<br>
    >>>          "hide-vhosts": "1"<br>
    >>>         },<br>
    >>><br>
    >>> So you could just as easily enable the protocol on another vhost,<br>
    >but<br>
    >>> with different settings.<br>
    >>><br>
    >>> There are also "pmo", per-mount options the plugin can<br>
    access.  But<br>
    >pvo<br>
    >>> are probably want you want if each mount is on a different vhost.<br>
    >>><br>
    >>> You can see how the server status plugin gets ahold of the pvo at<br>
    >init<br>
    >>><br>
    >>> <a href="https://github.com/warmcat/libwebsockets/blob/master/plugins" rel="noreferrer" target="_blank">https://github.com/warmcat/lib<wbr>websockets/blob/master/plugins</a><br>
    <<a href="https://github.com/warmcat/libwebsockets/blob/master/plugins" rel="noreferrer" target="_blank">https://github.com/warmcat/li<wbr>bwebsockets/blob/master/plugin<wbr>s</a>><br>
    >>> /protocol_lws_server_status.c<br>
    >>><br>
    >>> since he stashes them in his per-vhost struct, he can act<br>
    completely<br>
    >>> differently simultaneously depndning on the vhost you access him<br>
    >from.<br>
    >>><br>
    >>> -Andy<br>
    >>><br>
    >>><br>
    >>>> Thanks!<br>
    >>>><br>
    >>>><br>
    >>>> ______________________________<wbr>_________________<br>
    >>>> Libwebsockets mailing list<br>
    >>>> <a href="mailto:Libwebsockets@ml.libwebsockets.org" target="_blank">Libwebsockets@ml.libwebsockets<wbr>.org</a><br></div></div>
    <mailto:<a href="mailto:Libwebsockets@ml.libwebsockets.org" target="_blank">Libwebsockets@ml.libwe<wbr>bsockets.org</a>><br>
    >>>> <a href="https://libwebsockets.org/mailman/listinfo/libwebsockets" rel="noreferrer" target="_blank">https://libwebsockets.org/mail<wbr>man/listinfo/libwebsockets</a><br>
    <<a href="https://libwebsockets.org/mailman/listinfo/libwebsockets" rel="noreferrer" target="_blank">https://libwebsockets.org/mai<wbr>lman/listinfo/libwebsockets</a>><br>
    >>>><br>
    >>><br>
    >>><br>
    >><br>
<br>
<br>
</blockquote>
<br>
</blockquote></div><br></div>