معالجة HTTP Contentencoding "Deflate"
-
30-09-2019 - |
سؤال
ماذا او ما تيار الإدخال يجب استخدام النوع للتعامل مع تدفقات urlconnection التي تحتوي على HTTP ترميز المحتوى ضبط ل انحراف?
للحصول على ترميز المحتوى من GZIP أو ZIP ، أستخدم gzipinputstream ، لا توجد مشكلة.
للحصول على ترميز محتوى لـ "Deflate" لقد حاولت استخدامها InflaterInputStream و deflaterinputstream لكني أحصل
java.util.zip.zipexception: طريقة ضغط غير معروفة في java.util.zip.inflaterinputstream.read (inflaterinputstream.java:147)
ما أفهمه هو أن ترميز "انكماش" يشير إلى زلب الضغط ، ووفقا ل مستندات يجب التعامل مع هذا من قبل inflaterinputStream.
المحلول
في HTTP/1.1 ، Content-encoding: deflate
يشير في الواقع إلى خوارزمية الضغط المنهارة ، على النحو المحدد بواسطة RFC 1951, ، ملفوفة بتنسيق بيانات ZLIB ، على النحو المحدد بواسطة RFC 1950.
ومع ذلك ، يقوم بعض البائعين بتنفيذ خوارزمية المنهارة على النحو المحدد RFC 1951 ، متجاهلين تمامًا RFC 1950 (لا رؤوس Zlib).
لقد أصيب آخرون بنفس القضية:
من أجل العمل حول هذا ، حاول إنشاء مثيل InflaterInputStream
تمرير Inflater
التي تم إنشاؤها مع nowrap
المعلمة تعيين إلى true
:
in = new InflaterInputStream(conn.getInputStream()), new Inflater(true));
نصائح أخرى
لسوء الحظ ، فإن استخدام InflaterInputStream مع كائن Inflater لم ينتج دائمًا الضغط الصحيح. اضطررت إلى اكتشاف الرؤوس وأخبر Inflater حيث كانت الإزاحة إلى الحمولة.
http://thushw.blogspot.com/2014/05/decoding-html-pages-with-content.html