diff --git a/LaunchServer/src/main/java/ru/gravit/launchserver/LaunchServer.java b/LaunchServer/src/main/java/ru/gravit/launchserver/LaunchServer.java index f0309cc5..94f4db54 100644 --- a/LaunchServer/src/main/java/ru/gravit/launchserver/LaunchServer.java +++ b/LaunchServer/src/main/java/ru/gravit/launchserver/LaunchServer.java @@ -1,5 +1,6 @@ package ru.gravit.launchserver; +import io.netty.handler.logging.LogLevel; import ru.gravit.launcher.Launcher; import ru.gravit.launcher.LauncherConfig; import ru.gravit.launcher.NeedGarbageCollection; @@ -280,6 +281,7 @@ public class NettyConfig { public Map bindings = new HashMap<>(); public NettyPerformanceConfig performance; public NettyBindAddress[] binds; + public LogLevel logLevel = LogLevel.DEBUG; } public class NettyPerformanceConfig { @@ -719,7 +721,7 @@ private void generateConfigIfNotExists(boolean testEnv) throws IOException { newConfig.threadCoreCount = 0; // on your own newConfig.threadCount = JVMHelper.OPERATING_SYSTEM_MXBEAN.getAvailableProcessors() >= 4 ? JVMHelper.OPERATING_SYSTEM_MXBEAN.getAvailableProcessors() / 2 : JVMHelper.OPERATING_SYSTEM_MXBEAN.getAvailableProcessors(); - newConfig.enabledRadon = true; + newConfig.enabledRadon = false; newConfig.enabledProGuard = true; newConfig.stripLineNumbers = true; newConfig.deleteTempFiles = true; diff --git a/LaunchServer/src/main/java/ru/gravit/launchserver/websocket/LauncherNettyServer.java b/LaunchServer/src/main/java/ru/gravit/launchserver/websocket/LauncherNettyServer.java index 0df2a864..0259bdc9 100644 --- a/LaunchServer/src/main/java/ru/gravit/launchserver/websocket/LauncherNettyServer.java +++ b/LaunchServer/src/main/java/ru/gravit/launchserver/websocket/LauncherNettyServer.java @@ -32,7 +32,7 @@ public LauncherNettyServer() { serverBootstrap = new ServerBootstrap(); serverBootstrap.group(bossGroup, workerGroup) .channel(NioServerSocketChannel.class) - .handler(new LoggingHandler(LogLevel.DEBUG)) + .handler(new LoggingHandler(config.logLevel)) .childHandler(new ChannelInitializer() { @Override public void initChannel(NioSocketChannel ch) { diff --git a/LaunchServer/src/main/java/ru/gravit/launchserver/websocket/json/auth/AuthResponse.java b/LaunchServer/src/main/java/ru/gravit/launchserver/websocket/json/auth/AuthResponse.java index 1ff9a85f..8059d02e 100644 --- a/LaunchServer/src/main/java/ru/gravit/launchserver/websocket/json/auth/AuthResponse.java +++ b/LaunchServer/src/main/java/ru/gravit/launchserver/websocket/json/auth/AuthResponse.java @@ -60,7 +60,7 @@ public void execute(ChannelHandlerContext ctx, Client clientData) throws Excepti try { AuthRequestEvent result = new AuthRequestEvent(); String ip = IOHelper.getIP(ctx.channel().remoteAddress()); - if ((authType == null || authType == ConnectTypes.CLIENT) && !clientData.checkSign) { + if ((authType == null || authType == ConnectTypes.CLIENT) && ( clientData == null || !clientData.checkSign )) { AuthProvider.authError("Don't skip Launcher Update"); return; } diff --git a/LaunchServer/src/main/resources/ru/gravit/launchserver/defaults/proguard.cfg b/LaunchServer/src/main/resources/ru/gravit/launchserver/defaults/proguard.cfg index 4c93356a..b2e34d42 100644 --- a/LaunchServer/src/main/resources/ru/gravit/launchserver/defaults/proguard.cfg +++ b/LaunchServer/src/main/resources/ru/gravit/launchserver/defaults/proguard.cfg @@ -20,9 +20,9 @@ -keepattributes Signature -adaptresourcefilecontents META-INF/MANIFEST.MF --keeppackagenames com.mojang.**,net.minecraftforge.fml.**,cpw.mods.fml.**,oshi.**,com.sun.jna.**,com.google.gson.**,org.slf4j.**,oshi.jna.**,com.sun.jna.**,org.apache.commons.logging.**, org.fusesource.**, com.jfoenix.** +-keeppackagenames com.mojang.**,net.minecraftforge.fml.**,cpw.mods.fml.**,com.google.gson.**,ru.gravit.repackage.**,org.fusesource.** --keep class com.mojang.**,net.minecraftforge.fml.**,cpw.mods.fml.**,oshi.**,com.sun.jna.**,com.google.gson.**,org.slf4j.**,oshi.jna.**,com.sun.jna.**,org.apache.commons.logging.**, org.fusesource.**, com.jfoenix.** { +-keep class com.mojang.**,net.minecraftforge.fml.**,cpw.mods.fml.**,com.google.gson.**,ru.gravit.repackage.**,org.fusesource.** { *; } diff --git a/Launcher/build.gradle b/Launcher/build.gradle index f01e92e7..904fba57 100644 --- a/Launcher/build.gradle +++ b/Launcher/build.gradle @@ -30,16 +30,18 @@ shadowJar { classifier = null relocate 'org.objectweb.asm', 'ru.gravit.repackage.org.objectweb.asm' + relocate 'io.netty', 'ru.gravit.repackage.io.netty' configurations = [project.configurations.pack] exclude 'module-info.class' } dependencies { - pack project(':LauncherAPI') // Not error on obf. + pack project(':LauncherAPI') bundle 'com.github.oshi:oshi-core:3.13.0' bundle 'com.jfoenix:jfoenix:8.0.8' bundle 'de.jensd:fontawesomefx:8.9' - bundle 'org.fusesource.jansi:jansi:1.17.1' + bundle 'org.apache.httpcomponents:httpclient:4.5.7' + pack 'io.netty:netty-all:4.1.32.Final' pack 'org.ow2.asm:asm-tree:7.1' } diff --git a/Launcher/src/main/java/ru/gravit/launcher/LauncherEngine.java b/Launcher/src/main/java/ru/gravit/launcher/LauncherEngine.java index 6990a706..0d0a657a 100644 --- a/Launcher/src/main/java/ru/gravit/launcher/LauncherEngine.java +++ b/Launcher/src/main/java/ru/gravit/launcher/LauncherEngine.java @@ -9,6 +9,8 @@ import ru.gravit.launcher.managers.ClientGsonManager; import ru.gravit.launcher.managers.ConsoleManager; import ru.gravit.launcher.request.Request; +import ru.gravit.launcher.request.RequestException; +import ru.gravit.launcher.request.auth.RestoreSessionRequest; import ru.gravit.launcher.request.websockets.StandartClientWebSocketService; import ru.gravit.utils.helper.CommonHelper; import ru.gravit.utils.helper.EnvHelper; @@ -71,11 +73,28 @@ public void start(String... args) throws Throwable { if (runtimeProvider == null) runtimeProvider = new JSRuntimeProvider(); runtimeProvider.init(false); runtimeProvider.preLoad(); - if(Request.service != null) + if(Request.service == null) { String address = Launcher.getConfig().address; LogHelper.debug("Start async connection to %s", address); Request.service = StandartClientWebSocketService.initWebSockets(address, true); + Request.service.reconnectCallback = () -> + { + LogHelper.debug("WebSocket connect closed. Try reconnect"); + try { + Request.service.open(); + LogHelper.debug("Connect to %s", Launcher.getConfig().address); + } catch (Exception e) { + LogHelper.error(e); + throw new RequestException(String.format("Connect error: %s", e.getMessage() != null ? e.getMessage() : "null")); + } + try { + RestoreSessionRequest request1 = new RestoreSessionRequest(Request.getSession()); + request1.request(); + } catch (Exception e) { + LogHelper.error(e); + } + }; } LauncherGuardManager.initGuard(false); Objects.requireNonNull(args, "args"); diff --git a/Launcher/src/main/java/ru/gravit/launcher/client/ClientLauncher.java b/Launcher/src/main/java/ru/gravit/launcher/client/ClientLauncher.java index 3d8d118a..e3dc7e66 100644 --- a/Launcher/src/main/java/ru/gravit/launcher/client/ClientLauncher.java +++ b/Launcher/src/main/java/ru/gravit/launcher/client/ClientLauncher.java @@ -9,6 +9,7 @@ import ru.gravit.launcher.profiles.ClientProfile; import ru.gravit.launcher.profiles.PlayerProfile; import ru.gravit.launcher.request.Request; +import ru.gravit.launcher.request.RequestException; import ru.gravit.launcher.request.auth.RestoreSessionRequest; import ru.gravit.launcher.serialize.HInput; import ru.gravit.launcher.serialize.HOutput; @@ -459,10 +460,11 @@ public static void main(String... args) throws Throwable { { LogHelper.debug("WebSocket connect closed. Try reconnect"); try { - if (!Request.service.reconnectBlocking()) LogHelper.error("Error connecting"); + Request.service.open(); LogHelper.debug("Connect to %s", Launcher.getConfig().address); - } catch (InterruptedException e) { - e.printStackTrace(); + } catch (Exception e) { + LogHelper.error(e); + throw new RequestException(String.format("Connect error: %s", e.getMessage() != null ? e.getMessage() : "null")); } try { RestoreSessionRequest request1 = new RestoreSessionRequest(Request.getSession()); diff --git a/LauncherAPI/build.gradle b/LauncherAPI/build.gradle index 0f04a4d3..6c28c79d 100644 --- a/LauncherAPI/build.gradle +++ b/LauncherAPI/build.gradle @@ -3,8 +3,8 @@ dependencies { compile project(':libLauncher') - compile 'org.java-websocket:Java-WebSocket:1.3.9' - compile 'org.apache.httpcomponents:httpclient:4.5.7' + compileOnly 'io.netty:netty-all:4.1.32.Final' + compileOnly 'org.apache.httpcomponents:httpclient:4.5.7' compileOnly 'com.google.guava:guava:26.0-jre' compile files('../compat/authlib/authlib-clean.jar') } diff --git a/LauncherAPI/src/main/java/ru/gravit/launcher/request/websockets/ClientJSONPoint.java b/LauncherAPI/src/main/java/ru/gravit/launcher/request/websockets/ClientJSONPoint.java index a09f1241..22e0c07d 100644 --- a/LauncherAPI/src/main/java/ru/gravit/launcher/request/websockets/ClientJSONPoint.java +++ b/LauncherAPI/src/main/java/ru/gravit/launcher/request/websockets/ClientJSONPoint.java @@ -1,36 +1,101 @@ package ru.gravit.launcher.request.websockets; -import org.java_websocket.client.WebSocketClient; -import org.java_websocket.drafts.Draft_6455; -import org.java_websocket.handshake.ServerHandshake; +import io.netty.bootstrap.Bootstrap; +import io.netty.channel.*; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.SocketChannel; +import io.netty.channel.socket.nio.NioSocketChannel; +import io.netty.handler.codec.http.EmptyHttpHeaders; +import io.netty.handler.codec.http.HttpClientCodec; +import io.netty.handler.codec.http.HttpObjectAggregator; +import io.netty.handler.codec.http.websocketx.CloseWebSocketFrame; +import io.netty.handler.codec.http.websocketx.TextWebSocketFrame; +import io.netty.handler.codec.http.websocketx.WebSocketClientHandshakerFactory; +import io.netty.handler.codec.http.websocketx.WebSocketVersion; +import io.netty.handler.ssl.SslContext; +import io.netty.handler.ssl.SslContextBuilder; import ru.gravit.utils.helper.LogHelper; +import javax.net.ssl.SSLException; +import java.io.IOException; import java.net.URI; -import java.util.Map; -public class ClientJSONPoint extends WebSocketClient { +public abstract class ClientJSONPoint { - public ClientJSONPoint(URI serverUri, Map httpHeaders, int connectTimeout) { - super(serverUri, new Draft_6455(), httpHeaders, connectTimeout); + private final URI uri; + protected Channel ch; + private static final EventLoopGroup group = new NioEventLoopGroup(); + protected WebSocketClientHandler webSocketClientHandler; + protected Bootstrap bootstrap = new Bootstrap(); + public boolean isClosed; + + public ClientJSONPoint(final String uri) throws SSLException { + this(URI.create(uri)); } - @Override - public void onOpen(ServerHandshake handshakedata) { - + public ClientJSONPoint(URI uri) throws SSLException { + this.uri = uri; + String protocol = uri.getScheme(); + if (!"ws".equals(protocol) && !"wss".equals(protocol)) { + throw new IllegalArgumentException("Unsupported protocol: " + protocol); + } + boolean ssl = false; + if("wss".equals(protocol)) + { + ssl = true; + } + final SslContext sslCtx; + if (ssl) { + sslCtx = SslContextBuilder.forClient().build(); + } else sslCtx = null; + bootstrap.group(group) + .channel(NioSocketChannel.class) + .handler(new ChannelInitializer() { + @Override + public void initChannel(SocketChannel ch) throws Exception { + ChannelPipeline pipeline = ch.pipeline(); + if (sslCtx != null) { + pipeline.addLast(sslCtx.newHandler(ch.alloc())); + } + pipeline.addLast("http-codec", new HttpClientCodec()); + pipeline.addLast("aggregator", new HttpObjectAggregator(65536)); + pipeline.addLast("ws-handler", webSocketClientHandler); + } + }); } - @Override - public void onMessage(String message) { + public void open() throws Exception { + //System.out.println("WebSocket Client connecting"); + webSocketClientHandler = + new WebSocketClientHandler( + WebSocketClientHandshakerFactory.newHandshaker( + uri, WebSocketVersion.V13, null, false, EmptyHttpHeaders.INSTANCE, 1280000), this); + ch = bootstrap.connect(uri.getHost(), uri.getPort()).sync().channel(); + webSocketClientHandler.handshakeFuture().sync(); + } + public ChannelFuture send(String text) + { + LogHelper.dev("Send: %s", text); + return ch.writeAndFlush(new TextWebSocketFrame(text)); + } + abstract void onMessage(String message) throws Exception; + abstract void onDisconnect() throws Exception; + abstract void onOpen() throws Exception; + + public void close() throws InterruptedException { + //System.out.println("WebSocket Client sending close"); + isClosed = true; + if(ch != null && ch.isActive()) + { + ch.writeAndFlush(new CloseWebSocketFrame()); + ch.closeFuture().sync(); + } + + //group.shutdownGracefully(); } - @Override - public void onClose(int code, String reason, boolean remote) { - LogHelper.debug("Disconnected: " + code + " " + remote + " " + reason != null ? reason : "no reason"); - } - - @Override - public void onError(Exception ex) { - LogHelper.error(ex); + public void eval(final String text) throws IOException { + ch.writeAndFlush(new TextWebSocketFrame(text)); } } \ No newline at end of file diff --git a/LauncherAPI/src/main/java/ru/gravit/launcher/request/websockets/ClientWebSocketService.java b/LauncherAPI/src/main/java/ru/gravit/launcher/request/websockets/ClientWebSocketService.java index 395aaf4a..b47ccf66 100644 --- a/LauncherAPI/src/main/java/ru/gravit/launcher/request/websockets/ClientWebSocketService.java +++ b/LauncherAPI/src/main/java/ru/gravit/launcher/request/websockets/ClientWebSocketService.java @@ -2,7 +2,6 @@ import com.google.gson.Gson; import com.google.gson.GsonBuilder; -import org.java_websocket.handshake.ServerHandshake; import ru.gravit.launcher.events.ExceptionEvent; import ru.gravit.launcher.events.request.*; import ru.gravit.launcher.hasher.HashedEntry; @@ -10,10 +9,10 @@ import ru.gravit.launcher.request.ResultInterface; import ru.gravit.utils.helper.LogHelper; +import javax.net.ssl.SSLException; import java.io.IOException; import java.lang.reflect.Type; import java.net.URI; -import java.util.Collections; import java.util.HashMap; import java.util.HashSet; @@ -27,8 +26,8 @@ public class ClientWebSocketService extends ClientJSONPoint { private HashMap> results; private HashSet handlers; - public ClientWebSocketService(GsonBuilder gsonBuilder, String address, int i) { - super(createURL(address), Collections.emptyMap(), i); + public ClientWebSocketService(GsonBuilder gsonBuilder, String address, int i) throws SSLException { + super(createURL(address)); requests = new HashMap<>(); results = new HashMap<>(); handlers = new HashSet<>(); @@ -51,7 +50,7 @@ private static URI createURL(String address) { } @Override - public void onMessage(String message) { + void onMessage(String message) { ResultInterface result = gson.fromJson(message, ResultInterface.class); for (EventHandler handler : handlers) { handler.process(result); @@ -59,25 +58,19 @@ public void onMessage(String message) { } @Override - public void onError(Exception e) { - LogHelper.error(e); + void onDisconnect() { + LogHelper.info("WebSocket client disconnect"); + if(onCloseCallback != null) onCloseCallback.onClose(0,"unsupported param", !isClosed); } + @Override - public void onOpen(ServerHandshake handshakedata) { - //Notify open + void onOpen() throws Exception { synchronized (onConnect) { onConnect.notifyAll(); } } - @Override - public void onClose(int code, String reason, boolean remote) - { - LogHelper.debug("Disconnected: " + code + " " + remote + " " + (reason != null ? reason : "no reason")); - if(onCloseCallback != null) - onCloseCallback.onClose(code, reason, remote); - } @FunctionalInterface public interface OnCloseCallback { @@ -136,7 +129,7 @@ public void registerHandler(EventHandler eventHandler) { } public void waitIfNotConnected() { - if(!isOpen() && !isClosed() && !isClosing()) + /*if(!isOpen() && !isClosed() && !isClosing()) { LogHelper.warning("WebSocket not connected. Try wait onConnect object"); synchronized (onConnect) @@ -147,20 +140,22 @@ public void waitIfNotConnected() LogHelper.error(e); } } - } + }*/ } public void sendObject(Object obj) throws IOException { waitIfNotConnected(); - if(isClosed() && reconnectCallback != null) - reconnectCallback.onReconnect(); + if(ch == null || !ch.isActive()) reconnectCallback.onReconnect(); + //if(isClosed() && reconnectCallback != null) + // reconnectCallback.onReconnect(); send(gson.toJson(obj, RequestInterface.class)); } public void sendObject(Object obj, Type type) throws IOException { waitIfNotConnected(); - if(isClosed() && reconnectCallback != null) - reconnectCallback.onReconnect(); + if(ch == null || !ch.isActive()) reconnectCallback.onReconnect(); + //if(isClosed() && reconnectCallback != null) + // reconnectCallback.onReconnect(); send(gson.toJson(obj, type)); } diff --git a/LauncherAPI/src/main/java/ru/gravit/launcher/request/websockets/StandartClientWebSocketService.java b/LauncherAPI/src/main/java/ru/gravit/launcher/request/websockets/StandartClientWebSocketService.java index 68b2ff3c..54ac6940 100644 --- a/LauncherAPI/src/main/java/ru/gravit/launcher/request/websockets/StandartClientWebSocketService.java +++ b/LauncherAPI/src/main/java/ru/gravit/launcher/request/websockets/StandartClientWebSocketService.java @@ -8,6 +8,7 @@ import ru.gravit.utils.helper.JVMHelper; import ru.gravit.utils.helper.LogHelper; +import javax.net.ssl.SSLException; import java.io.IOException; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; @@ -15,7 +16,7 @@ public class StandartClientWebSocketService extends ClientWebSocketService { public WaitEventHandler waitEventHandler = new WaitEventHandler(); - public StandartClientWebSocketService(GsonBuilder gsonBuilder, String address, int i) { + public StandartClientWebSocketService(GsonBuilder gsonBuilder, String address, int i) throws SSLException { super(gsonBuilder, address, i); } public class RequestFuture implements Future @@ -101,27 +102,38 @@ public RequestFuture asyncSendRequest(RequestInterface request) throws IOExcepti } public static StandartClientWebSocketService initWebSockets(String address, boolean async) { - StandartClientWebSocketService service = new StandartClientWebSocketService(new GsonBuilder(), address, 5000); + StandartClientWebSocketService service; + try { + service = new StandartClientWebSocketService(new GsonBuilder(), address, 5000); + } catch (SSLException e) { + LogHelper.error(e); + return null; + } service.registerResults(); service.registerRequests(); service.registerHandler(service.waitEventHandler); if(!async) { try { - if (!service.connectBlocking()) LogHelper.error("Error connecting"); + service.open(); LogHelper.debug("Connect to %s", address); - } catch (InterruptedException e) { + } catch (Exception e) { e.printStackTrace(); } } else { - service.connect(); + try { + service.open(); + } catch (Exception e) { + e.printStackTrace(); + } } JVMHelper.RUNTIME.addShutdownHook(new Thread(() -> { try { - if(service.isOpen()) - service.closeBlocking(); + //if(service.isOpen()) + // service.closeBlocking(); + service.close(); } catch (InterruptedException e) { LogHelper.error(e); } diff --git a/LauncherAPI/src/main/java/ru/gravit/launcher/request/websockets/WebSocketClientHandler.java b/LauncherAPI/src/main/java/ru/gravit/launcher/request/websockets/WebSocketClientHandler.java new file mode 100644 index 00000000..7d185225 --- /dev/null +++ b/LauncherAPI/src/main/java/ru/gravit/launcher/request/websockets/WebSocketClientHandler.java @@ -0,0 +1,92 @@ +package ru.gravit.launcher.request.websockets; + +import io.netty.channel.Channel; +import io.netty.channel.ChannelFuture; +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.ChannelPromise; +import io.netty.channel.SimpleChannelInboundHandler; +import io.netty.handler.codec.http.FullHttpResponse; +import io.netty.handler.codec.http.websocketx.BinaryWebSocketFrame; +import io.netty.handler.codec.http.websocketx.CloseWebSocketFrame; +import io.netty.handler.codec.http.websocketx.PongWebSocketFrame; +import io.netty.handler.codec.http.websocketx.TextWebSocketFrame; +import io.netty.handler.codec.http.websocketx.WebSocketClientHandshaker; +import io.netty.handler.codec.http.websocketx.WebSocketFrame; +import io.netty.util.CharsetUtil; +import ru.gravit.utils.helper.LogHelper; +public class WebSocketClientHandler extends SimpleChannelInboundHandler { + + private final WebSocketClientHandshaker handshaker; + private final ClientJSONPoint clientJSONPoint; + private ChannelPromise handshakeFuture; + + public WebSocketClientHandler(final WebSocketClientHandshaker handshaker, ClientJSONPoint clientJSONPoint) { + this.handshaker = handshaker; + this.clientJSONPoint = clientJSONPoint; + } + + public ChannelFuture handshakeFuture() { + return handshakeFuture; + } + + @Override + public void handlerAdded(final ChannelHandlerContext ctx) throws Exception { + handshakeFuture = ctx.newPromise(); + } + + @Override + public void channelActive(final ChannelHandlerContext ctx) throws Exception { + handshaker.handshake(ctx.channel()); + clientJSONPoint.onOpen(); + } + + @Override + public void channelInactive(final ChannelHandlerContext ctx) throws Exception { + //System.out.println("WebSocket Client disconnected!"); + clientJSONPoint.onDisconnect(); + } + + @Override + protected void channelRead0(ChannelHandlerContext ctx, Object msg) throws Exception { + final Channel ch = ctx.channel(); + if (!handshaker.isHandshakeComplete()) { + // web socket client connected + handshaker.finishHandshake(ch, (FullHttpResponse) msg); + handshakeFuture.setSuccess(); + return; + } + + if (msg instanceof FullHttpResponse) { + final FullHttpResponse response = (FullHttpResponse) msg; + throw new Exception("Unexpected FullHttpResponse (getStatus=" + response.status() + ", content=" + + response.content().toString(CharsetUtil.UTF_8) + ')'); + } + + final WebSocketFrame frame = (WebSocketFrame) msg; + if (frame instanceof TextWebSocketFrame) { + final TextWebSocketFrame textFrame = (TextWebSocketFrame) frame; + clientJSONPoint.onMessage(textFrame.text()); + LogHelper.dev("Message: %s", textFrame.text()); + // uncomment to print request + // logger.info(textFrame.text()); + } else if (frame instanceof PongWebSocketFrame) { + } else if (frame instanceof CloseWebSocketFrame) + ch.close(); + else if (frame instanceof BinaryWebSocketFrame) { + // uncomment to print request + // logger.info(frame.content().toString()); + } + + } + + @Override + public void exceptionCaught(final ChannelHandlerContext ctx, final Throwable cause) throws Exception { + LogHelper.error(cause); + + if (!handshakeFuture.isDone()) { + handshakeFuture.setFailure(cause); + } + + ctx.close(); + } +} \ No newline at end of file diff --git a/ServerWrapper/src/main/java/ru/gravit/launcher/server/ServerWrapper.java b/ServerWrapper/src/main/java/ru/gravit/launcher/server/ServerWrapper.java index 56b946ce..15710be1 100644 --- a/ServerWrapper/src/main/java/ru/gravit/launcher/server/ServerWrapper.java +++ b/ServerWrapper/src/main/java/ru/gravit/launcher/server/ServerWrapper.java @@ -6,6 +6,7 @@ import ru.gravit.launcher.events.request.ProfilesRequestEvent; import ru.gravit.launcher.profiles.ClientProfile; import ru.gravit.launcher.request.Request; +import ru.gravit.launcher.request.RequestException; import ru.gravit.launcher.request.auth.AuthRequest; import ru.gravit.launcher.request.update.ProfilesRequest; import ru.gravit.launcher.server.setup.ServerWrapperSetup; @@ -162,10 +163,11 @@ public void run(String... args) throws Throwable { { LogHelper.debug("WebSocket connect closed. Try reconnect"); try { - if (!Request.service.reconnectBlocking()) LogHelper.error("Error connecting"); + Request.service.open(); LogHelper.debug("Connect to %s", config.websocket.address); - } catch (InterruptedException e) { - e.printStackTrace(); + } catch (Exception e) { + LogHelper.error(e); + throw new RequestException(String.format("Connect error: %s", e.getMessage() != null ? e.getMessage() : "null")); } auth(); }; diff --git a/libLauncher/src/main/java/ru/gravit/launcher/Launcher.java b/libLauncher/src/main/java/ru/gravit/launcher/Launcher.java index 81ad3e3d..d11cfafa 100644 --- a/libLauncher/src/main/java/ru/gravit/launcher/Launcher.java +++ b/libLauncher/src/main/java/ru/gravit/launcher/Launcher.java @@ -60,7 +60,7 @@ public final class Launcher { public static final int MAJOR = 5; public static final int MINOR = 0; public static final int PATCH = 0; - public static final int BUILD = 2; + public static final int BUILD = 3; public static final Version.Type RELEASE = Version.Type.BETA; public static GsonManager gsonManager;