From 1b315df6f6a48c913d4df5d314add6e84df7a242 Mon Sep 17 00:00:00 2001 From: Mat Sepahi Date: Wed, 28 Aug 2019 11:57:25 +0000 Subject: [PATCH 1/4] fetch missing backend from action settings --- lib/Mojo/WebSocketProxy/Dispatcher.pm | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/lib/Mojo/WebSocketProxy/Dispatcher.pm b/lib/Mojo/WebSocketProxy/Dispatcher.pm index abed63a5..35d618cf 100644 --- a/lib/Mojo/WebSocketProxy/Dispatcher.pm +++ b/lib/Mojo/WebSocketProxy/Dispatcher.pm @@ -14,6 +14,7 @@ use Unicode::Normalize (); use Future::Mojo 0.004; # ->new_timeout use Future::Utils qw(fmap); use Scalar::Util qw(blessed); +use List::Util qw(first); use Encode; use DataDog::DogStatsd::Helper qw(stats_inc); @@ -194,7 +195,6 @@ sub _run_hooks { sub dispatch { my ($c, $args) = @_; - my $log = $c->app->log; $log->debug("websocket got json " . $c->dumper($args)); @@ -216,11 +216,26 @@ sub forward { grep { $_ } (ref $config->{$hook} eq 'ARRAY' ? @{$config->{$hook}} : $config->{$hook}), grep { $_ } (ref $req_storage->{$hook} eq 'ARRAY' ? @{$req_storage->{$hook}} : $req_storage->{$hook}), ]; - } + }; - my $backend_name = $req_storage->{backend} // "default"; - my $backend = $c->wsp_config->{backends}{$backend_name} - or die "Cannot dispatch request - no backend named '$backend_name'"; + my $backend_name = delete $req_storage->{backend}; + if (!$backend_name and exists $req_storage->{msg_type}) { + # undispatched message, for witch assign_ws_backend hook is skipped + # trying to get backend from action settings + my $action = $c->wsp_config->{actions}->{$req_storage->{msg_type}} // do { + my $err = $c->wsp_error('error', UnrecognisedRequest => 'Unrecognised action'); + $c->send({json => $err}, $req_storage); + return; + }; + $backend_name = $action->{backend}; + } + $backend_name //= 'default'; + + my $backend = $c->wsp_config->{backends}{$backend_name} // do { + my $err = $c->wsp_error('error', UnrecognisedRequest => 'Unrecognised backend'); + $c->send({json => $err}, $req_storage); + return; + }; $backend->call_rpc($c, $req_storage); From 97169324fe0f5a80e4c935014c3c863cfa5ae942 Mon Sep 17 00:00:00 2001 From: Mat Sepahi Date: Wed, 28 Aug 2019 11:58:26 +0000 Subject: [PATCH 2/4] cleanup --- lib/Mojo/WebSocketProxy/Dispatcher.pm | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/Mojo/WebSocketProxy/Dispatcher.pm b/lib/Mojo/WebSocketProxy/Dispatcher.pm index 35d618cf..14e99907 100644 --- a/lib/Mojo/WebSocketProxy/Dispatcher.pm +++ b/lib/Mojo/WebSocketProxy/Dispatcher.pm @@ -14,7 +14,6 @@ use Unicode::Normalize (); use Future::Mojo 0.004; # ->new_timeout use Future::Utils qw(fmap); use Scalar::Util qw(blessed); -use List::Util qw(first); use Encode; use DataDog::DogStatsd::Helper qw(stats_inc); From 9cb52c9dfe41b5f04b833f5d694fe046ba4cbb42 Mon Sep 17 00:00:00 2001 From: Mat Sepahi Date: Wed, 28 Aug 2019 12:02:27 +0000 Subject: [PATCH 3/4] commend edited --- lib/Mojo/WebSocketProxy/Dispatcher.pm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/Mojo/WebSocketProxy/Dispatcher.pm b/lib/Mojo/WebSocketProxy/Dispatcher.pm index 14e99907..4dc85685 100644 --- a/lib/Mojo/WebSocketProxy/Dispatcher.pm +++ b/lib/Mojo/WebSocketProxy/Dispatcher.pm @@ -219,8 +219,8 @@ sub forward { my $backend_name = delete $req_storage->{backend}; if (!$backend_name and exists $req_storage->{msg_type}) { - # undispatched message, for witch assign_ws_backend hook is skipped - # trying to get backend from action settings + # trying to get backend from action settings for + # undispatched message (e.g. methods with instead_of_foward hooks) my $action = $c->wsp_config->{actions}->{$req_storage->{msg_type}} // do { my $err = $c->wsp_error('error', UnrecognisedRequest => 'Unrecognised action'); $c->send({json => $err}, $req_storage); From 3cc3ed75cdd2a52e59131e7a2a3557c270b53907 Mon Sep 17 00:00:00 2001 From: Mat Sepahi Date: Sun, 8 Sep 2019 14:53:55 +0000 Subject: [PATCH 4/4] little changes - TODO: backend is not fetched correctly for instead_of_forward calls; --- lib/Mojo/WebSocketProxy/Dispatcher.pm | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/lib/Mojo/WebSocketProxy/Dispatcher.pm b/lib/Mojo/WebSocketProxy/Dispatcher.pm index 4dc85685..73b561b8 100644 --- a/lib/Mojo/WebSocketProxy/Dispatcher.pm +++ b/lib/Mojo/WebSocketProxy/Dispatcher.pm @@ -215,25 +215,26 @@ sub forward { grep { $_ } (ref $config->{$hook} eq 'ARRAY' ? @{$config->{$hook}} : $config->{$hook}), grep { $_ } (ref $req_storage->{$hook} eq 'ARRAY' ? @{$req_storage->{$hook}} : $req_storage->{$hook}), ]; - }; + } + + my $method = $req_storage->{name} // $req_storage->{msg_type} // $req_storage->{method}; my $backend_name = delete $req_storage->{backend}; - if (!$backend_name and exists $req_storage->{msg_type}) { + unless $backend_name { # trying to get backend from action settings for # undispatched message (e.g. methods with instead_of_foward hooks) - my $action = $c->wsp_config->{actions}->{$req_storage->{msg_type}} // do { + my $action = $c->wsp_config->{actions}->{$method} // do { my $err = $c->wsp_error('error', UnrecognisedRequest => 'Unrecognised action'); $c->send({json => $err}, $req_storage); return; }; - $backend_name = $action->{backend}; + $backend_name = $action->{backend} // 'default'; } - $backend_name //= 'default'; - + my $backend = $c->wsp_config->{backends}{$backend_name} // do { my $err = $c->wsp_error('error', UnrecognisedRequest => 'Unrecognised backend'); - $c->send({json => $err}, $req_storage); - return; + $c->send({json => $err}, $req_storage); + return; }; $backend->call_rpc($c, $req_storage);