Le javascript, ça sert à tout et n’importe quoi. Surtout n’importe quoi.

Disclaimer : cet article va parler d’une librairie js à laquelle j’ai contribué, et plus particulièrement d’une fonctionnalité que j’ai développé. J’ai tenté au maximum d’éviter les dérives nombrilistes pénibles à base de “moi je”, mais cassons le suspens tout de suite : j’ai échoué.

D’un projet WTF

Le javascript est à la mode, il est donc utilisé à toutes les sauces. On le trouve côté serveur, on compile du bytecode llvm vers du js, on fait des jeux avec, on peut même l’utiliser pour attaquer les libertés fondamentales des utilisateurs. Dans toutes ces librairies, on trouve par exemple JSZip, une librairie js qui permet de générer des fichiers zip côté client. Sans intervention du serveur (parce que utiliser java.util.zip, c’est tricher), on pourra donc créer le binaire représentant un HelloWorld.txt zippé :

1
2
3
4
var zip = new JSZip();
zip.file("HelloWorld.txt", "Hello, world !");
var content = zip.generate();
location.href="data:application/zip;base64,"+content;

Récupérer ce binaire n’est pas facile, mais on a vu pire.

À une contribution OMGWTFBBQ

L’élément déclencheur est ici une feature request dans le bug tracker sur github :

It would be great to have a two-way zipfile object that can be created from a file, modified and downloaded as a file.

Avec des motivations telles que :

  • for the lulz
  • because I can

Il m’était impossible de ne pas tenter l’écriture d’un parser zip en js.

CHALLENGE ACCEPTED

Les principales difficultés furent :

  • un fichier zip se lit à l’envers. Commencer par le début pose trop de problèmes (mais je l’ai su après).
  • IE. Charger un fichier binaire en ajax demande du code vbscript. DU CODE VBSCRIPT.
  • mes idées du type “tiens, et si j’ajoutais la gestion du ZIP64, prévu pour les fichiers de plus de 4Go ?”

Au final, ça donne une pull request conséquente (+7472, -1092) qui ajoute la possibilité de lire des zip dans un navigateur. Même des jar (avec leurs data descriptor), même des stream zippés (avec leur extension ZIP64), même des zip avec des symboles UTF8 bizarres dans le nom des fichiers, même dans IE6.

1
2
3
4
5
var zip = new JSZip();
zip.load(zipBinaryFromAjaxCall);
zip.file("HelloWorld.txt").data; // "Hello, world !"
zip.file("new_file.txt", "yeeeeah !");
zip.generate(); // zip with 2 files

Ça donne également un sacré sentiment d’accomplissement quand la pull request est acceptée :)

DONE

Contrat Creative Commons Article écrit sous Creative Commons 3.0 BY-SA.

VN:F [1.9.22_1171]
Rating: +6 (from 6 votes)
Share
Ce contenu a été publié dans WTF, avec comme mot(s)-clef(s) , , , . Vous pouvez le mettre en favoris avec ce permalien.

4 réponses à Le javascript, ça sert à tout et n’importe quoi. Surtout n’importe quoi.

  1. Damien V. dit :

    Je sais pas si je dois être scandalisé par l’idée même du projet ou si je dois en être admiratif…
    Dans le doute, je vais dire GG :D

    VN:F [1.9.22_1171]
    Rating: 0 (from 0 votes)
  2. Cyril Brouillard dit :

    Je vois très bien l’intérêt de ce genre de projet dans la Demoscene essentiellement :) Cela pourrait permettre de compresser pas mal de ressources pour les décompresser à la volée. Intéressant.

    Les démos en JS : http://demojs.org/

    VN:F [1.9.22_1171]
    Rating: 0 (from 0 votes)
  3. nmaupu@excilys.com dit :

    Oh my god

    VN:F [1.9.22_1171]
    Rating: 0 (from 0 votes)
  4. Joan Zapata dit :

    Oh je like !

    VN:F [1.9.22_1171]
    Rating: 0 (from 0 votes)

Laisser un commentaire