1212import gg .archipelago .APClient .parts .DataPackage ;
1313import gg .archipelago .APClient .parts .NetworkItem ;
1414import gg .archipelago .APClient .parts .NetworkPlayer ;
15+ import org .apache .hc .core5 .net .URIBuilder ;
1516import org .java_websocket .client .WebSocketClient ;
1617import org .java_websocket .handshake .ServerHandshake ;
1718
1819import java .net .URI ;
20+ import java .net .URISyntaxException ;
1921import java .util .*;
2022import java .util .logging .Level ;
2123
@@ -31,17 +33,17 @@ public class APWebSocket extends WebSocketClient {
3133
3234 private int reconnectAttempt = 0 ;
3335
34- private boolean attemptingReconnect ;
35-
3636 private String seedName ;
3737 private static Timer reconnectTimer ;
38+ private boolean downgrade = false ;
3839
3940 public APWebSocket (URI serverUri , APClient apClient ) {
4041 super (serverUri );
4142 this .apClient = apClient ;
42- if (reconnectTimer == null )
43- reconnectTimer = new Timer ();
44- reconnectTimer .cancel ();
43+ if (reconnectTimer != null ) {
44+ reconnectTimer .cancel ();
45+ }
46+ reconnectTimer = new Timer ();
4547 }
4648
4749 @ Override
@@ -228,51 +230,63 @@ private void sendManyPackets(APPacket[] packet) {
228230 @ Override
229231 public void onClose (int code , String wsReason , boolean remote ) {
230232 LOGGER .fine (String .format ("Connection closed by %s Code: %s Reason: %s" , (remote ? "remote peer" : "us" ), code , wsReason ));
231- authenticated = false ;
232- attemptingReconnect = false ;
233- String reason = wsReason ;
234- if (code == -1 )
235- reason = "Connection refused by the Archipelago server." ;
236- if (code == 1006 ) {
237- reason = "Lost connection to the Archipelago server." ;
238- attemptingReconnect = true ;
239- }
240-
241- if (attemptingReconnect && reconnectAttempt <= 10 ) {
242- int reconnectDelay = (int ) (5000 * Math .pow (2 ,reconnectAttempt ));
243- reconnectAttempt ++;
244- apClient .onClose (reason , reconnectDelay /1000 );
233+ String reason = (wsReason .isEmpty ()) ? "Connection refused by the Archipelago server." : wsReason ;
234+ if (code == -1 ) {
235+ reconnectTimer .cancel ();
245236
246- TimerTask reconnectTask = new TimerTask () {
247- @ Override
248- public void run () {
249- apClient .reconnect ();
237+ // attempt to reconnect using non-secure web socket if we are failing to connect with a secure socket.
238+ if (uri .getScheme ().equalsIgnoreCase ("wss" ) && downgrade ) {
239+ try {
240+ apClient .connect (new URIBuilder (uri ).setScheme ("ws" ).build ());
241+ } catch (URISyntaxException ignored ) {
242+ apClient .onClose (reason , 0 );
250243 }
251- };
252-
253- reconnectTimer .cancel ();
254- reconnectTimer = new Timer ();
255- reconnectTimer .schedule (reconnectTask , reconnectDelay );
244+ return ;
245+ }
246+ apClient .onClose (reason , 0 );
247+ return ;
256248 }
257- else {
258- attemptingReconnect = false ;
249+ if (code == 1000 ) {
259250 reconnectTimer .cancel ();
260- apClient .onClose (reason , 0 );
251+ apClient .onClose ("Disconnected." , 0 );
252+ }
253+
254+ if (code == 1006 ) {
255+ reason = "Lost connection to the Archipelago server." ;
256+ if ( reconnectAttempt <= 10 ) {
257+ int reconnectDelay = (int ) (5000 * Math .pow (2 , reconnectAttempt ));
258+ reconnectAttempt ++;
259+ TimerTask reconnectTask = new TimerTask () {
260+ @ Override
261+ public void run () {
262+ apClient .reconnect ();
263+ }
264+ };
265+
266+ reconnectTimer .cancel ();
267+ reconnectTimer = new Timer ();
268+ reconnectTimer .schedule (reconnectTask , reconnectDelay );
269+ apClient .onClose (reason , reconnectDelay / 1000 );
270+ return ;
271+ }
261272 }
273+
274+ reconnectTimer .cancel ();
275+ apClient .onClose (reason , 0 );
262276 }
263277
264278 @ Override
265279 public void onError (Exception ex ) {
266- // apClient.onError(ex);
280+ apClient .onError (ex );
267281 LOGGER .log (Level .WARNING , "Error in websocket connection" );
282+ ex .printStackTrace ();
268283 }
269284
270- @ Override
271- public void connect (){
285+ public void connect (boolean allowDowngrade ){
272286 super .connect ();
273287 reconnectTimer .cancel ();
274- attemptingReconnect = false ;
275288 reconnectAttempt = 0 ;
289+ this .downgrade = allowDowngrade ;
276290 }
277291
278292 public void sendChat (String message ) {
0 commit comments