2016-03-22 20 views
1

Bir istemci için en eski sanal sistemi sanallaştırmaya çalışıyorum. Bu, ön uçtan arka uca ve tekrar tekrar veri aktarmak için SOAP kullanır. Tüm kod kopyalanmış ve CPAN'dan yüklenen ilgili Perl modülleri kopyalanmıştır. Hat ile bu biridirPerl SOAP modülünde 'Yasa dışı alan adı' hatalarını ayıklamanın en iyi yolu nedir?

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

erroring olduğu bölümde soru içinde modül baktığımızda: ön uç sisteminin çoğu bir SOAP çağrı API günlüklerinde bu hata ile, sistem çöker yapıldığında ancak işler Ben bildiğim kadarıyla o başlıkların yöntem URI bir nesne oluşturmak ve sonra da inşa ediyor söyleyebilirim OO Perl (ı usul şekillerde düşünün) fakat biraz mücadele

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; 

: 103 do {} blok olmak do{} döngü, onları $c ekleyerek ve son olarak nesneye $c ekleyerek. Döngünün döndüğü alan adlarından birini veya daha fazlasını sevmediğimi varsayarak, $buf değişkenini/tmp içindeki bir dosyaya yazdırmak için hata ayıklamayı eklediğimde, herhangi bir çıktı üretmedi .

Bu sorunu gidermeye çalışırken, bu tavsiyeye rastladım (bununla birlikte aktarım :: HTTP değil taşımayla ilgili: HTTP2 kullanıyoruz): https://www.tnpi.net/support/forums/index.php?topic=1037.0 HTTP :: Message 6.04 sürümüne düşürdüm, ancak hata kalır.

Yani a) aslında sorunun ne olduğunu görmek için bazı hata ayıklama çıktısı nasıl elde edilir, ve b) işe nasıl alınacağına dair herhangi bir öneri?

Güncelleme 1 (ilk cevap veren): Bunun için

Teşekkür!

O my $data = do{} bölüm gibi görünmüyordu, bu yüzden bu gitti: Aşağıdaki çıktıyı üretti

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

değişken gerçekten inşa "korusun" diye içermelidir?

+0

korusun yapı perl'de bağlayıcı bir xs:

böyle bir şey ($self->request deyimi yerine) çalışacaktı. Perl nesnesi olmayan nesneleri döküldüğünde tamamen normaldir. Verileri $ r-> okumadan ve isteği oluşturmak için denediniz mi? – bolav

cevap

1

Daha fazla hata ayıklamak için, $self->request'a hangi değerleri gönderdiğinizde hata ayıklamaya çalışın ve bu hataya hangi komutu neden oluyor.

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

Bunun için teşekkürler! Bu çeşitli bölümlerde olmalıdır: Bu benim $ data = do {} 'bölümümü beğenmediyse, ben de bununla gittim: data :: Dumper; my ($ data); open (L1, ">>/tmp/testlog1.txt"); print L1 "Döküm verilerinin başlatılması ... \ n"; my $ yöntem = $ r-> method(); print L1 "Döküm \ $ r \ n". Damper ($ r); print L1 "Dumping \ $ method \ n".Damper ($ yöntem); benim $ uri = $ r-> uri; print L1 "\ $ method = $ method => $ uri \ n"; $ headers = HTTP :: Headers-> new ($ r-> headers_in); print L1 "Döküm başlıkları \ n". Damper ($ başlıklar); Aşağıdaki çıktı çıktı. – Pyromancer

+0

Yukarıdakileri yoksay, hassas bir şekilde biçimlendirmeme izin vermez ve artık düzenlemelere izin vermez. Orijinal soruya cevap içerecektir. Afedersiniz! – Pyromancer