diff --git a/java_tools/proxy_server/src/main/java/com/rusefi/proxy/NetworkConnector.java b/java_tools/proxy_server/src/main/java/com/rusefi/proxy/NetworkConnector.java
index 3598d48aae..9f1cfb639e 100644
--- a/java_tools/proxy_server/src/main/java/com/rusefi/proxy/NetworkConnector.java
+++ b/java_tools/proxy_server/src/main/java/com/rusefi/proxy/NetworkConnector.java
@@ -57,6 +57,8 @@ public class NetworkConnector {
IoStream targetEcuSocket = linkManager.getConnector().getBinaryProtocol().getStream();
HelloCommand.send(targetEcuSocket, logger);
String helloResponse = HelloCommand.getHelloResponse(targetEcuSocket.getDataBuffer(), logger);
+ if (helloResponse == null)
+ throw new IOException("Error getting hello response");
String controllerSignature = helloResponse.trim();
ConfigurationImage image = linkManager.getConnector().getBinaryProtocol().getControllerConfiguration();
diff --git a/java_tools/proxy_server/src/main/java/com/rusefi/server/ApplicationConnectionState.java b/java_tools/proxy_server/src/main/java/com/rusefi/server/ApplicationConnectionState.java
index 00a407381d..b72b0174ee 100644
--- a/java_tools/proxy_server/src/main/java/com/rusefi/server/ApplicationConnectionState.java
+++ b/java_tools/proxy_server/src/main/java/com/rusefi/server/ApplicationConnectionState.java
@@ -11,7 +11,7 @@ public class ApplicationConnectionState {
private final IoStream clientStream;
private final ControllerConnectionState state;
- public ApplicationConnectionState(UserDetails userDetails, ApplicationRequest applicationRequest, IoStream clientStream, ControllerConnectionState state) {
+ public ApplicationConnectionState(UserDetails userDetails, IoStream clientStream, ControllerConnectionState state) {
this.userDetails = Objects.requireNonNull(userDetails, "userDetails");
this.clientStream = Objects.requireNonNull(clientStream, "clientStream");
this.state = Objects.requireNonNull(state, "state");
diff --git a/java_tools/proxy_server/src/main/java/com/rusefi/server/Backend.java b/java_tools/proxy_server/src/main/java/com/rusefi/server/Backend.java
index 3f50925288..aa85633cac 100644
--- a/java_tools/proxy_server/src/main/java/com/rusefi/server/Backend.java
+++ b/java_tools/proxy_server/src/main/java/com/rusefi/server/Backend.java
@@ -25,10 +25,8 @@ import javax.json.JsonObject;
import java.io.Closeable;
import java.io.IOException;
import java.net.BindException;
-import java.net.Socket;
import java.util.*;
import java.util.concurrent.atomic.AtomicLong;
-import java.util.function.Function;
/**
* See NetworkConnectorStartup
@@ -81,6 +79,7 @@ public class Backend implements Closeable {
try {
new FtBasic(
new TkFork(showOnlineControllers,
+ showOnlineApplications,
new Monitoring(this).showStatistics,
new FkRegex(ProxyClient.VERSION_PATH, ProxyClient.BACKEND_VERSION),
new FkRegex("/", new RsHtml("
\n" +
@@ -114,61 +113,54 @@ public class Backend implements Closeable {
}, "rusEFI Application connections Cleanup").start();
}
- public void runApplicationConnector(int serverPortForApplications, Listener serverSocketCreationCallback) {
+ public void runApplicationConnector(int serverPortForApplications, Listener> serverSocketCreationCallback) {
this.serverPortForApplications = serverPortForApplications;
// connection from authenticator app which proxies for Tuner Studio
// authenticator pushed hello packet on connect
System.out.println("Starting application connector at " + serverPortForApplications);
- BinaryProtocolServer.tcpServerSocket(logger, new Function() {
- @Override
- public Runnable apply(Socket applicationSocket) {
- return new Runnable() {
- @Override
- public void run() {
- totalSessions.incrementAndGet();
- // connection from authenticator app which proxies for Tuner Studio
- IoStream applicationClientStream = null;
- ApplicationConnectionState applicationConnectionState = null;
- try {
- applicationClientStream = new TcpIoStream("[app] ", logger, applicationSocket);
+ BinaryProtocolServer.tcpServerSocket(logger, applicationSocket -> () -> {
+ totalSessions.incrementAndGet();
+ // connection from authenticator app which proxies for Tuner Studio
+ IoStream applicationClientStream = null;
+ ApplicationConnectionState applicationConnectionState = null;
+ try {
+ applicationClientStream = new TcpIoStream("[app] ", logger, applicationSocket);
- // authenticator pushed hello packet on connect
- String jsonString = HelloCommand.getHelloResponse(applicationClientStream.getDataBuffer(), logger);
- if (jsonString == null)
- return;
- ApplicationRequest applicationRequest = ApplicationRequest.valueOf(jsonString);
- logger.info("Application Connected: " + applicationRequest);
- String authToken = applicationRequest.getSessionDetails().getAuthToken();
- UserDetails userDetails = userDetailsResolver.apply(authToken);
- if (userDetails == null) {
- logger.info("Authentication failed for application " + authToken);
- return;
- }
+ // authenticator pushed hello packet on connect
+ String jsonString = HelloCommand.getHelloResponse(applicationClientStream.getDataBuffer(), logger);
+ if (jsonString == null)
+ return;
+ ApplicationRequest applicationRequest = ApplicationRequest.valueOf(jsonString);
+ logger.info("Application Connected: " + applicationRequest);
+ String authToken = applicationRequest.getSessionDetails().getAuthToken();
+ UserDetails userDetails = userDetailsResolver.apply(authToken);
+ if (userDetails == null) {
+ logger.info("Authentication failed for application " + authToken);
+ return;
+ }
- ControllerKey controllerKey = new ControllerKey(applicationRequest.getTargetUserId(), applicationRequest.getSessionDetails().getControllerInfo());
- ControllerConnectionState state;
- synchronized (lock) {
- state = acquire(controllerKey);
- }
- if (state == null) {
- logger.info("No controller for " + controllerKey);
- return;
- }
- applicationConnectionState = new ApplicationConnectionState(userDetails, applicationRequest, applicationClientStream, state);
- synchronized (lock) {
- applications.add(applicationConnectionState);
- }
+ ControllerKey controllerKey = new ControllerKey(applicationRequest.getTargetUserId(), applicationRequest.getSessionDetails().getControllerInfo());
+ ControllerConnectionState state;
+ synchronized (lock) {
+ state = acquire(controllerKey);
+ }
+ if (state == null) {
+ logger.info("No controller for " + controllerKey);
+ return;
+ }
+ applicationConnectionState = new ApplicationConnectionState(userDetails, applicationClientStream, state);
+ synchronized (lock) {
+ applications.add(applicationConnectionState);
+ }
- BinaryProtocolProxy.runProxy(state.getStream(), applicationClientStream);
+ BinaryProtocolProxy.runProxy(state.getStream(), applicationClientStream);
- } catch (Throwable e) {
- logger.info("Application Connector: Got error " + e);
- } finally {
- applicationClientStream.close();
- close(applicationConnectionState);
- }
- }
- };
+ } catch (Throwable e) {
+ logger.info("Application Connector: Got error " + e);
+ } finally {
+ if (applicationClientStream != null)
+ applicationClientStream.close();
+ close(applicationConnectionState);
}
}, serverPortForApplications, "ApplicationServer", serverSocketCreationCallback, BinaryProtocolServer.SECURE_SOCKET_FACTORY);
}
@@ -203,29 +195,21 @@ public class Backend implements Closeable {
logger.info("Disconnecting application");
}
- public void runControllerConnector(int serverPortForControllers, Listener serverSocketCreationCallback) {
+ public void runControllerConnector(int serverPortForControllers, Listener> serverSocketCreationCallback) {
this.serverPortForControllers = serverPortForControllers;
logger.info("Starting controller connector at " + serverPortForControllers);
- BinaryProtocolServer.tcpServerSocket(logger, new Function() {
- @Override
- public Runnable apply(Socket controllerSocket) {
- return new Runnable() {
- @Override
- public void run() {
- totalSessions.incrementAndGet();
- ControllerConnectionState controllerConnectionState = new ControllerConnectionState(controllerSocket, logger, getUserDetailsResolver());
- try {
- controllerConnectionState.requestControllerInfo();
+ BinaryProtocolServer.tcpServerSocket(logger, controllerSocket -> () -> {
+ totalSessions.incrementAndGet();
+ ControllerConnectionState controllerConnectionState = new ControllerConnectionState(controllerSocket, logger, getUserDetailsResolver());
+ try {
+ controllerConnectionState.requestControllerInfo();
- // IMPORTANT: has to happen before we register controller while we still have exclusive access
- controllerConnectionState.getOutputs();
+ // IMPORTANT: has to happen before we register controller while we still have exclusive access
+ controllerConnectionState.getOutputs();
- register(controllerConnectionState);
- } catch (Throwable e) {
- close(controllerConnectionState);
- }
- }
- };
+ register(controllerConnectionState);
+ } catch (Throwable e) {
+ close(controllerConnectionState);
}
}, serverPortForControllers, "ControllerServer", serverSocketCreationCallback, BinaryProtocolServer.SECURE_SOCKET_FACTORY);
}
diff --git a/java_tools/proxy_server/src/main/java/com/rusefi/server/ControllerConnectionState.java b/java_tools/proxy_server/src/main/java/com/rusefi/server/ControllerConnectionState.java
index 933727c54f..1454849884 100644
--- a/java_tools/proxy_server/src/main/java/com/rusefi/server/ControllerConnectionState.java
+++ b/java_tools/proxy_server/src/main/java/com/rusefi/server/ControllerConnectionState.java
@@ -101,7 +101,7 @@ public class ControllerConnectionState {
byte[] packet = incomingData.getPacket(logger, "msg", true);
if (packet == null)
- throw new IOException("No response");
+ throw new IOException("getOutputs: No response");
}
/**