Отправить запрос простой строкой с LWP - PullRequest
0 голосов
/ 02 мая 2011

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

Но когда я пытаюсь передать ту же строку запроса на HTTP::Request->parse(), я просто получаю сообщение 400 URL must be absolute.

Я не уверен, что это веб-сайт или LWP дает мне это, потому что, как я уже сказал, ответ работал с telnet.

Это код:

my $req = "GET / HTTP/1.1\n".
  "Host: www.example-site.de\n".
  "User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:2.0.1) Gecko/20100101 Firefox/4.0.1\n".
  "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\n".
  "Accept-Language: en-us,en;q=0.5\n".
  "Accept-Encoding: gzip, deflate\n".
  "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7\n".
  "Keep-Alive: 115\n".
  "Connection: keep-alive\n";

# Gives correct request string
print HTTP::Request->parse($req)->as_string;

my $ua = LWP::UserAgent->new( cookie_jar => {}, agent => '' );
my $response = $ua->request(HTTP::Request->parse($req));

# 400 error
print $response->as_string,"\n";

Кто-нибудь может помочь мне здесь?

Ответы [ 3 ]

1 голос
/ 02 мая 2011

LWP :: UserAgent умирает с ошибкой, которую вы получаете, если в запросе не указана схема. Вероятно, это нужно для правильной работы с ним.

Итак, чтобы это работало, вам нужно указать полный URL для вашего запроса:

my $req_str = "GET http://www.example.de/\n".
  "User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:2.0.1) Gecko/20100101 Firefox/4.0.1\n".
  "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\n".
  "Accept-Language: en-us,en;q=0.5\n".
  "Accept-Encoding: gzip, deflate\n".
  "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7\n".
  "Keep-Alive: 115\n".
  "Connection: keep-alive\n";
0 голосов
/ 03 мая 2011

Хорошо, я сделал это с помощью сокетов.В конце концов, у меня был HTTP-запрос, и я хотел получить простой ответ.Вот код для людей, которые интересуются:

use IO::Sockets;

my $sock = IO::Socket::INET->new(
    PeerAddr => 'www.example-site.de',
    PeerPort => 80, 
    Proto => 'Tcp',
);
die "Could not create socket: $!\n" unless $sock;

print $sock, $req;

while(<$sock>) {
    # Look for stuff I need
}

close $sock;

Просто важно не забывать оставлять while, так как ответ HTTP не заканчивается EOF.

0 голосов
/ 02 мая 2011

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

На первый взгляд похоже на ошибку, но модуль так долго не работал ... С другой стороны, я даже не знал, что вы можете использовать этот модуль для анализа запроса, так что, возможно, он не так хорошо протестирован .

Следующий тестовый пример должен указать на проблему, заключающуюся в том, что URL-адрес неправильно собран для подачи в метод $req->request.

use strict;
use warnings;
use LWP::UserAgent;
use HTTP::Request;
use Test::More;

my $host = 'www.example.com';
my $url = '/bla.html';

my $req = <<"EOS";
GET $url HTTP/1.1
Host: $host
EOS

# (1) parse the request
my $reqo = HTTP::Request->parse($req);
isa_ok $reqo, 'HTTP::Request';
diag explain $reqo;
diag $reqo->as_string;

# (2) construct the request
my $reqo2 = HTTP::Request->new( GET => "http://$host$url" );
isa_ok $reqo2, 'HTTP::Request';
diag explain $reqo2;
diag $reqo2->as_string;

is $reqo->uri, $reqo2->uri, 'both URLs are identical';

my $ua = LWP::UserAgent->new( cookie_jar => {}, agent => '' );
for ( $reqo, $reqo2 ) {
    my $response = $ua->request( $_ );
    diag $response->as_string,"\n";
}

done_testing;
...