perlunity.de - PERL | JAVASCRIPT | PHP | MySQL | APACHE



#!/COMMUNITY

Members: 5374
davon online: 1
weitere User: 26
Click for quality!




11.02.2012 / 07:47

Community-Member werden   |   Paßwort vergessen   |   OnlineMonitor (1) Wer ist online ... OnlineMonitor starten !
     

 

Home


PERLscripts


PHPscripts


JAVAscripts


Hilfreiches


Links2www


Newscenter


Community


Interna




Community  »  CGI: Allgemeines Forum zur Themenübersicht Themensuche Themenansicht in Thread-Modus


BeitragCGI-Aufruf ohne Browser ...
Seitenanfang
Vorausschicken muss ich:

Mein Wissen stammt aus "Learning Perl" von O'Reilly & Ass. und entspricht bestimmt nicht dem vollen Inhalt ... und meine Erfahrung aus der Anwendung desselben ... ich habe etwa 30 Scripts geschrieben, die prima (und schon lange) laufen. :) Also ... ich bin weder ganz Laie noch Profi ... bitte daher um Nachsicht, wenn ich manches laienhaft ausdrücke!

Jetzt habe ich eine Aufgabe, für die ich keine Antwort in meinen Unterlagen finde. :(

Das Problem:

Ich brauche ein Script ("A"), dem von einem dritten Anbieter (Zahlungsprozessor) Daten per POST übergeben werden, welche nur in einem File abgelegt werden sollen, ohne dass ein Browser im Spiel ist. (Keine weitere Rückmeldung oder Ausgabe!)

Dem gleichen Script soll (in einem anderen Zweig derselben Transaktionsmöglichkeiten) von einem Script ("B") auf meinem Server (auf dem auch Script "A" liegt) ein Datenstring per POST übergeben werden, der ebenfalls abgelegt werden soll, ohne dass ein Browser ins Spiel kommt, jedoch soll das diesen Datenstring übergebende Script nicht mit der Übergabe enden, sondern nach Absetzen der Daten eine neue Webseite anzeigen. (Das ist nur ein Sonderfall OHNE den Zahlunsgprozessor.)

Mein Script "A" schaut so aus:

#!/usr/local/bin/perl -w
unless ($testflag) { use CGI::Carp qw(fatalsToBrowser warningsToBrowser); }
use CGI qw(param);
...
hier folgt der Code, der die Daten übernimmt und ablegt - da gibt es offenbar kein Problem;
es ist kein "print ..." enthalten (schon gar nicht print "Content ... etc \n\n";)! (Aber natürlich ein paar Ausgaben an FILE.)
...
exit();

$testflag wird nur während der Testphase benutzt, ist null in der "Produktionphase".

Dieses Script scheint zu laufen, wenn es vom dritten Anbieter Daten übergeben bekommt; wenn es aber vom eigenen Server aufgerufen wird (Script "B"), dann erzeugt es einen Fehler "premature end of script header"; den bringe ich nur weg, indem ich dazufüge:

my $cgi = CGI->new();
print $cgi->header();

... aber: damit überschreibt dieses Script die offene Browserseite des auslösenden Scripts "B" ... was ja nicht sein soll. (Erstes Problem).

Das zweite Problem (die zweite Frage) hier ist:

Dieses zweite Script hat folgenden Passus:
...
print &parse_template('teilnehmer/auftrag2.htmlt'); # hier wird ein Datenstring abgeschickt
$in{'info_text'} = "<b>Gratulation:</b> Die Bestellung ist erfolgreich abgeschlossen!";
print &parse_template('txinfo.htmlt'); # hier wird $in{'info_text'} ausgeben
exit(0);

Im Template auftrag2 ist der Aufruf des o.a. Script A mit den per POST zu übergebenden Daten. Genau derselbe Passus existiert (dort mit "auftrag" statt "auftrag2") ein zweites Mal, wo allerdings ein Datenstring aus einem Formular an den externen Zahlungsprozessor geschickt wird, was ZWEI Aktionen bewirkt:

(a) Einmal wird ein Datenstring an Script A geschickt (das funktioniert offenbar), zum anderen wird
(b) die Kontrolle an "mich" (einen anderen URL, ohne Datenübergabe) zurückgegeben, wo dann eine entsprechende Seite (wieder &parse_template etc...) ausgegeben wird.

Das Problem hier: Der oben angeführte Passus (die drei Zeilen) läuft so:

Ausgabe des Datenstring: OK; dort ist ein Schalter "Absenden" inerhalb <form>...</form>, aber keine Eingabefelder, (nur "hidden"s, um den Datenstring zu formen) - das funktioniert auch, der Datenstring kommt im Script "A" korrekt an und wird dort korrekt verarbeitet;

ABER ... Script A löscht nun die aufrufende Seite mit dem Schalter (ganz leere Seite) und gibt die Kontrolle NICHT mehr an "mich" zurück, das heißt die Zeile ...
$in{'info_text'} = etc... wird nie ausgeführt.

Ich vermute, dass ich die Daten anders als per Formular übergeben muss bzw. das Script "A" anders als per Formular aufrufen muss ... aber WIE?

Ich vermute auch, dass der Fehler "premature .." von mir NICHT korrekt durch

my $cgi = CGI->new();
print $cgi->header();

behoben wurde ... und ich gestehe, dass ich diesen Teil auch nicht wirklich verstehe, sondern ihn auf der Suche nach einer Lösung meines Problems gefunden habe. Aber wie ist die korrekte Lösung?

Die konkreten Fragen daraus (sofern sie nicht durch das Aufzeigen der Fehler oben beantwortet sind):

(a) Wie muss ein Script gestaltet sein, dass es beim Aufruf NICHT an einen Browser Daten sendet? (Außer eben ... keinen http-header erzeugen)

(b) Wie muss ein Script gestaltet sein, dass es keinen "premature end of header"-Fehler erzeugt bzw. was genau sind die Ursachen dafür?

(c) Wie muss ein Script aufgerufen werden, dass es gewissermaßen aus dem Steuerungsfluß "abzweigt", ohne diesen zu beeinflußen? (Eine Rückmeldung ist hier nicht erforderlich, weil der übergebene Datenstring getrennt untersucht wird und einen Fehlerfall dann behandelt.)

Für jede Hilfe, jeden Hinweis dankbar!

Ferdl

Datum: 19.10.2006-10:03

Beitragre: CGI-Aufruf ohne Browser ...
Seitenanfang
Aufgrund deines Textes habe ich mal folgendes angenommen:

Zweig 1:
START
+Daten v. Formular bzw Link mit Parametern
|
| Post (via Web Browser)
|
+CGI Script A, was Daten entgegen nimmt
|--- annehmen
|--- verarbeiten
|--- eventuelle Rückmeldung
ENDE

Zweig 1 funktioniert ja, laut deiner eigenen Aussage. Vorrausgesetzt ich habe das richtig rausgelesen. ;)

