Table of Contents

1

Nous allons utiliser le module CPAN IO::Socket::INET qui offre une interface standard d'accès à la couche IP.

perl

 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.

2a

Nous allons utiliser ici un client HTTP simpliste, LWP::Simple.

perl

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.

2b

Nous allons utiliser ici un client un peu plus évolué : LWP::UserAgent.

perl

 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 :

perl

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()) ;

3

Nous allons utiliser en plus HTML::Form pour extraire un formulaire de la réponse réçue, le remplir, et le soumettre.

perl

 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()) ;