空白を含め、指定したとおりにフォーマットされたリクエストを送信する必要があります。これを達成するための最良の方法は何ですか?
送信したいリクエストの例:
GET
/
key=val
Host:example.com
プロトコルは、HTTP のような単純な要求応答プロトコルです。可能であれば、LWP の既存のコードを利用したいと考えています。
空白を含め、指定したとおりにフォーマットされたリクエストを送信する必要があります。これを達成するための最良の方法は何ですか?
送信したいリクエストの例:
GET
/
key=val
Host:example.com
プロトコルは、HTTP のような単純な要求応答プロトコルです。可能であれば、LWP の既存のコードを利用したいと考えています。
おそらく、 IO::Socket::INETモジュールを使用するかもしれません。これを使用する少し短い例を次に示します。
#!/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;
言い換えれば、プロトコル階層を少し下に移動します。)
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:
#!/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();
オブジェクトから実際にリクエストを構築する (そしてホストとポートを取得する) 必要があることに注意してください$request
。または、怠惰な場合は、そのオブジェクトのどこかに保存してください。