কার্ল ব্যবহার করার সময় কীভাবে কোনও জিপিড পৃষ্ঠা সঠিকভাবে পরিচালনা করবেন?


139

আমি একটি বাশ স্ক্রিপ্ট লিখেছিলাম যা কার্ল ব্যবহার করে কোনও ওয়েবসাইট থেকে আউটপুট পায় এবং এইচটিএমএল আউটপুটটিতে স্ট্রিং ম্যানিপুলেশন করে। সমস্যাটি যখন আমি কোনও সাইটের বিরুদ্ধে চালিত করি যা তার আউটপুট জিপিড ফিরে দিচ্ছে। ব্রাউজারে সাইটে যাওয়া ঠিক কাজ করে।

আমি যখন হাত দিয়ে কার্ল চালাই তখন আমি জিপিপড আউটপুট পাই:

$ 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

আমি জানি যে ফিরে আসা ডেটা জিপিপড, কারণ এটি প্রত্যাশা অনুযায়ী এইচটিএমএল ফেরত দেয়:

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

আমি গানজিপের মাধ্যমে আউটপুটটি পাইপ করতে চাই না, কারণ স্ক্রিপ্টটি অন্য সাইটগুলিতে যেমন রয়েছে তেমন কাজ করে, এবং জিজিপের মাধ্যমে পাইপিং করা সেই কার্যকারিতাটি ভেঙে দেবে।

আমি কি চেষ্টা করেছি

  1. ব্যবহারকারী-এজেন্ট পরিবর্তন করা (আমি আমার ব্রাউজারটি "মোজিলা / 4.0" প্রেরণের একই স্ট্রিংটি চেষ্টা করেছি)
  2. ম্যান কার্ল
  3. Google অনুসন্ধান
  4. স্ট্যাকওভারফ্লো অনুসন্ধান

সবকিছু খালি উঠে এল

কোন ধারনা?


আমার জন্য, সমস্যাটি হ'ল সিআরএল ব্রটলি ( 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/...
নিনো Škopac

উত্তর:


260

curlআপনি --compressedপতাকাটি সেট করলে স্বয়ংক্রিয়ভাবে প্রতিক্রিয়াটি সঙ্কোচিত করবে :

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

--compressed (HTTP) একটি অ্যালগোরিদম লাইবকার্ল সমর্থন সমর্থন করে একটি সঙ্কোচিত প্রতিক্রিয়া অনুরোধ করুন, এবং সঙ্কুচিত নথিটি সংরক্ষণ করুন। যদি এই বিকল্পটি ব্যবহার করা হয় এবং সার্ভারটি একটি অসমর্থিত এনকোডিং প্রেরণ করে তবে কার্ল একটি ত্রুটির প্রতিবেদন করবে।

gzip সম্ভবত সমর্থিত তবে আপনি "বৈশিষ্ট্যগুলি" রেখার কোথাও কোথাও লাইবস চালিয়ে curl -Vএবং এটি পরীক্ষা করে দেখতে পারেন :

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

মনে রাখবেন যে এটি সত্যই এখানে প্রশ্নযুক্ত ওয়েবসাইট যা এখানে ত্রুটিযুক্ত। যদি curlএকটি Accept-Encoding: gzipঅনুরোধ শিরোনাম পাস না করে , সার্ভারের একটি সংকুচিত প্রতিক্রিয়া প্রেরণ করা উচিত নয়।


24
এটি কার্ল বাগ হিসাবে উপস্থিত হবে, কারণ এটির প্রতিক্রিয়ার ভিত্তিতে এর ডিকোডিংটি ট্রিগার করা উচিত, এটি যা অনুরোধ করেছিল তার ভিত্তিতে নয় (প্রদত্ত যে এটি জিজিপ সমর্থন করে)। এইচটিটিপি 1.1 এর উদ্ধৃতি দিতে: "যদি কোনও অনুরোধে কোনও স্বীকৃতি-এনকোডিং ক্ষেত্র উপস্থিত না থাকে তবে সার্ভারটি ধরে নিতে পারে যে ক্লায়েন্ট কোনও সামগ্রী কোডিং গ্রহণ করবে accept" তবে এটি বলার অপেক্ষা রাখে না যে সেই ক্ষেত্রে সার্ভারগুলি সামগ্রীটি এনকোড না করে, হুম, ফিগার যেতে হবে go
জর্জ লন্ড

আসলে আমার সংস্করণে কাজ করে
রাদু টডার

3
এটি অনুরোধ শিরোনামটিও সেট করে: "স্বীকৃতি-এনকোডিং: ডিফল্ট, জিজিপ" যেহেতু সার্ভার জিজিপ এবং কোনও জিজিপ পরিবেশন করে না, আপনার কেবল
সংক্ষেপিত

1 মিনিটের মধ্যে এই সমাধানটি দিয়ে আমার কিউএকে সহায়তা করুন! ধন্যবাদ ! এটি বলেছিল, আমার অ্যাপ্লিকেশনটি আসলে সামগ্রী-এনকোডিংয়ের সাথে জিজিপ প্রতিক্রিয়া পাঠাচ্ছে: জিজিপ। ব্রাউজার এবং আধুনিক সরঞ্জামগুলি (যেমন httpie) স্বয়ংক্রিয়ভাবে এটিকে পরিচালনা করে। আমার ধারণা কার্লটির কেবল "ইঙ্গিত" দরকার
ফারাওয়ে

আশ্চর্যজনকভাবে, সেটিংটি Accept-Encoding: deflate, gzipপর্যাপ্ত নয় - এমনকি সার্ভারের সাথে একটি Content-Encoding: gzipগিজিপ প্রতিক্রিয়া ফিরিয়ে দেওয়া হলেও কার্ল স্বয়ংক্রিয়ভাবে এটি বাতিল করে দেবে না। --compressedপতাকা প্রয়োজন।
rjh
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.