From 6030bd1456849eab197f1f39c71bbbe1ed890801 Mon Sep 17 00:00:00 2001 From: wanghongenpin Date: Thu, 28 Aug 2025 07:15:12 +0800 Subject: [PATCH] http2 package size --- .../com/network/proxy/vpn/util/ProcessInfoManager.kt | 6 +++--- lib/network/channel/channel.dart | 1 - lib/network/channel/channel_dispatcher.dart | 8 +++++++- lib/network/channel/network.dart | 5 +++++ lib/network/http/h2/h2_codec.dart | 4 +++- lib/network/http/http.dart | 1 - lib/ui/component/utils.dart | 4 ++-- pubspec.yaml | 4 ++-- 8 files changed, 22 insertions(+), 11 deletions(-) diff --git a/android/app/src/main/kotlin/com/network/proxy/vpn/util/ProcessInfoManager.kt b/android/app/src/main/kotlin/com/network/proxy/vpn/util/ProcessInfoManager.kt index dc7d1fd..9b19367 100644 --- a/android/app/src/main/kotlin/com/network/proxy/vpn/util/ProcessInfoManager.kt +++ b/android/app/src/main/kotlin/com/network/proxy/vpn/util/ProcessInfoManager.kt @@ -83,10 +83,10 @@ class ProcessInfoManager private constructor() { return null } - val connectivityManager: ConnectivityManager = - activity!!.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager - try { + val connectivityManager: ConnectivityManager = + activity!!.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager + val uid = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { connectivityManager.getConnectionOwnerUid( OsConstants.IPPROTO_TCP, localAddress, remoteAddress diff --git a/lib/network/channel/channel.dart b/lib/network/channel/channel.dart index 091983c..4c5f0b4 100644 --- a/lib/network/channel/channel.dart +++ b/lib/network/channel/channel.dart @@ -140,7 +140,6 @@ class Channel { if (!isClosed) { _socket.add(bytes); } - } catch (e, t) { if (e is StateError && e.message == "StreamSink is closed") { logger.w("[$id] $remoteSocketAddress write error channel is closed $e", stackTrace: t); diff --git a/lib/network/channel/channel_dispatcher.dart b/lib/network/channel/channel_dispatcher.dart index b2480e4..e510c4a 100644 --- a/lib/network/channel/channel_dispatcher.dart +++ b/lib/network/channel/channel_dispatcher.dart @@ -39,6 +39,11 @@ class ChannelDispatcher extends ChannelHandler { /// 监听 void listen(Channel channel, ChannelContext channelContext) { buffer.clear(); + channel.socket.done.onError((error, StackTrace trace) { + logger.e('[${channelContext.clientChannel?.id}] secureSocket done error', error: error, stackTrace: trace); + channel.dispatcher.exceptionCaught(channelContext, channel, error, trace: trace); + return null; + }); channel.socket.listen((data) => channel.dispatcher.channelRead(channelContext, channel, data), onError: (error, trace) => channel.dispatcher.exceptionCaught(channelContext, channel, error, trace: trace), onDone: () => channel.dispatcher.channelInactive(channelContext, channel)); @@ -130,7 +135,7 @@ class ChannelDispatcher extends ChannelHandler { var data = decodeResult.data; if (data is HttpMessage) { - data.packageSize = length; + data.packageSize ??= length; data.remoteHost = channel.remoteSocketAddress.host; data.remotePort = channel.remoteSocketAddress.port; } @@ -217,6 +222,7 @@ class ChannelDispatcher extends ChannelHandler { @override channelInactive(ChannelContext channelContext, Channel channel) async { await taskQueue.waitForAll(); + channel.isOpen = false; handler.channelInactive(channelContext, channel); } } diff --git a/lib/network/channel/network.dart b/lib/network/channel/network.dart index 7888c69..7a7662e 100644 --- a/lib/network/channel/network.dart +++ b/lib/network/channel/network.dart @@ -51,6 +51,11 @@ abstract class Network { onError: (error, StackTrace trace) => channel.dispatcher.exceptionCaught(channelContext, channel, error, trace: trace), onDone: () => channel.dispatcher.channelInactive(channelContext, channel)); + + channel.socket.done.onError((error, StackTrace trace) { + logger.e('[${channelContext.clientChannel?.id}] socket done error', error: error, stackTrace: trace); + channel.dispatcher.exceptionCaught(channelContext, channel, error, trace: trace); + }); return channel; } diff --git a/lib/network/http/h2/h2_codec.dart b/lib/network/http/h2/h2_codec.dart index 113a586..434d508 100644 --- a/lib/network/http/h2/h2_codec.dart +++ b/lib/network/http/h2/h2_codec.dart @@ -127,7 +127,7 @@ abstract class Http2Codec implements Codec { Map> headers = _parseHeaders(channelContext, framePayload); headers.forEach((key, values) => message.headers.addValues(key, values)); - + message.packageSize = (message.packageSize ?? 0) + frameHeader.length; if (frameHeader.hasEndHeadersFlag && channelContext.getStreamRequest(frameHeader.streamIdentifier)?.method == HttpMethod.head) { result.isDone = true; @@ -304,6 +304,7 @@ abstract class Http2Codec implements Codec { } else { message.body = List.from(message.body!)..addAll(data); } + message.packageSize = (message.packageSize ?? 0) + frameHeader.length; return DataFrame(frameHeader, padLength, data); } @@ -352,6 +353,7 @@ abstract class Http2Codec implements Codec { } }); + message.packageSize = frameHeader.length; return HeadersFrame(frameHeader, padLength, exclusiveDependency, streamDependency, weight, blockFragment); } diff --git a/lib/network/http/http.dart b/lib/network/http/http.dart index 2c0aca9..ef52997 100644 --- a/lib/network/http/http.dart +++ b/lib/network/http/http.dart @@ -89,7 +89,6 @@ abstract class HttpMessage { set body(List? body) { _body = body; _bodyString = null; - packageSize = body?.length ?? 0; } ///获取消息体编码 diff --git a/lib/ui/component/utils.dart b/lib/ui/component/utils.dart index 4cdeaf3..fa572a5 100644 --- a/lib/ui/component/utils.dart +++ b/lib/ui/component/utils.dart @@ -77,9 +77,9 @@ String getPackage(int? size) { } if (size > 1024 * 1024) { - return "${(size / 1024 / 1024).toStringAsFixed(2)} MB"; + return "${(size / 1024 / 1024).toStringAsFixed(2)} M"; } - return "${(size / 1024).toStringAsFixed(2)} KB"; + return "${(size / 1024).toStringAsFixed(2)} K"; } String copyRawRequest(HttpRequest request) { diff --git a/pubspec.yaml b/pubspec.yaml index b83f901..cd1c935 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -23,7 +23,7 @@ dependencies: url: https://gitee.com/wanghongenpin/flutter-plugins.git path: packages/desktop_multi_window path_provider: ^2.1.5 - file_picker: ^10.3.1 + file_picker: ^10.3.2 proxy_manager: ^0.0.3 permission_handler: ^12.0.1 flutter_toastr: ^1.0.3 @@ -44,7 +44,7 @@ dependencies: qr_flutter: ^4.1.0 flutter_qr_reader_plus: ^1.0.6 brotli: ^0.6.0 - macos_window_utils: ^1.8.4 + macos_window_utils: ^1.9.0 win32audio: ^1.3.1 vclibs: ^0.1.3