From 58706dbe9df81b5f557c1e78b53c0596075ecbb6 Mon Sep 17 00:00:00 2001 From: Arvin <62139570+wnlen@users.noreply.github.com> Date: Sat, 4 Jul 2026 21:26:30 +0800 Subject: [PATCH] Fix download fallback handling --- scripts/core/common.sh | 3 +- scripts/core/config.sh | 2 +- scripts/dev/check-download-mirror-priority.sh | 42 +++++++++++++++++++ .../check-subscription-download-failure.sh | 37 ++++++++++++++++ 4 files changed, 82 insertions(+), 2 deletions(-) create mode 100644 scripts/dev/check-download-mirror-priority.sh create mode 100644 scripts/dev/check-subscription-download-failure.sh diff --git a/scripts/core/common.sh b/scripts/core/common.sh index fc8cbac..968314d 100644 --- a/scripts/core/common.sh +++ b/scripts/core/common.sh @@ -824,7 +824,8 @@ download_mirror_score() { case "$fail_streak" in ''|*[!0-9]*) fail_streak=0 ;; esac if [ "$label" = "origin" ]; then - score=$((score + 5)) + # Prefer GitHub mirrors by default; keep origin as the final fallback. + score=$((score - 300)) fi if [ "$success_at" -gt 0 ]; then diff --git a/scripts/core/config.sh b/scripts/core/config.sh index 834cfc7..a741184 100644 --- a/scripts/core/config.sh +++ b/scripts/core/config.sh @@ -705,7 +705,7 @@ download_subscription_yaml() { __CLASH_DOWNLOAD_UA="$(subconverter_subscription_user_agent)" \ download_subscription_file \ "$url" \ - "$out_file" + "$out_file" || return 1 subscription_cache_store "$url" "$fmt" "$out_file" "$url" ;; diff --git a/scripts/dev/check-download-mirror-priority.sh b/scripts/dev/check-download-mirror-priority.sh new file mode 100644 index 0000000..8267e1b --- /dev/null +++ b/scripts/dev/check-download-mirror-priority.sh @@ -0,0 +1,42 @@ +#!/usr/bin/env bash +set -euo pipefail + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +PROJECT_DIR="$(cd "$SCRIPT_DIR/../.." && pwd)" + +# shellcheck source=scripts/core/common.sh +source "$PROJECT_DIR/scripts/core/common.sh" + +tmp_dir="$(mktemp -d)" +trap 'rm -rf "$tmp_dir"' EXIT + +RUNTIME_DIR="$tmp_dir/runtime" +mkdir -p "$RUNTIME_DIR" + +unset CLASH_GH_PROXY +unset URL_GH_PROXY +unset CLASH_GH_PROXY_POOL + +url="https://github.com/MetaCubeX/meta-rules-dat/releases/download/latest/country.mmdb" +ordered_entries="$( + github_mirror_candidate_entries_ordered "$url" \ + | sort -t'|' -k1,1nr \ + | cut -d'|' -f2- +)" + +first_label="$(printf '%s\n' "$ordered_entries" | head -n 1 | cut -d'|' -f1)" +last_label="$(printf '%s\n' "$ordered_entries" | tail -n 1 | cut -d'|' -f1)" + +if [ "$first_label" != "gh-proxy" ]; then + echo "not ok - default mirror priority: first label is $first_label, expected gh-proxy" >&2 + printf '%s\n' "$ordered_entries" >&2 + exit 1 +fi + +if [ "$last_label" != "origin" ]; then + echo "not ok - default mirror priority: last label is $last_label, expected origin" >&2 + printf '%s\n' "$ordered_entries" >&2 + exit 1 +fi + +echo "ok - default GitHub downloads prefer mirrors before origin" diff --git a/scripts/dev/check-subscription-download-failure.sh b/scripts/dev/check-subscription-download-failure.sh new file mode 100644 index 0000000..0311697 --- /dev/null +++ b/scripts/dev/check-subscription-download-failure.sh @@ -0,0 +1,37 @@ +#!/usr/bin/env bash +set -euo pipefail + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +PROJECT_DIR="$(cd "$SCRIPT_DIR/../.." && pwd)" + +# shellcheck source=scripts/core/config.sh +source "$PROJECT_DIR/scripts/core/config.sh" + +tmp_dir="$(mktemp -d)" +trap 'rm -rf "$tmp_dir"' EXIT + +RUNTIME_DIR="$tmp_dir/runtime" +mkdir -p "$RUNTIME_DIR" + +export CLASH_AUTO_UPDATE_SUBSCRIPTIONS="true" + +download_subscription_file() { + return 28 +} + +subscription_cache_store() { + echo "not ok - cache store called after failed subscription download" >&2 + return 0 +} + +if download_subscription_yaml "https://example.invalid/sub" "$tmp_dir/sub.yaml" "manual-refresh"; then + echo "not ok - failed subscription download returned success" >&2 + exit 1 +fi + +if [ -e "$tmp_dir/sub.yaml" ]; then + echo "not ok - failed subscription download left an output file" >&2 + exit 1 +fi + +echo "ok - failed subscription download returns failure"