How do I fake the client IP address in a unit test for a Mojolicious app?

前端 未结 1 1574
春和景丽
春和景丽 2021-02-13 18:15

In my Mojolicious app I need to use the client\'s IP address ($c->tx->remote_address) for rate limiting of a service. This works well.

I am now trying

1条回答
  •  迷失自我
    2021-02-13 18:41

    The author of Mojolicious pointed out on IRC to look at the unit tests in the Mojo dist for the X-Forwarded-For header implementation, so I did.

    We need to set the $ENV{MOJO_REVERSE_PROXY} to a true value in the unit test and restart the server, then send an X-Forwarded-For header with the new IP address and things will just work.

    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;
    

    The tests now pass.

    ok 1 - GET /foo
    ok 2 - content is similar
    ok 3 - GET /foo
    ok 4 - content is similar
    1..4
    

    0 讨论(0)
提交回复
热议问题