我想发布内容类型为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--
问题是我如何使用boundary
手动将----WebKitFormBoundary[...]
设置为32个字符串,例如浏览器LWP
?
或者只能使用IO::Socket
?
答案 0 :(得分:2)
LWP允许您在执行multipart/form-data
请求时手动设置边界。遗憾的是,此功能根本没有记录。
但是,您必须明确地执行 multipart
。您可以通过将边界附加为Content-Type
的附加字段来设置自己的边界。它将是converted to a header appropriately by HTTP::Request::Common。
my $ua = LWP::UserAgent->new;
$ua->post(
'http://127.0.0.1:12555',
'Content-Type' =>
'multipart/form-data;boundary=Nobody-has-the-intention-to-erect-a-wall',
# ^^^^^^^ ^^^^^^^^
Content => {
data1 => rand,
data2 => rand,
},
);
使用您的监听器,会产生以下输出。
POST / HTTP/1.1
TE: deflate,gzip;q=0.3
Connection: TE, close
Host: 127.0.0.1:12555
User-Agent: libwww-perl/6.15
Content-Length: 269
Content-Type: multipart/form-data; boundary=Nobody-has-the-intention-to-erect-a-wall
--Nobody-has-the-intention-to-erect-a-wall
Content-Disposition: form-data; name="data2"
0.0575856828104122
--Nobody-has-the-intention-to-erect-a-wall
Content-Disposition: form-data; name="data1"
0.677908250902878
--Nobody-has-the-intention-to-erect-a-wall--
请注意,如果在任何部分的正文中找到边界字符串,HTTP :: Request :: Common将用随机字符串替换您的边界。它不仅会为您的边界添加数字。
答案 1 :(得分:1)
边界的唯一目的是将消息部分分开,对它的唯一要求是它不会出现在消息的任何地方。我没有看到一个很好的理由试图让它成为同样的"除此之外。此外,没有任何工具可以保证它始终使用相同的工具。
更重要的是,将其设置为固定字符串(不考虑消息)是危险的:如何知道这样的字符串可能不在消息中?
最后,我认为不可能这样做,正是因为边界必须检查以确保它确实不在消息中;所以没有工具可以提供将其设置为预定义字符串的方法。
看看HTTP::Request::Common's source。看看sub boundary()
如何严重破坏字符串返回,以及在其他地方进入边界的工作量。如果CHECK_BOUNDARY:
块不够好,则post
块会进一步更改。这显然不是设置在外面。
LWP::UserAgent
SUBMIT
方法作为此模块的快捷方式存在。
请注意simbabque found a way设置边界,然后进行检查。