Proxy Node.js代理,处理gzip解压缩

Proxy Node.js代理,处理gzip解压缩,proxy,compression,gzip,node.js,content-encoding,Proxy,Compression,Gzip,Node.js,Content Encoding,我目前正在一个代理服务器上工作,在这种情况下,我们必须(通过使用regexp)修改推送的数据 在大多数情况下,它工作正常,除了使用gzip作为内容编码的网站(我想),我遇到了一个名为的模块,并试图通过解压/gunzip流推送我收到的块,但结果并不像我预期的那样。(代码见下文) 我想我会发布一些代码来支持我的prob,这是使用mvc(express)加载的代理: 指的是 function doDecompress(decompressor, input) { var d1 = input.su

我目前正在一个代理服务器上工作,在这种情况下,我们必须(通过使用regexp)修改推送的数据

在大多数情况下,它工作正常,除了使用gzip作为内容编码的网站(我想),我遇到了一个名为的模块,并试图通过解压/gunzip流推送我收到的块,但结果并不像我预期的那样。(代码见下文)

我想我会发布一些代码来支持我的prob,这是使用mvc(express)加载的代理:

指的是

function doDecompress(decompressor, input) {
  var d1 = input.substr(0, 25);
  var d2 = input.substr(25);

  sys.puts('Making decompression requests...');
  var output = '';
  decompressor.setInputEncoding('binary');
  decompressor.setEncoding('utf8');
  decompressor.addListener('data', function(data) {
    output += data;
  }).addListener('error', function(err) {
    throw err;
  }).addListener('end', function() {
    sys.puts('Decompressed length: ' + output.length);
    sys.puts('Raw data: ' + output);
  });
  decompressor.write(d1);
  decompressor.write(d2);
  decompressor.close();
  sys.puts('Requests done.');
}
但是它失败了,因为chunk输入是一个对象,所以我尝试将其作为chunk.toString()提供,这也会导致输入数据无效


我想知道我的方向是否正确?

解压器需要二进制编码的输入。您的响应接收的块是一个实例,
toString()
方法默认情况下会返回一个UTF-8编码的字符串


因此,您必须使用
chunk.toString('binary')
使其工作,这也可以在中看到。

感谢您的回复,但是当我将其更改为:var body=doDecompress(new compress.GunzipStream(),chunk.toString('binary');它仍然会在doDecompress函数的第17行抛出错误,并显示“输入数据已损坏”您的输入是否已分块编码?如果没有,则需要在解压缩之前缓冲整个主体。因此,您需要将
块添加到一起。toString('binary')
并在
结束
回调中调用解压器。感谢您,似乎确实是这个问题,我必须将它们添加到一个变量中,并在最后执行解压。看来我现在可以做我想做的了,非常感谢!我现在唯一的问题是,当我将输出输出到控制台时,我确实得到了完整的html,但出于某种原因,只有一半的站点在响应中写入时才会显示出来。在解压器的“end”回调->proxysponse.end(输出)中执行此操作;node-v返回v0.2.5,我的意思是浏览器中显示了站点的一半*
 doDecompress(new compress.GunzipStream(), chunk);
function doDecompress(decompressor, input) {
  var d1 = input.substr(0, 25);
  var d2 = input.substr(25);

  sys.puts('Making decompression requests...');
  var output = '';
  decompressor.setInputEncoding('binary');
  decompressor.setEncoding('utf8');
  decompressor.addListener('data', function(data) {
    output += data;
  }).addListener('error', function(err) {
    throw err;
  }).addListener('end', function() {
    sys.puts('Decompressed length: ' + output.length);
    sys.puts('Raw data: ' + output);
  });
  decompressor.write(d1);
  decompressor.write(d2);
  decompressor.close();
  sys.puts('Requests done.');
}