我目前正在开发一个代理服务器,我们在这种情况下必须修改我们推送的数据(使用regexp)。
在大多数情况下它工作正常,除了使用gzip作为内容编码的网站(我认为),我遇到了一个名为compress的模块,并尝试通过解压缩/推送我收到的块gunzip流,但它并没有像我预期的那样真实。 (见下面的代码)
我想发布一些代码来支持我的概率,这是用mvc(express)加载的代理:
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部分我想读取正文,例如在这种情况下,通过用#替换它们来删除所有href。这里的问题当然是当我们有一个gzip编码/压缩的网站时,它都是乱码,我们无法应用正则表达式。
现在我已经厌倦了使用node-compress模块:
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.');
}
但它失败了,因为块输入是一个对象,所以我尝试将它作为chunk.toString()提供,它也因无效的输入数据而失败。
我想知道我是否正朝着正确的方向前进?