2017-10-26 29 views
11

मेरे Mojolicious ऐप में मुझे सेवा की सीमित सीमा के लिए ग्राहक के आईपी पते ($c->tx->remote_address) का उपयोग करने की आवश्यकता है। यह अच्छी तरह से काम करता है।मैं Mojolicious ऐप के लिए यूनिट परीक्षण में क्लाइंट आईपी पता कैसे नकली कर सकता हूं?

अब मैं इस सुविधा के लिए एक यूनिट परीक्षण बनाने की कोशिश कर रहा हूं, लेकिन मुझे अपने परीक्षणों में क्लाइंट के आईपी को फिक्र करने में समस्या हो रही है।

सबसे पहले मैंने सोचा कि local_address in Mojo::UserAgent जो भी मैं चाहता हूं वह कर सकता है, लेकिन वह जगह है जहां उपयोगकर्ता एजेंट स्थानीय रूप से एप्लिकेशन को बांधता है, और इसे बदलने से सबकुछ टूट जाता है क्योंकि यह ऐप नहीं ढूंढ सकता है।

मैं तो Sub::Override का उपयोग कर remote_address in Mojo::Transaction को बदलने के लिए करने की कोशिश की, लेकिन जब मैं $t->post_ok है कि पहले से ही ग्राहक के लिए लागू होता है, यह आईपी जो मौजूद नहीं है के लिए एक अनुरोध भेजने क्योंकि क्लाइंट की तरफ दूरस्थ पता है सर्वर की कोशिश करता है पता, और मैं एक प्रतीक्षा अवरोध अनुरोध के साथ अटक गया हूं जो कभी सफल नहीं होगा क्योंकि वह जिस सर्वर को चाहता है वह मौजूद नहीं है।

आप निम्नलिखित एमसीवीई का उपयोग करने के लिए प्रयास कर सकते हैं। अपेक्षित परिणाम परीक्षा उत्तीर्ण होने के लिए है।

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; 

मैं कैसे उत्प्रेरक और डांसर (या अन्य टेस्ट :: Plack आधारित सिस्टम) के साथ ऐसा करना जानते हैं, लेकिन उन दृष्टिकोण यहाँ काम नहीं करते।

उत्तर

10

Mojolicious के लेखक ने X-Forwarded-For शीर्षलेख कार्यान्वयन, so I did के लिए मोजो डिस्ट में यूनिट परीक्षणों को देखने के लिए आईआरसी पर ध्यान दिया।

हमें यूनिट परीक्षण में एक वास्तविक मूल्य पर $ENV{MOJO_REVERSE_PROXY} सेट करने और सर्वर को पुनरारंभ करने की आवश्यकता है, फिर नए आईपी पते के साथ 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 
संबंधित मुद्दे