GZIP: apache cgi-perl: "Content-Encoding: gzip" (encodé par le perl)

GZIP: apache cgi-perl: "Content-Encoding: gzip" (encodé par le perl) - Perl - Programmation

Marsh Posté le 26-11-2009 à 22:28:55    

 Salut ;)
 
Ma question de base est simple :
Comment encoder en gzip une variable de données ? (et non un fichier)
 
Ce que je souhaite faire en réalité, c'est encoder mes données html à renvoyer au client, sous certaines conditions (d'ou la non utilisation de mod_gzip)
(Je pense par ex n'encoder que si ca n'est pas un robot, et que la page est plus grande que N octets... ou bien si son fai est lent... etc)
 
Alors je me suis penché sur IO::Compress::Gzip
Mais en étudiant la source de plus près, je me suis apercu que ca n'était fait que pour encoder depuis un fichier ? (leur code source va meme lire les infos du fichier...)
 
Donc ca ne semble pas être ce dont j'ai besoin.
Moi je voudrais juste quelque chose du genre: $gzip = encode_gzip($data)
qui ferait la meme chose que lorsqu'on utilise le STDIN du binaire gzip.
 
En encodant le code html complet, je pourrais ensuite renvoyer Content-Encoding: gzip

 
MERCI ! :D


---------------
La vie c'est comme une boite de chocolats, on ne sait jamais sur quoi on va tomber. (Forrest Gump)
Reply

Marsh Posté le 26-11-2009 à 22:28:55   

Reply

Marsh Posté le 27-11-2009 à 03:45:47    

IO::Compress::Gzip la doc sur CPAN est complexe mais claire, ce n'est pas fait que pour compresser un fichier:

Code :
  1. use IO::Compress::Gzip;
  2. ...............................
  3. my $compressed;
  4. my $zipper = IO::Compress::Gzip->new(\$compressed); # buffer destination a passer par référence
  5. $zipper->print($data); #$data contient les données à compresser
  6. $zipper->close();
  7. # a ce stade $compressed contient les données zippées


C'est un exemple minimal (mais testé et qui marche); si on veut donner un nom aux données dans l'archive, on fera
my $zipper = IO::Compress::Gzip->new(\$compressed, {Name => "test.txt"});
et en plus de name, on a tout un tas de paramétrages possible.
En mode append, on peut faire des $zipper->print($data); successifs avec data changé a chaque étape, etc
Bref, IO::Compress::Gzip permet un contrôle extrêmement fin de ce que l'on fait.

 

Le code complet qui m'a servi a tester:

Code :
  1. #!/usr/bin/perl -w
  2.  
  3. use strict;
  4. use warnings;
  5.  
  6. use IO::Compress::Gzip;
  7. my $data = "hello World!";
  8.  
  9. my $compressed;
  10. my $z = IO::Compress::Gzip->new(\$compressed, {Name => "test.txt"});
  11. $z->print($data);
  12. $z->close();
  13. #le reste est un test pour vérification avec winzip
  14. my $out;
  15. open ($out, '>', "test.gz" );
  16. binmode $out;
  17. print $out $compressed;
  18. close $out;


A+,


Message édité par gilou le 27-11-2009 à 03:51:17

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 27-11-2009 à 03:59:35    

oulala !
je crois bien que je t'aime ! :D
 
C'est magique ! merci beaucoup !
 
En fait je crois que je connais très mal le format gzip... car j'avais meme pas pensé qu'on pouvait donner des paramètres pour l'arborescence de sortie... je me contentais de croire que gzip n'était qu'une compression brute de données, or y'a forcément aussi une gestion d'arborescence à l'interieur meme du format... comme pour un tar quoi...
Cela dit, dans mon cas ca doit rester une compression pure sans arbo.
 
Bon, je vais faire quelques tests dans le cgi pour voir si les navigateurs aiment cette méthode...
 
PS: j'ai l'impression que si n'étais pas la l'activité du forum chuterait de 50% :)


---------------
La vie c'est comme une boite de chocolats, on ne sait jamais sur quoi on va tomber. (Forrest Gump)
Reply

Marsh Posté le 27-11-2009 à 04:41:31    

Bon c'est génial ! ca marche impeccable !
 
J'ai mis comme conditions:
- pas robot (non seulement ils ont le débit qu'il faut, mais ca évite d'éventuels problemes s'ils n'aiment pas, gèrent mal, ou qu'une erreur survient)
- page > 10Ko
- pas de surcharge du cpu (en vérifiant simplement l'existence d'un fichier "nogzip" en tmpfs, qui existera donc en cas de surcharge)
 
Ca divise la taille par 5 en moyenne.
 
Bon le seul truc c'est que je ne renvois pas de Content-Length, c'est pas grave ?
je n'en ai jamais renvoyé et ca a toujours semblé marcher, y'a pas de raison que ca change avec le gzip ?


Message édité par MisterBark le 27-11-2009 à 04:46:53

---------------
La vie c'est comme une boite de chocolats, on ne sait jamais sur quoi on va tomber. (Forrest Gump)
Reply

Marsh Posté le 27-11-2009 à 10:00:55    

:)
Content-Length, tu l'as en faisant length($compressed) à priori.
A+,


Message édité par gilou le 27-11-2009 à 10:55:37

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 27-11-2009 à 16:04:22    

oui c'est sur, mais je me demande juste si c'est vraiment utile... parce qu'en principe ca "reste vivant" lol (keep alive)


---------------
La vie c'est comme une boite de chocolats, on ne sait jamais sur quoi on va tomber. (Forrest Gump)
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed