2013-03-30 3 views
5

Joel Berger posted this little program to start a web server to serve local files, 그리고 그것을 잘 작동 : 나는 그렇게 깜빡 때문에 Mojolicious :: Lite가 선택한 포트를 어떻게 얻을 수 있습니까?

use Mojolicious::Lite; 

@ARGV = qw(daemon); 

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

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

app->start; 

나는 @ARGV에 명령 줄을 미리 채워. 이 시작되면이 할 수있는 경우는 3000을 사용하여, 그것은 선택하는 포트을 알려주는 메시지를 제공합니다 :

$ 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. 

내가 프로 문법적으로 해당 포트를 좀하고 싶습니다 그래서 테스트 스위트는 어디서 찾을 지 알 수 있습니다 , 그리고 나는 출력을 폐기함으로써 그것을하지 않기를 바란다. 이것에 대한 나의 실험은 유용하지 않았고 나는 항상 잘못된 방향으로 가고 있다고 생각한다. 포트가 시작될 때까지 포트를 선택하지 않은 것처럼 보입니다. 일단 start으로 전화하면 그 포트가 끝납니다.

포트를 직접 지정하고 싶지 않습니다.

이것은 시급한 문제가 아닙니다. 다른 간단한 HTTP 프레임 워크를 사용하는 현재의 솔루션이 있지만 가능한 경우 Mojo로 그 대부분을 대체하려고합니다. 낡은 재료가 여전히 효과가 있기 때문에, 이것은 내 방식으로 무언가가있는 것이 아니라, 실제로 가지고있는 것이 좋을 것입니다. 앱에 지정한 --listen PARAM으로

+1

포트 번호를 얻으려는 코드를 게시하면 mojolicious가 노출 될 것으로 예상되는 내용과 방법을 볼 수 있습니다. –

+1

모든 코드가 바로 있습니다. 그 스크립트를 실행하고 포트 번호를 알고 싶습니다. 스리랑카의 대답은 항상 3000이나 아무것도 없다는 것입니다. –

+1

은 테스트하기 쉽습니다. 두 개의 app 인스턴스를 동시에 시작하려고하면 '청취 소켓을 만들 수 없음 : 이미 사용중인 주소 ...'오류가 발생합니다. 기본값은 시도한 유일한 포트임을 나타냅니다 –

답변

7

할 수는 없지만 daemon 명령은 포트 3000에만 바인딩되며 사용자가 지정하지 않으면 다른 것을 시도하지 않습니다. Test::Mojo을 사용하는 경우 사전에 포트를 알 필요가 없으며 항상 다른 응용 프로그램에 대해서는 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

알겠습니다. 잘 알고 있습니다. Mojo 앱을 만드는 것이 아닙니다. 매우 가벼운 서버를 사용하여 웹 클라이언트 코드의 정적 파일을 테스트합니다. –

4

곳들을 수 :

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; 

당신은 $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; 

를 내가 가진 Mojolicious 응용 프로그램을 테스트 할 Test::Mojo 실행중인 앱 (예 : 파일)에 액세스 할 수 있기 때문에 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(); 

나는 당신이 성취하려는 것을 정확히 이해하고 있는지 확신 할 수 없지만, 이것이 당신을 돕기를 바랍니다.

+0

나는 특별히 포트를 선택하고 싶지 않다고 말했다. 나는 열린 항구를 찾기위한 일을하고 싶지 않습니다. 또한 포트를 확보하기 위해 웹 서버에 액세스하는 것은 포트가 무엇인지 알아낼 필요가 없음을 의미합니다. –