Mojolicious - 充当http代理

时间:2013-07-03 02:38:40

标签: perl mojolicious

我正在尝试为使用JSON作为有效负载的简单Web服务的某些请求实现一个简单的http代理。

我看到了一些相关信息,但文档中没有完整的示例。我尝试过在谷歌搜索结果中发现的博客文章中的一些代码,但我没有任何可以工作的代码。我就在这里。

请求传递给处理程序对象,使用句柄方法,如此

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 [Tue Jul 2 12:28:26 2013] [info] req host:port 127.0.0.1:3334 2013-07-02 12:28:26.930225500 [Tue Jul 2 12:28:26 2013] [info]回复:HTTP / 1.1 404 Not Found

我尝试了非阻塞版本,但是再次没有发送任何请求,所以我试图简化。

帮助表示赞赏,我不确定我在哪里出错了。我只是想复制请求,将其传递给另一个服务,然后将其响应返回给原始客户端。

谢谢, 麦克

1 个答案:

答案 0 :(得分: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);
}

我试图看看这与我已经有多大不同 做...

现在,这是一个阻止请求。让我们看看我是否可以让它无阻塞地工作。