diff --git a/dist/index.js b/dist/index.js index 8cbfb72..efd00c1 100644 --- a/dist/index.js +++ b/dist/index.js @@ -1283,15 +1283,36 @@ class GitHubHelper { if (token) { options.auth = `${token}`; } - if (githubServerHostname !== 'github.com') { - options.baseUrl = `https://${githubServerHostname}/api/v1`; - } - else { - options.baseUrl = 'https://api.github.com'; - } + options.baseUrl = this.determineApiPath(githubServerHostname); options.throttle = octokit_client_1.throttleOptions; this.octokit = new octokit_client_1.Octokit(options); } + determineApiPath(hostname) { + if (hostname === 'github.com') { + return "https://api.github.com"; + } + const baseUrl = `https://${hostname}`; + const possiblePaths = ['/api/v4/version', '/api/forgejo/v1/version', '/api/v1/version']; + for (const path of possiblePaths) { + try { + const url = `${baseUrl}${path}`; + const xhr = new XMLHttpRequest(); + xhr.open('GET', url, false); // false makes it synchronous + xhr.setRequestHeader('Accept', 'application/json'); + xhr.send(); + if (xhr.status === 200 || xhr.status === 401 || xhr.status === 403) { + const contentType = xhr.getResponseHeader('Content-Type') || ''; + if (contentType.includes('application/json')) { + return path.includes('/version') ? url.replace('/version', '') : url; + } + } + } + catch (error) { + // Try the next path + } + } + throw new Error(`Unable to determine API base URL for hostname: ${hostname}`); + } parseRepository(repository) { const [owner, repo] = repository.split('/'); return { diff --git a/src/github-helper.ts b/src/github-helper.ts index 82a9296..1a979f2 100644 --- a/src/github-helper.ts +++ b/src/github-helper.ts @@ -46,15 +46,43 @@ export class GitHubHelper { if (token) { options.auth = `${token}` } - if (githubServerHostname !== 'github.com') { - options.baseUrl = `https://${githubServerHostname}/api/v3` - } else { - options.baseUrl = 'https://api.github.com' - } + options.baseUrl = this.determineApiPath(githubServerHostname) options.throttle = throttleOptions this.octokit = new Octokit(options) } + private determineApiPath(hostname: string): string { + if (hostname === 'github.com') { + return "https://api.github.com" + } + + const baseUrl = `https://${hostname}` + const possiblePaths = ['/api/v4/version', '/api/forgejo/v1/version', '/api/v1/version'] + + for (const path of possiblePaths) { + try { + const url = `${baseUrl}${path}` + + const xhr = new XMLHttpRequest(); + xhr.open('GET', url, false); // false makes it synchronous + xhr.setRequestHeader('Accept', 'application/json'); + xhr.send(); + + if (xhr.status === 200 || xhr.status === 401 || xhr.status === 403) { + const contentType = xhr.getResponseHeader('Content-Type') || ''; + if (contentType.includes('application/json')) { + return path.includes('/version') ? url.replace('/version', '') : url; + } + } + } catch (error) { + // Try the next path + core.warning(`API url '${baseUrl}${path}` failes with ${error}); + } + } + + throw new Error(`Unable to determine API base URL for hostname: ${hostname}`) + } + private parseRepository(repository: string): Repository { const [owner, repo] = repository.split('/') return { @@ -403,3 +431,4 @@ export class GitHubHelper { }) } } +