Improve network reliability.

This commit is contained in:
Greyson Parrelli
2023-01-11 13:11:34 -05:00
committed by Alex Hart
parent df86d1b4ba
commit 522346479c
5 changed files with 33 additions and 19 deletions

View File

@@ -14,6 +14,7 @@ import org.whispersystems.signalservice.api.push.exceptions.NonSuccessfulRespons
import org.whispersystems.signalservice.api.push.exceptions.CdsiResourceExhaustedException;
import org.whispersystems.signalservice.api.util.Tls12SocketFactory;
import org.whispersystems.signalservice.api.util.TlsProxySocketFactory;
import org.whispersystems.signalservice.internal.configuration.SignalCdsiUrl;
import org.whispersystems.signalservice.internal.configuration.SignalProxy;
import org.whispersystems.signalservice.internal.configuration.SignalServiceConfiguration;
import org.whispersystems.signalservice.internal.push.CdsiResourceExhaustedResponse;
@@ -29,7 +30,6 @@ import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.time.Instant;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicReference;
import java.util.function.Consumer;
@@ -54,17 +54,17 @@ final class CdsiSocket {
private static final String TAG = CdsiSocket.class.getSimpleName();
private final OkHttpClient okhttp;
private final String baseUrl;
private final String mrEnclave;
private final SignalCdsiUrl cdsiUrl;
private final OkHttpClient okhttp;
private final String mrEnclave;
private Cds2Client client;
CdsiSocket(SignalServiceConfiguration configuration, String mrEnclave) {
this.baseUrl = configuration.getSignalCdsiUrls()[0].getUrl();
this.cdsiUrl = chooseUrl(configuration.getSignalCdsiUrls());
this.mrEnclave = mrEnclave;
Pair<SSLSocketFactory, X509TrustManager> socketFactory = createTlsSocketFactory(configuration.getSignalCdsiUrls()[0].getTrustStore());
Pair<SSLSocketFactory, X509TrustManager> socketFactory = createTlsSocketFactory(cdsiUrl.getTrustStore());
OkHttpClient.Builder builder = new OkHttpClient.Builder()
.sslSocketFactory(new Tls12SocketFactory(socketFactory.first()), socketFactory.second())
@@ -89,13 +89,17 @@ final class CdsiSocket {
return Observable.create(emitter -> {
AtomicReference<Stage> stage = new AtomicReference<>(Stage.WAITING_TO_INITIALIZE);
String url = String.format("%s/v1/%s/discovery", baseUrl, mrEnclave);
Request request = new Request.Builder()
String url = String.format("%s/v1/%s/discovery", cdsiUrl.getUrl(), mrEnclave);
Request.Builder request = new Request.Builder()
.url(url)
.addHeader("Authorization", basicAuth(username, password))
.build();
.addHeader("Authorization", basicAuth(username, password));
WebSocket webSocket = okhttp.newWebSocket(request, new WebSocketListener() {
if (cdsiUrl.getHostHeader().isPresent()) {
request.addHeader("Host", cdsiUrl.getHostHeader().get());
Log.w(TAG, "Using alternate host: " + cdsiUrl.getHostHeader().get());
}
WebSocket webSocket = okhttp.newWebSocket(request.build(), new WebSocketListener() {
@Override
public void onOpen(WebSocket webSocket, Response response) {
Log.d(TAG, "[onOpen]");
@@ -225,6 +229,10 @@ final class CdsiSocket {
}
}
private static SignalCdsiUrl chooseUrl(SignalCdsiUrl[] urls) {
return urls[(int) (Math.random() * urls.length)];
}
private enum Stage {
INIT,
WAITING_FOR_CONNECTION,

View File

@@ -13,6 +13,7 @@ import org.whispersystems.signalservice.api.websocket.HealthMonitor;
import org.whispersystems.signalservice.api.websocket.WebSocketConnectionState;
import org.whispersystems.signalservice.internal.configuration.SignalProxy;
import org.whispersystems.signalservice.internal.configuration.SignalServiceConfiguration;
import org.whispersystems.signalservice.internal.configuration.SignalServiceUrl;
import org.whispersystems.signalservice.internal.util.BlacklistingTrustManager;
import org.whispersystems.signalservice.internal.util.Util;
@@ -75,6 +76,7 @@ public class WebSocketConnection extends WebSocketListener {
private final Optional<SignalProxy> signalProxy;
private final BehaviorSubject<WebSocketConnectionState> webSocketState;
private final boolean allowStories;
private final SignalServiceUrl serviceUrl;
private WebSocket client;
@@ -105,8 +107,9 @@ public class WebSocketConnection extends WebSocketListener {
this.healthMonitor = healthMonitor;
this.webSocketState = BehaviorSubject.createDefault(WebSocketConnectionState.DISCONNECTED);
this.allowStories = allowStories;
this.serviceUrl = serviceConfiguration.getSignalServiceUrls()[0];
String uri = serviceConfiguration.getSignalServiceUrls()[0].getUrl().replace("https://", "wss://").replace("http://", "ws://");
String uri = serviceUrl.getUrl().replace("https://", "wss://").replace("http://", "ws://");
if (credentialsProvider.isPresent()) {
this.wsUri = uri + "/v1/websocket/" + extraPathUri + "?login=%s&password=%s";
@@ -162,6 +165,11 @@ public class WebSocketConnection extends WebSocketListener {
requestBuilder.addHeader("X-Signal-Receive-Stories", allowStories ? "true" : "false");
if (serviceUrl.getHostHeader().isPresent()) {
requestBuilder.addHeader("Host", serviceUrl.getHostHeader().get());
Log.w(TAG, "Using alternate host: " + serviceUrl.getHostHeader().get());
}
webSocketState.onNext(WebSocketConnectionState.CONNECTING);
this.client = okHttpClient.newWebSocket(requestBuilder.build(), this);