2016-03-22 19 views
1

私は、クライアントの古いシステムを仮想化しようとしています。これは、SOAPを使用してフロントエンドからバックエンドにデータを渡し、再びデータを渡します。すべてのコードがCPANからインストールされた関連するPerlモジュールにコピーされています。Perl SOAPモジュールで「不正なフィールド名」をデバッグする最善の方法は何ですか?

Illegal field name 'APR::Table=HASH(0x7fe19a0c41e0)' at /usr/lib/perl5/site_perl/5.20.1/SOAP/Transport/HTTP2.pm line 103. 

がerroringされる部分はラインで、これ一つであり、問​​題のモジュールを見る:SOAPコールがAPIログでこのエラーで、システムがクラッシュした場合、フロントエンドシステムのほとんどは、しかし作品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をオブジェクトに追加します。私はそれがループが戻っているフィールド名の1つまたはそれ以上が好きではないと仮定していますが、ループが出力されなかったので、$buf変数を/ tmpのファイルに出力するデバッグを追加しようとしました。 。

私はこのアドバイスに遭遇しましたが(これはTransport :: HTTPとは関係ありませんが、Transport :: HTTP2では使用していません):https://www.tnpi.net/support/forums/index.php?topic=1037.0 HTTP :: Messageをバージョン6.04にダウングレードしましたが、残っている。

私は、どのように問題が実際に何かを見るためにいくつかのデバッグ出力を得る方法と、b)それを動作させる方法に関する提案がありますか?

Update 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'); 

変数に実際にその "bless"構造を含めるべきですか?

+0

祝福構築物はperlで結合XSです:

は、私はこのような何か($self->request文を置き換える)をしようとするだろう。 Perlオブジェクトではないオブジェクトをダンプするときは、完全に正常です。 $ r-> readからデータを取得してリクエストを作成しようとしましたか? – bolav

答えて

1

これをさらにデバッグするには、$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); 
+0

ありがとう! これは '$ $ data = do {}'セクションが好きではないようですので、私はこれと一緒に行きました: Data :: Dumperを使用してください。 my($ data); open(L1、 ">>/tmp/testlog1.txt"); print L1 "データのダンプを開始しています... \ n"; my $ method = $ r-> method(); L1 "ダンプ\ $ r \ n"を印刷します。ダンパー($ r); L1 "ダンプ\ $メソッド\ n"を印刷します。ダンパー($メソッド); my $ uri = $ r-> uri; L1 "\ $ method = $ method => $ uri \ n"; my $ headers = HTTP :: Headers-> new($ r-> headers_in); L1 "ダンプヘッダー\ n"を印刷します。ダンパー($ヘッダー); 以下に出力を生成します。 – Pyromancer

+0

上記を無視しても、それはわかりやすくフォーマットされず、今は編集が許可されません。元の質問に回答が含まれます。ごめんなさい! – Pyromancer

関連する問題