LINUX.ORG.RU

Perl: Http через proxy


0

0

Задача - получить файл через http-proxy

proxy, по ходу дела, кэширующий. отправляю запрос на proxy_host:proxy_port -> получаю редирект на host:new_port

Вопрос - что делать дальше? Пытался запросить с прокси через этот порт - получил тот-же редирект. Через радной - тоже.

Пытался поставлять порт в запрос - тоже самое...

Ответ на: комментарий от theserg

>search.cpan.org

Например? LWP не катит. Он умеет, но это не то. Пытался в нём разобраться, но уж очень много понакручено там, ничего не понял. :(

Нужен именно сам принцип. Что,кому и в каком порядке отправлять.

TripleGluk
() автор топика
Ответ на: комментарий от cvb

Пытался использовать NET::HTTPTunnel
результат:
[1884]  *** Connecting: yandex.ru:80 (via 172.17.0.101:3128)
PeerAddr => 172.17.0.101
PeerPort => 3128
-> CONNECT yandex.ru:80 HTTP/1.0

<- HTTP/1.0 403 Forbidden
<- Expires: Thu, 15 Mar 2007 12:05:53 GMT
<- X-Squid-Error: ERR_ACCESS_DENIED 0
<- X-Cache: MISS from proxy.gnivc.ru
<- Proxy-Connection: close

если сам с проксёй работаю:

my $socket = IO::Socket::INET->new( PeerAddr => $proxy_h, 
		PeerPort => "http($proxy_p)",
		Proto => 'tcp',
		Timeout => 60 ) || die "Error: $@";


[1492]  *** Connecting: yandex.ru:80 (via 172.17.0.101:3128)
[1492]   -> GET / HTTP/1.1
[1492]   -> Host: yandex.ru
[1492]   -> User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; en)
[1492]  <- HTTP/1.1 302 Found
[1492]  <- Location: http://yandex.ru:7778/pls/portal/
[1492]  <- Connection: close
[1492]  *** redirected to http://yandex.ru:7778/pls/portal/

[1492]  *** Connecting: yandex.ru:7778 (via 172.17.0.101:3128)
[1492]   -> GET /pls/portal/ HTTP/1.1
[1492]   -> Host: yandex.ru
[1492]   -> User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; en)
[1492]  <- HTTP/1.1 302 Found
[1492]  <- Location: http://yandex.ru:7778/pls/portal/
[1492]  <- Connection: close
[1492]  *** redirected to http://yandex.ru:7778/pls/portal/

дальше повторяется.

пытался через 172.17.0.101:7778 - тоже самое..
если "Host: yandex.ru:7778" - тоже самое

больше вариантов придумать не удалось.

TripleGluk
() автор топика
Ответ на: комментарий от TripleGluk

Да, в случае с тунелем ответ (похоже) был от искомого сервака. В остальных - ответ от прокси. (судя по тексту ответа, когда он был)

TripleGluk
() автор топика
Ответ на: комментарий от TripleGluk

ещё вариант (через тунель)

[1836] *** Connecting: http://ya.ru:80 (via 172.17.0.101:3128) PeerAddr => 172.17.0.101 PeerPort => 3128

-> CONNECT http://ya.ru:80 HTTP/1.1 -> Host: 172.17.0.101:3128

<- HTTP/1.0 404 Not Found <- Server: squid/2.5.STABLE4 <- X-Squid-Error: ERR_DNS_FAIL 0

Во время доставки URL: "http:443" Произошла следующая ошибка: Невозможно определить IP адрес узла

вот это вобще не понял.

TripleGluk
() автор топика
Ответ на: комментарий от TripleGluk

