Enhance request and response handling to support null values and improve breakpoint execution logic

This commit is contained in:
wanghongenpin
2026-02-28 21:29:48 +08:00
parent 3c4b97380d
commit 531732696d
4 changed files with 40 additions and 7 deletions

View File

@@ -36,6 +36,7 @@ class RequestBreakpointInterceptor extends Interceptor {
return completer.future.then((req) {
if (req == null) {
logger.d('Request ${request.requestId} was resumed null, aborting request');
return null;
}

View File

@@ -329,14 +329,20 @@ void registerMethodHandler() {
}
if (call.method == 'resumeRequest') {
var request = HttpRequest.fromJson(jsonDecode(jsonEncode(call.arguments['request'])));
var request = call.arguments['request'] == null
? null
: HttpRequest.fromJson(jsonDecode(jsonEncode(call.arguments['request'])));
RequestBreakpointInterceptor.instance.resumeRequest(call.arguments['requestId'], request);
return 'done';
}
if (call.method == 'resumeResponse') {
var response = HttpResponse.fromJson(jsonDecode(jsonEncode(call.arguments['response'])));
response.requestId = call.arguments['requestId'];
var response = call.arguments['response'] == null
? null
: HttpResponse.fromJson(jsonDecode(jsonEncode(call.arguments['response'])));
if (response != null) {
response.requestId = call.arguments['requestId'];
}
RequestBreakpointInterceptor.instance.resumeResponse(call.arguments['requestId'], response);
return 'done';
}

View File

@@ -48,7 +48,7 @@ class _BreakpointExecutorState extends State<BreakpointExecutor> {
onExecuteRequest: (newRequest) async {
await DesktopMultiWindow.invokeMethod(0, 'resumeRequest', {
'requestId': widget.requestId,
'request': newRequest.toJson(),
'request': newRequest?.toJson(),
});
if (widget.windowId != null) {
WindowController.fromWindowId(widget.windowId!).close();
@@ -65,7 +65,7 @@ class _BreakpointExecutorState extends State<BreakpointExecutor> {
onExecuteResponse: (newResponse) async {
await DesktopMultiWindow.invokeMethod(0, 'resumeResponse', {
'requestId': widget.requestId,
'response': newResponse.toJson(),
'response': newResponse?.toJson(),
});
if (widget.windowId != null) {
WindowController.fromWindowId(widget.windowId!).close();

View File

@@ -47,8 +47,8 @@ class RequestEditor extends StatefulWidget {
final WindowController? windowController;
final HttpRequest? request;
final RequestEditorSource source;
final Function(HttpRequest request)? onExecuteRequest;
final Function(HttpResponse response)? onExecuteResponse;
final Function(HttpRequest? request)? onExecuteRequest;
final Function(HttpResponse? response)? onExecuteResponse;
final HttpResponse? response;
const RequestEditor({
@@ -78,6 +78,7 @@ class RequestEditorState extends State<RequestEditor> {
HttpResponse? response;
bool showCURLDialog = false;
bool executed = false;
AppLocalizations get localizations => AppLocalizations.of(context)!;
@@ -125,6 +126,16 @@ class RequestEditorState extends State<RequestEditor> {
@override
void dispose() {
if ((widget.source == RequestEditorSource.breakpointRequest ||
widget.source == RequestEditorSource.breakpointResponse) &&
!executed) {
if (widget.source == RequestEditorSource.breakpointRequest) {
widget.onExecuteRequest?.call(null);
} else {
widget.onExecuteResponse?.call(null);
}
}
HardwareKeyboard.instance.removeHandler(onKeyEvent);
responseChange.dispose();
super.dispose();
@@ -162,6 +173,20 @@ class RequestEditorState extends State<RequestEditor> {
},
icon: Icon(icon),
label: Text(buttonText)),
if (widget.source == RequestEditorSource.breakpointRequest ||
widget.source == RequestEditorSource.breakpointResponse)
TextButton.icon(
onPressed: () {
// ignore breakpoint
if (widget.source == RequestEditorSource.breakpointRequest) {
widget.onExecuteRequest?.call(null);
} else {
widget.onExecuteResponse?.call(null);
}
widget.windowController?.close();
},
icon: const Icon(Icons.cancel),
label: Text(localizations.cancel)),
const SizedBox(width: 10)
],
),
@@ -246,6 +271,7 @@ class RequestEditorState extends State<RequestEditor> {
}
void executeBreakpoint() {
executed = true;
if (widget.source == RequestEditorSource.breakpointRequest) {
var currentState = requestLineKey.currentState!;
var headers = requestKey.currentState?.getHeaders();