Http 用url检索解码gzip ed响应体

Http 用url检索解码gzip ed响应体,http,emacs,elisp,Http,Emacs,Elisp,对于Emacs扩展,我希望通过HTTP检索数据。我并不特别喜欢使用wget、curl或w3m等功能来实现这一点,因此我使用url retrieve功能 我正在谈论的一个HTTP服务器碰巧忽略了Accept Encoding头,并坚持始终使用Content Encoding:gzip发送其数据 因此,由于url-retrieve不会自动解码响应体,因此呈现给我的缓冲区url-retrieve将包含二进制gzip数据 我正在寻找一种在数据到达时解码响应体的方法,最好是逐块解码。有没有一种方法可以指示

对于Emacs扩展,我希望通过HTTP检索数据。我并不特别喜欢使用
wget
curl
w3m
等功能来实现这一点,因此我使用
url retrieve
功能

我正在谈论的一个HTTP服务器碰巧忽略了
Accept Encoding
头,并坚持始终使用
Content Encoding:gzip
发送其数据

因此,由于
url-retrieve
不会自动解码响应体,因此呈现给我的缓冲区
url-retrieve
将包含二进制gzip数据

我正在寻找一种在数据到达时解码响应体的方法,最好是逐块解码。有没有一种方法可以指示
url检索
为我执行此操作


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

自动压缩模式所做的是对要解压缩的文件运行gzip。参见
jka compr.el
中的示例。因此,如果要使用
自动压缩模式
进行解压缩,则需要先将响应写入文件。例如,类似这样的内容:

(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)

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

Emacs显然内置了gzip,因为你可以打开gzip文件,编辑它们,并透明地保存它们。问题是。。。这个钩子在哪里,答案并不明显。谢谢你,约翰。虽然我知道可以打开gzip文件,但我真的没有想到这可能与此相关,但显然是这样。通过在磁盘上打开一个.gz文件,查看
*消息*
,并搜索我的elisp目录以查找我得到的任何信息,我找到了实现jka cmpr hook.el和/或
jka compr.el
的代码。这个问题似乎很容易用这些函数提供的一个函数来解决<使用自动压缩模式的code>现在看起来最有前途。有点离题,但你知道url检索是否可以处理https吗?为什么不自己试试看呢<代码>(url检索)https://google.com/“#”(lambda(status)(pop to buffer(current buffer)))如果您正在使用
url同步检索
您可以切换到缓冲区,然后运行回调,您根本不需要接受status参数(我会添加
&可选的