diff --git a/LaunchServer/source/response/update/UpdateResponse.java b/LaunchServer/source/response/update/UpdateResponse.java index d549548..8aa72bb 100644 --- a/LaunchServer/source/response/update/UpdateResponse.java +++ b/LaunchServer/source/response/update/UpdateResponse.java @@ -3,7 +3,6 @@ import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; -import java.nio.file.Files; import java.nio.file.Path; import java.util.Deque; import java.util.LinkedList; @@ -40,6 +39,7 @@ // Write update hdir debug("Update dir: '%s'", updateDirName); hdir.write(output); + output.writeBoolean(server.config.compress); output.flush(); // Prepare variables for actions queue @@ -87,7 +87,7 @@ // Resolve and write file Path file = dir.resolve(action.name); - if (Files.size(file) != hFile.size()) { + if (IOHelper.readAttributes(file).size() != hFile.size()) { fileOutput.write(0x0); fileOutput.flush(); throw new IOException("Unknown hashed file: " + action.name); @@ -121,5 +121,8 @@ } // So we've updated :) + if (fileOutput instanceof DeflaterOutputStream) { + ((DeflaterOutputStream) fileOutput).finish(); + } } } diff --git a/Launcher/source/helper/IOHelper.java b/Launcher/source/helper/IOHelper.java index a5e0fb6..6aa6103 100644 --- a/Launcher/source/helper/IOHelper.java +++ b/Launcher/source/helper/IOHelper.java @@ -264,14 +264,14 @@ @LauncherAPI public static Deflater newDeflater() { - Deflater deflater = new Deflater(Deflater.DEFAULT_COMPRESSION, false); + Deflater deflater = new Deflater(Deflater.DEFAULT_COMPRESSION, true); deflater.setStrategy(Deflater.DEFAULT_STRATEGY); return deflater; } @LauncherAPI public static Inflater newInflater() { - return new Inflater(false); + return new Inflater(true); } @LauncherAPI diff --git a/Launcher/source/request/update/UpdateRequest.java b/Launcher/source/request/update/UpdateRequest.java index e76eb28..e67b1d7 100644 --- a/Launcher/source/request/update/UpdateRequest.java +++ b/Launcher/source/request/update/UpdateRequest.java @@ -82,8 +82,6 @@ @Override protected SignedObjectHolder requestDo(HInput input, HOutput output) throws IOException, SignatureException { - compress = input.readBoolean(); - // Write update dir name output.writeString(dirName, 255); output.flush(); @@ -93,12 +91,16 @@ SignedObjectHolder remoteHDirHolder = new SignedObjectHolder<>(input, config.publicKey, HashedDir::new); Diff diff = remoteHDirHolder.object.diff(localDir, matcher); totalSize = diff.mismatch.size(); + compress = input.readBoolean(); // Build actions queue Queue queue = new LinkedList<>(); fillActionsQueue(queue, diff.mismatch); queue.add(Action.FINISH); + // noinspection IOResourceOpenedButNotSafelyClosed + InputStream fileInput = compress ? new InflaterInputStream(input.stream, IOHelper.newInflater(), IOHelper.BUFFER_SIZE) : input.stream; + // Download missing first // (otherwise it will cause mustdie indexing bug) startTime = Instant.now(); @@ -117,8 +119,6 @@ output.flush(); // Perform actions - // noinspection IOResourceOpenedButNotSafelyClosed - InputStream fileInput = compress ? new InflaterInputStream(input.stream, IOHelper.newInflater(), IOHelper.BUFFER_SIZE) : input.stream; for (int i = 0; i < length; i++) { Action action = actionsSlice[i]; switch (action.type) {