Dieter: CGI einem PHP-ler erklären / Hilfe !

Hallo,

nach nunmehr langen Stunden der Verzweiflung und Suche sehe ich leider keinen anderen Ausweg mehr, als mich als DAU zu outen und euch um Hilfe zu bitten.

Ich habe ein CGI/PL-Script vorliegen das ich entsprechend in PHP umsetzten muß. Soweit ich das CGI-Teil verstanden habe, macht es eigentlich nichts anderes, als ein POST-Request mit Daten abzusetzten und die Antwort des Servers darzustellen.
Soweit, sogut.
Wenn ich aber nun ein POST-Request via PHP absetzte, eigentlich nach meiner Meinung mit den gleichen Daten, ist die Response immer negativ.

Ich vermute es liegt an der Datenstruktur, da ich aber von CGI 0,nix Ahnung habe bitte ich um eure Hilfe.

Das CGI-Teil sieht so aus:

  
#!/usr/local/bin/perl  
  
use LWP::UserAgent;  
$ua = new LWP::UserAgent;  
$ua->agent("AgentName/0.1 " . $ua->agent);  
  
my $req = new HTTP::Request POST =>  
'http://www.zieladresse.de/zieldatei.pl';  
$req->content_type('text');  
my $content = getFileContent("$ARGV[0]");  
$req->content($content);  
  
my $res = $ua->request($req);  
print "HTTP Request:\n".$req->as_string()."\n";  
  
if ($res->is_success) {  
 $res_str = "HTTP Response:\n".$res->as_string()."\n";  
 open( RESPONSE, ">$ARGV[1]" );  
 print RESPONSE $res->as_string();  
 close( RESPONSE );  
 print $res_str;  
}  
else {  
 print($res->error_as_HTML."\n");  
}  
  
sub getFileContent  
{  
    my ($FileHandle , $FileContent, $FileLength);  
    open(FileHandle, "<$_[0]") or die "Can't open file '$_[0]': $!";;  
    $FileLength = sysseek(FileHandle, 0, 2 );  
    if( $FileLength<=0 ) { die "file \'$_[0]\' is empty!"; }  
    sysseek(FileHandle, 0, 0 );  
    sysread(FileHandle,$FileContent,$FileLength);  
    close(FileHandle);  
  
    return $FileContent;  
}  

Die Daten die es einliest um diese zu versenden, kommen aus einer txt-Datei mit dem Aufbau:
key:value
key2:value2
usw..

Mein Versuch das ganze per PHP umzusetzten endete mit folgendem Code:

  
function PostToHost($host, $path, $referer, $data_to_send) {  
  $fp = fsockopen($host, 80);  
  printf("Open!\n");  
  fputs($fp, "POST $path HTTP/1.1\r\n");  
  fputs($fp, "Host: $host\r\n");  
  fputs($fp, "Referer: $referer\r\n");  
  fputs($fp, "Content-type: application/x-www-form-urlencoded\r\n");  
  fputs($fp, "Content-length: ". strlen($data_to_send) ."\r\n");  
  fputs($fp, "Connection: close\r\n\r\n");  
  fputs($fp, $data_to_send);  
  printf("Sent!\n");  
  while(!feof($fp)) {  
      $res .= fgets($fp, 128);  
echo $res.'<hr>';  
  }  
  printf("Done!\n");  
  fclose($fp);  
  
  return $res;  
}  
  
$data = "key=value&key2=value2";  
  
printf("Go!\n");  
$x = PostToHost(  
              "www.zieladresse.de",  
              "/zieldatei.pl",  
              "PHP-Script",  
              $data  
);  

Hierbei gibt der Server immer die Response, das er die daten nicht verarbeiten kann - das CGI hingegen arbeitet problemlos.

Da ich aber halt mich auf PHP beschränken möchte, ist für mich der Einsatz des CGI nicht realisierbar, da ich ganz gerne auch den Code verstehe den ich für meine Projekte benutze.

Ich hoffe daher, das hier jemand mir helfen kann.

