2010-10-06 38 views
6

Đối với phần mở rộng Emacs, tôi muốn truy xuất dữ liệu qua HTTP. Tôi không đặc biệt thích ý tưởng bắn phá những thứ như wget, curl hoặc w3m để có thể làm điều đó, vì vậy tôi đang sử dụng hàm url-retrieve.Giải mã nội dung phản hồi gzip-ed với url-truy xuất

Một trong các máy chủ HTTP tôi đang nói chuyện xảy ra để bỏ qua các tiêu đề Accept-Encoding và luôn nhấn mạnh vào việc gửi dữ liệu của mình với Content-Encoding: gzip.

Kết quả là, và thực tế là url-retrieve không tự động giải mã nội dung phản hồi, bộ đệm url-retrieve sẽ hiển thị cho tôi sẽ chứa dữ liệu gzip nhị phân.

Tôi đang tìm cách giải mã nội dung phản hồi, tốt nhất là chunk theo đoạn, khi dữ liệu đến. Có cách nào để hướng dẫn url-retrieve làm điều này cho tôi không?

Giải mã đáp ứng cùng một lúc, khi nó hoàn toàn đến, cũng sẽ được chấp nhận, nhưng tôi muốn tránh tất cả các fubar liên quan đến việc tạo một tiến trình con không đồng bộ chạy gzip, các phần đường dẫn của phản hồi mà tôi nhận được và đọc các đoạn đã được giải mã trở lại - Tôi sẽ tìm một số chức năng thư viện ở đây.

+3

Emacs rõ ràng đã tích hợp sẵn gzip, vì bạn có thể mở các tệp đã nén, chỉnh sửa chúng và lưu chúng một cách minh bạch. Câu hỏi đặt ra là ... cái móc này ở đâu, và câu trả lời không rõ ràng. – jrockway

+0

Cảm ơn, John. Trong khi tôi đã nhận thức được việc có thể mở các tập tin nén, nó thực sự đã không xảy ra với tôi rằng điều này có thể liên quan, nhưng rõ ràng nó là. Từ việc mở một tệp .gz trên đĩa, nhìn vào '* Messages *', và tìm kiếm các thư mục elisp của tôi cho bất cứ thứ gì tôi nhận được, tôi đã tìm ra mã thực thi đó là 'jka-cmpr-hook.el' và/hoặc' jka- include.el'. Dường như vấn đề này dễ giải quyết với một khi các chức năng được cung cấp bởi những vấn đề đó. 'chế độ nén tự động 'có vẻ hứa hẹn nhất ngay bây giờ. – rafl

+0

loại bỏ chủ đề, nhưng bạn có biết liệu url-retrieve có thể xử lý https không? – sigjuice

Trả lời

4

Điều auto-compression-mode hoạt động là chạy gzip trên tệp để được giải nén. Xem ví dụ: jka-compr-insert-file-contents trong jka-compr.el. Vì vậy, nếu bạn định sử dụng auto-compression-mode để thực hiện giải nén, bạn sẽ cần ghi phản hồi vào tệp trước. Ví dụ, một cái gì đó như thế này:

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

(. Nếu bạn không muốn tạo ra một tập tin tạm thời, bạn sẽ phải làm quản lý tiến trình con của riêng mình, nhưng nó không phải là khó khăn như bạn hàm ý trong câu hỏi của bạn)

+0

Cảm ơn, điều này làm việc hoàn hảo cho tôi – Upgradingdave

+0

nếu bạn bằng cách sử dụng 'url-retrieve-synchronously' bạn chỉ có thể chuyển sang bộ đệm và sau đó chạy gọi lại đó, bạn sẽ không cần phải chấp nhận đối số trạng thái nào cả (tôi sẽ thêm' & optional') –

Các vấn đề liên quan