Newsgroup: it.comp.lang.perl
Titolo: Redirect condizionato

Sto tentando di reindirizzare una pagina CGI ad una seconda quando si
verifica una determinata condizione.
Il codice che ho scritto e' il seguente:
----------------------------------------
my %in = parseurl();
if ($in{'application'} eq "All") {
	my $URL = "
http://myserver:8080/myTemp/delete.cgi?source=
".
$in{'source'}."&package=".$in{'package'}."&pkg_version=".
$in{'pkg_version'}."&application=".
$in{'application'}."&app_version=&os=";
	#print $URL;
	$cgi->redirect($URL);
} else {
	[...]
}
----------------------------------------
Prima e dopo il blocco if c'e' il codice per inserire l'header e il
footer della pagina.
Quando la condizione e' vera invece di essere effettuato il redirect
viene aperto il CGI con solo l'header e il footer.
Come potrei fare il redirect?
Grazie
SteO153

 ha scritto:

Se fai il redirect NON devi stampare header e footer.
Il tuo problema consiste prioprio in cosa c'è fuori dal codice che hai 
indicato. Tali istruzioni NON devono essete eseguite se la condizione è vera 
(e devi uscire subito dopo l'istruzione redirect.

 (e devi uscire subito dopo l'istruzione redirect.
Ora ho modificato il codice nel seguente modo:
----------------------------------------
print Bugzilla->cgi->header();
my %in = PXMessage::parseurl();
if ($in{'application'} eq "All") {
	my $URL = "
http://myserver:8080/myTemp/delete.cgi?source=
".
$in{'source'}."&package=".$in{'package'}."&pkg_version=".
$in{'pkg_version'}."&application=".
$in{'application'}."&app_version=&os=";
	#print $URL;
	Bugzilla->cgi->redirect($URL);
} else {
	[...]
}
----------------------------------------
Prima del blocco if ci sono solo quelle due righe e dei commenti, dopo
il blocco niente (solo una riga vuota). Tutto il resto e' dentro
l'else.
Le righe fuori non le possono eliminare. Se cancello la prima quando
carico il CGI ricevo l'HTTP Error 500, mentre la seconda mi serve
nella condizione dell'if.
Solo che cosi' mi viene aperta una pagina bianca e il redirect
continua a non funzionare.
SteO153

Monsieur SteO153 wrote:

Ci sono diversi problemi...
... Ma principalmente uno: il metodo redirect di CGI.pm si limita a 
generare il redirection header, per inviarlo al client (browser) devi 
stamparlo (vedi oltre).
Poi come diceva giustamente Icestorm, fatto il redirect dovresti subito 
uscire, né devi inviare alcun header prima.
In definitiva ti conviene usare, il prima possibile nel tuo script, una 
cosa così:
if ($condizione) {
     print $cgi->redirect($URL); # Nota la print!
     exit
}
# Qui va il resto dello script
# compreso: print Bugzilla->cgi->header();
Così è molto più chiaro di una if-else.
Ma, a latere, sei proprio sicuro che ti serva un redirect esterno?
Il redirect esterno ha una semantica ben precisa (dovresti pure 
adoperare l'opportuno codice di stato HTTP - CGI.pm di default invia 302):
http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html
Assicurati che il redirect esterno ti serva veramente (ad esempio può 
servire dopo un POST), altrimenti se quello che ti serve è semplicemente 
invocare una subroutine che normalmente è associata ad un'altra URL, 
chiamala direttamente dal codice (è quello che impropriamente si chiama 
/redirect interno/).
Ciao.

 Bugzilla->cgi->redirect($URL);
Secondo errore (sorry, non l'avevo letto prima), qui manca la print.

 /redirect interno/).
La logica dietro quel blocco if-then e' questa:
l'utente apre una pagina e riempiendo vari form concatenati arriva
all'ultima pagina (delete.cgi) dove le informazioni inserite e passate
attraverso l'url vengono elaborate.
Se nel terzo form invece di scegliere il nome di un applicazione
seleziona "All" viene fatto saltare direttamente a delete.cgi senza
dover riempire i form intermedi (versione dell'applicazione e sistema
operativo).
Ogni CGI che contene un form solitamente e' strutturata con uno script
javascript che quando si preme il submit raccoglie le informazioni
inserite, le appende nell'url e va alla pagina successiva.
SteO153