ZapretKVN-android/app
Repository files (latest commit first)
Filename Latest commit message Latest commit date
loop-uh f218d777c9
Some checks failed
Android CI / build (push) Failing after 5m51s
Подписка: сначала прямая (не-VPN) сеть, туннель — фолбэк только без ответа
Симптом: при включённом VPN обновление подписки могло падать (таймаут
TLS-рукопожатия к хосту подписки), хотя напрямую сервер отвечает — деградация
egress туннеля превращала рабочую ссылку в ошибку.

Причина: HttpSubscriptionFetcher открывал соединение по сети по умолчанию,
которая при активном VpnService — это туннель. Прямой попытки не было вовсе.

Инвариант: URL подписки указывает на инфраструктуру провайдера и отвечает
одинаково на любом пути. Тянем его сначала по не-VPN сети (allNetworks без
TRANSPORT_VPN); на путь по умолчанию (туннель) уходим только при transport-
провале — когда ответа не пришло. Любой HTTP-ответ (в т.ч. 404 отозванной
ссылки) авторитетен и терминален, не маскируется VPN-повтором.

- HttpSubscriptionFetcher: инъектируемый openConnection(url, direct) +
  предикат directAvailable; fetchVia(direct) и оркестратор fetch с фолбэком
  по IOException. ImportException (ответ сервера) пробрасывается как терминал.
- AppContainer: directAvailable/openConnection выбирают текущую не-VPN сеть
  через ConnectivityManager.

Тесты (локальный HttpServer, без мока Network): transport-провал direct уходит
на путь по умолчанию и выигрывает; HTTP-ответ direct терминален и на VPN не
уходит; без не-VPN сети используется путь по умолчанию без изменений.
Существующие 13 тестов SubscriptionClientTest зелёные.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-09-15 14:24:34 +03:00
..
src Подписка: сначала прямая (не-VPN) сеть, туннель — фолбэк только без ответа 2026-09-15 14:24:34 +03:00
build.gradle.kts feat: unify official WG/AWG engine and preserve full UDP datagrams 2026-09-06 00:14:22 +03:00
proguard-rules.pro Initial Zapret KVN Android MVP 2026-07-22 14:44:50 +03:00