اذهب إلى المحتوى
  • 0

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

Bassel Jhr

السؤال

في حال تم استخدام 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;
  }

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

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

Recommended Posts

  • 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

يتعامل الموديول 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 تلقائيًا عند الحاجة دون الحاجة للتعامل معه بنفسك.

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

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...