mirror of
https://github.com/signalapp/Signal-Android.git
synced 2025-12-24 13:08:46 +00:00
Improve network reliability.
This commit is contained in:
committed by
Alex Hart
parent
df86d1b4ba
commit
522346479c
@@ -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,
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user