=encoding iso-8859-1 =head1 NOM perlfaq9 - Réseau (Revision: 1.20 , Date: 1998/06/22 18:31:09) =head1 DESCRIPTION Cette section traite des questions relatives aux aspects réseau, à internet et un peu sur le web. =head2 Mon script CGI fonctionne en ligne de commande, mais pas avec le navigateur (500 Server Error) Si vous pouvez démontrer que vous avez lu les FAQs suivantes et que votre problème n'est pas quelque chose de simple auquel on peut répondre facilement, vous recevrez probablement une réponse courtoise et utile à votre question si vous la postez dans comp.infosystems.www.authoring.cgi (si cela à avoir avec les protocoles HTTP, HTML ou CGI). Les questions qui semblent être du Perl mais qui sont plutôt des questions relatives au CGI et qui sont postées dans comp.lang.perl.misc peuvent ne pas être très bien reçues. Les FAQs utiles et les documents relatifs sont: CGI FAQ http://www.webthing.com/page.cgi/cgifaq Web FAQ http://www.boutell.com/faq/ WWW Securite FAQ http://www.w3.org/Security/Faq/ HTTP Spec http://www.w3.org/pub/WWW/Protocols/HTTP/ HTML Spec http://www.w3.org/TR/REC-html40/ http://www.w3.org/pub/WWW/MarkUp/ CGI Spec http://www.w3.org/CGI/ CGI Securite FAQ http://www.go2net.com/people/paulp/cgi-security/safe-cgi.txt =head2 Comment faire pour obtenir un meilleur message d'erreur d'un programme CGI? Utilisez le module CGI::Carp. Il remplace C et C, plus les fonctions normales C, C, et C du module Carp qui sont des versions plus parlantes et sures. Les erreurs continuent à être envoyées vers le fichier normal des erreurs du serveur. use CGI::Carp; warn "This is a complaint"; die "But this one is serious"; L'utilisation suivante de CGI::Carp redirige également les erreurs vers un fichier de votre choix, mais aussi les avertissements durant la phase de compilation en étant place dans un bloc BEGIN. BEGIN { use CGI::Carp qw(carpout); open(LOG, ">>/var/local/cgi-logs/mycgi-log") or die "Unable to append to mycgi-log: $!\n"; carpout(*LOG); } Vous pouvez vous arrangez pour que les erreurs fatales soient retournées au navigateur client, ceci vous permettant d'obtenir un meilleur debogage, mais pouvant paraître confus pour l'utilisateur final. use CGI::Carp qw(fatalsToBrowser); die "Bad error here"; Si l'erreur se produit avant que vous ayez les entêtes HTTP en sortie, le module essayera de les prendre en compte pour éviter les erreurs serveur 500. Les avertissements normaux continueront d'être envoyés vers le fichier de log des erreurs serveur (ou la ou vous sont les envoyées avec C), avec le nom de l'application et la date de l'erreur. =head2 Comment enlever les marqueurs HTML d'une chaîne? La meilleure façon (mais pas obligatoirement la plus rapide) est d'utiliser HTML::Parse disponible au CPAN (ce module fait partie de la distribution libwww-perl, qui est essentielle pour tous les hackers du Web). Plusieurs personnes essayent une approche simple par les expressions régulières, comme C.*?E//g>, mais ceci ne fonctionne pas correctement dans de nombreux cas car les marqueurs HTML peuvent continuer après des sauts de lignes, ils peuvent contenir des <,> entre guillemets, ou des commentaires HTML peuvent être présent. De plus ces personnes oublient de convertir les entités comme C<<> par exemple. Voici une "solution-basique", qui fonctionne avec la plupart des fichiers: #!/usr/bin/perl -p0777 s/<(?:[^>'"]*|(['"]).*?\1)*>//gs Si vous souhaitez une solution plus complète, regarder le programme striphtml se décomposant en 3 étapes à l'adresse http://www.perl.com/CPAN/authors/Tom_Christiansen/scripts/striphtml.gz =head2 Comment extraire des URL ? Une approche rapide mais imparfaite peut être #!/usr/bin/perl -n00 # qxurl - tchrist@perl.com print "$2\n" while m{ < \s* A \s+ HREF \s* = \s* (["']) (.*?) \1 \s* > }gsix; Cette version n'ajuste pas les URL relatives, ne comprend pas les instructions de base différentes, traite les commentaires HTML, ou accepte les URL elles mêmes en arguments. Mais elle fonctionne aussi 100 fois plus vite qu'une solution plus "complète" utilisant la suite de modules LWP, tel que le programme http://www.perl.com/CPAN/authors/Tom_Christiansen/scripts/xurl.gz =head2 Comment télécharger un fichier de la machine d'un utilisateur? Comment j'ouvre un fichier d'une autre machine? Dans le contexte d'un formulaire HTML, vous pouvez utiliser ce qui est connu comme l'encodage B. Le module CGI.pm (disponible au CPAN) supporte cette solution dans la méthode start_multipart_form() qui n'est pas la même que la méthode startform(). =head2 Comment faire un menu pop-up en HTML? Utiliser les tags BSELECTE> et BOPTIONE>. Le module CGI.pm (disponible au CPAN) support cette fonctionnalité, ainsi que de nombreuses autres, incluant quelques unes qui se synthétisent intelligemment d'elles même. =head2 Comment récupérer un fichier HTML? Utiliser le module LWP::Simple disponible au CPAN, qui fait parti de l'excellent package libwww-perl (LWP). D'un autre cote, si vous avez le navigateur en mode texte lynx installé sur votre système, il n'est pas mauvais de faire : $html_code = `lynx -source $url`; $text_data = `lynx -dump $url`; =head2 Comment décoder ou créer ces %-encodings sur le web? Voici un exemple de décodage: $string = "http://altavista.digital.com/cgi-bin/query?pg=q&what=news&fmt=.&q=%2Bcgi-bin+%2Bperl.exe"; $string =~ s/%([a-fA-F0-9]{2})/chr(hex($1))/ge; Encoder est un peu plus difficile, car vous ne pouvez pas changer aveuglement tous les caractères non alpha-numérique (C>\W>) dans leur codage hexadécimal. Il est important que des caractères avec une signification spéciale tel que C et C I soient pas transformes. Probablement la façon la plus simple d'obtenir le résultat escompté n'est pas de réinventer la roue, mais seulement d'utiliser le module URI::Escape qui fait parti du package libwww-perl (LWP) disponible au CPAN. =head2 Comment rediriger le navigateur vers une autre page? Au lieu de renvoyer une entête C dans votre réponse, envoyé plutôt un entête C. Officiellement ceci doit être un entête C, ainsi le module CGI.pm (disponible au CPAN) renvoie les 2. Location: http://www.domain.com/newpage URI: http://www.domain.com/newpage Note que les URL relatives dans ces entêtes peuvent provoquer des comportements étrange à cause des optimisations que les serveurs font. =head2 Comment mettre un mot de passe sur mes pages Web? Cela dépend. Vous devriez certainement lire la documentation de votre serveur Web, ou sinon vérifier quelques unes des FAQs référencées précédemment. =head2 Comment éditer mes fichiers .htpasswd et .htgroup avec Perl? Les modules HTTPD::UserAdmin et HTTPD::GroupAdmin proposent un interfaçage oriente objet à ces fichiers, en ommetant les façons dont ils peuvent être stockes. Les bases de données peuvent être du texte, dbm, Berkley DB ou n'importe qu'elle autre base de données avec un pilote compatible DBI. HTTPD::UserAdmin supporte les fichiers utilisés par les méthodes 'Basic' et 'Digest' du mécanisme d'authentification. Voici un exemple: use HTTPD::UserAdmin (); HTTPD::UserAdmin ->new(DB => "/foo/.htpasswd") ->add($username => $password); =head2 Comment parcourir un entête de mail? Pour une solution rapide et pas propre, essayez cette solution dérivée de la page 222 de la seconde édition de "Programming Perl": $/ = ''; $header = ; $header =~ s/\n\s+/ /g; # merge continuation lines %head = ( UNIX_FROM_LINE, split /^([-\w]+):\s*/m, $header ); Cette solution ne fonctionne pas correctement si, par exemple, vous essayez de mettre à jour toutes les lignes reçues. Une approche plus complète consiste à utiliser le module Mail::Header du CPAN (fait parti du package MailTools). =head2 Comment décoder un formulaire CGI? Beaucoup de personnes sont tentées de le faire eux mêmes, vous avez ainsi certainement vu beaucoup de code impliquant C<$ENV{CONTENT_LENGTH}> et C<$ENV{QUERY_STRING}>. Il est vrai que cela peut marcher, mais il y aussi beaucoup de versions qui sont tout simplement cassées! S'il vous plaît ne soyez pas tenté de réinventer la roue. A la place utilise CGI.pm ou CGI_Lite.pm (disponible au CPAN), ou si vous êtes exclu du monde des modules gratuits en utilisant perl1 .. perl4, vous devriez regarder dans cgi-lib.pl (disponible à http://www.bio.cam.ac.uk/web/form.html). =head2 Comment vérifier la validité d'une adresse email? Vous ne pouvez pas. Sans envoyer un mail à l'adresse et constater si cette adresse est rejetée , vous ne pouvez pas déterminer si une adresse est valide. De même si vous appliquez l'entête standard d'email, vous pouvez rencontrer des problèmes, car il existe des adresses qui ne sont pas compatibles avec la RFC-822 (le standard des entêtes des mails), et inversement il existe des adresses qui ne sont pas délivrables et qui sont compatibles. Beaucoup ont essayé d'éliminer de fréquentes adresses email invalides avec une simple expression régulière, comme : C. Cependant celle ci rejette également des adresses valides, et ne dis rien sur la potentialité de cette adresse à être délivrable. A la place regardez : http://www.perl.com/CPAN/authors/Tom_Christiansen/scripts/ckaddr.gz , qui actuellement vérifie en faveur d'une compatibilité complète avec les spécifications RFC (excepte les éventuels commentaires), vérifie qu'il ne s'agit pas d'une adresse que vous ne désire pas (cad, Bill Clinton ou votre responsable de compte mail), et vérifie également que le nom donne peut être cherche dans le service DNS. Ce n'est pas très rapide, mais ça fonctionne. =head2 Comment décoder une chaîne MIME/BASE64 ? Le package MIME-tools (disponible sur le CPAN) permet cela et beaucoup plus. Décoder du BASE64 devient aussi simple que cela : use MIME::base64; $decoded = decode_base64($encoded); Une approche plus directe consiste à utiliser la fonction unpack() avec le formatage "u" après quelques translations mineures : tr#A-Za-z0-9+/##cd; # supprime les caracteres non base-64 tr#A-Za-z0-9+/# -_#; # converti dans le format uuencode $len = pack("c", 32 + 0.75*length); # calcule la longueur en octets print unpack("u", $len . $_); # uudecode et affiche =head2 Comment renvoyer l'adresse email de l'utilisateur ? Sur les systèmes supportant getpwuid, la variable $E et le module Sys::Hostname (qui fait parti de la distribution standard de perl), vous pouvez certainement utiliser quelque chose comme ceci : use Sys::Hostname; $address = sprintf('%s@%s', getpwuid($<), hostname); La politique de la compagnie sur les adresses email, peut signifier que ceci génère des adresses que le système de mail de la compagnie n'acceptera pas, ainsi vous devriez demander une adresse email d'utilisateur quand ceci se produit. De même, tous les systèmes sur lesquels fonctionne perl n'accepte pas ces informations comme sur Unix. Le module Mail::Util du CPAN (fait parti du package MailTools) procure une fonction mailaddress() qui essaye de créer l'adresse email d'un utilisateur. Elle effectue une démarche plus intelligente que le code précédant, utilisant des informations fournies quand le module fut installé, mais cela peut rester incorrect. Souvent la meilleure manière est de demander à l'utilisateur. =head2 Comment envoyer/lire un mail ? Envoyer des mails : le module Mail::Mailer du CPAN (fait parti du package MailTools) est centré sur Unix, tandis que Mail::Internet utilise Net::SMTP qui n'est pas basé sur Unix. Lire des mails : utiliser le module Mail::Folder du CPAN (fait parti du package MailFolder) ou le module Mail::Internet du CPAN (également fourni dans le package MailTools). =head2 Comment trouver mon nom de machine / nom de domaine / mon adresse IP ? Beaucoup de programmeurs ont historiquement appellé le programme C<`hostname`>. Ceci est une manière souvent expéditive, mais qui n'est pas très portable. Il s'agit d'une de ces contradictions entre facilité et portabilité. Le module Sys::Hostname (qui fait parti de la distribution standard perl), vous donnera le nom de machine, avec lequel vous pourrez trouvez l'adresse IP (en supposant que vous ayez un DNS en état de fonctionnement) avec un appel à gethostbyname(). use Socket; use Sys::Hostname; my $host = hostname(); my $addr = inet_ntoa(scalar(gethostbyname($name)) || 'localhost'); Probablement la manière la plus simple de connaître votre domaine DNS est de le récupérer dans /etc/resolv.conf, du moins sous Unix. Bien évidemment cela suppose plusieurs choses à propos de votre configuration du fichier /etc/resolv.conf, notamment qu'il existe. (Nous continuons à espérer une bonne méthode pur connaître le domaine DNS pour les systèmes autre que Unix) =head2 Comment récupèrer un article d'un groupe de news ? Utilise les modules Net::NNTP ou News::NNTPClient, tous les deux disponibles sur le CPAN. Ceux ci peuvent effectuer des taches comme récupèré la liste des groupes de news, aussi simplement que : perl -MNews::NNTPClient -e 'print News::NNTPClient->new->list("newsgroups")' =head2 Comment récupèrer/envoyer un fichier par FTP ? LWP::Simple (disponible au CPAN) peut récupérer mais pas envoyer. Utilise Net::FTP (aussi disponible au CPAN) qui est plus complexe , mais avec lequel on peut envoyer comme récupérer. =head2 Comment utiliser des RPC en Perl ? Un module DCE::RPC est en cours de développement (mais n'est pas encore disponible), et sera livre comme faisant parti du package DCE-Perl (disponible au CPAN). Aucun module ONC::RPC n'est connu. =head1 AUTEUR ET COPYRIGHT Copyright (c) 1997, 1998 Tom Christiansen et Nathan Torkington. Tous droits réservés. Lorsque ce travail est inclus comme un élément de la distribution standard de Perl ou comme une partie de sa documentation complète sous forme imprimée ou autrement, il ne peut être distribué que dans les limites fixées par la Perl's Artistic License. Toute distribution de ce fichier ou de ses dérivés I de cet ensemble nécessite un accord particulier avec le titulaire des droits (voir L). Indépendemment de sa distribution, tous les exemples de code de ce fichier sont ici placés dans le domaine public. Vous êtes autorisés et encouragés à utiliser ce code dans vos programmes que ce soit pour votre plaisir ou pour un profit. Un simple commentaire dans le code en précisant l'origine serait de bonne courtoisie mais n'est pas obligatoire. =head1 TRADUCTION =head2 Version Cette traduction française correspond à la version anglaise distribuée avec perl 5.005_02. Pour en savoir plus concernant ces traductions, consultez L. =head2 Traducteur Aymeric Barantal =head2 Relecture Régis Julié