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

时间:2010-10-06 06:14:07

标签: http emacs elisp

对于Emacs扩展,我想通过HTTP检索数据。我并不特别喜欢对wgetcurlw3m这样的事情进行抨击以便能够做到这一点的想法,所以我使用的是{{1}功能。

我正在与之交谈的其中一个HTTP服务器碰巧忽略url-retrieve标头,并坚持始终使用Accept-Encoding发送数据。

因此,Content-Encoding: gzip不会自动解码响应主体,缓冲区url-retrieve将显示我将包含二进制gzip数据。

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

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

1 个答案:

答案 0 :(得分:4)

auto-compression-mode做的是对要解压缩的文件运行gzip。请参阅jka-compr.el中的jka-compr-insert-file-contents示例。因此,如果您要使用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)

(如果你不想创建一个临时文件,你就可以自己进行子流程管理,但这并不像你在问题中所暗示的那样棘手。)