将标头添加到SecureSpocket或SecurityContext到WebSpcket

时间:2018-03-19 00:57:13

标签: dart flutter

WebSocket可以选择向请求添加标题,但您无法向其添加SecurityContext。 SecureSocket具有SecurityContext,因此我可以添加ssl证书但不能添加标头。对此有何想法?

更新 我试图用SecurityContext对象创建一个websocket 因为我无法访问基础HttpClient,所以我试图使用 runZoned方法

 int i = 0;
  socket = await io.HttpOverrides.runZoned<Future<io.WebSocket>>(
  () => io.WebSocket.connect(uri, headers: headers),
  createHttpClient: (io.SecurityContext securityContext) {
    log.w('creating HttpClient ${i++}');
    return new io.HttpClient(context: options.securityContext);
  },
);

createHttpClient被调用大约3550次 然后没有任何事情发生

它应该非常简单,因为websocket httpclient就在那里

https://github.com/dart-lang/sdk/blob/dcd275fa74ee5cfa86bb115fc67f0ccf6248fd7f/sdk/lib/_http/websocket_impl.dart#L981

2 个答案:

答案 0 :(得分:0)

解决方案是传递SecureSocket以创建WebSocket

示例:

SecureSocket socket = await SecureSocket.connect("host", port);
WebSocket ws = new WebSocket.fromUpgradedSocket(socket);

希望有所帮助!

答案 1 :(得分:0)

尝试

class MyHttpOverrides extends HttpOverrides {
  @override
  HttpClient createHttpClient(SecurityContext context) {
    return super.createHttpClient(context)
      ..badCertificateCallback =
          (X509Certificate cert, String host, int port) => true;
  }
}


// Run this code in main function
HttpOverrides.global = new MyHttpOverrides();