使用url-retrieve解码gzip-ed响应主体

raf*_*afl 6 emacs elisp http

对于Emacs扩展,我想通过HTTP检索数据.我不是特别喜欢炮击了喜欢的东西的想法wget,curl或者w3m是能够做到这一点,所以我使用的url-retrieve功能.

我正在谈论的其中一个HTTP服务器碰巧忽略了Accept-Encoding标头,并坚持总是发送其数据Content-Encoding: gzip.

因此,以及url-retrieve不会自动解码响应主体的事实,缓冲区url-retrieve将呈现我将包含二进制gzip数据.

我正在寻找一种解码响应体的方法,最好是在数据到达时按块进行块化.有没有办法指导url-retrieve我这样做?

一旦它完全到达,一次解码响应也是可以接受的,但我宁愿避免创建运行gzip的异步子进程所涉及的所有fubar,管理我得到的响应的部分,以及读取已解码的块回来 - 我在这里寻找一些图书馆功能.

Gar*_*ees 4

作用auto-compression-mode是对要解压缩的文件运行 gzip。jka-compr-insert-file-contents例如参见中的示例jka-compr.el。因此,如果您要用于auto-compression-mode解压缩,则需要首先将响应写入文件。例如,这样的事情:

(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)
Run Code Online (Sandbox Code Playgroud)

(如果您不想创建临时文件,则必须进行自己的子流程管理,但这并不像您在问题中暗示的那么棘手。)