2

空白を含め、指定したとおりにフォーマットされたリクエストを送信する必要があります。これを達成するための最良の方法は何ですか?

送信したいリクエストの例:

GET
/
key=val
Host:example.com

プロトコルは、HTTP のような単純な要求応答プロトコルです。可能であれば、LWP の既存のコードを利用したいと考えています。

4

2 に答える 2

3

おそらく、 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;

言い換えれば、プロトコル階層を少し下に移動します。)

于 2012-08-23T22:33:02.277 に答える
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:

#!/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。または、怠惰な場合は、そのオブジェクトのどこかに保存してください。

于 2012-08-23T22:40:49.933 に答える