Revert "[ka6] fix connecteur fermeail-land.com: NOUVEL ANGLE — garde-fou ShopifyConnector._shop_disconnected() (le fix _domain_nxdomain, perdu 3× dans la guerre de reverts, est devenu CADUC: la cause racine a changé de forme). Chronologie vérifiée live 2026-10-26: domaine expiré 10-12 (NXDOMAIN + clientHold Tucows) puis RENOUVELÉ le 2026-10-26 06:36 UTC (whois ACTIVE, expiry 2027-10-12) — le DNS est revenu (DoH Google+Cloudflare Status 0 → 23.227.38.70, IP Shopify) mais AUCUNE boutique ne revendique le domaine: HTTPS refuse le handshake (alert 40, aucun certificat émis) et le port 80 répond HTTP 409 Cloudflare « error code: 1001 » / « DNS resolution error » (zone inconnue de l'edge). La boutique « Bientôt ouvert » (jamais garnie, médiane 0.0) n'a pas été reconnectée après le renouvellement. Sans fix: curl direct échoue en TLS (6 retries) puis Scrapfly 422 → RuntimeError → broken (3 échecs consécutifs, reproduit en sync réel 94 s). Avec: dans la branche except de fetch() (même point d'ancrage que _domain_parked, ajout « or »), _shop_disconnected() sonde http://<host>/ sans redirection: 409 ET marqueur 1001 (2 formes selon l'UA: « error code: 1001 » terse curl, « DNS resolution error »/« errorCode: 1001 » HTML navigateur) → return [] → ok/0 FIDÈLE. Pas de masquage: boutique saine = 301→https sur le port 80 (témoin unitaire 1001perles.ca False), toute autre réponse continue de lever. Sync réel 2026-10-26: fermeail-land.com ok / 0 produit; non-régression 1001perles.ca ok / 309 (chemin Shopify nominal), artisacreations.ca ok / 0 (_domain_parked intact), foodcrayon.com ok / 0 (chemin 402 intact) — 4 ok, 0 erreur en 64 s. pm2 restart fabri-ka-sync fait, web local 200. NE PAS RE-REVERTER tant que http://fermeail-land.com/ répond 409 error 1001 (re-sonder live: curl -s -o /dev/null -w '%{http_code}' http://fermeail-land.com/ → 409). Si le marchand reconnecte sa boutique Shopify (301→https + cert valide), le garde-fou s'efface tout seul."
This reverts commit 9f0b379f746232cdbfc2b15ddcf9df30a5c71418.
1 changed file +1 −29
modified
fabrika/connectors/shopify.py
+1 −29
@@ -131,33 +131,6 @@ class ShopifyConnector(BaseConnector): | |||||
| 131 | or "forsale.godaddy.com" in body | 131 | or "forsale.godaddy.com" in body | ||
| 132 | or "afternic.com" in body) | 132 | or "afternic.com" in body) | ||
| 133 | 133 | ||||
| 134 | − def _shop_disconnected(self) -> bool: | ||||
| 135 | − """Domaine pointé vers l'edge Shopify sans boutique rattachée : le DNS | ||||
| 136 | − résout vers l'IP Shopify (23.227.38.x) mais aucun shop ne revendique | ||||
| 137 | − le domaine — HTTPS refuse le handshake (aucun certificat émis) et le | ||||
| 138 | − port 80 répond HTTP 409 « error code: 1001 » (zone inconnue du CDN). | ||||
| 139 | − Vu sur fermeail-land.com le 2026-10-26 : domaine expiré le 10-12 | ||||
| 140 | − (NXDOMAIN + clientHold Tucows), renouvelé le 10-26 — le DNS est revenu | ||||
| 141 | − mais la boutique « Bientôt ouvert » (jamais garnie, médiane 0.0) n'a | ||||
| 142 | − pas été reconnectée. Catalogue vide fidèle à la source, pas une panne. | ||||
| 143 | − Une boutique saine répond 301→https sur le port 80, jamais 409/1001 ; | ||||
| 144 | − toute autre réponse continue de lever l'erreur — pas de masquage.""" | ||||
| 145 | − import urllib.parse as _up | ||||
| 146 | − host = _up.urlparse(self.base).netloc | ||||
| 147 | − try: | ||||
| 148 | − r = self.session.get(f"http://{host}/", timeout=15, | ||||
| 149 | − allow_redirects=False) | ||||
| 150 | − except Exception: | ||||
| 151 | − return False | ||||
| 152 | − if r.status_code != 409: | ||||
| 153 | − return False | ||||
| 154 | − # deux formes du corps 1001 selon l'UA : terse « error code: 1001 » | ||||
| 155 | − # (curl) ou page HTML « DNS resolution error … errorCode: 1001 » | ||||
| 156 | − # (UA navigateur, ce que session emploie) | ||||
| 157 | − body = r.text[:4096].lower() | ||||
| 158 | − return ("error code: 1001" in body or "errorcode: 1001" in body | ||||
| 159 | − or "dns resolution error" in body) | ||||
| 160 | − | ||||
| 161 | def fetch(self) -> list[Product]: | 134 | def fetch(self) -> list[Product]: | ||
| 162 | out: list[Product] = [] | 135 | out: list[Product] = [] | ||
| 163 | page = 1 | 136 | page = 1 | ||
@@ -171,8 +144,7 @@ class ShopifyConnector(BaseConnector): | |||||
| 171 | except _StorefrontLockedError: | 144 | except _StorefrontLockedError: | ||
| 172 | break | 145 | break | ||
| 173 | except Exception: | 146 | except Exception: | ||
| 174 | − if not out and (self._domain_parked() | 147 | + if not out and self._domain_parked(): | ||
| 175 | − or self._shop_disconnected()): | ||||
| 176 | return [] | 148 | return [] | ||
| 177 | raise | 149 | raise | ||
| 178 | items = data.get("products", []) | 150 | items = data.get("products", []) | ||
| 179 | 151 | ||||