Nous allons utiliser le module CPAN IO::Socket::INET qui offre une interface standard d'accès à la couche IP.
1: use IO::Socket::INET ; 2: 3: # ouvre une connexion sur le serveur 4: my $sock = new IO::Socket::INET( 5: PeerAddr => 'listes.example.com', 6: PeerPort => '80', 7: Proto => 'tcp' 8: ) or die "Impossible de se connecter"; 9: 10: # envoie la requête 11: 12: print $sock <<"EOD" ; 13: GET /anfexo/plm.html HTTP/1.1 14: Host: listes.example.com 15: 16: EOD 17: 18: # récupère la réponse 19: my @page = <$sock> ; 20: 21: # ferme la connexion 22: close $sock or die "close: $!"; 23: 24: print join("",@page) ;
@page
contient toute la réponse du serveur : la ligne de statut (200 OK
), les en-têtes et le corps du message. Aucun découpage/analyse de la réponse n'est effectuée.
Nous allons utiliser ici un client HTTP simpliste, LWP::Simple.
1: use LWP::Simple; 2: 3: # récupère le corps de la répo 4: my $content = get('http://listes.example.com/anfexo/plm.html'); 5: 6: print $content ;
Comme son nom l'indique, son utilisation est extrêmement simple. C'est aussi son défaut : impossible par exemple d'accéder à l'en-tête HTTP de la réponse, de qualifier les erreurs, etc.
Nous allons utiliser ici un client un peu plus évolué : LWP::UserAgent.
1: use LWP::UserAgent; 2: use Data::Dumper ; 3: 4: # crée un agent et une requête 5: my $ua = new LWP::UserAgent ; 6: my $req = HTTP::Request->new( GET => 'http://listes.example.com/anfexo/plm.html' ); 7: 8: # récupère la réponse 9: my $res = $ua->request($req); 10: 11: print Dumper $res ;
La requête nous renvoie un objet de type HTTP::Response, qui possède des méthodes permettant d'en extraire les informations pertinentes. Cela nous permet d'obtenir sans effort le code de retour et le status, les champs (noms et valeurs) du header, et le corps de la réponse :
1: printf("code: %d - message: %s \n\n",$res->code(),$res->message()) ; 2: printf("header: content-type: %s\n",$res->header("content-type")) ; 3: printf("header: title: %s\n",$res->header("title")) ; 4: printf("header: server: %s\n\n",$res->header("server")) ; 5: printf("content: %s\n",$res->content()) ;
Nous allons utiliser en plus HTML::Form pour extraire un formulaire de la réponse réçue, le remplir, et le soumettre.
1: use LWP::UserAgent; 2: use HTML::Form; 3: use HTTP::Response ; 4: use Data::Dumper ; 5: use strict ; 6: 7: # les paramètres personnels 8: my $base = 'http://listes.example.com'; 9: my $url = "$base/cgi-bin/form.cgi"; 10: 11: # initialisation de l'agent 12: my $ua = new LWP::UserAgent(agent => 'Mon Mozilla en Perl a moi') ; 13: 14: # création de la requête 15: my $req = HTTP::Request->new( GET => $url ) ; 16: 17: # exécute la requête et reçoit la réponse 18: my $res = $ua->request($req) ; 19: die $res->status_line if not $res->is_success() ; 20: 21: my @form = HTML::Form->parse($res, base=>$base) ; 22: 23: # il n'y a qu'un formulaire dans la page 24: my $form = $form[0] ; 25: 26: # on remplit les champs 27: $form->find_input('nom')->value("Charbonnel") ; 28: $form->find_input('prenom')->value("Jacquelin") ; 29: $form->find_input('email')->value('jacquelin.charbonnel@cnrs.math.fr') ; 30: 31: # on renvoie le formulaire 32: $res = $ua->request( $form->click ) ; 33: 34: # on regarde la réponse 35: printf("code: %d - message: %s \n\n",$res->code(),$res->message()) ; 36: printf("content: %s\n",$res->content()) ;