什么是调试非法字段名称的最佳方法'在Perl SOAP模块中?

时间:2016-03-22 18:31:56

标签: perl debugging soap

我正在尝试为客户端虚拟化旧系统。这使用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' );

变量真的应该包含那个"祝福"构造

1 个答案:

答案 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);