2012-08-23 2 views
2

공백을 포함하여 내가 지정한대로 정확하게 형식화 된 요청을 보내야합니다. 이것을 달성하는 가장 좋은 방법은 무엇입니까?Perl을 사용하여 소켓을 통해 축 어적으로 요청을 보내는 방법은 무엇입니까?

GET 
/
key=val 
Host:example.com 

프로토콜은 HTTP 같은 간단한 요청 - 응답 프로토콜 : 요청의 종류의

예는 내가 보내려고합니다. 가능한 경우 LWP의 기존 코드를 활용하는 것을 선호합니다.

+0

@ raina77ow HTTP :: Request를 서브 클래 싱하지 않고 LWP를 사용하여 이것을 수행 할 수있는 방법이 있습니까? – Andreas

+0

당신은 무엇을 시도 했습니까? 그리고 응답은 어떻습니까? 직접 처리 하시겠습니까? 아니면 모듈을 원하십니까? –

+0

@ MichałGórny : CPAN을 수색했습니다. 나는 내 자신의 소켓을 열거 나 LWP 소스를 편집 할 수 있다고 생각하지만, 내가 누락 된 간단한 방법이있는 것처럼 느껴진다. – Andreas

답변

3

나는 LWP로 달성 할 수 있다고 생각한다. 솔직히 말해서 약간의 작업입니다.

실제 프로토콜을 구현해야하므로 실제 요청을 생성하기 때문에 실제로 프로토콜을 구현해야합니다 (LWP::Protocol 참조). 그 후, 당신은 HTTP (또는 https)의 구현으로 그 프로토콜을 활성화해야합니다

LWP::Protocol::implementor('http', 'MyFunkyProtocol'); 

를 예를 들어, LWP::Protocol::GHTTP 코드를 살펴.

간단히 말하면 request 메서드를 구현하는 패키지를 만들어야한다는 것입니다. 이 방법에서는 요청을 어셈블하고 연결을 열고 보내고 응답을 받아야합니다.


다음은 간단한 작업 예제입니다.

MyFunkyProto.pm :

package MyFunkyProto; 

use LWP::Protocol; 
@ISA = qw/LWP::Protocol/; 

use HTTP::Response; 
use IO::Socket; 
use Carp qw/croak/; 

sub request 
{ 
    my ($self, $request, $proxy, $arg, $size, $timeout) = @_; 

    my $remote = IO::Socket::INET->new(
     Proto  => "tcp", 
     PeerAddr => "example.com", 
     PeerPort => "http(80)" 
    ) or croak('unable to connect'); 

    my $message = <<EOF; 
GET 
/
key=val 
Host:example.com 
EOF 

    $remote->print($message); 
    $remote->flush(); 

    local $/; 
    my $resp = HTTP::Response->parse(<$remote>); 

    $remote->close(); 

    return $resp; 
}; 

1; 

script.pl : 실제로 요청을 구성 (호스트와 포트 얻기)를 $request 객체를하기를 원할 것입니다

#!/usr/bin/env perl 

use strict; 
use warnings; 
use lib '.'; 

use MyFunkyProto; 
use LWP::Protocol; 
use LWP::UserAgent; 

LWP::Protocol::implementor('http', 'MyFunkyProto'); 

my $fr = HTTP::Request->new('GET', 'http://www.example.com/'); 
my $ua = LWP::UserAgent->new(); 

my $r = $ua->request($fr); 
print $r->as_string(); 

참고. 또는 게으른 사람이라면 그 물건의 어딘가에 보관하십시오.

3

아마도 IO::Socket::INET 모듈을 사용할 수 있습니다. 여기를 사용 example 단축 비트는 다음과 같습니다 즉

#!/usr/bin/perl 
use IO::Socket; 
my $host = '127.0.0.1'; # an example obviously 
my $remote = IO::Socket::INET->new( 
    Proto  => "tcp", 
    PeerAddr => $host, 
    PeerPort => "http(80)", 
); 

my $message = <<MSG; 
GET 
/
key=val 
Host:example.com 
MSG 
unless ($remote) { die "cannot connect to http daemon on $host" } 
$remote->autoflush(1); 
print $remote $message; 
while (<$remote>) { print } 
close $remote; 

가하는 프로토콜 계층 구조에서 약간 낮은 이동합니다.)

관련 문제