diff --git a/miniserv.pl b/miniserv.pl index 0fd243a57..9ee6e3fe4 100755 --- a/miniserv.pl +++ b/miniserv.pl @@ -5818,6 +5818,16 @@ elsif ($origin =~ /^(https?):\/\/([^:\/]+)(?::(\d+))?\/?$/i) { return undef; } +sub parse_configured_websocket_origin +{ +my ($origin) = @_; +return undef if (!defined($origin)); +$origin =~ s/^\s+|\s+$//g; +$origin =~ s/^ws:\/\//http:\/\//i; # if admin configures websocket URLs +$origin =~ s/^wss:\/\//https:\/\//i; +return &parse_websocket_origin($origin); +} + sub forwarded_websocket_origin { my ($proto, $host, $port) = @_; @@ -5874,6 +5884,22 @@ if ($config{'websocket_host'}) { } } +# Extra public origins can be whitelisted explicitly for unusual edge proxy +# configs where auto-detection cannot work +if ($config{'websocket_extra_origins'}) { + foreach my $origin (split(/\s+|,\s*/, $config{'websocket_extra_origins'})) { + next if (!$origin); + my $parsed = &parse_configured_websocket_origin($origin); + if ($parsed) { + &$add_origin($parsed); + } + else { + print DEBUG "ignoring invalid websocket_extra_origins ". + "entry $origin\n"; + } + } + } + return @rv; }