From 405c6b8538152168ea516e110bc437421bc6a83f Mon Sep 17 00:00:00 2001 From: JounQin Date: Mon, 5 Feb 2024 18:01:55 +0800 Subject: [PATCH] fix: handle upstream response error --- README.md | 6 +++--- api/[owner]/[app]/[version].ts | 26 +++++++++++++++++++++++--- 2 files changed, 26 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 221ee413..4086244c 100644 --- a/README.md +++ b/README.md @@ -8,15 +8,15 @@ Stable link that redirects to unstable [App Center][] download link via Vercel. ## Examples -1. `ClashX Pro`: https://appcenter.vercel.app/clashx/clashx-pro/1.30.3.2 - -2. `Timeless`: The followings version and short version are both fine. +1. `Timeless`: The followings version and short version are both fine. - https://appcenter.vercel.app/dangercove/timeless/2020.7 - https://appcenter.vercel.app/dangercove/timeless/37 ![Timeless](https://user-images.githubusercontent.com/8336744/98822766-30e03500-246c-11eb-8cab-f7c31d196f5a.png) +2. ~~`ClashX Pro`: https://appcenter.vercel.app/clashx/clashx-pro/1.30.3.2~~ (The source project is not available anymore.) + ## Sponsors | 1stG | RxTS | UnTS | diff --git a/api/[owner]/[app]/[version].ts b/api/[owner]/[app]/[version].ts index 558d2742..fa115e72 100644 --- a/api/[owner]/[app]/[version].ts +++ b/api/[owner]/[app]/[version].ts @@ -4,6 +4,11 @@ export interface ReleaseInfo { short_version: string } +export interface ErrorResponse { + code: string + message: string +} + export interface DownloadInfo { download_url: string } @@ -40,7 +45,14 @@ export default async (req: Request): Promise => { console.log(`Fetching ${releasesUrl}`) const releasesRes = await fetch(releasesUrl, FETCH_OPTIONS) - const releases = (await releasesRes.json()) as ReleaseInfo[] + + const releases = (await releasesRes.clone().json()) as + | ErrorResponse + | ReleaseInfo[] + + if (!releasesRes.ok || !Array.isArray(releases)) { + return releasesRes + } const matched = releases.find( it => it.version === version || it.short_version === version, @@ -60,8 +72,16 @@ export default async (req: Request): Promise => { console.log(`Fetching ${releaseUrl}`) const downloadInfoRes = await fetch(releaseUrl, FETCH_OPTIONS) - const { download_url: downloadUrl } = - (await downloadInfoRes.json()) as DownloadInfo + + const downloadInfo = (await downloadInfoRes.json()) as + | DownloadInfo + | ErrorResponse + + if (!downloadInfoRes.ok) { + return downloadInfoRes + } + + const { download_url: downloadUrl } = downloadInfo as DownloadInfo console.log(`Redirect to ${downloadUrl}`)