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

问题描述 投票:0回答:2

我正在使用 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# 编写的移动应用程序中做过这样的事情,而且非常简单。

flutter dart websocket proxy
2个回答
4
投票

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

全局代理设置:

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);
}

0
投票

在iOS上,您可以使用名为Hodor的数据包嗅探应用程序,它允许您直接捕获Flutter的网络数据包,而无需修改任何代码。您还可以将其配置为与 Charles 一起使用。它还支持捕获 TCP 和 UDP 流量。

https://apps.apple.com/en/app/id1608857736

© www.soinside.com 2019 - 2024. All rights reserved.