التعامل بشفافية مع محتوى GZip المشفر باستخدام WWW::Mechanize

StackOverflow https://stackoverflow.com/questions/874262

سؤال

أنا أستخدم WWW::Mechanize وأتعامل حاليًا مع استجابات HTTP باستخدام "Content-Encoding: gzip' في الكود الخاص بي عن طريق التحقق أولاً من رؤوس الاستجابة ثم استخدام IO::Uncompress::Gunzip للحصول على المحتوى غير المضغوط.

ومع ذلك، أود القيام بذلك بشفافية حتى تعمل أساليب WWW::Mechanize مثل form() وlinks() وغيرها على المحتوى غير المضغوط وتحليله.نظرًا لأن WWW::Mechanize هي فئة فرعية من LWP::UserAgent، فإنني أفضل استخدام LWP::UA::معالجات لفعل هذا.

على الرغم من نجاحي جزئيًا (يمكنني طباعة المحتوى غير المضغوط على سبيل المثال)، إلا أنني غير قادر على القيام بذلك بشفافية بطريقة يمكن أن أسميها

$mech->forms();

في ملخص:كيف يمكنني "استبدال" المحتوى الموجود داخل كائن $mech بحيث تعمل جميع أساليب WWW::Mechanize من تلك النقطة فصاعدًا كما لو أن ترميز المحتوى لم يحدث أبدًا؟

وسأكون ممتنا اهتمامكم ومساعدتكم.شكرًا

هل كانت مفيدة؟

المحلول

WWW :: :: يمكنن غزيب ، على ما أعتقد.

نصائح أخرى

ويبدو لي مثلك يمكن الاستعاضة عنها باستخدام عضو $ التنفسية> المحتوى ($ بايت).

وبالمناسبة، لقد وجدت هذه الاشياء من خلال النظر في مصدر LWP :: وكيل المستخدم، ثم HTTP :: الاستجابة، ثم <وأ href = "https://metacpan.org/pod/HTTP::Message" يختلط = "نوفولو noreferrer"> HTTP :: رسالة .

إنه مدمج مع UserAgent وبالتالي المكننة. تحذير رئيسي واحد ليوفر لك بعض الشعر

- لتصحيح الأخطاء، تأكد من التحقق من وجود خطأ $@ بعد استدعاء decoded_content.

$html = $r->decoded_content;
die $@ if $@;

والأفضل من ذلك، أن تبحث في مصدر HTTP::Message وتأكد من وجود جميع حزم الدعم

في حالتي، أعاد decoded_content undef بينما كان المحتوى ثنائيًا خامًا، وذهبت في مطاردة جامحة.سيقوم UserAgent بتعيين علامة خطأ عند الفشل في فك التشفير، لكن Mechanize ستتجاهلها فقط (لا تتحقق من حدوث الحادث أو تسجله باعتباره خطأ/تحذيرًا خاصًا بها).

في حالتي $@ sez:"لا يمكن العثور على IO/HTML.pm ..لقد تم تقييمه

بعد الاضطرار إلى الغوص في المصدر، اكتشفت أن عملية فك التشفير المضمنة طويلة ودقيقة وشاقة، وتغطي كل السيناريوهات تقريبًا وتقوم بالكثير من التخمينات (شكرًا لك جيزل!).

إذا كنت مصابًا بجنون العظمة، فقم بتعيين الرأس الافتراضي بشكل صريح ليتم استخدامه مع كل طلب في new()

    $browser = new WWW::Mechanize('default_headers' => HTTP::Headers->new('Accept-Encoding' 
                            => scalar HTTP::Message::decodable()));
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top