The explanation is that each 'under' route is a discrete action from the
endpoints, and must be defined and return 1 to continue the dispatch chain.

-Dan

On Fri, Jun 14, 2019 at 11:10 AM Stefan Adams <s1037...@gmail.com> wrote:

> I don't have an explanation for why this seems to be necessary for your
> situation, but after reading Mojolicious::Guides::Routing#Under
> <https://mojolicious.org/perldoc/Mojolicious/Guides/Routing#Under>, I
> found that this should work for you:
>
>   # REST interface
>   my $rest_v1 = $r->under('/rest/v1'* => sub{1}*);
>   $rest_v1->get('/')->to('example#welcome');
>
> On Thu, Jun 13, 2019 at 1:09 AM Justin Hawkins <jus...@hawkins.id.au>
> wrote:
>
>> Hello all,
>>
>> I think there is a good chance this is a case of “holding it wrong”, so I
>> will first explain what I’m trying to achieve.
>>
>> Standard web app, multiple ways of establishing rights to privileged
>> routes.
>>
>> The first is standard username/password, establishing a session.
>>
>> The second is via an API key (supplied with a header).
>>
>> I use two separate controller methods, one to check the session, one to
>> check the header. Each one has the opportunity to set a stash variable
>> indicating that the user has a valid session (via either cookie session or
>> API key).
>>
>> So I use two “under” routes to call each method. So far so good, things
>> work ok.
>>
>> The problem I have is that I later have another under route, to establish
>> a new URL path for my REST interface.
>>
>> Any requests that go through routes derived from that third “under" have
>> a strange behaviour - they call the second ‘under’ controller twice!
>>
>> This is probably easiest to see with an example:
>>
>> package TestUnder;
>> use Mojo::Base 'Mojolicious';
>>
>> # This method will run once at server start
>> sub startup {
>>   my $self = shift;
>>
>>   # Load configuration from hash returned by config file
>>   my $config = $self->plugin('Config');
>>
>>   # Configure the application
>>   $self->secrets($config->{secrets});
>>
>>   # Router
>>   my $r = $self->routes;
>>
>>   # All requests should go through these two
>>   $r = $r->under()->to('example#under_one');
>>   $r = $r->under()->to('example#under_two');
>>   $r->get('/')->to('example#welcome');
>>
>>   # REST interface
>>   my $rest_v1 = $r->under('/rest/v1');
>>   $rest_v1->get('/')->to('example#welcome');
>>
>> }
>>
>> package TestUnder::Controller::Example;
>>
>> use Mojo::Base 'Mojolicious::Controller';
>>
>> sub under_one {
>>   my $self = shift;
>>   $self->app->log->info("under_one called");
>>   1;
>> }
>>
>> sub under_two {
>>   my $self = shift;
>>   $self->app->log->info("under_two called");
>>   1;
>> }
>>
>> sub welcome {
>>   my $self = shift;
>>   $self->render(text => 'hi');
>> }
>>
>> 1;
>>
>> Example below - you can easily see that for the “REST” route, ‘under_two’
>> is called twice:
>>
>>
>>
>>
>> $ script/test_under get / >/dev/null
>> [2019-06-13 15:28:30.55547] [44306] [debug] GET "/" (9ca39c7c)
>> [2019-06-13 15:28:30.55627] [44306] [debug] Routing to controller
>> "TestUnder::Controller::Example" and action "under_one"
>> [2019-06-13 15:28:30.55637] [44306] [info] under_one called
>> [2019-06-13 15:28:30.55651] [44306] [debug] Routing to controller
>> "TestUnder::Controller::Example" and action "under_two"
>> [2019-06-13 15:28:30.55661] [44306] [info] under_two called
>> [2019-06-13 15:28:30.55675] [44306] [debug] Routing to controller
>> "TestUnder::Controller::Example" and action "welcome"
>> [2019-06-13 15:28:30.55704] [44306] [debug] 200 OK (0.001571s, 636.537/s)
>>
>> $ script/test_under get /rest/v1 >/dev/null
>> [2019-06-13 15:28:34.95883] [44315] [debug] GET "/rest/v1" (6aad1c75)
>> [2019-06-13 15:28:34.95975] [44315] [debug] Routing to controller
>> "TestUnder::Controller::Example" and action "under_one"
>> [2019-06-13 15:28:34.95984] [44315] [info] under_one called
>> [2019-06-13 15:28:34.95997] [44315] [debug] Routing to controller
>> "TestUnder::Controller::Example" and action "under_two"
>> [2019-06-13 15:28:34.96005] [44315] [info] under_two called
>> [2019-06-13 15:28:34.96020] [44315] [debug] Routing to controller
>> "TestUnder::Controller::Example" and action "under_two"
>> [2019-06-13 15:28:34.96031] [44315] [info] under_two called
>> [2019-06-13 15:28:34.96044] [44315] [debug] Routing to controller
>> "TestUnder::Controller::Example" and action "welcome"
>> [2019-06-13 15:28:34.96083] [44315] [debug] 200 OK (0.001985s, 503.778/s)
>>
>> $ mojo version
>> CORE
>>   Perl        (v5.26.1, darwin)
>>   Mojolicious (8.17, Supervillain)
>>
>> OPTIONAL
>>   Cpanel::JSON::XS 4.04+  (n/a)
>>   EV 4.0+                 (n/a)
>>   IO::Socket::Socks 0.64+ (n/a)
>>   IO::Socket::SSL 2.009+  (2.051)
>>   Net::DNS::Native 0.15+  (n/a)
>>   Role::Tiny 2.000001+    (2.000005)
>>
>> This version is up to date, have fun!
>>
>> Regards,
>>
>> Justin
>>
>> --
>> You received this message because you are subscribed to the Google Groups
>> "Mojolicious" group.
>> To unsubscribe from this group and stop receiving emails from it, send an
>> email to mojolicious+unsubscr...@googlegroups.com.
>> To view this discussion on the web visit
>> https://groups.google.com/d/msgid/mojolicious/8EB007C9-0631-448B-B654-56C6D1EE0A5A%40hawkins.id.au
>> <https://groups.google.com/d/msgid/mojolicious/8EB007C9-0631-448B-B654-56C6D1EE0A5A%40hawkins.id.au?utm_medium=email&utm_source=footer>
>> .
>>
> --
> You received this message because you are subscribed to the Google Groups
> "Mojolicious" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to mojolicious+unsubscr...@googlegroups.com.
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/mojolicious/CACyQ%2BFQ-nMkLVeXx1dZqcWh%3DTsK4PhuJWCsTAdMA%3DzMRjm3TiA%40mail.gmail.com
> <https://groups.google.com/d/msgid/mojolicious/CACyQ%2BFQ-nMkLVeXx1dZqcWh%3DTsK4PhuJWCsTAdMA%3DzMRjm3TiA%40mail.gmail.com?utm_medium=email&utm_source=footer>
> .
>

-- 
You received this message because you are subscribed to the Google Groups 
"Mojolicious" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to mojolicious+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/mojolicious/CABMkAVWkjpgHynTSYK1-%3DHZ7wuPn6ZHM0Z28c21UY%3D80YsEULg%40mail.gmail.com.

Reply via email to