Gruss
Dieter

  1. nach nunmehr langen Stunden der Verzweiflung und Suche sehe ich leider keinen anderen Ausweg mehr, als mich als DAU zu outen und euch um Hilfe zu bitten.

    Recht so, auf die Knie!

    Das CGI-Teil sieht so aus:

    (Nachfolgendes ohne von Perl die geringste Ahnung zu haben.)

    Perl setzt:

    $req->content_type('text');

    Du setzt:

    fputs($fp, "Content-type: application/x-www-form-urlencoded\r\n");

    Passt IMHO schonmal nicht.

    Perl sendet:

    my $content = getFileContent("$ARGV[0]");
    $req->content($content);

    sub getFileContent
    {

    sysread(FileHandle,$FileContent,$FileLength);

    return $FileContent;

    Also den Dateinhalt ohne weitere Umformatierung:

    key:value
    key2:value2

    Du sendest:

    $data = "key=value&key2=value2";

    Passt auch nicht.

    Hierbei gibt der Server immer die Response, das er die daten nicht verarbeiten kann

    Das ist zwar keine ordentliche Fehlerbeschreibung, aber bis jetzt wundert es mich nicht.

    1. Recht so, auf die Knie!

      Da bin ich, glaubt mir...

      • Mime-Typ geändert in text/plain
      • Dateninhalt geändert in "$data = "key:value
        key2:value2";

      Gleiche Response in Grün, d.h. keine Verarbeitung.
      Auch versucht den Dateninhalt mit ZUBs "\r\n" zu versehen bliebt leider erfolglos...

      Gruss
      Dieter

        • Mime-Typ geändert in text/plain

        Sollte "text" sein, wird aber vermutlich keinen Unterschied machen.

        • Dateninhalt geändert in "$data = "key:value
          key2:value2";

        Schicke doch erstmal die Datei, die das Perl-Skript auch schickt, und zwar exakt so, wie sie vorliegt bzw. vom Perl-Skript verarbeitet wird: mit fread() einlesen und mit fwrite() an den Server schicken.
        Du hast momentan noch viel zu viel eigenen Kram drin und solche nervtötenden Fehler haben manchmal in den dümmsten Fusseln ihre Ursache.

        Gleiche Response in Grün, d.h. keine Verarbeitung.

        Wenn du nur eine leere Antwort bekommst, ist die Fehlersuche immer ein Stochern im Dunkeln. Hast du Zugriff auf das verarbeitende Skript bzw. kennst du den Verantwortlichen? Er könnte dir am ehesten helfen.

  2. moin,

    Du möchtest mit PERL einen POST an einen Webserver machen, wo evntl. ein CGI-Script den POST entgegennimmt?

    Das ist mit PERL ganz einfach, hier ein PERL-Script:

      
    #!/usr/bin/perl  
      
    use LWP::UserAgent;  
    $ua = LWP::UserAgent->new(agent => 'XXL Browser');  
    use HTTP::Request::Common qw(POST);  
      
    my $req = POST 'http://example.com/cgi-script',  
    Content_Type => 'form-data',  
    Content => [  
     name => 'rolf',  
     text => 'text',  
     num => '1234',  
     filename   => ["c:/config.sys"],  
    ];  
    print $ua->request($req)->as_string;  
    
    

    Nur mal so zu den Begriffen: obenstehendes Script ist kein CGI-Script, sondern schlicht und einfach ein PERL-Script, was einen User-Agent (im Volksmund Inderned-Exblorer) nachbildet.

    Das Ziel hingegen
    'http://example.com/cgi-script'

    dürfte eine Anwendung (PERL-Script, PHP-Script, Shell-Script, cgi.out, cgi.exe...) sein, die auf der CGI-Schnittstelle des Webservers sitzt und einen POST entgegen nehmen kann.

    --roro

  3. hi,

    Ich habe ein CGI/PL-Script vorliegen das ich entsprechend in PHP umsetzten muß. Soweit ich das CGI-Teil verstanden habe, macht es eigentlich nichts anderes, als ein POST-Request mit Daten abzusetzten und die Antwort des Servers darzustellen.
    Soweit, sogut.
    Wenn ich aber nun ein POST-Request via PHP absetzte, eigentlich nach meiner Meinung mit den gleichen Daten, ist die Response immer negativ.

    Wenn du die Möglichkeit hast, beide Scripte zu testen und ggf. auch zu verändern (bzgl. der Zieladresse), dann würde ich mir doch mal anschauen, welche Daten beide als POST-Request letztendlich absenden.
    Bspw. mittels eines HTTP-Sniffers, oder auch in dem man sie an ein Script senden lässt, welches nur die Aufgabe hat, den erhaltenen Request möglichst umfangreich und unverfälscht zu protokollieren. (Per PHP-Script würde ich mir zunächst apache_request_headers() und $HTTP_RAW_POST_DATA anschauen.)

    gruß,
    wahsaga

    --
    /voodoo.css:
    #GeorgeWBush { position:absolute; bottom:-6ft; }
  4. Vorab: PHP ist nicht unbedingt meine Baustelle, aber um ein Script von einer Sprache in die andere zu transformieren, sollte man schon genau wissen, was es tut.

    use LWP::UserAgent;
    $ua = new LWP::UserAgent;
    $ua->agent("AgentName/0.1 " . $ua->agent);

    Referenz auf ein LWP::UserAgent-Objekt, *das* Standardobjekt für den Datenverkehr im WWW.

    my $req = new HTTP::Request POST => 'http://www.zieladresse.de/zieldatei.pl';

    Neuen POST-Request erzeugen, der an die genannte Zieladresse gesandt wird.

    $req->content_type('text');

    Inhaltstyp der Daten. Die Angabe indes ist sehr ungewöhnlich, erwartet wird eigentlich ein gültiger MIME-Typ a la 'text/plain' o.ä. (siehe HTTP::Headers).

    my $content = getFileContent("$ARGV[0]");
    $req->content($content);

    Festlegen des Contents des Requests, der aus den Daten der als erstes Argument übergebenen Datei besteht. Hier also der Hinweis, dass wir uns mit dem Script nicht im CGI-Kontext, sondern auf der Konsole befinden.

    my $res = $ua->request($req);

    Hier wird der Request versandt, das Ergebnis der Anfrage wird in $res gespeichert, dies wiederum ist ein HTTP::Response-Objekt.

    print "HTTP Request:\n".$req->as_string()."\n";

    Kontrollausgabe.

    if ($res->is_success) {
    $res_str = "HTTP Response:\n".$res->as_string()."\n";
    open( RESPONSE, ">$ARGV[1]" );
    print RESPONSE $res->as_string();
    close( RESPONSE );
    print $res_str;
    }

    Wenn der Request erfolgreich war, schreibe die Antwort in die Datei, die dem Script als zweiter Parameter übergeben wurde.

    else {
    print($res->error_as_HTML."\n");
    }

    Ansonsten schreibe eine Fehlermeldung.

    sub getFileContent

    Das ist nur das Einlesen der Textdatei.

    Mein Versuch das ganze per PHP umzusetzten endete mit folgendem Code:

    Ja, das ist das Ding von php-faq.de.

    Hierbei gibt der Server immer die Response, das er die daten nicht verarbeiten kann - das CGI hingegen arbeitet problemlos.

    Ich vermute, dass das empfangende Script dir die eigentlichen Probleme bereitet. Wenn du mal offen legen könntest, was dieses tut, wäre es einfacher, dir zu helfen.

    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.
  5. Gerade ist mir noch was aufgefallen:

    Die Daten die es einliest um diese zu versenden, kommen aus einer txt-Datei mit dem Aufbau:
    key:value
    key2:value2

    Sieht die Datei exakt so aus? Dann muss dieses hier:

    $data = "key=value&key2=value2";

    natürlich auch so aufgebaut sein, sonst muss die Verarbeitung im empfangenden Script zwangsläufig in die Hose gehen.

    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.