AnyEvent :: HTTP-запрос с прокси-сервером - PullRequest
0 голосов
/ 11 мая 2018

Я пытаюсь отправить несколько HTTP-запросов на получение, используя Perl.Мне нужно отправить запрос с помощью прокси-сервера sock.

Если я использую следующий код, я могу отправить запрос с прокси-сервером sock

#!/usr/bin/perl

use strict;

use LWP::UserAgent;

my $ua = LWP::UserAgent->new(
    agent => q{Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; YPC 3.2.0; .NET CLR 1.1.4322)},
);
$ua->proxy([qw/ http https /] => 'socks://localhost:9050'); # Tor proxy
#$ua->cookie_jar({});

$a = 10;
while ( $a < 20 ) {
    my $rsp = $ua->get('http://example.com/type?parameter=1&parameter=2');
    print $rsp->content;
    $a = $a + 1;
}

Он успешно работает, но мне нужно использовать AnyEvent для отправки нескольких запросов GET параллельно

#!/usr/bin/perl

use strict;

use AnyEvent;
use AnyEvent::HTTP;
use Time::HiRes qw(time);
use LWP::Protocol::socks;
use AnyEvent::Socket;

my $cv = AnyEvent->condvar( cb => sub {
    warn "done";
});

my $urls = [
    "http://url-1-withallparameters",
    "http://url-2-withallparameters",
    "http://url-3-withallparameters",
];

my $start = time;
my $result;

$cv->begin(sub { shift->send($result) });

for my $url ( @$urls ) {

    $cv->begin;
    my $now = time;
    my $request;

    $request = http_request(
        GET => $url, 
        timeout => 2, # seconds
        sub {
            my ($body, $hdr) = @_;

            if ($hdr->{Status} =~ /^2/) {
                push (@$result,
                        join("\t",
                        ($url,
                        " has length ",
                        $hdr->{'content-length'}, 
                        " and loaded in ",
                        time - $now,
                        "ms"))
                );
            }
            else {
                push (@$result,
                        join("",
                        "Error for ",
                        $url,
                        ": (", 
                        $hdr->{Status}, 
                        ") ", 
                        $hdr->{Reason})
                );
            }

            undef $request;
            $cv->end;
        }
    );
}

$cv->end;
warn "End of loop\n";

my $foo = $cv->recv;

print join("\n", @$foo), "\n" if defined $foo;
print "Total elapsed time: ", time-$start, "ms\n";

Это работает нормально, но я не могу отправлять эти запросы через прокси-сервер sock.

Даже в терминале, если я экспортирую прокситакие команды, как curl и wget, они прекрасно работают с прокси-сервером sock, но когда я использую команду Perl для выполнения этого скрипта в качестве прокси-сервера sock, она не работает.

Я могу интегрировать ее с LWP::UserAgentно он не работает с AnyEvent.

Я использовал

proxy => [ $host, $port ],

ниже

GET => $url, 

, но он работает только для HTTP и HTTPS-прокси, но не дляносок прокси.Этот url работает для прокси HTTP / HTTPS, но не для прокси-сервера sock.

1 Ответ

0 голосов
/ 11 мая 2018

Документация для AnyEvent::HTTP содержит это

Прокси-носки напрямую не поддерживаются AnyEvent :: HTTP

Если вы читаете этораздел может описать обходной путь, который подходит вам

В качестве альтернативы, посмотрите на AnyEvent::HTTP::Socks, который говорит:

Этот модуль добавляет новую опцию 'socks' ввсе функции http_ *, экспортируемые AnyEvent :: HTTP.Таким образом, вы можете указать socks proxy для HTTP-запросов.

или AnyEvent::HTTP::LWP::UserAgent, что должно позволить вам использовать идеи из рабочего LWP::UserAgent кода, который у вас уже есть

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...