From a72fd9206be76d2183d8ff94cef9f38d38e47bc2 Mon Sep 17 00:00:00 2001 From: Philipp Heckel Date: Mon, 12 Jan 2026 21:32:52 -0500 Subject: [PATCH] Fix WebSocket error detection logic --- app/src/main/java/io/heckel/ntfy/service/Connection.kt | 8 ++++++++ app/src/main/java/io/heckel/ntfy/service/WsConnection.kt | 3 ++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/io/heckel/ntfy/service/Connection.kt b/app/src/main/java/io/heckel/ntfy/service/Connection.kt index 0cc76b86..aad27496 100644 --- a/app/src/main/java/io/heckel/ntfy/service/Connection.kt +++ b/app/src/main/java/io/heckel/ntfy/service/Connection.kt @@ -2,6 +2,7 @@ package io.heckel.ntfy.service import okhttp3.internal.http2.StreamResetException import java.io.EOFException +import java.net.ProtocolException interface Connection { fun start() @@ -57,6 +58,13 @@ fun isConnectionBrokenException(t: Throwable): Boolean { return t.hasCause() || t.hasCause() } +/** + * ProtocolException is thrown by the OkHttp library when the WebSocket handshake fails. + */ +fun isProtocolException(t: Throwable): Boolean { + return t.hasCause() +} + /** * Checks if the throwable or any of its causes is of the specified type. */ diff --git a/app/src/main/java/io/heckel/ntfy/service/WsConnection.kt b/app/src/main/java/io/heckel/ntfy/service/WsConnection.kt index f54bb6e7..61223474 100644 --- a/app/src/main/java/io/heckel/ntfy/service/WsConnection.kt +++ b/app/src/main/java/io/heckel/ntfy/service/WsConnection.kt @@ -17,6 +17,7 @@ import okhttp3.OkHttpClient import okhttp3.Response import okhttp3.WebSocket import okhttp3.WebSocketListener +import java.net.ProtocolException import java.util.Calendar import java.util.concurrent.atomic.AtomicLong import java.util.concurrent.atomic.AtomicReference @@ -191,8 +192,8 @@ class WsConnection( // - Handle servers that do not support WebSockets val error = when { isConnectionBrokenException(t) -> null + isProtocolException(t) -> WebSocketNotSupportedException(response!!.code, response.message, t) isResponseCode(response, 401, 403) -> NotAuthorizedException(response!!.code, response.message, t) - isResponseCode(response, 101) -> WebSocketNotSupportedException(response!!.code, response.message, t) else -> t } connectionDetailsListener(baseUrl, ConnectionState.CONNECTING, error, nextRetryTime)