سؤال

هل يعرف أي شخص كيفية إلغاء ضغط محتويات ملف GZIP الذي حصلت عليه مع حليقة؟

علي سبيل المثال: http://torcache.com/torrent/63abc1435aa5cd48dcd866c6f7d5e8076034391.torrent

استجاب

HTTP/1.1 200 OK
Server: nginx
Date: Wed, 09 Jun 2010 01:11:26 GMT
Content-Type: application/x-bittorrent
Content-Length: 52712
Last-Modified: Tue, 08 Jun 2010 15:09:58 GMT
Connection: keep-alive
Expires: Fri, 09 Jul 2010 01:11:26 GMT
Cache-Control: max-age=2592000
Content-Encoding: gzip
Accept-Ranges: bytes

ثم Gzip المضغوط ،

لقد جربت GZDecode لكن لا يعمل ، Gzeflate أيضًا ، لا يحصلون ببساطة على أي استجابة ، ومحتويات الملفات ليست أكثر من 2K

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

المحلول

يستخدم gzdecode:

<?php
    $c = file_get_contents("http://torcache.com/" .
        "torrent/63ABC1435AA5CD48DCD866C6F7D5E80766034391.torrent");
    echo gzdecode($c);

يعطي

d8:announce42:http://tracker.openbittorrent.com/announce13:announce-listll42
...

نصائح أخرى

فقط أخبر Curl بفك تشفير الاستجابة تلقائيًا كلما تم تجهيزه

curl_setopt($ch,CURLOPT_ENCODING, '');

يقدم Libcurl ميزة تجعلها تخفض ضغط المحتويات تلقائيًا (إذا تم تصميمها باستخدام ZLIB).

انظر خيار Curlopt_encoding: http://curl.haxx.se/libcurl/c/curl_easy_setopt.html#curloptencoding

هل حاولت تعيين الرأس قائلاً إنك تقبل تشفير GZIP على النحو التالي؟:

curl_setopt($rCurl, CURLOPT_HTTPHEADER, array('Accept-Encoding: gzip,deflate'));

مع غلاف دفق Zlib:

file_get_contents("compress.zlib://http://torcache.com/" .
    "torrent/63ABC1435AA5CD48DCD866C6F7D5E80766034391.torrent");

هل جربت gzuncompress أو gzinflate?

gzdeflate ضغط, ، عكس ما تريد. لأكون صادقًا ، لا يمكنني معرفة كيف gzdecode يختلف عن عدم الضغط الطبيعي.

هناك أيضًا خيار حليقة CURLOPT_ENCODING:

محتويات "القبول ترميز:" رأس. هذا يتيح فك تشفير الاستجابة. الترميزات المدعومة هي "الهوية" و "Deflate" و "GZIP". إذا تم تعيين سلسلة فارغة ، "" ، يتم إرسال رأس يحتوي على جميع أنواع الترميز المدعومة.

يبدو أن هذا سيؤدي إلى إلغاء ضغط الاستجابة تلقائيًا ، لكنني لم أختبر ذلك.

يمكنك القيام بذلك باستخدام gzinflate (التظاهر بأن رؤوس $ تحتوي على جميع رؤوس HTTP الخاصة بك ، ويحتوي العازلة $ على بياناتك):

if (isset($headers['Content-Encoding']) && ($headers['Content-Encoding'] === 'gzip' || $headers['Content-Encoding'] === 'deflate'))
    {
        if ($headers['Content-Encoding'] === 'gzip')
        {
            $buffer = substr($buffer, 10);
        }
        $contents = @gzinflate($buffer);
        if ($contents === false)
        {
            return false;
        }
    }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top