在我的Mojolicious应用程序中,我需要使用客户端的IP地址(0
)来限制服务的速率。这很有效。
我现在正在尝试为此功能构建单元测试,但我在测试中伪造客户端的IP时遇到了问题。
首先我认为local_address
in Mojo::UserAgent可以做我想要的,但用户代理在本地绑定应用程序的地方,并且更改它会破坏所有内容,因为它无法再找到应用程序。
然后我尝试使用Sub::Override替换remote_address
in Mojo::Transaction,但是当我$c->tx->remote_address
时,它已经适用于客户端,它尝试向不会发送请求的IP {3}}因为客户端的远程地址是服务器的地址而存在,并且我遇到了一个永远不会成功的等待阻塞请求,因为它想要的服务器不存在。
您可以使用以下MCVE来尝试。预期的结果是测试通过。
$t->post_ok
我知道如何使用Catalyst和Dancer(或其他基于Test :: Plack的系统)进行此操作,但这些方法在这里不起作用。
答案 0 :(得分:11)
Mojolicious的作者在IRC上指出要查看Mojo dist中X-Forwarded-For
标题实现so I did的单元测试。
我们需要在单元测试中将$ENV{MOJO_REVERSE_PROXY}
设置为真值并重新启动服务器,然后使用新的IP地址发送X-Forwarded-For
标头,这样就可以了。
use strict;
use warnings;
use Test::More;
use Test::Mojo;
use Mojolicious::Lite;
get '/foo' => sub { my $c = shift; $c->render( text => $c->tx->remote_address ) };
my $t = Test::Mojo->new;
$t->get_ok('/foo')->content_like(qr/\Q127.0.0.1/);
{
local $ENV{MOJO_REVERSE_PROXY} = 1;
$t->ua->server->restart;
$t->get_ok( '/foo' => { 'X-Forwarded-For' => '10.1.1.1' } )->content_like(qr/\Q10.1.1.1/);
}
done_testing;
测试现在通过了。
ok 1 - GET /foo
ok 2 - content is similar
ok 3 - GET /foo
ok 4 - content is similar
1..4