Launcher/LauncherAPI/src/main/java/ru/gravit/launcher/request/Request.java

82 lines
2.5 KiB
Java
Raw Normal View History

2018-09-17 10:07:32 +03:00
package ru.gravit.launcher.request;
import java.io.IOException;
import java.net.Socket;
import java.util.concurrent.atomic.AtomicBoolean;
import ru.gravit.launcher.Launcher;
import ru.gravit.launcher.LauncherAPI;
import ru.gravit.launcher.LauncherConfig;
import ru.gravit.launcher.serialize.HInput;
import ru.gravit.launcher.serialize.HOutput;
import ru.gravit.utils.helper.IOHelper;
import ru.gravit.utils.helper.SecurityHelper;
2018-09-17 10:07:32 +03:00
public abstract class Request<R> {
private static final long session = SecurityHelper.secureRandom.nextLong();
2018-09-22 17:33:00 +03:00
2018-09-17 10:07:32 +03:00
@LauncherAPI
public static void requestError(String message) throws RequestException {
throw new RequestException(message);
}
2018-09-22 17:33:00 +03:00
2018-09-17 10:07:32 +03:00
@LauncherAPI
protected final LauncherConfig config;
private final AtomicBoolean started = new AtomicBoolean(false);
@LauncherAPI
protected Request() {
this(null);
}
@LauncherAPI
protected Request(LauncherConfig config) {
this.config = config == null ? Launcher.getConfig() : config;
}
@LauncherAPI
public abstract Integer getType();
@LauncherAPI
protected final void readError(HInput input) throws IOException {
String error = input.readString(0);
if (!error.isEmpty())
2018-09-22 17:33:00 +03:00
requestError(error);
2018-09-17 10:07:32 +03:00
}
@LauncherAPI
@SuppressWarnings("DesignForExtension")
public R request() throws Exception {
if (!started.compareAndSet(false, true))
2018-09-22 17:33:00 +03:00
throw new IllegalStateException("Request already started");
2018-09-17 10:07:32 +03:00
// Make request to LaunchServer
try (Socket socket = IOHelper.newSocket()) {
socket.connect(IOHelper.resolve(config.address));
try (HInput input = new HInput(socket.getInputStream());
HOutput output = new HOutput(socket.getOutputStream())) {
writeHandshake(input, output);
return requestDo(input, output);
}
}
}
@LauncherAPI
protected abstract R requestDo(HInput input, HOutput output) throws Exception;
private void writeHandshake(HInput input, HOutput output) throws IOException {
// Write handshake
output.writeInt(Launcher.PROTOCOL_MAGIC);
output.writeBigInteger(config.publicKey.getModulus(), SecurityHelper.RSA_KEY_LENGTH + 1);
output.writeLong(session);
output.writeVarInt(getType());
output.flush();
// Verify is accepted
if (!input.readBoolean())
2018-09-22 17:33:00 +03:00
requestError("Serverside not accepted this connection");
2018-09-17 10:07:32 +03:00
}
}