Ich versuche herauszufinden, ob es eine Möglichkeit gibt, eine Antwort unter mod_perl 2 abzuschließen, ohne zum Haupt-Handler zurückzukehren. Ich habe bisher keine Methode in den Dokumenten gefunden. Das Folgende ist ein Beispiel dafür, was ich versuche zu erreichen:Schließen Antwort unter mod_perl 2
#!/usr/bin/perl
# This is some mod_perl handler
use strict;
use warnings;
use Apache2::Const ':common';
sub handler {
my $r = shift;
if ($r->method eq 'POST') {
# just to do something as example
do_post_response($r);
}
$r->content_type('text/plain');
print "Thank you, goodbye.";
return Apache2::Const::OK;
}
sub do_post_response {
my $r = shift;
unless (check_somthing()) {
# Suppose I find a situation that requires
# a different response than normal...
$r->content_type('text/plain');
print "We have a situation...";
$r->something_to_finish_the_request_immediatly(Apache2::Const::OK);
}
}
In einem regulären Perl-Skript, wie allein oder unter mod_cgi laufen stehen, ich konnte nur exit()
mit der neuen Antwort, aber unter mod_perl
Ich muß etwas in der ursprünglichen handler
Unterroutine zurückgeben. Das führt mich dazu, eine ganze Kette von Anrufen im Auge zu behalten, bei denen alle etwas zurückgeben müssen, bis ich zurück zum Hauptnetz komme.
Zum Beispiel statt:
unless (check_something()) { ...
Ich brauche Dinge wie:
my $check = check_something();
return $check if $check;
und ich muss auch etwas Ähnliches tun in der Haupt Handler, der für einige ziemlich ungly ist Situationshandhabung.
Gibt es eine Möglichkeit, die Anfrage innerhalb eines verschachtelten Anrufs zu schließen, genau wie das, was ich mit meinem Beispiel zu veranschaulichen versuchte?
EDIT: Ich habe festgestellt, dass ich einen goto LABEL
und Ort nennen kann, die kurz vor der letzten Rückkehr in dem Haupt handler
Unterroutine beschriften. Es funktioniert, fühlt sich aber immer noch wie ein schmutziger Hack an. Ich hoffe wirklich, dass es einen schöneren Weg gibt.
Ich bin kein Experte auf mod_perl2 aber in der Regel das sieht aus wie etwas, das Sie Ausnahmen für verwenden würde. Innerhalb von do_post_response(), benutze 'die 'Wir haben eine Situation ..."; 'und fange diese in handler() mit einem' eval' Block oder besser mit einem Modul wie 'Try :: Tiny'. Fügen Sie "Exception :: Class" hinzu, wenn Sie Ihre benutzerdefinierten Ausnahmen von anderen Ausnahmen unterscheiden müssen, die aufgrund anderer nicht abgefangener Fehler auftreten können. – mbethke