From 0f44eff530fa24678c4eb32bab0350e56dc214fd Mon Sep 17 00:00:00 2001 From: SuZhou-Joe Date: Fri, 22 Mar 2024 18:30:01 +0800 Subject: [PATCH] backport 6233 (#307) Signed-off-by: SuZhou-Joe --- src/core/public/http/http_service.test.ts | 7 ++++--- src/core/public/http/http_service.ts | 2 +- src/core/utils/workspace.test.ts | 4 ++-- src/core/utils/workspace.ts | 2 +- src/plugins/workspace/public/plugin.ts | 8 ++++---- src/plugins/workspace/server/plugin.ts | 5 ++++- 6 files changed, 16 insertions(+), 12 deletions(-) diff --git a/src/core/public/http/http_service.test.ts b/src/core/public/http/http_service.test.ts index 5671064e4c52..73010e1c5a93 100644 --- a/src/core/public/http/http_service.test.ts +++ b/src/core/public/http/http_service.test.ts @@ -83,21 +83,22 @@ describe('#setup()', () => { expect(setupResult.basePath.get()).toEqual(''); }); - it('setup basePath with workspaceId provided in window.location.href', () => { + it('setup basePath with workspaceId provided in window.location.href and basePath present in injectedMetadata', () => { const windowSpy = jest.spyOn(window, 'window', 'get'); windowSpy.mockImplementation( () => ({ location: { - href: 'http://localhost/w/workspaceId/app', + href: 'http://localhost/base_path/w/workspaceId/app', }, } as any) ); const injectedMetadata = injectedMetadataServiceMock.createSetupContract(); + injectedMetadata.getBasePath.mockReturnValue('/base_path'); const fatalErrors = fatalErrorsServiceMock.createSetupContract(); const httpService = new HttpService(); const setupResult = httpService.setup({ fatalErrors, injectedMetadata }); - expect(setupResult.basePath.get()).toEqual('/w/workspaceId'); + expect(setupResult.basePath.get()).toEqual('/base_path/w/workspaceId'); windowSpy.mockRestore(); }); }); diff --git a/src/core/public/http/http_service.ts b/src/core/public/http/http_service.ts index 6832703c7925..c1a538dfca1c 100644 --- a/src/core/public/http/http_service.ts +++ b/src/core/public/http/http_service.ts @@ -53,7 +53,7 @@ export class HttpService implements CoreService { public setup({ injectedMetadata, fatalErrors }: HttpDeps): HttpSetup { const opensearchDashboardsVersion = injectedMetadata.getOpenSearchDashboardsVersion(); let clientBasePath = ''; - const workspaceId = getWorkspaceIdFromUrl(window.location.href); + const workspaceId = getWorkspaceIdFromUrl(window.location.href, injectedMetadata.getBasePath()); if (workspaceId) { clientBasePath = `${WORKSPACE_PATH_PREFIX}/${workspaceId}`; } diff --git a/src/core/utils/workspace.test.ts b/src/core/utils/workspace.test.ts index a852ddcc5190..722bbca566e5 100644 --- a/src/core/utils/workspace.test.ts +++ b/src/core/utils/workspace.test.ts @@ -8,11 +8,11 @@ import { httpServiceMock } from '../public/mocks'; describe('#getWorkspaceIdFromUrl', () => { it('return workspace when there is a match', () => { - expect(getWorkspaceIdFromUrl('http://localhost/w/foo')).toEqual('foo'); + expect(getWorkspaceIdFromUrl('http://localhost/w/foo', '')).toEqual('foo'); }); it('return empty when there is not a match', () => { - expect(getWorkspaceIdFromUrl('http://localhost/w2/foo')).toEqual(''); + expect(getWorkspaceIdFromUrl('http://localhost/w2/foo', '')).toEqual(''); }); it('return workspace when there is a match with basePath provided', () => { diff --git a/src/core/utils/workspace.ts b/src/core/utils/workspace.ts index c383967483a8..f16b28423b66 100644 --- a/src/core/utils/workspace.ts +++ b/src/core/utils/workspace.ts @@ -6,7 +6,7 @@ import { WORKSPACE_PATH_PREFIX } from './constants'; import { IBasePath } from '../public'; -export const getWorkspaceIdFromUrl = (url: string, basePath?: string): string => { +export const getWorkspaceIdFromUrl = (url: string, basePath: string): string => { const regexp = new RegExp(`^${basePath || ''}\/w\/([^\/]*)`); const urlObject = new URL(url); const matchedResult = urlObject.pathname.match(regexp); diff --git a/src/plugins/workspace/public/plugin.ts b/src/plugins/workspace/public/plugin.ts index 3ee7e7897d59..a4910f50d86a 100644 --- a/src/plugins/workspace/public/plugin.ts +++ b/src/plugins/workspace/public/plugin.ts @@ -40,9 +40,6 @@ export class WorkspacePlugin implements Plugin<{}, {}> { private coreStart?: CoreStart; private currentWorkspaceIdSubscription?: Subscription; private currentWorkspaceSubscription?: Subscription; - private getWorkspaceIdFromURL(): string | null { - return getWorkspaceIdFromUrl(window.location.href); - } /** * Filter the nav links based on the feature configuration of workspace @@ -107,7 +104,10 @@ export class WorkspacePlugin implements Plugin<{}, {}> { /** * Retrieve workspace id from url */ - const workspaceId = this.getWorkspaceIdFromURL(); + const workspaceId = getWorkspaceIdFromUrl( + window.location.href, + core.http.basePath.getBasePath() + ); if (workspaceId) { const result = await workspaceClient.enterWorkspace(workspaceId); diff --git a/src/plugins/workspace/server/plugin.ts b/src/plugins/workspace/server/plugin.ts index d425f17d08eb..0fff0082476b 100644 --- a/src/plugins/workspace/server/plugin.ts +++ b/src/plugins/workspace/server/plugin.ts @@ -41,7 +41,10 @@ export class WorkspacePlugin implements Plugin<{}, {}> { * Proxy all {basePath}/w/{workspaceId}{osdPath*} paths to {basePath}{osdPath*} */ setupDeps.http.registerOnPreRouting(async (request, response, toolkit) => { - const workspaceId = getWorkspaceIdFromUrl(request.url.toString()); + const workspaceId = getWorkspaceIdFromUrl( + request.url.toString(), + '' // No need to pass basePath here because the request.url will be rewrite by registerOnPreRouting method in `src/core/server/http/http_server.ts` + ); if (workspaceId) { const requestUrl = new URL(request.url.toString());