у меня вот это работает(захожу на яндекс, используя прокси http://168.215.123.44:8080 ):

#!/usr/bin/perl -w

use strict;
use LWP::UserAgent;
use CGI qw(header -no_debug);

my $URL = 'http://www.ya.ru/';
my $ua = new LWP::UserAgent;

$ua->proxy(['http', 'ftp'], 'http://168.215.123.44:8080');
#$ua->proxy('gopher', 'http://172.17.0.101:3128/');

my $res = $ua->request(new HTTP::Request GET => $URL);
print header, $res->is_success ? $res->content : $res->status_line;

vilfred ☆☆
()
Ответ на: комментарий от vilfred

вот тебе сохранение удаленного файла на диск, используя прокси:

#!/usr/bin/perl -w

use strict;
use LWP::UserAgent;
use CGI qw(header -no_debug);

my $URL = 'http://ya.ru/logo.gif';
my $ua = new LWP::UserAgent;

$ua->proxy(['http', 'ftp'], 'http://168.215.123.44:8080');

my $res = $ua->request(new HTTP::Request GET => $URL);
binmode(STDOUT);
print $res->is_success ? (header('image/gif'), $res->content)
                       : (header('text/html'), $res->status_line);

работает вот так:

[grb@lnfm1 grb]$ date; perl eee.pl>file.gif; ls -la file.gif; date;
Чтв Мар 15 19:13:17 MSK 2007
-rw-r--r--    1 grb      master       1186 Мар 15 19:13 file.gif
Чтв Мар 15 19:13:22 MSK 2007
[grb@lnfm1 grb]$

т.е. видно, что файл была закачан через удаленный 
прокси-сервер и положен в текущую директорию.


vilfred ☆☆
()

$ echo 'proxyuser:proxypassword'|uuencode -m - |head -2|tail -1
jhgfkhgfajsdhgflasdfsdaf==

$ telnet proxy.domain.ru 3128
Trying 172.17.0.101...
Connected to proxy.domain.ru.
Escape character is '^]'.

GET ftp://ftp.chg.ru/pub/Linux/Slackware/slackware/RELEASE_NOTES HTTP/1.0
Proxy-Authorization: Basic jhgfkhgfajsdhgflasdfsdaf==

HTTP/1.0 200 OK
Server: squid/2.5.STABLE2
Mime-Version: 1.0
Date: Thu, xx Mar 2007 xx:xx:xx GMT
Content-Type: text/plain
Content-Length: 6384
Last-Modified: Mon, 02 Oct 2006 04:37:49 GMT
Age: 75
X-Cache: HIT from proxy.domain.ru
Proxy-Connection: close

*** Тут лови контент ***
Connection closed by foreign host.

------------------------------------------------------
Эти строки вводишь ручками (итерактивно):

GET ftp://ftp.chg.ru/pub/Linux/Slackware/slackware/RELEASE_NOTES HTTP/1.0[Enter]
Proxy-Authorization: Basic jhgfkhgfajsdhgflasdfsdaf==[Enter]
[Enter]

------------------------------------------------------

P.S. На perl перевести не проблема?

:-)

Neksys ★★★
()
Ответ на: комментарий от Neksys

Не проблема.. Это примерно и есть.
Одна мелочь - тут нет этих непонятных (лично мне) редиректов.
Вопрос - как быть с ними?
Наша прокся возвращяет 302 на любой запрос.
Больше всего сбивает с толку то, что браузер посылает точно такие же запросы, и получает контент. :-(
Ладно, буду пробовать..

TripleGluk
() автор топика
Ответ на: комментарий от TripleGluk

счас точно невспомню, когда-то писал на перле аналогичную фигню, но блин ни исходников ни проблем непомню, но в GET / HTTP/1.1 я указывал полный урл(тож какие-то траблы с коннектом были) тоесть

GET http://yandex.ru:7778/pls/portal/ HTTP/1.1

cvb
()
Ответ на: комментарий от vilfred

>тыж сам писал:

Угу. Проблема в том, что сервер плюётся редиректами на которые непонятно как реагировать. Ои ни разу не вернул 200, соответственно и получить из его ответов контент пока не получается.

TripleGluk
() автор топика
Ответ на: комментарий от Neksys

>Так ты пытаешься получать данные от Ораклового Апача?

Т.е. от ораклового??????
У нас по этому адресу\порту прокся сидит и исправно работает. Ради интереса пробовал через тунель коннектится на асечный порт - без проблем, браузер тоже через него пашет(а вот как - вопрос)

TripleGluk
() автор топика
Ответ на: комментарий от TripleGluk

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

#!/usr/bin/perl -w

use Socket;



sub with_proxy {
    my ($host_pr, $port_pr, $url) = @_;
    $url =~ /http:\/\/(.*)(\/.*|$)/;
    my $host = $1;
    socket(S,AF_INET,SOCK_STREAM,getprotobyname('tcp'));
    $iaddr = inet_aton($host_pr);
    connect(S, pack "SnA4x8", 2, $port_pr, $iaddr)||return -1;
    $d = "GET $url HTTP/1.0\n".
	"Host: $host\n".
	"Connection: close\n\n";

    send(S, $d, 0);
    @data=<S>;
    close(S);
    return @data;
}


print with_proxy ("127.0.0.1",3128,"http://www.yandex.ru:80");

cvb
()
Ответ на: комментарий от cvb

>незнаю поможет ли тебе, откопал у себя исходник, только что проверил,

Огромное спасибо! Это сработало. Буду разбираться, в чём была загвоздка.

TripleGluk
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.