微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

mod_perl和CGI行为

如何解决mod_perl和CGI行为

这一定是愚蠢的,我做错了。这是一个新手类型的问题。

原始脚本是坐着的,等待第三者连接并向其中发布一些xml,它接收该xml,进行一些验证并将其存储在db中。那部分很好。问题是我的回应。我正在尝试使用CGI的header()函数,但它没有表现。它变成空白。显然,我可以手动执行此操作并只打印标题字符串,但现在我真的很好奇为什么这样做如此奇怪。

这是cgi脚本的简化测试版本:

use strict;
use warnings;
use Data::Dumper::Names;
use CGI qw(:standard);
use Apache2::Connection ();
use Apache2::RequestRec ();

$| = 1;

# Grab the request object provided by mod_perl.
our $request_obj = shift;
our $connection  = $request_obj->connection;
our $remote_ip   = $connection->client_ip();

my $cgi = CGI->new($request_obj->args());
print STDERR Dumper($cgi);

my $input = $cgi->param('POSTDATA');
print STDERR Dumper($input);

my $cgi_header = $cgi->header();
print STDERR Dumper($cgi_header);

my $cgi_full_header = $cgi->header(-type => 'application/xml');
print STDERR Dumper($cgi_full_header);

my $q = CGI->new({});
print STDERR Dumper($q);

my $q_header = $q->header();
print STDERR Dumper($q_header);

my $q_full_header = $q->header(-type => 'application/xml' );
print STDERR Dumper($q_full_header);

输出


$cgi = bless( {
                '.r' => bless( do{\(my $o = '94118860562256')},'Apache2::RequestRec' ),'param' => {
                             'POSTDATA' => [
                                             'test'
                                           ],'XForms:Model' => [
                                                 'test'
                                               ]
                           },'use_tempfile' => 1,'.fieldnames' => {},'.charset' => 'ISO-8859-1','escape' => 1,'.parameters' => [
                                   'XForms:Model','POSTDATA'
                                 ]
              },'CGI' );
$input = 'test';
$cgi_header = '';
$cgi_full_header = '';
$q = bless( {
              '.parameters' => [
                                 'XForms:Model','POSTDATA'
                               ],'.r' => bless( do{\(my $o = '94118860562256')},'param' => {
                           'POSTDATA' => [
                                           ''
                                         ],'XForms:Model' => [
                                               ''
                                             ]
                         }
            },'CGI' );
$q_header = '';
$q_full_header = '';

这是我用来发送POST的简单测试脚本。

#!/perl/bin/perl
use strict;
use warnings;
use DBI;
use URI;
use LWP::UserAgent;
use Data::Dumper::Names;

my $ua  = LWP::UserAgent->new;
$ua->max_size( 131072 );
$ua->agent('test_xml_pusher');
$ua->ssl_opts(verify_hostname => 0);

my $url = URI->new;
$url->scheme('https');
$url->host('xxxxxxxxxxxxxxxxxxxxxxxxx');
$url->port(443);
$url->path_segments('test.cgi');
# Yes,I kNow...  it's not valid xml...  don't care for the purposes of this test.
#
my $xml = 'test';

my $response = $ua->post( $url,Content => $xml,'Content-Type' => 'application/xml' );
print Dumper($response);

my $status_line = $response->status_line;
print Dumper($status_line);

my $content = $response->content;
print Dumper($content);

那么$cgi_header为什么为空?为什么$q最终还是引用了与$cgi相同的东西,即使我尝试将其初始化为my $q = CGI->new({});呢? (我也尝试使用空引号而不是空括号。)

有什么想法吗?

谢谢!

我的环境是一台运行apache httpd 2.4.34且具有mod_perl 2.0.11和perl 5.22.4的centos 7服务器。 (httpd是从SCL安装的,而perl和mod_perl是从源安装的。)

- 安迪

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。