2013-03-30 9 views
5

Joel Berger posted this little program to start a web server to serve local files, e funziona benissimo:Come posso ottenere la porta scelta da Mojolicious :: Lite?

use Mojolicious::Lite; 

@ARGV = qw(daemon); 

use Cwd; 
app->static->paths->[0] = getcwd; 

any '/' => sub { 
    shift->render_static('index.html'); 
    }; 

app->start; 

ho precompilato riga di comando in @ARGV perché ho dimenticato di farlo. Quando comincia, dà un messaggio che indica quale porta ha scelto, con 3000 se possibile:

$ perl ~/bin/mojo_cwd 
[Fri Mar 29 19:14:09 2013] [info] Listening at "http://*:3000". 
Server available at http://127.0.0.1:3000. 

mi piacerebbe ottenere che porta pro-grammaticalmente così una suite di test può sapere dove cercare per esso e preferirei non farlo scartando la produzione. Nessuno dei miei esperimenti per questo è stato utile e penso che stavo andando sempre nella direzione sbagliata. Sembra che non scelga la porta fino a quando non inizia, e quando chiamo start, è la fine di tutto.

Non voglio nemmeno specificare la porta.

Questa non è una questione urgente. Ho una soluzione corrente a questo con un altro semplice framework HTTP, ma ho cercato di sostituire la maggior parte di quella roba con Mojo se possibile. Dato che le vecchie cose funzionano ancora, questo è davvero qualcosa di carino da avere piuttosto che qualcosa sulla mia strada.

+1

Sarebbe utile se si desidera inviare il codice da cui si sta cercando di ottenere il numero di porta - in modo che possiamo vedere quello che vi aspettate mojolicious per esporre e come. –

+1

Tutto il codice è proprio lì. Voglio eseguire quello script e conoscere il numero di porta. La risposta di sri è che è sempre 3000 o niente. –

+1

che sarebbe stato facile da testare: provare ad avviare 2 istanze di app in parallelo dà l'errore 'Impossibile creare il socket di ascolto: Indirizzo già in uso a ...' - questo mostra che l'unica porta è stata provata solo –

risposta

7

Non è possibile, ma il comando daemon si collega solo alla porta 3000 e non proverà altro a meno che non lo si dica. Se si utilizza Test::Mojo, non è necessario conoscere la porta in anticipo in ogni caso, per qualsiasi altra cosa è sempre possibile avvolgere l'applicazione in un piccolo script Mojo::Server::Daemon.

use Mojolicious::Lite; 
use Mojo::IOLoop; 
use Mojo::Server::Daemon; 

get '/' => {text => 'Hello World!'}; 

my $port = Mojo::IOLoop->generate_port; 
my $daemon = Mojo::Server::Daemon->new(
    app => app, 
    listen => ["http://*:$port"] 
); 
$daemon->run; 
+0

Ok, buono a sapersi. Non sto davvero creando un'app Mojo. Sto usando un server molto leggero per testare il recupero di alcuni file statici per il codice del client web. –

4

Con il --listen param si specifica per la vostra applicazione dove ascoltare:

use Mojolicious::Lite; 

@ARGV = qw(daemon --listen http://*:5000); 

use Cwd; 
app->static->paths->[0] = getcwd; 

any '/' => sub { 
    shift->render_static('index.html'); 
    }; 

app->start; 

si può accedere al numero di porta all'interno della app con $self->tx->local_port:

#!/usr/bin/env perl 
use Mojolicious::Lite; 

@ARGV = qw(daemon --listen http://*:5000); 

use Cwd; 
app->static->paths->[0] = getcwd; 

any '/' => sub { 
    my $self = shift; 

    $self->render_text('port: '. $self->tx->local_port); 
    }; 

app->start if $ENV{MOJO_MODE} ne 'test'; 

1; 

mi piace mettere alla prova Mojolicious applicazioni con Test::Mojo perché si accede all'app in esecuzione, ad esempio, in un file t/test_mojo.t:

use strict; 
use warnings; 

use feature 'say'; 

use Test::More; 
use Test::Mojo; 

$ENV{MOJO_MODE} = 'test'; 

require "$FindBin::Bin/../test_mojo.pl"; 

my $t = Test::Mojo->new; 
$t->get_ok('/')->status_is(200)->content_is('port: '.$t->tx->remote_port); 

say 'local port: '. $t->tx->local_port; #as seen from the user-agent's perspective 
say 'remote port:'. $t->tx->remote_port; 
done_testing(); 

Non sono sicuro di aver capito correttamente cosa stai cercando di realizzare, ma spero che questo ti aiuti.

+0

Ho detto esplicitamente che non volevo scegliere la porta. Non voglio fare il lavoro per trovare una porta aperta. Inoltre, l'accesso al server Web per ottenere la porta significa che non ho bisogno di sapere quale sia la porta. –