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

avec Java Discussion :

HttpClient (4.3.1) problème retour flux compressé


Sujet :

avec Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2012
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 265
    Par défaut HttpClient (4.3.1) problème retour flux compressé
    Bonjour,

    Je rencontre un petit souci concernant un retour de flux qui devrait être compressé mais qui apparemment ne l’est pas.

    J’ai bien renseigné le header "Accept-Encoding:"gzip", mais il n’a pas grand efficacité dans la mesure où une exception est levée : "java.util.zip.ZipException: Not in GZIP format "

    Et cela fonctionne normalement si je retire :"new GzipDecompressingEntity(...)

    Je n’arrive pas à voir ou cela peut bloquer ou si l‘approche n‘est pas correcte.


    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
    public class showResponseHeader {
     
    	public void connect() throws ClientProtocolException, IOException {
    		BasicCookieStore cookieStore = new BasicCookieStore();		
    		CloseableHttpClient httpclient = HttpClients.createDefault();
    		HttpGet httpGet = new HttpGet("http://www.site.fr");
    		httpGet.addHeader("Accept-Encoding", "gzip");
    		httpGet.addHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8");
    		httpGet.addHeader("Accept-Language", "fr-FR,fr;q=0.8,en-US;q=0.6,en;q=0.4");
    		httpGet.addHeader("Host", "www.site.fr");
    		httpGet.addHeader("Connection", "keep-alive");
    		httpGet.addHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.57 Safari/537.36");		
    		CloseableHttpResponse response = httpclient.execute(httpGet);
    		HttpEntity entity = new GzipDecompressingEntity(response.getEntity());
    		InputStream instream = entity.getContent();
    		BufferedReader reader = new BufferedReader(new InputStreamReader(instream));
    		String inputLine;
    		while ((inputLine = reader.readLine()) != null) {
    			System.out.println(inputLine);
    		}
    		reader.close();
    		instream.close();
    		response.close();
    	}
    }

  2. #2
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,


    Essayes déjà d'afficher les headers reçu du serveur, pour voir si ce dernier a bien encodé la réponse en GZIP (header "Content-Encoding: gzip").
    D'ailleurs tu es obligé de faire cela dans tous les cas, car le header "Accept-Encoding:"gzip" indique simplement au serveur que tu sais gérer le gzip... mais rien ne garantie que la réponse sera forcément encodé en gzip.




    Si le serveur répond bien en gzip, alors il est fortement possible que ce soit HttpClient qui le gère et le décode à la volé (par exemple avec response.getEntity() qui retournerait directement un GzipDecompressingEntity).



    a++

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2012
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 265
    Par défaut
    Il y a quelques chose que je ne saisis pas bien dans cette "affaire", c'est pour cela que je me demande s'il n'y a pas un élément qui est mal codé coté script Java.

    Si je regarde coté headers envoyés par le module Java j'ai ceci :

    Code Java Header request : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Accept-Encoding: gzip, deflate
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
    Accept-Language: fr-FR,fr;q=0.8,en-US;q=0.6,en;q=0.4
    Host: www.site.fr
    Connection: keep-alive
    User-Agent: Mozilla/5.0 (Windows NT 6.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.57 Safari/537.36
    Code Java header response : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    HTTP/1.1 200 OK
    Date: Sun, 17 Nov 2013 17:46:26 GMT
    Server: Apache
    X-Powered-By: PHP/5.3.3-7+squeeze17
    Vary: Accept-Encoding
    Keep-Alive: timeout=15, max=100
    Connection: Keep-Alive
    Content-Type: text/html
    X-Pad: avoid browser bug

    et dans la variable $_SERVER coté hébergement je reçois, entre autres cela :
    Code $_SERVER/hébergement : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    ...
    ["HTTP_ACCEPT_ENCODING"]=>
      string(13) "gzip, deflate"
      ["HTTP_ACCEPT"]=>
      string(74) "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"
      ["HTTP_ACCEPT_LANGUAGE"]=>
      string(35) "fr-FR,fr;q=0.8,en-US;q=0.6,en;q=0.4"
    ...

    Je suis d’accord sur le fait que le retour de flux n'est pas garanti en compressé, mais si je lance 10 fois le script java, j'ai un systématiquement un retour non compressé, mais par contre au travers d'un navigateur, j'ai un retour flux en compressé, lors de l'appel de la même url.
    Code response header navigateur Chrome : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Connection:Keep-Alive
    Content-Encoding:gzip
    Content-Length:1222
    Content-Type:text/html
    Date:Sun, 17 Nov 2013 17:44:11 GMT
    Keep-Alive:timeout=15, max=100
    Server:Apache
    Vary:Accept-Encoding
    X-Powered-By:PHP/5.3.3-7+squeeze17

    D'où le fait que je reste assez interrogatif quant aux paramètres/headers que mon script java envoie, bien qu’apparemment bien reçus, le serveur Apache réagit différemment si l'url est envoyé depuis le script Java ou le navigateur.

  4. #4
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Citation Envoyé par tarzip Voir le message
    D'où le fait que je reste assez interrogatif quant aux paramètres/headers que mon script java envoie, bien qu’apparemment bien reçus, le serveur Apache réagit différemment si l'url est envoyé depuis le script Java ou le navigateur.
    C'est vrai que c'est surprenant, mais ce n'est pas la seule différence.
    HttpClient envoie "gzip, deflate" alors que Chrome envoie juste "gzip".
    Normalement si le serveur web compresse en voyant juste "gzip", il devrait compresser aussi avec "gzip, deflate" (pas forcément avec gzip bien que ce serait plus intelligent, mais en tout cas il devrait compresser.)

    Il devrait, mais... Le fait-il ? Ça donne quoi avec Firefox ? (Et je trouverais bien plus vite si j'avais juste l'URL du site en question...)
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2012
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 265
    Par défaut
    Bonjour,

    Chrome envoie bien les headers Gzip et deflate dans la requête :

    Code Chrome request headers : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
    Accept-Encoding:gzip,deflate,sdch
    Accept-Language:fr-FR,fr;q=0.8,en-US;q=0.6,en;q=0.4
    Connection:keep-alive
    .....

    Sinon voila un lien pour test qui affiche divers headers reçus par le serveur :

    http://www.mides.fr/header.php

  6. #6
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Ah mais oui je suis con. J'ai confondu des headers de requête et des headers de réponse.

    Je vais faire quelques tests sur ton lien.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Citation Envoyé par tarzip Voir le message
    Sinon voila un lien pour test qui affiche divers headers reçus par le serveur :

    http://www.mides.fr/header.php
    Hum... Avec ton code Java et sur ce lien, j'obtiens bel et bien une réponse gzippée.
    Mais vu que HttpClient inclut lui-même le décodage, il ne faut pas faire de GzipDecompressingEntity sur response.getEntity() : ce serait dézipper le résultat d'un dézippage.

    Et au passage, avec ce code j'envoie bel et bien le header :
    et non pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Accept-Encoding: gzip, deflate
    J'avais des doutes parce que j'ai eu des problèmes par le passé avec HttpClient qui s'amuse à modifier mes headers, mais là c'est pas le cas.
    Je me demande donc avec quoi tu regardes les headers reçus et envoyés.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

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

Discussions similaires

  1. [CSS] Facile : Problème retour à la ligne après puce
    Par hobahoui dans le forum Mise en page CSS
    Réponses: 4
    Dernier message: 24/08/2006, 09h51
  2. Problème retour à la ligne avec textarea
    Par finalfx dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 12/05/2006, 18h59
  3. Problème retour à la ligne dans formulaire
    Par Mysti¢ dans le forum Langage
    Réponses: 1
    Dernier message: 03/04/2006, 13h34
  4. Problème retour chariot dans un fichier texte
    Par Redondo dans le forum Windows
    Réponses: 2
    Dernier message: 08/02/2006, 18h23
  5. Nouvelle installation MySql4.0.2d - Problème retour chariot
    Par pit_bulle dans le forum Installation
    Réponses: 2
    Dernier message: 30/09/2004, 16h07

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