当前位置: 首页 > 面试题库 >

覆盖Node.js HTTP解析器

阎功
2023-03-14
问题内容

http.request()在正常的HTTP服务器上使用Node的基本功能没有问题。我需要对http.request()SHOUTcast服务器使用(或类似方法)。SHOUTcast“协议”与HTTP完全兼容,除了一个细节外……第一个响应行。

普通HTTP服务器的响应为:

HTTP/1.1 200 OK

SHOUTcast服务器响应:

ICY 200 OK

同样,其余协议相同。唯一的区别是HTTP/1.xICY

我想扩展,子类化或以某种方式修改Node的http.request()功能,以便可以使其与SHOUTcast服务器一起使用。使用Node连接到SHOUTcast
之前已经完成,但是只能通过重新发明整个轮子来完成。我宁愿不这样做,因为这只是协议的微小差异。

我的问题:是否可以执行以下任一操作?

  1. 扩展或覆盖 Node的HTTP解析器的相关部分。(我怀疑这是否可行,因为解析器似乎是本机代码。)

  2. 创建我自己 的代码,解析HTTP的相关部分,但将尽可能多的现有Node组件重用于HTTP。

  3. 创建一个简单的内部代理 (或以某种方式中继数据),以便我可以在第一个服务器响应行到达Node的HTTP解析器之前对其进行修改。

  4. 还有吗

我也考虑过使用Shred,但是它没有提供流响应的选项。(它会在触发事件之前等待整个服务器响应完成,这对于数据可以无限期运行的流服务器不起作用。)同样,我尝试了Request,但是它使用Node自己的HTTP解析器,因此我得到与本机HTTP客户端相同的解析错误。


问题答案:

我想出了另一种方式来做到这一点,类似于内部代理,但没有额外的连接。似乎可以为HTTP客户端覆盖内部使用的套接字。完成此操作后,在将数据传递给原始内部套接字ondata功能之前,很容易挂接和修改数据。

用法

var httpicy = new HttpIcyClient();
httpicy.request(/* your normal request parameters here */);

资源

var http = require('http');

var HttpIcyClient = function () {};
HttpIcyClient.prototype.request = function (options, callback) {
    var req = http.request(options, callback),
        originalOnDataFunction,
        receiveBuffer = new Buffer(0);

    req.on('socket', function (socket) {
        originalOnDataFunction = socket.ondata;
        socket.ondata = function (d, start, end) {
            receiveBuffer = Buffer.concat([receiveBuffer, d.slice(start, end)]);
            if (receiveBuffer.length >= 4) {
                socket.ondata = originalOnDataFunction;
                if (receiveBuffer.toString('ascii', 0, 4) === 'ICY ') {
                    receiveBuffer = Buffer.concat([new Buffer('HTTP/1.0 ', 'ascii'), receiveBuffer.slice(4)]);
                }
                socket.ondata.apply(this, [receiveBuffer, 0, receiveBuffer.length]);
            }
        };
    });
    return req;
}


 类似资料:
  • 本文向大家介绍Java方法覆盖重写实现原理解析,包括了Java方法覆盖重写实现原理解析的使用技巧和注意事项,需要的朋友参考一下 这篇文章主要介绍了Java方法覆盖重写实现原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 方法覆盖重写注意事项:   1.必须保证方法名相同,返回值也相同    @Override:写在方法前面,用来检测方法的覆

  • 现代CameraX API围绕用例展开(预览、拍照和图像分析)。然而,根据我的观察和文档,ImageAnalysis似乎武断地限制在1080: 图像分析可以选择的最大可用分辨率限制在1080p以下。对于图像分析来说,1080p的限制考虑了性能和质量两方面的因素,使用户在1080p下可以获得质量合理、平滑的输出流。

  • 本文向大家介绍解析Java继承中方法的覆盖和重载,包括了解析Java继承中方法的覆盖和重载的使用技巧和注意事项,需要的朋友参考一下 方法的覆盖 在类继承中,子类可以修改从父类继承来的方法,也就是说子类能创建一个与父类方法有不同功能的方法,但具有相同的名称、返回值类型、参数列表。   如果在新类中定义一个方法,其名称、返回值类型和参数列表正好与父类中的相同,那么,新方法被称做覆盖旧方法。   参数列

  • 问题内容: 看一下下面的代码,它显示列表理解。 当您在 Python 2.6中 执行代码示例时,它将显示 99 ,但是在 Python 3.x中 执行它时,将显示 6 。 更改行为的原因是什么,为什么 Python 3.x中 的输出 6 是? __ 先感谢您! 问题答案: 旧的行为是一个错误,但是由于某些代码依赖于此,因此无法轻松修复。 列表推导中的变量应与顶层变量不同。从逻辑上讲,它应该有自己的

  • 问题内容: 我们很少有扩展基本类的类。我们注意到我们使用了“退出一些睡眠”方法,并且希望在发生睡眠时进行记录。有没有一种方法可以覆盖Thread.sleep方法,在其中我可以添加一些自定义逻辑(即记录),然后仅调用实际的Thread.sleep()?这样,我就不必更改在我的基类中使用Thread.sleep的所有位置。我也愿意接受其他选择。 问题答案: 您不能重写方法,因为它是本机方法,所以无法对

  • 我正在开发一个Spring集成/引导应用程序。我正在使用一个多文档(src/main/Resources/application.yml)来设置几个配置类的默认值(用@ConfigurationProperties注释)。pplicaiton.yml带有默认值,其中一些需要被覆盖,具体取决于环境。 我可以在目录中使用Java系统属性(-D...=...)、Spring“属性”(--...=...)