diff --git a/src/main/java/moe/yushi/authlibinjector/httpd/LegacySkinAPIFilter.java b/src/main/java/moe/yushi/authlibinjector/httpd/LegacySkinAPIFilter.java index 4755172..dc6862c 100644 --- a/src/main/java/moe/yushi/authlibinjector/httpd/LegacySkinAPIFilter.java +++ b/src/main/java/moe/yushi/authlibinjector/httpd/LegacySkinAPIFilter.java @@ -16,6 +16,7 @@ */ package moe.yushi.authlibinjector.httpd; +import static java.nio.charset.StandardCharsets.ISO_8859_1; import static java.util.Optional.empty; import static java.util.Optional.of; import static java.util.Optional.ofNullable; @@ -65,6 +66,10 @@ public class LegacySkinAPIFilter implements URLFilter { return empty(); String username = matcher.group("username"); + // Minecraft does not encode non-ASCII characters in URLs + // We have to workaround this problem + username = correctEncoding(username); + Optional skinUrl; try { skinUrl = upstream.queryUUID(username) @@ -104,4 +109,9 @@ public class LegacySkinAPIFilter implements URLFilter { .map(JsonUtils::asJsonString) .orElseThrow(() -> newUncheckedIOException("Invalid JSON: Missing texture url"))); } + + private static String correctEncoding(String grable) { + // platform charset is used + return new String(grable.getBytes(ISO_8859_1)); + } } diff --git a/src/main/java/moe/yushi/authlibinjector/internal/fi/iki/elonen/NanoHTTPD.java b/src/main/java/moe/yushi/authlibinjector/internal/fi/iki/elonen/NanoHTTPD.java index 15dcbdb..1b72490 100644 --- a/src/main/java/moe/yushi/authlibinjector/internal/fi/iki/elonen/NanoHTTPD.java +++ b/src/main/java/moe/yushi/authlibinjector/internal/fi/iki/elonen/NanoHTTPD.java @@ -46,8 +46,7 @@ */ package moe.yushi.authlibinjector.internal.fi.iki.elonen; -import static java.nio.charset.StandardCharsets.US_ASCII; - +import static java.nio.charset.StandardCharsets.ISO_8859_1; import java.io.BufferedInputStream; import java.io.BufferedReader; import java.io.ByteArrayInputStream; @@ -360,7 +359,7 @@ public abstract class NanoHTTPD { } // Create a BufferedReader for parsing the header. - BufferedReader hin = new BufferedReader(new InputStreamReader(new ByteArrayInputStream(buf, 0, this.rlen), US_ASCII)); + BufferedReader hin = new BufferedReader(new InputStreamReader(new ByteArrayInputStream(buf, 0, this.rlen), ISO_8859_1)); // Decode the header into parms and header java properties Map pre = new HashMap<>(); @@ -486,7 +485,7 @@ public abstract class NanoHTTPD { } if (expect100Continue && !continueSent) { continueSent = true; - this.outputStream.write("HTTP/1.1 100 Continue\r\n\r\n".getBytes(US_ASCII)); + this.outputStream.write("HTTP/1.1 100 Continue\r\n\r\n".getBytes(ISO_8859_1)); } } return this.parsedInputStream;