Skip to content

Commit 5803235

Browse files
authored
使用 WebURL for Java 解析 URI (#6084)
1 parent afbf567 commit 5803235

8 files changed

Lines changed: 39 additions & 44 deletions

File tree

HMCL/src/main/java/org/jackhuang/hmcl/ui/FXUtils.java

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@
6262
import javafx.util.Callback;
6363
import javafx.util.Duration;
6464
import javafx.util.StringConverter;
65+
import org.glavo.url.WebURL;
6566
import org.jackhuang.hmcl.setting.StyleSheets;
6667
import org.jackhuang.hmcl.task.CacheFileTask;
6768
import org.jackhuang.hmcl.task.Schedulers;
@@ -1166,12 +1167,10 @@ public static Image loadImage(Path path,
11661167
}
11671168
}
11681169

1169-
public static Image loadImage(String url) throws Exception {
1170-
URI uri = NetworkUtils.toURI(url);
1171-
1172-
URLConnection connection = NetworkUtils.createConnection(uri);
1173-
if (connection instanceof HttpURLConnection)
1174-
connection = NetworkUtils.resolveConnection((HttpURLConnection) connection);
1170+
public static Image loadImage(WebURL url) throws Exception {
1171+
URLConnection connection = NetworkUtils.createConnection(url);
1172+
if (connection instanceof HttpURLConnection httpConnection)
1173+
connection = NetworkUtils.resolveConnection(httpConnection);
11751174

11761175
try (BufferedInputStream input = new BufferedInputStream(connection.getInputStream())) {
11771176
String contentType = Objects.requireNonNull(connection.getContentType(), "");

HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/URLValidator.java

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@
2020
import com.jfoenix.validation.base.ValidatorBase;
2121
import javafx.beans.NamedArg;
2222
import javafx.scene.control.TextInputControl;
23+
import org.glavo.url.WebURL;
2324
import org.jackhuang.hmcl.util.StringUtils;
24-
import org.jackhuang.hmcl.util.io.NetworkUtils;
2525

2626
import static org.jackhuang.hmcl.util.i18n.I18n.i18n;
2727

@@ -54,12 +54,7 @@ private void evalTextInputField() {
5454
if (StringUtils.isBlank(textField.getText()))
5555
hasErrors.set(!nullable);
5656
else {
57-
try {
58-
NetworkUtils.toURI(textField.getText());
59-
hasErrors.set(false);
60-
} catch (IllegalArgumentException e) {
61-
hasErrors.set(true);
62-
}
57+
hasErrors.set(WebURL.tryParseBrowserInput(textField.getText()) == null);
6358
}
6459
}
6560
}

HMCL/src/main/java/org/jackhuang/hmcl/ui/decorator/DecoratorController.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import javafx.scene.paint.Paint;
3535
import javafx.stage.Stage;
3636
import javafx.util.Duration;
37+
import org.glavo.url.WebURL;
3738
import org.jackhuang.hmcl.Metadata;
3839
import org.jackhuang.hmcl.auth.authlibinjector.AuthlibInjectorDnD;
3940
import org.jackhuang.hmcl.setting.EnumBackgroundImage;
@@ -205,7 +206,7 @@ private Background getBackground() {
205206
String backgroundImageUrl = config().getBackgroundImageUrl();
206207
if (backgroundImageUrl != null) {
207208
try {
208-
image = FXUtils.loadImage(backgroundImageUrl);
209+
image = FXUtils.loadImage(WebURL.parseBrowserInput(backgroundImageUrl));
209210
} catch (Exception e) {
210211
LOG.warning("Couldn't load background image", e);
211212
}

HMCL/src/main/resources/assets/about/deps.json

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,5 +98,10 @@
9898
"title": "TomlJ",
9999
"subtitle": "Licensed under the Apache 2.0 License.",
100100
"externalLink": "https://github.com/tomlj/tomlj"
101+
},
102+
{
103+
"title": "WebURL for Java",
104+
"subtitle": "Licensed under the Apache 2.0 License.",
105+
"externalLink": "https://github.com/Glavo/weburl-java"
101106
}
102107
]

HMCLCore/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ dependencies {
2727
api(libs.jna)
2828
api(libs.pci.ids)
2929
api(libs.hello.nbt)
30+
api(libs.weburl)
3031

3132
compileOnlyApi(libs.jetbrains.annotations)
3233

HMCLCore/src/main/java/org/jackhuang/hmcl/auth/authlibinjector/AuthlibInjectorServer.java

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,11 @@
2424
import java.io.IOException;
2525
import java.lang.reflect.Type;
2626
import java.net.HttpURLConnection;
27-
import java.net.URI;
28-
import java.net.URISyntaxException;
2927
import java.util.LinkedHashMap;
3028
import java.util.Map;
3129
import java.util.Optional;
3230

31+
import org.glavo.url.WebURL;
3332
import org.jackhuang.hmcl.auth.yggdrasil.YggdrasilService;
3433
import org.jackhuang.hmcl.util.io.HttpRequest;
3534
import org.jackhuang.hmcl.util.io.NetworkUtils;
@@ -58,13 +57,17 @@ public class AuthlibInjectorServer implements Observable {
5857
public static AuthlibInjectorServer locateServer(String url) throws IOException {
5958
try {
6059
url = NetworkUtils.addHttpsIfMissing(url);
61-
HttpURLConnection conn = NetworkUtils.createHttpConnection(url);
60+
61+
WebURL webURL = WebURL.parseBrowserInput(url);
62+
url = webURL.toString();
63+
64+
HttpURLConnection conn = NetworkUtils.createHttpConnection(webURL);
6265
conn = NetworkUtils.resolveConnection(conn);
6366

6467
String ali = conn.getHeaderField("x-authlib-injector-api-location");
6568
if (ali != null) {
66-
URI absoluteAli = conn.getURL().toURI().resolve(NetworkUtils.toURI(ali));
67-
if (!urlEqualsIgnoreSlash(url, absoluteAli.toString())) {
69+
WebURL absoluteAli = WebURL.parse(ali, WebURL.of(conn.getURL()));
70+
if (!urlEqualsIgnoreSlash(webURL.toString(), absoluteAli.toString())) {
6871
conn.disconnect();
6972
url = absoluteAli.toString();
7073
conn = NetworkUtils.resolveConnection(NetworkUtils.createHttpConnection(absoluteAli));
@@ -81,7 +84,7 @@ public static AuthlibInjectorServer locateServer(String url) throws IOException
8184
} finally {
8285
conn.disconnect();
8386
}
84-
} catch (IllegalArgumentException | URISyntaxException e) {
87+
} catch (IllegalArgumentException e) {
8588
throw new IOException(e);
8689
}
8790
}

HMCLCore/src/main/java/org/jackhuang/hmcl/util/io/NetworkUtils.java

Lines changed: 13 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -17,16 +17,14 @@
1717
*/
1818
package org.jackhuang.hmcl.util.io;
1919

20+
import org.glavo.url.WebURL;
2021
import org.jackhuang.hmcl.util.Pair;
2122
import org.jackhuang.hmcl.util.StringUtils;
2223
import org.jetbrains.annotations.NotNull;
2324
import org.jetbrains.annotations.Nullable;
2425

2526
import java.io.*;
2627
import java.net.*;
27-
import java.net.http.HttpClient;
28-
import java.net.http.HttpHeaders;
29-
import java.net.http.HttpResponse;
3028
import java.nio.charset.Charset;
3129
import java.util.*;
3230
import java.util.Map.Entry;
@@ -162,10 +160,10 @@ public static URI dropQuery(URI u) {
162160
}
163161
}
164162

165-
public static URLConnection createConnection(URI uri) throws IOException {
163+
public static URLConnection createConnection(WebURL url) throws IOException {
166164
URLConnection connection;
167165
try {
168-
connection = uri.toURL().openConnection();
166+
connection = url.toURL().openConnection();
169167
} catch (IllegalArgumentException | MalformedURLException e) {
170168
throw new IOException(e);
171169
}
@@ -179,8 +177,16 @@ public static URLConnection createConnection(URI uri) throws IOException {
179177
return connection;
180178
}
181179

180+
public static URLConnection createConnection(URI uri) throws IOException {
181+
return createConnection(WebURL.of(uri));
182+
}
183+
184+
public static HttpURLConnection createHttpConnection(WebURL url) throws IOException {
185+
return (HttpURLConnection) createConnection(url);
186+
}
187+
182188
public static HttpURLConnection createHttpConnection(String url) throws IOException {
183-
return (HttpURLConnection) createConnection(toURI(url));
189+
return (HttpURLConnection) createConnection(WebURL.parse(url));
184190
}
185191

186192
public static HttpURLConnection createHttpConnection(URI url) throws IOException {
@@ -436,24 +442,7 @@ public static String decodeURL(String toDecode) {
436442

437443
/// @throws IllegalArgumentException if the string is not a valid URI
438444
public static @NotNull URI toURI(@NotNull String uri) {
439-
try {
440-
return new URI(encodeLocation(uri));
441-
} catch (URISyntaxException e) {
442-
// Possibly an Internationalized Domain Name (IDN)
443-
return URI.create(uri);
444-
}
445-
}
446-
447-
public static @NotNull URI toURI(@NotNull URL url) {
448-
return toURI(url.toExternalForm());
449-
}
450-
451-
public static @NotNull HttpResponse.ResponseInfo getResponseInfo(@NotNull HttpResponse<?> response) {
452-
record ResponseInfoImpl(int statusCode, HttpHeaders headers, HttpClient.Version version)
453-
implements HttpResponse.ResponseInfo {
454-
}
455-
456-
return new ResponseInfoImpl(response.statusCode(), response.headers(), response.version());
445+
return WebURL.toURI(uri);
457446
}
458447

459448
public static @Nullable URI toURIOrNull(String uri) {

gradle/libs.versions.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ monet-fx = "0.4.0"
2323
terracotta = "0.4.2"
2424
nayuki-qrcodegen = "1.8.0"
2525
jwebp = "0.2.0"
26+
weburl = "0.2.0"
2627

2728
# testing
2829
junit = "6.0.1"
@@ -58,6 +59,7 @@ lwjgl-unsafe-agent = { module = "org.glavo:lwjgl-unsafe-agent", version.ref = "l
5859
monet-fx = { module = "org.glavo:MonetFX", version.ref = "monet-fx" }
5960
nayuki-qrcodegen = { module = "io.nayuki:qrcodegen", version.ref = "nayuki-qrcodegen" }
6061
jwebp = { module = "org.glavo:webp", version.ref = "jwebp" }
62+
weburl = { module = "org.glavo:weburl", version.ref = "weburl" }
6163

6264
# testing
6365
junit-jupiter = { module = "org.junit.jupiter:junit-jupiter", version.ref = "junit" }

0 commit comments

Comments
 (0)