Changing Websocket url, how to deal with it?

Hello,

I'm using a websocket that changes it's URL frequently, is it possible to workaround this (for example pass options via a msg to configure the URL?).

Currently I'm using: https://flows.nodered.org/node/node-red-contrib-function-npm and manually implementing ws via 'require', but this isn't flexible as once a websocket connection is opened, I can't seem to close it, even by redeploying the function node (I guess it runs as another process in the background!).

Can anyone suggest a viable workaround?

I would begin looking at the source. Websockets exist for interaction and should be available at a single endpoint.

Sadly, the endpoint does change (like one of IBM's own Watson endpoints!).

Further, at times I find myself needing to dynamically create endpoint URL's due to changing product options, I was hoping there was a way I could automate endpoint changes...

I've located the code for the websocket node here:

I just need to work out how to add an option whereby the url can be set via a msg...

Sadly, the endpoint does change (like one of IBM's own Watson endpoints!).

these are static according to their documentation.

I ended up solving the URL issue with NGINX, here is my config:

server {
	listen 80;
	
	server_name mqtt.url;

	client_max_body_size 0;

	root /config/www/php/;
	

	location / {
		fastcgi_index ws.php;
		fastcgi_pass 127.0.0.1:9000;
		include /etc/nginx/fastcgi_params;
	}
}

server {
	listen 80;
	listen 443 ssl;
	
	server_name proxy; # could be a full URL in case this is needed

	client_max_body_size 0;

	# all ssl related config moved to ssl.conf (docker)
	include /config/nginx/ssl.conf;

	location / {
		proxy_pass http://localhost/ws.php;
		proxy_set_header   Host "mqtt.url"; # redirect to earlier instance
        proxy_intercept_errors on;
        error_page 301 302 307 = @handle_redirect; # redirect internally
	}

    location @handle_redirect {
		proxy_http_version 1.1;
		proxy_set_header Upgrade "websocket";
		proxy_set_header Connection "upgrade";
        set $saved_redirect_location '$upstream_http_location'; # This will have the new URL
        proxy_pass $saved_redirect_location;
    }
}

The job of determining which URL to redirect to is handled, in this case, by PHP:

<?php
$url = file_get_contents("https://secret/url"); // mine happens to be available elsewhere on the web
$url = str_replace("wss","https",$url); // nginx doesn't really understand wss, so redirect it as https
header("Location: $url"); // issue a 301 redirect
?>

Within the node red, it's as easy as redirecting to the instance of the nginx, as an added benefit I keep the traffic without SSL downstream of NGINX proxy (ws vs wss), as both instances of node red and nginx are running within the same docker network.

red

Cheers,
Gene

This topic was automatically closed 14 days after the last reply. New replies are no longer allowed.