2011-05-02 5 views
0

특정 웹 사이트에서 응답을 받으려면 정확한 요청 문자열 인 HTTP/1.1을 제공해야합니다. 나는 telnet으로 그 중 하나를 시도했다, 그것은 내가 원하는 응답을 준다 (리다이렉트,하지만 나는 그것을 필요로한다).LWP로 일반 문자열 요청 보내기

그러나 동일한 요청 문자열을 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"; 

누구든지 나를 여기에 도움이 될 수 있습니다

코드인가?

답변

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; 

그것은이 EOF로 끝나지 않습니다 HTTP 응답과 같이 while를 떠나 기억하는 단지 중요합니다.

0

요청을 구문 분석하는 것이 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; 
1

요청시 지정된 스키마가없는 경우 오류가 발생합니다. 그것과 함께 제대로 작동하려면 아마 필요할 것입니다.

그래서, 당신은 당신의 요구에 대한 전체 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

하지만 서버가 내 요청을 수락하지 않기 때문에 나는 그럴 수 없습니다. 위에 주어진 모양의 요청 만 허용합니다. – Lanbo

+0

@ Scán - 서버가 이러한 유연성을 가지지 않는다면 소켓이나 직접적으로 [Net :: Telnet] (http://search.cpan.org/perldoc?Net)과 같은 저급 통신을 사용하는 것이 좋습니다. :: Telnet) – bvr

+0

@ Scán : 서버가 요청을 수락하지 않는다는 것을 어떻게 알 수 있습니까? 'parse()'가 버그가 없다면 그것은해야합니다. – reinierpost