繁体   English   中英

Perl CGI问题

[英]Perl CGI problem

我正在做一些开发工作,它使用嵌入式Linux作为操作系统, Boa使用Web服务器。 我有一个网页发布到CGI脚本,处理表单数据和回复。 我的开发环境是Ubuntu,一切正常,但当我将代码移植到嵌入式Linux时,CGI模块没有实例化(或者至少似乎没有实例化)。 这是我的代码的精简部分。 print语句抱怨未初始化的变量。

use CGI;

use strict;
use warnings;

my $cgiObj = CGI->new();

print $cgiObj->param('wlanPort');

同样,这在我的开发环境中工作正常,但在嵌入式环境中失败。 安装了CGI.pm,并且CGI-> new()命令没有生成错误。 我还验证了表单数据正在发送,但显然无法保证Perl脚本正在接收它。

我觉得这是一个Boa配置问题,这就是我接下来要研究的内容。 我对Perl很新,所以我不知道还能做什么。 有任何想法吗?

编辑:绝对不是一个Boa配置问题。 还在调查它。

更新:我已将我的代码简化为以下内容:

#!/usr/bin/perl
use CGI qw(:standard);
$data = param('wlanPort') || '<i>(No Input)</i>';
print header;                            
print <<END; 
<title>Echoing user input</title>
<p>wlanPort: $data</p>           
END  

正如所料,它打印(无输入)

我还应该指出,表单是enctype =“multipart / form-data”,因为我必须具有文件上传功能,而且我使用的是“POST”方法。

我使用HttpFox插件检查发布数据并检查wlanPort值:

----------------------------- 132407047814270795471206851178 Content-Disposition:form-data; NAME = “wlanPort”

ETH1

所以它几乎肯定被发送了......

更新2:我在我的Ubuntu笔记本电脑上的嵌入式系统中安装了相同版本的Perl和Boa。 适用于笔记本电脑,而不是设备,这是相同的结果。 我告诉我的雇主,除了Boa和(Micro)Perl在设备上构建的方式与Ubuntu之外,我已经用尽所有可能性。

我知道这是一个非常古老的帖子,OP可能对与此相关的任何新信息不感兴趣,但是关于如何调试CGI脚本的一般问题仍有一些相关性。 我与dev与prod环境有类似的问题。 为了帮助那些偶然发现这个问题的人,我发表了处理这种情况的经验。 我的简单回答是,使用Log :: Log4perl和Data :: Dumper模块揭开它的神秘面纱(假设有一种方法可以访问你的prod环境中的日志)。 这种方式具有可忽略的开销,您可以在问题蔓延时启用跟踪(即使代码之前有效,但由于随时间的变化,它开始失败)。 以适当的日志级别(跟踪,调试,信息,警告,错误,致命)记录每个相关的信息位,并配置哪些级别对操作有利。 没有这些机制,就很难深入了解生产运营。 希望这可以帮助。

use CGI;
use Log::Log4perl qw(easy);
use Data::Dumper;

use strict;
use warnings;

my $cgiObj = CGI->new();

my $log = Log::Log4perl::get_logger();
$log->trace("CGI Data: " . Dumper($cgiObj));

print $cgiObj->param('wlanPort');

CGI是一个非常简单的协议,虽然我不能直接回答你的问题,但我可以建议一些技术来帮助隔离问题。

如果您的表单是通过POST提交的,那么该表单的内容将在您的脚本获取的HTTP请求的内容中显示为URLencoded字符串。 根本不使用CGI模块,您应该能够从STDIN读取请求:

my $request = "";
while (<STDIN>) {
   $request .= $_;
}

if (open my $out, ">>/tmp/myapp.log") {
    print $out $request;
    close $out;   
}

然后,您可以检查/tmp/myapp.log,看看您是否从您认为自己的请求中获取了所有信息。

为了完整性,如果您的表单通过GET提交,那么参数将位于环境变量QUERY_STRING中,您可以使用$ ENV {'QUERY_STRING'}在Perl中查看。

CGI的对象接口和功能接口解析请求的方式应该没有区别。 我不熟悉boa,但我无法想象它打破了基本的CGI协议。

一个常见的问题是您将表单参数命名为一件事,并在CGI脚本中查找不同的参数名称。 那总是笑声。

祝你好运,希望这有助于一些人。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM