2010-10-06 62 views
6

對於Emacs擴展,我想通過HTTP檢索數據。我並不是特別喜歡將wgetcurlw3m這樣的東西解決出來的想法,所以我使用了url-retrieve函數。使用url-retrieve解碼gzip-ed響應實體

我正在與之通話的一個HTTP服務器恰好忽略了Accept-Encoding標頭,並堅持總是通過Content-Encoding: gzip發送它的數據。

因此,並且url-retrieve不會自動解碼響應主體,緩衝區url-retrieve將呈現我將包含二進制gzip數據。

我正在尋找一種方法來解碼響應正文,最好是塊大塊,隨着數據到達。有沒有辦法指導url-retrieve爲我做這個?

一旦完全到達解碼響應,也是可以接受的,但我寧願避免創建一個運行gzip的異步子進程所涉及的所有fubar,管道響應的部分,以及回到解碼塊 - 我會在這裏尋找一些庫函數。

+3

Emacs顯然內置了gzip,因爲您可以打開gzip文件,編輯它們並透明地保存它們。問題是......這個鉤子在哪裏,答案並不明顯。 – jrockway 2010-10-06 16:53:21

+0

謝謝,約翰。雖然我意識到能夠打開gzip文件,但我確實沒有想到這可能是相關的,但顯然是這樣。在磁盤上打開一個.gz文件,查看'* Messages *',然後在我的elisp目錄中搜索我得到的任何東西,我找到了代碼實現了'jka-cmpr-hook.el'和/或'jka- compr.el'。這些問題似乎很容易通過這些功能提供的功能解決。 「自動壓縮模式」似乎最有希望。 – rafl 2010-10-07 01:32:51

+0

排序的話題,但你碰巧知道url-retrieve是否可以處理https? – sigjuice 2010-10-08 23:02:01

回答

4

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) 

(如果你不希望創建一個臨時文件,你必須做你自己的子流程的管理,但它並不像你在你的問題暗示的那麼複雜)

+0

謝謝,這對我來說非常完美 – Upgradingdave 2011-11-03 16:49:14

+0

如果你是使用'url-retrieve-synchronously',你可以切換到緩衝區,然後運行該回調,你根本不需要接受狀態參數(我會加上'&optional') – 2014-02-16 01:24:02