공백을 포함하여 내가 지정한대로 정확하게 형식화 된 요청을 보내야합니다. 이것을 달성하는 가장 좋은 방법은 무엇입니까?Perl을 사용하여 소켓을 통해 축 어적으로 요청을 보내는 방법은 무엇입니까?
GET
/
key=val
Host:example.com
프로토콜은 HTTP 같은 간단한 요청 - 응답 프로토콜 : 요청의 종류의
예는 내가 보내려고합니다. 가능한 경우 LWP의 기존 코드를 활용하는 것을 선호합니다.
공백을 포함하여 내가 지정한대로 정확하게 형식화 된 요청을 보내야합니다. 이것을 달성하는 가장 좋은 방법은 무엇입니까?Perl을 사용하여 소켓을 통해 축 어적으로 요청을 보내는 방법은 무엇입니까?
GET
/
key=val
Host:example.com
프로토콜은 HTTP 같은 간단한 요청 - 응답 프로토콜 : 요청의 종류의
예는 내가 보내려고합니다. 가능한 경우 LWP의 기존 코드를 활용하는 것을 선호합니다.
나는 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();
참고. 또는 게으른 사람이라면 그 물건의 어딘가에 보관하십시오.
아마도 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;
가하는 프로토콜 계층 구조에서 약간 낮은 이동합니다.)
@ raina77ow HTTP :: Request를 서브 클래 싱하지 않고 LWP를 사용하여 이것을 수행 할 수있는 방법이 있습니까? – Andreas
당신은 무엇을 시도 했습니까? 그리고 응답은 어떻습니까? 직접 처리 하시겠습니까? 아니면 모듈을 원하십니까? –
@ MichałGórny : CPAN을 수색했습니다. 나는 내 자신의 소켓을 열거 나 LWP 소스를 편집 할 수 있다고 생각하지만, 내가 누락 된 간단한 방법이있는 것처럼 느껴진다. – Andreas