From 8fea8a41e850869b6c5a91f6f987dc063c8c219e Mon Sep 17 00:00:00 2001 From: Josiah Noel <32279667+SentryMan@users.noreply.github.com> Date: Thu, 17 Jul 2025 18:27:27 -0400 Subject: [PATCH 1/3] [client] allow blank baseUrl --- .../avaje/http/client/DHttpClientBuilder.java | 21 ++++++++----------- 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/http-client/src/main/java/io/avaje/http/client/DHttpClientBuilder.java b/http-client/src/main/java/io/avaje/http/client/DHttpClientBuilder.java index eb8e815a..f7e8a9ce 100644 --- a/http-client/src/main/java/io/avaje/http/client/DHttpClientBuilder.java +++ b/http-client/src/main/java/io/avaje/http/client/DHttpClientBuilder.java @@ -1,11 +1,7 @@ package io.avaje.http.client; -import com.fasterxml.jackson.databind.ObjectMapper; -import io.avaje.inject.BeanScope; -import io.avaje.jsonb.Jsonb; - -import javax.net.ssl.SSLContext; -import javax.net.ssl.SSLParameters; +import java.lang.invoke.MethodHandles; +import java.lang.invoke.MethodType; import java.net.Authenticator; import java.net.CookieHandler; import java.net.CookieManager; @@ -21,15 +17,18 @@ import java.util.concurrent.Executors; import java.util.function.Function; -import static java.util.Objects.requireNonNull; +import javax.net.ssl.SSLContext; +import javax.net.ssl.SSLParameters; -import java.lang.invoke.MethodHandles; -import java.lang.invoke.MethodType; +import com.fasterxml.jackson.databind.ObjectMapper; + +import io.avaje.inject.BeanScope; +import io.avaje.jsonb.Jsonb; final class DHttpClientBuilder implements HttpClient.Builder, HttpClient.Builder.State { private java.net.http.HttpClient client; - private String baseUrl; + private String baseUrl = ""; private boolean requestLogging = true; private Duration connectionTimeout = Duration.ofSeconds(20); private Duration requestTimeout = Duration.ofSeconds(20); @@ -168,8 +167,6 @@ private boolean detectTypeExists(String className) { } private DHttpClientContext buildClient() { - requireNonNull(baseUrl, "baseUrl is not specified"); - requireNonNull(requestTimeout, "requestTimeout is not specified"); final var httpClient = client != null ? client : defaultClient(); if (requestLogging) { // register the built-in request/response logging From 4a54d5f38967112f78fca9b4e8d810348b4bea34 Mon Sep 17 00:00:00 2001 From: Josiah Noel <32279667+SentryMan@users.noreply.github.com> Date: Thu, 17 Jul 2025 18:32:26 -0400 Subject: [PATCH 2/3] Update ApiClient.java --- .../java/io/avaje/http/generator/client/clients/ApiClient.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/http-generator-client/src/test/java/io/avaje/http/generator/client/clients/ApiClient.java b/http-generator-client/src/test/java/io/avaje/http/generator/client/clients/ApiClient.java index 7c3d57ba..4347de65 100644 --- a/http-generator-client/src/test/java/io/avaje/http/generator/client/clients/ApiClient.java +++ b/http-generator-client/src/test/java/io/avaje/http/generator/client/clients/ApiClient.java @@ -15,4 +15,7 @@ public interface ApiClient { @Get("/consecutive/paths/{accept}/generate") String consecutive(String accept); + + @Get("http://localhost:6969/test") + String staticUrl(); } From ae44d11d19ff736971ca751c4f29b75648428992 Mon Sep 17 00:00:00 2001 From: Josiah Noel <32279667+SentryMan@users.noreply.github.com> Date: Thu, 17 Jul 2025 19:24:35 -0400 Subject: [PATCH 3/3] support static http endpoint --- .../org/example/dinject/ConfigureWithDITest.java | 2 +- .../http/generator/client/ClientMethodWriter.java | 13 +++++++++++-- .../java/io/avaje/http/generator/core/Util.java | 4 ++++ 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/http-client/src/test/java/org/example/dinject/ConfigureWithDITest.java b/http-client/src/test/java/org/example/dinject/ConfigureWithDITest.java index a92d016e..dc0028ef 100644 --- a/http-client/src/test/java/org/example/dinject/ConfigureWithDITest.java +++ b/http-client/src/test/java/org/example/dinject/ConfigureWithDITest.java @@ -20,7 +20,7 @@ void configureWith() { HttpClient.Builder builder = HttpClient.builder(); HttpClient.Builder.State state = builder.state(); - assertThat(state.baseUrl()).isNull(); + assertThat(state.baseUrl()).isEmpty(); assertThat(state.bodyAdapter()).isNull(); assertThat(state.client()).isNull(); assertThat(state.requestLogging()).isTrue(); diff --git a/http-generator-client/src/main/java/io/avaje/http/generator/client/ClientMethodWriter.java b/http-generator-client/src/main/java/io/avaje/http/generator/client/ClientMethodWriter.java index b1be334e..d1702518 100644 --- a/http-generator-client/src/main/java/io/avaje/http/generator/client/ClientMethodWriter.java +++ b/http-generator-client/src/main/java/io/avaje/http/generator/client/ClientMethodWriter.java @@ -427,7 +427,7 @@ private void writePaths(Set segments) { } else { // If we have accumulated literals, write them out first if (combinedLiterals.length() > 0) { - writer.append(".path(\"").append(combinedLiterals.toString()).append("\")"); + writeLiteral(combinedLiterals); combinedLiterals.setLength(0); // Clear the buffer } // Write the non-literal segment @@ -441,7 +441,7 @@ private void writePaths(Set segments) { // Write any remaining accumulated literals if (combinedLiterals.length() > 0) { - writer.append(".path(\"").append(combinedLiterals.toString()).append("\")"); + writeLiteral(combinedLiterals); } if (!segments.isEmpty()) { @@ -449,6 +449,15 @@ private void writePaths(Set segments) { } } + private void writeLiteral(StringBuilder combinedLiterals) { + String path = + combinedLiterals.toString().replace("http:/", "http://").replace("https:/", "https://"); + writer + .append(path.startsWith("http:") || path.startsWith("https:") ? ".url(\"" : ".path(\"") + .append(path) + .append("\")"); + } + private boolean isMap(MethodParam param) { return isMap(param.utype().mainType()); } diff --git a/http-generator-core/src/main/java/io/avaje/http/generator/core/Util.java b/http-generator-core/src/main/java/io/avaje/http/generator/core/Util.java index 8a156913..3a6a79b6 100644 --- a/http-generator-core/src/main/java/io/avaje/http/generator/core/Util.java +++ b/http-generator-core/src/main/java/io/avaje/http/generator/core/Util.java @@ -98,6 +98,10 @@ static String combinePath(String beanPath, String webMethodPath) { if (!webMethodPath.isEmpty() && !webMethodPath.startsWith("/")) { sb.append("/"); } + + if (webMethodPath.startsWith("https:") || webMethodPath.startsWith("http:")) { + return webMethodPath; + } sb.append(trimTrailingSlash(webMethodPath)); } return sb.toString();