Zweig 2:
START
+Daten von Script B
|
| Aufruf ohne Browser (aber mit Webserver?)
|
+CGI Script A, was Daten entgegen nimmt
|--- annehmen
|--- verarbeiten
|--- eventuelle Rückmeldung
ENDE

Hier bin ich nicht ganz sicher, ob du zwar ohne Webbrowser aber mit Web Server die Daten von Script B an Script A übergeben willst. Wenn mit Browser, dann bau dir doch im einfachsten Fall einen klitzekleinen HTTP Agenten (Modul LWP:: Agent glaube ich) im Script und setz damit deinen Request über den Webserver an dein Script A ab. Die Ausgabe(n) landen in deinem Perl Script bzw. in einer Datei. Ist es das was dir vielleicht weiterhilft?

*Premature End of Script Headers*
Mögliche Ursachen:
- fehlerhafte Shebang Zeile (Pfad zum Interpreter #!/usr/bin/perl )
- fehlender HTML Content Header:

Content-type:text/html\n\n

Ohne diese Zeile kann der Browser nichts mit dem Inhalt anfangen.

Grüße
Mario

Datum: 19.10.2006-16:18

Beitragre: CGI-Aufruf ohne Browser ...
Seitenanfang
Hi,

ich möchte hier an die letzten Zeilen meines Vorposters anknüpfen. Wird ein CGI Skript vom Apache aufgerufen, dann will der Apache (oder sonstiger Webserver) auch Daten ausliefern. Ohne machte das System keinen Sinn. Deshalb auch die Fehlermeldung.

Man übersetze: premature end of script headers.

"Vorzeitiges Ende der Skriptheader"

Du muss Dir also was anderes überlegen. CGI ist auf den Roundtrip ausgelegt, da kommst Du nicht drum herum.

-uw

Datum: 20.10.2006-07:58

Beitragre: CGI-Aufruf ohne Browser ...
Seitenanfang
Danke, TbHoCne!
Ja .. habe gerade schon Mario gesagt, dass ich was dazu gelernt habe! Ist ja toll ... war eben ein typischer Fall von Fehleinschätzung (udn ahrscheinlich auch fehelden Erfahrung - um die bin ich aber jetzt reicher! :))#

Datum: 20.10.2006-09:37

Beitragre: CGI-Aufruf ohne Browser ...
Seitenanfang
Danke, Mario!

Ja, ich glaube der Tip mit dem http-Agent wird mir weiterhelfen ... das macht zumindest Sinn aus Sicht des Ganzen. Und ja, ich denke schon, dass Sie's richtig verstanden haben. :)

Zum "premature ..." - hab' da was dazu gelernt. :)

Bisher hab' ich ja NUR mit Browser gearbeitet und deshalb IMMER den Header programmiert. DACHTE aber, dass ich bei diesem Script keinen Browser brauche und deshalb keinen Header - typischer Fall von Fehleinschätzung! Danke für den Hinweis!

(Falls ich bei meinen weiteren Arbeiten wieder auf neue Daten stoße, komm' ich wieder posten. ;))

Ferdl

Datum: 20.10.2006-09:25

-






-
-