From e152f9b9e63bb9daf5495c8e04e61dd02409e58a Mon Sep 17 00:00:00 2001 From: wanghongenpin Date: Sun, 22 Sep 2024 01:44:56 +0800 Subject: [PATCH] Support Unicode encode --- .../com/network/proxy/vpn/ConnectionHandler.kt | 4 +--- .../com/network/proxy/vpn/ProxyVpnThread.kt | 6 +----- .../com/network/proxy/vpn/util/PacketUtil.kt | 3 --- lib/ui/component/encoder.dart | 16 ++++++++++++++++ lib/ui/component/toolbox.dart | 7 +++++++ lib/ui/content/body.dart | 13 +++++++------ lib/utils/har.dart | 8 ++++---- 7 files changed, 36 insertions(+), 21 deletions(-) diff --git a/android/app/src/main/kotlin/com/network/proxy/vpn/ConnectionHandler.kt b/android/app/src/main/kotlin/com/network/proxy/vpn/ConnectionHandler.kt index c095528..771af46 100644 --- a/android/app/src/main/kotlin/com/network/proxy/vpn/ConnectionHandler.kt +++ b/android/app/src/main/kotlin/com/network/proxy/vpn/ConnectionHandler.kt @@ -48,8 +48,6 @@ class ConnectionHandler( */ @Throws(IOException::class) fun handlePacket(stream: ByteBuffer) { - val rawPacket = ByteArray(stream.limit()) - stream[rawPacket, 0, stream.limit()] stream.rewind() val ipHeader = IPPacketFactory.createIP4Header(stream) @@ -105,7 +103,7 @@ class ConnectionHandler( * 是否支持协议 */ private val methods: List = - mutableListOf("GET", "POST", "PUT", "DELETE", "HEAD", "OPTIONS", "TRACE", "CONNECT") + mutableListOf("GET", "POST", "PUT", "PATCH", "DELETE", "HEAD", "OPTIONS", "TRACE", "CONNECT", "PROPFIND", "REPORT") private fun supperProtocol(packetData: ByteBuffer): Boolean { val position = packetData.position() diff --git a/android/app/src/main/kotlin/com/network/proxy/vpn/ProxyVpnThread.kt b/android/app/src/main/kotlin/com/network/proxy/vpn/ProxyVpnThread.kt index 94c2fe1..c88f400 100644 --- a/android/app/src/main/kotlin/com/network/proxy/vpn/ProxyVpnThread.kt +++ b/android/app/src/main/kotlin/com/network/proxy/vpn/ProxyVpnThread.kt @@ -63,11 +63,7 @@ class ProxyVpnThread( if (length > 0) { try { readBuffer.flip() - val byteArray = ByteArray(length) - readBuffer.get(byteArray) - - val packet = ByteBuffer.wrap(byteArray) - handler.handlePacket(packet) + handler.handlePacket(readBuffer) } catch (e: Exception) { val errorMessage = (e.message ?: e.toString()) Log.e(TAG, errorMessage, e) diff --git a/android/app/src/main/kotlin/com/network/proxy/vpn/util/PacketUtil.kt b/android/app/src/main/kotlin/com/network/proxy/vpn/util/PacketUtil.kt index bc7f831..f12b83d 100644 --- a/android/app/src/main/kotlin/com/network/proxy/vpn/util/PacketUtil.kt +++ b/android/app/src/main/kotlin/com/network/proxy/vpn/util/PacketUtil.kt @@ -9,9 +9,6 @@ import java.nio.ByteOrder /** * Helper class to perform various useful task - * - * @author Borey Sao - * Date: May 8, 2014 */ object PacketUtil { @get:Synchronized diff --git a/lib/ui/component/encoder.dart b/lib/ui/component/encoder.dart index 03c3f8f..e06e0a9 100644 --- a/lib/ui/component/encoder.dart +++ b/lib/ui/component/encoder.dart @@ -12,6 +12,7 @@ import 'package:network_proxy/network/util/logger.dart'; enum EncoderType { url, base64, + unicode, md5; static EncoderType nameOf(String name) { @@ -39,6 +40,7 @@ class _EncoderState extends State with SingleTickerProviderStateM var tabs = const [ Tab(text: 'URL'), Tab(text: 'Base64'), + Tab(text: 'Unicode'), Tab(text: 'MD5'), ]; @@ -154,6 +156,8 @@ class _EncoderState extends State with SingleTickerProviderStateM result = base64.encode(utf8.encode(inputText)); case EncoderType.md5: result = md5.convert(inputText.codeUnits).toString(); + case EncoderType.unicode: + result = encodeToUnicode(inputText); } } catch (e) { FlutterToastr.show(localizations.encodeFail, context); @@ -181,6 +185,8 @@ class _EncoderState extends State with SingleTickerProviderStateM result = String.fromCharCodes(compressed); } case EncoderType.md5: + case EncoderType.unicode: + result = decodeFromUnicode(inputText); } } catch (e, t) { logger.e("$e", error: e, stackTrace: t); @@ -188,4 +194,14 @@ class _EncoderState extends State with SingleTickerProviderStateM } outputTextController.text = result; } + + String encodeToUnicode(String input) { + return input.runes.map((rune) => '\\u${rune.toRadixString(16).padLeft(4, '0')}').join(); + } + + String decodeFromUnicode(String input) { + return input.replaceAllMapped(RegExp(r'\\u([0-9a-fA-F]{4})'), (match) { + return String.fromCharCode(int.parse(match.group(1)!, radix: 16)); + }); + } } diff --git a/lib/ui/component/toolbox.dart b/lib/ui/component/toolbox.dart index 17bb7f9..dbedad7 100644 --- a/lib/ui/component/toolbox.dart +++ b/lib/ui/component/toolbox.dart @@ -91,6 +91,13 @@ class _ToolboxState extends State { child: const Column(children: [Icon(Icons.currency_bitcoin), Text('Base64')]), )), const SizedBox(width: 15), + InkWell( + onTap: () => encodeWindow(EncoderType.unicode, context), + child: Container( + padding: const EdgeInsets.all(10), + child: const Column(children: [Icon(Icons.format_underline), Text('Unicode')]), + )), + const SizedBox(width: 15), InkWell( onTap: () => encodeWindow(EncoderType.md5, context), child: Container( diff --git a/lib/ui/content/body.dart b/lib/ui/content/body.dart index 27dae90..24ec3ec 100644 --- a/lib/ui/content/body.dart +++ b/lib/ui/content/body.dart @@ -116,6 +116,7 @@ class HttpBodyState extends State { SizedBox( height: 36, child: TabBar( + labelStyle: const TextStyle(fontSize: 14, fontWeight: FontWeight.w500), labelPadding: const EdgeInsets.only(left: 3, right: 5), tabs: tabs.tabList(), onTap: (index) { @@ -184,7 +185,7 @@ class HttpBodyState extends State { list.add(const SizedBox(width: 3)); list.add(IconButton( - icon: const Icon(Icons.abc, size: 20), + icon: const Icon(Icons.text_format, size: 21), tooltip: localizations.encode, onPressed: () { encodeWindow(EncoderType.base64, context, bodyKey.currentState?.body); @@ -415,12 +416,12 @@ class Tabs { tabs.list.add(ViewType.of(contentType) ?? ViewType.text); - //text 为json时,增加json格式化 - if (contentType == ContentType.text) { + //为json时,增加json格式化 + if (isJsonText && !tabs.list.contains(ViewType.jsonText)) { tabs.list.add(ViewType.jsonText); - - if (isJsonText) tabs.list.add(ViewType.json); + tabs.list.add(ViewType.json); } + if (contentType == ContentType.formUrl || contentType == ContentType.json) { tabs.list.add(ViewType.text); } @@ -430,7 +431,7 @@ class Tabs { } List tabList() { - return list.map((e) => Tab(child: Text(e.title, style: const TextStyle(fontSize: 14)))).toList(); + return list.map((e) => Tab(text: e.title)).toList(); } } diff --git a/lib/utils/har.dart b/lib/utils/har.dart index 6588430..e662d9d 100644 --- a/lib/utils/har.dart +++ b/lib/utils/har.dart @@ -26,7 +26,7 @@ class Har { static int maxBodyLength = 1024 * 1024 * 4; static List _entries(List list) { - return list.map((e) => toHar(e)).toList().reversed.toList(); + return list.map((e) => toHar(e)).toList(); } static Map toHar(HttpRequest request) { @@ -54,7 +54,7 @@ class Har { 'wait': request.response?.responseTime.difference(request.requestTime).inMilliseconds, 'receive': 0, }, - 'serverIPAddress': request.response?.remoteHost ?? "", // 服务器IP地址 + 'serverIPAddress': request.response?.remoteHost ?? '', // 服务器IP地址 }; har['response'] = { @@ -172,8 +172,8 @@ class Har { static List> _getQueryString(HttpRequest request) { final queryStringList = >[]; - final queries = Uri.parse(request.uri).queryParametersAll; - queries.forEach((key, valueList) { + final queries = request.requestUri?.queryParametersAll; + queries?.forEach((key, valueList) { for (var value in valueList) { queryStringList.add({"name": key, "value": value}); }