如何在Mojolicious应用程序的单元测试中伪造客户端IP地址?

时间:2017-10-26 17:44:13

标签: perl unit-testing mojolicious

在我的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的系统)进行此操作,但这些方法在这里不起作用。

1 个答案:

答案 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