在Perl中,如何设置HTTP POST参数以在本地伪造HTTP环境?

时间:2012-10-18 07:15:29

标签: perl http cgi

我有一个第三方Perl脚本,旨在由浏览器执行并处理HTTP POST请求中的数据。

脚本可以从命令行执行,但是在执行此操作时,它不会在预期的环境中执行,因此无法访问所需的用户数据。

我需要非常频繁地执行脚本,并且希望避免启动Apache进程以处理可以在命令行处理的内容的开销。该脚本从命令行执行的速度比通过Apache快得多(至少没有输入数据)。

我想整理脚本,以便将命令行参数传递给脚本,就好像它们出现在HTTP POST请求中一样。

我对Perl不太熟悉,并希望在PHP中提供一个(基本)示例来表示我打算实现的目标。

<?php

$_POST['example1'] = $argv[1];
$_POST['example2'] = $argv[2];

include /var/www/thirdPartyScript.php

?>

Perl脚本按如下方式访问数据:

#!/usr/bin/perl -T

use CGI 3.40 qw(-newstyle_urls -private_tempfiles redirect);
# ...
my $q = CGI->new();
# ...
if ($q->param('example1') {

} else {

}


包装器脚本需要设置什么,以便第三方脚本可以访问相关数据,就像在HTTP POST请求中提供数据一样?

2 个答案:

答案 0 :(得分:5)

如果第三方脚本是CGI,您可以在命令行上提供参数:

your_script.pl name1=value1&name2=value2

详细了解如何在the CGI.pm documentation中测试POST和GET方法。

答案 1 :(得分:2)

您可以轻松make a real HTTP request进行测试:

use LWP::UserAgent qw();
my $ua = LWP::UserAgent->new;
$ua->post(
    'http://localhost:5000',
    [
        foo => 23,
        bar => 42,
    ]
);

你可以initialise the CGI object from a hashref or a file

use CGI qw();
my $c = CGI->new({
    foo => 23,
    bar => 42,
});

首选这些假的HTTP请求!假的,包括1月份答案中的命令行变体,缺少一些属性,例如request_method