This is an automated email from the ASF dual-hosted git repository.

imbajin pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/hugegraph-toolchain.git

commit 58c480388eb1414c462f2e8864c6dbcd04bdc5e1
Author: dark <[email protected]>
AuthorDate: Fri Aug 14 12:39:02 2026 +0800

    fix(hubble): sanitize request failure feedback
---
 .../src/api/request-error-semantics.test.js        | 41 +++++++++++++++++++++-
 hugegraph-hubble/hubble-fe/src/api/request.js      | 13 +++++--
 .../i18n/resources/en-US/components/common.json    |  3 +-
 3 files changed, 52 insertions(+), 5 deletions(-)

diff --git a/hugegraph-hubble/hubble-fe/src/api/request-error-semantics.test.js 
b/hugegraph-hubble/hubble-fe/src/api/request-error-semantics.test.js
index 5acd878fc..b539b7f42 100644
--- a/hugegraph-hubble/hubble-fe/src/api/request-error-semantics.test.js
+++ b/hugegraph-hubble/hubble-fe/src/api/request-error-semantics.test.js
@@ -106,7 +106,7 @@ describe.each(['./request'])('%s error semantics', 
modulePath => {
             };
 
             expect(reject(error)).toBe(error.response);
-            expect(messageError).toHaveBeenCalledWith('request.error');
+            
expect(messageError).toHaveBeenCalledWith('request.error_with_path');
         });
 
     it('keeps network errors rejected after showing the fallback message', 
async () => {
@@ -114,7 +114,46 @@ describe.each(['./request'])('%s error semantics', 
modulePath => {
         const error = new Error('Network Error');
 
         await expect(reject(error)).rejects.toBe(error);
+        expect(messageError).toHaveBeenCalledWith('request.failed');
+    });
+
+    it('keeps fallback and detailed copy from repeating the failure prefix',
+        () => {
+            const en = 
require('../i18n/resources/en-US/components/common.json');
+            const zh = 
require('../i18n/resources/zh-CN/components/common.json');
+            const interpolate = (template, values) => Object.entries(values)
+                .reduce((text, [key, value]) => text.replace(
+                    `{{${key}}}`,
+                    value
+                ), template);
+
+            expect(en.request.failed).toBe('Request failed');
+            expect(interpolate(en.request.error, {
+                message: 'Connection unavailable',
+            })).toBe('Request failed: Connection unavailable');
+            expect(zh.request.failed).toBe('请求失败');
+            expect(interpolate(zh.request.error, {
+                message: '暂时无法连接',
+            })).toBe('请求失败:暂时无法连接');
+        });
+
+    it('omits the path label when the server does not provide a path', () => {
+        const {reject, messageError} = loadResponseHandlers(modulePath);
+        const error = {
+            config: {},
+            response: {
+                status: 500,
+                data: {
+                    status: 500,
+                    message: 'No service available',
+                    path: '   ',
+                },
+            },
+        };
+
+        expect(reject(error)).toBe(error.response);
         expect(messageError).toHaveBeenCalledWith('request.error');
+        
expect(messageError).not.toHaveBeenCalledWith('request.error_with_path');
     });
 
     it('redacts secrets and absolute paths before errors reach the DOM', async 
() => {
diff --git a/hugegraph-hubble/hubble-fe/src/api/request.js 
b/hugegraph-hubble/hubble-fe/src/api/request.js
index 84a534b6a..3f3432e1d 100644
--- a/hugegraph-hubble/hubble-fe/src/api/request.js
+++ b/hugegraph-hubble/hubble-fe/src/api/request.js
@@ -50,9 +50,16 @@ const redirectToLogin = () => {
 };
 
 const showRequestError = res => {
-    message.error(i18n.t('request.error', {
-        message: res?.message ?? '',
-        path: res?.path ?? '',
+    const errorMessage = res?.message;
+    if (!errorMessage) {
+        message.error(i18n.t('request.failed'));
+        return;
+    }
+    const path = typeof res?.path === 'string' ? res.path.trim() : '';
+    const key = path ? 'request.error_with_path' : 'request.error';
+    message.error(i18n.t(key, {
+        message: errorMessage,
+        path,
     }));
 };
 
diff --git 
a/hugegraph-hubble/hubble-fe/src/i18n/resources/en-US/components/common.json 
b/hugegraph-hubble/hubble-fe/src/i18n/resources/en-US/components/common.json
index d48db0e7a..fa17a2657 100644
--- a/hugegraph-hubble/hubble-fe/src/i18n/resources/en-US/components/common.json
+++ b/hugegraph-hubble/hubble-fe/src/i18n/resources/en-US/components/common.json
@@ -98,6 +98,7 @@
   },
   "request": {
     "failed": "Request failed",
-    "error": "Request failed: {{message}}, path: {{path}}"
+    "error": "Request failed: {{message}}",
+    "error_with_path": "Request failed: {{message}} ({{path}})"
   }
 }

Reply via email to