Skip to content

Commit c483cc7

Browse files
committed
pedantically faster json parse short-circuiting
1 parent 19e1569 commit c483cc7

1 file changed

Lines changed: 30 additions & 12 deletions

File tree

src/main/java/com/fibermc/essentialcommands/Updater.java

Lines changed: 30 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
package com.fibermc.essentialcommands;
22

3-
import com.google.gson.JsonArray;
4-
import com.google.gson.JsonParser;
3+
import com.google.gson.stream.JsonReader;
4+
import java.io.IOException;
5+
import java.io.InputStream;
6+
import java.io.InputStreamReader;
57
import java.net.URI;
68
import java.net.URLEncoder;
79
import java.net.http.HttpClient;
@@ -67,7 +69,7 @@ public static void checkForUpdates() {
6769
)
6870
.GET()
6971
.build(),
70-
HttpResponse.BodyHandlers.ofString()
72+
HttpResponse.BodyHandlers.ofInputStream()
7173
)
7274
.thenApply(response -> parseLatestVersionFromResponse(response, mcVersion))
7375
.thenAccept(latestVersionStr -> {
@@ -79,7 +81,7 @@ public static void checkForUpdates() {
7981
}
8082

8183
private static Optional<String> parseLatestVersionFromResponse(
82-
HttpResponse<String> response,
84+
HttpResponse<InputStream> response,
8385
String mcVersion
8486
) {
8587
if (response.statusCode() != 200) {
@@ -90,15 +92,31 @@ private static Optional<String> parseLatestVersionFromResponse(
9092
return Optional.empty();
9193
}
9294

93-
JsonArray versions = JsonParser.parseString(response.body()).getAsJsonArray();
94-
if (versions.isEmpty()) {
95-
EssentialCommands.LOGGER.info(
96-
"No Essential Commands release found for Minecraft {}.",
97-
mcVersion
98-
);
99-
return Optional.empty();
95+
// Response body: [ { "version_number": "x.y.z-mcA.B", ... }, ... ], newest-first.
96+
try (
97+
JsonReader reader = new JsonReader(
98+
new InputStreamReader(response.body(), StandardCharsets.UTF_8)
99+
)
100+
) {
101+
reader.beginArray();
102+
if (!reader.hasNext()) {
103+
EssentialCommands.LOGGER.info(
104+
"No Essential Commands release found for Minecraft {}.",
105+
mcVersion
106+
);
107+
return Optional.empty();
108+
}
109+
reader.beginObject();
110+
while (reader.hasNext()) {
111+
if (reader.nextName().equals("version_number")) {
112+
return Optional.of(reader.nextString());
113+
}
114+
reader.skipValue();
115+
}
116+
} catch (IOException e) {
117+
EssentialCommands.LOGGER.warn("Failed to parse update check response.", e);
100118
}
101-
return Optional.of(versions.get(0).getAsJsonObject().get("version_number").getAsString());
119+
return Optional.empty();
102120
}
103121

104122
private static void compareAndNotify(String currentVersionStr, String latestVersionStr) {

0 commit comments

Comments
 (0)