首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Node.js代理,处理gzip DEcompression

Node.js代理,处理gzip DEcompression
EN

Stack Overflow用户
提问于 2011-01-04 22:27:13
回答 1查看 6K关注 0票数 3

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

在大多数情况下,它工作得很好,除了使用gzip作为内容编码的网站(我认为),我遇到了一个名为compress的模块,并试图通过解压缩/ gunzip流来推送我收到的块,但它并没有真正像我预期的那样。(代码见下文)

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

代码语言:javascript
复制
module.exports = {
index: function(request, response){
    var iframe_url = "www.nu.nl"; // site with gzip encoding    

    var http = require('http');     
    var httpClient = http.createClient(80, iframe_url);
    var headers = request.headers;
    headers.host = iframe_url;

    var remoteRequest = httpClient.request(request.method, request.url, headers);

    request.on('data', function(chunk) {
        remoteRequest.write(chunk);
    });

    request.on('end', function() {
        remoteRequest.end();
    });

    remoteRequest.on('response', function (remoteResponse){         
        var body_regexp = new RegExp("<head>"); // regex to find first head tag
        var href_regexp = new RegExp('\<a href="(.*)"', 'g'); // regex to find hrefs

        response.writeHead(remoteResponse.statusCode, remoteResponse.headers);

        remoteResponse.on('data', function (chunk) {
    var body = doDecompress(new compress.GunzipStream(), chunk);
            body = body.replace(body_regexp, "<head><base href=\"http://"+ iframe_url +"/\">");
            body = body.replace(href_regexp, '<a href="#" onclick="javascript:return false;"');             

            response.write(body, 'binary');
        });

        remoteResponse.on('end', function() {

            response.end();
            });
        });
    }
};

在var body部分,我想读取body,例如,在本例中,通过用#替换所有href来删除它们。当然,这里的问题是,当我们有一个gzip编码/压缩的站点时,它都是乱码,我们不能应用regexp。

现在我已经试着去摆弄node-compress模块了:

代码语言:javascript
复制
 doDecompress(new compress.GunzipStream(), chunk);

它指的是

代码语言:javascript
复制
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.toString()提供,它也会因为无效的输入数据而失败。

我想知道我是否在朝着正确的方向前进?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-01-05 00:03:20

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

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4594654

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档