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

2023-11-30

我目前正在开发一个代理服务器,在这种情况下我们必须修改我们推送的数据(通过使用正则表达式)。

在大多数情况下,它工作得很好,除了使用 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 主体部分,我想读取主体,例如在本例中,通过用 # 替换它们来删除所有 href。当然,这里的问题是,当我们有一个经过 gzip 编码/压缩的网站时,它都是乱码,我们无法应用正则表达式。

现在我已经厌倦了使用节点压缩模块:

 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() 提供,它也会因输入数据无效而失败。

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


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

所以你必须使用chunk.toString('binary')为了使其发挥作用,这也可以在demo.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Node.js代理,处理gzip解压缩 的相关文章

随机推荐

  • addJS 函数对 prestashop 中的管理员不起作用

    我正在尝试使用在 prestashop 管理中添加 javascript 文件backOfficeHeader使用模块挂钩但没有发生任何事情 我的代码如下 public function install if parent install
  • WCF + Json = 错误的序列化

    为什么使用这个 WCF 3 5 方法 ServiceContract AspNetCompatibilityRequirements RequirementsMode AspNetCompatibilityRequirementsMode
  • TextBox - TextChanged 事件 Windows C#

    我遇到了一个问题 需要输入 这是描述 我有一个txtPenaltyDays在 Windows 窗体中 C private void txtPenaltyDays TextChanged object sender EventArgs e i
  • 无法解析的日期异常

    我目前正在做一些简单的项目Java我在以下字符串中有日期 String dateString Sun 7 14 03 44 AM 2013 并想将此字符串转换为Date目的 我正在使用以下代码行来执行此操作 我搜索了网站并找到了如何执行此操
  • 纯 CSS 手风琴问题

    我正在玩一个纯 CSS 手风琴http reversl net accordion 我可以让基本功能正常工作 标题 2 和 3 都可以切换 但是如果我向标题 1 添加相同的 UL 我就无法切换标题 1 因为标题 1 的样式不同 所以问题 我
  • 使用委托垂直居中项目的文本 (PySide/Qt/PyQt)

    我有一个自定义代表QTableView允许显示 编辑 html 字符串 使用QTextDocument 下面有一个 SSCCE 不幸的是 当我使用显示文本时paint 它不是垂直居中的 但似乎顶部对齐 例如 如果我将委托应用于第二列 而不是
  • 框架继承和包中的重复文件

    我一直在使用 TFrames 和 ModelMaker 开发许多组件 我发现视觉设计 开发 继承 ModelMaker 的组合非常引人注目 然后 我使用注册单元注册这些 TFrame 后代 它们从那里成为成熟的基于调色板的组件 我正在使用D
  • mac os Snow Leopard 上的 freeglut 问题(通过 macports 构建得很好)

    我使用的是 mac os 雪豹 gcc 4 5 4 gcc 4 2 1 尝试构建教程http www arcsynthesis org gltut 首先需要构建目录 glsdk 我通过 macports freeglut 2 8 0 1 a
  • CSS SVG 剪辑路径问题 - 不起作用

    我的剪辑路径 css 有问题 当我将剪辑路径放在 css 填充上时 图像不会显示 我在 chrome 上 那么你有什么想法吗 我用这个生成器https 10015 io tools svg blob generator card conte
  • 仅清除部分控制台输出

    我想做的事 光标最初在屏幕左上角闪烁 剩余 160 个字符 当我按 i 时 剩余 159 个字符 i 当我按 a 时 剩余 158 个字符 ia 当我按 m 时 剩余 157 个字符 iam 等等 需要做什么 根据我的说法 只需要清除屏幕的
  • 致命错误:未捕获的 SoapFault 异常:[WSDL]

    我在调用从 PHP 设置的 Web 服务时遇到问题 混淆的地址http XXX XXX XXX XXX test asmx wsdl下面的错误消息中返回有效的 WSDL 我已成功尝试使用 VB net 客户端将其作为 Web 服务调用 但是
  • 简单的 NSTextList 问题

    我正在尝试使用NSTextList以多行显示数字列表NSTextField但它没有按预期工作 使用的示例代码是 IBAction displayResult id sender NSTextList list NSTextList allo
  • C 字符指针

    假设我们有一个指针数组 char ptr 30 现在效果很好 而且似乎没有发生任何意外的事情 我可以轻松输入名字 scanf s ptr 1 scanf s ptr 2 scanf s ptr 3 printf s n ptr 1 prin
  • 如何访问嵌套在 Java 中的 hashmap 和列表中的列表并添加值

    我正在尝试为存储在 HashMap 中并且有一个父列表的列表添加值 当我尝试这样做时 我得到 类型中的方法获取与列表不兼容 我正在尝试以下代码 逻辑是 如果我得到的匹配值tID in the txnValue列表我只是添加 Values 否
  • 依赖基类中的常量使外线定义不匹配?

    template
  • 重载 +/- 一元运算符

    当你重载 一元运算符时 对于不可变类型 你可以这样写 public static Point3 operator Point3 p return new Point3 p X p Y p Z 但是对于 一元运算符 应该如何实现呢 像这样 p
  • QTableWidget列大小调整事件

    我想知道 QTableWidget 的列是否正在通过鼠标调整大小 每当调整任何列的大小时 如何发出信号 列大小调整是通过水平方向执行的QHeaderView 通过调用访问它QTableWidget horizontalHeader cons
  • 如何通过 XSSF 事件 API 评估 Excel 公式

    我正在使用 Apache POI 的事件 API 读取 XLSX 文件 即我通过 SAX 解析器读取 XLSX 表的内容 我想知道如何使用 XSSF 事件 API 获取公式的计算值 我知道做到这一点的方法是使用FormulaEvaluato
  • Rails - 如何存储像 100000076685963 这样的大数字

    我需要存储大量数字 例如 100000076685963 对于整数的数据库字段类型来说太大了 在我的数据库迁移中我使用 t integer fb uid 对于这样的大数字我应该使用什么字段类型 Thanks 您可以使用定点数据类型 例如具有
  • Node.js代理,处理gzip解压缩

    我目前正在开发一个代理服务器 在这种情况下我们必须修改我们推送的数据 通过使用正则表达式 在大多数情况下 它工作得很好 除了使用 gzip 作为内容编码的网站 我认为 我遇到过一个名为compress并尝试通过解压缩 gunzip流推送我收