2010-10-06 12 views
6

के साथ gzip-ed प्रतिक्रिया निकायों को डीकोड करना एक Emacs एक्सटेंशन के लिए, मैं HTTP पर डेटा पुनर्प्राप्त करना चाहता हूं। मुझे ऐसा करने में सक्षम होने के लिए wget, curl, या w3m जैसी चीजों को खोलने के विचार का विशेष रूप से शौक नहीं है, इसलिए मैं url-retrieve फ़ंक्शन का उपयोग कर रहा हूं।यूआरएल-पुनर्प्राप्ति

मैं जिन HTTP सर्वरों से बात कर रहा हूं उनमें से एक Accept-Encoding शीर्षलेखों को अनदेखा करने के लिए होता है और हमेशा Content-Encoding: gzip के साथ अपना डेटा भेजने पर जोर देता है।

इसके परिणामस्वरूप, और तथ्य यह है कि url-retrieve स्वचालित रूप से प्रतिक्रिया निकायों को डीकोड नहीं करता है, बफर url-retrieve प्रस्तुत करेगा मुझे बाइनरी gzip डेटा शामिल होगा।

मैं प्रतिक्रिया शरीर को डीकोड करने का एक तरीका ढूंढ रहा हूं, अधिमानतः खंड द्वारा खंडित, जैसे डेटा आता है। क्या मेरे लिए ऐसा करने के लिए url-retrieve को निर्देश देने का कोई तरीका है?

एक बार यह पूरी तरह से पहुंचने के बाद प्रतिक्रिया को डीकोड करना, स्वीकार्य भी होगा, लेकिन मैं एसिंक्रोनस सबप्रोसेस रनिंग जीजीआईपी, प्रतिक्रिया के पाइपिंग भागों को बनाने में शामिल सभी फ्यूबर से बचने के बजाय, डीकोडेड हिस्सों को वापस पढ़ना - मैं यहां कुछ लाइब्रेरी फ़ंक्शन ढूंढ रहा हूं।

+3

Emacs में स्पष्ट रूप से gzip बनाया गया है, क्योंकि आप gzipped फ़ाइलों को खोल सकते हैं, उन्हें संपादित कर सकते हैं, और उन्हें पारदर्शी रूप से सहेज सकते हैं। सवाल यह है कि यह हुक कहां है, और जवाब स्पष्ट नहीं है। – jrockway

+0

धन्यवाद, जॉन। जबकि मुझे gzipped फ़ाइलों को खोलने में सक्षम होने के बारे में पता था, यह वास्तव में मेरे साथ नहीं हुआ था कि यह संबंधित हो सकता है, लेकिन जाहिर है यह है। डिस्क पर एक .gz फ़ाइल खोलने से, '* संदेश *' को देखकर, और जो कुछ भी मिला, उसके लिए मेरी elisp निर्देशिकाओं को खोजकर, मैंने कोड को कार्यान्वित किया कि 'jka-cmpr-hook.el' और/या' jka- compr.el'। ऐसा लगता है कि उन समस्याओं द्वारा प्रदान किए गए कार्यों में से एक के साथ हल करना आसान है। 'ऑटो-संपीड़न-मोड' अभी सबसे अधिक आशाजनक प्रतीत होता है। – rafl

+0

ऑफ-विषय का प्रकार, लेकिन क्या आपको पता है कि यूआरएल-पुनर्प्राप्ति https को संभाल सकता है या नहीं? – sigjuice

उत्तर

4

auto-compression-mode फ़ाइल पर असम्पीडित होने के लिए gzip चलाता है। में उदाहरण के लिए jka-compr-insert-file-contents देखें। तो अगर आप असम्पीडित करने के लिए 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

+0

यदि आप हैं 'url-retrieve-synchronously' का उपयोग करके आप बस बफर पर स्विच कर सकते हैं और फिर उस कॉलबैक को चला सकते हैं, आपको स्थिति तर्क को बिल्कुल स्वीकार करने की आवश्यकता नहीं होगी (मैं 'और वैकल्पिक' जोड़ूंगा) –