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

有没有办法使Dart服务器websocket实现与Phantom 1.9.7无头浏览器(另一种websocket标准)兼容?,websocket,dart,phantomjs,rfc6455,Websocket,Dart,Phantomjs,Rfc6455,根据文档,它说它试图按照web套接字标准进行升级: 此转换器努力实现RFC6455指定的web套接字 并提供以下Dart示例代码: HttpServer服务器; 侦听((请求){ 如果(…){ 升级(请求)。然后((websocket){ ... }); }否则{ //执行正常的HTTP请求处理。 } }); 现在,如果您搜索PhantomJS的问题跟踪器,您可以找到问题: 基本上说,最新的PhantomJS(1.9.7)使用了一个旧的web套接字标准(我还没有弄清楚哪个版本发送了Sec-W

根据文档,它说它试图按照web套接字标准进行升级:

此转换器努力实现RFC6455指定的web套接字

并提供以下Dart示例代码:

HttpServer服务器;
侦听((请求){
如果(…){
升级(请求)。然后((websocket){
...
});
}否则{
//执行正常的HTTP请求处理。
}
});
现在,如果您搜索PhantomJS的问题跟踪器,您可以找到问题:

基本上说,最新的PhantomJS(1.9.7)使用了一个旧的web套接字标准(我还没有弄清楚哪个版本发送了
Sec-WebSocket-Key1
信息,但我假设它不是RFC6455版本)

因此,基本上,我的问题是,当我对使用Dart 1.3.3、websocket服务器实现的站点运行PhantomJS headless browser(基本上是我上面粘贴的一些升级代码)时,它会说:

来自PhantomJS的标题:

sec-websocket-key1:327J w6iS/b!43 L2j5}2 2
连接:升级
来源:
升级:WebSocket
sec-websocket-key2:42 d 7 64 84622
主持人:mydomain.com

省道:

WebSocketTransformer.isUpgradeRequest(请求)=false

WebSocket异常:WebSocket升级请求无效

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

我的问题是,在PhantomJS更新为2.0之前,有没有办法修复我的Dart后端,这样它也可以处理PhantomJS WebSocket?

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

静态未来升级(HttpRequest请求,{函数协议选择器(列表协议)})
这也许能帮我一些忙吗?

“不。”

,因此您不能将请求头转换为Dart愿意接受的格式。您不能进行任何Ruby风格的monkey修补,因为Dart不允许动态计算


如果您选择了一条疯狂的路径,那么当您看到带有预期头的请求时,您可以自己处理原始
HttpRequest
来实现WebSocket的兼容版本。我相信如果有必要,您可以重新实现该类。也许通过继承可以做到这一点。在dart中不可能避免覆盖。 如果您有时间并且确实需要,您可以重新实现一些方法来修补PhatomJS的websocket

class MyWebSocket extends WebSocket {
    MyWebSocket(/* ... */) : super(/* ... */);

    methodYouNeedToOverride(/* ... */) {
        super.methodYouNeedToOverride(/* ... */)
        // Your patch
    }
}
这种方式将允许您访问“受保护”的变量或方法,可能对修补非常有用


但是要小心,它们只是可见的部分,所有的实现都在协议中,协议对您没有帮助。这些允许在握手后用于通信的特殊协议上达成一致。但是您不能修改握手和交换字段本身

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

您必须至少执行自己的
WebSocketTransformer
实现。为此,您可以从复制DART接口和实现开始,并在所有需要的地方修改它(检查许可证)。如果握手后的实际WebSocket行为在两个RFC中兼容,则可以重用DART
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应该是首选。

Heya。谢谢您的回复。不过,我正在寻找一个API明智的解决方案,以能够更改要使用的websocket标准。因此,根据您的说法,您似乎无法指定Dart后端应该使用哪个web套接字标准?我仔细阅读了Dart的源代码,但不幸的是没有找到这样的选项。正如Dart开发人员经常说的那样,“在dartbug.com/new上打开错误报告”我真的希望在代码中切换,以便其他标准也能工作:)但也许你是对的,这不值得付出努力,最好在等待PhantomJS 2.0的时候专注于更好的东西。谢谢