Http 用url检索解码gzip ed响应体
对于Emacs扩展,我希望通过HTTP检索数据。我并不特别喜欢使用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数据 我正在寻找一种在数据到达时解码响应体的方法,最好是逐块解码。有没有一种方法可以指示
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参数(我会添加&可选的)