perl - 如何使用 Perl 通过套接字发送逐字请求?

标签 perl http httprequest

我需要发送完全按照我指定的格式发送的请求,包括空格。实现这一目标的最佳方法是什么?

我要发送的请求类型示例:

GET
/
key=val
Host:example.com

该协议(protocol)是一个简单的请求-响应协议(protocol),如 HTTP。我更愿意尽可能利用 LWP 的现有代码。

最佳答案

我认为使用 LWP 是可以实现的。老实说,这有点工作。

我已经看了一下,您需要实际实现自己的协议(protocol)(请参阅 LWP::Protocol),因为这是创建实际请求的地方。之后,您需要启用该协议(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 对象构造请求(并获取主机和端口)。或者,如果您很懒惰,只需将其存储在该对象中的某个位置即可。

关于perl - 如何使用 Perl 通过套接字发送逐字请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12100805/

相关文章:

perl - 无法重新组合 MP3 数据的分块下载

javascript - PHP Post 与 JavaScript Ajax 请求

java - 我可以使用 GWT HTTP 请求从网站读取文本文件吗?

java - 如何使用 ESAPI 修复 HTTP Response splitting 漏洞

perl - 对 perl 数组使用像 grep 和 sed 这样的 unix 命令

perl - 返回所有具有最大值的哈希键/值对

regex - 在 Perl 正则表达式中转义 @

html - 尽管表单有效,但 ParseMultipartForm 总是失败

javascript - Angular 2 HTTP获取处理404错误

php - 如何在 PHP 中返回静态文件?