mirror of
https://github.com/wanghongenpin/proxypin.git
synced 2026-05-16 15:56:51 +08:00
Support Unicode encode
This commit is contained in:
@@ -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<EncoderWidget> 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<EncoderWidget> 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<EncoderWidget> 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<EncoderWidget> 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));
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -91,6 +91,13 @@ class _ToolboxState extends State<Toolbox> {
|
||||
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(
|
||||
|
||||
@@ -116,6 +116,7 @@ class HttpBodyState extends State<HttpBodyWidget> {
|
||||
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<HttpBodyWidget> {
|
||||
|
||||
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<Tab> 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();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -26,7 +26,7 @@ class Har {
|
||||
static int maxBodyLength = 1024 * 1024 * 4;
|
||||
|
||||
static List<Map> _entries(List<HttpRequest> 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<Map<String, String>> _getQueryString(HttpRequest request) {
|
||||
final queryStringList = <Map<String, String>>[];
|
||||
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});
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user