From dee42b8eb0a7f529747910fbdd80007d9aa22639 Mon Sep 17 00:00:00 2001 From: wjiayis Date: Sat, 18 Apr 2026 15:04:49 +0800 Subject: [PATCH 1/2] feat: clean backend endpoint input --- .../src/views/settings/sections/user-developer-tools.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webapp/_webapp/src/views/settings/sections/user-developer-tools.tsx b/webapp/_webapp/src/views/settings/sections/user-developer-tools.tsx index 467e26a4..3b86deea 100644 --- a/webapp/_webapp/src/views/settings/sections/user-developer-tools.tsx +++ b/webapp/_webapp/src/views/settings/sections/user-developer-tools.tsx @@ -40,7 +40,7 @@ export const UserDeveloperTools = () => { label="Backend Endpoint" description="You need to refresh the page to apply the changes" value={endpoint} - onChange={setEndpoint} + onChange={(value) => setEndpoint(value.replace(/\s+/g, "").replace(/\/+$/, ""))} showResetButton={true} onReset={() => { resetApiClientEndpoint(); From c18ecaf16409e2ebe158afa33ef39a5e4bbd9a50 Mon Sep 17 00:00:00 2001 From: wjiayis Date: Mon, 20 Apr 2026 00:51:59 +0800 Subject: [PATCH 2/2] fix: debug mid-url backslash --- webapp/_webapp/src/libs/apiclient.ts | 6 ++++-- .../src/views/settings/sections/user-developer-tools.tsx | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/webapp/_webapp/src/libs/apiclient.ts b/webapp/_webapp/src/libs/apiclient.ts index 5f83bfcc..bf38e694 100644 --- a/webapp/_webapp/src/libs/apiclient.ts +++ b/webapp/_webapp/src/libs/apiclient.ts @@ -44,7 +44,7 @@ class ApiClient { } updateBaseURL(baseURL: string, apiVersion: ApiVersion): void { - this.axiosInstance.defaults.baseURL = `${baseURL}/_pd/api/${apiVersion}`; + this.axiosInstance.defaults.baseURL = `${sanitizeEndpoint(baseURL)}/_pd/api/${apiVersion}`; switch (apiVersion) { case "v1": storage.setItem(API_VERSION_STORAGE_KEYS.v1, this.axiosInstance.defaults.baseURL); @@ -265,6 +265,8 @@ const DEFAULT_ENDPOINT = `${process.env.PD_API_ENDPOINT || "http://localhost:300 const LOCAL_STORAGE_KEY_V1 = "pd.devtool.endpoint"; const LOCAL_STORAGE_KEY_V2 = "pd.devtool.endpoint.v2"; +const sanitizeEndpoint = (url: string) => url.trim().replace(/\/+$/, ""); + // Create apiclient instance with endpoint from storage or default export const getEndpointFromStorage = () => { let endpoint = ""; @@ -275,7 +277,7 @@ export const getEndpointFromStorage = () => { endpoint = DEFAULT_ENDPOINT; } - return endpoint.replace("/_pd/api/v1", "").replace("/_pd/api/v2", ""); // compatible with old endpoint + return sanitizeEndpoint(endpoint.replace("/_pd/api/v1", "").replace("/_pd/api/v2", "")); // compatible with old endpoint }; /** diff --git a/webapp/_webapp/src/views/settings/sections/user-developer-tools.tsx b/webapp/_webapp/src/views/settings/sections/user-developer-tools.tsx index 3b86deea..467e26a4 100644 --- a/webapp/_webapp/src/views/settings/sections/user-developer-tools.tsx +++ b/webapp/_webapp/src/views/settings/sections/user-developer-tools.tsx @@ -40,7 +40,7 @@ export const UserDeveloperTools = () => { label="Backend Endpoint" description="You need to refresh the page to apply the changes" value={endpoint} - onChange={(value) => setEndpoint(value.replace(/\s+/g, "").replace(/\/+$/, ""))} + onChange={setEndpoint} showResetButton={true} onReset={() => { resetApiClientEndpoint();