client: add backup jav_config support

This commit is contained in:
Adam
2019-11-23 16:24:02 -05:00
parent 1a6c99d49d
commit 643a77ad26
5 changed files with 73 additions and 25 deletions

View File

@@ -43,6 +43,8 @@ public class RuneLiteProperties
private static final String TROUBLESHOOTING_LINK = "runelite.wiki.troubleshooting.link";
private static final String BUILDING_LINK = "runelite.wiki.building.link";
private static final String DNS_CHANGE_LINK = "runelite.dnschange.link";
private static final String JAV_CONFIG = "runelite.jav_config";
private static final String JAV_CONFIG_BACKUP = "runelite.jav_config_backup";
private static final Properties properties = new Properties();
@@ -118,4 +120,14 @@ public class RuneLiteProperties
{
return properties.getProperty(DNS_CHANGE_LINK);
}
public static String getJavConfig()
{
return properties.getProperty(JAV_CONFIG);
}
public static String getJavConfigBackup()
{
return properties.getProperty(JAV_CONFIG_BACKUP);
}
}

View File

@@ -39,16 +39,8 @@ class ClientConfigLoader
{
}
private static final String CONFIG_URL = "http://oldschool.runescape.com/jav_config.ws";
static RSConfig fetch(String host) throws IOException
static RSConfig fetch(HttpUrl url) throws IOException
{
HttpUrl url = HttpUrl.parse(CONFIG_URL);
if (host != null)
{
url = url.newBuilder().host(host).build();
}
final Request request = new Request.Builder()
.url(url)
.build();

View File

@@ -57,6 +57,7 @@ import javax.swing.SwingUtilities;
import lombok.extern.slf4j.Slf4j;
import net.runelite.api.Client;
import net.runelite.client.RuneLite;
import net.runelite.client.RuneLiteProperties;
import static net.runelite.client.rs.ClientUpdateCheckMode.AUTO;
import static net.runelite.client.rs.ClientUpdateCheckMode.NONE;
import static net.runelite.client.rs.ClientUpdateCheckMode.VANILLA;
@@ -154,32 +155,55 @@ public class ClientLoader implements Supplier<Applet>
private void downloadConfig() throws IOException
{
String host = null;
for (int attempt = 0; ; attempt++)
HttpUrl url = HttpUrl.parse(RuneLiteProperties.getJavConfig());
IOException err = null;
for (int attempt = 0; attempt < NUM_ATTEMPTS; attempt++)
{
try
{
config = ClientConfigLoader.fetch(host);
config = ClientConfigLoader.fetch(url);
if (Strings.isNullOrEmpty(config.getCodeBase()) || Strings.isNullOrEmpty(config.getInitialJar()) || Strings.isNullOrEmpty(config.getInitialClass()))
{
throw new IOException("Invalid or missing jav_config");
}
break;
return;
}
catch (IOException e)
{
log.info("Failed to get jav_config from host \"{}\" ({})", host, e.getMessage());
if (attempt >= NUM_ATTEMPTS)
{
throw e;
}
host = hostSupplier.get();
log.info("Failed to get jav_config from host \"{}\" ({})", url.host(), e.getMessage());
String host = hostSupplier.get();
url = url.newBuilder().host(host).build();
err = e;
}
}
log.info("Falling back to backup client config");
try
{
RSConfig backupConfig = ClientConfigLoader.fetch(HttpUrl.parse(RuneLiteProperties.getJavConfigBackup()));
if (Strings.isNullOrEmpty(backupConfig.getCodeBase()) || Strings.isNullOrEmpty(backupConfig.getInitialJar()) || Strings.isNullOrEmpty(backupConfig.getInitialClass()))
{
throw new IOException("Invalid or missing jav_config");
}
if (Strings.isNullOrEmpty(backupConfig.getRuneLiteGamepack()))
{
throw new IOException("Backup config does not have RuneLite gamepack url");
}
// Randomize the codebase
String codebase = hostSupplier.get();
backupConfig.setCodebase("http://" + codebase + "/");
config = backupConfig;
}
catch (IOException ex)
{
throw err; // use error from Jagex's servers
}
}
private void updateVanilla() throws IOException, VerificationException
@@ -217,10 +241,18 @@ public class ClientLoader implements Supplier<Applet>
vanilla.position(0);
// Start downloading the vanilla client
String codebase = config.getCodeBase();
String initialJar = config.getInitialJar();
HttpUrl url = HttpUrl.parse(codebase + initialJar);
HttpUrl url;
if (config.getRuneLiteGamepack() != null)
{
// If we are using the backup config, use our own gamepack and ignore the codebase
url = HttpUrl.parse(config.getRuneLiteGamepack());
}
else
{
String codebase = config.getCodeBase();
String initialJar = config.getInitialJar();
url = HttpUrl.parse(codebase + initialJar);
}
for (int attempt = 0; ; attempt++)
{

View File

@@ -40,6 +40,11 @@ class RSConfig
return classLoaderProperties.get("codebase");
}
void setCodebase(String codebase)
{
classLoaderProperties.put("codebase", codebase);
}
String getInitialJar()
{
return classLoaderProperties.get("initial_jar");
@@ -49,4 +54,9 @@ class RSConfig
{
return classLoaderProperties.get("initial_class").replace(".class", "");
}
String getRuneLiteGamepack()
{
return classLoaderProperties.get("runelite.gamepack");
}
}

View File

@@ -9,3 +9,5 @@ runelite.patreon.link=https://www.patreon.com/runelite
runelite.wiki.troubleshooting.link=https://github.com/runelite/runelite/wiki/Troubleshooting-problems-with-the-client
runelite.wiki.building.link=https://github.com/runelite/runelite/wiki/Building-with-IntelliJ-IDEA#client-failing-to-start
runelite.dnschange.link=https://1.1.1.1/dns/
runelite.jav_config=http://oldschool.runescape.com/jav_config.ws
runelite.jav_config_backup=http://static.runelite.net/jav_config.ws