我需要发送与我指定的格式完全一致的请求,包括空格。实现这一目标的最佳方法是什么?
我要发送的请求类型示例:
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;
脚本.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
对象构造请求(并获取主机和端口)。或者,如果您很懒惰,只需将其存储在该对象中的某个位置即可。