From da7e8f96eb6b089680d2d4ed196ba43875223bb7 Mon Sep 17 00:00:00 2001 From: quguiren Date: Wed, 16 Jul 2025 20:03:16 +0800 Subject: [PATCH] fix code web oninterceptrequest Signed-off-by: quguiren --- .../web/cross_platform/web_delegate_cross.cpp | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/frameworks/core/components_ng/pattern/web/cross_platform/web_delegate_cross.cpp b/frameworks/core/components_ng/pattern/web/cross_platform/web_delegate_cross.cpp index 00c12313c94..abfed51025e 100644 --- a/frameworks/core/components_ng/pattern/web/cross_platform/web_delegate_cross.cpp +++ b/frameworks/core/components_ng/pattern/web/cross_platform/web_delegate_cross.cpp @@ -171,6 +171,10 @@ constexpr int RESOURCESID_ONE = 1; constexpr int RESOURCESID_TWO = 2; constexpr int RESOURCESID_THREE = 3; +constexpr int TIMEOUT_DURATION_MS = 2000; +constexpr int POLLING_INTERVAL_MS = 50; +constexpr int HTTP_STATUS_GATEWAY_TIMEOUT = 504; + const std::string RESOURCE_VIDEO_CAPTURE = "TYPE_VIDEO_CAPTURE"; const std::string RESOURCE_AUDIO_CAPTURE = "TYPE_AUDIO_CAPTURE"; } @@ -1435,6 +1439,20 @@ bool WebDelegateCross::OnLoadIntercept(void* object) return result; } +auto WaitForReady(std::function checkFunc, int timeoutMs) -> bool +{ + const auto start = std::chrono::steady_clock::now(); + const auto timeout = std::chrono::milliseconds(timeoutMs); + + while (!checkFunc()) { + if (std::chrono::steady_clock::now() - start >= timeout) { + return false; + } + std::this_thread::sleep_for(std::chrono::milliseconds(POLLING_INTERVAL_MS)); + } + return true; +} + RefPtr WebDelegateCross::OnInterceptRequest(void* object) { ContainerScope scope(instanceId_); @@ -1469,6 +1487,27 @@ RefPtr WebDelegateCross::OnInterceptRequest(void* object) } }, "ArkUIWebInterceptRequest"); + if (!result) { + return nullptr; + } + auto isReady = result->GetResponseStatus(); + if (!isReady) { + isReady = WaitForReady([&] { return result->GetResponseStatus(); }, TIMEOUT_DURATION_MS); + if (!isReady) { + auto timeoutResponse = AceType::MakeRefPtr(); + std::string errorHtml = + "

Response Timeout

The request has timed out.

"; + timeoutResponse->SetData(errorHtml); + std::string mimeType = "text/html"; + timeoutResponse->SetMimeType(mimeType); + std::string encoding = "utf-8"; + timeoutResponse->SetEncoding(encoding); + timeoutResponse->SetStatusCode(HTTP_STATUS_GATEWAY_TIMEOUT); + std::string reason = "Response timed out"; + timeoutResponse->SetReason(reason); + result = timeoutResponse; + } + } return result; } -- Gitee