RFZ: HTTP Request Body einlesen

Nabend,
ich möchte den Body des HTTP Requests an mein Script direkt auslesen (keine urlencodete Formulardaten, kein Dateiupload).
Ich hab dazu schonmal was gelesen und meinte mich erinnern zu können dass man das via lesen von "php://stdin" oder "php://input" machen kann, das hat mich aber leider nicht zum Erfolg geführt, wenn ich davon lese bekomme ich nur Leerstrings - einzige Ausnahme, wenn der Content-Type "application/x-www-form-urlencoded" ist, dann kann ich von "php://input" lesen, aber ich möchte es allgemein halten.
Auch $HTTP_RAW_POST_DATA ist leer, wobei mir das eh schon zu speziell ist, es muss sich nichtmal zwangsweise um ein POST Request handeln.
Leider hab ich nichts weiteres dazu gefunden.
Gibt es da eine Möglichkeit?
Ich hab PHP als Modul laufen, wenn das wichtig ist, am liebsten wär mir aber natürlich eine Möglichkeit die auch als CGI funktioniert.

Gruß,
Andreas

  1. Hello,

    Auch $HTTP_RAW_POST_DATA ist leer,

    Das musst Du auch erst einschalten in der Konfiguration

    always_populate_raw_post_data

    Ein harzliches Glückauf

    Tom vom Berg

    --
    Nur selber lernen macht schlau
    http://bergpost.annerschbarrich.de
    1. Das musst Du auch erst einschalten in der Konfiguration

      always_populate_raw_post_data

      Danke, das hab ich tatsächlich übersehn...
      Aber, auch dann geht es nur mit "application/x-www-form-urlencoded".
      Ausserdem wär mir eine Lösung lieber, bei der ich nicht an die Serverkonfiguration muss, auch wenn ich in diesem konkreten Fall das Recht dazu habe.

      Gruß,
      Andreas

      1. Hello,

        und über fopen('php://input','r') ?

        Ein harzliches Glückauf

        Tom vom Berg

        --
        Nur selber lernen macht schlau
        http://bergpost.annerschbarrich.de
        1. Hello,

          und über fopen('php://input','r') ?

          http://de2.php.net/manual/en/wrappers.php.php

          Ein harzliches Glückauf

          Tom vom Berg

          --
          Nur selber lernen macht schlau
          http://bergpost.annerschbarrich.de
          1. und über fopen('php://input','r') ?

            http://de2.php.net/manual/en/wrappers.php.php

            Das ist mir ja wie ursprünglich gesagt schon bekannt, aber "php://input" geht nicht mit "multipart/form-data" und "php://stdin" geht bei mir garnicht (ich schätz mal, das könnt bei CGI funktionieren).

            Ich schreibe für eine Demonstration einen kleinen transparenten HTTP Proxy mit PHP und muss dazu den Request Body 1:1 weiterreicht, daher sollte es unabhängig vom Content-Type funktionieren.

            Natürlich könnte ich abhängig vom Content-Type versuchen mit $_POST, $_FILES und php://input den Body zu rekonstruieren, aber das wäre nicht allgemeingültig und vor allem ein größerer Aufwand :(

            Gruß,
            Andreas

            1. Hello,

              was sagt denn der Webserver?
              Der muss die Raw-Data doch haben.

              Hast Du mal geschaut, ob Du sie zusätzlich zu den $_SERVER-Daten importieren kannst?
              Das geht mit der Rewrite-Engine.

              http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html

              Die Environment-Variable THE_REQUEST könnte Dein Freund werden.

              Wenn Du allerdings keinen Apachen hast, weiß ich nicht, ob es auch geht.

              Ein harzliches Glückauf

              Tom vom Berg

              --
              Nur selber lernen macht schlau
              http://bergpost.annerschbarrich.de
              1. Hello,

                Die Environment-Variable THE_REQUEST könnte Dein Freund werden.

                Entschuldige, das war die falsche.
                Aber es gibt eine!

                Ein harzliches Glückauf

                Tom vom Berg

                --
                Nur selber lernen macht schlau
                http://bergpost.annerschbarrich.de
                1. Hello,

                  ausprobieren könntest Du es ja trotzdem mal, was dabei herauskommt, wenn Du in die .htaccess folgendes Einträgst:

                  RewriteEngine on
                      RewriteRule .* - [E=THE_REQUEST:%{HTTP:Fullrequest},L]

                  Die Variable müsste in S_SERVER landen.

                  Ein harzliches Glückauf

                  Tom vom Berg

                  --
                  Nur selber lernen macht schlau
                  http://bergpost.annerschbarrich.de
                  1. RewriteEngine on
                        RewriteRule .* - [E=THE_REQUEST:%{HTTP:Fullrequest},L]

                    Die Variable müsste in S_SERVER landen.

                    Guter Ansatz, aber klappt leider auch nicht. $_SERVER['REDIRECT_THE_REQUEST'] existiert zwar, ist aber immer leer... wo hast du denn %{HTTP:Fullrequest} her? Laut Manual würde das doch nur den Header "Fullrequest" ausgeben.

                    Gruß,
                    Andreas

                    1. Hello,

                      RewriteEngine on
                          RewriteRule .* - [E=THE_REQUEST:%{HTTP:Fullrequest},L]

                      Die Variable müsste in S_SERVER landen.

                      Guter Ansatz, aber klappt leider auch nicht. $_SERVER['REDIRECT_THE_REQUEST'] existiert zwar, ist aber immer leer... wo hast du denn %{HTTP:Fullrequest} her? Laut Manual würde das doch nur den Header "Fullrequest" ausgeben.

                      Stimmt leider alles nicht.
                      Ich nehme anm dass ich das aus einer nicht standardisierten Einrichtung hatte.
                      Wenn Du

                      RewriteRule .* - [E=THE_REQUEST:%{THE_REQUEST},L]

                      nimmst, bekommst Du leider nur die vollständige Zeile mit Requestmethode, HTTP-Version und Request-String

                      Ein harzliches Glückauf

                      Tom vom Berg

                      --
                      Nur selber lernen macht schlau
                      http://bergpost.annerschbarrich.de
                2. Entschuldige, das war die falsche.
                  Aber es gibt eine!

                  Würdest du sie mir verraten? Ich kann keine finden.

                  Ich wüßt aber auch nicht wie ich das dann machen soll...
                  mod_rewrite nutze ich ja, um alle Requests an den Server an mein Proxy-Skript zu leiten. Wenn ich jetzt sowas wie "RewriteRule .* proxy.php?data=%{HTTP_DATA}" schreibe, glaub ich kaum dass ich via $_GET['data'] an die Daten komme, da bin ich etwas skeptisch... Und über $_SERVER['REQUEST_URI'] bekomme ich ja die ursprüngliche URL, die ich auch brauche, für die Anfrage an der echten Webseite.

                  Gruß,
                  Andreas