2011-08-01 9 views
0

gzipped jsonファイルをhttp://api.discogs.com/release/339901から取得しようとしています。Node.js Gzip inflating - node-compress

https://github.com/waveto/node-compressがインストールされていますが、スタックオーバーフローAPIをリクエストするとすべて正常に動作しますが、ディスコグをリクエストしようとするとエラーが発生します。

Assertion failed: (ret != Z_STREAM_ERROR), function GunzipInflate, file ../compress.cc, line 271. 
Abort trap: 6 

コード:

var options = { 
     host: 'api.discogs.com', 
     port: 80, 
     path: '/release/339901', 
     headers: { 
      "Accept-Encoding": "gzip" 
     } 
    }; 

    var options = { 
     host: 'api.stackoverflow.com', 
     port: 80, 
     path: '/1.1/questions', 
     headers: { 
      "Accept-Encoding": "gzip" 
     } 
    } 

    http.get(options, function(res){ 

     var body = []; 
     var gunzip = new compress.Gunzip(); 
     gunzip.init(); 

     res.setEncoding('binary'); 

     res.on('data', function(chunk){ 
      body.push(gunzip.inflate(chunk, 'binary')); 
     }); 

     res.on('end', function(){ 
      gunzip.end(); 
      callback(null, JSON.parse(body.join('')), response); 
     }); 

     res.on('error', function(e){ 
      callback(e, null, response); 
     }); 

    }); 



function callback(err, data, res) { 
    if(err) { 
     console.log(err); 
    } 
    else { 
     res.end(JSON.stringify(data)); 
    } 
} 

任意のアイデア?

UPDATE:

彼らはそれはgzip圧縮され、送信されていないようです。ここに私が最終的に使用したものがあります。

var options = { 
     host: 'api.discogs.com', 
     port: 80, 
     path: '/release/339901', 
     headers: { 
      "Accept-Encoding": "gzip" 
     } 
    }; 

    http.get(options, function(getRes){ 
     var body = ""; 

     getRes.on('data', function(chunk){ 
      body = body + chunk; 
     }); 

     getRes.on('end', function(err, data){ 
      res.end(body); 
     }); 
    }); 

答えて

3

api.discogs.comがgzipでエンコードされた応答を返さないようです。

は、あなたが最初にコンテンツエンコードヘッダチェックする必要があります:gzipでエンコードされたレスポンスを尋ねる

if (res.headers['content-encoding'] === 'gzip') { ... } 

を(「エンコード同意する」:「GZIPを」)、それを保証するものではありません。

あなたはそれをこのように確認することができます。

console.log(JSON.stringify(res.headers)); 

res.on('data', function(chunk){ 
    console.log(chunk.toString()); 
}); 
+0

をそれが問題だったようにはい、見えます。あなたが "Accept-Encoding": "gzip"でリクエストしてから、gzipではなく送信した場合にのみ応答を送信するというのは奇妙です。私は使用し終わったものを更新しました。ありがとう。 – bradley

関連する問題