IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Entrée/Sortie Java Discussion :

Probleme proxy http


Sujet :

Entrée/Sortie Java

  1. #1
    Membre averti
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    38
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 38
    Par défaut Probleme proxy http
    Bonjour,

    je dois développer un proxy http, dans le but de faire un control parental.
    Mon problème est le suivant, pour le moment je cherche simplement a envoyer une requete http depuis mon client, à la récupérer avec mon proxy et retourner le site web demandé au client avec le code suivant :

    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
     
        public void run() {
     
            String requeteClient = "";
            String serveurWeb = "";
            String urlServeurWeb = "";
            String requeteComplete = "";
            String ligne = "";
            BufferedReader recoiClient = null, recoiServeurWeb = null;
            PrintWriter envoiClient = null, envoiServeurWeb = null;
     
            System.out.println("Debut de connection");
     
    	try {
    	    recoiClient = new BufferedReader(new InputStreamReader(clientProxy.getInputStream()));
    	    envoiClient = new PrintWriter(new BufferedWriter(new OutputStreamWriter(clientProxy.getOutputStream())));
     
                //Récupération de la requête et  l'adresse de l'hôte
                do {
                    requeteClient=recoiClient.readLine();
                    if (requeteClient.length() == 0)
                        break;
                    if (requeteClient.startsWith("Host: " )) {
                        serveurWeb = "http://" + requeteClient.substring(6);
                    }
                    if (requeteClient.startsWith("GET " )) {
                        urlServeurWeb = requeteClient.substring(4).split(" ")[0];
                    }
                    requeteComplete += requeteClient;
                } while (!requeteClient.equals("\r"));
     
                //Création élément de communication avec le serveur web
                //création de la connection au serveur web
                URL url = new URL(serveurWeb);
                URLConnection proxyServeurWeb = url.openConnection();
                proxyServeurWeb.setDoOutput(true);
                envoiServeurWeb = new PrintWriter(new BufferedWriter(new OutputStreamWriter(proxyServeurWeb.getOutputStream())));
                recoiServeurWeb = new BufferedReader(new InputStreamReader(proxyServeurWeb.getInputStream()));
     
                //envoi de la requête
                envoiServeurWeb.write(requeteComplete);
                envoiServeurWeb.flush();
     
                //lecture et renvoi de la réponse
                while ((ligne = recoiServeurWeb.readLine())!=null) {
                    if (ligne != null) {
                        envoiClient.write(ligne);
                        envoiClient.flush();
                    }
                }
                recoiClient.close();
                recoiServeurWeb.close();
                envoiClient.close();
                envoiServeurWeb.close();
    	}
    	catch(Exception e) {
                System.out.print(e);
    	    e.printStackTrace();
    	}
            System.out.println("Fin de connection");	
        }
    Mon problème est que sur certain site web j'ai une exception du type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    java.io.IOException: Server returned HTTP response code: 501 for URL: http://www.google.fr
            at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1153)
    Mais certains site sont retournés correctement, à l'exception des images.

    Quelqu'un peut il m'aider????

    Fk

  2. #2
    Membre Expert
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Par défaut
    Il faut probablement renvoyer le User-Agent ; en effet des sites tels que google contrôlent ce paramètre, et refusent s'il n'est pas bon. Normalement il est positionné par le navigateur dans sa requête, peut être la paumes-tu en route ?

  3. #3
    Membre averti
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    38
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 38
    Par défaut
    Effectivement le problème pourrait venir de la car mon user-agent est le suivant :
    User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1

    ce qui n'est evidement plus le cas, vu que c'est mon application le nouvel agent!
    Par contre je n'ai aucune idée de ce par quoi je dois le remplacer.

  4. #4
    Membre Expert
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Par défaut
    Il faut simplement que le proxy renvoie le User-Agent de ton navigateur vers le serveur. Il s'agit simplement de transmettre le flot requête issu du navigateur vers le serveur, le user-agent est déjà dedans.

  5. #5
    Membre averti
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    38
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 38
    Par défaut
    C'est ce que je fais actuellement, et ca ne fonctionne pas!

  6. #6
    Membre Expert
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Par défaut
    Alors je donne ma langue au chat, désolé

  7. #7
    Membre averti
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    38
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 38
    Par défaut
    Personne d'autre a une petite idée??

  8. #8
    Membre averti
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    38
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 38
    Par défaut
    Voila un code qui fonctionne a peu pres y a des petits problemes a l'affichage des images mais on y travail. On a posté autre chose sur les images, donc une fois résolue je posterais quelque chose qui fonctionne completement.

    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
     
                        URLConnection connection = null;
                        try {
                            URL url = new URL(urlServeurWeb);
                            connection = url.openConnection();
                            BufferedReader test = null;
                        }
                        catch (IOException e) {
                            System.out.println("Problème de connexion au serveur web : " + e);
                            System.exit(-1);
                        }
                        if (connection instanceof HttpURLConnection) {
                            try {
                                proxyServeurWeb = (HttpURLConnection)connection;
                                proxyServeurWeb.setRequestMethod("GET");
                                proxyServeurWeb.setDoOutput(true);
                                proxyServeurWeb.connect();
                                if (proxyServeurWeb.getResponseCode() == 200) {
                                    recoiServeurWeb = new BufferedReader(new InputStreamReader(proxyServeurWeb.getInputStream()));
                                    while ((ligne = recoiServeurWeb.readLine()) != null) {
                                        envoiClient.write(ligne);
                                        envoiClient.flush();
                                    }
                                }
                            }
                            catch (ProtocolException e) {
                                System.out.println("Problème de connexion au site : " + e);
                            }
                            catch (IllegalStateException e) {
                                System.out.println("Problème de connexion au site : " + e);
                            }
                            catch (IOException e) {
                                System.out.println("Problème de connexion au site : " + e);
                            }
                        }
                    }

  9. #9
    Membre averti
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    38
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 38
    Par défaut
    Voila comme promis un serveur proxy qui fonctionne (ya peut etre une ou deux variables déclaré pour rien ). Les images passent sans problèmes, ce proxy permet de faire des traitement sur la page web retourné par le serveur web d'ou la LinkedList et le Byte[].

    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
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
     
            String requeteClient = "";
            String serveurWeb = "";
            String urlServeurWeb = "";
            String requeteComplete = "";
            String methode = "";
            Byte ligne = null;
            LinkedList <Byte> pageWeb = new LinkedList <Byte>();
     
            System.out.println("Debut de connection");
     
    	try {
    	    if (ouvertureCommunication(1)) {
                    //Récupération de la requête et de l'adresse de l'hôte
                    do {
                        requeteClient=recoiClient.readLine();
                        //Si il n'y a pas/plus de ligne dans la requète on arrete la boucle
                        if (requeteClient == null || requeteClient.length() == 0) {
                            break;
                        }
                        //On récupère l'url du site ainsi que la méthode utilisée
                        if (requeteClient.startsWith("GET " )) {
                            urlServeurWeb = requeteClient.substring(4).split(" ")[0];
                            methode = "GET";
                        }
                        if (requeteClient.startsWith("POST " )) {
                            urlServeurWeb = requeteClient.substring(5).split(" ")[0];
                            methode = "POST";
                        }
                    //On continu tant que l'on a pas récupérer l'intégralité du header
                    //de la requète
                    } while (!requeteClient.equals("\r"));
     
                    //Si il n'y a pas de requete ou si l'url n'est pas spéciifiée
                    //on envoi une page d'erreur
                    if (urlServeurWeb == "" || urlServeurWeb == null){
                        if (envoiClient != null) {
                            envoiClient.writeBytes("<h1>Requête invalide</h1>");
                            envoiClient.flush();
                            this.stop();
                        }
                    }
                    else {
                        //Création des éléments de communication avec le serveur web
                        //création de la connection au serveur web
                        URLConnection connection = null;
                        try {
                            URL url = new URL(urlServeurWeb);
                            connection = url.openConnection();
                            //Si l'on est derriere un autre proxy (peut servir parfois)
                            /*InetSocketAddress test2 = new InetSocketAddress("url proxy",port proxy);
                            java.net.Proxy.Type prot = java.net.Proxy.Type.HTTP;
                            connection = url.openConnection(new java.net.Proxy(prot,test2));*/
                        }
                        catch (IOException e) {
                            System.out.println("Problème de connexion au serveur web : " + e);
                            this.stop();
                        }
                        if (connection instanceof HttpURLConnection) {
                            try {
                                proxyServeurWeb = (HttpURLConnection)connection;
                                proxyServeurWeb.setRequestMethod(methode);
                                proxyServeurWeb.setDoOutput(true);
                                proxyServeurWeb.connect();
                                recoiServeurWeb = new DataInputStream(proxyServeurWeb.getInputStream());
     
                                if (proxyServeurWeb.getResponseCode() == 200) {
                                    try {
                                        do {
                                            pageWeb.add(recoiServeurWeb.readByte());
                                        } while(true);
                                    }
                                    catch (EOFException e) {}
     
                                    int nbChar = pageWeb.size();
                                    byte tabLigne[] = new byte[nbChar];
                                    byte tabLignetmp[] = new byte[nbChar];
     
                                    for (int i = 0; i < nbChar; i++) {
                                        tabLigne[i] = pageWeb.get(i);
                                    }
                                    envoiClient.write(tabLigne);
                                    envoiClient.flush();
                                }
                            }
                            catch (ProtocolException e) {
                                System.out.println("Problème protocole : " + e);
                            }
                            catch (IllegalStateException e) {
                                System.out.println("Problème d'état : " + e);
                            }
                            catch (IOException e) {
                                System.out.println("Problème de connexion au site : " + e);
                            }
                        }
                    }
                }
    	}
    	catch(Exception e) {
    	    e.printStackTrace();
    	}
            finally {
                fermetureCommunication();
                System.out.println("Fin de connection");   
            }
        }
        private boolean ouvertureCommunication(int test) {
            try {
                if (test == 1) {
                    recoiClient = new BufferedReader(new InputStreamReader(clientProxy.getInputStream()));
                    envoiClient = new DataOutputStream(clientProxy.getOutputStream());
                    return true;
                }
                else if (test == 2) {
                    envoiServeurWeb = new PrintWriter(new BufferedWriter(new OutputStreamWriter(proxyServeurWeb.getOutputStream())));
                    return true;
                }
                else {
                    return false;
                }
            }
            catch (IOException e) {
                System.out.println("Problème d'ouverture de connexion : " + e);
                return false;
            }
        }
        private void fermetureCommunication() {
            try {
                if (recoiClient != null)
                    recoiClient.close();
                if (recoiServeurWeb != null)
                    recoiServeurWeb.close();
                if (envoiClient != null)
                    envoiClient.close();
                if (envoiServeurWeb != null)
                    envoiServeurWeb.close();
            }
            catch (IOException e) {
                System.out.println("Problème de fermeture de connexion : " + e);
            }
        }
    Ca manque un peu de commentaires , mais mon projet qui englobe des traitements n'est pas encore terminé désolé.

    voila j'espere que ca pourra en aider certains, meme beaucoup j'espere .

    Fk

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Passer un proxy HTTP - Tunelling
    Par Celelibi dans le forum Réseau
    Réponses: 17
    Dernier message: 05/10/2006, 23h53
  2. Probleme connexion HTTPS
    Par fxp17 dans le forum Apache
    Réponses: 5
    Dernier message: 04/08/2006, 11h55
  3. proxy http (s?)+ ftp autorisé, comment utiliser telnet ou ssh?
    Par TabrisLeFol dans le forum Applications
    Réponses: 7
    Dernier message: 12/07/2006, 14h58
  4. probleme authentification http
    Par Langly dans le forum Apache
    Réponses: 2
    Dernier message: 23/06/2006, 14h39
  5. Réponses: 3
    Dernier message: 18/04/2006, 22h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo