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

Langage Java Discussion :

Système de cache pour serveur proxy


Sujet :

Langage Java

  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2013
    Messages
    139
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2013
    Messages : 139
    Points : 459
    Points
    459
    Par défaut Système de cache pour serveur proxy
    Bonjour à tous,

    Je dois réaliser un serveur proxy avec, entres autres, un système de mise en cache des données.

    Je rencontre un problème cependant. Quand je récupère une donnée mise en cache, il me renvoie du texte brut plutôt que du HTML. Du coup, le navigateur ne m'interprète pas le code et l'affiche de manière brute.
    Voici en exemple l'index de Google.fr après mise en cache !

    Ma classe cache :
    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
    public class Cache
    {
        private Hashtable cache;
     
        public Cache()
        {
            cache = new Hashtable();
        }
     
        public void addToCache(String address, byte[] response)
        {
            if (!cache.containsKey(address))
            {
                cache.put(address,response);
            }
        }
     
        public byte[] getFromCache(String address)
        {
            return (byte[]) cache.get(address);
        }
     
        public boolean isCached(String address)
        {
           return cache.containsKey(address);
        }
    }
    Et voici le code dans le thread d'exécution, dans le cas où la donnée a été mise en cache :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    byte by[] = cache.getFromCache(urlToCall);
    out.write(by); //out est un objet de type DataOutputStream
    out.flush();
    Je vous avoue que je sèche un peu sur le problème. Peut-être une en-tête HTTP à modifier, mais comment...

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Pourquoi out est de type DataOutputStream? Ca n'a pas de sens, tu te fiche de l'endiance.
    As-tu bien caché aussi les headers quand tu as stocké la réponse?

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2013
    Messages
    139
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2013
    Messages : 139
    Points : 459
    Points
    459
    Par défaut
    Bonjour Tchize_,

    Je ne sais pas ce qu'est l'endiance.

    Voici le code qui s'occupe du traitement de la requête et de la réponse :
    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
                        try
                        {
                            //Communication entre proxy et serveur HTTP
                            URL url = new URL(calledUrl);
                            URLConnection connection = url.openConnection();
                            connection.setDoInput(true);
                            connection.setDoOutput(false);
     
                            //Récupération de la réponse
                            InputStream is = null;
                            HttpURLConnection huc1 = (HttpURLConnection) connection;
     
                            try
                            {
                                is = connection.getInputStream();
                                rd = new BufferedReader(new InputStreamReader(is));
                            }
                            catch (IOException ioe)
                            {
                                System.out.println(ioe);
                            }
     
                            //Si tout va bien, envoi de la réponse au client
                            byte by[] = new byte[BUFFER_SIZE];
                            int index = is.read(by, 0, BUFFER_SIZE);
     
                            cache.addToCache(calledUrl,by);
     
                            while (index != -1)
                            {
                                out.write(by, 0, index);
                                index = is.read(by, 0, BUFFER_SIZE);
                            }
     
                            out.flush();
     
                        }
    Out est de type DataOutputStream car je réutilise le code d'écriture du processus principal. Je comprends bien que c'est pas forcément la meilleure chose qui soit mais je ne savais comment renvoyer le code au navigateur autrement.
    Je ne suis clairement pas à l'aise avec ce code, récupéré sur plusieurs sources différentes. Je n'ai pas l'habitude de travailler sur les sockets en JSE. Je ne peux pas te dire avec certitude si je récupère ou non les en-têtes.

  4. #4
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Ouais, ben ton proxy il est pas bon du tout là:

    Tu crée une URL Connexion java vers le serveur http: ça veux dire que tu va créer tes propres headers (liés à l'implémentation java) qui n'ont rien à voir avec les headers qu'a envoyé le client. Par exemple, tu pourais autoriser la compression alors que le client ne la supporte pas, tu ne précisera pas l'encodage de la requête correctement, etc.

    Tu dois donc décoder les header de la question du client, éventuellement modifier certains, envoyer la requete d'origine vers le serveur si pas de cache, récupérer la réponse, décoder les header de la réponse, stocker le tout et renvoyer ce tout au client dans le stream de réponse.

  5. #5
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2013
    Messages
    139
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2013
    Messages : 139
    Points : 459
    Points
    459
    Par défaut
    Merci de ton information, même si concrètement elle indique une nuit blanche en perspective.

    Du coup mon problème est "résolu".

    Edit : Bon le problème original pour le cache, c'est de l'encodage.

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 05/05/2012, 10h25
  2. système de cache pour soulager mySQL
    Par didi78 dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 20/05/2009, 11h16
  3. Réponses: 3
    Dernier message: 19/05/2009, 16h38
  4. [Système] Système de Cache pour PHP4
    Par wikipierre dans le forum Langage
    Réponses: 9
    Dernier message: 14/09/2007, 10h07
  5. [COMPOSANT] Système de cache pour asp ?
    Par tom_92 dans le forum ASP
    Réponses: 1
    Dernier message: 12/04/2006, 11h05

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