8791 sujets

Développement web côté serveur, CMS

Bonsoir,

Pour certaines raisons, je fais quelques testes avec une implémentations personnelle de la compression Deflate, celle qui est encapsulée dans le format gzip par exemple.

Je voulais faire un teste sur des données brutes reçues d’un serveur web quelconque, mais voilà qu’étrangement, je ne parviens à recevoir aucune données compressées Smiley ohwell

Je m’explique sur ce dernier point : j’utilise un programme à la WGet que j’ai écrit, il fonctionne sous Windows (mais ce n’est pas pour ce programme le Deflate, c’est une autre histoire).

J’ai testé plusieurs serveurs, c’est à dire plusieurs sites, sans succès. Je me suis donc dit.... «bon, après tout, c’est peut-être seulement que le serveur ne répond pas à ces requêtes, donc il renvoit le contenu tel-quel». Mais j’ai eu l’idée d’essayer avec Alsacreations.com, et là, il s’est produit au moins une chose intéressante : j’ai reçu un entête de réponse qui indique clairement que mod_gzip est actif sur le serveur :


HTTP/1.1 200 OK
Date: Mon, 10 May 2010 00:36:48 GMT
Server: Apache/1.3.34 (Debian) mod_gzip/1.3.26.1a PHP/5.2.0-8+etch15
Vary: Host
X-Powered-By: PHP/5.2.0-8+etch15
Set-Cookie: PHPSESSID=a9f92193516ae24fc5e6cc2c64f75e6c; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Transfer-Encoding: chunked
Content-Type: text/html; charset=UTF-8

Pourtant, je ne reçois la encore, qu’un “Transfer-Encoding: chunked ”

Zut alors... parce que sur ce coup là, je ne peux pas supposer que le serveur ne supporte pas l’envoie de réponses compréssées.

De plus, j’ai remarqué des choses bizzare à ce sujet : la RFC 2616, indique que c’est dans le champ TE qu’il faut indiquer l’encodage à utiliser pour le transfet (transfer-coding), et sur le web, tout les examples que je trouve, utilise le champs Accept-Encoding, qui lui, d’après la RFC, spécifie normalement non pas l’encodage du transfert, mais l’encodage de l’élément renvoyé (content-coding, ... ce qui est différent de transfer-coding).

C’est déjà bien bizzare... mais soit ; j’ai essayé d’indiquer «gzip, deflate» dans les deux, toujours sans succès, je reçois toujours une réponse “Transfert-Encoding: chunked”.

Voilà le texte de la requête :


GET / HTTP/1.1
Host:  www.alsacreations.com
 
User-Agent: Experimental Crawler
Accept-Encoding: gzip, deflate
TE: gzip, deflate


Remarque : c’est pas vrai, mon truc n’est pas un robot expérimentale, ça c’est juste pour rigoler.

Mais où donc est-ce que je me plante ?

Est-ce que des spécialistes ont une idée ?

Encore plus bizarre, la RFC dit
RFC 2616 a écrit :
If an Accept-Encoding field is present in a request, and if the
server cannot send a response which is acceptable according to the
Accept-Encoding header, then the server SHOULD send an error response
with the 406 (Not Acceptable) status code.

Dans la requête, je ne met que deflate ou gzip, pas d’autres alternatives, et pourtant je ne reçois pas d’erreur 406. Ça ne peut pas être un choix par défaut du serveur non-plus, puisqu’il n’est censé faire ce type de choix par défaut (choix qui est “identity”) qui si aucun champs Accept-Encoding ou TE n’est présent.

Je suis déjà en train de sécher sur un autre truc depuis 3 jours, alors si même avec ce truc là je n’arrive pas à m’en sortir, je vais m’inquiéter.

Puis cette histoire d’utiliser Accept-Encoding en lieu et place de TE, ça me chiffonne. Pourtant, même Opera le fait, je viens de vérifier, il envoie des requêtes avec un champs Content-Encoding et pas de champs TE.

