MrWurf: Request Content abgreifen

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

  1. 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

    1. 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.

      1. kleines Missverständnis, ich will keinen Request abschicken sondern einen empfangenen Request auswerten.

        und genau das tut LWP::Simple.

        Struppi.

        1. 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?

          1. 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.

            1. 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

              1. 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

                1. 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

              2. 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.

                1. 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

              3. 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

                --
                Ein Selbständiger ist jemand, der bereit ist, 16 Stunden am Tag zu arbeiten, nur um nicht 8 Stunden für einen Anderen arbeiten zu müssen.
                1. 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

                  1. 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.

                    1. 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.

                      1. 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.

                        1. 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

                          1. 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.

                            1. 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

                              1. 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.

  2. 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

    --
    Ein Selbständiger ist jemand, der bereit ist, 16 Stunden am Tag zu arbeiten, nur um nicht 8 Stunden für einen Anderen arbeiten zu müssen.
    1. 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