Hi all,
I am working on a connector with HTTP main connection and Websocket secondary connection. The websocket connection seems to be opened and then closes immediately. I verified that the websocket connection is working with postman (it is opened and stays open till the user Disconnects it) but couldn’t make it with Dataminer.
The connections tag implementation is like this:
I also tried to use the Type attribute but the same result.
The custom Websocket opening handshake:
The handshake URL is dynamic ip which is filled in after element startup and can also be changed by the user (ws://[ip]:[port]/as/system/status).
Wireshark capture shows that the opening handshake request is correctly formatted (the full request URI is correct).
The handshake seems successful as the server responds the following:
While the websocket is supposed to stay open, it closes immediately after the handshake. The strange thing is the websocket response from the server shows that it looks like the URI didn’t arrive at the server correctly. As can be seen below, the IP part is missing, and the URL contains the port and the last part of the URI.
Any help on this is much appreciated.
Hi Fenta,
As we investigated together this is most likely caused by the "Upgrade" header in the websocket handshake which is parsed in a case-sensitive way by the receiving device. DataMiner is sending "Websocket" as value, while the device expects "websocket".
However, according to websocket RFC 6455 this value should be parsed in a case-insensitive way.
Section 4.2.1
3. An |Upgrade| header field containing the value "websocket",
treated as an ASCII case-insensitive value.4. A |Connection| header field that includes the token "Upgrade",
treated as an ASCII case-insensitive value.
Hi Fenta,
I believe the problem is that it's not possible to use the 'dynamic ip' parameter to dinamically modify the URL of a session, as the 'dynamic ip' should only contain "IP:PORT", as stated in Dynamic polling | DataMiner Docs.
Therefore, I'd recommend to use a regular read parameter to hold the URL (ws://[ip]:[port]/as/system/status) of your WebSocket handshake session.
Hi Flavio,
Thanks for the answer. That didn’t make a difference. The issue seems what Tom explained in the answer.
Hi,
I'm not sure this will solve the issue, but I see that you are using url attribute to refer a parameter ID in your Session. That may cause unexpected behavior. For that you need to use the pid attribute.
Hi Nejra,
Changing the url to pid gives the same result. When using the url, the full URL is filled in the parameter.
Thanks a lot Tom for the investigation and answer.