fix(scraper): SAFE_ACCEPT_ENCODING compartida — cubre la sesión SearXNG olvidada
La sesión aiohttp de _search_searxng (camino primario de búsqueda) construía
sus headers sin Accept-Encoding: heredaba el default de aiohttp, que volvería
a anunciar br si algún día se reinstala un backend brotli. El valor vive ahora
en src/config.py (SAFE_ACCEPT_ENCODING) en vez de copiado literal por sitio.
También corrige el comentario de HEADERS que afirmaba que brotlicffi seguía
instalado como fallback — 397546a lo quitó: un br no anunciado hoy falla sin
recuperación y la fuente se pierde.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Fable 5
parent
3d74857d85
commit
634f38e016
@@ -2,6 +2,13 @@ from pydantic_settings import BaseSettings, SettingsConfigDict
|
||||
from pydantic import Field
|
||||
from typing import Optional
|
||||
|
||||
# Accept-Encoding para TODA petición aiohttp del proyecto. Nunca anunciar "br":
|
||||
# el descompresor incremental de aiohttp 3.14 está roto, y con un backend brotli
|
||||
# instalado aiohttp lo anunciaría POR DEFECTO en cualquier sesión sin
|
||||
# Accept-Encoding explícito (incidente 2026-07-04, ver KNOWN-ISSUES.md).
|
||||
# Toda sesión/petición nueva debe usar esta constante, no un literal.
|
||||
SAFE_ACCEPT_ENCODING = "gzip, deflate"
|
||||
|
||||
|
||||
class Settings(BaseSettings):
|
||||
# Telegram
|
||||
|
||||
@@ -18,7 +18,7 @@ from duckduckgo_search import DDGS
|
||||
from youtube_transcript_api import YouTubeTranscriptApi, NoTranscriptFound
|
||||
from tenacity import retry, stop_after_attempt, wait_exponential
|
||||
|
||||
from src.config import settings
|
||||
from src.config import settings, SAFE_ACCEPT_ENCODING
|
||||
from src.db.database import ResearchDB
|
||||
|
||||
logger = structlog.get_logger()
|
||||
@@ -29,10 +29,11 @@ HEADERS = {
|
||||
"Accept-Language": "en-US,en;q=0.9,es;q=0.8",
|
||||
# Sin "br": el descompresor incremental de aiohttp 3.14 falla con streams
|
||||
# brotli válidos según el troceo de chunks (disclosure.org, todaywhy.com;
|
||||
# los mismos bytes descomprimen bien offline con brotlicffi). Con gzip el
|
||||
# camino zlib es sólido. brotlicffi queda instalado por si algún servidor
|
||||
# manda br sin que se anuncie.
|
||||
"Accept-Encoding": "gzip, deflate",
|
||||
# los mismos bytes descomprimen bien offline). Con gzip el camino zlib es
|
||||
# sólido. OJO: ya NO hay ningún backend brotli instalado (397546a quitó
|
||||
# brotlicffi) — si un servidor responde br sin que se haya anunciado,
|
||||
# aiohttp falla sin recuperación posible y esa fuente se pierde.
|
||||
"Accept-Encoding": SAFE_ACCEPT_ENCODING,
|
||||
"DNT": "1",
|
||||
}
|
||||
|
||||
@@ -41,7 +42,7 @@ REDDIT_HEADERS = {
|
||||
"User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36",
|
||||
"Accept": "application/json, text/javascript, */*; q=0.01",
|
||||
"Accept-Language": "en-US,en;q=0.9",
|
||||
"Accept-Encoding": "gzip, deflate", # sin "br", ver HEADERS
|
||||
"Accept-Encoding": SAFE_ACCEPT_ENCODING, # sin "br", ver HEADERS
|
||||
"Referer": "https://www.reddit.com/",
|
||||
"X-Requested-With": "XMLHttpRequest",
|
||||
}
|
||||
@@ -264,6 +265,10 @@ class ExhaustiveScraper:
|
||||
"Accept": "application/json",
|
||||
"X-Forwarded-For": "127.0.0.1",
|
||||
"User-Agent": "ResearchOwl/1.0",
|
||||
# Sin esto la sesión hereda el default de aiohttp, que anunciaría
|
||||
# br si algún día se reinstala un backend brotli — y el decode roto
|
||||
# de 3.14 tumbaría TODAS las búsquedas SearXNG (el camino primario).
|
||||
"Accept-Encoding": SAFE_ACCEPT_ENCODING,
|
||||
}
|
||||
try:
|
||||
async with aiohttp.ClientSession() as session:
|
||||
|
||||
Reference in New Issue
Block a user