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