.\" Automatically generated by Pod::Man 2.09 (Pod::Simple 3.04) .\" .\" Standard preamble: .\" ======================================================================== .de Sh \" Subsection heading .br .if t .Sp .ne 5 .PP \fB\\$1\fR .PP .. .de Sp \" Vertical space (when we can't use .PP) .if t .sp .5v .if n .sp .. .de Vb \" Begin verbatim text .ft CW .nf .ne \\$1 .. .de Ve \" End verbatim text .ft R .fi .. .\" Set up some character translations and predefined strings. \*(-- will .\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left .\" double quote, and \*(R" will give a right double quote. | will give a .\" real vertical bar. \*(C+ will give a nicer C++. Capital omega is used to .\" do unbreakable dashes and therefore won't be available. \*(C` and \*(C' .\" expand to `' in nroff, nothing in troff, for use with C<>. .tr \(*W-|\(bv\*(Tr .ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p' .ie n \{\ . ds -- \(*W- . ds PI pi . if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch . if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch . ds L" "" . ds R" "" . ds C` "" . ds C' "" 'br\} .el\{\ . ds -- \|\(em\| . ds PI \(*p . ds L" `` . ds R" '' 'br\} .\" .\" If the F register is turned on, we'll generate index entries on stderr for .\" titles (.TH), headers (.SH), subsections (.Sh), items (.Ip), and index .\" entries marked with X<> in POD. Of course, you'll have to process the .\" output yourself in some meaningful fashion. .if \nF \{\ . de IX . tm Index:\\$1\t\\n%\t"\\$2" .. . nr % 0 . rr F .\} .\" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .hy 0 .if n .na .\" .\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2). .\" Fear. Run. Save yourself. No user-serviceable parts. . \" fudge factors for nroff and troff .if n \{\ . ds #H 0 . ds #V .8m . ds #F .3m . ds #[ \f1 . ds #] \fP .\} .if t \{\ . ds #H ((1u-(\\\\n(.fu%2u))*.13m) . ds #V .6m . ds #F 0 . ds #[ \& . ds #] \& .\} . \" simple accents for nroff and troff .if n \{\ . ds ' \& . ds ` \& . ds ^ \& . ds , \& . ds ~ ~ . ds / .\} .if t \{\ . ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u" . ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u' . ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u' . ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u' . ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u' . ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u' .\} . \" troff and (daisy-wheel) nroff accents .ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V' .ds 8 \h'\*(#H'\(*b\h'-\*(#H' .ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#] .ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H' .ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u' .ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#] .ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#] .ds ae a\h'-(\w'a'u*4/10)'e .ds Ae A\h'-(\w'A'u*4/10)'E . \" corrections for vroff .if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u' .if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u' . \" for low resolution devices (crt and lpr) .if \n(.H>23 .if \n(.V>19 \ \{\ . ds : e . ds 8 ss . ds o a . ds d- d\h'-1'\(ga . ds D- D\h'-1'\(hy . ds th \o'bp' . ds Th \o'LP' . ds ae ae . ds Ae AE .\} .rm #[ #] #H #V #F C .\" ======================================================================== .\" .IX Title "PERLFAQ9 1" .TH PERLFAQ9 1 "2006-03-22" "DocFr" "User Contributed Perl Documentation" .SH "NAME/NOM" .IX Header "NAME/NOM" perlfaq9 \- Re\*'seau ($Revision: 1.28 $, \f(CW$Date:\fR 2005/12/31 00:54:37 $) .SH "DESCRIPTION" .IX Header "DESCRIPTION" Cette section traite des questions relatives aux aspects re\*'seau, a\*` internet et un peu au web. .Sh "Quelle est la forme correcte d'une re\*'ponse d'un script \s-1CGI\s0 ?" .IX Subsection "Quelle est la forme correcte d'une re'ponse d'un script CGI ?" (Alan Flavell re\*'pond...) .PP La Common Gateway Interface (\s-1CGI\s0) spe\*'cifie une interface logicielle entre un programme (\*(L"le script \s-1CGI\s0\*(R") et un serveur web (\s-1HTTPD\s0). Cette interface n'est pas spe\*'cifique a\*` Perl et posse\*`de ses propres \s-1FAQ\s0 et tutoriels ainsi qu'un forum de discussions comp.infosystems.www.authoring.cgi. .PP Les spe\*'cifications \s-1CGI\s0 sont pre\*'sente\*'es dans la \s-1RFC\s0 d'information 3875 (). .PP D'autres documentations inte\*'ressantes sont liste\*'es sur . .PP Ces \s-1FAQ\s0 Perl re\*'pondent a\*` quelques proble\*`mes \s-1CGI\s0. Mais nous incitons fortement les programmeurs Perl a\*` utiliser le module \s-1CGI\s0.pm qui fait attention a\*` tous les de\*'tails pour eux. .PP La ressemblance entre les en\-te\*^tes d'une re\*'ponse \s-1CGI\s0 (de\*'finis dans les spe\*'cifications \s-1CGI\s0) et ceux d'une re\*'ponse \s-1HTTP\s0 (tels que de\*'fini dans les spe\*'cifications \s-1HTTP\s0, \s-1RFC2616\s0) sontest volontaire mais peut parfois amener a\*` certaines confusions. .PP Les spe\*'cifications \s-1CGI\s0 de\*'finissent deux sortes de scripts\ : les cripts \*(L"Parsed Header\*(R" (dont les en\-te\*^tes sont traite\*'s) et les scripts \&\*(L"Non Parsed Header\*(R" ou \s-1NPH\s0 (dont les en\-te\*^tes ne sont pas traite\*'s). Chercher dans la documentation de votre serveur pous savoir ce qu'il accepte. Les scripts \*(L"Parsed Header\*(R" sont plus simples pour plusieurs raisons. Les spe\*'cifications \s-1CGI\s0 autorisent n'importe quelle repre\*'sentation usuelle des fins de ligne dans la re\*'ponse \s-1CGI\s0 (c'est au serveur \s-1HTTP\s0 de produire a\*` partir de cette re\*'ponse, une re\*'ponse \s-1HTTP\s0 correcte). Donc un \*(L"\en\*(R" e\*'crit en mode texte est techniquement correct et recommande\*'. Les scripts \s-1NPH\s0 sont plus exigeants\ : ils doivent produire une re\*'ponse contenant un ensemble d'en\-te\*^tes \s-1HTTP\s0 complets et corrects. Or les spe\*'cifications \s-1HTTP\s0 exigent des lignes termine\*'es par un retour chariot (carraige\-return) puis un saut de ligne (line\-feed), c'est a\*` dire les valeurs \s-1ASCII\s0 \e015 et \e012 e\*'crites en mode binaire. .PP L'utilisation de \s-1CGI\s0.pm permet d'e\*^tre inde\*'pendant de la plateforme, me\*^me si celle-ci est un syste\*`me \s-1EBCDIC\s0. \s-1CGI\s0.pm choisit pour les fins de ligne la repre\*'sentation approprie\*'e ($CGI::CRLF) et positionne le mode binaire comme il faut. .Sh "Mon script \s-1CGI\s0 fonctionne en ligne de commandes mais pas depuis un navigateur. (500 Server Error)" .IX Subsection "Mon script CGI fonctionne en ligne de commandes mais pas depuis un navigateur. (500 Server Error)" Plusieurs proble\*`mes peuvent en e\*^tre la cause. Consultez le guide \&\*(L"Troubleshooting Perl \s-1CGI\s0 scripts\*(R" (\*(L"Proble\*`me de scripts \s-1CGI\s0 en Perl\*(R") sur\ : .PP .Vb 1 \& http://www.perl.org/troubleshooting_CGI.html .Ve .PP Ensuite, si vous pouvez montrer que vous avez lu les \s-1FAQ\s0 et que votre proble\*`me n'est pas quelque chose de simple dont on trouve facilement la re\*'ponse, vous recevrez sans doute des re\*'ponses courtoises et utiles en postant votre question sur comp.infosystems.www.authoring.cgi (si elle a un quelconque rapport avec les protocoles \s-1HTTP\s0 et \s-1CGI\s0). Les questions qui semblent porter sur Perl mais qui en fait sont lie\*'es a\*` \&\s-1CGI\s0 et qui sont poste\*'es sur comp.lang.perl.misc sont souvent mal accueillies. .PP Les \s-1FAQ\s0 utiles et les guides d'aide sont liste\*'s dans la Meta \s-1FAQ\s0 \s-1CGI\s0\ : .PP .Vb 1 \& http://www.perl.org/CGI_MetaFAQ.html .Ve .Sh "Comment faire pour obtenir de meilleurs messages d'erreur d'un programme \s-1CGI\s0\ ?" .IX Subsection "Comment faire pour obtenir de meilleurs messages d'erreur d'un programme CGI?" Utilisez le module CGI::Carp. Il remplace \f(CW\*(C`warn\*(C'\fR et \f(CW\*(C`die\*(C'\fR, plus les fonctions normales \f(CW\*(C`carp\*(C'\fR, \f(CW\*(C`croak\*(C'\fR, et \f(CW\*(C`confess\*(C'\fR du module Carp qui sont des versions plus parlantes et su\*^res. Les erreurs continuent a\*` e\*^tre envoye\*'es vers le fichier normal des erreurs du serveur. .PP .Vb 3 \& use CGI::Carp; \& warn "This is a complaint"; \& die "But this one is serious"; .Ve .PP L'utilisation suivante de CGI::Carp redirige e\*'galement les erreurs vers un fichier de votre choix, mais aussi les avertissements durant la phase de compilation en e\*'tant place dans un bloc \s-1BEGIN\s0. .PP .Vb 6 \& BEGIN { \& use CGI::Carp qw(carpout); \& open(LOG, ">>/var/local/cgi\-logs/mycgi\-log") \& or die "Unable to append to mycgi\-log: $!\en"; \& carpout(*LOG); \& } .Ve .PP Vous pouvez vous arrangez pour que les erreurs fatales soient retourne\*'es au navigateur client, ceci vous permettant d'obtenir un meilleur debogage, mais pouvant parai\*^tre confus pour l'utilisateur final. .PP .Vb 2 \& use CGI::Carp qw(fatalsToBrowser); \& die "Bad error here"; .Ve .PP Si l'erreur se produit avant me\*^me que vous ayez produit les en\-te\*^tes \s-1HTTP\s0 en sortie, le module essayera de les ge\*'ne\*'rer pour e\*'viter une erreur 500 du serveur. Les avertissements normaux continueront a\*` e\*^tre envoye\*'s vers le fichier de log des erreurs du serveur (ou la\*` ou\*` vous les avez envoye\*'es via \&\f(CW\*(C`carpout\*(C'\fR) pre\*'fixe\*'s par le nom du script et la date. .Sh "Comment enlever les balises \s-1HTML\s0 d'une chai\*^ne\ ?" .IX Subsection "Comment enlever les balises HTML d'une chai^ne?" La meilleure fac\*,on (mais pas obligatoirement la plus rapide) est d'utiliser HTML::Parser disponible sur le \s-1CPAN\s0. Un autre moyen ge\*'ne\*'ralement correct est l'utilisation de HTML::FormatText qui non seulement retire le \s-1HTML\s0 mais aussi essaye de re\*'aliser un petit formatage simple du texte brut re\*'sultant. .PP Plusieurs personnes essayent une approche simpliste utilisant des expressions rationnelles, comme \f(CW\*(C`s/<.*?>//g\*(C'\fR, mais ceci ne fonctionne pas correctement dans de nombreux cas car les marqueurs \&\s-1HTML\s0 peuvent continuer apre\*`s des sauts de lignes, ils peuvent contenir des < ou des > entre guillemets, ou des commentaires \s-1HTML\s0 peuvent e\*^tre pre\*'sents. De plus, ces personnes oublient de convertir les entite\*'s comme \f(CW\*(C`<\*(C'\fR par exemple. .PP Voici une \*(L"solution\-basique\*(R", qui fonctionne avec la plupart des fichiers\ : .PP .Vb 2 \& #!/usr/bin/perl \-p0777 \& s/<(?:[^>'"]*|(['"]).*?\e1)*>//gs .Ve .PP Si vous souhaitez une solution plus comple\*`te, regardez le programme striphtml se de\*'composant en 3 e\*'tapes sur . .PP Voici quelques pie\*`ges auxquels vous devriez penser avant de choisir une solution\ : .PP .Vb 1 \& A > B \& \& A > B \& \& \-\-> \& \& \& \& <# Just data #> \& \& >>>>>>>>>>> ]]> .Ve .PP Si les commentaires \s-1HTML\s0 incluent d'autres balises, ces solutions e\*'choueraient aussi sur un texte tel que celui-ci\ : .PP .Vb 3 \& You can't see me! \& \-\-> .Ve .Sh "Comment extraire des \s-1URL\s0\ ?" .IX Subsection "Comment extraire des URL?" Vous pouvez facilement extraire toutes sortes d'\s-1URL\s0 d'un document \s-1HTML\s0 en utililisant \f(CW\*(C`HTML::SimpleLinkExtor\*(C'\fR qui ge\*`rent les ancres, les images, les objets, les cadres et plein d'autres balises qui peuvent contenir des \s-1URL\s0. Si vous avez besoin de quelque chose de plus complexe, vous pouvez cre\*'er votre propre sous-classe en he\*'ritant de \&\f(CW\*(C`HTML::LinkExtor\*(C'\fR ou de \f(CW\*(C`HTML::Parser\*(C'\fR. Vous pouvez me\*^me utilisez \&\f(CW\*(C`HTML::SimpleLinkExtor\*(C'\fR comme base de travail pour re\*'pondre a\*` vos besoins spe\*'cifiques. .PP Vous pouvez utiliser \f(CW\*(C`URI::Find\*(C'\fR pour extraire des \s-1URL\s0 d'un document texte quelconque. .PP Des solutions moins comple\*`tes base\*'es sur des expressions rationnelles peuvent e\*'conomiser du temps de calcul si vous e\*^tes su\*^r que l'entre\*'e est simple. Voici une solution, propose\*'e par Tom Christiansen, qui va 100 fois plus vite que la plupart des solutions fournies par les modules mais qui n'extraient des \s-1URL\s0 que des ancres (les balises A) dont le seul attribut est un \s-1HREF\s0\ : .PP .Vb 7 \& #!/usr/bin/perl \-n00 \& # qxurl \- tchrist@perl.com \& print "$2\en" while m{ \& < \es* \& A \es+ HREF \es* = \es* (["']) (.*?) \e1 \& \es* > \& }gsix; .Ve .Sh "Comment te\*'le\*'charger un fichier depuis la machine d'un utilisateur\ ? Comment ouvrir un fichier d'une autre machine\ ?" .IX Subsection "Comment te'le'charger un fichier depuis la machine d'un utilisateur? Comment ouvrir un fichier d'une autre machine?" Dans ce cas, te\*'le\*'charger signifie utiliser la fonctionalite\*' d'envoi de fichier via un formulaire \s-1HTML\s0. Vous autorisez ainsi l'utilisateur a\*` choisir un fichier qui sera envoye\*' a\*` votre serveur web. Pour vous, c'est un te\*'le\*'chargement alors que, pour l'utilisateur, c'est un envoi. Peu importe son nom, vous pourrez le faire en utilisant ce qu'on appele l'encodage \fBmultipart/form\-data\fR. Le module \s-1CGI\s0.pm (qui est un module standard de la distribution Perl) propose cette fonctionalite\*' dans via la me\*'thode \fIstart_multipart_form()\fR qui n'est pas la me\*^me que la me\*'thode \fIstartform()\fR. .PP Pour des exemples de codes et des informations supple\*'mentaires, voir la section parlant du te\*'le\*'chargement de fichiers dans la documentation du module \s-1CGI\s0.pm. .Sh "Comment faire un menu pop-up en \s-1HTML\s0\ ?" .IX Subsection "Comment faire un menu pop-up en HTML?" Utiliser les tags \fB\s-1SELECT\s0\fR et \fB\s-1OPTION\s0\fR. Le module \s-1CGI\s0.pm (disponible au \s-1CPAN\s0) support cette fonctionnalite\*', ainsi que de nombreuses autres, incluant quelques-unes qui se synthe\*'tisent intelligemment d'elles\-me\*^mes. .Sh "Comment re\*'cupe\*'rer un fichier \s-1HTML\s0\ ?" .IX Subsection "Comment re'cupe'rer un fichier HTML?" Utiliser le module LWP::Simple disponible au \s-1CPAN\s0, qui fait partie de l'excellent package libwww-perl (\s-1LWP\s0). D'un autre co\*^te\*', si vous avez le navigateur en mode texte lynx installe\*' sur votre syste\*`me, il n'est pas mauvais de faire\ : .PP .Vb 2 \& $html_code = `lynx \-source $url`; \& $text_data = `lynx \-dump $url`; .Ve .PP Les modules libwww-perl (\s-1LWP\s0) du \s-1CPAN\s0 fournissent une fac\*,on plus puissante de le faire. Ils n'ont pas besoin de lynx, mais tout comme lynx, ils peuvent fonctionner a\*` travers les serveurs mandataires (proxy, \s-1NDT\s0)\ : .PP .Vb 3 \& # version la plus simple \& use LWP::Simple; \& $content = get($URL); \& \& # ou affiche du HTML depuis un URL \& use LWP::Simple; \& getprint "http://www.linpro.no/lwp/"; \& \& # ou affiche de l'ASCII depuis le HTML d'un URL \& # ne\*'cessite aussi le paquetage HTML\-Tree du CPAN \& use LWP::Simple; \& use HTML::Parser; \& use HTML::FormatText; \& my ($html, $ascii); \& $html = get("http://www.perl.com/"); \& defined $html \& or die "Can't fetch HTML from http://www.perl.com/"; \& $ascii = HTML::FormatText\->new\->format(parse_html($html)); \& print $ascii; .Ve .Sh "Comment automatiser la soumission d'un formulaire \s-1HTML\s0\ ?" .IX Subsection "Comment automatiser la soumission d'un formulaire HTML?" Si vous souhaitez faire quelque chose complexe comme parcourir plusieurs pages et formulaires d'un site web, vous pouvez utiliser le module \f(CW\*(C`WWW::Mechanize\*(C'\fR. Voir sa documentation pour plus de de\*'tails. .PP Si vous soumettez des valeurs en utilisant la me\*'thode \s-1GET\s0, cre\*'ez un \&\s-1URL\s0 et codez le formulaire en utilisant la me\*'thode \f(CW\*(C`query_form\*(C'\fR\ : .PP .Vb 2 \& use LWP::Simple; \& use URI::URL; \& \& my $url = url('http://www.perl.com/cgi\-bin/cpan_mod'); \& $url\->query_form(module => 'DB_File', readme => 1); \& $content = get($url); .Ve .PP Si vous utilisez la me\*'thode \s-1POST\s0, cre\*'ez votre propre agent utilisateur et codez le contenu de fac\*,on approprie\*'e. .PP .Vb 2 \& use HTTP::Request::Common qw(POST); \& use LWP::UserAgent; \& \& $ua = LWP::UserAgent\->new(); \& my $req = POST 'http://www.perl.com/cgi\-bin/cpan_mod', \& [ module => 'DB_File', readme => 1 ]; \& $content = $ua\->request($req)\->as_string; .Ve .Sh "Comment de\*'coder ou cre\*'er ces %\-encodings sur le web\ ?" .IX Subsection "Comment de'coder ou cre'er ces %-encodings sur le web?" Si vous e\*'crivez un script \s-1CGI\s0, vous devriez utiliser le module \s-1CGI\s0,pm qui vient avec perl ou un autre module e\*'quivalent. Le module \s-1CGI\s0 de\*'code automatiquement les reque\*^tes et propose la fonction \fIencode()\fR pour ge\*'rer l'encodage. .PP La meilleure source d'informations au sujet de l'encodage des \s-1URI\s0 est la \s-1RFC\s0 2396. En principe, les substitutions suivantes le font bien\ : .PP .Vb 1 \& s/([^\ew()'*~!.\-])/sprintf '%%%02x', ord $1/eg; # encodage \& \& s/%([A\-Fa\-f\ed]{2})/chr hex $1/eg; # de\*'codage \& s/%([[:xdigit:]]{2})/chr hex $1/eg; # idem .Ve .PP En revanche, vous ne devriez les appliquer qu'a\*` des composants individuels d'un \s-1URI\s0 et non a\*` l'\s-1URI\s0 en entier. Sinon vous risquez de perdre de l'information et donc de rater quelque chose. Si vous ne comprenez pas pourquoi, pas de panique. Consultez la section 2 de la \&\s-1RFC\s0 qui donne probablement les meilleurs explications a\*` ce sujet. .PP La \s-1RFC\s0 2396 contient aussi plein d'autres informations inte\*'ressantes et en particulier des expressions rationnelles permettant de de\*'couper en composant un \s-1URI\s0 quelconque (annexe B). .Sh "Comment rediriger le navigateur vers une autre page\ ?" .IX Subsection "Comment rediriger le navigateur vers une autre page?" Spe\*'cifiez l'\s-1URL\s0 complet de la page de destination (me\*^me si elle est sur le me\*^me serveur). C'est l'une des deux sortes de re\*'ponses \&\*(L"Location:\*(R" pre\*'vues par les spe\*'cifications \s-1CGI\s0 pour un script \*(L"Parser Header\*(R". L'autre sorte qui retourne \*(L"Location:\*(R" avec un \s-1URL\s0 sous la forme d'un chemin absolu (sans le sche\*'ma ni le nom du serveur) est re\*'solu en interne par le serveur sans utiliser la redirection \s-1HTTP\s0. En tous cas, les spe\*'cifications \s-1CGI\s0 n'autorisent pas les \s-1URL\s0 relatifs. .PP L'utilisation de \s-1CGI\s0.pm est fortement recommande\*'e. L'exemple ci-dessous montre une redirection avec un \s-1URL\s0 complet. Cette redirection est ge\*'re\*'e par le navigateur web. .PP .Vb 1 \& use CGI qw/:standard/; \& \& my $url = 'http://www.cpan.org/'; \& print redirect($url); .Ve .PP Ce deuxie\*`me exemple montre une redirect avec un \s-1URL\s0 sous la forme d'un chemin absolu. Cette redirect est ge\*'re\*'e par le serveur web local. .PP .Vb 2 \& my $url = '/CPAN/index.html'; \& print redirect($url); .Ve .PP Si vous souhaitez le coder vous\-me\*^me directement, c'est faisable comme suit (le \*(L"\en\*(R" final est montre\*' se\*'pare\*'ment pour e\*^tre plus clair). que l'\s-1URL\s0 soit complet ou sous la forme d'un simple chemin absolu. .PP .Vb 2 \& print "Location: $url\en"; # en\-te\*^te de la re\*'ponse CGI \& print "\en"; # fin de l'en\-te\*^te .Ve .Sh "Comment mettre un mot de passe sur mes pages Web\ ?" .IX Subsection "Comment mettre un mot de passe sur mes pages Web?" Pour que l'authentification soit active sur votre serveur web, il faut le configurer pour cela. Cette configuration diffe\*`rent selon le serveur web \*(-- apache ne fait pas comme iPlanet qui ne fait pas comme \&\s-1IIS\s0. Consultez la documentation de votre serveur web pour connai\*^tre les de\*'tails de configuration de ce serveur. .Sh "Comment e\*'diter mes fichiers .htpasswd et .htgroup en Perl\ ?" .IX Subsection "Comment e'diter mes fichiers .htpasswd et .htgroup en Perl?" Les modules HTTPD::UserAdmin et HTTPD::GroupAdmin proposent une interface oriente\*'e objet cohe\*'rente pour ces fichiers, quelle que soit la fac\*,on dont ils sont stocke\*'s. Les bases de donne\*'es peuvent e\*^tre du texte, une dbm, une Berkley \s-1DB\s0 ou n'importe quelle autre base de donne\*'es avec un pilote compatible \s-1DBI\s0. HTTPD::UserAdmin accepte les fichiers utilise\*'s par les me\*'canismes d'authentification 'Basic' et \&'Digest'. Voici un exemple\ : .PP .Vb 4 \& use HTTPD::UserAdmin (); \& HTTPD::UserAdmin \& \->new(DB => "/foo/.htpasswd") \& \->add($username => $password); .Ve .Sh "Comment e\*^tre su\*^r que les utilisateurs ne peuvent pas entrer de valeurs dans un formulaire qui font faire de vilaines choses a\*` mon script \s-1CGI\s0\ ?" .IX Subsection "Comment e^tre su^r que les utilisateurs ne peuvent pas entrer de valeurs dans un formulaire qui font faire de vilaines choses a` mon script CGI?" Voyez les re\*'fe\*'rences a\*` la se\*'curite\*' dans la Meta \s-1FAQ\s0 \s-1CGI\s0\ : .PP .Vb 1 \& http://www.perl.org/CGI_MetaFAQ.html .Ve .Sh "Comment analyser un en\-te\*^te de mail\ ?" .IX Subsection "Comment analyser un en-te^te de mail?" Pour une solution rapide et peu propre, essayez cette solution de\*'rive\*'e de \*(L"split\*(R" in perlfunc\ : .PP .Vb 4 \& $/ = ''; \& $header = ; \& $header =~ s/\en\es+/ /g; # fusionne les lignes fractionne\*'es \& %head = ( UNIX_FROM_LINE, split /^([\-\ew]+):\es*/m, $header ); .Ve .PP Cette solution ne fonctionne pas correctement si, par exemple, vous essayez de mettre a\*` jour toutes les lignes rec\*,ues. Une approche plus comple\*`te consiste a\*` utiliser le module Mail::Header du \s-1CPAN\s0 (faisant parti du paquetage MailTools). .Sh "Comment de\*'coder un formulaire \s-1CGI\s0\ ?" .IX Subsection "Comment de'coder un formulaire CGI?" (contribution de brian d foy) .PP Utilisez la module \s-1CGI\s0.pm qui vient avec Perl. Il est rapide, simple et effectue le travail ne\*'cessaire pour s'assurer que tout se passe correctement. Il ge\*`re les reque\*^tes \s-1GET\s0, \s-1POST\s0 et \s-1HEAD\s0, les formulaires multipart, les champs multi\-value\*'s, les combinaisons chai\*^ne de reque\*^te et donne\*'es de flux, et plein d'autres choses dont vous ne voulez probablement pas vous pre\*'occuper. .PP Et tout cela d'une manie\*`re on ne peut plus \f(CW\*(C`simple :\*(C'\fR le module \s-1CGI\s0 analyse automatiquement les entre\*'es et rend accessible chacune des valeurs via la fonction \f(CW\*(C`param()\*(C'\fR. .PP .Vb 1 \& use CGI qw(:standard); \& \& my $total = param( 'prix' ) + param( 'transport' ); \& my @items = param( 'item' ); # valeurs multiples, pour un me\*^me champ .Ve .PP Si vous pre\*'fe\*'rez une interface oriente\*'e objet, \s-1CGI\s0.pm sait aussi le faire. .PP .Vb 1 \& use CGI; \& \& my $cgi = CGI\->new(); \& \& my $total = $cgi\->param( 'prix' ) + $cgi\->param( 'transport' ); \& \& my @items = $cgi\->param( 'item' ); .Ve .PP Vous pouvez aussi essayer le module CGI::Minimal qui est version alle\*'ge\*'e pour faire la me\*^me chose. D'autres modules CGI::* de \s-1CPAN\s0 peuvent aussi mieux vous convenir. .PP Beaucoup de gens essaye d'e\*'crire leur propre de\*'codeur (ou recopie celui d'un autre programme) et tombe ensuite dans l'un des nombreux pie\*`ges de cette ta\*^che. Il est plus simple et moins embe\*^tant d'utiliser \&\s-1CGI\s0.pm. .Sh "Comment ve\*'rifier la validite\*' d'une adresse e\*'lectronique\ ?" .IX Subsection "Comment ve'rifier la validite' d'une adresse e'lectronique?" Vous ne pouvez pas, du moins pas en temps re\*'el. Dommage, hein\ ? .PP Sans envoyer un mail a\*` cette adresse pour constater qu'il y a un e\*^tre humain a\*` l'autre bout pour vous re\*'pondre, vous ne pouvez pas de\*'terminer si une adresse est valide. Me\*^me si vous appliquez l'en\-te\*^te standard d'email, vous pouvez rencontrer des proble\*`mes, car il existe des adresses valides qui ne sont pas compatibles avec la \s-1RFC\-822\s0 (le standard des en\-te\*^tes des mails), et inversement il existe des adresses qui ne sont pas de\*'livrables et qui sont compatibles. .PP Vous pouvez utiliser les modules Email::Valid ou RFC::RFC822::Address qui ve\*'rifient le format de l'adresse bien que cela ne garantit en rien que l'adresse est valide (c'est a\*` dire qu'un message envoye\*' ne sera pas refuse\*'). Les modules comme Mail::CheckUser et Mail::EXPN interogent le syste\*`me de noms de domaines et les serveurs de messagerie pour tenter d'en apprendre plus mais cela ne marche pas partout \*(-- surtout si l'administrateur du domaine ge\*`re consciencieusement la se\*'curite\*' de son site. .PP Beaucoup sont tente\*'s d'e\*'liminer les adresses email invalides en se basant sur une expression re\*'gulie\*`re simple, comme \&\f(CW\*(C`/^[\ew.\-]+\e@(?:[\ew\-]+\e.)+\ew+$/\*(C'\fR. C'est une tre\*`s mauvaise ide\*'e. Car on rejette ainsi beaucoup d'adresses valides et que cela ne garantit en rien que les adresses accepte\*'es sont effectivement de\*'livrables, ce n'est donc pas conseille\*'. A\*` la place, regardez pluto\*^t qui effectivement ve\*'rifie une compatibilite\*' comple\*`te avec les spe\*'cifications \s-1RFC\s0 (excepte\*' les commentaires imbrique\*'s), ve\*'rifie qu'il ne s'agit pas d'une adresse que vous ne de\*'sirez pas (cad, Bill Clinton ou votre responsable de compte mail), puis s'assure que le nom d'ho\*^te donne\*' peut e\*^tre trouve\*' dans les enregistrements \s-1MX\s0 du \s-1DNS\s0. Ce n'est pas tre\*`s rapide, mais c\*,a marche pour ce que c\*,a essaye de faire. .PP Notre meilleur conseil pour ve\*'rifier l'adresse de quelqu'un est de lui faire entrer deux fois son adresse, tout comme vous le faites pour changer un mot de passe. Ceci e\*'limine habituellement les fautes de frappe. Si les deux versions sont e\*'gales, envoyez un courrier a\*` cette adresse avec un message personnel ayant cette allure\ : .PP .Vb 1 \& Dear someuser@host.com, \& \& Please confirm the mail address you gave us Wed May 6 09:38:41 \& MDT 1998 by replying to this message. Include the string \& "Rumpelstiltskin" in that reply, but spelled in reverse; that is, \& start with "Nik...". Once this is done, your confirmed address will \& be entered into our records. .Ve .PP Si vous recevez le message et s'ils ont suivi vos indications, vous pouvez e\*^tre raisonnablement assure\*' que l'adresse est re\*'elle. .PP Une strate\*'gie proche moins ouverte a\*` la tromperie est de leur donner un \s-1PIN\s0 (nume\*'ro d'identification personnel). Enregistrez l'adresse et le \s-1PIN\s0 (le mieux est qu'il soit ale\*'atoire) pour un traitement ulte\*'rieur. Dans le message que vous envoyez, demandez-leur d'inclure le \s-1PIN\s0 dans leur re\*'ponse. Mais si le message rebondit, ou est inclus automatiquement par un script \*(L"vacation\*(R" (en vacances), il sera la\*` de toute fac\*,on. Il est donc plus efficace de leur demander de renvoyer un \&\s-1PIN\s0 le\*'ge\*`rement modifie\*', par exemple inverse\*', ou une unite\*' ajoute\*'e a\*` chaque chiffre, etc. .Sh "Comment de\*'coder une chai\*^ne \s-1MIME/BASE64\s0\ ?" .IX Subsection "Comment de'coder une chai^ne MIME/BASE64?" Le module MIME::Base64 (disponible sur \s-1CPAN\s0) ge\*`re cela ainsi que l'encodage \s-1MIME/QP\s0. De\*'coder du \s-1BASE64\s0 devient alors aussi simple que\ : .PP .Vb 2 \& use MIME::Base64; \& $decoded = decode_base64($encoded); .Ve .PP Le paquetage MIME-tools (disponible sur \s-1CPAN\s0) propose ces extractions avec en sus le de\*'codage des documents attache\*'s encode\*'s en \s-1BASE64\s0, tout cela directement depuis un message e\-mail. .PP Si la chai\*^ne a\*` de\*'coder est courte (moins de 84 caracte\*`res), une approche plus directe consiste a\*` utiliser la fonction \fIunpack()\fR avec le formatage \*(L"u\*(R" apre\*`s quelques translations mineures\ : .PP .Vb 4 \& tr#A\-Za\-z0\-9+/##cd; # supprime les caracte\*`res non base\-64 \& tr#A\-Za\-z0\-9+/# \-_#; # convertit dans le format uuencode \& $len = pack("c", 32 + 0.75*length); # calcule la longueur en octets \& print unpack("u", $len . $_); # uude\*'code et affiche .Ve .Sh "Comment renvoyer l'adresse e\*'lectronique de l'utilisateur\ ?" .IX Subsection "Comment renvoyer l'adresse e'lectronique de l'utilisateur?" Sur les syste\*`mes supportant getpwuid, et donc la variable $<, ainsi que le module Sys::Hostname (qui fait partie de la distribution standard de Perl), vous pouvez probablement essayer d'utiliser quelque chose comme ceci\ : .PP .Vb 2 \& use Sys::Hostname; \& $address = sprintf('%s@%s', getpwuid($<), hostname); .Ve .PP La politique de la compagnie sur les adresses email peut signifier que ceci ge\*'ne\*`re des adresses que le syste\*`me de mail de la compagnie n'acceptera pas, ainsi vous devriez demander les adresses email des utilisateurs quand ceci compte. Qui plus est, tous les syste\*`mes sur lesquels fonctionne Perl n'acceptent pas ces informations comme sur Unix. .PP Le module Mail::Util du \s-1CPAN\s0 (faisant partie du package MailTools) procure une fonction \fImailaddress()\fR qui essaye de cre\*'er l'adresse email d'un utilisateur. Il effectue une de\*'marche plus intelligente que le code pre\*'ce\*'dent, utilisant des informations fournies quand le module a e\*'te\*' installe\*', mais cela peut rester incorrect. Encore une fois, la meilleure manie\*`re est souvent de simplement poser la question a\*` l'utilisateur. .Sh "Comment envoyer un mail\ ?" .IX Subsection "Comment envoyer un mail?" Utilisez directement le programme \f(CW\*(C`sendmail\*(C'\fR\ : .PP .Vb 6 \& open(SENDMAIL, "|/usr/lib/sendmail \-oi \-t \-odq") \& or die "Can't fork for sendmail: $!\en"; \& print SENDMAIL <<"EOF"; \& From: User Originating Mail \& To: Final Destination \& Subject: A relevant subject line \& \& Body of the message goes here after the blank line \& in as many lines as you like. \& EOF \& close(SENDMAIL) or warn "sendmail didn't close nicely"; .Ve .PP L'option \fB\-oi\fR empe\*^che sendmail d'interpre\*'ter une ligne constitue\*'e d'un seul point comme une \*(L"fin de message\*(R". L'option \fB\-t\fR lui dit d'utiliser les en\-te\*^tes pour de\*'cider a\*` qui envoyer le message, et \&\fB\-odq\fR lui dit de placer le message dans la file d'attente. Cette dernie\*`re option signifie que votre message ne sera pas imme\*'diatement envoye\*', donc ne la mettez pas si vous voulez un envoi imme\*'diat. .PP Alternativement, des approches moins pratiques comprennent l'appel direct a\*` mail (parfois appele\*' mailx) ou la simple ouverture du port 25 pour avoir une conversation intime rien qu'entre vous et le de\*'mon \s-1SMTP\s0 distant, probablement sendmail. .PP Ou vous pourriez utiliser le module Mail::Mailer du \s-1CPAN\s0\ : .PP .Vb 1 \& use Mail::Mailer; \& \& $mailer = Mail::Mailer\->new(); \& $mailer\->open({ From => $from_address, \& To => $to_address, \& Subject => $subject, \& }) \& or die "Can't open: $!\en"; \& print $mailer $body; \& $mailer\->close(); .Ve .PP Le module Mail::Internet utilise Net::SMTP qui est moins Unix-centrique que Mail::Mailer, mais moins fiable. E\*'vitez les commandes \s-1SMTP\s0 crues. Il y a de nombreuses raisons pour utiliser un agent de transport de mail comme sendmail. Celles-ci comprennent la mise en file d'attente, les enregistrement \s-1MX\s0 et la se\*'curite\*'. .Sh "Comment utiliser \s-1MIME\s0 pour attacher des documents a\*` un mail\ ?" .IX Subsection "Comment utiliser MIME pour attacher des documents a` un mail?" Cette re\*'ponse est directement extraite de la documentation du module MIME::Lite. Cre\*'ez un message multipart (c'est a\*` dire avec des documents attache\*'es). .PP .Vb 1 \& use MIME::Lite; \& \& ### Cre\*'ation d'un nouveau message multipart \& $msg = MIME::Lite\->new( \& From =>'me@myhost.com', \& To =>'you@yourhost.com', \& Cc =>'some@other.com, some@more.com', \& Subject =>'A message with 2 parts...', \& Type =>'multipart/mixed' \& ); \& \& ### Ajout de parties (chaque "attach" a les me\*^mes arguments que "new"): \& $msg\->attach(Type =>'TEXT', \& Data =>"Here's the GIF file you wanted" \& ); \& $msg\->attach(Type =>'image/gif', \& Path =>'aaa000123.gif', \& Filename =>'logo.gif' \& ); \& \& $text = $msg\->as_string; .Ve .PP MIME::Lite propose aussi une me\*'thode pour envoyer le messages. .PP .Vb 1 \& $msg\->send; .Ve .PP Par de\*'faut, il utilise \f(CW\*(C`sendmail\*(C'\fR mais on peut le parame\*`trer pour qu'il utilise \s-1SMTP\s0 via Net::SMTP. .Sh "Comment lire du courrier\ ?" .IX Subsection "Comment lire du courrier?" Vous pourriez utiliser le module Mail::Folder de \s-1CPAN\s0 (faisant partie du paquetage MailFolder) ou le module Mail::Internet de \s-1CPAN\s0 (faisant partie du paquetage MailTools), toutefois, un module est souvent un marteau pour e\*'craser une mouche. Voici un trieur de mail. .PP .Vb 1 \& #!/usr/bin/perl \& \& my(@msgs, @sub); \& my $msgno = \-1; \& $/ = ''; # lit un paragraphe \& while (<>) { \& if (/^From/m) { \& /^Subject:\es*(?:Re:\es*)*(.*)/mi; \& $sub[++$msgno] = lc($1) || ''; \& } \& $msgs[$msgno] .= $_; \& } \& for my $i (sort { $sub[$a] cmp $sub[$b] || $a <=> $b } (0 .. $#msgs)) { \& print $msgs[$i]; \& } .Ve .PP Ou de fac\*,on plus succincte, .PP .Vb 6 \& #!/usr/bin/perl \-n00 \& # bysub2 \- awkish sort\-by\-subject \& BEGIN { $msgno = \-1 } \& $sub[++$msgno] = (/^Subject:\es*(?:Re:\es*)*(.*)/mi)[0] if /^From/m; \& $msg[$msgno] .= $_; \& END { print @msg[ sort { $sub[$a] cmp $sub[$b] || $a <=> $b } (0 .. $#msg) ] } .Ve .Sh "Comment trouver mon nom de machine\ / nom de domaine\ / mon adresse \s-1IP\s0\ ?" .IX Subsection "Comment trouver mon nom de machine/ nom de domaine/ mon adresse IP?" (contribution de brian d foy) .PP Le module Net::Domain, qui fait partie de la distribution standard depuis Perl 5.7.3, peut vous fournir le nom d'ho\*^te complet (fully qualified domain name ou \s-1FQDN\s0), le nom d'ho\*^te (ou de machine) ou le nom de domaine. .PP .Vb 1 \& use Net::Domain qw(hostname hostfqdn hostdomain); \& \& my $host = hostfqdn(); .Ve .PP Le module \f(CW\*(C`Sys::Hostname\*(C'\fR, inclus dans la distribution standard depuis Perl 5.6, peut aussi vous donner le nom d'ho\*^te. .PP .Vb 1 \& use Sys::Hostname; \& \& $host = hostname(); .Ve .PP Pour obtenir l'adresse \s-1IP\s0, vous pouvez faire appel a\*` la fonction pre\*'de\*'finie pour transformer le nom d'ho\*^te en un nombre. Pour convertir ce nombre en une adresse classique (a.b.c.d) que la plupart des gens attendent, utilisez la fonction \f(CW\*(C`inet_ntoa\*(C'\fR du module \f(CW\*(C`Socket\*(C'\fR qui fait partie de perl. .PP .Vb 1 \& use Socket; \& \& my $address = inet_ntoa( \& scalar gethostbyname( $host || 'localhost' ) \& ); .Ve .Sh "Comment re\*'cupe\*'rer un article de news ou les groupes actifs\ ?" .IX Subsection "Comment re'cupe'rer un article de news ou les groupes actifs?" Utilisez les modules Net::NNTP ou News::NNTPClient, tous les deux disponibles sur le \s-1CPAN\s0. Ceux-ci peuvent rendre des ta\*^ches comme la re\*'cupe\*'ration de la liste des groupes de news aussi simple que\ : .PP .Vb 2 \& perl \-MNews::NNTPClient \& \-e 'print News::NNTPClient\->new\->list("newsgroups")' .Ve .Sh "Comment re\*'cupe\*'rer/envoyer un fichier par \s-1FTP\s0\ ?" .IX Subsection "Comment re'cupe'rer/envoyer un fichier par FTP?" LWP::Simple (disponible sur le \s-1CPAN\s0) peut re\*'cupe\*'rer mais pas envoyer. Net::FTP (aussi disponible sur le \s-1CPAN\s0) est plus complexe, mais peut envoyer aussi bien que re\*'cupe\*'rer. .Sh "Comment faire du \s-1RPC\s0 en Perl\ ?" .IX Subsection "Comment faire du RPC en Perl?" (contribution de brian d foy) .PP Utilisez l'un des modules \s-1RPC\s0 disponibles sur \s-1CPAN\s0 (). .SH "AUTEUR ET COPYRIGHT" .IX Header "AUTEUR ET COPYRIGHT" Copyright (c) 1997\-2006 Tom Christiansen, Nathan Torkington et autres auteurs cite\*'s. Tous droits re\*'serve\*'s. .PP Cette documentation est libre. Vous pouvez la redistribuer et/ou la modifier sous les me\*^mes conditions que Perl lui\-me\*^me. .PP Inde\*'pendemment de sa distribution, tous les exemples de code de ce fichier sont ici place\*'s dans le domaine public. Vous e\*^tes autorise\*'s et encourage\*'s a\*` utiliser ce code dans vos programmes que ce soit pour votre plaisir ou pour un profit. Un simple commentaire dans le code en pre\*'cisant l'origine serait de bonne courtoisie mais n'est pas obligatoire. .SH "TRADUCTION" .IX Header "TRADUCTION" .Sh "Version" .IX Subsection "Version" Cette traduction franc\*,aise correspond a\*` la version anglaise distribue\*'e avec perl 5.8.8. Pour en savoir plus concernant ces traductions, consultez . .Sh "Traducteur" .IX Subsection "Traducteur" Traduction initiale\ : Aymeric Barantal . Mise a\*` jour\ : Paul Gaborit . .Sh "Relecture" .IX Subsection "Relecture" Re\*'gis Julie\*' , Roland Trique (mise a\*` jour), Ge\*'rard Delafond.