【问题标题】:Mojolicious - acting as an http proxyMojolicious - 充当 http 代理
【发布时间】:2013-07-03 18:45:02
【问题描述】:

我正在尝试为使用 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 [2013 年 7 月 2 日星期二 12:28:26] [信息] 请求主机:端口 127.0.0.1:3334 2013-07-02 12:28:26.930225500 [2013 年 7 月 2 日星期二 12:28:26] [信息] 响应:HTTP/1.1 404 未找到

我尝试了这个的非阻塞版本,但实际上没有发送任何请求,所以我尝试简化。

感谢您的帮助,我不确定我在哪里出错了。我只是试图复制请求,将其传递给另一个服务,然后将其响应返回给原始客户端。

谢谢, 迈克

【问题讨论】:

  • 你能看到/确认句柄方法得到你期望的参数吗(使用Data::Dumper或其他方法)?
  • 输入是好的。到目前为止,我只是通过删除事务代码并执行基本的 $ua->get() 来完成这项工作。文档说使用没有回调的 build_tx() 将执行非阻塞请求,但我没有看到。就我而言,它根本没有执行请求。
  • 哦,我不是带有 perl-Mojolicious-3.05-6.el6.noarch 和 perl 5.10.1 的 CentOS 6。

标签: perl mojolicious


【解决方案1】:

好吧,奇怪。这行得通。

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);
}

我正在尝试看看这与我之前的情况有何显着不同 正在做...

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

【讨论】:

  • 这种变体不起作用 my $ua = Mojo::UserAgent->new;我的 $tx = $ua->start(Mojo::Transaction::HTTP->new(req => $req) => sub { my ($ua, $tx) = @_; $app->render(data => $tx->res->body); });它应该是非阻塞的,但请求永远不会发生。
  • +1 回答你自己 :-) 总是有可能是一个错误。您是否尝试过更新版本的 Mojolicious?
  • Mojolicious 现在是 4.16,快速搜索“交易”显示有/曾经报告过 ~15 bugs/issues,其中大部分已修复。可能值得测试。无论如何,我期待您自己解释为什么第二个代码示例对您有用 +1 :-)
猜你喜欢
  • 1970-01-01
  • 2021-08-07
  • 2020-12-18
  • 2012-05-28
  • 1970-01-01
  • 2013-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多