Étrange, étrange....
Modifié par hibou57 (13 Jun 2010 - 13:24)
Je tentais d’imaginer des hypothèses, je n’en vois que deux, dont l’une pas crédible du tout.

La première : le système derrière Winsock qui reconnaitrait un flux compressé et le décompresserait automatiquement à la volée. Ce type de comportement serait crédible si j’utilisais un système spécifiquement dédié à HTTP, et dont se serait le rôle, que d’être capable d’interpréter HTTP. Mais comme je n’utilise que de simples sockets... non, pas crédible.

La deuxième hypothèse : les serveurs Apache (pourquoi eux ? ben parce que ce sont les plus répandus) testent la signature du navigateur et ne renvoient de contenu compressé que pour les navigateurs dont la signature leur laisse penser qu’ils peuvent effectivement recevoir du contenu compressé. Ce serait tout de même bizarre, parce que rien dans le protocole HTTP n’indique de répondre à une requête d’une manière différente selon la signature donnée dans User-Agent (et ça imposerait aux navigateurs conformes à HTTP de simuler la signature d’un autre navigateur.... enfin, quoique, Opera est bien obligé de le faire parfois pour certains sites)... mais en même temps, c’est malheureusement bien ce qui semble être le cas, vu le nombre d’exemples de fichiers .htaccess que j’ai put voir, répondant différemment aux requêtes en fonction de la signature User-Agent.

La dernière hypothèse, même si elle implique de vilaines choses du côté des serveurs, me semble plus crédible et réaliste.

Je testerai donc ça plus tard.

Oui, ... c’était aussi l’occasion d’un p’tit up constructif Smiley langue

