Thread LWP, XML-Daten und X-Died (4 answers)
Opened by thecoder2012 at 2013-06-24 07:19

thecoder2012
 2013-06-24 07:19
#168558 #168558
User since
2013-02-04
64 Artikel
BenutzerIn
[default_avatar]
Hi,

ich bin bei einem Perl-Problem ratlos.

Habe ein Skript mit LWP::UserAgent (und IO::Socket als Alternative) geschrieben das XML-Daten (raw) senden und empfangen soll. Da es bei allen getestet Perl-Versionen (5.10, 5.12, 5.14) und mehreren Systemen (Windows 7, Debian Linux 7) auftritt spielt das wohl keine Rolle.

1. Bei IO::Socket wird mehrere Sekunden auf eine Antwort gewartet obwohl laut Wireshark der Request bereits unter einer Sekunde abgeschlossen ist.
more (3.7kb):
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
my $inhalt;
                my $sock = new IO::Socket::INET (
                        Timeout => 25,
                        Proto => tcp,
                        PeerAddr => $host,
                        PeerPort => 80
                ) || die $!;
                binmode $sock, 'utf8';
                $sock->autoflush(1);
                print $sock $header.$body;
                while(<$sock>){
                        $inhalt .= $_;
                }
                $sock->close();


2. Bei LWP dagegen bricht es ohne Modifikation mit der Fehlermeldung X-Died: Bad chunk-size in HTTP response: &lt;?xml version="1.0" encoding="UTF-8"
?> at C:/Perl/lib/Net/HTTP/Methods.pm line 490.
ab.
Die Antwort enthält ebenfalls nur XML-Daten aber ist zügig vorhanden. Laut Wireshark ist das Problem in LWP/Perl zu suchen.

Modifikation um den Host auszuklammern in Net/HTTP/Methods.pm und LWP macht das was es soll. Eben ein Workaround und keine direkte Lösung. Siehe Code und Anhang.
more (3.3kb):

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
my $ua = LWP::UserAgent->new;
                $ua->agent("xmlClient 1.0");
                $ua->timeout(25);

                my $req = HTTP::Request->new(POST => $url);
                $req->content_type('text/xml');
                $req->content($body);

                my $res = $ua->request($req);
                my $inhalt = $res->as_string;#$res->{_content}


Nun noch ein Auszug aus Wireshark bzgl. Senden und Antwort erhalten.

Senden:
more (822b):
Code: (dl )
1
2
3
4
5
6
7
8
POST /xml/ HTTP/1.1
Connection: Keep-Alive, close
Host: admin.notfoundtotal.de
User-Agent: xmlClient 1.0
Content-Type: text/xml
Content-Length: 224

<?xml version="1.0" encoding="UTF-8"?><command name="checkDomain" customer="111" password="11111111111111111111111111111111" passwort="11111111111111111111111111111111"><tld>de</tld><sld>super2423423423domain</sld></command>


Antwort:
more (970b):
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
HTTP/1.1 200 OK
Date: Mon, 24 Jun 2013 03:54:45 GMT
Server: Apache
Pragma: no-cache
Cache-control: no-cache
Transfer-Encoding: chunked
Expires: Mon, 24 Jun 2013 03:54:47 GMT
Content-Length: 184
Connection: close
Content-Type: text/xml

<?xml version="1.0" encoding="UTF-8"?>
<responses code="200" text="ok">
<response>
<code>200</code>
<text>available</text>
<status>available</status>
</response>
</responses>


Ich nutze lieber LWP wegen zusätzlichen Optionen wie Proxys etc.
Frage ist woran es liegt das IO::Socket da mehrere Sekunden zu viel wartet bzw. ob ich LWP beibringen kann ohne Codeänderung das dieser nicht den Body parsen soll?

Vielleicht übersehe ich etwas (z.B. Optionen)
Danke

EDIT: Update auf die neuste Version hilft inzwischen.
Anhänge

Last edited: 2013-09-29 01:14:19 +0200 (CEST)

View full thread LWP, XML-Daten und X-Died