From 07ffeb8e0fcf2c3d2c8a6bdb4df281fe01f4c981 Mon Sep 17 00:00:00 2001 From: wanghongenpin Date: Fri, 12 Sep 2025 00:36:22 +0800 Subject: [PATCH] fix js fetch headers (##589) --- assets/js/fetch.js | 3 ++- lib/network/components/js/xhr.dart | 21 ++++++++++++++------- lib/network/components/request_map.dart | 6 +++++- lib/network/handle/http_proxy_handle.dart | 1 + test/js.js | 20 ++++++++++++++++++++ 5 files changed, 42 insertions(+), 9 deletions(-) create mode 100644 test/js.js diff --git a/assets/js/fetch.js b/assets/js/fetch.js index 94f127f..8aee864 100644 --- a/assets/js/fetch.js +++ b/assets/js/fetch.js @@ -27,10 +27,11 @@ function fetch(url, options) { blob: () => Promise.resolve(request.response.body), clone: response, headers: { + ...headers, keys: () => keys, entries: () => all, get: n => headers[n.toLowerCase()], - has: n => n.toLowerCase() in headers + has: n => n.toLowerCase() in headers, } }); diff --git a/lib/network/components/js/xhr.dart b/lib/network/components/js/xhr.dart index 992547b..02a19db 100644 --- a/lib/network/components/js/xhr.dart +++ b/lib/network/components/js/xhr.dart @@ -250,14 +250,13 @@ extension JavascriptRuntimeXhrExtension on JavascriptRuntime { logger.d('Eval Fetch Result: $evalFetchResult'); } - Future createClient(enabledProxy) async { + Future createClient(bool enabledProxy) async { if (!enabledProxy) { return http.Client(); } // ProxyServer.current.isRunning var httpClient = HttpClient(); - print(ProxyServer.current?.isRunning); String proxy; if (Platforms.isDesktop()) { Map? proxyResult = await DesktopMultiWindow.invokeMethod(0, 'getProxyInfo'); @@ -354,20 +353,28 @@ extension JavascriptRuntimeXhrExtension on JavascriptRuntime { body = response.bodyBytes; } - // logger.d('RESPONSE TEXT: $responseText'); final xhrResult = XmlHttpRequestResponse( responseText: responseText, responseInfo: XhtmlHttpResponseInfo(statusCode: 200, statusText: "OK", body: body), ); + response.headers.forEach((key, value) { + xhrResult.responseInfo?.addResponseHeaders(key, value); + }); + final responseInfo = jsonEncode(xhrResult.responseInfo); - //final responseText = xhrResult.responseText; //.replaceAll("\\n", "\\\n"); + final safeResponseText = responseText != null ? jsonEncode(responseText) : null; final error = xhrResult.error; + // logger.d('XHR response for url: ${pendingCall.url}, status: ${xhrResult.responseInfo?.statusCode}'); + // send back to the javascript environment the // response for the http pending callback - this.evaluate( - "globalThis.xhrRequests[${pendingCall.idRequest}].callback($responseInfo, `$responseText`, $error);", + var jsResult = evaluate( + "globalThis.xhrRequests[${pendingCall.idRequest}].callback($responseInfo, $safeResponseText, $error);", ); + if (jsResult.isError) { + logger.e('jsResult error url:${pendingCall.url}, ${jsResult.stringResult}'); + } }); }); @@ -455,7 +462,7 @@ class XhtmlHttpResponseInfo { "statusCode": statusCode, "statusText": statusText, "body": body, - "responseHeaders": jsonEncode(responseHeaders) + "responseHeaders": responseHeaders }; } } diff --git a/lib/network/components/request_map.dart b/lib/network/components/request_map.dart index dc1ddf9..88d25d8 100644 --- a/lib/network/components/request_map.dart +++ b/lib/network/components/request_map.dart @@ -65,7 +65,11 @@ class RequestMapInterceptor extends Interceptor { response = await executeScript(request, mapRule, item.script!); } - response?.request = request; + if (response == null) { + return null; + } + + response.request = request; request.response = response; return response; } diff --git a/lib/network/handle/http_proxy_handle.dart b/lib/network/handle/http_proxy_handle.dart index 28a1968..2003ff3 100644 --- a/lib/network/handle/http_proxy_handle.dart +++ b/lib/network/handle/http_proxy_handle.dart @@ -112,6 +112,7 @@ class HttpProxyChannelHandler extends ChannelHandler { for (var interceptor in interceptors) { var response = await interceptor.execute(request!); if (response != null) { + listener?.onResponse(channelContext, response); channel.writeAndClose(channelContext, response); return; } diff --git a/test/js.js b/test/js.js new file mode 100644 index 0000000..3086b53 --- /dev/null +++ b/test/js.js @@ -0,0 +1,20 @@ +async function onRequest() { + + + const fetchResponse = await fetch('https://httpbin.org/anything'); + console.log(fetchResponse.headers); + console.log(await fetchResponse.text()); + console.log( fetchResponse.body); + + const response = { + statusCode: 200, + body: fetchResponse.body, + headers: fetchResponse.headers + }; + return response; +} + +onRequest().then( response => { + console.log('Response:', response); + +}) \ No newline at end of file