Rewrite request modification to add regular matching test

This commit is contained in:
wanghongenpin
2024-10-24 00:31:01 +08:00
parent be30d20239
commit abaf62ebbc
26 changed files with 486 additions and 302 deletions

View File

@@ -24,6 +24,7 @@ import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:flutter_toastr/flutter_toastr.dart';
import 'package:network_proxy/network/bin/server.dart';
import 'package:network_proxy/network/components/rewrite/request_rewrite_manager.dart';
import 'package:network_proxy/network/components/rewrite/rewrite_rule.dart';
import 'package:network_proxy/network/components/script_manager.dart';
import 'package:network_proxy/network/host_port.dart';
import 'package:network_proxy/network/http/http.dart';
@@ -136,7 +137,7 @@ class _FavoriteItemState extends State<_FavoriteItem> {
style: TextStyle(fontSize: 14, color: Colors.blue),
),
TextSpan(
text: request.path(),
text: request.path,
style: TextStyle(fontSize: 14, color: Colors.green),
),
if (request.requestUri?.query.isNotEmpty == true)
@@ -249,7 +250,7 @@ class _FavoriteItemState extends State<_FavoriteItem> {
Navigator.push(context, pageRoute);
},
label: localizations.editRequest,
icon: Icons.edit_outlined),
icon: Icons.replay_outlined),
),
//script and rewrite
@@ -257,9 +258,8 @@ class _FavoriteItemState extends State<_FavoriteItem> {
left: itemButton(
onPressed: () async {
Navigator.maybePop(context);
var scriptManager = await ScriptManager.instance;
var url = '${request.remoteDomain()}${request.path()}';
var url = request.domainPath;
var scriptItem = (scriptManager).list.firstWhereOrNull((it) => it.url == url);
String? script = scriptItem == null ? null : await scriptManager.getScript(scriptItem);
@@ -276,11 +276,17 @@ class _FavoriteItemState extends State<_FavoriteItem> {
bool isRequest = request.response == null;
var requestRewrites = await RequestRewriteManager.instance;
var pageRoute = MaterialPageRoute(builder: (_) => RewriteRule());
var ruleType = isRequest ? RuleType.requestReplace : RuleType.responseReplace;
var rule = requestRewrites.getRequestRewriteRule(request, ruleType);
var rewriteItems = await requestRewrites.getRewriteItems(rule);
var pageRoute = MaterialPageRoute(
builder: (_) => RewriteRule(rule: rule, items: rewriteItems, request: request));
if (mounted) Navigator.push(context, pageRoute);
},
label: localizations.requestRewrite,
icon: Icons.replay_outlined),
icon: Icons.edit_outlined),
),
SizedBox(height: 2),
Row(mainAxisAlignment: MainAxisAlignment.center, children: [
@@ -362,9 +368,12 @@ class _FavoriteItemState extends State<_FavoriteItem> {
Widget itemButton(
{required String label, required IconData icon, required Function() onPressed, double iconSize = 20}) {
var style = Theme.of(context).textTheme.bodyMedium;
var theme = Theme.of(context);
var style = theme.textTheme.bodyMedium;
return TextButton.icon(
onPressed: onPressed, label: Text(label, style: style), icon: Icon(icon, size: iconSize, color: style?.color));
onPressed: onPressed,
label: Text(label, style: style),
icon: Icon(icon, size: iconSize, color: theme.colorScheme.primary.withOpacity(0.65)));
}
Widget menuItem({required Widget left, required Widget right}) {

View File

@@ -126,9 +126,9 @@ class RequestListState extends State<RequestListWidget> {
///清理
clean() {
setState(() {
container.clear();
domainListKey.currentState?.clean();
requestSequenceKey.currentState?.clean();
container.clear();
});
}

View File

@@ -101,7 +101,7 @@ class RequestRowState extends State<RequestRow> {
@override
Widget build(BuildContext context) {
String url = widget.displayDomain ? request.requestUrl : request.path();
String url = widget.displayDomain ? request.requestUrl : request.path;
var title = Strings.autoLineString('${request.method.name} $url');
@@ -250,7 +250,7 @@ class RequestRowState extends State<RequestRow> {
Navigator.push(getContext(), pageRoute);
},
label: localizations.editRequest,
icon: Icons.edit_outlined),
icon: Icons.replay_outlined),
),
//script and rewrite
menuItem(
@@ -259,8 +259,8 @@ class RequestRowState extends State<RequestRow> {
Navigator.maybePop(availableContext);
var scriptManager = await ScriptManager.instance;
var url = '${request.remoteDomain()}${request.path()}';
var scriptItem = (scriptManager).list.firstWhereOrNull((it) => it.url == url);
var url = request.domainPath;
var scriptItem = scriptManager.list.firstWhereOrNull((it) => it.url == url);
String? script = scriptItem == null ? null : await scriptManager.getScript(scriptItem);
var pageRoute = MaterialPageRoute(
@@ -278,24 +278,17 @@ class RequestRowState extends State<RequestRow> {
var requestRewrites = await RequestRewriteManager.instance;
var ruleType = isRequest ? RuleType.requestReplace : RuleType.responseReplace;
var url = '${request.remoteDomain()}${request.path()}';
var rule = requestRewrites.rules.firstWhere((it) => it.matchUrl(url, ruleType),
orElse: () => RequestRewriteRule(type: ruleType, url: url));
var rule = requestRewrites.getRequestRewriteRule(request, ruleType);
var rewriteItems = await requestRewrites.getRewriteItems(rule);
RewriteType rewriteType =
isRequest ? RewriteType.replaceRequestBody : RewriteType.replaceResponseBody;
// if (!rewriteItems?.any((element) => element.type == rewriteType)) {
// rewriteItems.add(RewriteItem(rewriteType, true,
// values: {'body': isRequest ? request.bodyAsString : response?.bodyAsString}));
// }
var pageRoute = MaterialPageRoute(builder: (_) => RewriteRule(rule: rule, items: rewriteItems));
var pageRoute = MaterialPageRoute(
builder: (_) => RewriteRule(rule: rule, items: rewriteItems, request: request));
var context = availableContext;
if (context.mounted) Navigator.push(context, pageRoute);
},
label: localizations.requestRewrite,
icon: Icons.replay_outlined),
icon: Icons.edit_outlined),
),
menuItem(
left: itemButton(
@@ -353,9 +346,12 @@ class RequestRowState extends State<RequestRow> {
Widget itemButton(
{required String label, required IconData icon, required Function() onPressed, double iconSize = 20}) {
var style = Theme.of(context).textTheme.bodyMedium;
var theme = Theme.of(context);
var style = theme.textTheme.bodyMedium;
return TextButton.icon(
onPressed: onPressed, label: Text(label, style: style), icon: Icon(icon, size: iconSize, color: style?.color));
onPressed: onPressed,
label: Text(label, style: style),
icon: Icon(icon, size: iconSize, color: theme.colorScheme.primary.withOpacity(0.65)));
}
Widget menuItem({required Widget left, required Widget right}) {

View File

@@ -26,8 +26,8 @@ class RequestSequence extends StatefulWidget {
}
class RequestSequenceState extends State<RequestSequence> with AutomaticKeepAliveClientMixin {
///请求和对应的row的映射
Map<HttpRequest, GlobalKey<RequestRowState>> indexes = HashMap();
///请求id和对应的row的映射
Map<String, GlobalKey<RequestRowState>> indexes = HashMap();
///显示的请求列表 最新的在前面
Queue<HttpRequest> view = Queue();
@@ -71,7 +71,7 @@ class RequestSequenceState extends State<RequestSequence> with AutomaticKeepAliv
///添加响应
addResponse(HttpResponse response) {
var state = indexes.remove(response.request);
var state = indexes.remove(response.request?.requestId);
state?.currentState?.change(response);
if (searchModel == null || searchModel!.isEmpty || response.request == null) {
@@ -145,10 +145,9 @@ class RequestSequenceState extends State<RequestSequence> with AutomaticKeepAliv
Divider(thickness: 0.2, height: 0, color: Theme.of(context).dividerColor),
itemCount: view.length,
itemBuilder: (context, index) {
GlobalKey<RequestRowState> key = indexes[view.elementAt(index)] ??= GlobalKey();
return RequestRow(
index: view.length - index,
key: key,
key: indexes[view.elementAt(index).requestId] ??= GlobalKey(),
request: view.elementAt(index),
proxyServer: widget.proxyServer,
displayDomain: widget.displayDomain,