Proxy Node.js代理,处理gzip解压缩
我目前正在一个代理服务器上工作,在这种情况下,我们必须(通过使用regexp)修改推送的数据 在大多数情况下,它工作正常,除了使用gzip作为内容编码的网站(我想),我遇到了一个名为的模块,并试图通过解压/gunzip流推送我收到的块,但结果并不像我预期的那样。(代码见下文) 我想我会发布一些代码来支持我的prob,这是使用mvc(express)加载的代理: 指的是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
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.');
}