0

特定の Web サイトから応答を取得するには、HTTP/1.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";

誰でもここで私を助けることができますか?

4

3 に答える 3

1

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";
于 2011-05-02T14:48:16.710 に答える
0

リクエストの解析は 100% ラウンドトリップセーフではないように見えます。つまり、レスポンスをリクエストに戻すことはできません。

一見バグのように見えますが、このモジュールは長い間公開されていませんでした... 一方で、このモジュールを使用してリクエストを解析できることさえ知らなかったので、十分にテストされていない可能性があります。

$req->request次のテスト ケースは、URL がメソッドに供給されるように適切に組み立てられていないという問題を示しているはずです。

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;
于 2011-05-02T14:40:32.803 に答える
0

わかりました、ソケットを使用してそれを行いました。結局、私は 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;

HTTP 応答は . で終わらwhileないため、EOF.

于 2011-05-02T23:36:37.397 に答える