Retry stale Android VPN WebSocket connects

This commit is contained in:
2026-05-15 09:51:30 +03:00
parent 2cb6005cd3
commit 96566cbe55
2 changed files with 11 additions and 3 deletions
+2 -2
View File
@@ -30,8 +30,8 @@ android {
applicationId "su.cin.rapvpn" applicationId "su.cin.rapvpn"
minSdk 26 minSdk 26
targetSdk 35 targetSdk 35
versionCode 189 versionCode 190
versionName "0.2.189" versionName "0.2.190"
buildConfigField "String", "DEFAULT_BACKEND_URL", "\"${normalizeGradleString(defaultBackendUrl)}\"" buildConfigField "String", "DEFAULT_BACKEND_URL", "\"${normalizeGradleString(defaultBackendUrl)}\""
buildConfigField "String", "DEFAULT_CLUSTER_ID", "\"${normalizeGradleString(defaultClusterId)}\"" buildConfigField "String", "DEFAULT_CLUSTER_ID", "\"${normalizeGradleString(defaultClusterId)}\""
buildConfigField "String", "DEFAULT_ORGANIZATION_ID", "\"${normalizeGradleString(defaultOrganizationId)}\"" buildConfigField "String", "DEFAULT_ORGANIZATION_ID", "\"${normalizeGradleString(defaultOrganizationId)}\""
@@ -24,6 +24,7 @@ final class VpnPacketWebSocketRelay {
private static final int MAX_PACKET_BATCH_PACKETS = 512; private static final int MAX_PACKET_BATCH_PACKETS = 512;
private static final int MAX_PACKET_BATCH_BYTES = 1024 * 1024; private static final int MAX_PACKET_BATCH_BYTES = 1024 * 1024;
private static final int MAX_SINGLE_PACKET_BYTES = 65535; private static final int MAX_SINGLE_PACKET_BYTES = 65535;
private static final long CONNECTING_STALE_MS = 8000;
private final String baseUrl; private final String baseUrl;
private final VpnService vpnService; private final VpnService vpnService;
@@ -37,6 +38,7 @@ final class VpnPacketWebSocketRelay {
private String connectedVpnConnectionId = ""; private String connectedVpnConnectionId = "";
private volatile boolean open; private volatile boolean open;
private volatile boolean connecting; private volatile boolean connecting;
private volatile long connectingSinceMs;
private volatile long reconnectAfterMs; private volatile long reconnectAfterMs;
private volatile String lastError = ""; private volatile String lastError = "";
@@ -87,7 +89,11 @@ final class VpnPacketWebSocketRelay {
return; return;
} }
if (connecting && clusterId.equals(connectedClusterId) && vpnConnectionId.equals(connectedVpnConnectionId)) { if (connecting && clusterId.equals(connectedClusterId) && vpnConnectionId.equals(connectedVpnConnectionId)) {
return; if (now - connectingSinceMs < CONNECTING_STALE_MS) {
return;
}
lastError = "stale websocket connect";
closeLocked();
} }
if (now < reconnectAfterMs) { if (now < reconnectAfterMs) {
return; return;
@@ -102,6 +108,7 @@ final class VpnPacketWebSocketRelay {
connectedClusterId = clusterId; connectedClusterId = clusterId;
connectedVpnConnectionId = vpnConnectionId; connectedVpnConnectionId = vpnConnectionId;
connecting = true; connecting = true;
connectingSinceMs = now;
Request.Builder requestBuilder = new Request.Builder().url(wsUrl); Request.Builder requestBuilder = new Request.Builder().url(wsUrl);
this.fabricServiceChannel.applyHeaders(requestBuilder); this.fabricServiceChannel.applyHeaders(requestBuilder);
Request request = requestBuilder.build(); Request request = requestBuilder.build();
@@ -147,6 +154,7 @@ final class VpnPacketWebSocketRelay {
private void closeLocked() { private void closeLocked() {
open = false; open = false;
connecting = false; connecting = false;
connectingSinceMs = 0;
incoming.clear(); incoming.clear();
if (webSocket != null) { if (webSocket != null) {
try { try {