Hello,

J'ai créer une application en J2SE permettant de réaliser divers traitement via le WEB. Parmi ces traitements, il y en a un qui consiste à récupérer les cookies d'un site. Suite à un problème à ce niveau, j'ai réaliser un petit prototype afin de comprendre le problème qui est le suivant :

J'arrive parfaitement a récupérer des cookies après une connexion, que se soit en GET ou en POST, sur les plateforme Windows XP et sur Mac OSX (tout deux en 32bits). Cependant, impossible de récupérer des cookies sur une plateforme Linux (Ubuntu 10.10) ! Il arrive par fois d'en récupérer 1, mais jamais tous les cookies..

Voici le code de mon prototype (je n'ai laisser que la version GET):

Class principale :
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
 
import java.net.CookieManager;
import java.net.HttpCookie;
import java.net.URI;
import java.util.List;
 
public class Main {
 
    public static void main(String[] args) {
        try {
            ConnectionFactory cf = new ConnectionFactory();
            String address = "http://www.google.com";
 
            //etablissement de la connexion
            cf.connectionGet(address);
            //récupération de la réponse du serveur, avec les cookies...
            String res = cf.getResponseString();
            //récupération du gestionnaire de cookie
            CookieManager ch = (CookieManager)cf.getCookieHandler();
            List<HttpCookie> lst = ch.getCookieStore().get(new URI(address));
            //affichage des cookies récupérés
            for (int i = 0; i < lst.size(); i++){
                System.out.println(lst.get(i).toString());
            }
            cf.disconnect();
        } catch (Exception e){
            //s'il y a eu une erreur lors de la tentative de connexion...
            System.out.println("Exception");
        }
    }
 
}
Class de connexion (épurée pour ne pas vous donner trop de code inutile pour ce test) :
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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
 
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.CookieHandler;
import java.net.CookieManager;
import java.net.CookiePolicy;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.ProtocolException;
import java.net.URL;
 
public class ConnectionFactory {
 
    private URL url;
    private HttpURLConnection conn;
    private InputStream input;
    private String responseStr;
    private CookieManager cm = new CookieManager();
 
 
    public ConnectionFactory() throws MalformedURLException, IOException{
        cm.setCookiePolicy(CookiePolicy.ACCEPT_ALL);
        CookieHandler.setDefault(cm);
    }
 
    /**
     * Retourne l'URL actuellement utilisé
     * @return L'url actuellement utilisé par la connexion
     */
    public URL getUrl(){
        return this.url;
    }
 
    /**
     * Retourne la connexion courante
     * @return La connexion courante
     */
    public HttpURLConnection getConnection(){
        return conn;
    }
 
    /**
     * Retourne le flue retourné par la connexion
     * @return
     */
    public InputStream getInput (){
        return input;
    }
 
    public CookieHandler getCookieHandler(){
        return cm;
    }
 
    /**
     * Crée et lance la connexion avec la méthode GET. Garantie pour HTTP
     * @param address   Adresse internet (ex : "http://www.google.com").
     * @param lstParams La liste des paramètres du GET
     * @param lstValues Les valeurs de chaque paramètre du GET, dans le même ordre que lstParams.
     * @throws ProtocolException    Si le protocole n'est pas pris en charge (ex FTP, HTTPS,...).
     * @throws UnsupportedEncodingException Type de réponse non supportée
     * @throws IOException  Problème de connexion.
     */
    public void connectionGet(String address) throws ProtocolException, UnsupportedEncodingException, IOException{
        responseStr = null;
        //ajout des paramètres dans l'url
        url = new URL(address);
        conn = (HttpURLConnection)url.openConnection();
        conn.setRequestMethod("GET");
        conn.setDoOutput(true);
        conn.setInstanceFollowRedirects(true);
 
        //récupération de la réponse
        input = conn.getInputStream();
        //return getResponseString();
    }
 
    /**
     * Retourne la réponse de la connexion au format String.
     * @return  la réponse de la connexion (Ex. contenu html de la page web retournée).
     * @throws IOException Problème de connexion.
     */
    public String getResponseString() throws IOException{
        if (responseStr == null) {
            StringBuilder response = new StringBuilder();
            BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
                //formatage de la réponse
            String ligne;
            while ((ligne = reader.readLine()) != null) {
                ligne+="\r\n"; response.append(ligne);
            }
            responseStr = response.toString();
            reader.close();
        }
        return responseStr;
    }
 
    /**
     * Force la déconnexion courante.
     */
    public void disconnect(){
        conn.disconnect();
    }    
}
Ma question est la suivante : Pourquoi ce code fonctionne parfaitement sur Windows et Machintosh, mais pas sur Linux ? Auriez-vous une suggestion à me faire ? Est-ce un problème au niveau de la JVM Linux (et alors, où informer de ce bug pour ainsi espérer un correctif) ?

Merci beaucoup pour votre temps, j'attend vos réponses avec impatience.