From b5ca3cd37120e8808ee37d0bed9ef5f298cff7ec Mon Sep 17 00:00:00 2001 From: duffyduck Date: Sun, 24 May 2026 20:50:43 +0200 Subject: [PATCH] =?UTF-8?q?fix(bridge):=20TLS-Fallback=20klebt=20nicht=20m?= =?UTF-8?q?ehr=20=E2=80=94=20bei=20Reconnect=20zurueck=20zu=20wss://?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bei kurzem TLS-Fehler beim ersten Connect (z.B. Caddy noch im ACME- Setup) wechselte die Bridge auf den ws://-Fallback und blieb dort permanent kleben. Jeder spaetere Reconnect-Versuch landete dann auf plain ws:// gegen den TLS-only Caddy-Endpoint → HTTP 400 → erneut Connection lost → endlos. Fix: Bei jeder ConnectionClosed/Refused/InvalidMessage-Exception wird using_fallback=False und current_url=self.rvs_url (= primary wss://) zurueckgesetzt. Bridge probiert bei jedem Reconnect zuerst primary, faellt nur einmal pro Connect-Cycle auf ws:// zurueck. Sobald TLS verfuegbar ist, ist sie auf wss:// stabil. Co-Authored-By: Claude Opus 4.7 (1M context) --- bridge/aria_bridge.py | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/bridge/aria_bridge.py b/bridge/aria_bridge.py index 72b073f..41baf6f 100644 --- a/bridge/aria_bridge.py +++ b/bridge/aria_bridge.py @@ -1614,10 +1614,21 @@ class ARIABridge: except websockets.ConnectionClosed: logger.warning("[rvs] Verbindung verloren") + # Bei Reconnect wieder primary (wss://) versuchen — die + # Bedingungen die zum Fallback gefuehrt haben sind transient + # (z.B. Caddy noch nicht fertig mit ACME). + if using_fallback: + logger.info("[rvs] Reset auf primary URL fuer Reconnect-Versuch") + current_url = self.rvs_url + using_fallback = False except ConnectionRefusedError: logger.warning("[rvs] Nicht erreichbar") + if using_fallback: + current_url = self.rvs_url + using_fallback = False except (ssl.SSLError, OSError) as e: - # TLS-Fehler — Fallback auf ws:// versuchen + # TLS-Fehler — Fallback auf ws:// nur einmal pro Connect-Versuch, + # bei naechstem Reconnect wieder primary probieren. if not using_fallback and self.rvs_url_fallback: logger.warning("[rvs] TLS-Fehler: %s", e) logger.warning("[rvs] TLS gewollt aber nicht verfuegbar — Fallback auf ws://") @@ -1626,8 +1637,17 @@ class ARIABridge: retry_delay = 1 # Sofort versuchen else: logger.error("[rvs] SSL-Fehler (kein Fallback): %s", e) - except Exception: + # Auch hier: nach gescheitertem Fallback wieder primary probieren + current_url = self.rvs_url + using_fallback = False + except Exception as e: logger.exception("[rvs] WebSocket-Fehler") + # InvalidMessage (HTTP 400 von TLS-Endpoint bei ws-Connect) + # → wir kleben auf dem falschen Fallback, zurueck zu primary. + if using_fallback: + logger.warning("[rvs] Fallback liefert auch nichts — schalte zurueck auf primary") + current_url = self.rvs_url + using_fallback = False finally: self.ws_rvs = None