2 Stimmen

Perl gepufferte Ausgabe

Ich ändere einige Perl-Skripte in einer vorhandenen Lösung. Aufgrund einiger Änderungen beim Upgrade des (Windows-) Servers habe ich sie von ISAPI auf CGI umgestellt. Das bedeutet, dass ich jetzt den Content-Type manuell senden muss, oder es wird fehlschlagen.

Also muss ich die Ausgabepufferung aktivieren (Druckanweisungen, also STDOUT), Content-Type: text/html senden, aber in den Fällen, wo es eine Weiterleitung ist, muss ich den Ausgabepuffer löschen und ein neues Header senden.

Wie mache ich das?

Oder gibt es einen anderen Weg? Beachten Sie, dass das Skript bereits print zum Ausgeben von HTML verwendet und ich das nicht ändern kann. (Es wurde in den frühen 90ern geschrieben.)

select(STDOUT);
$| = 0;
print "Content-Type: text/html\n\n";
# irgendwie Ausgabe löschen
print "Location: login.pl\n\n";

7voto

cjm Punkte 60581

Sie können ein print nicht rückgängig machen, das nach STDOUT gesendet wird. Sie müssen entscheiden, ob Sie HTML-Ausgabe oder eine Weiterleitung vor dem Senden von etwas nach STDOUT generieren.

Eine Möglichkeit, dies zu tun, wäre, einen In-Memory-Puffer anstelle von STDOUT zu select:

my $buffer = '';
open(my $out, '>', \$buffer) or die;
select($out);
print "Content-Type: text/html\n\n";

if (generate_redirect) {
  print STDOUT "Location: login.pl\n\n";
} else {
  print STDOUT $buffer;
}

Sobald Sie sicher sind, dass Sie keine Weiterleitung generieren werden, können Sie STDOUT wieder selectieren und den Puffer ausgeben:

select STDOUT;
print $buffer;
print "HTML geht jetzt an den Client anstelle von \$buffer\n";

1voto

Mat Punkte 195740

Einer der sichersten (meiner Meinung nach) Wege, dies zu tun, ist, alle Logik, die Sie benötigen, um zu entscheiden, ob Sie umleiten möchten oder nicht, ganz oben in Ihrem Skript zu platzieren, bevor Sie etwas anderes ausgeben.

Wenn Sie das Originalskript überhaupt nicht ändern möchten, schreiben Sie ein separates Skript, das einfach die Umleitungs-/Inhaltstyp-Logik durchführt und Ihr Originalskript anschließend aufruft, wenn nötig.

0voto

Tedd Hansen Punkte 11515

Eine Antwort, die nicht behandelt wurde, ist einfach, den STDOUT-Standardgriff durch einen anderen Griff in BEGIN zu ersetzen und ihn in END zu verarbeiten, indem Content-Type: text/html\n\n hinzugefügt wird, wenn kein Header vorhanden ist. Hässlich, aber sollte funktionieren ... in der Theorie.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X