Use archive as fallback only when dealing with major version
This commit is contained in:
		| @ -25,7 +25,12 @@ describe('findPackageForDownload', () => { | ||||
|     [ | ||||
|       '20', | ||||
|       '20', | ||||
|       'https://download.oracle.com/java/20/archive/jdk-20_{{OS_TYPE}}-x64_bin.{{ARCHIVE_TYPE}}' | ||||
|       'https://download.oracle.com/java/20/latest/jdk-20_{{OS_TYPE}}-x64_bin.{{ARCHIVE_TYPE}}' | ||||
|     ], | ||||
|     [ | ||||
|       '18', | ||||
|       '18', | ||||
|       'https://download.oracle.com/java/18/archive/jdk-18_{{OS_TYPE}}-x64_bin.{{ARCHIVE_TYPE}}' | ||||
|     ], | ||||
|     [ | ||||
|       '20.0.1', | ||||
| @ -35,7 +40,7 @@ describe('findPackageForDownload', () => { | ||||
|     [ | ||||
|       '17', | ||||
|       '17', | ||||
|       'https://download.oracle.com/java/17/archive/jdk-17_{{OS_TYPE}}-x64_bin.{{ARCHIVE_TYPE}}' | ||||
|       'https://download.oracle.com/java/17/latest/jdk-17_{{OS_TYPE}}-x64_bin.{{ARCHIVE_TYPE}}' | ||||
|     ], | ||||
|     [ | ||||
|       '17.0.1', | ||||
| @ -53,6 +58,19 @@ describe('findPackageForDownload', () => { | ||||
|       }) | ||||
|     ); | ||||
|  | ||||
|     /** | ||||
|      * NOTE - Should fail to retrieve 18 from latest and check archive instead | ||||
|      */ | ||||
|     if (input === '18') { | ||||
|       spyHttpClient.mockReturnValueOnce( | ||||
|         Promise.resolve({ | ||||
|           message: { | ||||
|             statusCode: 404 | ||||
|           } | ||||
|         }) | ||||
|       ); | ||||
|     } | ||||
|  | ||||
|     const result = await distribution['findPackageForDownload'](input); | ||||
|  | ||||
|     jest.restoreAllMocks(); | ||||
| @ -75,7 +93,7 @@ describe('findPackageForDownload', () => { | ||||
|       jest.spyOn(os, 'arch').mockReturnValue(osArch); | ||||
|       jest.spyOn(os, 'platform').mockReturnValue('linux'); | ||||
|  | ||||
|       const version = '17'; | ||||
|       const version = '18'; | ||||
|       const distro = new OracleDistribution({ | ||||
|         version, | ||||
|         architecture: '', // to get default value | ||||
| @ -89,7 +107,7 @@ describe('findPackageForDownload', () => { | ||||
|       } | ||||
|       const archiveType = getDownloadArchiveExtension(); | ||||
|       const result = await distro['findPackageForDownload'](version); | ||||
|       const expectedUrl = `https://download.oracle.com/java/17/archive/jdk-17_${osType}-${distroArch}_bin.${archiveType}`; | ||||
|       const expectedUrl = `https://download.oracle.com/java/18/archive/jdk-18_${osType}-${distroArch}_bin.${archiveType}`; | ||||
|  | ||||
|       expect(result.url).toBe(expectedUrl); | ||||
|     } | ||||
|  | ||||
							
								
								
									
										32
									
								
								dist/setup/index.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										32
									
								
								dist/setup/index.js
									
									
									
									
										vendored
									
									
								
							| @ -102973,19 +102973,33 @@ class OracleDistribution extends base_installer_1.JavaBase { | ||||
|             } | ||||
|             const platform = this.getPlatform(); | ||||
|             const extension = util_1.getDownloadArchiveExtension(); | ||||
|             const major = range.includes('.') ? range.split('.')[0] : range; | ||||
|             const fileUrl = `${ORACLE_DL_BASE}/${major}/archive/jdk-${range}_${platform}-${arch}_bin.${extension}`; | ||||
|             const isOnlyMajorProvided = !range.includes('.'); | ||||
|             const major = isOnlyMajorProvided ? range : range.split('.')[0]; | ||||
|             const possibleUrls = []; | ||||
|             /** | ||||
|              * NOTE | ||||
|              * If only major version was provided we will check it under /latest first | ||||
|              * in order to retrieve the latest possible version if possible, | ||||
|              * otherwise we will fall back to /archive where we are guaranteed to | ||||
|              * find any version if it exists | ||||
|              */ | ||||
|             if (isOnlyMajorProvided) { | ||||
|                 possibleUrls.push(`${ORACLE_DL_BASE}/${major}/latest/jdk-${major}_${platform}-${arch}_bin.${extension}`); | ||||
|             } | ||||
|             possibleUrls.push(`${ORACLE_DL_BASE}/${major}/archive/jdk-${range}_${platform}-${arch}_bin.${extension}`); | ||||
|             if (parseInt(major) < 17) { | ||||
|                 throw new Error('Oracle JDK is only supported for JDK 17 and later'); | ||||
|             } | ||||
|             const response = yield this.http.head(fileUrl); | ||||
|             if (response.message.statusCode === http_client_1.HttpCodes.NotFound) { | ||||
|                 throw new Error(`Could not find Oracle JDK for SemVer ${range}`); | ||||
|             for (const url of possibleUrls) { | ||||
|                 const response = yield this.http.head(url); | ||||
|                 if (response.message.statusCode === http_client_1.HttpCodes.OK) { | ||||
|                     return { url, version: range }; | ||||
|                 } | ||||
|                 if (response.message.statusCode !== http_client_1.HttpCodes.NotFound) { | ||||
|                     throw new Error(`Http request for Oracle JDK failed with status code: ${response.message.statusCode}`); | ||||
|                 } | ||||
|             } | ||||
|             if (response.message.statusCode !== http_client_1.HttpCodes.OK) { | ||||
|                 throw new Error(`Http request for Oracle JDK failed with status code: ${response.message.statusCode}`); | ||||
|             } | ||||
|             return { url: fileUrl, version: range }; | ||||
|             throw new Error(`Could not find Oracle JDK for SemVer ${range}`); | ||||
|         }); | ||||
|     } | ||||
|     getPlatform(platform = process.platform) { | ||||
|  | ||||
| @ -65,26 +65,48 @@ export class OracleDistribution extends JavaBase { | ||||
|  | ||||
|     const platform = this.getPlatform(); | ||||
|     const extension = getDownloadArchiveExtension(); | ||||
|     const major = range.includes('.') ? range.split('.')[0] : range; | ||||
|     const fileUrl = `${ORACLE_DL_BASE}/${major}/archive/jdk-${range}_${platform}-${arch}_bin.${extension}`; | ||||
|  | ||||
|     const isOnlyMajorProvided = !range.includes('.'); | ||||
|     const major = isOnlyMajorProvided ? range : range.split('.')[0]; | ||||
|  | ||||
|     const possibleUrls: string[] = []; | ||||
|  | ||||
|     /** | ||||
|      * NOTE | ||||
|      * If only major version was provided we will check it under /latest first | ||||
|      * in order to retrieve the latest possible version if possible, | ||||
|      * otherwise we will fall back to /archive where we are guaranteed to | ||||
|      * find any version if it exists | ||||
|      */ | ||||
|     if (isOnlyMajorProvided) { | ||||
|       possibleUrls.push( | ||||
|         `${ORACLE_DL_BASE}/${major}/latest/jdk-${major}_${platform}-${arch}_bin.${extension}` | ||||
|       ); | ||||
|     } | ||||
|  | ||||
|     possibleUrls.push( | ||||
|       `${ORACLE_DL_BASE}/${major}/archive/jdk-${range}_${platform}-${arch}_bin.${extension}` | ||||
|     ); | ||||
|  | ||||
|     if (parseInt(major) < 17) { | ||||
|       throw new Error('Oracle JDK is only supported for JDK 17 and later'); | ||||
|     } | ||||
|  | ||||
|     const response = await this.http.head(fileUrl); | ||||
|     for (const url of possibleUrls) { | ||||
|       const response = await this.http.head(url); | ||||
|  | ||||
|     if (response.message.statusCode === HttpCodes.NotFound) { | ||||
|       throw new Error(`Could not find Oracle JDK for SemVer ${range}`); | ||||
|       if (response.message.statusCode === HttpCodes.OK) { | ||||
|         return {url, version: range}; | ||||
|       } | ||||
|  | ||||
|       if (response.message.statusCode !== HttpCodes.NotFound) { | ||||
|         throw new Error( | ||||
|           `Http request for Oracle JDK failed with status code: ${response.message.statusCode}` | ||||
|         ); | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     if (response.message.statusCode !== HttpCodes.OK) { | ||||
|       throw new Error( | ||||
|         `Http request for Oracle JDK failed with status code: ${response.message.statusCode}` | ||||
|       ); | ||||
|     } | ||||
|  | ||||
|     return {url: fileUrl, version: range}; | ||||
|     throw new Error(`Could not find Oracle JDK for SemVer ${range}`); | ||||
|   } | ||||
|  | ||||
|   public getPlatform(platform: NodeJS.Platform = process.platform): OsVersions { | ||||
|  | ||||
		Reference in New Issue
	
	Block a user
	 Nikolai Laevskii
					Nikolai Laevskii