OVH Cloud OVH Cloud

Transfert CGI d'une variable contenant des espace

6 réponses
Avatar
gniagnia
Bonjour,

Le script perl/CGI que je suis en train d'ecrire effectue les
traitements suivants.
Tout d'abord, un premier script affiche sur une page web une liste de
fichiers et leur date :



#!/usr/bin/perl
use CGI;
$list_command=3D"ls -la /tmp/log*";

open(DIR, " $list_command | " ) || die " died " ;
@list_logs =3D <DIR> ;
closedir DIR;

print "Content-type: text/html\n\n";
print "<title>TEST ACCEUIL</title>";
print "<head></head>";
print "<body>";
print "<center><a name=3DSOMMAIRE></a><h1>TEST ACCEUIL - LIST LOG FILES</
h1></center>";
print "<a href=3D./stat_ftp-intra.pl>VERS STATISTIQUES</a><br>";

foreach(@list_logs)
{
s!^(?:\S+\s+){5}(\S+\s+\S+\s+\S+)\s+/(\S+)!$2 $1!;

$log_date =3D $1;
$log_name =3D $2;
$log_name2 =3D map { s|.*/||; $_ } $log_name;

print "<a href=3D./test2.pl?log_filename=3D$log_name&log_date=3D$log_date>
$log_name</a>, date: $log_date<br>";

}
print "</body>";



L'output est le suivant :


log, date: Feb 26 04:02
log.1, date: Feb 25 04:02
log.10, date: Feb 16 16:26
log.2, date: Feb 24 04:02
log.3, date: Feb 23 04:02
log.4, date: Feb 22 04:02
log.5, date: Feb 21 04:02
log.6, date: Feb 21 00:24
log.7, date: Feb 19 15:13
log.8, date: Feb 18 04:02
log.9, date: Feb 17 04:02



Chaque ligne est donc un lien hypertexte qui appel le script test2.pl
en "embarquant" les variables $ log_name et $log_date.

Pour l'instant le script test2.pl ne fait qu'afficher le contenu de
ces 2 variables :

#!/usr/bin/perl
use CGI qw(param);
print "Content-type: text/html\n\n";
print "<title>TEST ACCEUIL</title>";
print "<head></head>";
print "<body>";

my $log_name =3D param("log_filename");
my $log_date =3D param("log_date");


print "le fichier log est $log_name datant du $log_date";
print "</body>";


Mais l'output g=E9n=E9r=E9 est le suivant (en supposant par exemple que j'ai
cliqu=E9 au perealable sur le "log.1") :

le fichier log est log.1 datant du Feb


La date est donc tronqu=E9e...

Comment dois je m'y prendre pour eviter cela?


Merci d'avance pour votre aide.

6 réponses

Avatar
espie
In article ,
gniagnia wrote:
Bonjour,

Le script perl/CGI que je suis en train d'ecrire effectue les
traitements suivants.
Tout d'abord, un premier script affiche sur une page web une liste de
fichiers et leur date :



#!/usr/bin/perl
use CGI;
$list_command="ls -la /tmp/log*";


glob() et stat(), c'est mieux a terme... enfin bon, tu fais comme tu veux.


open(DIR, " $list_command | " ) || die " died " ;
@list_logs = <DIR> ;
closedir DIR;

print "Content-type: text/htmlnn";
print "<title>TEST ACCEUIL</title>";
ACCUEIL en bon francais.


print "<head></head>";
print "<body>";
print "<center><a name=SOMMAIRE></a><h1>TEST ACCEUIL - LIST LOG FILES</
h1></center>";
print "<a href=./stat_ftp-intra.pl>VERS STATISTIQUES</a><br>";

foreach(@list_logs)
{
s!^(?:S+s+){5}(S+s+S+s+S+)s+/(S+)!$2 $1!;

$log_date = $1;
$log_name = $2;
$log_name2 = map { s|.*/||; $_ } $log_name;

print "<a href=./test2.pl?log_filename=$log_name&log_date=$log_date>


C'est cette ligne qui est fausse, tu ponds des url qui n'en sont pas.
Il faut transformer les espaces en %20, et autres joyeusetes.

Je viens de regarder a nouveau la doc de CGI.pm, que j'utilise peu. Il
n'y a pas de fonction de type `url_escape', comme dans Mason...

Tu peux emprunter celle de Mason:

sub url_escape
{
return unless defined ${ $_[0] };

use bytes;
${ $_[0] } =~ s/([^a-zA-Z0-9_.-])/uc sprintf("%%%02x",ord($1))/eg;
}

Avatar
Paul Gaborit
À (at) Mon, 26 Feb 2007 16:29:34 +0000 (UTC),
(Marc Espie) écrivait (wrote):
[...]
Je viens de regarder a nouveau la doc de CGI.pm, que j'utilise peu. Il
n'y a pas de fonction de type `url_escape', comme dans Mason...

Tu peux emprunter celle de Mason:

sub url_escape
{
return unless defined ${ $_[0] };

use bytes;
${ $_[0] } =~ s/([^a-zA-Z0-9_.-])/uc sprintf("%%%02x",ord($1))/eg;
}



On peut aussi utiliser le module URI et sa méthode query_form qui est
faite pour cela.

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>

Avatar
Nicolas George
Marc Espie wrote in message <erv1te$2fln$:
Il faut transformer les espaces en %20, et autres joyeusetes.


Plus un deuxième passage, pour encoder les & en &amp;.

Avatar
Paul Gaborit
À (at) 26 Feb 2007 17:53:43 GMT,
Nicolas George <nicolas$ écrivait (wrote):
Marc Espie wrote in message <erv1te$2fln$:
Il faut transformer les espaces en %20, et autres joyeusetes.


Plus un deuxième passage, pour encoder les & en &amp;.


Exact. C'est pour cela que je trouve cela plus propre en passant par
URI puis par un module HTML car on sépare bien les deux
problématiques: encoder des valeurs dans un URI puis encoder des URI
dans du (X)HTML.

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>


Avatar
gniagnia
Merci pour ces explications !

J'ai utilisé le script d'encodage suivant :

$str =~ s/([^A-Za-z0-9])/sprintf("%%%02X", ord($1))/seg;
Avatar
Nicolas George
Paul Gaborit wrote in message :
Exact. C'est pour cela que je trouve cela plus propre en passant par
URI puis par un module HTML car on sépare bien les deux
problématiques: encoder des valeurs dans un URI puis encoder des URI
dans du (X)HTML.


J'abonde dans ton sens.