【问题标题】:Streaming a Continous HTTP Response through Node通过节点流式传输连续的 HTTP 响应
【发布时间】:2017-03-13 00:50:35
【问题描述】:

我正在尝试使用 NodeJS 服务器充当客户端和 IP 摄像机之间的代理。当我从摄像头请求实时流时,它会响应

HTTP/1.0 200 OK
Content-Type: Application/octet-stream

接着是连续的数据流。如果我在 Chrome 中打开相机流,它会启动一个永无止境的下载,并且 curl 它也会启动一个持续响应。

Node 似乎正在缓冲来自摄像头的响应,并每次都通过其 HTTP 解析器对其进行解析。这第一次工作正常,因为它具有正确的标头,但在第二个数据缓冲区时它会出错

HPE_INVALID_HEADER_TOKEN

有人可以帮忙解释一下为什么会这样吗?这是一个连续的数据流,为什么要解析第二个缓冲区上的 HTTP 标头?我不确定是否缺少某个选项,或者我的相机没有正确遵循 HTTP 规范。

编辑:示例代码

const options = {
    family: 4,
    headers: {
        Authorization: 'Basic ' + base64EncodedAuth,
    },
    host: '192.168.1.131',
    method: 'GET',
    path: '/cgi-bin/realmonitor.cgi?action=getStream&channel=1&subtype=0',
    port: 80,
    protocol:'http:',
};


const req = http.request(options, (res) => {
    console.log(`STATUS: ${res.statusCode}`);
    console.log(`HEADERS: ${JSON.stringify(res.headers)}`);
    res.on('data', (chunk) => {
        console.log(`BODY: ${chunk}`);
    });
    res.on('end', () => {
        console.log('No more data in response.');
    });
});

req.on('error', (e) => {
    console.log(`problem with request: ${e.message}`);
});

req.end();

唯一被命中的回调是“错误”。

【问题讨论】:

  • 您能否向我们展示您的 node.js 代码,以便我们了解您实际在做什么。有关代码的问题应始终包含您的代码。我猜您想通过管道传输响应,以便只要发送新数据,它就会继续运行。
  • 我添加了示例代码。最初,我使用的是请求包并通过管道传输响应,但在传输任何响应之前我遇到了同样的错误。
  • 不能通过原始tcp或udp套接字获取数据吗?我想你不会有 HTTP 解析的问题。
  • 你说唯一被命中的回调是错误回调。那么当error被命中时,报错信息是什么?
  • @LuizFernandodaSilva - 这是我的下一个计划,我只是好奇为什么我会在 HTTP 解析中看到这种行为。

标签: node.js http npm stream request


【解决方案1】:

我进一步检查了相机的 curl 日志,发现所有内容都被标记为:

<= Recv header

它永远不会发送 HTTP 规范要求的单独的 CRLF 来表示所有标头都已发送。这就是解析器试图将其解析为标头并抛出错误的原因。

【讨论】:

  • 我在向旧版 http 服务器请求响应时遇到了类似的问题,该响应没有标头(只是 HTTP 0.9 响应)。它确实会引发 HTTP 解析错误。我真的使用原始套接字解决了它......
猜你喜欢
  • 2013-08-20
  • 1970-01-01
  • 2016-12-21
  • 2018-02-19
  • 1970-01-01
  • 1970-01-01
  • 2017-08-17
  • 2012-03-30
  • 1970-01-01
相关资源
最近更新 更多