gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 01:01:52 24 4
gpt4 key购买 nike

在我的 Mojolicious 应用程序中,我需要使用客户端的 IP 地址 ($c->tx->remote_address) 来限制服务的速率。这很好用。

我现在正在尝试为此功能构建一个单元测试,但是在我的测试中伪造客户端的 IP 时遇到了麻烦。

一开始我以为 local_address in Mojo::UserAgent可能会做我想做的事,但这就是用户代理在本地绑定(bind)应用程序的地方,并且更改它会破坏一切,因为它无法再找到应用程序。

然后我尝试使用 Sub::Override替换 remote_address in Mojo::Transaction ,但是当我做 $t->post_ok 时,这已经适用于客户端,它尝试向不存在的 IP 发送请求,因为客户端的远程地址是服务器的地址,并且我遇到了一个等待阻塞请求,该请求永远不会成功,因为它想要的服务器不存在。

您可以使用以下 MCVE 进行尝试。预期结果是测试通过。

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

# TODO change client IP address to 10.1.1.1
# in a way that the /foo route sees it
$t->get_ok('/foo')->content_like(qr/\Q10.1.1.1/);

done_testing;

我知道如何使用 Catalyst 和 Dancer(或其他基于 Test::Plack 的系统)来做到这一点,但这些方法在这里不起作用。

最佳答案

Mojolicious 的作者在 IRC 上指出要查看 Mojo dist 中的单元测试 X-Forwarded-For header 实现,so I did .

我们需要设置$ENV{MOJO_REVERSE_PROXY}在单元测试中为真值并重新启动服务器,然后发送X-Forwarded-For带有新 IP 地址的 header ,一切都会正常工作。

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

关于perl - 如何在 Mojolicious 应用程序的单元测试中伪造客户端 IP 地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46960660/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com