कर्ल का उपयोग करते समय एक gzipped पृष्ठ को ठीक से कैसे संभालना है?


139

मैंने एक बैश स्क्रिप्ट लिखी है जो कर्ल का उपयोग करके वेबसाइट से आउटपुट प्राप्त करती है और HTML आउटपुट पर स्ट्रिंग हेरफेर का एक गुच्छा है। समस्या तब है जब मैं इसे एक ऐसी साइट के खिलाफ चलाता हूं जो अपने आउटपुट को वापस लौटा रही है। ब्राउज़र में साइट पर जाना ठीक काम करता है।

जब मैं हाथ से कर्ल चलाता हूं, तो मुझे आउटपुट मिलता है:

$ curl "http://example.com"

यहाँ उस विशेष साइट से हेडर दिया गया है:

HTTP/1.1 200 OK
Server: nginx
Content-Type: text/html; charset=utf-8
X-Powered-By: PHP/5.2.17
Last-Modified: Sat, 03 Dec 2011 00:07:57 GMT
ETag: "6c38e1154f32dbd9ba211db8ad189b27"
Expires: Sun, 19 Nov 1978 05:00:00 GMT
Cache-Control: must-revalidate
Content-Encoding: gzip
Content-Length: 7796
Date: Sat, 03 Dec 2011 00:46:22 GMT
X-Varnish: 1509870407 1509810501
Age: 504
Via: 1.1 varnish
Connection: keep-alive
X-Cache-Svr: p2137050.pubip.peer1.net
X-Cache: HIT
X-Cache-Hits: 425

मुझे पता है कि लौटाया गया डेटा gzipped है, क्योंकि यह html को लौटाता है, जैसा कि अपेक्षित था:

$ curl "http://example.com" | gunzip

मैं गनज़िप के माध्यम से आउटपुट को पाइप नहीं करना चाहता, क्योंकि स्क्रिप्ट अन्य साइटों पर काम करती है, और गज़िप के माध्यम से पाइपिंग उस कार्यक्षमता को तोड़ देगी।

मैंने क्या कोशिश की है

  1. उपयोगकर्ता-एजेंट को बदलना (मैंने उसी स्ट्रिंग की कोशिश की जिसे मेरा ब्राउज़र भेजता है, "मोज़िला / 4.0", आदि)
  2. आदमी कर्ल
  3. गूगल खोज
  4. stackoverflow खोज

सब कुछ खाली हो गया

कोई विचार?


मेरे लिए, समस्या यह है कि cURL Brotli (संपीड़न हटाने के लिए सक्षम नहीं था curl 7.54.0 (x86_64-apple-darwin17.0) libcurl/7.54.0 LibreSSL/2.0.20 zlib/1.2.11 nghttp2/1.24.0) - निकाल कर इसे हल brसे Accept-Encoding। देखें stackoverflow.com/questions/18983719/…
Nino opkopac

जवाबों:


260

curlयदि आप --compressedध्वज सेट करते हैं तो स्वचालित रूप से प्रतिक्रिया को विघटित करेगा :

curl --compressed "http://example.com"

--compressed (HTTP) एल्गोरिदम libcurl समर्थन में से एक का उपयोग करके एक संपीड़ित प्रतिक्रिया का अनुरोध करें, और असम्पीडित दस्तावेज़ को सहेजें। यदि इस विकल्प का उपयोग किया जाता है और सर्वर एक असमर्थित एन्कोडिंग भेजता है, तो कर्ल एक त्रुटि की सूचना देगा।

gzip को सबसे अधिक संभावना है, लेकिन आप इसे " फ़ीचर्स " लाइन में कहीं curl -Vऔर libz की तलाश करके देख सकते हैं :

$ curl -V
...
Protocols: ...
Features: GSS-Negotiate IDN IPv6 Largefile NTLM SSL libz 

ध्यान दें कि यह वास्तव में सवाल में वेबसाइट है कि यहाँ गलती है। यदि curlकोई Accept-Encoding: gzipअनुरोध शीर्ष लेख पारित नहीं किया है , तो सर्वर को एक संपीड़ित प्रतिक्रिया नहीं भेजी जानी चाहिए।


24
यह एक कर्ल बग प्रतीत होता है, क्योंकि यह प्रतिक्रिया के आधार पर अपने डिकोडिंग को ट्रिगर करना चाहिए, न कि उस पर जो उसने अनुरोध किया है (यह देखते हुए कि यह gzip का समर्थन करता है)। HTTP 1.1 को उद्धृत करने के लिए: "यदि कोई स्वीकार-एनकोडिंग क्षेत्र एक अनुरोध में मौजूद नहीं है, तो सर्वर MAY यह मान लेता है कि ग्राहक किसी भी सामग्री कोडिंग को स्वीकार करेगा।" लेकिन यह कहना है कि सर्वर उस मामले में सामग्री, हम्म, जाओ आंकड़ा सांकेतिक शब्दों में बदलना नहीं है पर जाना है।
जॉर्ज लुंड

वास्तव में मेरे संस्करण पर काम करता --comp --compress --compressed
राडू Toader

3
यह अनुरोध हैडर भी सेट करता है: "स्वीकार-एनकोडिंग: डिफ्लेट, गज़िप" जब से सर्वर गज़िप और नो गज़िप परोसता है, तो आपको बहुत अच्छा लगता है, आपको बस ज़रूरत है - संपीड़ित और अपने आप एन्कोडिंग शीर्ष लेख को न जोड़ें
15

1 मिनट में इस समाधान के साथ मेरी क्यूए मदद करो! धन्यवाद ! उस ने कहा, मेरा आवेदन वास्तव में सामग्री-एन्कोडिंग के साथ gzip प्रतिक्रिया भेज रहा है: gzip। ब्राउज़र और आधुनिक उपकरण (जैसे httpie) स्वचालित रूप से इसे संभालते हैं। मुझे लगता है कि कर्ल को बस एक "संकेत" की जरूरत है
Faraway

आश्चर्यजनक रूप से, सेटिंग Accept-Encoding: deflate, gzipपर्याप्त नहीं है - भले ही सर्वर एक gzip प्रतिक्रिया देता है Content-Encoding: gzip, कर्ल स्वचालित रूप से इसे अनगिप नहीं करेगा। --compressedध्वज की आवश्यकता है।
rjh
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.