fix(core): ходить в CORE через sing-box — с российских адресов ключ не работает
Заливка встала после двух порций: прогоны стали заканчиваться за две минуты с нулём документов. Выглядело как поломка сети, и на ложные следы ушло время — MTU в норме (1472 байта проходят), IPv6 ни при чём, Cloudflare из того же контейнера качается на 2.2 МБ/с, ключ и квота целы (с домашней машины тот же запрос отвечает за 6с, лимит нетронут). Разница оказалась в адресе. С прода: напрямую — код 000, обрыв на 25с (соединение есть, тело не приходит) через sing-box — код 200 за 1.7с, 207 КБ Анонимные короткие запросы проходят и напрямую — поэтому блокировка и маскировалась под сетевой сбой. CORE ведёт себя как OpenRouter, ради которого singbox-proxy и заводили, поэтому решение то же: httpx получает proxy из CORE_PROXY_URL (умолчание — socks5://singbox-proxy:1080, пусто = напрямую для локальных прогонов). В образ индексатора добавлен socksio: без него httpx не умеет SOCKS5. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -9,7 +9,7 @@
|
||||
запрос идёт ровно одно условие, а годы отсекаются уже на нашей стороне.
|
||||
"""
|
||||
|
||||
from core import MIN_CHARS, COREParser
|
||||
from core import DEFAULT_PROXY, MIN_CHARS, COREParser
|
||||
|
||||
LONG = "слово " * 400 # заведомо длиннее MIN_CHARS
|
||||
|
||||
@@ -52,7 +52,7 @@ def test_parse_token():
|
||||
|
||||
|
||||
def test_transform_maps_fields():
|
||||
t = COREParser().transform(SAMPLE)
|
||||
t = COREParser(proxy_url="").transform(SAMPLE)
|
||||
assert t["ext_id"] == "core:123456"
|
||||
assert t["source"] == "core"
|
||||
assert t["year"] == 2019 and t["lang"] == "ru"
|
||||
@@ -65,20 +65,20 @@ def test_transform_maps_fields():
|
||||
|
||||
|
||||
def test_transform_skips_short_text():
|
||||
assert COREParser().transform(dict(SAMPLE, fullText="коротко")) == {}
|
||||
assert COREParser().transform(dict(SAMPLE, fullText=None)) == {}
|
||||
assert COREParser().transform(dict(SAMPLE, id=None)) == {}
|
||||
assert COREParser(proxy_url="").transform(dict(SAMPLE, fullText="коротко")) == {}
|
||||
assert COREParser(proxy_url="").transform(dict(SAMPLE, fullText=None)) == {}
|
||||
assert COREParser(proxy_url="").transform(dict(SAMPLE, id=None)) == {}
|
||||
|
||||
|
||||
def test_transform_drops_undefined_language():
|
||||
# zz у CORE значит «язык не определён» — в корпус такое класть незачем
|
||||
assert COREParser().transform(dict(SAMPLE, language={"code": "zz"}))["lang"] is None
|
||||
assert COREParser().transform(dict(SAMPLE, language=None))["lang"] is None
|
||||
assert COREParser(proxy_url="").transform(dict(SAMPLE, language={"code": "zz"}))["lang"] is None
|
||||
assert COREParser(proxy_url="").transform(dict(SAMPLE, language=None))["lang"] is None
|
||||
|
||||
|
||||
def _parser_with_pages(pages):
|
||||
"""Парсер, у которого выдача подменена заранее заготовленными страницами."""
|
||||
p = COREParser(api_key="test")
|
||||
p = COREParser(api_key="test", proxy_url="")
|
||||
calls = []
|
||||
|
||||
def fake_page(part, query, offset):
|
||||
@@ -144,3 +144,13 @@ def test_fetch_filters_years_on_our_side():
|
||||
|
||||
def test_min_chars_threshold_is_meaningful():
|
||||
assert MIN_CHARS >= 1000
|
||||
|
||||
|
||||
def test_proxy_choice(monkeypatch):
|
||||
# CORE не отвечает на ключ с российских адресов — по умолчанию идём через
|
||||
# sing-box, но вне compose-сети прокси отключают пустым значением
|
||||
monkeypatch.delenv("CORE_PROXY_URL", raising=False)
|
||||
assert COREParser._proxy(None) == DEFAULT_PROXY
|
||||
monkeypatch.setenv("CORE_PROXY_URL", "socks5://иной:1080")
|
||||
assert COREParser._proxy(None) == "socks5://иной:1080"
|
||||
assert COREParser._proxy("") == "" # явное «без прокси» сильнее окружения
|
||||
|
||||
Reference in New Issue
Block a user