mirror of
https://github.com/wanghongenpin/proxypin.git
synced 2026-03-15 04:23:17 +08:00
hex viewer
This commit is contained in:
@@ -135,7 +135,7 @@ class RequestRewriteInterceptor extends Interceptor {
|
||||
}
|
||||
}
|
||||
|
||||
_updateRequest(HttpRequest request, RewriteItem item) {
|
||||
Future<void> _updateRequest(HttpRequest request, RewriteItem item) async {
|
||||
var paramTypes = [RewriteType.addQueryParam, RewriteType.removeQueryParam, RewriteType.updateQueryParam];
|
||||
|
||||
if (paramTypes.contains(item.type)) {
|
||||
@@ -187,7 +187,7 @@ class RequestRewriteInterceptor extends Interceptor {
|
||||
return;
|
||||
}
|
||||
|
||||
_updateMessage(request, item);
|
||||
await _updateMessage(request, item);
|
||||
}
|
||||
|
||||
//修改消息
|
||||
|
||||
@@ -481,10 +481,7 @@ class _BodyState extends State<_Body> {
|
||||
return const Center(child: Text("video not support preview"));
|
||||
}
|
||||
if (type == ViewType.hex) {
|
||||
return HighlightTextWidget(
|
||||
text: message!.body!.map(intToHex).join(" "),
|
||||
searchController: widget.searchController,
|
||||
contextMenuBuilder: contextMenu);
|
||||
return HexViewer(data: Uint8List.fromList(message!.body!));
|
||||
}
|
||||
|
||||
if (type == ViewType.formUrl) {
|
||||
@@ -589,3 +586,54 @@ enum ViewType {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
class HexViewer extends StatelessWidget {
|
||||
final Uint8List data;
|
||||
final int bytesPerRow;
|
||||
|
||||
const HexViewer({super.key, required this.data, this.bytesPerRow = 16});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return SelectableText(
|
||||
_formatHex(data, bytesPerRow),
|
||||
style: const TextStyle(fontFamily: 'Courier', fontSize: 12),
|
||||
);
|
||||
}
|
||||
|
||||
String _formatHex(Uint8List data, int bytesPerRow) {
|
||||
final StringBuffer buffer = StringBuffer();
|
||||
for (int i = 0; i < data.length; i += bytesPerRow) {
|
||||
// Address
|
||||
buffer.write(i.toRadixString(16).padLeft(8, '0'));
|
||||
buffer.write(' ');
|
||||
|
||||
// Hex values
|
||||
for (int j = 0; j < bytesPerRow; j++) {
|
||||
if (i + j < data.length) {
|
||||
buffer.write(data[i + j].toRadixString(16).padLeft(2, '0'));
|
||||
} else {
|
||||
buffer.write(' ');
|
||||
}
|
||||
buffer.write(' ');
|
||||
}
|
||||
|
||||
buffer.write(' ');
|
||||
|
||||
// ASCII representation
|
||||
for (int j = 0; j < bytesPerRow; j++) {
|
||||
if (i + j < data.length) {
|
||||
final byte = data[i + j];
|
||||
if (byte >= 32 && byte <= 126) {
|
||||
buffer.write(String.fromCharCode(byte));
|
||||
} else {
|
||||
buffer.write('.');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
buffer.writeln();
|
||||
}
|
||||
return buffer.toString();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -102,7 +102,11 @@ class _SocketLaunchState extends State<SocketLaunch> with WindowListener, Widget
|
||||
windowManager.setPreventClose(false);
|
||||
await windowManager.destroy();
|
||||
|
||||
await SystemNavigator.pop();
|
||||
try {
|
||||
await SystemNavigator.pop(animated: true).timeout(Duration(milliseconds: 150));
|
||||
} catch (e) {
|
||||
//
|
||||
}
|
||||
exit(0);
|
||||
}
|
||||
|
||||
|
||||
@@ -304,7 +304,7 @@ class MobileHomeState extends State<MobileHomePage> implements EventListener, Li
|
||||
});
|
||||
}
|
||||
|
||||
showAlertDialog(String title, String content, Function onClose) {
|
||||
void showAlertDialog(String title, String content, Function onClose) {
|
||||
showDialog(
|
||||
context: context,
|
||||
barrierDismissible: false,
|
||||
|
||||
@@ -127,9 +127,9 @@ class Curl {
|
||||
if (i + 1 < parts.length) {
|
||||
data = parts[++i];
|
||||
}
|
||||
} else if (!part.startsWith('-') && part.startsWith("http")) {
|
||||
} else if (url == null && !part.startsWith('-') && part.contains("http")) {
|
||||
// 解析请求 URL
|
||||
url = part;
|
||||
url = part.replaceAll("'", "").replaceAll('"', '');
|
||||
} else if ("--http2" == part) {
|
||||
// protocolVersion = "HTTP2";
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user