flutter - 在 Flutter 应用程序中使用 Charles 代理检查 WebSocket 包

标签 flutter dart websocket proxy

我正在使用 Flutter/Dart 开发移动应用程序。我需要的是使用 Charles 代理/Fiddler 调试/测试我的应用程序的网络流量。使用 Charles 代理可以轻松检查 dart/flutter 中的 http 请求/响应。我们只需要告诉HttpClient一个代理服务器的地址(安装Charles的机器的IP地址),如下所示:

final client = HttpClient();
client.findProxy = (uri) {
  String proxy = '1.2.3.4:8888';
  return "PROXY $proxy;";
};
client.badCertificateCallback =
  ((X509Certificate cert, String host, int port) => Platform.isAndroid);

但是我如何调试通过创建的 WebSocket 流量 WebSocket.connect('wss://server_address');? WebSocket 没有任何用于设置代理设置的 api,我在论坛上找不到任何内容。 话虽这么说,我过去已经在另一个用 C# 编写的移动应用程序中做过这样的事情,而且非常简单。

最佳答案

想通了。实际上有多种方法可以做到这一点:

全局代理设置:

class ProxiedHttpOverrides extends HttpOverrides {
  String _proxy;
  ProxiedHttpOverrides(this. _proxy);

  @override
  HttpClient createHttpClient(SecurityContext? context) {
    return super.createHttpClient(context)
      ..findProxy = (uri) {
        return _proxy.isNotEmpty ? "PROXY $_proxy;" : 'DIRECT';
      }
      ..badCertificateCallback = (X509Certificate cert, String host, int port) => Platform.isAndroid;
  }
}

void main() {
  String proxy = '1.2.3.4:8888';
  HttpOverrides.global = new ProxiedHttpOverrides(proxy);
  runApp(MyApp());
}

自定义 HttpClient 传递到 WebSocket.connect

HttpClient client = HttpClient();
  client.findProxy = (uri) => "PROXY $proxy;";
  client.badCertificateCallback = (X509Certificate cert, String host, int port) => Platform.isAndroid;

WebSocket.connect(url, customClient: client);

手动方式:我们需要使用带有指定代理设置的简单 HttpClient 升级到 WebSocket。在这种情况下,我们将能够检查 Charles/Fiddler 中的 WebSocket 流量。

Future<WebSocket> createProxySocket() async {
  String url = 'https://echo.websocket.org:443';//address must start from http(s)://, not from ws(s)://, as we are connecting using http
  String proxy = '1.2.3.4:8888';//your machine address (or localhost if debugging on the same machine)
  Random r = new Random();
  String key = base64.encode(List<int>.generate(8, (_) => r.nextInt(255)));

  HttpClient client = HttpClient();
  client.findProxy = (uri) => "PROXY $proxy;";
  client.badCertificateCallback = (X509Certificate cert, String host, int port) => Platform.isAndroid;

  Uri uri = Uri.parse(url);
  HttpClientRequest request = await client.getUrl(uri);
  request.headers.add('Connection', 'upgrade');
  request.headers.add('Upgrade', 'websocket');
  request.headers.add('Sec-WebSocket-Version', '13');
  request.headers.add('Sec-WebSocket-Key', key);

  HttpClientResponse response = await request.close();
  Socket socket = await response.detachSocket();

  return WebSocket.fromUpgradedSocket(socket, serverSide: false);
}

关于flutter - 在 Flutter 应用程序中使用 Charles 代理检查 WebSocket 包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70683726/

相关文章:

android - firebase_messaging : ^4. 0.0+4 不工作

firebase - 如何使用 Flutter 从 Firestore 中的 collectionGroups 查询数据

flutter - NoSuchMethodError JSON

javascript - websocket 客户端中的 onmessage 事件没有被触发

flutter - 为什么我的 AsyncMemoizer 在 Flutter 中无法正常运行,我想停止不必要地重建我的小部件

flutter - 如何在flutter中使用运行时下载的本地化arb/json文件?

widget - 尝试理解 flutter 演示代码中的小部件对象

dart - Flutter - 未定义边界参数

php - WebSocket 不适用于 https 请求,并且它使用 PHP Ratchet 库与 http 正常工作

javascript - 来自后端的实时用户通知,具有PubNub,可伸缩性和超过9000个聊天室