2012-12-10 5 views
4

테스트를 위해 웹 사이트에 요청을 보내야합니다 - perl lwp를 사용할 때 unfortunatly "connection"헤더가 호스트에 나타납니다. 결과적으로 요청은 웹 응용 프로그램 방화벽에 의해 필터링됩니다. 내가 필요한 것은 헤더의 연결 라인을 제거하거나 제거하는 것입니다. 난 내 스크립트로 requets 작업을 수행 할 때 :Perl의 LWP에서 보낸 HTTP 요청 헤더 순서를 변경하려면 어떻게해야합니까?

GET /test.html?... HTTP/1.1 
Connection: close 
Host: www.test.com 
User-Agent: whateva 
Cookie: XXXX 

그러나 (conenction 호스트 뒤에 오는) 작업을 다음과 같아야합니다 :

use warnings; 
use IO::Socket; 
use LWP::UserAgent; 
use LWP::Protocol::http; 
use HTTP::Request; 
my $ua = LWP::UserAgent->new(); 
push(@LWP::Protocol::http::EXTRA_SOCK_OPTS, SendTE => 0, PeerHTTPVersion => "1.1"); 
$ua->default_header(Cookie => 'XXX', User-Agent => 'whateva'); 
my $request = $ua->get('https://www.test.com/test.html?...'); 
.... 

는 헤더는 다음과 같습니다

GET /test.html?... HTTP/1.1 
Host: www.test.com 
Connection: close 
User-Agent: whateva 
Cookie: XXXX 

LWP에서 어떻게 연결선을 없앨 수 있습니까? 나는 단지 그것을 다시 생각할 필요가있다 .... 그것이 완전하게 제거 될 필요가 없다. 나중에 다시 추가하여 기쁘게 생각합니다.

# $userAgent->default_header ("Connection" => "keep-alive");.. 

Thx 미리 알려주세요.

답변

3

는 HTTP/1.1 사양에 따르면

my @h3 = (@h2, @h); 
if (my ($idx) = grep /^Host:/, 0..$#h3) { 
    unshift(@h3, splice(@h3, $idx, 1)); 
} 

return _bytes(join($CRLF, "$method $uri HTTP/$ver", @h3, "", $content)); 



* —에 Net/HTTP.pm

return _bytes(join($CRLF, "$method $uri HTTP/$ver", @h2, @h, "", $content)); 

을, 방화벽 *의 버그를 해결 변경하려면 RFC 2616, "주문 필드 이름이 다른 h 헤더 필드는 중요하지 않습니다. "

+0

내 코드의 버그가 수정되었습니다. – ikegami