Newsgroup: it.comp.lang.perl
Titolo: Dovrebbe funzionare in teoria, in realtà no. :o(

Ciao a tutti.
D'accordo che sono un principiante, ma questo CGI di mia creazione dovrebbe
funzionare!!
Non trovo assolutamente l'errore.
Allora,
la funzione è questa: fare un CGI che gestisca i download, un po' come su
download.com
: lo stesso CGI segna in un file log il numero di download
effettuati, ma permette anche di saperlo (tramite SSI).
Ora, premesso che la directory che contiene i log ($directory) è CHMOD 777, e lo
script, ovviamente, CHMOD 755.. non va!
Il funzionamento dovrebbe essere questo:
dlcount.cgi?action=download&file=pippo.zip
così facendo dovrebbe aumentare le HITS di 1 e poi cominciare il download
<!--#exec cgi="/cgi-bin/dlcount.cgi?action=show&file=pippo.zip"-->
dovrebbe visualizzare il numero di download per pippo.zip (SSI abilitato)
Nell'esempio, le hits di pippo .zip sarebbero raccolte in un file logpippo.zip
che viene creato dal CGI (*dovrebbe* essere creato) se non esiste.
Ma forse sarà più chiaro se leggete il codice di persona.
Mi sta facendo impazzire!!
Nell'istante in cui gli dico di scrivere sul file mi da errore!! help!!
#!/usr/local/bin/perl
 # Path on the server where put counters
 $directory = "../counters";
 # URL of files for download (without final "/")
 $filesurl = "
http://www.miosito.com/files
;
 @vars = split(/&/, $ENV{QUERY_STRING});
 foreach $var (@vars) {
         ($v,$i) = split(/=/, $var);
         $v =~ tr/+/ /;
         $v =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
         $i =~ tr/+/ /;
         $i =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
         $i =~ s/<!--(.|\n)*-->//g;
         $INFO{$v} = $i;
 }
 $action = $INFO{'action'};
 $Document = "$directory/log$INFO{'file'}";
 chdir($directory);
 open(COUNT,"$Document");
  $Hits = <COUNT>;
 close(COUNT);
 If ($action eq "download") {
  $Hits++;
  open(COUNT,">$Document");
  print COUNT $Hits;
  close(COUNT);
  print "Content-type: text/html\n\n";
  print "Location: $filesurl/$INFO{'file'}\n\n";
  exit;
 }
 if ($action eq "show") {
  print "Content-type: text/html\n\n";
  print "$Hits";
  exit;
 }
Vi prego!! Siete la mia unica speranza!!
--
Umberto Meroni
[
http://www.ubi1k.com
] [
http://www.ubi1k-vb.net
]
[
webm...@ubi1k.com
] [ICQ: 14660006]
---
"Come spesso accade, il lupo si è travestito da agnello e i pastori applaudono."
Paolino Paperino
---
"Cercavi giustizia ma trovasti la Legge."
Il bandito e il campione, Grechi/De Gregori
---

 Nell'istante in cui gli dico di scrivere sul file mi da errore!! help!!
Ho notato nel codice che non viene fatto un controllo sul successo della
"open". Cio' significa che l'errore puo' essere anche su questa.
Piu' in generale credo sia il solito problema di "debuggare" i CGI.
Esguendoli a mano non si e' mai sicuri che le condizioni siano le staesse
di quando sono effettivamente eseguiti come CGI. Per questo io metto
sempre nel CGI un test su un argomento "DEBUG" e se debug esiste faccio
stampare qualche messaggio informativo. Tanto per dare un esempio:
open(FILE,$filename);
if($in{'DEBUG'}) {
	print "<pre>DEBUG - openinig $filename returns $!\n</pre>";
}
 
etc..
In questo modo puoi almeno vedere "perche' il file non viene aperto o
qualunque altra cosa non funziona.
						l.f.
--------------------------------------------------------------------------
       -- )     Luca Fini                            Tel: +39 055 2752 307
 ___    |\      Osservatorio Astrofisico di Arcetri  Fax: +39 055 2752 292
/   |   | |-_   L.go E.Fermi, 5 +-----------------------------------------
(___|___//___)  50125 Firenze  /   WWW: 
http://www.arcetri.astro.it/~lfini
 (_)      (_)   Italia        / e-mail: 
lf...@arcetri.astro.it
-----------------------------+--------------------------------------------
                              In a world without fences - who needs GATES?

 wrote:

Un po' di commenti.
1) Usi nomi di file relativi alla directory corrente, ma con i CGI la 
   directory corrente potrebbe non essere quella che tu pensi
2) Non controlli mai se le varie open() avvengono con successo: cio' e' male!
3) Non fai il lock per l'accesso esclusivo al file contenente il tuo
   numerello: cio' e' male!
4) Se usi il tuo programma per un SSI non devi mandare gli header HTTP
perche' non ti servono.
5) Se qualcosa non funziona, guarda nel logfile del server: li' trovi i
   messaggi di errore.
Maurizio
-- 
Maurizio M. Munafo' / 
mmmu...@netscape.net
"Consider Phlebas, who was once handsome and tall as you" (T.S.Eliot)