Bonjour,

J'ai développé deux scripts. Le Script A parcourt un dossier (passé en argument), et appel le script B pour chaque fichier qu'il trouve.

Le script B va sur un site d'analyse de données, remplie un formulaire avec le fichier, récupère les résultats renvoyés par le site et les copie dans une page html.

Les deux scripts marchent très bien. Le seul problème, c'est que parfois le serveur ferme la connexion sans envoyer de données :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
Error POSTing http://depts.washington.edu/l2l/cgi-bin/2l2l.cgi: Server closed connection without sending any data back at /Users/mathilde/Developpement/dev_SQUAT_evolution/bin/analyse_auto_L2L.pl line 39
 at /Library/Perl/5.8.8/WWW/Mechanize.pm line 2615
	WWW::Mechanize::_die('Error ', 'POST', 'ing ', 'URI::http=SCALAR(0x96ea10)', ': ', 'Server closed connection without sending any data back') called at /Library/Perl/5.8.8/WWW/Mechanize.pm line 2602
	WWW::Mechanize::die('WWW::Mechanize=HASH(0x90b9c0)', 'Error ', 'POST', 'ing ', 'URI::http=SCALAR(0x96ea10)', ': ', 'Server closed connection without sending any data back') called at /Library/Perl/5.8.8/WWW/Mechanize.pm line 2261
	WWW::Mechanize::_update_page('WWW::Mechanize=HASH(0x90b9c0)', 'HTTP::Request=HASH(0x98d308)', 'HTTP::Response=HASH(0x994804)') called at /Library/Perl/5.8.8/WWW/Mechanize.pm line 2117
	WWW::Mechanize::request('WWW::Mechanize=HASH(0x90b9c0)', 'HTTP::Request=HASH(0x98d308)') called at /Library/Perl/5.8.8/WWW/Mechanize.pm line 1742
	WWW::Mechanize::submit('WWW::Mechanize=HASH(0x90b9c0)') called at /Users/mathilde/Developpement/dev_SQUAT_evolution/bin/analyse_auto_L2L.pl line 39
Quand ça arrive, mon script B ne va pas au bout, et le script A continu en appelant le script B pour le fichier suivant. Résultat : tout les fichiers du dossier ne sont pas traité.

Donc j'aimerais modifier mon script B pour qu'il relance la requête quand il y a une perte de connexion au serveur. Je ne sais pas comment m'y prendre, donc si quelqu'un a une piste à me proposer, je serais ravie de l'explorer


voici le code du script B (celui qui interroge le site internet) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#!/usr/bin/perl -w
 
#================================================================================
# Interrogation et recuperation automatique des donnees sur le site L2L
#================================================================================
use strict;
use diagnostics;
use WWW::Mechanize;
use Data::Dumper;
use vars qw($opt_h $opt_f $opt_p $opt_c);
use Getopt::Std;
 
##recuperation des arguments - initialisation
getopts("hf:p:c:") or die("erreur(s) de saisie dans les options. Faire -h pour obtenir l'aide\n");
 
if (defined($opt_h))
{
	&help;
	exit;
}
elsif (!defined($opt_f) || !defined($opt_p) || !defined($opt_c))
{
	die("erreur : parametre manquant, -f, -p et -c doivent etre definis. Faire -h pour obtenir de l'aide\n");
}
 
my $url = 'http://depts.washington.edu/l2l/';
my $bot = WWW::Mechanize->new();
 
 
foreach my $type ('gobiol', 'gomole', 'l2lmdb')
{
	print "\nAnalyse $type\n";
 
	$bot->get($url);
	$bot->form_number(1);
 
	#remplissage du formulaire
	$bot->set_fields(dataname => $opt_f, datafile => $opt_p, libmenu => 'hugo', listmenu=> $type);
	$bot->submit();
 
	$bot->follow_link(text => 'results');
 
	open(RES, ">/Users/mathilde/Developpement/dev_SQUAT_evolution/Tmp/All_results_L2L_C$opt_c/L2L_$opt_f"."_$type.html") or die("Impossible d'ouvrir ../Tmp/All_results_L2L/L2L_$opt_f.html\n");
 
	print(RES Dumper $bot->content());
 
	close(RES);
}
 
 
sub help
{
	print qq{
analyse_auto_L2L.pl va sur le site L2L, rempli le formulaire avec les parametres passes en argument, et print les resultats
 
Parametres :
	-f : nom du fichier contenant la liste des genes product
	-p : chemin d'acces au fichier a traiter.
	-c : contrainte.
};
	print "\n";
}
Et au cas où il y en aurait besoin, voici le code du script A (qui parcourt le dossier et appelle le script B) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#!/usr/bin/perl -w
 
use strict;
use File::Find;
 
my $nb_fic = 0;
my ($t1, $t2, $t);
 
 
sub L2L
{
	#sur chaque fichier trouve
	if (-f $_ && $_ ne ".DS_Store")
	{
		$nb_fic++;
 
		$File::Find::dir =~ m/.+C(\d)_5000up/;
 
		my $c = $1;
 
		$t1 = time();
		print "Analyse L2L du fichier $_ \t";
		qx{perl /Users/mathilde/Developpement/dev_SQUAT_evolution/bin/analyse_auto_L2L.pl -f $_ -p $File::Find::dir/$_ -c $c};
		$t2 = time();
		$t = $t2 - $t1;
		print "$t sec\n";
	}
 
}
 
my ($T1, $T2, $T);
 
my $path_c1 = "/Users/mathilde/Developpement/dev_SQUAT_evolution/resultats/recherche_fct_bioq/C1_5000up";
my $path_c2 = "/Users/mathilde/Developpement/dev_SQUAT_evolution/resultats/recherche_fct_bioq/C2_5000up";
my $path_c5 = "/Users/mathilde/Developpement/dev_SQUAT_evolution/resultats/recherche_fct_bioq/C5_5000up";
 
foreach my $path ($path_c5)
{
	print "\nTraitement du dossier : $path\n";
 
	$T1 = time();
 
	find(\&L2L,"$path");
 
	$T2 = time();
	$T = ($T2 - $T1)/3600;
	printf ("Traitement du dossier $path en %.2f h\n", $T);
	print "Nombre de fichiers traites : $nb_fic\n\n";
}