Bon, je donnerai les résultats s’il sont parlants, et quand j’aurai testé.
Modifié par hibou57 (14 May 2010 - 22:21)
Pour ton hypothèse Winsock tu oublies. Windows ne touche pas à ça (ou alors j'en serai très étonné). Si ce que tu utilises c'est un simple socket il n'a aucune raison d'aller toucher à la couche HTTP.

Pour ta seconde hypothèse, certains serveurs (apache ou autres) sont bel et bien configurés ainsi avec un filtre sur l'entête User-Agent mais ils sont de plus en plus rares. Quand il y a filtre, c'est le plus souvent un filtre négatif (si tu as un accept-encoding correct, on t'envoie du compressé sauf si ton User-Agent correspond à un de ceux qui sont connus pour avoir des bugs).

Pour tes entêtes, ton Accept-Encoding est très bien, c'est ce qu'il faut utiliser : http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.3
Le Transfert-Encoding (qui est nommée telle quelle, et pas "TE") là si tu transferts en base64 ou en chunked (ce qui n'empêche pas un passage par deflate/gzip en théorie)

Sur le fait que le serveur ne respecte pas strictement la RFC et envoie en identity même si tu n'assures pas le supporter, c'est normal :
a écrit :
The "identity" content-coding is always acceptable, unless
specifically refused because the Accept-Encoding field includes
"identity;q=0", or because the field includes "*;q=0" and does
not explicitly include the "identity" content-coding. If the
Accept-Encoding field-value is empty, then only the "identity"
encoding is acceptable.


Après pourquoi tu ne reçois pas ton flux compressé, je pourrai peut être t'en dire plus si tu me donnes une URL.

Parmi les possibles :
- un proxy intermédiaire (ou un pseudo antivirus / anti-malware / firewall) fait sauter le gzip (ils sont 10 à 15% à faire ça, ce n'est pas rare)
- ton serveur ne supporte simplement pas le gzip ou le deflate

Par un navigateur, sur la même URL, avec le même config réseau, tu as bien un trafic compressé ?
Si tu installes wireshark, tu vois bien tes entêtes de accept-encoding dans ta requête ?
Bonsoir,

Désolé d’avoir lu ta réponse si tardivement.

Edas a écrit :
Pour ton hypothèse Winsock tu oublies. Windows ne touche pas à ça (ou alors j'en serai très étonné). Si ce que tu utilises c'est un simple socket il n'a aucune raison d'aller toucher à la couche HTTP.

OK, donc tu confirme.

Edas a écrit :
Pour ta seconde hypothèse, certains serveurs (apache ou autres) sont bel et bien configurés ainsi avec un filtre sur l'entête User-Agent mais ils sont de plus en plus rares. Quand il y a filtre, c'est le plus souvent un filtre négatif (si tu as un accept-encoding correct, on t'envoie du compressé sauf si ton User-Agent correspond à un de ceux qui sont connus pour avoir des bugs).

Je vois

Edas a écrit :
Pour tes entêtes, ton Accept-Encoding est très bien, c'est ce qu'il faut utiliser : http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.3
Le Transfert-Encoding (qui est nommée telle quelle, et pas "TE") là si tu transferts en base64 ou en chunked (ce qui n'empêche pas un passage par deflate/gzip en théorie)

Je vérifierai (il me semblait avoir vu que c’est TE dans un sens et Transfert-Encoding dans l’autre sens), mais pour l’instant, comme j’ai essayé les deux, je sais que ça ne viens pas de là.

Edas a écrit :
Sur le fait que le serveur ne respecte pas strictement la RFC et envoie en identity même si tu n'assures pas le supporter, c'est normal :
The "identity" content-coding is always acceptable, unless
specifically refused because the Accept-Encoding field includes
"identity;q=0", or because the field includes "*;q=0" and does
not explicitly include the "identity" content-coding. If the
Accept-Encoding field-value is empty, then only the "identity"
encoding is acceptable.

J’ai essayé avec des “;q=1.0” pour ce que je souhaite (gzip ou deflate) et des “;q=0” pour le reste que je refuse explicitement et un “*;q=0” pour finir, mais rien n’y fait.

Edas a écrit :
Après pourquoi tu ne reçois pas ton flux compressé, je pourrai peut être t'en dire plus si tu me donnes une URL.

J’ai testé tout simplement sur http://www.alsacreations.com, surtout celui-ci, parce que l’identification du serveur affiche clairement qu’il supporte la compression gzip.

Edas a écrit :
Parmi les possibles :
- un proxy intermédiaire (ou un pseudo antivirus / anti-malware / firewall) fait sauter le gzip (ils sont 10 à 15% à faire ça, ce n'est pas rare)

Je viens d’essayer en désactivant le pare-feu... pas ça non-plus, ça ne change rien, je reçois toujours en “chunked”.

Edas a écrit :
- ton serveur ne supporte simplement pas le gzip ou le deflate

Dans le cas de ce test, Alsacreations, vu que le serveur affiche fiérement qu’il support gzip, je ne pense pas que le problème soit là. Mais c’est justement pour ça que je teste sur Alsa, pour être certain de tester avec un serveur qui supporte gzip.

Edas a écrit :
Par un navigateur, sur la même URL, avec le même config réseau, tu as bien un trafic compressé ?
Si tu installes wireshark, tu vois bien tes entêtes de accept-encoding dans ta requête ?

Malheureusement, avec WireShark, je ne vois pas l’interface qui me sert à la connexion internet, je ne vois que les interfaces virtuelles qui me servent pour mes essais de réseau virtuels.

Mais je vais revoir ça plus tard.

P.S. J’ai essayé en utilisant le signature User-Agent de FireFox (en me disant qu’elle doit passer partout), ça ne change rien non-plus.

-- EDIT --
Ça y est, j’ai trouvé, c’est moi qui suis bête : avec l’URL http://forum.alsacreations.com/forum.php ça marche, je reçois bien le document compressé. C’est parce qu’il ne voyait peut-être pas de raisons de compresser la page d’accueil alors. En tous cas, je note que même en exigeant d’avoir une réponse compressée, on est par certain de la recevoir compressée (sans parler que la plupart des serveurs on l’air de ne pas supporter du tout le gzip).
Modifié par hibou57 (13 Jun 2010 - 00:12)