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

标签 http emacs elisp

对于 Emacs 扩展,我想通过 HTTP 检索数据。我不是特别喜欢花钱买 wgetcurlw3m 之类的东西来做到这一点,所以我正在使用 url-retrieve 函数。

与我交谈的其中一个 HTTP 服务器碰巧忽略了 Accept-Encoding header ,并坚持始终使用 Content-Encoding: gzip 发送其数据。

因此,由于 url-retrieve 不会自动解码响应主体,缓冲区 url-retrieve 将向我展示将包含二进制文件gzip 数据。

我正在寻找一种方法来解码响应主体,最好是在数据到达时逐 block 解码。有没有办法指示 url-retrieve 为我执行此操作?

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

最佳答案

auto-compression-mode 所做的是对要解压缩的文件运行 gzip。参见示例 jka-compr-insert-file-contentsjka-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)

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

关于http - 使用 url-retrieve 解码 gzip-ed 响应主体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3869904/

相关文章:

emacs - 在 Emacs 中重新定义主模式前缀键

emacs - 您如何确保关联列表在 Emacs 中维护唯一键

emacs - 将参数传递给 elisp 脚本。再次

emacs - 在加载时以缓冲区模式启动 emacs sr-speedbar

http - 为什么在 Git Bash 上找不到 ncat?

mongodb - 按服务器状态更改 HTTP 路由

JavaScript:Post无法发送参数?

正则表达式在 emacs 中去除 URL 后的字符

emacs - 突出显示区域时仅删除一个字符

java - 非常频繁地上传几个字节的数据(每秒)