首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Perl LWP将表单-数据与我的边界

Perl LWP将表单-数据与我的边界
EN

Stack Overflow用户
提问于 2017-12-05 05:56:32
回答 2查看 1.7K关注 0票数 2

我想发布内容类型为multipart/form-data的数据

代码语言:javascript
复制
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,
    }
);

我测试了提交的数据:

代码语言:javascript
复制
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结果:

代码语言:javascript
复制
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结果:

代码语言:javascript
复制
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--

我添加了一个数据:

代码语言:javascript
复制
        'data3' => '--xYzZY'

并得到:

代码语言:javascript
复制
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个字符字符串,如浏览器的----WebKitFormBoundary[...]

也可以直接使用IO::Socket

EN

回答 2

Stack Overflow用户

发布于 2017-12-05 09:48:41

边界的唯一目的是分离消息部分,对它的唯一要求是它不会出现在消息中的任何地方。我看不出有什么好的理由试图把它设置为“和其他任何东西一样”。此外,没有任何工具可以保证它总是使用相同的工具。

更重要的是,将其设置为一个固定的字符串(不考虑消息)是危险的:如何知道这样的字符串可能不在消息中?

最后,我认为这样做是不可能的,因为必须检查边界,以确保它确实不在消息中;因此,没有任何工具应该提供将其设置为预定义字符串的方法。

看看HTTP::请求::。看看子boundary()是如何严重破坏字符串以返回的,以及在其他地方有多少工作进入边界。然后,如果CHECK_BOUNDARY:块不够好,它将进一步修改它。这显然不是在外面设置的。

post方法LWP::UserAgent作为该模块的快捷方式存在。

请注意,辛巴伯找到了一条路设置边界,然后边界也要经过检查。

票数 2
EN

Stack Overflow用户

发布于 2017-12-05 10:40:15

LWP允许您在执行multipart/form-data请求时手动设置边界。不幸的是,这个特性根本没有文档化。

但是,必须显式地执行 multipart。您可以通过将边界附加为Content-Type的附加字段来设置自己的边界。这将是通过HTTP::Request::Common适当地转换为标头

代码语言:javascript
复制
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,
    },
);

对于侦听器,这将导致以下输出。

代码语言:javascript
复制
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::parts将用随机字符串替换您的边界。它不仅会给你的边界增加一个数字。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47646959

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档