Schrift
[thread]12490[/thread]

Perl muss XML per POST empfangen

Leser: 2


<< |< 1 2 >| >> 14 Einträge, 2 Seiten
burnersk
 2008-09-13 23:44
#114621 #114621
User since
2008-03-25
83 Artikel
BenutzerIn
[default_avatar]
Hallo,
folgende Situation:

ich muss ein Perl-Script schreiben, welches nur auf POST Anfragen reagiert. Im HTTP Content der Anfrage ist XML.
Ich habe es natürlich erst mal mit CGI::Vars versucht, aber sobald ein "&" oder ";" im Content ist zerschiesst CGI den Content (was ja auch logisch ist).

Bei suchen habe ich die Methode mit read(STDIN, $return, $Content_Length) gesehen aber an dieser Stelle arbeitet mein Script nicht mehr weiter, sondern wartet bis zum Sankt Nimmerleinstag auf weitere Eingaben.

Wie bekomme ich es hin, dass bei POST Anfragen der Content korrekt abgefragt wird?
RalphFFM
 2008-09-13 23:57
#114622 #114622
User since
2006-11-16
258 Artikel
BenutzerIn
[Homepage] [default_avatar]
Was verstehst Du genau unter "zerschiesst"?
burnersk
 2008-09-14 01:14
#114624 #114624
User since
2008-03-25
83 Artikel
BenutzerIn
[default_avatar]
Code: (dl )
1
2
3
<root>
<elem>foo &amp; bar</elem>
</root>


wird zu:

Code (perl): (dl )
1
2
3
4
$VAR = {
  "<root>\n  <elem>foo" = undef,
  "bar</elem>\n</root>" = undef,
};



Und nicht zu:

Code (perl): (dl )
1
2
3
$VAR = {
  "arguments" = "<root>\n  <elem>foo &amp; bar</elem>\n</root>",
};
RalphFFM
 2008-09-14 01:32
#114625 #114625
User since
2006-11-16
258 Artikel
BenutzerIn
[Homepage] [default_avatar]
Hätte ich jetzt bei der Übertragung per POST-Methode wirklich nicht erwartet, sondern nur bei GET.
pq
 2008-09-14 02:37
#114626 #114626
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
sowohl bei POST als auch bei GET splittet CGI.pm den content an '&' (oder ';').
man muss von STDIN lesen:
Code (perl): (dl )
1
2
my $content;
my $bytes = read(STDIN, $content, $ENV{CONTENT_LENGTH});

aber bevor man funktionen von CGI.pm benutzt, das liest nämlich dann selbst von STDIN.
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
Gast Gast
 2008-09-14 02:47
#114627 #114627
Kann man da nicht ein "seek" machen? So wie "seek(STDIN,0,0)"?
RalphFFM
 2008-09-14 12:27
#114630 #114630
User since
2006-11-16
258 Artikel
BenutzerIn
[Homepage] [default_avatar]
Ich vermute da gibts irgendein Mißverständnis. Ein Test:
<form action="/perl-bin/board.pl?action=saveOrPreviewMessage" method="post" id="inputform">

Code: (dl )
1
2
3
<root>
<elem>foo &amp; bar</elem>
</root>
burnersk
 2008-09-14 13:06
#114631 #114631
User since
2008-03-25
83 Artikel
BenutzerIn
[default_avatar]
pq+2008-09-14 00:37:55--
man muss von STDIN lesen:
Code (perl): (dl )
1
2
my $content;
my $bytes = read(STDIN, $content, $ENV{CONTENT_LENGTH});



Das hatte ich schon versucht:
Code (perl): (dl )
read(STDIN, $return, $Content_Length)
Allerdings übergeben einige der externen Datenlieferanten keine Content-Length. Das war wohl die Ursache, warum mein Script ewig auf Input wartet und nicht weitermacht. Aber man kann es halt nicht ändern.
Beachtet: Obwohl mein Script auf einem Webserver (IIS) läuft greifen auf selbiges keine Browser, sondern nur HLNC-Anwendungen, die u. a. in C# geschrieben werden, zu. Es ist auf der Clientseite also kein Webserver/Browser, der Content-Length fixen könnte. Und nein, ich werden den Typen nicht sagen, dass die ihr Programm ändern sollen. Das würden die auch nicht tun! That's real business (nicht die gleichnamige Firma)!

Kenn jemand noch eine andere Lösung?
topeg
 2008-09-14 13:43
#114632 #114632
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
versuch mal das:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
my $data="";
eval
{
  local $SIG{ALRM} = sub { die "Alarm" };
  alarm(2);
  my $ret;
  while(read(STDIN,$ret,1))
  { $data.=$ret; }
  alarm(0);
};

Es kann sein, dass das letzte Byte nicht gelesen wird.
burnersk
 2008-09-14 13:58
#114633 #114633
User since
2008-03-25
83 Artikel
BenutzerIn
[default_avatar]
So kann ich jedenfalls den "Zombie" vorbeugen und Daten weiterverarbeiten.
Ich denke das reicht...

Vielen Dank Leute!
<< |< 1 2 >| >> 14 Einträge, 2 Seiten



View all threads created 2008-09-13 23:44.