• 0

فك ضغط decompress محتوى الطلبات عبر gzip في node.js

في حال تم استخدام gzip وضغط محتوى body للطلبات من خلال node.js، كيف يمكن إعادة فك ضغطها؟

لقد حاولت استخدام الدالة createGunzip كما في التوثيق الرسمي:

switch (response.headers['content-encoding']) {
    case 'br':
      pipeline(response, zlib.createBrotliDecompress(), output, onError);
      break;

    case 'gzip':
      pipeline(response, zlib.createGunzip(), output, onError);
      break;

    case 'deflate':
      pipeline(response, zlib.createInflate(), output, onError);
      break;

    default:
      pipeline(response, output, onError);
      break;
  }

ولكنها لم تنجح، فما هي الطريقة الصحيحة لإجراء ذلك؟

2 اشخاص أعجبوا بهذا

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
شارك على الشبكات الإجتماعية
  • 1

يمكنك فك الضغط من خلال http نفسه عن طريق تخزين فك التشفير في buffer وإضافة الرد response إلى gunzip من خلال pipe كالتالي:

var http = require("http"),
    zlib = require("zlib");

function getGzipped(url, callback) {
    var buffer_stream = [];

    http.get(url, function(res) {
        var gunzip = zlib.createGunzip();            
        res.pipe(gunzip);

        gunzip.on('data', function(data) {
            // إضافة الجزء الجاهز من فك التشفير إلى buffer
            buffer.push(data.toString())

        }).on("end", function() {
            //تجميع الأجزاء وإرسال الرد
            callback(null, buffer.join("")); 

        }).on("error", function(e) {
            callback(e);
        })
    }).on('error', function(e) {
        callback(e)
    });
}

getGzipped(url, function(err, result) {
   console.log(result);
});

كما يمكنك تجنّب ذلك من خلال إضافة خيار encoding: null إلى الطلب request وبذلك ستتجنّب تحويل الجزء الذي يتم تحميله من جسم الطلب body إلى النمط string ويبقى بشكل binary buffer

مثال:

request = require('request');
zlib = require('zlib');

request(url, {encoding: null}, function(err, response, body){
    if(response.headers['content-encoding'] == 'gzip'){
        zlib.gunzip(body, function(err, dezipped) {
            callback(dezipped.toString());
        });
    } else {
        callback(body);
    }
});

 

1 شخص أعجب بهذا

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
شارك على الشبكات الإجتماعية
  • 1

يتعامل الموديول Request مع استجابة gzip. من أجل جعل الموديول request يقوم بفك تشفير وسيطة الجسم body argument في وظيفة رد الاتصال  callback function، يتعين علينا ضبط "gzip" على true في الخيارات. مثال:

var opts = {
  uri: 'some uri which return gzip data',
  gzip: true
}
request(opts, function (err, res, body) {
  //سيحتويان على المحتوى الذي تم فك تشفيره res.body و body ألآن ال 
})

أيضاً هناك مشكلة مماثلة نواجهاها عادةً أثناء العمل مع request module وهي JSON parsing، تحليل JSON. إذا كنت تريد من request module أن يقوم بتحليل ال body تلقائياً وتزويدك بمحتوى JSON في ال body argument. يجب عليك ضبط "json" على true في الخيارات:

var opts = {
  uri:'some uri that provides json data', 
  json: true
} 
request(opts, function (err, res, body) {
  //سيحتويان على المحتوى الذي تم فك تشفيره res.body و body ألآن ال 
})

 

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
شارك على الشبكات الإجتماعية
  • 0

باستخدام got ، وهو بديل ل request ، يمكنك ببساطة القيام بما يلي:

const got  = require("got")

got(url).then(response => {
    console.log(response.body);
});

يتم التعامل مع decompression تلقائيًا عند الحاجة دون الحاجة للتعامل معه بنفسك.

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
شارك على الشبكات الإجتماعية

يجب أن تكون عضوًا لدينا لتتمكّن من التعليق

انشاء حساب جديد

يستغرق التسجيل بضع ثوان فقط


سجّل حسابًا جديدًا

تسجيل الدخول

تملك حسابا مسجّلا بالفعل؟


سجّل دخولك الآن