From 32cd8e51bb2384f65e73395d1ea9ef0168794d20 Mon Sep 17 00:00:00 2001 From: Orange_66 Date: Wed, 10 Sep 2025 10:17:27 +0800 Subject: [PATCH] URL BugFix Issue: https://gitee.com/openharmony/arkcompiler_runtime_core/issues/ICX8LR Signed-off-by: Orange_66 --- static_core/plugins/ets/sdk/api/@ohos.uri.ets | 4 +- static_core/plugins/ets/sdk/api/@ohos.url.ets | 45 +++++++++++-------- .../ets_sdk/api/@ohos/url/UrlTestHref.ets | 7 +++ 3 files changed, 36 insertions(+), 20 deletions(-) diff --git a/static_core/plugins/ets/sdk/api/@ohos.uri.ets b/static_core/plugins/ets/sdk/api/@ohos.uri.ets index 4a4c9c6b7e..9e07b99b51 100644 --- a/static_core/plugins/ets/sdk/api/@ohos.uri.ets +++ b/static_core/plugins/ets/sdk/api/@ohos.uri.ets @@ -170,9 +170,9 @@ export namespace uri { * Searches the query string for parameter values with the given key. * * @param { string } key - The key it will be encoded with. - * @returns { Array } Return a set of decoded values. + * @returns { string[] } Return a set of decoded values. */ - getQueryValues(key: string): Array { + getQueryValues(key: string): string[] { return this.uriEntry.getQueryValues(key); } diff --git a/static_core/plugins/ets/sdk/api/@ohos.url.ets b/static_core/plugins/ets/sdk/api/@ohos.url.ets index af68d5e7f6..f6598c9ab5 100644 --- a/static_core/plugins/ets/sdk/api/@ohos.url.ets +++ b/static_core/plugins/ets/sdk/api/@ohos.url.ets @@ -722,8 +722,10 @@ export namespace url { private analysizeFile(input: string) { let special: boolean = true; - if ((input.charAt(0) == c'/' || input.charAt(0) == c'\\') && - (input.charAt(1) == c'/' || input.charAt(1) == c'\\')) + const firstChar = input.length > 0 ? input.charAt(0) : ''; + const secondChar = input.length > 1 ? input.charAt(1) : ''; + if ((firstChar == c'/' || firstChar == c'\\') && + (secondChar == c'/' || secondChar == c'\\')) { let temp: string = input.substring(2); let pos: number = 0; @@ -741,7 +743,7 @@ export namespace url { } } } else { - if (input.charAt(0) == c'/' || input.charAt(0) == c'\\') { + if (firstChar == c'/' || firstChar == c'\\') { input = input.substring(1); } this.analysizeFilePath(input); @@ -1945,11 +1947,9 @@ export namespace url { result.urlInner = resUrl; return result; } - if ((input.charAt(0) == c'/') && (input.charAt(1) == c'/' || (input.charAt(1) == c'\\' && possibleBaseURL.flags[INDEX_SPECIAL]))) { - let newInput: string = possibleBaseURL.cScheme + input; - resUrl.flags[INDEX_INVALID] = false - resUrl.parseSingleUrl(newInput); - result.urlInner = resUrl; + let needReturn = false; + const firstChar = URL.parseBaseInner(input, possibleBaseURL, resUrl, result, needReturn); + if (needReturn) { return result; } if (!possibleBaseURL.flags[INDEX_INFOPATH]) { @@ -1988,24 +1988,20 @@ export namespace url { result.urlInner = resUrl; return result; } - if (input.length != 0) { - if ((input.charAt(0) == c'/') && (input.charAt(1) == c'/' || (input.charAt(1) == c'\\' && base.flags[INDEX_SPECIAL]))) { - let newInput: string = base.cScheme + input; - resUrl.flags[INDEX_INVALID] = false - resUrl.initOnlyInput(newInput); - result.urlInner = resUrl; - return result; - } + let needReturn = false; + const firstChar = URL.parseBaseInner(input, base, resUrl, result, needReturn); + if (needReturn) { + return result; } if (!base.flags[INDEX_INFOPATH]) { resUrl.flags[INDEX_INVALID] = false baseIntoUrl(base, resUrl, input.length == 0); strInput = resUrl.toolHasBase(input, strInput); - if (input.length != 0 && input.charAt(0) != c'/' && resUrl.cPath.length == 0) { + if ((input.length > 0) && firstChar != c'/' && resUrl.cPath.length == 0) { resUrl.cPath = base.cPath; resUrl.flags[INDEX_PATH] = base.flags[INDEX_PATH]; } - if (input.length != 0 && input.charAt(0) != c'/' && resUrl.cPath.length != 0) { + if ((input.length > 0) && firstChar != c'/' && resUrl.cPath.length != 0) { let isFile: boolean = resUrl.cScheme == "file:"; shorteningPath(resUrl, base, isFile); let basePathStr: string = basePathToString(base); @@ -2022,6 +2018,19 @@ export namespace url { result.urlInner = resUrl; return result; } + + private static parseBaseInner(input: string, base: InnerURL, resUrl: InnerURL, result: URL, needReturn: Boolean): Char | '' { + const firstChar = input.length > 0 ? input.charAt(0) : ''; + const secondChar = input.length > 1 ? input.charAt(1) : ''; + if ((input.length > 0) && (firstChar == c'/') && (secondChar == c'/' || (secondChar == c'\\' && base.flags[INDEX_SPECIAL]))) { + let newInput: string = base.cScheme + input; + resUrl.flags[INDEX_INVALID] = false; + resUrl.initOnlyInput(newInput); + result.urlInner = resUrl; + needReturn = true; + } + return firstChar; + } } function removeKeyValuePairs(str: string, key: string): string { diff --git a/static_core/plugins/ets/tests/ets_sdk/api/@ohos/url/UrlTestHref.ets b/static_core/plugins/ets/tests/ets_sdk/api/@ohos/url/UrlTestHref.ets index e41b202a8f..47a192a103 100644 --- a/static_core/plugins/ets/tests/ets_sdk/api/@ohos/url/UrlTestHref.ets +++ b/static_core/plugins/ets/tests/ets_sdk/api/@ohos/url/UrlTestHref.ets @@ -386,6 +386,12 @@ function testUrlGetHost001() { arktest.assertEQ(params.toString(), 'http://usme@www.test.com:77/directory/file?query#fragment'); } +function testUrlConstruction013() { + let urlStr = 'htt1p://www.0902zy.cn/path?abc=123&def=456#yyyy'; + let murl = url.URL.parseURL('', urlStr); + arktest.assertEQ(murl.href, urlStr); +} + function main(): int { let suite = new arktest.ArkTestsuite("URL UT tests"); suite.addTest("testUrlHref001", testUrlHref001); @@ -413,6 +419,7 @@ function main(): int { suite.addTest("testUrlHost001", testUrlHost001); suite.addTest("testUrlPort001", testUrlPort001); suite.addTest("testUrlGetHost001", testUrlGetHost001); + suite.addTest("testUrlConstruction013", testUrlConstruction013); //passed return suite.run(); -- Gitee