ITADN

fix: per-call mirror fallback в downloader'ах

#51Pull Requestoviron 创建于 2026-05-13
O
ovironcommented
В связи с проблемами доступа к гитхабу из РФ решил поковырять xkeen в эту сторону. Посмотрел на текущий fallback: `test_github` в начале команды один раз выбирает откуда качать (direct, `gh_proxy1` или `gh_proxy2`) и фиксирует это на всю сессию. Если выбранный вариант отвалится между проверкой и реальным скачиванием, дальше всё тихо не качается, файлы остаются прошлой недели, никакого сигнала об ошибке. Предлагаю решать на каждый файл отдельно, а не один раз. Тем более в `install.sh` такой fallback (direct -> gh-proxy.com -> ghfast.top) уже есть, просто до остальных downloader'ов не дотянут. Сделал общий `fetch_with_mirrors` в `04_tools/07_tools_downloaders/00_fetch_with_mirrors.sh`, через него теперь идут `process_geo_file`, `install_geoipset_lst` и `download_xray`/`download_mihomo`/`download_xkeen`. На каждый вызов пробует cached -> direct -> `gh_proxy1` -> `gh_proxy2`, кэш в `/tmp/.xkeen_mirror_cache` с TTL 60 секунд, чтобы серия из нескольких файлов прошла через один канал, но после простоя пробовался свежий выбор. Пишет во временный файл, после успешной проверки переименовывает в финальный. Проверка по умолчанию смотрит на размер и на первые 100 байт: если там html-страница или текст ошибки вроде `404 Not Found` или `Error: 502`, файл считается невалидным. Для xray и mihomo в комплекте идёт `probe_with_mirrors`. Это `HEAD`-запрос с фолбэком на короткий `GET` с заголовком `Range`, для прокси, которые отвечают `405` на `HEAD`. Возвращает `0` / `1` / `2` чтобы downloader отличал "версия не существует" от "надо ретрайнуть". Заодно вырезал локальную `check_url_availability` на 60 строк, она была скопирована в двух местах байт-в-байт. `test_github` тоже свёл к тонкой обёртке вокруг `probe_with_mirrors` (75 -> 32 строки), чтобы fallback chain больше не дублировался. Что поменялось: - mirror пробуется на каждый файл, а не один раз на сессию - ошибки скачивания различаются по причине (нет связи, слишком маленький, html-страница, `4xx`, таймаут, curl rc), downloader'ы выводят понятные сообщения Что осталось как было: - `gh_proxy_user` в `xkeen.json` exclusive: если задан, используется только он, без скрытого fallback на default - проверка двух URL в `test_github` - сообщения "GitHub доступен / через прокси / через ваш прокси", `exit 1` при полной недоступности - логика выбора версии xray/mihomo через GitHub API с jsDelivr fallback не тронута - тексты ошибок в downloader'ах те же: "загруженный файл слишком мал", "получена HTML-страница", "Файл не найден (404)", "Доступ запрещен (403)", "Таймаут при проверке", "Ошибка curl (N)" Проверил на Hopper SE (aarch64), xray в Hybrid: - `xkeen -ug` качает все геофайлы, кэш direct - `iptables -A OUTPUT -d 140.82.0.0/16 -j DROP` + `xkeen -ug`: переключение на gh-proxy.com за 12 секунд (до фикса падало с "GitHub недоступен") - дополнительно DROP gh-proxy.com: идёт через ghfast.top - `gh_proxy` в `xkeen.json` указан на нерабочий: за секунду `exit 1` "Указанный вами прокси недоступен", без скрытого fallback на default - `xkeen -uxr` с несуществующей версией: probe вернул код `2`, "Файл не найден (404)", loop попросил ввести версию заново Такое решение на ваш суд. Если что-то не нравится или есть взгляд под другим углом, готов поменять или доделать.
合并状态:未合并 1 条评论