websocket - 有没有办法使 Dart 服务器 websocket 实现与 Phantom 1.9.7 headless 浏览器(另一个 websocket 标准)兼容?

标签 websocket dart phantomjs rfc6455

根据WebSocketTransformer文档,它说它尝试升级 HttpRequests根据RFC6455网络套接字标准:

This transformer strives to implement web sockets as specified by RFC6455.

并提供了这个 Dart 示例代码:

HttpServer server;
server.listen((request) {
  if (...) {
    WebSocketTransformer.upgrade(request).then((websocket) {
      ...
    });
  } else {
    // Do normal HTTP request processing.
  }
});

现在,如果您搜索 PhantomJS 的问题跟踪器,您可以找到问题:

11018 Update to final websocket standard

这基本上表明最新的 PhantomJS (1.9.7) 使用旧的 Web 套接字标准(我仍然不知道哪个版本发送 Sec-WebSocket-Key1 信息,但我假设它不是 RFC6455 版本)。

基本上,我的问题是,当我在使用 Dart 1.3.3、websocket 服务器实现(基本上是我上面粘贴的一些升级代码)的网站上运行 PhantomJS headless 浏览器时,它会显示:

来自 PhantomJS 的 header :

sec-websocket-key1: 327J w6iS/b!43 L2j5}2 2
connection: Upgrade
origin: http://mydomain.com
upgrade: WebSocket
sec-websocket-key2: 42 d 7 64 84622
host: mydomain.com

Dart :

WebSocketTransformer.isUpgradeRequest(request) = false

WebSocketException: Invalid WebSocket upgrade request

请求升级失败(我认为是因为版本不匹配)。

我的问题是,在 Phantom JS 更新到 2.0 之前,有没有办法修复我的 Dart 后端,使其也能处理 PhantomJS websockets?

根据WebSocketTransformer的文档,升级函数有两个参数,一个 HttpRequest 强制参数,第二个可选参数:

static Future<WebSocket> upgrade(HttpRequest request, {Function protocolSelector(List<String> protocols)})

这可能对我有帮助吗?

最佳答案

这些协议(protocol)对你没有帮助。这些允许就握手后用于通信的特殊协议(protocol)达成一致。但您无法修改握手和交换字段本身。

你可以做的是制作一个完整的自己的 websocket 实现(直接基于 Dart HTTP 和 TCP),与 PhantomJS 使用的旧实现相匹配。但这不适用于新客户。通过这种方式,您还可以实现支持多个版本的实现(通过在收到握手 HTTP 请求时检查 header 并根据握手转发到另一个实现。

您至少必须执行自己的 WebSocketTransformer 实现。为此,您可以从复制 Darts 接口(interface)和实现开始,并在您需要的所有位置对其进行修改(检查许可证)。如果握手后的实际 WebSocket 行为在两个 RFC 中兼容,您可以重用 Darts WebSocket 类。如果情况并非如此(其他框架等),那么您还必须创建自己的 WebSocket 类。

一些基于您的伪代码:

HttpServer server;
server.listen((request) {
  if (...) { // websocket condition
    if (request.headers.value("Sec-WebSocket-Key1") != null) {
      YourWebSocketTransformer.upgrade(request).then((websocket) {
        ... // websocket might need to be a different type than Dart's WebSocket
      });
    } 
    else {
      WebSocketTransformer.upgrade(request).then((websocket) {
        ...
      });
    }
  }
  else {
    // Do normal HTTP request processing.
  }
});

我不知道您的应用程序,但这可能不值得付出努力。将旧的 websocket 实现引入 Dart 可能与将官方实现引入 PhantomJS 的工作量相同。因此我认为修复 PhantomJS 应该是首选。

关于websocket - 有没有办法使 Dart 服务器 websocket 实现与 Phantom 1.9.7 headless 浏览器(另一个 websocket 标准)兼容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24222472/

相关文章:

python - 如何从异步函数发送 websocket.send() 数据

rest - 向服务器发送数据时的Websocket vs REST

dart - Assets 文件夹中的 Flutter Excel 工作表

flutter - 如何使Fluke的Custom拇指图杆出现?

javascript - 是否可以捕获并记录我自己的 Websocket (wss) 流量

javascript - Phantomjs打不开网页

node.js - 调用 node app.js 时出错,[node js socket io]如何修复?

Heroku 上的 Node.js Socket.io 抛出 H13

html - AngularDart - 使用表单操作

jquery - PhantomJs 脚本中的 Ajax 请求