【发布时间】:2017-12-05 05:56:32
【问题描述】:
我想发布内容类型为multipart/form-data的数据:
use strict;
use warnings;
use LWP::UserAgent;
my $ua = LWP::UserAgent->new;
$ua->post (
'http://127.0.0.1:12555',
'Content-Type' => 'form-data',
Content => {
'data1' => rand,
'data2' => rand,
}
);
并且我测试了提交的数据:
use strict;
use warnings;
use IO::Socket::INET;
use Socket qw ( inet_aton );
my $sock_listen = new IO::Socket::INET (
LocalHost => '127.0.0.1',
LocalPort => '12555',
Proto => 'tcp',
Listen => 3,
Reuse => 1,
);
$sock_listen->autoflush ();
my $sock;
while ( $sock = $sock_listen->accept ( ) )
{
my $data = '';
$sock->recv ( $data, 4096 );
print $data . "\n";
}
测试 #1 结果:
POST / HTTP/1.1
TE: deflate,gzip;q=0.3
Connection: TE, close
Host: 127.0.0.1:12555
User-Agent: libwww-perl/6.05
Content-Length: 162
Content-Type: multipart/form-data; boundary=xYzZY
--xYzZY
Content-Disposition: form-data; name="data2"
0.876556396484375
--xYzZY
Content-Disposition: form-data; name="data1"
0.62921142578125
--xYzZY--
测试#2结果:
POST / HTTP/1.1
TE: deflate,gzip;q=0.3
Connection: TE, close
Host: 127.0.0.1:12555
User-Agent: libwww-perl/6.05
Content-Length: 163
Content-Type: multipart/form-data; boundary=xYzZY
--xYzZY
Content-Disposition: form-data; name="data2"
0.896942138671875
--xYzZY
Content-Disposition: form-data; name="data1"
0.041656494140625
--xYzZY--
我添加了一条数据:
'data3' => '--xYzZY'
得到:
POST / HTTP/1.1
TE: deflate,gzip;q=0.3
Connection: TE, close
Host: 127.0.0.1:12555
User-Agent: libwww-perl/6.05
Content-Length: 221
Content-Type: multipart/form-data; boundary=Tegj
--Tegj
Content-Disposition: form-data; name="data2"
0.34613037109375
--Tegj
Content-Disposition: form-data; name="data3"
--xYzZY
--Tegj
Content-Disposition: form-data; name="data1"
0.678955078125
--Tegj--
问题是如何使用LWP 手动将boundary 设置为32 个字符的字符串,例如浏览器的----WebKitFormBoundary[...]?
或者可以只使用IO::Socket?
【问题讨论】:
-
我只是注意到 Chrome 和 IE 创建了不同的边界格式。
-
这是一个非常好的帖子,IMO。但是:为什么要设置特定的边界?首先,它的目的是分隔消息部分,因此唯一的问题是它不存在于消息中的任何位置。它不必与任何其他“相同”(并且您无法确保,因为没有一个可以保证保持不变)。此外,将其设置为任何固定值都是不好的——如果该字符串出现在消息中怎么办?
-
我将从阅读 LWP 的源代码开始。它可能会将您带到 HTTP::Message。在那里,您将看到边界是如何设置的。您可能可以覆盖它、附加一些东西或伸手去改变它。但我同意你为什么要这样做是有问题的。
-
@simbabque 它是从
HTTP::Request::Common使用的,并且代码强烈暗示它甚至不可能设置它(没有严重违反模块)。 -
@zdim 我现在无法使用计算机,所以我做了一个有根据的猜测。有可能以某种方式进行子类化。我猜它会修补它。 Class::Method::Modifiers 作为猴子补丁替代品可以工作。但是我应该先看代码,我不会在手机上搜索它。 ;-)
标签: perl http post multipartform-data lwp