Request Content abgreifen
MrWurf
- perl
Hallo,
folgendes Problem: ich möchte mir in einem CGI-Script den kompletten Request-Content ansehen. Also nicht den Parameter-Hash sondern den tatsächlichen Content. Im CGI-Modul habe ich nichts passendes gefunden.
Irgendwelche Tips oder Vorschläge?
thx
MrWurf
Hi,
folgendes Problem: ich möchte mir in einem CGI-Script den kompletten Request-Content ansehen. Also nicht den Parameter-Hash sondern den tatsächlichen Content. Im CGI-Modul habe ich nichts passendes gefunden.
Irgendwelche Tips oder Vorschläge?
Meinst du sowas wie LWP::Simple? Damit kannst du Requests an eine URL schicken und anschliessend die Antwort auswerten.
mfG,
steckl
Meinst du sowas wie LWP::Simple? Damit kannst du Requests an eine URL schicken und anschliessend die Antwort auswerten.
kleines Missverständnis, ich will keinen Request abschicken sondern einen empfangenen Request auswerten.
kleines Missverständnis, ich will keinen Request abschicken sondern einen empfangenen Request auswerten.
und genau das tut LWP::Simple.
Struppi.
kleines Missverständnis, ich will keinen Request abschicken sondern einen empfangenen Request auswerten.
und genau das tut LWP::Simple.
nein.
LWP::Simple führt einen Request aus und wertet den Response aus.
siehe Perloc:
SYNOPSIS
perl -MLWP::Simple -e 'getprint "http://www.sn.no"'
use LWP::Simple;
$content = get("http://www.sn.no/");
die "Couldn't get it!" unless defined $content;
oder habe ich da was übersehen?
kleines Missverständnis, ich will keinen Request abschicken sondern einen empfangenen Request auswerten.
und genau das tut LWP::Simple.
nein.
LWP::Simple führt einen Request aus und wertet den Response aus.
Was ist denn für dich der empfangene Request?
Für mich ist das der Response.
oder suchst du einfach $ENV{'QUERY_STRING'}?
Struppi.
kleines Missverständnis, ich will keinen Request abschicken sondern einen empfangenen Request auswerten.
und genau das tut LWP::Simple.
nein.
LWP::Simple führt einen Request aus und wertet den Response aus.Was ist denn für dich der empfangene Request?
Für mich ist das der Response.
Angenommen du hast das Formular xyz.html das im Action-Attribut auf abc.pl verweist.
Der Request ist (vereinfacht) das, was das Script erhält, wenn du das Formular abschickst. Die Formulardaten sind (bei POST) im Requestcontent.
Diesen Requestcontent möchte ich in dem Script abc.pl ungeparst sehen/abspeichern/sonstwas.
Der Response von abc.pl interessiert hier nicht.
oder suchst du einfach $ENV{'QUERY_STRING'}?
Das dürfte die Request-URL sein, das reicht mir nicht, die hätte ich auch locker um CGI-Modul gehabt.
war das jetzt verständlicher?
Gruß
MrWurf
Hi,
Angenommen du hast das Formular xyz.html das im Action-Attribut auf abc.pl verweist.
Der Request ist (vereinfacht) das, was das Script erhält, wenn du das Formular abschickst. Die Formulardaten sind (bei POST) im Requestcontent.Diesen Requestcontent möchte ich in dem Script abc.pl ungeparst sehen/abspeichern/sonstwas.
du kannst mit
my @allParas = param();
die Namen aller Formularfelder, die uebergeben wurden (egal ob per POST oder GET), ermitteln.
Mit Hilfe einer Schleife kannst du dann noch mit
param($allParas($i));
die zugehoerigen Werte bekommen. Das ganze kannst du dann beispielsweise in einem Hash abspeichern.
Wie du dierekt auf den Header des Requests zugreifen kannst weiss ich nicht.
mfG,
steckl
du kannst mit
my @allParas = param();
die Namen aller Formularfelder, die uebergeben wurden (egal ob per POST oder GET), ermitteln.
Mit Hilfe einer Schleife kannst du dann noch mit
param($allParas($i));
die zugehoerigen Werte bekommen. Das ganze kannst du dann beispielsweise in einem Hash abspeichern.
mit
my $params = Vars;
habe ich bereits eine Referenz auf einen solchen Hash.
Wie du dierekt auf den Header des Requests zugreifen kannst weiss ich nicht.
die Headereinträge kriegst du so:
my @headerkeys = $query->http();
foreach $headerkey(@headerkeys)
{
my $headervalue = $query->http($headerkey);
print STDOUT "Header key: $headerkey value: $headervalue\n";
}
Ist aber egal weil es mir vorallem um den Content geht.
gruß
MrWurf
oder suchst du einfach $ENV{'QUERY_STRING'}?
Das dürfte die Request-URL sein, das reicht mir nicht, die hätte ich auch locker um CGI-Modul gehabt.
du willst also das was POST übergeben wird, das landet in STDIN und läßt sich dort auslesen.
Struppi.
du willst also das was POST übergeben wird, das landet in STDIN und läßt sich dort auslesen.
jo, das ist es. Dank deines Tips habe ich auch ein passendes Beispiel gefunden: CGI-Erläuterungen
komisch nur, das mein Script bei der entscheidenden Zeile einfach stehen bleibt:
read(STDIN, my $daten, $ENV{'HTTP_CONTENT_LENGTH'});
Der Headereintrag $ENV{'HTTP_CONTENT_LENGTH'} ist laut Debug vorhanden.
Naja ich mache noch ein paar Tests. Falls ich nicht weiterkomme melde ich mich nochmal
thx
MrWurf
Diesen Requestcontent möchte ich in dem Script abc.pl ungeparst sehen/abspeichern/sonstwas.
my $request_method = $ENV{'REQUEST_METHOD'};
my $query_string;
if ($request_method eq 'GET') {
my $query_string = $ENV{'QUERY_STRING'};
}
elsif ($request_method eq 'POST') {
read (STDIN, $query_string, $ENV{'CONTENT_LENGTH'});
}
So?
Siechfred
elsif ($request_method eq 'POST') {
read (STDIN, $query_string, $ENV{'CONTENT_LENGTH'});
}[/code]So?
Genau so.
Bei mir heißt der Header übrigens HTTP_CONTENT_LENGTH. Liegt das am Opera oder am Webserver IIS?
Und funktionieren tut das "read" auch noch nicht, wie ich Struppi schon geschildert habe.
Gruß
MrWurf
elsif ($request_method eq 'POST') {
read (STDIN, $query_string, $ENV{'CONTENT_LENGTH'});
}[/code]So?
Genau so.
Bei mir heißt der Header übrigens HTTP_CONTENT_LENGTH. Liegt das am Opera oder am Webserver IIS?
Am Server, die Umgebungsvariabeln erzeugt er.
Und funktionieren tut das "read" auch noch nicht, wie ich Struppi schon geschildert habe.
Du hast in dem anderen Beispiel das my in den Funktionsaufruf gepackt, ich hab das jetzt nicht getestet, aber bist du sicher das das so geht?
Struppi.
Du hast in dem anderen Beispiel das my in den Funktionsaufruf gepackt, ich hab das jetzt nicht getestet, aber bist du sicher das das so geht?
ja, ich habe beide Varianten getestet, bislang mit gleichbleibendem Mißerfolg.
ja, ich habe beide Varianten getestet, bislang mit gleichbleibendem Mißerfolg.
Naja, bisher Wissen wir nur "es funktionert nicht", da es aber normalerweise funktioniert, machst du was falsch, nur was können wir nicht Wissen ohne konkreter Infos
Struppi.
Mehr als
komisch nur, das mein Script bei der entscheidenden Zeile einfach »» stehen bleibt:
read(STDIN, my $daten, $ENV{'HTTP_CONTENT_LENGTH'});
kann ich leider auch nicht sagen. Ich habe den Eindruck, dass er vergeblich wartet, das was über den Filehandle reinkommt.
Habs auch schon mit
read(STDIN, $daten, 1);
probiert, falls die Contentlänge zu groß angegeben wird .. gleiches Ergebnis.
Bevor du danach fragst - hier das ganze Script:
use CGI qw(:standard);
my $query = new CGI;
print STDOUT $query->header('text/plain');
print "was geht\n\n";
my @headerkeys = $query->http();
foreach $headerkey(@headerkeys)
{
my $headervalue = $query->http($headerkey);
print STDOUT "Header key: $headerkey value: $headervalue\n";
}
my $daten = "Daten: \n";
read(STDIN, $daten, $ENV{'HTTP_CONTENT_LENGTH'});
print STDOUT "\nFormtest\n---------\n";
$query->save(STDOUT);
Gruß
MrWurf
Bevor du danach fragst - hier das ganze Script:
use CGI qw(:standard);
my $query = new CGI;
Ich vermute mal, hier ist das Problem, da das Modul natürlich diese Werte auch auslesen muss sind sie nicht mehr vorhanden, du musst den input vor new einlesen. Allerdings stehen sie dann in den CGI Funktionen nicht mehr zu Verfügung.
Struppi.
Ich vermute mal, hier ist das Problem, da das Modul natürlich diese Werte auch auslesen muss sind sie nicht mehr vorhanden, du musst den input vor new einlesen. Allerdings stehen sie dann in den CGI Funktionen nicht mehr zu Verfügung.
habs probiert, vom Script blieb nur dieser Rest übrig:
my $daten = '';
read(STDIN, $daten, $ENV{'HTTP_CONTENT_LENGTH'});
print STDOUT "\nFormtest\n---------\n";
bleibt immernoch stehen.
Ich habe etwas nicht erwähnt:
Im Formular, dass ich diesem Script schicke, habe ich einen Dateiupload, das Formular war auf enctype="multipart/form-data" geschaltet. Sorry das ich nicht daran gedacht habe.
Lasse ich dieses Attribut weg, dann funktioniert das read, nur habe ich dann halt nicht die Dateidaten.
Mir wäre es lieb, wenn das Script mit jedem beliebigen Postcontent klarkommt.
Gruß
MrWurf
habs probiert, vom Script blieb nur dieser Rest übrig:
my $daten = '';
read(STDIN, $daten, $ENV{'HTTP_CONTENT_LENGTH'});
print STDOUT "\nFormtest\n---------\n";bleibt immernoch stehen.
Bei mir nicht.
Ich habe etwas nicht erwähnt:
Im Formular, dass ich diesem Script schicke, habe ich einen Dateiupload, das Formular war auf enctype="multipart/form-data" geschaltet. Sorry das ich nicht daran gedacht habe.
Das gleihce Ergebniss.
Lasse ich dieses Attribut weg, dann funktioniert das read, nur habe ich dann halt nicht die Dateidaten.
Dann machst du irgendwas falsch und wir sind wieder am Anfang.
Mir wäre es lieb, wenn das Script mit jedem beliebigen Postcontent klarkommt.
Warum nutzt du nicht das CGI Modul?
Struppi.
ich möchte mir in einem CGI-Script den kompletten Request-Content ansehen.
Also das, was via HTTP versandt wird?
Irgendwelche Tips oder Vorschläge?
Die Basisklasse HTTP::Request bietet eine Methode as_string, alle Eigenschaften und Methoden werden auf die entsprechenden Klassen des Paketes libwww-perl (zu dem auch HTTP::Request gehört) vererbt, z.B. LWP::UserAgent.
Siechfred
ich möchte mir in einem CGI-Script den kompletten Request-Content ansehen.
Die Basisklasse HTTP::Request
hatte mich wohl missverstandlich ausgedrückt. siehe andere Antwort