2013-07-03 4 views
1

JSON을 페이로드로 사용하는 간단한 웹 서비스에 대한 특정 요청에 대해 간단한 http 프록시를 구현하려고합니다.Mojolicious - http 프록시 역할 수행

이에 대한 정보는 있지만 설명서에는 완전한 예제가 없습니다. 나는 Google 검색 결과에서 찾은 블로그 게시물에서 일부 코드를 시도했지만 아무 것도 얻을 수 없습니다. 여기에 내가있는 곳이있다.

요청은 로그에

sub handle 
{ 
    my $self = shift; 
    my $app = shift; 

    my $tx = $app->tx; 
    my $req = $app->req->clone; 
    $log->info("upstream host is " . $self->{upstream_host}); 
    $log->info("upstream port is " . $self->{upstream_port}); 
    $req->url->scheme("http") 
      ->host($self->{upstream_host}) 
      ->port($self->{upstream_port}); 

    $log->info("req: " . $req->to_string); 
    $log->info("req host:port " . $req->url->host . ":" . $req->url->port); 

    my $ua = Mojo::UserAgent->new; 
    my $tx = Mojo::Transaction::HTTP->new(req => $req); 

    $log->info("response: " . $tx->res->to_string()); 

    $app->render(data => $tx->res->body); 
} 

모든 것이 올바른 모습과 같이 핸들 방법, 핸들러 객체로 전달되지만, 응답 객체는 404 오류이며, 실제 트래픽이 내 다른 서비스에 도달하지 localhost : 3334에서 수신 대기 중입니다.

2013-07-02 12 : 28 : 26.929793500 [정보] req 호스트 : 포트 127.0.0.1:3334 2013-07-02 12 : 28 : 26.930225500 [Tue 7 월 2 일 12시 28 분 26 초 2013] [정보] 응답 : HTTP/1.1 404 찾을 수 없음

나는이 비 차단 버전을 시도했지만 다시 요청이 전송되지 않았으므로 단순화하려고 시도했다.

감사의 말, 나는 여기서 어디서 잘못되었는지 모르겠습니다. 난 그냥 요청을 복제하고, 다른 서비스에 전달하고, 그 응답을 원래의 클라이언트에 반환하려고한다.

감사합니다, 마이크

+0

handle 메소드가 예상하는 인수를 얻는 지 확인하거나 확인 할 수 있습니까 ('Data :: Dumper' 또는 다른 방법으로)? –

+0

입력이 양호합니다. 지금까지 트랜잭션 코드를 삭제하고 기본 $ ua-> get()을 수행하여이 작업을 수행했습니다. 설명서에 따르면 콜백없이 build_tx()를 사용하면 비 차단 요청이 수행되지만 표시되지는 않습니다. 제 경우에는 요청을 전혀 수행하지 않습니다. –

+0

아, 전 CentOS 6이 아닙니다. perl-Mojolicious-3.05-6.el6.noarch 및 perl 5.10.1. –

답변

2

이상한, 좋아. 이 작동합니다.

sub handle 
{ 
    my $self = shift; 
    my $app = shift; 

    my $tx = $app->tx; 
    my $req = $app->req->clone; 
    $log->debug("upstream host is " . $self->{upstream_host}); 
    $log->debug("upstream port is " . $self->{upstream_port}); 
    $req->url->scheme("http") 
      ->host($self->{upstream_host}) 
      ->port($self->{upstream_port}); 

    $log->debug("req: " . $req->to_string); 
    $log->debug("req host:port " . $req->url->host . ":" . $req->url->port); 

    my $ua = Mojo::UserAgent->new; 
    my $tx = $ua->start(Mojo::Transaction::HTTP->new(req => $req)); 

    $app->render(data => $tx->res->body); 
} 

나는 그게 내가하고 이미 무엇 크게 다르다 방법을 볼려고 ...

지금,이 차단 요청입니다. 내가 비 블로킹 (non-blocking)을 할 수 있는지 알아 봅시다.

+1

이 유사 콘텐츠가 작동하지 않습니다. my $ ua = Mojo :: UserAgent-> new; my $ tx = $ ua-> start (Mojo :: Transaction :: HTTP-> new (req => $ req) => sub { my ($ ua, $ tx) = @_; $ app-> render (data => $ tx-> res-> body); }); 비 차단이지만 요청이 발생하지 않습니다. –

+0

+1 자신을 대답하기 위해 :-) 항상 버그 일 수있는 기회가 있습니다. Mojolicious 최신 버전을 사용해 보셨습니까? –

+0

Mojolicious는 현재 4.16이며 "트랜잭션"에 대한 빠른 검색 결과 ~ [15 버그/문제]가 있음을 나타냅니다 (https://github.com/kraih/mojo/search?p=1&q=transaction&ref=cmdform&type=Issues).)이보고되었고 대부분이 수정되었다. 테스트 할만한 가치가 있을지도 모릅니다. 어쨌든 나는 왜 두 번째 코드 예제가 당신을 위해 +1을하는지에 대한 자신 만의 설명을 기대한다 :-) –