fix(bridge): TLS-Fallback klebt nicht mehr — bei Reconnect zurueck zu wss://

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) <noreply@anthropic.com>
This commit is contained in:
2026-05-24 20:50:43 +02:00
parent d939fc4ac3
commit b5ca3cd371
+22 -2
View File
@@ -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