2010-10-06 3 views
6

Pour une extension Emacs, je souhaite récupérer des données via HTTP. Je ne suis pas particulièrement friand de l'idée de bombarder des choses comme , curl, ou w3m pour pouvoir le faire, alors j'utilise la fonction url-retrieve.Décodage de corps de réponse gzip-ed avec url-retrieve

L'un des serveurs HTTP que je parle arrive à ignorer Accept-Encoding en-têtes et insiste pour toujours envoyer ses données avec Content-Encoding: gzip. En conséquence de cela, et du fait que url-retrieve ne décode pas automatiquement les corps de réponse, le tampon url-retrieve me présentera des données gzip binaires.

Je suis à la recherche d'un moyen de décoder le corps de la réponse, de préférence fragment par bloc, au fur et à mesure que les données arrivent. Y at-il un moyen d'instruire url-retrieve de le faire pour moi? Décoder la réponse en même temps, une fois complètement arrivé, serait également acceptable, mais je préfère éviter tout fubar impliqué dans la création d'un sous-processus asynchrone exécutant gzip, en redirigeant des parties de la réponse que j'ai eues vers ça, et lisant les morceaux décodés - je chercherais une fonction de bibliothèque ici.

+3

Emacs a évidemment intégré gzip, car vous pouvez ouvrir des fichiers gzip, les éditer et les sauvegarder de façon transparente. La question est ... où est ce crochet, et la réponse n'est pas évidente. – jrockway

+0

Merci, John. Bien que je sois conscient de pouvoir ouvrir des fichiers gzippés, il ne m'a pas vraiment semblé que cela puisse être lié, mais c'est évidemment le cas. De l'ouverture d'un fichier .gz sur le disque, en regardant '* Messages *', et en cherchant dans mes répertoires elisp pour tout ce que j'ai, j'ai trouvé le code implémentant c'est 'jka-cmpr-hook.el' et/ou' jka- compr.el'. Il semble probable que ce problème est facile à résoudre avec une fois des fonctions fournies par ceux-ci. 'with-auto-compression-mode' semble le plus prometteur en ce moment. – rafl

+0

sorte de hors-sujet, mais savez-vous si url-retrieve peut gérer https? – sigjuice

Répondre

4

Ce que auto-compression-mode exécute gzip sur le fichier à décompresser. Voir par exemple jka-compr-insert-file-contents dans jka-compr.el. Donc, si vous allez utiliser auto-compression-mode pour faire la décompression, vous devrez d'abord écrire la réponse à un fichier. Par exemple, quelque chose comme ceci:

(defun uncompress-callback (status) 
    (let ((filename (make-temp-file "download" nil ".gz"))) 
    (search-forward "\n\n")    ; Skip response headers. 
    (write-region (point) (point-max) filename) 
    (with-auto-compression-mode 
     (find-file filename)))) 

(url-retrieve "http://packages.ubuntu.com/hardy/allpackages?format=txt.gz" 
       #'uncompress-callback) 

(. Si vous ne voulez pas créer un fichier temporaire, vous aurez faites votre propre gestion des sous-processus, mais ce n'est pas aussi difficile que vous le laissez entendre dans votre question)

+0

Merci, cela a fonctionné parfait pour moi – Upgradingdave

+0

si vous êtes en utilisant 'url-retrieve-synchrone' vous pouvez simplement passer au tampon et ensuite exécuter ce rappel, vous n'aurez pas du tout besoin d'accepter l'argument status (j'ajouterais' & optional') –

Questions connexes