diff --git a/heylogs-api/pom.xml b/heylogs-api/pom.xml
index 79955b70..d115bd23 100644
--- a/heylogs-api/pom.xml
+++ b/heylogs-api/pom.xml
@@ -20,7 +20,7 @@
com.github.nbbrd.java-io-util
java-io-bom
- 0.0.38
+ 0.0.39
pom
import
diff --git a/heylogs-api/src/main/java/nbbrd/heylogs/spi/URLExtractor.java b/heylogs-api/src/main/java/nbbrd/heylogs/spi/URLExtractor.java
index a9c0b42d..ac4ddfc2 100644
--- a/heylogs-api/src/main/java/nbbrd/heylogs/spi/URLExtractor.java
+++ b/heylogs-api/src/main/java/nbbrd/heylogs/spi/URLExtractor.java
@@ -1,6 +1,7 @@
package nbbrd.heylogs.spi;
import lombok.NonNull;
+import org.jspecify.annotations.Nullable;
import java.io.UnsupportedEncodingException;
import java.net.*;
@@ -40,7 +41,7 @@ private static String decode(String o) {
}
}
- public static @NonNull URL baseOf(@NonNull URL url) {
+ public static @NonNull URL baseOf(@NonNull URL url) throws IllegalArgumentException {
try {
return new URI(url.getProtocol(), url.getUserInfo(), url.getHost(), url.getPort(), null, null, null).toURL();
} catch (URISyntaxException | MalformedURLException ex) {
@@ -56,6 +57,22 @@ private static String decode(String o) {
}
}
+ public static @Nullable URL urlOrNullOf(@NonNull CharSequence text) {
+ try {
+ return URI.create(text.toString()).toURL();
+ } catch (Exception ignore) {
+ return null;
+ }
+ }
+
+ public static @NonNull URI uriOf(@NonNull URL url) throws IllegalArgumentException {
+ try {
+ return url.toURI();
+ } catch (URISyntaxException ex) {
+ throw new IllegalArgumentException(ex);
+ }
+ }
+
public static void checkPathLength(String[] pathArray, int... lengths) {
if (IntStream.of(lengths).noneMatch(length -> length == pathArray.length)) {
throw new IllegalArgumentException("Invalid path length: expecting " + Arrays.toString(lengths) + ", found " + pathArray.length);
diff --git a/heylogs-api/src/test/java/tests/heylogs/spi/PersistentResponse.java b/heylogs-api/src/test/java/tests/heylogs/spi/PersistentResponse.java
new file mode 100644
index 00000000..7a78e436
--- /dev/null
+++ b/heylogs-api/src/test/java/tests/heylogs/spi/PersistentResponse.java
@@ -0,0 +1,42 @@
+package tests.heylogs.spi;
+
+import lombok.NonNull;
+import nbbrd.io.http.HttpHeaders;
+import nbbrd.io.http.HttpResponse;
+import nbbrd.io.net.MediaType;
+
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
+import java.nio.charset.StandardCharsets;
+
+@lombok.Value(staticConstructor = "of")
+public class PersistentResponse implements HttpResponse {
+
+ @NonNull
+ MediaType contentType;
+
+ @NonNull
+ HttpHeaders headers;
+
+ @NonNull
+ String body;
+
+ @Override
+ public long getContentLength() {
+ return body.getBytes(StandardCharsets.UTF_8).length;
+ }
+
+ @Override
+ public int getStatusCode() {
+ return 200;
+ }
+
+ @Override
+ public @NonNull InputStream getBody() {
+ return new ByteArrayInputStream(body.getBytes(StandardCharsets.UTF_8));
+ }
+
+ @Override
+ public void close() {
+ }
+}
diff --git a/heylogs-ext-forgejo/src/main/java/nbbrd/heylogs/ext/forgejo/ForgejoBlobLink.java b/heylogs-ext-forgejo/src/main/java/nbbrd/heylogs/ext/forgejo/ForgejoBlobLink.java
index 48c5bcd0..7c4f420b 100644
--- a/heylogs-ext-forgejo/src/main/java/nbbrd/heylogs/ext/forgejo/ForgejoBlobLink.java
+++ b/heylogs-ext-forgejo/src/main/java/nbbrd/heylogs/ext/forgejo/ForgejoBlobLink.java
@@ -6,7 +6,7 @@
import nbbrd.design.StaticFactoryMethod;
import nbbrd.heylogs.spi.BlobLink;
import nbbrd.heylogs.spi.ForgeRef;
-import nbbrd.io.http.URLQueryBuilder;
+import nbbrd.io.http.UriQueryBuilder;
import org.jspecify.annotations.Nullable;
import java.net.URL;
@@ -64,7 +64,7 @@ class ForgejoBlobLink implements ForgejoProjectLink, BlobLink {
@Override
public String toString() {
- return URLQueryBuilder.of(base).path(owner).path(repo).path(SRC_KEYWORD).path(refType).path(branchName).path(filePath).toString();
+ return UriQueryBuilder.of(uriOf(base)).path(owner).path(repo).path(SRC_KEYWORD).path(refType).path(branchName).path(filePath).toString();
}
@Override
diff --git a/heylogs-ext-forgejo/src/main/java/nbbrd/heylogs/ext/forgejo/ForgejoCommitLink.java b/heylogs-ext-forgejo/src/main/java/nbbrd/heylogs/ext/forgejo/ForgejoCommitLink.java
index 216ef6dc..5d9c0aaf 100644
--- a/heylogs-ext-forgejo/src/main/java/nbbrd/heylogs/ext/forgejo/ForgejoCommitLink.java
+++ b/heylogs-ext-forgejo/src/main/java/nbbrd/heylogs/ext/forgejo/ForgejoCommitLink.java
@@ -6,7 +6,7 @@
import nbbrd.design.RepresentableAs;
import nbbrd.design.StaticFactoryMethod;
import nbbrd.heylogs.spi.ForgeRef;
-import nbbrd.io.http.URLQueryBuilder;
+import nbbrd.io.http.UriQueryBuilder;
import org.jspecify.annotations.Nullable;
import java.net.URL;
@@ -47,7 +47,7 @@ class ForgejoCommitLink implements ForgejoProjectLink {
@Override
public String toString() {
- return URLQueryBuilder.of(base).path(owner).path(repo).path(COMMIT_KEYWORD).path(hash.toString()).toString();
+ return UriQueryBuilder.of(uriOf(base)).path(owner).path(repo).path(COMMIT_KEYWORD).path(hash.toString()).toString();
}
@Override
diff --git a/heylogs-ext-forgejo/src/main/java/nbbrd/heylogs/ext/forgejo/ForgejoCompareLink.java b/heylogs-ext-forgejo/src/main/java/nbbrd/heylogs/ext/forgejo/ForgejoCompareLink.java
index 5b5bb890..e6517a51 100644
--- a/heylogs-ext-forgejo/src/main/java/nbbrd/heylogs/ext/forgejo/ForgejoCompareLink.java
+++ b/heylogs-ext-forgejo/src/main/java/nbbrd/heylogs/ext/forgejo/ForgejoCompareLink.java
@@ -8,7 +8,7 @@
import nbbrd.heylogs.spi.CompareLink;
import nbbrd.heylogs.spi.ForgeRef;
import nbbrd.heylogs.spi.ProjectLink;
-import nbbrd.io.http.URLQueryBuilder;
+import nbbrd.io.http.UriQueryBuilder;
import org.jspecify.annotations.Nullable;
import java.net.URL;
@@ -58,7 +58,7 @@ class ForgejoCompareLink implements CompareLink, ForgejoProjectLink {
@Override
public String toString() {
- return URLQueryBuilder.of(base).path(owner).path(repo).path(COMPARE_KEYWORD).path(diff.toString()).toString();
+ return UriQueryBuilder.of(uriOf(base)).path(owner).path(repo).path(COMPARE_KEYWORD).path(diff.toString()).toString();
}
@Override
diff --git a/heylogs-ext-forgejo/src/main/java/nbbrd/heylogs/ext/forgejo/ForgejoIssueLink.java b/heylogs-ext-forgejo/src/main/java/nbbrd/heylogs/ext/forgejo/ForgejoIssueLink.java
index c371f69c..aef8b95c 100644
--- a/heylogs-ext-forgejo/src/main/java/nbbrd/heylogs/ext/forgejo/ForgejoIssueLink.java
+++ b/heylogs-ext-forgejo/src/main/java/nbbrd/heylogs/ext/forgejo/ForgejoIssueLink.java
@@ -6,7 +6,7 @@
import nbbrd.design.RepresentableAs;
import nbbrd.design.StaticFactoryMethod;
import nbbrd.heylogs.spi.ForgeRef;
-import nbbrd.io.http.URLQueryBuilder;
+import nbbrd.io.http.UriQueryBuilder;
import org.jspecify.annotations.Nullable;
import java.net.MalformedURLException;
@@ -39,10 +39,11 @@ class ForgejoIssueLink implements ForgejoProjectLink {
public static @NonNull ForgejoIssueLink resolve(@NonNull URL projectUrl, @NonNull CharSequence ref) {
try {
return parse(
- URLQueryBuilder.of(projectUrl)
+ UriQueryBuilder.of(uriOf(projectUrl))
.path(ISSUES_KEYWORD)
.path(String.valueOf(ForgejoIssueRef.parse(ref).getIssueNumber()))
- .build());
+ .build()
+ .toURL());
} catch (
MalformedURLException ex) {
throw new RuntimeException(ex);
@@ -63,7 +64,7 @@ class ForgejoIssueLink implements ForgejoProjectLink {
@Override
public String toString() {
- return URLQueryBuilder.of(base).path(owner).path(repo).path(ISSUES_KEYWORD).path(String.valueOf(issueNumber)).toString();
+ return UriQueryBuilder.of(uriOf(base)).path(owner).path(repo).path(ISSUES_KEYWORD).path(String.valueOf(issueNumber)).toString();
}
@Override
diff --git a/heylogs-ext-forgejo/src/main/java/nbbrd/heylogs/ext/forgejo/ForgejoMentionLink.java b/heylogs-ext-forgejo/src/main/java/nbbrd/heylogs/ext/forgejo/ForgejoMentionLink.java
index fca9a769..c9965937 100644
--- a/heylogs-ext-forgejo/src/main/java/nbbrd/heylogs/ext/forgejo/ForgejoMentionLink.java
+++ b/heylogs-ext-forgejo/src/main/java/nbbrd/heylogs/ext/forgejo/ForgejoMentionLink.java
@@ -6,7 +6,7 @@
import nbbrd.design.StaticFactoryMethod;
import nbbrd.heylogs.spi.ForgeLink;
import nbbrd.heylogs.spi.ForgeRef;
-import nbbrd.io.http.URLQueryBuilder;
+import nbbrd.io.http.UriQueryBuilder;
import org.jspecify.annotations.Nullable;
import java.net.URL;
@@ -54,8 +54,8 @@ class ForgejoMentionLink implements ForgeLink {
@Override
public String toString() {
return isUser()
- ? URLQueryBuilder.of(base).path(user).toString()
- : URLQueryBuilder.of(base).path(ORGS_KEYWORD).path(organization).path(TEAMS_KEYWORD).path(teamName).toString();
+ ? UriQueryBuilder.of(uriOf(base)).path(user).toString()
+ : UriQueryBuilder.of(uriOf(base)).path(ORGS_KEYWORD).path(organization).path(TEAMS_KEYWORD).path(teamName).toString();
}
@Override
diff --git a/heylogs-ext-forgejo/src/main/java/nbbrd/heylogs/ext/forgejo/ForgejoMessageFetcher.java b/heylogs-ext-forgejo/src/main/java/nbbrd/heylogs/ext/forgejo/ForgejoMessageFetcher.java
index a7f958b2..0d9f3ec4 100644
--- a/heylogs-ext-forgejo/src/main/java/nbbrd/heylogs/ext/forgejo/ForgejoMessageFetcher.java
+++ b/heylogs-ext-forgejo/src/main/java/nbbrd/heylogs/ext/forgejo/ForgejoMessageFetcher.java
@@ -8,6 +8,8 @@
import nbbrd.heylogs.spi.ForgeLink;
import nbbrd.heylogs.spi.MessageFetcher;
import nbbrd.io.http.*;
+import nbbrd.io.http.ext.ThrowingStatusException;
+import nbbrd.io.http.urlconnection.UrlConnectionHttpClient;
import nbbrd.io.net.MediaType;
import java.io.IOException;
@@ -62,7 +64,7 @@ URL buildApiUrl(@NonNull ForgeLink link) {
.build();
try (HttpResponse response = client.send(request)) {
return extractTitle(response.getBodyAsString());
- } catch (HttpResponseException ex) {
+ } catch (ThrowingStatusException ex) {
throw new IOException("Forgejo API returned HTTP " + ex.getResponseCode() + " for " + request.getQuery());
}
}
diff --git a/heylogs-ext-forgejo/src/main/java/nbbrd/heylogs/ext/forgejo/ForgejoProjectLink.java b/heylogs-ext-forgejo/src/main/java/nbbrd/heylogs/ext/forgejo/ForgejoProjectLink.java
index a59dd5ae..50ef9eba 100644
--- a/heylogs-ext-forgejo/src/main/java/nbbrd/heylogs/ext/forgejo/ForgejoProjectLink.java
+++ b/heylogs-ext-forgejo/src/main/java/nbbrd/heylogs/ext/forgejo/ForgejoProjectLink.java
@@ -2,11 +2,12 @@
import lombok.NonNull;
import nbbrd.heylogs.spi.ProjectLink;
-import nbbrd.io.http.URLQueryBuilder;
+import nbbrd.io.http.UriQueryBuilder;
import java.net.URL;
import java.util.regex.Pattern;
+import static nbbrd.heylogs.spi.URLExtractor.uriOf;
import static nbbrd.heylogs.spi.URLExtractor.urlOf;
interface ForgejoProjectLink extends ProjectLink {
@@ -22,7 +23,7 @@ interface ForgejoProjectLink extends ProjectLink {
@Override
default @NonNull URL getProjectURL() {
- return urlOf(URLQueryBuilder.of(getBase()).path(getOwner()).path(getRepo()).toString());
+ return urlOf(UriQueryBuilder.of(uriOf(getBase())).path(getOwner()).path(getRepo()).toString());
}
Pattern OWNER_PATTERN = Pattern.compile("[a-z\\d](?:[a-z\\d]|-(?=[a-z\\d])){0,38}", Pattern.CASE_INSENSITIVE);
diff --git a/heylogs-ext-forgejo/src/main/java/nbbrd/heylogs/ext/forgejo/ForgejoRequestLink.java b/heylogs-ext-forgejo/src/main/java/nbbrd/heylogs/ext/forgejo/ForgejoRequestLink.java
index 8bb09e60..c96234b2 100644
--- a/heylogs-ext-forgejo/src/main/java/nbbrd/heylogs/ext/forgejo/ForgejoRequestLink.java
+++ b/heylogs-ext-forgejo/src/main/java/nbbrd/heylogs/ext/forgejo/ForgejoRequestLink.java
@@ -6,7 +6,7 @@
import nbbrd.design.RepresentableAs;
import nbbrd.design.StaticFactoryMethod;
import nbbrd.heylogs.spi.ForgeRef;
-import nbbrd.io.http.URLQueryBuilder;
+import nbbrd.io.http.UriQueryBuilder;
import org.jspecify.annotations.Nullable;
import java.net.MalformedURLException;
@@ -39,10 +39,11 @@ class ForgejoRequestLink implements ForgejoProjectLink {
public static @NonNull ForgejoRequestLink resolve(@NonNull URL projectUrl, @NonNull CharSequence ref) {
try {
return parse(
- URLQueryBuilder.of(projectUrl)
+ UriQueryBuilder.of(uriOf(projectUrl))
.path(PULL_REQUEST_KEYWORD)
.path(String.valueOf(ForgejoRequestRef.parse(ref).getRequestNumber()))
- .build());
+ .build()
+ .toURL());
} catch (MalformedURLException ex) {
throw new RuntimeException(ex);
}
@@ -62,7 +63,7 @@ class ForgejoRequestLink implements ForgejoProjectLink {
@Override
public String toString() {
- return URLQueryBuilder.of(base).path(owner).path(repo).path(PULL_REQUEST_KEYWORD).path(String.valueOf(issueNumber)).toString();
+ return UriQueryBuilder.of(uriOf(base)).path(owner).path(repo).path(PULL_REQUEST_KEYWORD).path(String.valueOf(issueNumber)).toString();
}
@Override
diff --git a/heylogs-ext-forgejo/src/main/java/nbbrd/heylogs/ext/forgejo/ForgejoTagLink.java b/heylogs-ext-forgejo/src/main/java/nbbrd/heylogs/ext/forgejo/ForgejoTagLink.java
index 4556562a..15161189 100644
--- a/heylogs-ext-forgejo/src/main/java/nbbrd/heylogs/ext/forgejo/ForgejoTagLink.java
+++ b/heylogs-ext-forgejo/src/main/java/nbbrd/heylogs/ext/forgejo/ForgejoTagLink.java
@@ -6,7 +6,7 @@
import nbbrd.design.StaticFactoryMethod;
import nbbrd.heylogs.spi.BranchLink;
import nbbrd.heylogs.spi.ForgeRef;
-import nbbrd.io.http.URLQueryBuilder;
+import nbbrd.io.http.UriQueryBuilder;
import org.jspecify.annotations.Nullable;
import java.net.URL;
@@ -48,7 +48,7 @@ class ForgejoTagLink implements ForgejoProjectLink, BranchLink {
@Override
public String toString() {
- return URLQueryBuilder.of(base).path(owner).path(repo).path(RELEASES_KEYWORD).path(TAG_KEYWORD).path(branchName).toString();
+ return UriQueryBuilder.of(uriOf(base)).path(owner).path(repo).path(RELEASES_KEYWORD).path(TAG_KEYWORD).path(branchName).toString();
}
@Override
diff --git a/heylogs-ext-forgejo/src/test/java/nbbrd/heylogs/ext/forgejo/ForgejoMessageFetcherTest.java b/heylogs-ext-forgejo/src/test/java/nbbrd/heylogs/ext/forgejo/ForgejoMessageFetcherTest.java
index cfba853f..5293ba61 100644
--- a/heylogs-ext-forgejo/src/test/java/nbbrd/heylogs/ext/forgejo/ForgejoMessageFetcherTest.java
+++ b/heylogs-ext-forgejo/src/test/java/nbbrd/heylogs/ext/forgejo/ForgejoMessageFetcherTest.java
@@ -6,9 +6,9 @@
import nbbrd.io.http.HttpHeaders;
import nbbrd.io.http.HttpRequest;
import nbbrd.io.http.HttpResponse;
-import nbbrd.io.http.ext.PersistentResponse;
import nbbrd.io.net.MediaType;
import org.junit.jupiter.api.Test;
+import tests.heylogs.spi.PersistentResponse;
import java.io.IOException;
diff --git a/heylogs-ext-github/src/main/java/nbbrd/heylogs/ext/github/GitHubBlobLink.java b/heylogs-ext-github/src/main/java/nbbrd/heylogs/ext/github/GitHubBlobLink.java
index d52f7b08..e6cd249e 100644
--- a/heylogs-ext-github/src/main/java/nbbrd/heylogs/ext/github/GitHubBlobLink.java
+++ b/heylogs-ext-github/src/main/java/nbbrd/heylogs/ext/github/GitHubBlobLink.java
@@ -6,7 +6,7 @@
import nbbrd.design.StaticFactoryMethod;
import nbbrd.heylogs.spi.BlobLink;
import nbbrd.heylogs.spi.ForgeRef;
-import nbbrd.io.http.URLQueryBuilder;
+import nbbrd.io.http.UriQueryBuilder;
import org.jspecify.annotations.Nullable;
import java.net.URL;
@@ -59,7 +59,7 @@ class GitHubBlobLink implements GitHubProjectLink, BlobLink {
@Override
public String toString() {
- return URLQueryBuilder.of(base).path(owner).path(repo).path(BLOB_KEYWORD).path(branchName).path(filePath).toString();
+ return UriQueryBuilder.of(uriOf(base)).path(owner).path(repo).path(BLOB_KEYWORD).path(branchName).path(filePath).toString();
}
@Override
diff --git a/heylogs-ext-github/src/main/java/nbbrd/heylogs/ext/github/GitHubCommitLink.java b/heylogs-ext-github/src/main/java/nbbrd/heylogs/ext/github/GitHubCommitLink.java
index 7a7c514e..2e949b99 100644
--- a/heylogs-ext-github/src/main/java/nbbrd/heylogs/ext/github/GitHubCommitLink.java
+++ b/heylogs-ext-github/src/main/java/nbbrd/heylogs/ext/github/GitHubCommitLink.java
@@ -6,7 +6,7 @@
import nbbrd.design.RepresentableAs;
import nbbrd.design.StaticFactoryMethod;
import nbbrd.heylogs.spi.ForgeRef;
-import nbbrd.io.http.URLQueryBuilder;
+import nbbrd.io.http.UriQueryBuilder;
import org.jspecify.annotations.Nullable;
import java.net.URL;
@@ -47,7 +47,7 @@ class GitHubCommitLink implements GitHubProjectLink {
@Override
public String toString() {
- return URLQueryBuilder.of(base).path(owner).path(repo).path(COMMIT_KEYWORD).path(hash.toString()).toString();
+ return UriQueryBuilder.of(uriOf(base)).path(owner).path(repo).path(COMMIT_KEYWORD).path(hash.toString()).toString();
}
@Override
diff --git a/heylogs-ext-github/src/main/java/nbbrd/heylogs/ext/github/GitHubCompareLink.java b/heylogs-ext-github/src/main/java/nbbrd/heylogs/ext/github/GitHubCompareLink.java
index 03ac63d6..00d0d2ed 100644
--- a/heylogs-ext-github/src/main/java/nbbrd/heylogs/ext/github/GitHubCompareLink.java
+++ b/heylogs-ext-github/src/main/java/nbbrd/heylogs/ext/github/GitHubCompareLink.java
@@ -8,7 +8,7 @@
import nbbrd.heylogs.spi.CompareLink;
import nbbrd.heylogs.spi.ForgeRef;
import nbbrd.heylogs.spi.ProjectLink;
-import nbbrd.io.http.URLQueryBuilder;
+import nbbrd.io.http.UriQueryBuilder;
import org.jspecify.annotations.Nullable;
import java.net.URL;
@@ -59,7 +59,7 @@ class GitHubCompareLink implements CompareLink, GitHubProjectLink {
@Override
public String toString() {
- return URLQueryBuilder.of(base).path(owner).path(repo).path(COMPARE_KEYWORD).path(diff.toString()).toString();
+ return UriQueryBuilder.of(uriOf(base)).path(owner).path(repo).path(COMPARE_KEYWORD).path(diff.toString()).toString();
}
@Override
diff --git a/heylogs-ext-github/src/main/java/nbbrd/heylogs/ext/github/GitHubIssueLink.java b/heylogs-ext-github/src/main/java/nbbrd/heylogs/ext/github/GitHubIssueLink.java
index 617b2fb5..9ce65819 100644
--- a/heylogs-ext-github/src/main/java/nbbrd/heylogs/ext/github/GitHubIssueLink.java
+++ b/heylogs-ext-github/src/main/java/nbbrd/heylogs/ext/github/GitHubIssueLink.java
@@ -5,7 +5,7 @@
import nbbrd.design.RepresentableAs;
import nbbrd.design.StaticFactoryMethod;
import nbbrd.heylogs.spi.ForgeRef;
-import nbbrd.io.http.URLQueryBuilder;
+import nbbrd.io.http.UriQueryBuilder;
import org.jspecify.annotations.Nullable;
import java.net.MalformedURLException;
@@ -40,11 +40,12 @@ class GitHubIssueLink implements GitHubProjectLink {
public static @NonNull GitHubIssueLink resolve(@NonNull URL projectUrl, @NonNull CharSequence ref) {
try {
return parse(
- URLQueryBuilder
- .of(projectUrl)
+ UriQueryBuilder
+ .of(uriOf(projectUrl))
.path(ISSUES_KEYWORD)
.path(String.valueOf(GitHubIssueRef.parse(ref).getIssueNumber()))
- .build());
+ .build()
+ .toURL());
} catch (MalformedURLException ex) {
throw new RuntimeException(ex);
}
@@ -63,7 +64,7 @@ class GitHubIssueLink implements GitHubProjectLink {
@Override
public String toString() {
- return URLQueryBuilder.of(base).path(owner).path(repo).path(ISSUES_KEYWORD).path(String.valueOf(issueNumber)).toString();
+ return UriQueryBuilder.of(uriOf(base)).path(owner).path(repo).path(ISSUES_KEYWORD).path(String.valueOf(issueNumber)).toString();
}
@Override
diff --git a/heylogs-ext-github/src/main/java/nbbrd/heylogs/ext/github/GitHubMentionLink.java b/heylogs-ext-github/src/main/java/nbbrd/heylogs/ext/github/GitHubMentionLink.java
index b298759d..4de01c14 100644
--- a/heylogs-ext-github/src/main/java/nbbrd/heylogs/ext/github/GitHubMentionLink.java
+++ b/heylogs-ext-github/src/main/java/nbbrd/heylogs/ext/github/GitHubMentionLink.java
@@ -6,7 +6,7 @@
import nbbrd.design.StaticFactoryMethod;
import nbbrd.heylogs.spi.ForgeLink;
import nbbrd.heylogs.spi.ForgeRef;
-import nbbrd.io.http.URLQueryBuilder;
+import nbbrd.io.http.UriQueryBuilder;
import org.jspecify.annotations.Nullable;
import java.net.URL;
@@ -54,8 +54,8 @@ class GitHubMentionLink implements ForgeLink {
@Override
public String toString() {
return isUser()
- ? URLQueryBuilder.of(base).path(user).toString()
- : URLQueryBuilder.of(base).path(ORGS_KEYWORD).path(organization).path(TEAMS_KEYWORD).path(teamName).toString();
+ ? UriQueryBuilder.of(uriOf(base)).path(user).toString()
+ : UriQueryBuilder.of(uriOf(base)).path(ORGS_KEYWORD).path(organization).path(TEAMS_KEYWORD).path(teamName).toString();
}
@Override
diff --git a/heylogs-ext-github/src/main/java/nbbrd/heylogs/ext/github/GitHubMessageFetcher.java b/heylogs-ext-github/src/main/java/nbbrd/heylogs/ext/github/GitHubMessageFetcher.java
index 8395737a..5b212cfc 100644
--- a/heylogs-ext-github/src/main/java/nbbrd/heylogs/ext/github/GitHubMessageFetcher.java
+++ b/heylogs-ext-github/src/main/java/nbbrd/heylogs/ext/github/GitHubMessageFetcher.java
@@ -8,11 +8,14 @@
import nbbrd.heylogs.spi.ForgeLink;
import nbbrd.heylogs.spi.MessageFetcher;
import nbbrd.io.http.*;
+import nbbrd.io.http.ext.ThrowingStatusException;
+import nbbrd.io.http.urlconnection.UrlConnectionHttpClient;
import nbbrd.io.net.MediaType;
import java.io.IOException;
import java.net.URL;
+import static nbbrd.heylogs.spi.URLExtractor.uriOf;
import static nbbrd.heylogs.spi.URLExtractor.urlOf;
// https://docs.github.com/en/rest/issues/issues#get-an-issue
@@ -25,7 +28,7 @@ enum GitHubMessageFetcher implements MessageFetcher {
URL buildApiUrl(@NonNull ForgeLink link, @NonNull URL apiBase) {
if (link instanceof GitHubIssueLink) {
GitHubIssueLink issueLink = (GitHubIssueLink) link;
- return urlOf(URLQueryBuilder.of(apiBase)
+ return urlOf(UriQueryBuilder.of(uriOf(apiBase))
.path("repos")
.path(issueLink.getOwner())
.path(issueLink.getRepo())
@@ -42,7 +45,7 @@ URL buildApiUrl(@NonNull ForgeLink link, @NonNull URL apiBase) {
URL buildApiUrl(@NonNull ForgeLink link, @NonNull URL apiBase) {
if (link instanceof GitHubRequestLink) {
GitHubRequestLink requestLink = (GitHubRequestLink) link;
- return urlOf(URLQueryBuilder.of(apiBase)
+ return urlOf(UriQueryBuilder.of(uriOf(apiBase))
.path("repos")
.path(requestLink.getOwner())
.path(requestLink.getRepo())
@@ -67,7 +70,7 @@ URL buildApiUrl(@NonNull ForgeLink link, @NonNull URL apiBase) {
.build();
try (HttpResponse response = client.send(request)) {
return extractTitle(response.getBodyAsString());
- } catch (HttpResponseException ex) {
+ } catch (ThrowingStatusException ex) {
throw new IOException("GitHub API returned HTTP " + ex.getResponseCode() + " for " + request.getQuery());
}
}
diff --git a/heylogs-ext-github/src/main/java/nbbrd/heylogs/ext/github/GitHubProjectLink.java b/heylogs-ext-github/src/main/java/nbbrd/heylogs/ext/github/GitHubProjectLink.java
index 33ea1e6c..c0ccc11e 100644
--- a/heylogs-ext-github/src/main/java/nbbrd/heylogs/ext/github/GitHubProjectLink.java
+++ b/heylogs-ext-github/src/main/java/nbbrd/heylogs/ext/github/GitHubProjectLink.java
@@ -2,11 +2,12 @@
import lombok.NonNull;
import nbbrd.heylogs.spi.ProjectLink;
-import nbbrd.io.http.URLQueryBuilder;
+import nbbrd.io.http.UriQueryBuilder;
import java.net.URL;
import java.util.regex.Pattern;
+import static nbbrd.heylogs.spi.URLExtractor.uriOf;
import static nbbrd.heylogs.spi.URLExtractor.urlOf;
interface GitHubProjectLink extends ProjectLink {
@@ -22,7 +23,7 @@ interface GitHubProjectLink extends ProjectLink {
@Override
default @NonNull URL getProjectURL() {
- return urlOf(URLQueryBuilder.of(getBase()).path(getOwner()).path(getRepo()).toString());
+ return urlOf(UriQueryBuilder.of(uriOf(getBase())).path(getOwner()).path(getRepo()).toString());
}
Pattern OWNER_PATTERN = Pattern.compile("[a-z\\d](?:[a-z\\d]|-(?=[a-z\\d])){0,38}", Pattern.CASE_INSENSITIVE);
diff --git a/heylogs-ext-github/src/main/java/nbbrd/heylogs/ext/github/GitHubRepositoryLink.java b/heylogs-ext-github/src/main/java/nbbrd/heylogs/ext/github/GitHubRepositoryLink.java
index 8f11fd51..13f97405 100644
--- a/heylogs-ext-github/src/main/java/nbbrd/heylogs/ext/github/GitHubRepositoryLink.java
+++ b/heylogs-ext-github/src/main/java/nbbrd/heylogs/ext/github/GitHubRepositoryLink.java
@@ -5,7 +5,7 @@
import nbbrd.design.RepresentableAs;
import nbbrd.design.StaticFactoryMethod;
import nbbrd.heylogs.spi.ForgeRef;
-import nbbrd.io.http.URLQueryBuilder;
+import nbbrd.io.http.UriQueryBuilder;
import java.net.URL;
@@ -36,7 +36,7 @@ class GitHubRepositoryLink implements GitHubProjectLink {
@Override
public @NonNull URL toURL() {
- return urlOf(URLQueryBuilder.of(base).path(owner).path(repo).toString());
+ return urlOf(UriQueryBuilder.of(uriOf(base)).path(owner).path(repo).toString());
}
@Override
diff --git a/heylogs-ext-github/src/main/java/nbbrd/heylogs/ext/github/GitHubRequestLink.java b/heylogs-ext-github/src/main/java/nbbrd/heylogs/ext/github/GitHubRequestLink.java
index 8a21befe..3b614a5c 100644
--- a/heylogs-ext-github/src/main/java/nbbrd/heylogs/ext/github/GitHubRequestLink.java
+++ b/heylogs-ext-github/src/main/java/nbbrd/heylogs/ext/github/GitHubRequestLink.java
@@ -5,7 +5,7 @@
import nbbrd.design.RepresentableAs;
import nbbrd.design.StaticFactoryMethod;
import nbbrd.heylogs.spi.ForgeRef;
-import nbbrd.io.http.URLQueryBuilder;
+import nbbrd.io.http.UriQueryBuilder;
import org.jspecify.annotations.Nullable;
import java.net.MalformedURLException;
@@ -38,11 +38,12 @@ class GitHubRequestLink implements GitHubProjectLink {
public static @NonNull GitHubRequestLink resolve(@NonNull URL projectUrl, @NonNull CharSequence ref) {
try {
return parse(
- URLQueryBuilder
- .of(projectUrl)
+ UriQueryBuilder
+ .of(uriOf(projectUrl))
.path(PULL_REQUEST_KEYWORD)
.path(String.valueOf(GitHubRequestRef.parse(ref).getRequestNumber()))
- .build());
+ .build()
+ .toURL());
} catch (MalformedURLException ex) {
throw new RuntimeException(ex);
}
@@ -61,7 +62,7 @@ class GitHubRequestLink implements GitHubProjectLink {
@Override
public String toString() {
- return URLQueryBuilder.of(base).path(owner).path(repo).path(PULL_REQUEST_KEYWORD).path(String.valueOf(requestNumber)).toString();
+ return UriQueryBuilder.of(uriOf(base)).path(owner).path(repo).path(PULL_REQUEST_KEYWORD).path(String.valueOf(requestNumber)).toString();
}
@Override
diff --git a/heylogs-ext-github/src/main/java/nbbrd/heylogs/ext/github/GitHubTagLink.java b/heylogs-ext-github/src/main/java/nbbrd/heylogs/ext/github/GitHubTagLink.java
index 4db0efca..595edbfa 100644
--- a/heylogs-ext-github/src/main/java/nbbrd/heylogs/ext/github/GitHubTagLink.java
+++ b/heylogs-ext-github/src/main/java/nbbrd/heylogs/ext/github/GitHubTagLink.java
@@ -6,7 +6,7 @@
import nbbrd.design.StaticFactoryMethod;
import nbbrd.heylogs.spi.BranchLink;
import nbbrd.heylogs.spi.ForgeRef;
-import nbbrd.io.http.URLQueryBuilder;
+import nbbrd.io.http.UriQueryBuilder;
import org.jspecify.annotations.Nullable;
import java.net.URL;
@@ -48,7 +48,7 @@ class GitHubTagLink implements GitHubProjectLink, BranchLink {
@Override
public String toString() {
- return URLQueryBuilder.of(base).path(owner).path(repo).path(RELEASES_KEYWORD).path(TAG_KEYWORD).path(branchName).toString();
+ return UriQueryBuilder.of(uriOf(base)).path(owner).path(repo).path(RELEASES_KEYWORD).path(TAG_KEYWORD).path(branchName).toString();
}
@Override
diff --git a/heylogs-ext-github/src/test/java/nbbrd/heylogs/ext/github/GitHubMessageFetcherTest.java b/heylogs-ext-github/src/test/java/nbbrd/heylogs/ext/github/GitHubMessageFetcherTest.java
index e1145884..772a419b 100644
--- a/heylogs-ext-github/src/test/java/nbbrd/heylogs/ext/github/GitHubMessageFetcherTest.java
+++ b/heylogs-ext-github/src/test/java/nbbrd/heylogs/ext/github/GitHubMessageFetcherTest.java
@@ -6,9 +6,9 @@
import nbbrd.io.http.HttpHeaders;
import nbbrd.io.http.HttpRequest;
import nbbrd.io.http.HttpResponse;
-import nbbrd.io.http.ext.PersistentResponse;
import nbbrd.io.net.MediaType;
import org.junit.jupiter.api.Test;
+import tests.heylogs.spi.PersistentResponse;
import java.io.IOException;
import java.net.URL;
diff --git a/heylogs-ext-gitlab/src/main/java/nbbrd/heylogs/ext/gitlab/GitLabBlobLink.java b/heylogs-ext-gitlab/src/main/java/nbbrd/heylogs/ext/gitlab/GitLabBlobLink.java
index 4b868d86..4591848b 100644
--- a/heylogs-ext-gitlab/src/main/java/nbbrd/heylogs/ext/gitlab/GitLabBlobLink.java
+++ b/heylogs-ext-gitlab/src/main/java/nbbrd/heylogs/ext/gitlab/GitLabBlobLink.java
@@ -6,7 +6,7 @@
import nbbrd.design.StaticFactoryMethod;
import nbbrd.heylogs.spi.BlobLink;
import nbbrd.heylogs.spi.ForgeRef;
-import nbbrd.io.http.URLQueryBuilder;
+import nbbrd.io.http.UriQueryBuilder;
import org.jspecify.annotations.Nullable;
import java.net.URL;
@@ -83,7 +83,7 @@ public String toString() {
@Override
public @NonNull URL toURL() {
- return urlOf(URLQueryBuilder.of(base)
+ return urlOf(UriQueryBuilder.of(uriOf(base))
.path(namespace).path(project)
.path(GitLabSupport.DASH_KEYWORD)
.path(BLOB_KEYWORD).path(branchName)
diff --git a/heylogs-ext-gitlab/src/main/java/nbbrd/heylogs/ext/gitlab/GitLabIssueLink.java b/heylogs-ext-gitlab/src/main/java/nbbrd/heylogs/ext/gitlab/GitLabIssueLink.java
index fa1a2443..c76da987 100644
--- a/heylogs-ext-gitlab/src/main/java/nbbrd/heylogs/ext/gitlab/GitLabIssueLink.java
+++ b/heylogs-ext-gitlab/src/main/java/nbbrd/heylogs/ext/gitlab/GitLabIssueLink.java
@@ -5,13 +5,14 @@
import nbbrd.design.RepresentableAs;
import nbbrd.design.StaticFactoryMethod;
import nbbrd.heylogs.spi.ForgeRef;
-import nbbrd.io.http.URLQueryBuilder;
+import nbbrd.io.http.UriQueryBuilder;
import org.jspecify.annotations.Nullable;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.List;
+import static nbbrd.heylogs.spi.URLExtractor.uriOf;
import static nbbrd.heylogs.spi.URLExtractor.urlOf;
import static nbbrd.heylogs.ext.gitlab.GitLabSupport.*;
@@ -29,11 +30,12 @@ class GitLabIssueLink implements GitLabProjectLink {
public static @NonNull GitLabIssueLink resolve(@NonNull URL projectUrl, @NonNull CharSequence ref) {
try {
return parse(
- URLQueryBuilder
- .of(projectUrl)
+ UriQueryBuilder
+ .of(uriOf(projectUrl))
.path(ISSUES_KEYWORD)
.path(String.valueOf(GitLabIssueRef.parse(ref).getNumber()))
- .build());
+ .build()
+ .toURL());
} catch (MalformedURLException ex) {
throw new RuntimeException(ex);
}
diff --git a/heylogs-ext-gitlab/src/main/java/nbbrd/heylogs/ext/gitlab/GitLabMentionLink.java b/heylogs-ext-gitlab/src/main/java/nbbrd/heylogs/ext/gitlab/GitLabMentionLink.java
index 83deaaa7..eb6e0a3d 100644
--- a/heylogs-ext-gitlab/src/main/java/nbbrd/heylogs/ext/gitlab/GitLabMentionLink.java
+++ b/heylogs-ext-gitlab/src/main/java/nbbrd/heylogs/ext/gitlab/GitLabMentionLink.java
@@ -6,7 +6,7 @@
import nbbrd.design.StaticFactoryMethod;
import nbbrd.heylogs.spi.ForgeLink;
import nbbrd.heylogs.spi.ForgeRef;
-import nbbrd.io.http.URLQueryBuilder;
+import nbbrd.io.http.UriQueryBuilder;
import org.jspecify.annotations.Nullable;
import java.net.URL;
@@ -47,7 +47,7 @@ class GitLabMentionLink implements ForgeLink {
@Override
public String toString() {
- return URLQueryBuilder.of(base).path(namespace).toString();
+ return UriQueryBuilder.of(uriOf(base)).path(namespace).toString();
}
@Override
diff --git a/heylogs-ext-gitlab/src/main/java/nbbrd/heylogs/ext/gitlab/GitLabMessageFetcher.java b/heylogs-ext-gitlab/src/main/java/nbbrd/heylogs/ext/gitlab/GitLabMessageFetcher.java
index dd5c5f53..82ea4548 100644
--- a/heylogs-ext-gitlab/src/main/java/nbbrd/heylogs/ext/gitlab/GitLabMessageFetcher.java
+++ b/heylogs-ext-gitlab/src/main/java/nbbrd/heylogs/ext/gitlab/GitLabMessageFetcher.java
@@ -8,6 +8,8 @@
import nbbrd.heylogs.spi.ForgeLink;
import nbbrd.heylogs.spi.MessageFetcher;
import nbbrd.io.http.*;
+import nbbrd.io.http.ext.ThrowingStatusException;
+import nbbrd.io.http.urlconnection.UrlConnectionHttpClient;
import nbbrd.io.net.MediaType;
import java.io.IOException;
@@ -58,7 +60,7 @@ URL buildApiUrl(@NonNull ForgeLink link) {
.build();
try (HttpResponse response = client.send(request)) {
return extractTitle(response.getBodyAsString());
- } catch (HttpResponseException ex) {
+ } catch (ThrowingStatusException ex) {
throw new IOException("GitLab API returned HTTP " + ex.getResponseCode() + " for " + request.getQuery());
}
}
diff --git a/heylogs-ext-gitlab/src/main/java/nbbrd/heylogs/ext/gitlab/GitLabProjectLink.java b/heylogs-ext-gitlab/src/main/java/nbbrd/heylogs/ext/gitlab/GitLabProjectLink.java
index c74c9b6c..468a3fb0 100644
--- a/heylogs-ext-gitlab/src/main/java/nbbrd/heylogs/ext/gitlab/GitLabProjectLink.java
+++ b/heylogs-ext-gitlab/src/main/java/nbbrd/heylogs/ext/gitlab/GitLabProjectLink.java
@@ -2,11 +2,12 @@
import lombok.NonNull;
import nbbrd.heylogs.spi.ProjectLink;
-import nbbrd.io.http.URLQueryBuilder;
+import nbbrd.io.http.UriQueryBuilder;
import java.net.URL;
import java.util.List;
+import static nbbrd.heylogs.spi.URLExtractor.uriOf;
import static nbbrd.heylogs.spi.URLExtractor.urlOf;
public interface GitLabProjectLink extends ProjectLink {
@@ -22,6 +23,6 @@ public interface GitLabProjectLink extends ProjectLink {
@Override
default @NonNull URL getProjectURL() {
- return urlOf(URLQueryBuilder.of(getBase()).path(getNamespace()).path(getProject()).toString());
+ return urlOf(UriQueryBuilder.of(uriOf(getBase())).path(getNamespace()).path(getProject()).toString());
}
}
diff --git a/heylogs-ext-gitlab/src/main/java/nbbrd/heylogs/ext/gitlab/GitLabRepositoryLink.java b/heylogs-ext-gitlab/src/main/java/nbbrd/heylogs/ext/gitlab/GitLabRepositoryLink.java
index d3e64643..628145e0 100644
--- a/heylogs-ext-gitlab/src/main/java/nbbrd/heylogs/ext/gitlab/GitLabRepositoryLink.java
+++ b/heylogs-ext-gitlab/src/main/java/nbbrd/heylogs/ext/gitlab/GitLabRepositoryLink.java
@@ -5,16 +5,15 @@
import nbbrd.design.RepresentableAs;
import nbbrd.design.StaticFactoryMethod;
import nbbrd.heylogs.spi.ForgeRef;
-import nbbrd.io.http.URLQueryBuilder;
+import nbbrd.io.http.UriQueryBuilder;
import java.net.URL;
import java.util.List;
-import static nbbrd.heylogs.spi.URLExtractor.baseOf;
-import static nbbrd.heylogs.spi.URLExtractor.getPathArray;
import static java.util.Collections.unmodifiableList;
import static nbbrd.heylogs.ext.gitlab.GitLabSupport.NAMESPACE_PATTERN;
import static nbbrd.heylogs.ext.gitlab.GitLabSupport.PROJECT_PATTERN;
+import static nbbrd.heylogs.spi.URLExtractor.*;
@RepresentableAs(URL.class)
@lombok.Value
@@ -54,7 +53,7 @@ public ForgeRef toRef(ForgeRef baseRef) {
@Override
public @NonNull URL toURL() {
try {
- return URLQueryBuilder.of(base).path(namespace).path(project).build();
+ return UriQueryBuilder.of(uriOf(base)).path(namespace).path(project).build().toURL();
} catch (java.net.MalformedURLException e) {
throw new RuntimeException(e);
}
diff --git a/heylogs-ext-gitlab/src/main/java/nbbrd/heylogs/ext/gitlab/GitLabRequestLink.java b/heylogs-ext-gitlab/src/main/java/nbbrd/heylogs/ext/gitlab/GitLabRequestLink.java
index e9b1249f..4f20a5ec 100644
--- a/heylogs-ext-gitlab/src/main/java/nbbrd/heylogs/ext/gitlab/GitLabRequestLink.java
+++ b/heylogs-ext-gitlab/src/main/java/nbbrd/heylogs/ext/gitlab/GitLabRequestLink.java
@@ -5,13 +5,14 @@
import nbbrd.design.RepresentableAs;
import nbbrd.design.StaticFactoryMethod;
import nbbrd.heylogs.spi.ForgeRef;
-import nbbrd.io.http.URLQueryBuilder;
+import nbbrd.io.http.UriQueryBuilder;
import org.jspecify.annotations.Nullable;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.List;
+import static nbbrd.heylogs.spi.URLExtractor.uriOf;
import static nbbrd.heylogs.spi.URLExtractor.urlOf;
import static nbbrd.heylogs.ext.gitlab.GitLabSupport.*;
@@ -29,10 +30,11 @@ class GitLabRequestLink implements GitLabProjectLink {
public static @NonNull GitLabRequestLink resolve(@NonNull URL projectUrl, @NonNull CharSequence ref) {
try {
return parse(
- URLQueryBuilder.of(projectUrl)
+ UriQueryBuilder.of(uriOf(projectUrl))
.path(MERGE_REQUEST_KEYWORD)
.path(String.valueOf(GitLabRequestRef.parse(ref).getNumber()))
- .build());
+ .build()
+ .toURL());
} catch (MalformedURLException ex) {
throw new RuntimeException(ex);
}
diff --git a/heylogs-ext-gitlab/src/main/java/nbbrd/heylogs/ext/gitlab/GitLabSupport.java b/heylogs-ext-gitlab/src/main/java/nbbrd/heylogs/ext/gitlab/GitLabSupport.java
index ff4cacf3..9af24aaa 100644
--- a/heylogs-ext-gitlab/src/main/java/nbbrd/heylogs/ext/gitlab/GitLabSupport.java
+++ b/heylogs-ext-gitlab/src/main/java/nbbrd/heylogs/ext/gitlab/GitLabSupport.java
@@ -4,7 +4,7 @@
import nbbrd.design.MightBePromoted;
import nbbrd.heylogs.spi.ForgeLink;
import nbbrd.heylogs.spi.ForgeRef;
-import nbbrd.io.http.URLQueryBuilder;
+import nbbrd.io.http.UriQueryBuilder;
import org.jspecify.annotations.Nullable;
import java.net.URL;
@@ -83,7 +83,7 @@ interface ValueParser {
}
public static @NonNull String linkToString(@NonNull URL base, @NonNull List namespace, @NonNull String project, @NonNull String type, @NonNull String value) {
- return URLQueryBuilder.of(base).path(namespace).path(project).path(DASH_KEYWORD).path(type).path(value).toString();
+ return UriQueryBuilder.of(uriOf(base)).path(namespace).path(project).path(DASH_KEYWORD).path(type).path(value).toString();
}
@FunctionalInterface
diff --git a/heylogs-ext-gitlab/src/test/java/nbbrd/heylogs/ext/gitlab/GitLabMessageFetcherTest.java b/heylogs-ext-gitlab/src/test/java/nbbrd/heylogs/ext/gitlab/GitLabMessageFetcherTest.java
index 9e93aab5..aa7dcdf0 100644
--- a/heylogs-ext-gitlab/src/test/java/nbbrd/heylogs/ext/gitlab/GitLabMessageFetcherTest.java
+++ b/heylogs-ext-gitlab/src/test/java/nbbrd/heylogs/ext/gitlab/GitLabMessageFetcherTest.java
@@ -6,8 +6,8 @@
import nbbrd.io.http.HttpHeaders;
import nbbrd.io.http.HttpRequest;
import nbbrd.io.http.HttpResponse;
-import nbbrd.io.http.ext.PersistentResponse;
import org.junit.jupiter.api.Test;
+import tests.heylogs.spi.PersistentResponse;
import java.io.IOException;
import java.net.URL;
diff --git a/heylogs-ext-http/src/main/java/nbbrd/heylogs/ext/http/DefaultHttpFactory.java b/heylogs-ext-http/src/main/java/nbbrd/heylogs/ext/http/DefaultHttpFactory.java
index c15c70bd..222c3944 100644
--- a/heylogs-ext-http/src/main/java/nbbrd/heylogs/ext/http/DefaultHttpFactory.java
+++ b/heylogs-ext-http/src/main/java/nbbrd/heylogs/ext/http/DefaultHttpFactory.java
@@ -3,28 +3,39 @@
import lombok.NonNull;
import nbbrd.heylogs.spi.HttpFactory;
import nbbrd.io.http.HttpClient;
-import nbbrd.io.http.UrlConnectionHttpClient;
-import nbbrd.io.http.ext.LazyHttpClient;
+import nbbrd.io.http.ext.*;
+import nbbrd.io.http.urlconnection.UrlConnectionHttpClient;
import nbbrd.service.ServiceProvider;
import nl.altindag.ssl.SSLFactory;
@ServiceProvider
public final class DefaultHttpFactory implements HttpFactory {
+ @lombok.Getter(lazy = true)
+ private final SSLFactory sslFactory = initSSLFactory();
+
+ private static SSLFactory initSSLFactory() {
+ return SSLFactory
+ .builder()
+ .withDefaultTrustMaterial()
+ .withSystemTrustMaterial()
+ .build();
+ }
+
@Override
public @NonNull HttpClient getClient() {
- return new LazyHttpClient(() -> {
- SSLFactory sslFactory = SSLFactory
- .builder()
- .withDefaultTrustMaterial()
- .withSystemTrustMaterial()
- .build();
- return UrlConnectionHttpClient
- .builder()
- .userAgent("heylogs")
- .sslSocketFactory(sslFactory.getSslSocketFactory())
- .hostnameVerifier(sslFactory.getHostnameVerifier())
- .build();
- });
+ SSLFactory sslFactory = getSslFactory();
+ return new ThrowingStatusDecorator(
+ new RetryDecorator(
+ new RedirectDecorator(
+ UrlConnectionHttpClient
+ .builder()
+ .userAgent("heylogs")
+ .sslSocketFactory(sslFactory.getSslSocketFactory())
+ .hostnameVerifier(sslFactory.getHostnameVerifier())
+ .build()
+ , 5, RedirectListener.noOp()),
+ 3, RetryListener.noOp()),
+ ThrowingStatusDecorator.DEFAULT_SHOULD_THROW);
}
}
diff --git a/heylogs-ext-rules/src/main/java/nbbrd/heylogs/ext/rules/LinkRules.java b/heylogs-ext-rules/src/main/java/nbbrd/heylogs/ext/rules/LinkRules.java
index 43dcee4f..2dda9196 100644
--- a/heylogs-ext-rules/src/main/java/nbbrd/heylogs/ext/rules/LinkRules.java
+++ b/heylogs-ext-rules/src/main/java/nbbrd/heylogs/ext/rules/LinkRules.java
@@ -8,7 +8,6 @@
import nbbrd.design.MightBeGenerated;
import nbbrd.design.VisibleForTesting;
import nbbrd.heylogs.spi.*;
-import nbbrd.io.text.Parser;
import nbbrd.service.ServiceProvider;
import org.jspecify.annotations.Nullable;
@@ -23,6 +22,7 @@
import static nbbrd.heylogs.Util.illegalArgumentToNull;
import static nbbrd.heylogs.spi.RuleSupport.nameToId;
import static nbbrd.heylogs.spi.Tagging.CONVERSION_NOT_SUPPORTED;
+import static nbbrd.heylogs.spi.URLExtractor.urlOrNullOf;
import static nbbrd.heylogs.spi.Versioning.NO_VERSIONING_FILTER;
public enum LinkRules implements Rule {
@@ -152,7 +152,7 @@ static RuleIssue validateHttps(LinkNodeBase link) {
@VisibleForTesting
public static @Nullable RuleIssue validateTagVersioning(@NonNull LinkNodeBase link, @NonNull RuleContext context) {
- URL url = Parser.onURL().parse(link.getUrl());
+ URL url = urlOrNullOf(link.getUrl());
Converter tagParser = context.findTagParserOrNull();
java.util.function.Predicate versioningPredicate = context.findVersioningPredicateOrNull();
@@ -187,7 +187,7 @@ static RuleIssue validateHttps(LinkNodeBase link) {
@VisibleForTesting
public static @Nullable RuleIssue validateForgeRef(@NonNull Link link, @NonNull RuleContext context) {
- URL url = Parser.onURL().parse(link.getUrl());
+ URL url = urlOrNullOf(link.getUrl());
if (url != null) {
for (Forge forge : context.findAllForges(url)) {
for (ForgeLinkType type : ForgeLinkType.values()) {
@@ -298,7 +298,7 @@ static RuleIssue validateHttps(LinkNodeBase link) {
Link lastLink = getLastLink(item);
if (lastLink == null) return NO_RULE_ISSUE;
- URL url = Parser.onURL().parse(lastLink.getUrl());
+ URL url = urlOrNullOf(lastLink.getUrl());
if (url == null) return NO_RULE_ISSUE;
List forges = context.findAllForges(url);
diff --git a/heylogs-ext-rules/src/test/java/nbbrd/heylogs/ext/rules/LinkRulesTest.java b/heylogs-ext-rules/src/test/java/nbbrd/heylogs/ext/rules/LinkRulesTest.java
index 61a58644..80b16900 100644
--- a/heylogs-ext-rules/src/test/java/nbbrd/heylogs/ext/rules/LinkRulesTest.java
+++ b/heylogs-ext-rules/src/test/java/nbbrd/heylogs/ext/rules/LinkRulesTest.java
@@ -13,13 +13,11 @@
import static internal.heylogs.base.BaseVersionings.REGEX_VERSIONING;
import static nbbrd.heylogs.ext.rules.LinkRules.*;
-import static nbbrd.heylogs.ext.rules.RulesTestHelper.asLink;
import static nbbrd.heylogs.ext.rules.RulesTestHelper.asBulletListItem;
+import static nbbrd.heylogs.ext.rules.RulesTestHelper.asLink;
import static nbbrd.heylogs.spi.ForgeLinkType.ISSUE;
import static org.assertj.core.api.Assertions.assertThat;
import static tests.heylogs.api.Sample.using;
-import static tests.heylogs.spi.MockedCompareLink.parse;
-import static tests.heylogs.spi.MockedForgeLink.parse;
import static tests.heylogs.spi.RuleAssert.assertRuleCompliance;
public class LinkRulesTest {