我正在尝试为客户端虚拟化旧系统。这使用SOAP将数据从前端传递到后端并再次传回。所有代码都已复制并从CPAN安装相关的Perl模块。然而,大多数前端系统在进行SOAP调用时都会工作,系统崩溃,API日志中出现此错误:
Illegal field name 'APR::Table=HASH(0x7fe19a0c41e0)' at /usr/lib/perl5/site_perl/5.20.1/SOAP/Transport/HTTP2.pm line 103.
查看有问题的模块,错误的部分是这一部分,第103行是do {}
块:
my $cl = ($self->{'MOD_PERL_VERSION'} == 1) ?
$r->header_in('Content-length') : $r->headers_in->{'Content-length'};
$self->request(HTTP::Request->new(
$r->method() => $r->uri,
HTTP::Headers->new($r->headers_in),
do { my ($c,$buf); while ($r->read($buf,$cl)) { $c.=$buf; } $c; }
));
$self->SUPER::handle;
我在OO Perl上有点挣扎(我认为在程序方面)但是我可以告诉它构建一个对象,其中方法是URI,然后在do{}
循环中构建头文件,将它们附加到$c
,最后将$c
添加到对象。我假设它不喜欢循环返回的一个或多个字段名称,但是当我尝试添加调试以将$buf
变量打印到/ tmp中的文件时它没有产生任何输出。
在尝试解决此问题时,我遇到了这个建议(虽然这与Transport :: HTTP有关,而不是我们正在使用的Transport :: HTTP2):https://www.tnpi.net/support/forums/index.php?topic=1037.0我已将HTTP :: Message降级为版本6.04,但错误仍然存在。
所以我想知道a)如何获得一些调试输出以查看问题实际是什么,以及b)有关如何使其工作的任何建议?
更新1(回复第一个回复):
谢谢!
它似乎不喜欢那个my $data = do{}
部分,所以我选择了这个:
use Data::Dumper;
my ($data);
open (L1, ">>/tmp/testlog1.txt");
print L1 "Starting to dump data...\n";
my $method = $r->method();
print L1 "Dumping \$r\n" . Dumper($r);
print L1 "Dumping \$method\n" . Dumper($method);
my $uri = $r->uri;
print L1 "\$method = $method => $uri\n";
my $headers = HTTP::Headers->new($r->headers_in);
print L1 "Dumping headers\n" . Dumper($headers);
产生了下面的输出。
Starting to dump data...
Dumping $r
$VAR1 = bless( do{\(my $o = '140277572968608')}, 'Apache2::RequestRec' );
Dumping $method
$VAR1 = 'POST';
$method = POST => /
Dumping headers
$VAR1 = bless( {}, 'HTTP::Headers' );
变量真的应该包含那个"祝福"构造
答案 0 :(得分:1)
要进一步调试,请尝试调试要发送到$self->request
的值,以及实际导致错误的命令。
我会尝试这样的事情(替换$self->request
语句):
use Data::Dumper;
my $method = $r->method();
my $uri = $r->uri;
warn "$method => $uri";
my $headers = HTTP::Headers->new($r->headers_in);
warn Dumper($headers);
my $data;
{
my ($buf);
while ($r->read($buf,$cl)) { $data.=$buf; }
}
warn "data: $data";
my $req = HTTP::Request->new(
$method => $uri,
$headers,
$data
);
warn Dumper($req);
$self->request($req);